From 40b1688c67bfb820aca437751dda87df98e9513a Mon Sep 17 00:00:00 2001 From: Jeffrey Tong Date: Wed, 7 Mar 2018 14:19:27 -0800 Subject: [PATCH 01/30] removed check for width & height on multiple popup windows --- app/scripts/lib/notification-manager.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/scripts/lib/notification-manager.js b/app/scripts/lib/notification-manager.js index adaf60c65..1283933e1 100644 --- a/app/scripts/lib/notification-manager.js +++ b/app/scripts/lib/notification-manager.js @@ -60,9 +60,7 @@ class NotificationManager { _getPopupIn (windows) { return windows ? windows.find((win) => { - return (win && win.type === 'popup' && - win.height === height && - win.width === width) + return (win && win.type === 'popup') }) : null } From aaef2aeefde39ce11ef07603fd1cb5d2cbb1e294 Mon Sep 17 00:00:00 2001 From: Jeffrey Tong Date: Wed, 7 Mar 2018 20:09:40 -0800 Subject: [PATCH 02/30] fixed multiple notification windows when executing batch --- app/scripts/background.js | 11 ++++++++++- app/scripts/lib/notification-manager.js | 5 ++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 601ae0372..6cb80244f 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -40,6 +40,7 @@ const isIE = !!document.documentMode const isEdge = !isIE && !!window.StyleMedia let popupIsOpen = false +let notifcationIsOpen = false; let openMetamaskTabsIDs = {} // state persistence @@ -136,6 +137,11 @@ function setupController (initState) { } }) } + if (remotePort.name === 'notification') { + endOfStream(portStream, () => { + notifcationIsOpen = false + }); + } } else { // communication with page const originDomain = urlUtil.parse(remotePort.sender.url).hostname @@ -178,7 +184,10 @@ function setupController (initState) { function triggerUi () { extension.tabs.query({ active: true }, (tabs) => { const currentlyActiveMetamaskTab = tabs.find(tab => openMetamaskTabsIDs[tab.id]) - if (!popupIsOpen && !currentlyActiveMetamaskTab) notificationManager.showPopup() + if (!popupIsOpen && !currentlyActiveMetamaskTab) notificationManager.showPopup((notification) => { + notifcationIsOpen = notification; + }); + notifcationIsOpen = true; }) } diff --git a/app/scripts/lib/notification-manager.js b/app/scripts/lib/notification-manager.js index 1283933e1..351f82694 100644 --- a/app/scripts/lib/notification-manager.js +++ b/app/scripts/lib/notification-manager.js @@ -9,7 +9,7 @@ class NotificationManager { // Public // - showPopup () { + showPopup (cb) { this._getPopup((err, popup) => { if (err) throw err @@ -23,6 +23,9 @@ class NotificationManager { type: 'popup', width, height, + }, (win) => { + // naming of popup window and a popup in chrome extension sense is confusing + cb((win.type == 'popup')); }) } }) From bda493dc9dc7436e5169a3344d8a72eb3c8d48d8 Mon Sep 17 00:00:00 2001 From: Jeffrey Tong Date: Sun, 11 Mar 2018 10:17:08 -0700 Subject: [PATCH 03/30] add comments that need clarification on naming convention --- app/scripts/background.js | 4 +--- app/scripts/lib/notification-manager.js | 14 ++++++++------ app/scripts/popup.js | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 6cb80244f..679c2a4e2 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -184,9 +184,7 @@ function setupController (initState) { function triggerUi () { extension.tabs.query({ active: true }, (tabs) => { const currentlyActiveMetamaskTab = tabs.find(tab => openMetamaskTabsIDs[tab.id]) - if (!popupIsOpen && !currentlyActiveMetamaskTab) notificationManager.showPopup((notification) => { - notifcationIsOpen = notification; - }); + if (!popupIsOpen && !currentlyActiveMetamaskTab) notificationManager.showPopup(); notifcationIsOpen = true; }) } diff --git a/app/scripts/lib/notification-manager.js b/app/scripts/lib/notification-manager.js index 351f82694..0087a1dbb 100644 --- a/app/scripts/lib/notification-manager.js +++ b/app/scripts/lib/notification-manager.js @@ -9,29 +9,28 @@ class NotificationManager { // Public // - showPopup (cb) { + showPopup () { this._getPopup((err, popup) => { if (err) throw err + // Bring focus to chrome popup if (popup) { - // bring focus to existing popup + // bring focus to existing chrome popup extension.windows.update(popup.id, { focused: true }) } else { - // create new popup + // create new notification popup extension.windows.create({ url: 'notification.html', type: 'popup', width, height, - }, (win) => { - // naming of popup window and a popup in chrome extension sense is confusing - cb((win.type == 'popup')); }) } }) } closePopup () { + // closes notification popup this._getPopup((err, popup) => { if (err) throw err if (!popup) return @@ -46,6 +45,7 @@ class NotificationManager { _getPopup (cb) { this._getWindows((err, windows) => { if (err) throw err + console.log(windows); cb(null, this._getPopupIn(windows)) }) } @@ -63,6 +63,8 @@ class NotificationManager { _getPopupIn (windows) { return windows ? windows.find((win) => { + // Returns notification popup + console.log(win); return (win && win.type === 'popup') }) : null } diff --git a/app/scripts/popup.js b/app/scripts/popup.js index 11d50ee87..e78981f06 100644 --- a/app/scripts/popup.js +++ b/app/scripts/popup.js @@ -65,6 +65,7 @@ startPopup({ container, connectionStream }, (err, store) => { function closePopupIfOpen (windowType) { if (windowType !== 'notification') { + // should close only chrome popup notificationManager.closePopup() } } From 4f853bbd3c374df7c2991d5fdf91112f6f319bb3 Mon Sep 17 00:00:00 2001 From: Jeffrey Tong Date: Sun, 11 Mar 2018 10:18:55 -0700 Subject: [PATCH 04/30] remove console log --- app/scripts/lib/notification-manager.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/scripts/lib/notification-manager.js b/app/scripts/lib/notification-manager.js index 0087a1dbb..1fcb7cf69 100644 --- a/app/scripts/lib/notification-manager.js +++ b/app/scripts/lib/notification-manager.js @@ -45,7 +45,6 @@ class NotificationManager { _getPopup (cb) { this._getWindows((err, windows) => { if (err) throw err - console.log(windows); cb(null, this._getPopupIn(windows)) }) } @@ -64,7 +63,6 @@ class NotificationManager { _getPopupIn (windows) { return windows ? windows.find((win) => { // Returns notification popup - console.log(win); return (win && win.type === 'popup') }) : null } From 2d3763d70927dd1aefbc19f9ab6d463a713f2576 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Sat, 10 Mar 2018 04:56:39 +0200 Subject: [PATCH 05/30] add READMEs to folders, re #3427 --- .gitignore | 2 ++ README.md | 1 + app/scripts/README.md | 14 ++++++++++++++ app/scripts/controllers/README.md | 4 ++++ app/scripts/migrations/README.md | 5 +++++ development/README.md | 5 +++++ docs/README.md | 13 +++++++++++++ notices/README.md | 5 +++++ 8 files changed, 49 insertions(+) create mode 100644 app/scripts/README.md create mode 100644 app/scripts/controllers/README.md create mode 100644 app/scripts/migrations/README.md create mode 100644 development/README.md create mode 100644 docs/README.md create mode 100644 notices/README.md diff --git a/.gitignore b/.gitignore index 5f2d2f551..059315545 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,9 @@ app/bower_components test/bower_components package +# IDEs .idea +.vscode temp .tmp diff --git a/README.md b/README.md index d45b73778..278357c23 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ To write tests that will be run in the browser using QUnit, add your test files - [How to add custom build to Chrome](./docs/add-to-chrome.md) - [How to add custom build to Firefox](./docs/add-to-firefox.md) - [How to develop a live-reloading UI](./docs/ui-dev-mode.md) +- [How to add a new translation to MetaMask](./docs/translating-guide.md) - [Publishing Guide](./docs/publishing.md) - [How to develop an in-browser mocked UI](./docs/ui-mock-mode.md) - [How to live reload on local dependency changes](./docs/developing-on-deps.md) diff --git a/app/scripts/README.md b/app/scripts/README.md new file mode 100644 index 000000000..f5a907244 --- /dev/null +++ b/app/scripts/README.md @@ -0,0 +1,14 @@ +# Main MetaMask Code + +This folder contains the core-code. + +Currently, it is organized mostly based on file category, like: + +controllers, migrations, lib + +## Ongoing Task + +Refactor code-structure, thus the subsystems are reflected on the filesystem. + +### Examples + diff --git a/app/scripts/controllers/README.md b/app/scripts/controllers/README.md new file mode 100644 index 000000000..392c0457d --- /dev/null +++ b/app/scripts/controllers/README.md @@ -0,0 +1,4 @@ +# Controllers + +Different controllers (in the sense of *VC *View-Controller). + diff --git a/app/scripts/migrations/README.md b/app/scripts/migrations/README.md new file mode 100644 index 000000000..3a67b08e1 --- /dev/null +++ b/app/scripts/migrations/README.md @@ -0,0 +1,5 @@ +# Migrations + +Data (user data, config files etc.) is migrated from one version to another. + +Migrations are called by {} from {} during {}. \ No newline at end of file diff --git a/development/README.md b/development/README.md new file mode 100644 index 000000000..1e18d4f16 --- /dev/null +++ b/development/README.md @@ -0,0 +1,5 @@ +# Development + +Several files which are needed for developing on(!) MetaMask. + +Usually each files contains information about its scope / usage. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..0739cfa46 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,13 @@ +# Documentation + + +- [How to add custom build to Chrome](./add-to-chrome.md) +- [How to add custom build to Firefox](./add-to-firefox.md) +- [How to develop a live-reloading UI](./ui-dev-mode.md) +- [Publishing Guide](./publishing.md) +- [How to develop an in-browser mocked UI](./ui-mock-mode.md) +- [How to live reload on local dependency changes](./developing-on-deps.md) +- [How to add new networks to the Provider Menu](./adding-new-networks.md) +- [How to manage notices that appear when the app starts up](./notices.md) +- [How to port MetaMask to a new platform](./porting_to_new_environment.md) +- [How to generate a visualization of this repository's development](./development-visualization.md) \ No newline at end of file diff --git a/notices/README.md b/notices/README.md new file mode 100644 index 000000000..9362769c2 --- /dev/null +++ b/notices/README.md @@ -0,0 +1,5 @@ +# Notices + +Those notices are of legal nature. They are displayed to the users of MetaMask. + +Any changes or additions must be reviewed by the product management. \ No newline at end of file From d8f5150aa5bf4b04310f887504428f1caa13cbf4 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 00:27:10 +0200 Subject: [PATCH 06/30] adds initial documentation, re #3568 --- app/scripts/metamask-controller.js | 176 ++++++++++++++++++++++------- 1 file changed, 137 insertions(+), 39 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 0a5c1d36f..31c0bed58 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1,3 +1,9 @@ +/** + * @file The central metamask controller. Aggregates other controllers and exports an api. + * @copyright Copyright (c) 2018 MetaMask + * @license MIT + */ + const EventEmitter = require('events') const extend = require('xtend') const pump = require('pump') @@ -41,7 +47,11 @@ const seedPhraseVerifier = require('./lib/seed-phrase-verifier') module.exports = class MetamaskController extends EventEmitter { - constructor (opts) { + /** + * @constructor + * @param {Object} opts + */ + constructor (opts) { super() this.defaultMaxListeners = 20 @@ -223,10 +233,9 @@ module.exports = class MetamaskController extends EventEmitter { this.infuraController.store.subscribe(sendUpdate) } - // - // Constructor helpers - // - + /** + * Constructor helper: initialize a provider. + */ initializeProvider () { const providerOpts = { static: { @@ -257,6 +266,9 @@ module.exports = class MetamaskController extends EventEmitter { return providerProxy } + /** + * Constructor helper: initialize a public confi store. + */ initPublicConfigStore () { // get init state const publicConfigStore = new ObservableStore() @@ -282,6 +294,9 @@ module.exports = class MetamaskController extends EventEmitter { // State Management // + /** + * ? + */ getState () { const wallet = this.configManager.getWallet() const vault = this.keyringController.store.getState().vault @@ -319,7 +334,10 @@ module.exports = class MetamaskController extends EventEmitter { // // Remote Features // - + + /** + * ? + */ getApi () { const keyringController = this.keyringController const preferencesController = this.preferencesController @@ -517,10 +535,22 @@ module.exports = class MetamaskController extends EventEmitter { return '0x' + percentileNumBn.mul(GWEI_BN).toString(16) } - // - // Vault Management - // +//============================================================================= +// VAULT / KEYRING RELATED METHODS +//============================================================================= + /** + * Creates a new Vault(?) and create a new keychain(?) + * + * A vault is ... + * + * A keychain is ... + * + * + * @param {} password + * + * @returns {} vault + */ async createNewVaultAndKeychain (password) { const release = await this.createVaultMutex.acquire() let vault @@ -544,6 +574,11 @@ module.exports = class MetamaskController extends EventEmitter { return vault } + /** + * Create a new Vault and restore an existent keychain + * @param {} password + * @param {} seed + */ async createNewVaultAndRestore (password, seed) { const release = await this.createVaultMutex.acquire() try { @@ -557,16 +592,28 @@ module.exports = class MetamaskController extends EventEmitter { } } + /** + * Retrieves the first Identiy from the passed Vault and selects the related address + * + * An Identity is ... + * + * @param {} vault + */ selectFirstIdentity (vault) { const { identities } = vault const address = Object.keys(identities)[0] this.preferencesController.setSelectedAddress(address) } - // + // ? // Opinionated Keyring Management // + /** + * Adds a new account to ... + * + * @returns {} keyState + */ async addNewAccount () { const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0] if (!primaryKeyring) { @@ -588,10 +635,12 @@ module.exports = class MetamaskController extends EventEmitter { return keyState } - // Adds the current vault's seed words to the UI's state tree. - // - // Used when creating a first vault, to allow confirmation. - // Also used when revealing the seed words in the confirmation view. + /** + * Adds the current vault's seed words to the UI's state tree. + * + * Used when creating a first vault, to allow confirmation. + * Also used when revealing the seed words in the confirmation view. + */ placeSeedWords (cb) { this.verifySeedPhrase() @@ -604,10 +653,13 @@ module.exports = class MetamaskController extends EventEmitter { }) } - // Verifies the current vault's seed words if they can restore the - // accounts belonging to the current vault. - // - // Called when the first account is created and on unlocking the vault. + /** + * Verifies the validity of the current vault's seed phrase. + * + * Validity: seed phrase can restore the accounts belonging to the current vault. + * + * Called when the first account is created and on unlocking the vault. + */ async verifySeedPhrase () { const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0] @@ -632,22 +684,33 @@ module.exports = class MetamaskController extends EventEmitter { } } - // ClearSeedWordCache - // - // Removes the primary account's seed words from the UI's state tree, - // ensuring they are only ever available in the background process. + /** + * Remove the primary account seed phrase from the UI's state tree. + * + * The seed phrase remains available in the background process. + * + */ clearSeedWordCache (cb) { this.configManager.setSeedWords(null) cb(null, this.preferencesController.getSelectedAddress()) } - + + /** + * ? + */ resetAccount (cb) { const selectedAddress = this.preferencesController.getSelectedAddress() this.txController.wipeTransactions(selectedAddress) cb(null, selectedAddress) } - + /** + * Imports an account ... ? + * + * @param {} strategy + * @param {} args + * @param {} cb + */ importAccountWithStrategy (strategy, args, cb) { accountImporter.importAccount(strategy, args) .then((privateKey) => { @@ -659,11 +722,15 @@ module.exports = class MetamaskController extends EventEmitter { .catch((reason) => { cb(reason) }) } +//============================================================================= +// END (VAULT / KEYRING RELATED METHODS) +//============================================================================= - // - // Identity Management - // - // + + +//============================================================================= +// Identity Management +//============================================================================= async retryTransaction (txId, cb) { await this.txController.retryTransaction(txId) @@ -729,7 +796,11 @@ module.exports = class MetamaskController extends EventEmitter { } }) } - + + /** + * @param {} msgParams + * @param {} cb + */ signMessage (msgParams, cb) { log.info('MetaMaskController - signMessage') const msgId = msgParams.metamaskId @@ -758,6 +829,12 @@ module.exports = class MetamaskController extends EventEmitter { } // Prefixed Style Message Signing Methods: + + /** + * + * @param {} msgParams + * @param {} cb + */ approvePersonalMessage (msgParams, cb) { const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams) this.sendUpdate() @@ -773,7 +850,10 @@ module.exports = class MetamaskController extends EventEmitter { } }) } - + + /** + * @param {} msgParams + */ signPersonalMessage (msgParams) { log.info('MetaMaskController - signPersonalMessage') const msgId = msgParams.metamaskId @@ -791,7 +871,10 @@ module.exports = class MetamaskController extends EventEmitter { return this.getState() }) } - + + /** + * @param {} msgParams + */ signTypedMessage (msgParams) { log.info('MetaMaskController - signTypedMessage') const msgId = msgParams.metamaskId @@ -843,13 +926,23 @@ module.exports = class MetamaskController extends EventEmitter { this.sendUpdate() cb() } - + + /** + * ? + * + * @param {} migratorOutput + */ restoreOldVaultAccounts (migratorOutput) { const { serialized } = migratorOutput return this.keyringController.restoreKeyring(serialized) .then(() => migratorOutput) } + /** + * ? + * + * @param {} migratorOutput + */ restoreOldLostAccounts (migratorOutput) { const { lostAccounts } = migratorOutput if (lostAccounts) { @@ -859,10 +952,15 @@ module.exports = class MetamaskController extends EventEmitter { return Promise.resolve(migratorOutput) } - // IMPORT LOST ACCOUNTS - // @Object with key lostAccounts: @Array accounts <{ address, privateKey }> - // Uses the array's private keys to create a new Simple Key Pair keychain - // and add it to the keyring controller. + + /** + * Import (lost) Accounts + * + * @param {Object} {lostAccounts} @Array accounts <{ address, privateKey }> + * + * Uses the array's private keys to create a new Simple Key Pair keychain + * and add it to the keyring controller. + */ importLostAccounts ({ lostAccounts }) { const privKeys = lostAccounts.map(acct => acct.privateKey) return this.keyringController.restoreKeyring({ @@ -871,9 +969,9 @@ module.exports = class MetamaskController extends EventEmitter { }) } - // - // config - // +//============================================================================= +// CONFIG +//============================================================================= // Log blocks From 904f00e8acf40a72d233d1776c8aa760026e1bd3 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 02:29:53 +0200 Subject: [PATCH 07/30] group all vault/keyring related methods together, re #3568 --- app/scripts/metamask-controller.js | 272 +++++++++++++++-------------- 1 file changed, 137 insertions(+), 135 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 31c0bed58..cbdf757c6 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -267,7 +267,7 @@ module.exports = class MetamaskController extends EventEmitter { } /** - * Constructor helper: initialize a public confi store. + * Constructor helper: initialize a public config store. */ initPublicConfigStore () { // get init state @@ -290,12 +290,11 @@ module.exports = class MetamaskController extends EventEmitter { return publicConfigStore } - // - // State Management - // /** - * ? + * The metamask-state of the various controllers, made available to the UI + * + * @returns {Object} status */ getState () { const wallet = this.configManager.getWallet() @@ -331,12 +330,10 @@ module.exports = class MetamaskController extends EventEmitter { ) } - // - // Remote Features - // - /** - * ? + * Returns an api-object which is consumed by the UI + * + * @returns {Object} */ getApi () { const keyringController = this.keyringController @@ -656,7 +653,7 @@ module.exports = class MetamaskController extends EventEmitter { /** * Verifies the validity of the current vault's seed phrase. * - * Validity: seed phrase can restore the accounts belonging to the current vault. + * Validity: seed phrase restores the accounts belonging to the current vault. * * Called when the first account is created and on unlocking the vault. */ @@ -722,81 +719,9 @@ module.exports = class MetamaskController extends EventEmitter { .catch((reason) => { cb(reason) }) } -//============================================================================= -// END (VAULT / KEYRING RELATED METHODS) -//============================================================================= + // --------------------------------------------------------------------------- + // Identity Management (sign) - - -//============================================================================= -// Identity Management -//============================================================================= - - async retryTransaction (txId, cb) { - await this.txController.retryTransaction(txId) - const state = await this.getState() - return state - } - - - newUnsignedMessage (msgParams, cb) { - const msgId = this.messageManager.addUnapprovedMessage(msgParams) - this.sendUpdate() - this.opts.showUnconfirmedMessage() - this.messageManager.once(`${msgId}:finished`, (data) => { - switch (data.status) { - case 'signed': - return cb(null, data.rawSig) - case 'rejected': - return cb(new Error('MetaMask Message Signature: User denied message signature.')) - default: - return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) - } - }) - } - - newUnsignedPersonalMessage (msgParams, cb) { - if (!msgParams.from) { - return cb(new Error('MetaMask Message Signature: from field is required.')) - } - - const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams) - this.sendUpdate() - this.opts.showUnconfirmedMessage() - this.personalMessageManager.once(`${msgId}:finished`, (data) => { - switch (data.status) { - case 'signed': - return cb(null, data.rawSig) - case 'rejected': - return cb(new Error('MetaMask Message Signature: User denied message signature.')) - default: - return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) - } - }) - } - - newUnsignedTypedMessage (msgParams, cb) { - let msgId - try { - msgId = this.typedMessageManager.addUnapprovedMessage(msgParams) - this.sendUpdate() - this.opts.showUnconfirmedMessage() - } catch (e) { - return cb(e) - } - - this.typedMessageManager.once(`${msgId}:finished`, (data) => { - switch (data.status) { - case 'signed': - return cb(null, data.rawSig) - case 'rejected': - return cb(new Error('MetaMask Message Signature: User denied message signature.')) - default: - return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) - } - }) - } - /** * @param {} msgParams * @param {} cb @@ -820,14 +745,6 @@ module.exports = class MetamaskController extends EventEmitter { }) } - cancelMessage (msgId, cb) { - const messageManager = this.messageManager - messageManager.rejectMsg(msgId) - if (cb && typeof cb === 'function') { - cb(null, this.getState()) - } - } - // Prefixed Style Message Signing Methods: /** @@ -892,6 +809,133 @@ module.exports = class MetamaskController extends EventEmitter { return this.getState() }) } + + // --------------------------------------------------------------------------- + // Account Restauration + + /** + * ? + * + * @param {} migratorOutput + */ + restoreOldVaultAccounts (migratorOutput) { + const { serialized } = migratorOutput + return this.keyringController.restoreKeyring(serialized) + .then(() => migratorOutput) + } + + /** + * ? + * + * @param {} migratorOutput + */ + restoreOldLostAccounts (migratorOutput) { + const { lostAccounts } = migratorOutput + if (lostAccounts) { + this.configManager.setLostAccounts(lostAccounts.map(acct => acct.address)) + return this.importLostAccounts(migratorOutput) + } + return Promise.resolve(migratorOutput) + } + + /** + * Import (lost) Accounts + * + * @param {Object} {lostAccounts} @Array accounts <{ address, privateKey }> + * + * Uses the array's private keys to create a new Simple Key Pair keychain + * and add it to the keyring controller. + */ + importLostAccounts ({ lostAccounts }) { + const privKeys = lostAccounts.map(acct => acct.privateKey) + return this.keyringController.restoreKeyring({ + type: 'Simple Key Pair', + data: privKeys, + }) + } + +//============================================================================= +// END (VAULT / KEYRING RELATED METHODS) +//============================================================================= + + + +//============================================================================= +// MESSAGES +//============================================================================= + + async retryTransaction (txId, cb) { + await this.txController.retryTransaction(txId) + const state = await this.getState() + return state + } + + + newUnsignedMessage (msgParams, cb) { + const msgId = this.messageManager.addUnapprovedMessage(msgParams) + this.sendUpdate() + this.opts.showUnconfirmedMessage() + this.messageManager.once(`${msgId}:finished`, (data) => { + switch (data.status) { + case 'signed': + return cb(null, data.rawSig) + case 'rejected': + return cb(new Error('MetaMask Message Signature: User denied message signature.')) + default: + return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) + } + }) + } + + newUnsignedPersonalMessage (msgParams, cb) { + if (!msgParams.from) { + return cb(new Error('MetaMask Message Signature: from field is required.')) + } + + const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams) + this.sendUpdate() + this.opts.showUnconfirmedMessage() + this.personalMessageManager.once(`${msgId}:finished`, (data) => { + switch (data.status) { + case 'signed': + return cb(null, data.rawSig) + case 'rejected': + return cb(new Error('MetaMask Message Signature: User denied message signature.')) + default: + return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) + } + }) + } + + newUnsignedTypedMessage (msgParams, cb) { + let msgId + try { + msgId = this.typedMessageManager.addUnapprovedMessage(msgParams) + this.sendUpdate() + this.opts.showUnconfirmedMessage() + } catch (e) { + return cb(e) + } + + this.typedMessageManager.once(`${msgId}:finished`, (data) => { + switch (data.status) { + case 'signed': + return cb(null, data.rawSig) + case 'rejected': + return cb(new Error('MetaMask Message Signature: User denied message signature.')) + default: + return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)) + } + }) + } + + cancelMessage (msgId, cb) { + const messageManager = this.messageManager + messageManager.rejectMsg(msgId) + if (cb && typeof cb === 'function') { + cb(null, this.getState()) + } + } cancelPersonalMessage (msgId, cb) { const messageManager = this.personalMessageManager @@ -926,48 +970,6 @@ module.exports = class MetamaskController extends EventEmitter { this.sendUpdate() cb() } - - /** - * ? - * - * @param {} migratorOutput - */ - restoreOldVaultAccounts (migratorOutput) { - const { serialized } = migratorOutput - return this.keyringController.restoreKeyring(serialized) - .then(() => migratorOutput) - } - - /** - * ? - * - * @param {} migratorOutput - */ - restoreOldLostAccounts (migratorOutput) { - const { lostAccounts } = migratorOutput - if (lostAccounts) { - this.configManager.setLostAccounts(lostAccounts.map(acct => acct.address)) - return this.importLostAccounts(migratorOutput) - } - return Promise.resolve(migratorOutput) - } - - - /** - * Import (lost) Accounts - * - * @param {Object} {lostAccounts} @Array accounts <{ address, privateKey }> - * - * Uses the array's private keys to create a new Simple Key Pair keychain - * and add it to the keyring controller. - */ - importLostAccounts ({ lostAccounts }) { - const privKeys = lostAccounts.map(acct => acct.privateKey) - return this.keyringController.restoreKeyring({ - type: 'Simple Key Pair', - data: privKeys, - }) - } //============================================================================= // CONFIG From bb6af25e20f723942a2b5770a8763bff3b6d6032 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 03:22:10 +0200 Subject: [PATCH 08/30] add ESLint exceptions for //= and //-, re #3568 --- .eslintrc | 2 +- app/scripts/metamask-controller.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.eslintrc b/.eslintrc index 20a2a7a00..4fa7c2d7f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -148,7 +148,7 @@ "space-in-parens": [1, "never"], "space-infix-ops": 2, "space-unary-ops": [2, { "words": true, "nonwords": false }], - "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }], + "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","], "exceptions": ["=", "-"] } ], "strict": 0, "template-curly-spacing": [2, "never"], "use-isnan": 2, diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index cbdf757c6..953e22fc7 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -858,11 +858,11 @@ module.exports = class MetamaskController extends EventEmitter { // END (VAULT / KEYRING RELATED METHODS) //============================================================================= +// - -//============================================================================= +//============================================================================= // MESSAGES -//============================================================================= +//============================================================================= async retryTransaction (txId, cb) { await this.txController.retryTransaction(txId) From e1d6398b0fed39e579c0383e34236b30d3154295 Mon Sep 17 00:00:00 2001 From: Lazaridis Date: Fri, 16 Mar 2018 18:37:56 +0200 Subject: [PATCH 09/30] moves setup-related code towads end of file, re #3568 --- app/scripts/metamask-controller.js | 239 +++++++++++++++-------------- 1 file changed, 124 insertions(+), 115 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 953e22fc7..18d71874a 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -290,6 +290,9 @@ module.exports = class MetamaskController extends EventEmitter { return publicConfigStore } +//============================================================================= +// EXPOSED TO THE UI SUBSYSTEM +//============================================================================= /** * The metamask-state of the various controllers, made available to the UI @@ -415,122 +418,7 @@ module.exports = class MetamaskController extends EventEmitter { } } - setupUntrustedCommunication (connectionStream, originDomain) { - // Check if new connection is blacklisted - if (this.blacklistController.checkForPhishing(originDomain)) { - log.debug('MetaMask - sending phishing warning for', originDomain) - this.sendPhishingWarning(connectionStream, originDomain) - return - } - // setup multiplexing - const mux = setupMultiplex(connectionStream) - // connect features - this.setupProviderConnection(mux.createStream('provider'), originDomain) - this.setupPublicConfig(mux.createStream('publicConfig')) - } - - setupTrustedCommunication (connectionStream, originDomain) { - // setup multiplexing - const mux = setupMultiplex(connectionStream) - // connect features - this.setupControllerConnection(mux.createStream('controller')) - this.setupProviderConnection(mux.createStream('provider'), originDomain) - } - - sendPhishingWarning (connectionStream, hostname) { - const mux = setupMultiplex(connectionStream) - const phishingStream = mux.createStream('phishing') - phishingStream.write({ hostname }) - } - - setupControllerConnection (outStream) { - const api = this.getApi() - const dnode = Dnode(api) - pump( - outStream, - dnode, - outStream, - (err) => { - if (err) log.error(err) - } - ) - dnode.on('remote', (remote) => { - // push updates to popup - const sendUpdate = remote.sendUpdate.bind(remote) - this.on('update', sendUpdate) - }) - } - - setupProviderConnection (outStream, origin) { - // setup json rpc engine stack - const engine = new RpcEngine() - - // create filter polyfill middleware - const filterMiddleware = createFilterMiddleware({ - provider: this.provider, - blockTracker: this.provider._blockTracker, - }) - - engine.push(createOriginMiddleware({ origin })) - engine.push(createLoggerMiddleware({ origin })) - engine.push(filterMiddleware) - engine.push(createProviderMiddleware({ provider: this.provider })) - - // setup connection - const providerStream = createEngineStream({ engine }) - pump( - outStream, - providerStream, - outStream, - (err) => { - // cleanup filter polyfill middleware - filterMiddleware.destroy() - if (err) log.error(err) - } - ) - } - - setupPublicConfig (outStream) { - pump( - asStream(this.publicConfigStore), - outStream, - (err) => { - if (err) log.error(err) - } - ) - } - - privateSendUpdate () { - this.emit('update', this.getState()) - } - - getGasPrice () { - const { recentBlocksController } = this - const { recentBlocks } = recentBlocksController.store.getState() - - // Return 1 gwei if no blocks have been observed: - if (recentBlocks.length === 0) { - return '0x' + GWEI_BN.toString(16) - } - - const lowestPrices = recentBlocks.map((block) => { - if (!block.gasPrices || block.gasPrices.length < 1) { - return GWEI_BN - } - return block.gasPrices - .map(hexPrefix => hexPrefix.substr(2)) - .map(hex => new BN(hex, 16)) - .sort((a, b) => { - return a.gt(b) ? 1 : -1 - })[0] - }) - .map(number => number.div(GWEI_BN).toNumber()) - - const percentileNum = percentile(50, lowestPrices) - const percentileNumBn = new BN(percentileNum) - return '0x' + percentileNumBn.mul(GWEI_BN).toString(16) - } //============================================================================= // VAULT / KEYRING RELATED METHODS @@ -971,6 +859,127 @@ module.exports = class MetamaskController extends EventEmitter { cb() } +//============================================================================= +// SETUP +//============================================================================= + + setupUntrustedCommunication (connectionStream, originDomain) { + // Check if new connection is blacklisted + if (this.blacklistController.checkForPhishing(originDomain)) { + log.debug('MetaMask - sending phishing warning for', originDomain) + this.sendPhishingWarning(connectionStream, originDomain) + return + } + + // setup multiplexing + const mux = setupMultiplex(connectionStream) + // connect features + this.setupProviderConnection(mux.createStream('provider'), originDomain) + this.setupPublicConfig(mux.createStream('publicConfig')) + } + + setupTrustedCommunication (connectionStream, originDomain) { + // setup multiplexing + const mux = setupMultiplex(connectionStream) + // connect features + this.setupControllerConnection(mux.createStream('controller')) + this.setupProviderConnection(mux.createStream('provider'), originDomain) + } + + sendPhishingWarning (connectionStream, hostname) { + const mux = setupMultiplex(connectionStream) + const phishingStream = mux.createStream('phishing') + phishingStream.write({ hostname }) + } + + setupControllerConnection (outStream) { + const api = this.getApi() + const dnode = Dnode(api) + pump( + outStream, + dnode, + outStream, + (err) => { + if (err) log.error(err) + } + ) + dnode.on('remote', (remote) => { + // push updates to popup + const sendUpdate = remote.sendUpdate.bind(remote) + this.on('update', sendUpdate) + }) + } + + setupProviderConnection (outStream, origin) { + // setup json rpc engine stack + const engine = new RpcEngine() + + // create filter polyfill middleware + const filterMiddleware = createFilterMiddleware({ + provider: this.provider, + blockTracker: this.provider._blockTracker, + }) + + engine.push(createOriginMiddleware({ origin })) + engine.push(createLoggerMiddleware({ origin })) + engine.push(filterMiddleware) + engine.push(createProviderMiddleware({ provider: this.provider })) + + // setup connection + const providerStream = createEngineStream({ engine }) + pump( + outStream, + providerStream, + outStream, + (err) => { + // cleanup filter polyfill middleware + filterMiddleware.destroy() + if (err) log.error(err) + } + ) + } + + setupPublicConfig (outStream) { + pump( + asStream(this.publicConfigStore), + outStream, + (err) => { + if (err) log.error(err) + } + ) + } + + privateSendUpdate () { + this.emit('update', this.getState()) + } + + getGasPrice () { + const { recentBlocksController } = this + const { recentBlocks } = recentBlocksController.store.getState() + + // Return 1 gwei if no blocks have been observed: + if (recentBlocks.length === 0) { + return '0x' + GWEI_BN.toString(16) + } + + const lowestPrices = recentBlocks.map((block) => { + if (!block.gasPrices || block.gasPrices.length < 1) { + return GWEI_BN + } + return block.gasPrices + .map(hexPrefix => hexPrefix.substr(2)) + .map(hex => new BN(hex, 16)) + .sort((a, b) => { + return a.gt(b) ? 1 : -1 + })[0] + }) + .map(number => number.div(GWEI_BN).toNumber()) + + const percentileNum = percentile(50, lowestPrices) + const percentileNumBn = new BN(percentileNum) + return '0x' + percentileNumBn.mul(GWEI_BN).toString(16) + } + //============================================================================= // CONFIG //============================================================================= From dc92b56f184100a24aaf53c3e93619514159f938 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 20 Mar 2018 09:07:23 -0230 Subject: [PATCH 10/30] Identify token transactions by method names token data, and not just whether they've been add via metamask. --- ui/app/components/pending-tx/confirm-send-token.js | 1 + ui/app/components/pending-tx/index.js | 14 ++++++++++---- ui/app/selectors.js | 3 ++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ui/app/components/pending-tx/confirm-send-token.js b/ui/app/components/pending-tx/confirm-send-token.js index 0a4182014..c347dd21e 100644 --- a/ui/app/components/pending-tx/confirm-send-token.js +++ b/ui/app/components/pending-tx/confirm-send-token.js @@ -86,6 +86,7 @@ function mapDispatchToProps (dispatch, ownProps) { amount: tokenAmountInHex, errors: { to: null, amount: null }, editingTransactionId: id, + token: ownProps.token, })) dispatch(actions.showSendTokenPage()) }, diff --git a/ui/app/components/pending-tx/index.js b/ui/app/components/pending-tx/index.js index f4f6afb8f..9676e9c86 100644 --- a/ui/app/components/pending-tx/index.js +++ b/ui/app/components/pending-tx/index.js @@ -63,14 +63,17 @@ PendingTx.prototype.componentWillMount = async function () { isFetching: false, }) } + const tokenData = txParams && abiDecoder.decodeMethod(txParams.data) + const { name: tokenMethodName } = tokenData || {} + const isTokenTransaction = ['transfer', 'approve', 'transferFrom'] + .find(possibleName => tokenMethodName === possibleName) - try { + if (isTokenTransaction) { const token = util.getContractAtAddress(txParams.to) const results = await Promise.all([ token.symbol(), token.decimals(), ]) - const [ symbol, decimals ] = results if (symbol[0] && decimals[0]) { @@ -83,11 +86,14 @@ PendingTx.prototype.componentWillMount = async function () { }) } else { this.setState({ - transactionType: TX_TYPES.SEND_ETHER, + transactionType: TX_TYPES.SEND_TOKEN, + tokenAddress: txParams.to, + tokenSymbol: null, + tokenDecimals: null, isFetching: false, }) } - } catch (e) { + } else { this.setState({ transactionType: TX_TYPES.SEND_ETHER, isFetching: false, diff --git a/ui/app/selectors.js b/ui/app/selectors.js index 5d2635775..a8b32f129 100644 --- a/ui/app/selectors.js +++ b/ui/app/selectors.js @@ -55,8 +55,9 @@ function getSelectedToken (state) { const tokens = state.metamask.tokens || [] const selectedTokenAddress = state.metamask.selectedTokenAddress const selectedToken = tokens.filter(({ address }) => address === selectedTokenAddress)[0] + const sendToken = state.metamask.send.token - return selectedToken || null + return selectedToken || sendToken || null } function getSelectedTokenExchangeRate (state) { From 3c1248c8169a1cb96a0ee2bc0f523fb9c765569e Mon Sep 17 00:00:00 2001 From: Alexander Tseung Date: Mon, 19 Mar 2018 16:12:09 -0700 Subject: [PATCH 11/30] Update confirm transaction screen --- test/integration/lib/send-new-ui.js | 6 +- ui/app/components/network-display.js | 51 +++ .../pending-tx/confirm-deploy-contract.js | 10 +- .../pending-tx/confirm-send-ether.js | 352 +++++++++--------- ui/app/components/sender-to-recipient.js | 29 +- ui/app/css/itcss/components/network.scss | 12 + ui/app/css/itcss/components/send.scss | 6 +- ui/app/css/itcss/generic/index.scss | 7 +- ui/app/send-v2.js | 15 +- 9 files changed, 282 insertions(+), 206 deletions(-) create mode 100644 ui/app/components/network-display.js diff --git a/test/integration/lib/send-new-ui.js b/test/integration/lib/send-new-ui.js index 573faaee3..3fc7c79f8 100644 --- a/test/integration/lib/send-new-ui.js +++ b/test/integration/lib/send-new-ui.js @@ -128,10 +128,10 @@ async function runSendFlowTest(assert, done) { selectState.val('send edit') reactTriggerChange(selectState[0]) - const confirmFromName = (await queryAsync($, '.confirm-screen-account-name')).first() + 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') - const confirmToName = (await queryAsync($, '.confirm-screen-account-name')).last() + const confirmToName = (await queryAsync($, '.sender-to-recipient__recipient-name')).last() assert.equal(confirmToName[0].textContent, 'Send Account 3', 'confirm screen should show correct to name') const confirmScreenRows = await queryAsync($, '.confirm-screen-rows') @@ -140,7 +140,7 @@ async function runSendFlowTest(assert, done) { const confirmScreenTotal = confirmScreenRows.find('.confirm-screen-row-info')[2] assert.equal(confirmScreenTotal.textContent, '2405.36 USD', 'confirm screen should show correct total') - const confirmScreenBackButton = await queryAsync($, '.confirm-screen-back-button') + const confirmScreenBackButton = await queryAsync($, '.page-container__back-button') confirmScreenBackButton[0].click() const sendFromFieldItemInEdit = await queryAsync($, '.account-list-item') diff --git a/ui/app/components/network-display.js b/ui/app/components/network-display.js new file mode 100644 index 000000000..9dc31b5c7 --- /dev/null +++ b/ui/app/components/network-display.js @@ -0,0 +1,51 @@ +const { Component } = require('react') +const h = require('react-hyperscript') +const PropTypes = require('prop-types') +const { connect } = require('react-redux') +const NetworkDropdownIcon = require('./dropdowns/components/network-dropdown-icon') +const t = require('../../i18n') + +const networkToColorHash = { + 1: '#038789', + 3: '#e91550', + 42: '#690496', + 4: '#ebb33f', +} + +class NetworkDisplay extends Component { + renderNetworkIcon () { + const { network } = this.props + const networkColor = networkToColorHash[network] + + return networkColor + ? h(NetworkDropdownIcon, { backgroundColor: networkColor }) + : h('i.fa.fa-question-circle.fa-med', { + style: { + margin: '0 4px', + color: 'rgb(125, 128, 130)', + }, + }) + } + + render () { + const { provider: { type } } = this.props + return h('.network-display__container', [ + this.renderNetworkIcon(), + h('.network-name', t(type)), + ]) + } +} + +NetworkDisplay.propTypes = { + network: PropTypes.string, + provider: PropTypes.object, +} + +const mapStateToProps = ({ metamask: { network, provider } }) => { + return { + network, + provider, + } +} + +module.exports = connect(mapStateToProps)(NetworkDisplay) diff --git a/ui/app/components/pending-tx/confirm-deploy-contract.js b/ui/app/components/pending-tx/confirm-deploy-contract.js index 4810bb515..b75f3a964 100644 --- a/ui/app/components/pending-tx/confirm-deploy-contract.js +++ b/ui/app/components/pending-tx/confirm-deploy-contract.js @@ -10,6 +10,7 @@ const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') const { conversionUtil } = require('../../conversion-util') const t = require('../../../i18n') const SenderToRecipient = require('../sender-to-recipient') +const NetworkDisplay = require('../network-display') const { MIN_GAS_PRICE_HEX } = require('../send/send-constants') @@ -244,9 +245,12 @@ class ConfirmDeployContract extends Component { return ( h('.page-container', [ h('.page-container__header', [ - h('.page-container__back-button', { - onClick: () => backToAccountDetail(selectedAddress), - }, t('back')), + h('.page-container__header-row', [ + h('span.page-container__back-button', { + onClick: () => backToAccountDetail(selectedAddress), + }, t('back')), + window.METAMASK_UI_TYPE === 'notification' && h(NetworkDisplay), + ]), h('.page-container__title', t('confirmContract')), h('.page-container__subtitle', t('pleaseReviewTransaction')), ]), diff --git a/ui/app/components/pending-tx/confirm-send-ether.js b/ui/app/components/pending-tx/confirm-send-ether.js index f36def9d5..d1ce25cbf 100644 --- a/ui/app/components/pending-tx/confirm-send-ether.js +++ b/ui/app/components/pending-tx/confirm-send-ether.js @@ -4,7 +4,6 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const actions = require('../../actions') const clone = require('clone') -const Identicon = require('../identicon') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') @@ -15,6 +14,8 @@ const { } = require('../../conversion-util') const GasFeeDisplay = require('../send/gas-fee-display-v2') const t = require('../../../i18n') +const SenderToRecipient = require('../sender-to-recipient') +const NetworkDisplay = require('../network-display') const { MIN_GAS_PRICE_HEX } = require('../send/send-constants') @@ -257,196 +258,181 @@ ConfirmSendEther.prototype.render = function () { this.inputs = [] return ( - h('div.confirm-screen-container.confirm-send-ether', [ - // Main Send token Card - h('div.page-container', [ - h('div.page-container__header', [ - !txMeta.lastGasPrice && h('button.confirm-screen-back-button', { + // Main Send token Card + h('.page-container', [ + h('.page-container__header', [ + h('.page-container__header-row', [ + h('span.page-container__back-button', { onClick: () => editTransaction(txMeta), + style: { + visibility: !txMeta.lastGasPrice ? 'initial' : 'hidden', + }, }, 'Edit'), - h('div.page-container__title', title), - h('div.page-container__subtitle', subtitle), + window.METAMASK_UI_TYPE === 'notification' && h(NetworkDisplay), ]), - h('.page-container__content', [ - h('div.flex-row.flex-center.confirm-screen-identicons', [ - h('div.confirm-screen-account-wrapper', [ - h( - Identicon, - { - address: fromAddress, - diameter: 60, - }, - ), - h('span.confirm-screen-account-name', fromName), - // h('span.confirm-screen-account-number', fromAddress.slice(fromAddress.length - 4)), - ]), - h('i.fa.fa-arrow-right.fa-lg'), - h('div.confirm-screen-account-wrapper', [ - h( - Identicon, - { - address: txParams.to, - diameter: 60, - }, - ), - h('span.confirm-screen-account-name', toName), - // h('span.confirm-screen-account-number', toAddress.slice(toAddress.length - 4)), - ]), - ]), + h('.page-container__title', title), + h('.page-container__subtitle', subtitle), + ]), + h('.page-container__content', [ + h(SenderToRecipient, { + senderName: fromName, + senderAddress: fromAddress, + recipientName: toName, + recipientAddress: txParams.to, + }), - // h('h3.flex-center.confirm-screen-sending-to-message', { - // style: { - // textAlign: 'center', - // fontSize: '16px', - // }, - // }, [ - // `You're sending to Recipient ...${toAddress.slice(toAddress.length - 4)}`, - // ]), + // h('h3.flex-center.confirm-screen-sending-to-message', { + // style: { + // textAlign: 'center', + // fontSize: '16px', + // }, + // }, [ + // `You're sending to Recipient ...${toAddress.slice(toAddress.length - 4)}`, + // ]), - h('h3.flex-center.confirm-screen-send-amount', [`${amountInFIAT}`]), - h('h3.flex-center.confirm-screen-send-amount-currency', [ currentCurrency.toUpperCase() ]), - h('div.flex-center.confirm-memo-wrapper', [ - h('h3.confirm-screen-send-memo', [ memo ? `"${memo}"` : '' ]), - ]), - - h('div.confirm-screen-rows', [ - h('section.flex-row.flex-center.confirm-screen-row', [ - h('span.confirm-screen-label.confirm-screen-section-column', [ t('from') ]), - h('div.confirm-screen-section-column', [ - h('div.confirm-screen-row-info', fromName), - h('div.confirm-screen-row-detail', `...${fromAddress.slice(fromAddress.length - 4)}`), - ]), - ]), - - h('section.flex-row.flex-center.confirm-screen-row', [ - h('span.confirm-screen-label.confirm-screen-section-column', [ t('to') ]), - h('div.confirm-screen-section-column', [ - h('div.confirm-screen-row-info', toName), - h('div.confirm-screen-row-detail', `...${toAddress.slice(toAddress.length - 4)}`), - ]), - ]), - - h('section.flex-row.flex-center.confirm-screen-row', [ - h('span.confirm-screen-label.confirm-screen-section-column', [ t('gasFee') ]), - h('div.confirm-screen-section-column', [ - h(GasFeeDisplay, { - gasTotal: gasTotal || gasFeeInHex, - conversionRate, - convertedCurrency, - onClick: () => showCustomizeGasModal(txMeta, sendGasLimit, sendGasPrice, gasTotal), - }), - ]), - ]), - - h('section.flex-row.flex-center.confirm-screen-row.confirm-screen-total-box ', [ - h('div.confirm-screen-section-column', [ - h('span.confirm-screen-label', [ t('total') + ' ' ]), - h('div.confirm-screen-total-box__subtitle', [ t('amountPlusGas') ]), - ]), - - h('div.confirm-screen-section-column', [ - h('div.confirm-screen-row-info', `${totalInFIAT} ${currentCurrency.toUpperCase()}`), - h('div.confirm-screen-row-detail', `${totalInETH} ETH`), - ]), - ]), - ]), - - // These are latest errors handling from master - // Leaving as comments as reference when we start implementing error handling - // h('style', ` - // .conf-buttons button { - // margin-left: 10px; - // text-transform: uppercase; - // } - // `), - - // txMeta.simulationFails ? - // h('.error', { - // style: { - // marginLeft: 50, - // fontSize: '0.9em', - // }, - // }, 'Transaction Error. Exception thrown in contract code.') - // : null, - - // !isValidAddress ? - // h('.error', { - // style: { - // marginLeft: 50, - // fontSize: '0.9em', - // }, - // }, 'Recipient address is invalid. Sending this transaction will result in a loss of ETH.') - // : null, - - // insufficientBalance ? - // h('span.error', { - // style: { - // marginLeft: 50, - // fontSize: '0.9em', - // }, - // }, 'Insufficient balance for transaction') - // : null, - - // // send + cancel - // h('.flex-row.flex-space-around.conf-buttons', { - // style: { - // display: 'flex', - // justifyContent: 'flex-end', - // margin: '14px 25px', - // }, - // }, [ - // h('button', { - // onClick: (event) => { - // this.resetGasFields() - // event.preventDefault() - // }, - // }, 'Reset'), - - // // Accept Button or Buy Button - // insufficientBalance ? h('button.btn-green', { onClick: props.buyEth }, 'Buy Ether') : - // h('input.confirm.btn-green', { - // type: 'submit', - // value: 'SUBMIT', - // style: { marginLeft: '10px' }, - // disabled: buyDisabled, - // }), - - // h('button.cancel.btn-red', { - // onClick: props.cancelTransaction, - // }, 'Reject'), - // ]), - // showRejectAll ? h('.flex-row.flex-space-around.conf-buttons', { - // style: { - // display: 'flex', - // justifyContent: 'flex-end', - // margin: '14px 25px', - // }, - // }, [ - // h('button.cancel.btn-red', { - // onClick: props.cancelAllTransactions, - // }, 'Reject All'), - // ]) : null, - // ]), - // ]) - // ) - // } + h('h3.flex-center.confirm-screen-send-amount', [`${amountInFIAT}`]), + h('h3.flex-center.confirm-screen-send-amount-currency', [ currentCurrency.toUpperCase() ]), + h('div.flex-center.confirm-memo-wrapper', [ + h('h3.confirm-screen-send-memo', [ memo ? `"${memo}"` : '' ]), ]), - h('form#pending-tx-form', { - onSubmit: this.onSubmit, - }, [ - h('.page-container__footer', [ - // Cancel Button - h('button.btn-cancel.page-container__footer-button.allcaps', { - onClick: (event) => { - clearSend() - this.cancel(event, txMeta) - }, - }, t('cancel')), - - // Accept Button - h('button.btn-confirm.page-container__footer-button.allcaps', [t('confirm')]), + h('div.confirm-screen-rows', [ + h('section.flex-row.flex-center.confirm-screen-row', [ + h('span.confirm-screen-label.confirm-screen-section-column', [ t('from') ]), + h('div.confirm-screen-section-column', [ + h('div.confirm-screen-row-info', fromName), + h('div.confirm-screen-row-detail', `...${fromAddress.slice(fromAddress.length - 4)}`), + ]), ]), + + h('section.flex-row.flex-center.confirm-screen-row', [ + h('span.confirm-screen-label.confirm-screen-section-column', [ t('to') ]), + h('div.confirm-screen-section-column', [ + h('div.confirm-screen-row-info', toName), + h('div.confirm-screen-row-detail', `...${toAddress.slice(toAddress.length - 4)}`), + ]), + ]), + + h('section.flex-row.flex-center.confirm-screen-row', [ + h('span.confirm-screen-label.confirm-screen-section-column', [ t('gasFee') ]), + h('div.confirm-screen-section-column', [ + h(GasFeeDisplay, { + gasTotal: gasTotal || gasFeeInHex, + conversionRate, + convertedCurrency, + onClick: () => showCustomizeGasModal(txMeta, sendGasLimit, sendGasPrice, gasTotal), + }), + ]), + ]), + + h('section.flex-row.flex-center.confirm-screen-row.confirm-screen-total-box ', [ + h('div.confirm-screen-section-column', [ + h('span.confirm-screen-label', [ t('total') + ' ' ]), + h('div.confirm-screen-total-box__subtitle', [ t('amountPlusGas') ]), + ]), + + h('div.confirm-screen-section-column', [ + h('div.confirm-screen-row-info', `${totalInFIAT} ${currentCurrency.toUpperCase()}`), + h('div.confirm-screen-row-detail', `${totalInETH} ETH`), + ]), + ]), + ]), + +// These are latest errors handling from master +// Leaving as comments as reference when we start implementing error handling +// h('style', ` +// .conf-buttons button { +// margin-left: 10px; +// text-transform: uppercase; +// } +// `), + +// txMeta.simulationFails ? +// h('.error', { +// style: { +// marginLeft: 50, +// fontSize: '0.9em', +// }, +// }, 'Transaction Error. Exception thrown in contract code.') +// : null, + +// !isValidAddress ? +// h('.error', { +// style: { +// marginLeft: 50, +// fontSize: '0.9em', +// }, +// }, 'Recipient address is invalid. Sending this transaction will result in a loss of ETH.') +// : null, + +// insufficientBalance ? +// h('span.error', { +// style: { +// marginLeft: 50, +// fontSize: '0.9em', +// }, +// }, 'Insufficient balance for transaction') +// : null, + +// // send + cancel +// h('.flex-row.flex-space-around.conf-buttons', { +// style: { +// display: 'flex', +// justifyContent: 'flex-end', +// margin: '14px 25px', +// }, +// }, [ +// h('button', { +// onClick: (event) => { +// this.resetGasFields() +// event.preventDefault() +// }, +// }, 'Reset'), + +// // Accept Button or Buy Button +// insufficientBalance ? h('button.btn-green', { onClick: props.buyEth }, 'Buy Ether') : +// h('input.confirm.btn-green', { +// type: 'submit', +// value: 'SUBMIT', +// style: { marginLeft: '10px' }, +// disabled: buyDisabled, +// }), + +// h('button.cancel.btn-red', { +// onClick: props.cancelTransaction, +// }, 'Reject'), +// ]), +// showRejectAll ? h('.flex-row.flex-space-around.conf-buttons', { +// style: { +// display: 'flex', +// justifyContent: 'flex-end', +// margin: '14px 25px', +// }, +// }, [ +// h('button.cancel.btn-red', { +// onClick: props.cancelAllTransactions, +// }, 'Reject All'), +// ]) : null, +// ]), +// ]) +// ) +// } + ]), + + h('form#pending-tx-form', { + onSubmit: this.onSubmit, + }, [ + h('.page-container__footer', [ + // Cancel Button + h('button.btn-cancel.page-container__footer-button.allcaps', { + onClick: (event) => { + clearSend() + this.cancel(event, txMeta) + }, + }, t('cancel')), + + // Accept Button + h('button.btn-confirm.page-container__footer-button.allcaps', [t('confirm')]), ]), ]), ]) diff --git a/ui/app/components/sender-to-recipient.js b/ui/app/components/sender-to-recipient.js index 25b9c7d6b..f35c353ad 100644 --- a/ui/app/components/sender-to-recipient.js +++ b/ui/app/components/sender-to-recipient.js @@ -5,6 +5,28 @@ const t = require('../../i18n') const Identicon = require('./identicon') class SenderToRecipient extends Component { + renderRecipientIcon () { + const { recipientAddress } = this.props + return ( + recipientAddress + ? h(Identicon, { address: recipientAddress, diameter: 20 }) + : h('i.fa.fa-file-text-o') + ) + } + + renderRecipient () { + const { recipientName } = this.props + return ( + h('.sender-to-recipient__recipient', [ + this.renderRecipientIcon(), + h( + '.sender-to-recipient__name.sender-to-recipient__recipient-name', + recipientName || t('newContract') + ), + ]) + ) + } + render () { const { senderName, senderAddress } = this.props @@ -28,10 +50,7 @@ class SenderToRecipient extends Component { }), ]), ]), - h('.sender-to-recipient__recipient', [ - h('i.fa.fa-file-text-o'), - h('.sender-to-recipient__name.sender-to-recipient__recipient-name', t('newContract')), - ]), + this.renderRecipient(), ]) ) } @@ -40,6 +59,8 @@ class SenderToRecipient extends Component { SenderToRecipient.propTypes = { senderName: PropTypes.string, senderAddress: PropTypes.string, + recipientName: PropTypes.string, + recipientAddress: PropTypes.string, } module.exports = SenderToRecipient diff --git a/ui/app/css/itcss/components/network.scss b/ui/app/css/itcss/components/network.scss index 374cb71b6..c34b5cd06 100644 --- a/ui/app/css/itcss/components/network.scss +++ b/ui/app/css/itcss/components/network.scss @@ -159,3 +159,15 @@ .network-caret { margin: 0 8px 2px; } + +.network-display { + &__container { + display: flex; + align-items: center; + justify-content: flex-start; + + @media screen and (min-width: 576px) { + display: none; + } + } +} diff --git a/ui/app/css/itcss/components/send.scss b/ui/app/css/itcss/components/send.scss index bdea1b008..263b362ca 100644 --- a/ui/app/css/itcss/components/send.scss +++ b/ui/app/css/itcss/components/send.scss @@ -526,14 +526,10 @@ } &__form { - padding: 13px 0; - width: 100%; - overflow-y: auto; + padding: 10px 0 25px; @media screen and (max-width: $break-small) { - padding: 13px 0; margin: 0; - overflow-y: auto; flex: 1 1 auto; } } diff --git a/ui/app/css/itcss/generic/index.scss b/ui/app/css/itcss/generic/index.scss index 1e226b93e..08e639d74 100644 --- a/ui/app/css/itcss/generic/index.scss +++ b/ui/app/css/itcss/generic/index.scss @@ -106,6 +106,12 @@ input.large-input { } } + &__header-row { + padding-bottom: 10px; + display: flex; + justify-content: space-between; + } + &__footer { display: flex; flex-flow: row; @@ -138,7 +144,6 @@ input.large-input { color: #2f9ae0; font-size: 1rem; cursor: pointer; - padding-bottom: 10px; font-weight: 400; } diff --git a/ui/app/send-v2.js b/ui/app/send-v2.js index 5ac59fc29..de4c38232 100644 --- a/ui/app/send-v2.js +++ b/ui/app/send-v2.js @@ -480,18 +480,19 @@ SendTransactionScreen.prototype.renderMemoRow = function () { } SendTransactionScreen.prototype.renderForm = function () { - return h('div.send-v2__form', {}, [ + return h('.page-container__content', {}, [ + h('.send-v2__form', [ + this.renderFromRow(), - this.renderFromRow(), + this.renderToRow(), - this.renderToRow(), + this.renderAmountRow(), - this.renderAmountRow(), + this.renderGasRow(), - this.renderGasRow(), - - // this.renderMemoRow(), + // this.renderMemoRow(), + ]), ]) } From 93495b28098701e5558052b7f39c39993dc64911 Mon Sep 17 00:00:00 2001 From: Jeffrey Tong Date: Tue, 20 Mar 2018 12:18:48 -0700 Subject: [PATCH 12/30] fix for lint --- app/scripts/background.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 679c2a4e2..53b67f294 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -40,7 +40,7 @@ const isIE = !!document.documentMode const isEdge = !isIE && !!window.StyleMedia let popupIsOpen = false -let notifcationIsOpen = false; +let notificationIsOpen = false let openMetamaskTabsIDs = {} // state persistence @@ -139,8 +139,8 @@ function setupController (initState) { } if (remotePort.name === 'notification') { endOfStream(portStream, () => { - notifcationIsOpen = false - }); + notificationIsOpen = false + }) } } else { // communication with page @@ -184,8 +184,8 @@ function setupController (initState) { function triggerUi () { extension.tabs.query({ active: true }, (tabs) => { const currentlyActiveMetamaskTab = tabs.find(tab => openMetamaskTabsIDs[tab.id]) - if (!popupIsOpen && !currentlyActiveMetamaskTab) notificationManager.showPopup(); - notifcationIsOpen = true; + if (!popupIsOpen && !currentlyActiveMetamaskTab && !notificationIsOpen) notificationManager.showPopup() + notificationIsOpen = true }) } From bb8b84f2fe9c56f6e2a8c13235c2719a1ccb1f0a Mon Sep 17 00:00:00 2001 From: Bradford Lamson-Scribner Date: Mon, 19 Mar 2018 18:37:38 -0600 Subject: [PATCH 13/30] add Dutch translations --- app/_locales/nl/messages.json | 819 ++++++++++++++++++++++++++++++++++ 1 file changed, 819 insertions(+) create mode 100644 app/_locales/nl/messages.json diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json new file mode 100644 index 000000000..aacb81fee --- /dev/null +++ b/app/_locales/nl/messages.json @@ -0,0 +1,819 @@ +{ + "accept": { + "message": "Aanvaarden" + }, + "account": { + "message": "Account" + }, + "accountDetails": { + "message": "Accountgegevens" + }, + "accountName": { + "message": "Accountnaam" + }, + "address": { + "message": "Adres" + }, + "addCustomToken": { + "message": "Aangepaste token toevoegen" + }, + "addToken": { + "message": "Voeg token toe" + }, + "addTokens": { + "message": "Tokens toevoegen" + }, + "amount": { + "message": "Bedrag" + }, + "amountPlusGas": { + "message": "Bedrag + gas" + }, + "appDescription": { + "message": "Ethereum Browser-extensie", + "description": "De beschrijving van de applicatie" + }, + "appName": { + "message": "MetaMask", + "description": "De naam van de applicatie" + }, + "attemptingConnect": { + "message": "Poging om verbinding te maken met blockchain." + }, + "attributions": { + "message": "Bevoegdheden" + }, + "available": { + "message": "Beschikbaar" + }, + "back": { + "message": "Terug" + }, + "balance": { + "message": "Balans:" + }, + "balances": { + "message": "Je saldo" + }, + "balanceIsInsufficientGas": { + "message": "Onvoldoende saldo voor huidig ​​gastotaal" + }, + "beta": { + "message": "BETA" + }, + "betweenMinAndMax": { + "message": "moet groter zijn dan of gelijk zijn aan $1 en kleiner dan of gelijk aan $2.", + "description": "helper voor het invoeren van hex als decimale invoer" + }, + "blockiesIdenticon": { + "message": "Gebruik Blockies Identicon" + }, + "borrowDharma": { + "message": "Lenen met Dharma (Beta)" + }, + "builtInCalifornia": { + "message": "MetaMask is ontworpen en gebouwd in Californië." + }, + "buy": { + "message": "Kopen" + }, + "buyCoinbase": { + "message": "Koop op Coinbase" + }, + "buyCoinbaseExplainer": { + "message": "Coinbase is 's werelds populairste manier om bitcoin, ethereum en litecoin te kopen en verkopen." + }, + "cancel": { + "message": "Annuleer" + }, + "classicInterface": { + "message": "Gebruik de klassieke interface" + }, + "clickCopy": { + "message": "Klik om te kopiëren" + }, + "confirm": { + "message": "Bevestigen" + }, + "confirmContract": { + "message": "Contract bevestigen" + }, + "confirmPassword": { + "message": "bevestig wachtwoord" + }, + "confirmTransaction": { + "message": "Bevestig transactie" + }, + "continue": { + "message": "Doorgaan met" + }, + "continueToCoinbase": { + "message": "Ga verder naar Coinbase" + }, + "contractDeployment": { + "message": "Contractimplementatie" + }, + "conversionProgress": { + "message": "Bezig met conversie" + }, + "copiedButton": { + "message": "gekopieerde" + }, + "copiedClipboard": { + "message": "Gekopieerd naar het klembord" + }, + "copiedExclamation": { + "message": "Gekopieerde!" + }, + "copiedSafe": { + "message": "Ik heb het ergens veilig gekopieerd" + }, + "copy": { + "message": "Kopiëren" + }, + "copyToClipboard": { + "message": "Kopieer naar klembord" + }, + "copyButton": { + "message": " Kopiëren " + }, + "copyPrivateKey": { + "message": "Dit is uw privésleutel (klik om te kopiëren)" + }, + "create": { + "message": "creëren" + }, + "createAccount": { + "message": "Account aanmaken" + }, + "createDen": { + "message": "creëren" + }, + "crypto": { + "message": "crypto", + "description": "Ruiltype (cryptocurrencies)" + }, + "currentConversion": { + "message": "Huidige conversie" + }, + "currentNetwork": { + "message": "Huidig ​​netwerk" + }, + "customGas": { + "message": "Pas Gas aan" + }, + "customize": { + "message": "Aanpassen" + }, + "customRPC": { + "message": "Aangepaste RPC" + }, + "decimalsMustZerotoTen": { + "message": "Decimalen moeten minimaal 0 en niet meer dan 36 zijn." + }, + "decimal": { + "message": "Decimalen van precisie" + }, + "defaultNetwork": { + "message": "Het standaardnetwerk voor Ether-transacties is Main Net." + }, + "denExplainer": { + "message": "Uw DEN is uw wachtwoord-gecodeerde opslag binnen MetaMask." + }, + "deposit": { + "message": "Storting" + }, + "depositBTC": { + "message": "Stort uw BTC op het onderstaande adres:" + }, + "depositCoin": { + "message": "Stort uw $1 op het onderstaande adres", + "description": "Laat de gebruiker weten welk muntje ze hebben geselecteerd om te deponeren met shapeshift" + }, + "depositEth": { + "message": "Aanbetaling Eth" + }, + "depositEther": { + "message": "Stort Ether" + }, + "depositFiat": { + "message": "Stort met Fiat" + }, + "depositFromAccount": { + "message": "Storten van een ander account" + }, + "depositShapeShift": { + "message": "Stort met ShapeShift" + }, + "depositShapeShiftExplainer": { + "message": "Als u andere cryptocurrencies bezit, kunt u Ether direct in uw MetaMask-portemonnee ruilen en storten. Geen account nodig." + }, + "details": { + "message": "Details" + }, + "directDeposit": { + "message": "Directe storting" + }, + "directDepositEther": { + "message": "Directe Ether storten" + }, + "directDepositEtherExplainer": { + "message": "Als je al wat Ether hebt, de snelste manier om Ether in je nieuwe portemonnee te krijgen door een directe storting." + }, + "done": { + "message": "Gedaan" + }, + "downloadStatelogs": { + "message": "Staatslogboeken downloaden" + }, + "edit": { + "message": "Bewerk" + }, + "editAccountName": { + "message": "Bewerk accountnaam" + }, + "emailUs": { + "message": "Email ons!" + }, + "encryptNewDen": { + "message": "Versleutel je nieuwe DEN" + }, + "enterPassword": { + "message": "Voer wachtwoord in" + }, + "enterPasswordConfirm": { + "message": "Voer uw wachtwoord in om te bevestigen" + }, + "etherscanView": { + "message": "Bekijk account op Etherscan" + }, + "exchangeRate": { + "message": "Wisselkoers" + }, + "exportPrivateKey": { + "message": "Exporteer privésleutel" + }, + "exportPrivateKeyWarning": { + "message": "Exporteer privésleutels op eigen risico." + }, + "failed": { + "message": "mislukt" + }, + "fiat": { + "message": "FIAT", + "description": "Ruiltype" + }, + "fileImportFail": { + "message": "Bestandsimport werkt niet? Klik hier!", + "description": "Helpt de gebruiker om zijn account vanuit een JSON-bestand te importeren" + }, + "followTwitter": { + "message": "Volg ons op Twitter" + }, + "from": { + "message": "Van" + }, + "fromToSame": { + "message": "Van en naar adres kan niet hetzelfde zijn" + }, + "fromShapeShift": { + "message": "Van ShapeShift" + }, + "gas": { + "message": "Gas", + "description": "Korte indicatie van gaskosten" + }, + "gasFee": { + "message": "Gas vergoeding" + }, + "gasLimit": { + "message": "Gaslimiet" + }, + "gasLimitCalculation": { + "message": "We berekenen de voorgestelde gaslimiet op basis van succespercentages van het netwerk." + }, + "gasLimitRequired": { + "message": "Gaslimiet vereist" + }, + "gasLimitTooLow": { + "message": "De gaslimiet moet minstens 21000 zijn" + }, + "generatingSeed": { + "message": "Zaad produceren ..." + }, + "gasPrice": { + "message": "Gasprijs (GWEI)" + }, + "gasPriceCalculation": { + "message": "We berekenen de voorgestelde gasprijzen op basis van succespercentages van het netwerk." + }, + "gasPriceRequired": { + "message": "Gasprijs vereist" + }, + "getEther": { + "message": "Krijg Ether" + }, + "getEtherFromFaucet": { + "message": "Haal Ether uit een kraan voor de $1", + "description": "Geeft de netwerknaam voor Ether-kraan weer" + }, + "greaterThanMin": { + "message": "moet groter zijn dan of gelijk zijn aan $1.", + "description": "helper voor het invoeren van hex als decimale invoer" + }, + "here": { + "message": "hier", + "description": "zoals in -klik hier- voor meer informatie (gaat met troubleTokenBalances)" + }, + "hereList": { + "message": "Hier is een lijst !!!!" + }, + "hide": { + "message": "Verbergen" + }, + "hideToken": { + "message": "Token verbergen" + }, + "hideTokenPrompt": { + "message": "Token verbergen?" + }, + "howToDeposit": { + "message": "Hoe zou je Ether willen deponeren?" + }, + "holdEther": { + "message": "Hiermee kunt u ether & tokens bewaren en dient u als brug naar gedecentraliseerde applicaties." + }, + "import": { + "message": "Importeren", + "description": "Knop om een ​​account uit een geselecteerd bestand te importeren" + }, + "importAccount": { + "message": "Account importeren" + }, + "importAccountMsg": { + "message":" Geïmporteerde accounts worden niet gekoppeld aan de seedphrase van uw oorspronkelijk gemaakte MetaMask-account. Meer informatie over geïmporteerde accounts" + }, + "importAnAccount": { + "message": "Importeer een account" + }, + "importDen": { + "message": "Bestaande DEN importeren" + }, + "imported": { + "message": "geïmporteerde", + "description": "status die aantoont dat een account volledig in de sleutelring is geladen" + }, + "infoHelp": { + "message": "Info en hulp" + }, + "insufficientFunds": { + "message": "Onvoldoende fondsen." + }, + "insufficientTokens": { + "message": "Onvoldoende tokens." + }, + "invalidAddress": { + "message": "Ongeldig adres" + }, + "invalidAddressRecipient": { + "message": "Het adres van de ontvanger is ongeldig" + }, + "invalidGasParams": { + "message": "Ongeldige gasparameters" + }, + "invalidInput": { + "message": "Ongeldige invoer." + }, + "invalidRequest": { + "message": "ongeldig verzoek" + }, + "invalidRPC": { + "message": "Ongeldige RPC-URI" + }, + "jsonFail": { + "message": "Er is iets fout gegaan. Zorg ervoor dat uw JSON-bestand correct is opgemaakt." + }, + "jsonFile": { + "message": "JSON-bestand", + "description": "formaat voor het importeren van een account" + }, + "kovan": { + "message": "Kovan-testnetwerk" + }, + "knowledgeDataBase": { + "message": "Bezoek onze Knowledge Base" + }, + "lessThanMax": { + "message": "moet kleiner zijn dan of gelijk zijn aan $1.", + "description": "helper voor het invoeren van hex als decimale invoer" + }, + "likeToAddTokens": { + "message": "Wil je deze tokens toevoegen?" + }, + "limit": { + "message": "Begrenzing" + }, + "loading": { + "message": "Bezig met laden..." + }, + "loadingTokens": { + "message": "Tokens laden ..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "login": { + "message": "Log in" + }, + "logout": { + "message": "Uitloggen" + }, + "loose": { + "message": "Los" + }, + "loweCaseWords": { + "message": "zaadwoorden hebben alleen kleine letters" + }, + "mainnet": { + "message": "belangrijkste ethereum-netwerk" + }, + "message": { + "message": "Bericht" + }, + "metamaskDescription": { + "message": "MetaMask is een veilige identiteitskluis voor Ethereum." + }, + "min": { + "message": "Minimum" + }, + "myAccounts": { + "message": "Mijn accounts" + }, + "mustSelectOne": { + "message": "Moet ten minste één token selecteren." + }, + "needEtherInWallet": { + "message": "Om te communiceren met gedecentraliseerde applicaties met MetaMask, heb je Ether nodig in je portemonnee." + }, + "needImportFile": { + "message": "U moet een bestand selecteren om te importeren.", + "description": "Gebruiker is belangrijk een account en moet een bestand toevoegen om door te gaan" + }, + "needImportPassword": { + "message": "U moet een wachtwoord invoeren voor het geselecteerde bestand.", + "description": "Wachtwoord en bestand nodig om een ​​account te importeren" + }, + "negativeETH": { + "message": "Kan geen negatieve hoeveelheden ETH verzenden." + }, + "networks": { + "message": "netwerken" + }, + "newAccount": { + "message": "Nieuw account" + }, + "newAccountNumberName": { + "message": "Account $1", + "description": "Standaardnaam van de volgende account die moet worden aangemaakt op het scherm voor het maken van een account" + }, + "newContract": { + "message": "Nieuw contract" + }, + "newPassword": { + "message": "Nieuw wachtwoord (min 8 tekens)" + }, + "newRecipient": { + "message": "Nieuwe ontvanger" + }, + "newRPC": { + "message": "Nieuwe RPC-URL" + }, + "next": { + "message": "volgende" + }, + "noAddressForName": { + "message": "Er is geen adres ingesteld voor deze naam." + }, + "noDeposits": { + "message": "Geen aanbetalingen ontvangen" + }, + "noTransactionHistory": { + "message": "Geen transactiegeschiedenis." + }, + "noTransactions": { + "message": "Geen transacties" + }, + "notStarted": { + "message": "Niet begonnen" + }, + "oldUI": { + "message": "Oude gebruikersinterface" + }, + "oldUIMessage": { + "message": "U bent teruggekeerd naar de oude gebruikersinterface. U kunt terugschakelen naar de nieuwe gebruikersinterface via de optie in het vervolgkeuzemenu in de rechterbovenhoek." + }, + "or": { + "message": "of", + "description": "keuze tussen het maken of importeren van een nieuw account" + }, + "passwordCorrect": { + "message": "Zorg ervoor dat uw wachtwoord correct is." + }, + "passwordMismatch": { + "message": "wachtwoorden komen niet overeen", + "description": "bij het maken van het wachtwoord kwamen de twee nieuwe wachtwoordvelden niet overeen" + }, + "passwordShort": { + "message": "wachtwoord niet lang genoeg", + "description": "bij het maken van het wachtwoord is het wachtwoord niet lang genoeg om veilig te zijn" + }, + "pastePrivateKey": { + "message": "Plak hier uw privésleutelstring:", + "description": "Voor het importeren van een account vanaf een privésleutel" + }, + "pasteSeed": { + "message": "Plak je zaadzin hier!" + }, + "personalAddressDetected": { + "message": "Persoonlijk adres gedetecteerd. Voer het tokencontractadres in." + }, + "pleaseReviewTransaction": { + "message": "Controleer uw transactie." + }, + "privacyMsg": { + "message": "Privacybeleid" + }, + "privateKey": { + "message": "Prive sleutel", + "description": "selecteer dit type bestand om te gebruiken om een ​​account te importeren" + }, + "privateKeyWarning": { + "message": "Waarschuwing: open deze sleutel nooit. Iedereen met uw privésleutels kan stelen van alle items in uw account." + }, + "privateNetwork": { + "message": "Prive netwerk" + }, + "qrCode": { + "message": "QR-code weergeven" + }, + "readdToken": { + "message": "U kunt dit token in de toekomst weer toevoegen door naar \"Token toevoegen\" te gaan in het menu met accountopties." + }, + "readMore": { + "message": "Lees hier meer." + }, + "readMore2": { + "message": "Lees verder." + }, + "receive": { + "message": "Te ontvangen" + }, + "recipientAddress": { + "message": "Geadresseerde adres" + }, + "refundAddress": { + "message": "Uw teruggave adres" + }, + "rejected": { + "message": "Verworpen" + }, + "resetAccount": { + "message": "Account opnieuw instellen" + }, + "restoreFromSeed": { + "message": "Herstel van zaaduitdrukking" + }, + "required": { + "message": "Verplicht" + }, + "retryWithMoreGas": { + "message": "Probeer hier opnieuw met een hogere gasprijs" + }, + "revealSeedWords": { + "message": "Onthul zaadwoorden" + }, + "revealSeedWordsWarning": { + "message": "Herstel je zaadwoorden niet op een openbare plaats! Deze woorden kunnen worden gebruikt om al uw accounts te stelen." + }, + "revert": { + "message": "terugkeren" + }, + "rinkeby": { + "message": "Rinkeby testnetwerk" + }, + "ropsten": { + "message": "Ropsten testnetwerk" + }, + "sampleAccountName": { + "message": "Bijv. Mijn nieuwe account", + "description": "Help de gebruiker begrip te ontwikkelen van het toevoegen van een door mensen leesbare naam aan zijn of haar account" + }, + "save": { + "message": "Opslaan" + }, + "saveAsFile": { + "message": "Sla op als bestand", + "description": "Account export proces" + }, + "saveSeedAsFile": { + "message": "Bewaar zaadwoorden als bestand" + }, + "search": { + "message": "Zoeken" + }, + "secretPhrase": { + "message": "Voer hier je geheime twaalfwoordfrase in om je kluis te herstellen." + }, + "seedPhraseReq": { + "message": "zaadzinnen zijn 12 woorden lang" + }, + "select": { + "message": "kiezen" + }, + "selectCurrency": { + "message": "selecteer valuta" + }, + "selectService": { + "message": "Selecteer Service" + }, + "selectType": { + "message": "Selecteer type" + }, + "send": { + "message": "Sturen" + }, + "sendETH": { + "message": "Verzend ETH" + }, + "sendTokens": { + "message": "Stuur tokens" + }, + "sendTokensAnywhere": { + "message": "Stuur tokens naar iedereen met een Ethereum-account" + }, + "settings": { + "message": "instellingen" + }, + "shapeshiftBuy": { + "message": "Koop met Shapeshift" + }, + "showPrivateKeys": { + "message": "Privésleutels weergeven" + }, + "showQRCode": { + "message": "QR-code weergeven" + }, + "sign": { + "message": "Teken" + }, + "signMessage": { + "message": "Teken bericht" + }, + "signNotice": { + "message": "Het ondertekenen van dit bericht kan hebben \ngevaarlijke bijwerkingen. Meld alleen berichten van \nsites die u volledig vertrouwt met uw volledige account.\n Deze gevaarlijke methode wordt in een toekomstige versie verwijderd." + }, + "sigRequest": { + "message": "Ondertekeningsverzoek" + }, + "sigRequested": { + "message": "Handtekening aangevraagd" + }, + "spaceBetween": { + "message": "er kan alleen een spatie tussen woorden zijn" + }, + "status": { + "message": "staat" + }, + "stateLogs": { + "message": "Staatslogboeken" + }, + "stateLogsDescription": { + "message": "Staatslogboeken bevatten uw openbare accountadressen en verzonden transacties." + }, + "submit": { + "message": "voorleggen" + }, + "supportCenter": { + "message": "Bezoek ons ​​ondersteuningscentrum" + }, + "symbolBetweenZeroTen": { + "message": "Het symbool moet tussen 0 en 10 tekens lang zijn." + }, + "takesTooLong": { + "message": "Duurt te lang?" + }, + "terms": { + "message": "Gebruiksvoorwaarden" + }, + "testFaucet": { + "message": "Test de kraan" + }, + "to": { + "message": "Naar" + }, + "toETHviaShapeShift": { + "message": "$1 tot ETH via ShapeShift", + "description": "systeem zal het aanbetalingstype invullen bij het begin van het bericht" + }, + "tokenAddress": { + "message": "Token-adres" + }, + "tokenAlreadyAdded": { + "message": "Token is al toegevoegd." + }, + "tokenBalance": { + "message": "Uw tokensaldo is:" + }, + "tokenSelection": { + "message": "Zoek naar tokens of selecteer uit onze lijst met populaire tokens." + }, + "tokenSymbol": { + "message": "Token Symbol" + }, + "tokenWarning1": { + "message": "Houd de tokens bij die je hebt gekocht met je MetaMask-account. Als je tokens met een ander account hebt gekocht, worden die tokens hier niet weergegeven." + }, + "total": { + "message": "Totaal" + }, + "transactions": { + "message": "transacties" + }, + "transactionMemo": { + "message": "Transactiememo (optioneel)" + }, + "transactionNumber": { + "message": "Transactie nummer" + }, + "transfers": { + "message": "transfers" + }, + "troubleTokenBalances": { + "message": "We hadden problemen bij het laden van uw tokenbalansen. Je kunt ze bekijken", + "description": "Gevolgd door een link (hier) om tegensaldi te bekijken" + }, + "twelveWords": { + "message": "Deze 12 woorden zijn de enige manier om uw MetaMask-accounts te herstellen.\nBewaar ze ergens veilig en geheim." + }, + "typePassword": { + "message": "Typ uw wachtwoord" + }, + "uiWelcome": { + "message": "Welkom bij de nieuwe gebruikersinterface (bèta)" + }, + "uiWelcomeMessage": { + "message": "U gebruikt nu de nieuwe gebruikersinterface van Metamask. Kijk rond, probeer nieuwe functies uit zoals het verzenden van tokens en laat ons weten of u problemen ondervindt." + }, + "unavailable": { + "message": "Niet beschikbaar" + }, + "unknown": { + "message": "Onbekend" + }, + "unknownNetwork": { + "message": "Onbekend privénetwerk" + }, + "unknownNetworkId": { + "message": "Onbekende netwerk-ID" + }, + "uriErrorMsg": { + "message": "Voor URI's is het juiste HTTP / HTTPS-voorvoegsel vereist." + }, + "usaOnly": { + "message": "Alleen in de VS.", + "description": "Het gebruik van deze uitwisseling is beperkt tot mensen in de VS." + }, + "usedByClients": { + "message": "Gebruikt door verschillende klanten" + }, + "useOldUI": { + "message": "Gebruik de oude gebruikersinterface" + }, + "validFileImport": { + "message": "U moet een geldig bestand selecteren om te importeren." + }, + "vaultCreated": { + "message": "Vault gemaakt" + }, + "viewAccount": { + "message": "Bekijk account" + }, + "visitWebSite": { + "message": "Bezoek onze website" + }, + "warning": { + "message": "Waarschuwing" + }, + "welcomeBeta": { + "message": "Welkom bij MetaMask Beta" + }, + "whatsThis": { + "message": "Wat is dit?" + }, + "yourSigRequested": { + "message": "Uw handtekening wordt aangevraagd" + }, + "youSign": { + "message": "U ondertekent" + } +} From 3d885cae92603c8847660ecb0a7345b8289dae11 Mon Sep 17 00:00:00 2001 From: Herman Junge Date: Tue, 20 Mar 2018 19:25:21 -0300 Subject: [PATCH 14/30] alphabetic sort of spanish messages.json --- app/_locales/es/messages.json | 484 +++++++++++++++++----------------- 1 file changed, 242 insertions(+), 242 deletions(-) diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index f519c194c..2737e4eca 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -11,12 +11,18 @@ "accountName": { "message": "Nombre de la cuenta" }, - "address": { - "message": "Dirección" + "addCustomTokens": { + "message": "Agregar token personalizados" }, "addToken": { "message": "Agregar Token" }, + "addTokens": { + "message": "Agregar tokens" + }, + "address": { + "message": "Dirección" + }, "amount": { "message": "Cantidad" }, @@ -34,6 +40,9 @@ "attemptingConnect": { "message": "Intentando conectar a la Blockchain" }, + "attributions": { + "message": "Atribuciones" + }, "available": { "message": "Disponible" }, @@ -43,12 +52,12 @@ "balance": { "message": "Saldo" }, - "balances": { - "message": "Tus saldos" - }, "balanceIsInsufficientGas": { "message": "Saldo de gas insuficiente" }, + "balances": { + "message": "Tus saldos" + }, "beta": { "message": "BETA" }, @@ -56,9 +65,15 @@ "message": "Debe ser mayor o igual a $1 y menor o igual a $2", "description": "helper para ingresar hex como un ingreso decimal" }, + "blockiesIdenticon": { + "message": "Usar Blockies Identicon (Iconos)" + }, "borrowDharma": { "message": "Pedir prestado con Dharma (Beta)" }, + "builtInCalifornia": { + "message": "Metamask fue diseñado y construido en California " + }, "buy": { "message": "Comprar" }, @@ -71,36 +86,33 @@ "cancel": { "message": "Cancelar" }, + "classicInterface": { + "message": "Usar interfaz clasica " + }, "clickCopy": { "message": "Click para copiar" }, "confirm": { "message": "Confirmar" }, - "continue": { - "message": "Continuar" - }, "confirmContract": { "message": "Confirmar contrato" }, "confirmPassword": { "message": "Confirmar contraseña" }, - "enterPasswordConfirm": { - "message": "Ingresa tu contraseña para confirmar" - }, "confirmTransaction": { "message": "Confirmar transacción " }, + "continue": { + "message": "Continuar" + }, "continueToCoinbase": { "message": "Continuar a Coinbase" }, "contractDeployment": { "message": "Deployar contrato" }, - "currentConversion": { - "message": "Conversión Actual" - }, "conversionProgress": { "message": "Conversión en progreso" }, @@ -113,18 +125,21 @@ "copiedExclamation": { "message": "Copiado!" }, + "copiedSafe": { + "message": "Ya lo guardé en un lugar seguro" + }, "copy": { "message": "Copiar" }, - "copyToClipboard": { - "message": "Copiar al portapapeles" - }, "copyButton": { "message": " Copiar " }, "copyPrivateKey": { "message": "Esta es tu llave privada (Click para copiar)" }, + "copyToClipboard": { + "message": "Copiar al portapapeles" + }, "create": { "message": "Crear" }, @@ -138,20 +153,29 @@ "message": "Crypto", "description": "Tipo de Cambio (criptomonedas)" }, - "customGas": { - "message": "Personalizar Gas" + "currentConversion": { + "message": "Conversión Actual" }, - "customize": { - "message": "Personalizar" + "currentNetwork": { + "message": "Red actual" }, "currentRPC": { "message": "RPC actual" }, + "customGas": { + "message": "Personalizar Gas" + }, "customRPC": { "message": "RPC Personalizado" }, - "newRPC": { - "message": "Nueva URL del RPC" + "customize": { + "message": "Personalizar" + }, + "decimalsMustZerotoTen": { + "message": "Los decimales deben ser al menos 0 y no más de 36" + }, + "decimalsPrecision": { + "message": "Decimales de precisión" }, "defaultNetwork": { "message": "La red por defecto para las transacciones de Ether es MainNet (red principal)" @@ -202,20 +226,29 @@ "done": { "message": "Completo" }, + "down": { + "message": "abajo" + }, + "downloadStatelogs": { + "message": "Descargar logs de estados" + }, "edit": { "message": "Editar" }, "editAccountName": { "message": "Editar el nombre de la cuenta" }, + "emailUs": { + "message": "Envíanos un correo!" + }, "encryptNewDen": { "message": "Encriptar tu nuevo DEN" }, "enterPassword": { "message": "Ingresa contraseña" }, - "passwordCorrect": { - "message": "Asegurate que tu contraseña es correcta" + "enterPasswordConfirm": { + "message": "Ingresa tu contraseña para confirmar" }, "etherscanView": { "message": "Ver la cuenta en Etherscan" @@ -240,12 +273,18 @@ "message": "No funciona importar el archivo? Haz Click Aquí!", "description": "Ayuda al usuario a importar su cuenta desde un archivo JSON" }, + "followTwitter": { + "message": "Síguenos en Twitter" + }, "from": { "message": "De:" }, "fromShapeShift": { "message": "De ShapeShift" }, + "fromToSame": { + "message": "La dirección de origen y destino no pueden ser la misma" + }, "gas": { "message": "Gas", "description": "Indicación pequeña del costo de gas" @@ -274,6 +313,9 @@ "gasPriceRequired": { "message": "Precio del gas requerido" }, + "generatingSeed": { + "message": "Generando semilla..." + }, "getEther": { "message": "Conseguir Ether" }, @@ -289,6 +331,9 @@ "message": "Aqui", "description": "como en -haz click aquí- para más información" }, + "hereList": { + "message": "Aquí está una lista!!!" + }, "hide": { "message": "Ocultar" }, @@ -298,6 +343,9 @@ "hideTokenPrompt": { "message": "Ocultar Token?" }, + "holdEther": { + "message": "Te permite mantener tus ether y tokens, así como puente para aplicaciones descentralizadas" + }, "howToDeposit": { "message": "Cómo te gustaria depositar Ether?" }, @@ -318,33 +366,48 @@ "message": "Importado", "description": "estado que muestra que una cuenta ha sido completamente cargada en el llavero" }, + "importedAccountMsg": { + "message": "Cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas. " + }, + "info": { + "message": "Información" + }, "infoHelp": { "message": "Informacion y Ayuda" }, + "insufficientFounds": { + "message": "Fondos insuficientes" + }, + "insufficientTokens": { + "message": "Tokens insuficientes" + }, "invalidAddress": { "message": "Dirección Inválida" }, + "invalidAddressRecipient": { + "message": "Dirección del recipiente invalida" + }, "invalidGasParams": { "message": "Parametros de Gas Inválidos" }, "invalidInput": { "message": "Entrada inválida" }, + "invalidRPC": { + "message": "Invalida URL del RPC" + }, "invalidRequest": { "message": "Peticion inválida" }, - "invalidAddressRecipient": { - "message": "Dirección del recipiente invalida" - }, - "fromToSame": { - "message": "La dirección de origen y destino no pueden ser la misma" + "jsonFail": { + "message": "Algo malo pasó. Asegurate que tu JSON tiene el formato correcto" }, "jsonFile": { "message": "Archivo JSON", "description": "formato para importar una cuenta" }, - "jsonFail": { - "message": "Algo malo pasó. Asegurate que tu JSON tiene el formato correcto" + "knowledgeDataBase": { + "message": "Visita nuestra base de conocimiento" }, "kovan": { "message": "Red de pruebas Kovan" @@ -353,6 +416,9 @@ "message": "Debe ser menor o igual a $1", "description": "helper para ingresar hex como decimal" }, + "likeToAddTokens": { + "message": "¿Te gustaría agregar estos tokens?" + }, "limit": { "message": "Límite" }, @@ -374,15 +440,30 @@ "loose": { "message": "Loose" }, + "loweCaseWords": { + "message": "las frases semilla sólo pueden tener minúsculas" + }, "mainnet": { "message": "Red principal de Ethereum (MainNet)" }, "message": { "message": "Mensaje" }, + "metamaskDescription": { + "message": "Metamask es una identidad segura en Ethereum" + }, "min": { "message": "Minimo" }, + "msgCompose1": { + "message": "Solo manda " + }, + "msgCompose2": { + "message": " a una dirección de Ethereum" + }, + "mustSelectOne": { + "message": "Debe seleccionar al menos un (1) token" + }, "myAccounts": { "message": "Mis cuentas" }, @@ -397,8 +478,8 @@ "message": "Debes ingresar una contraseña para el archivo seleccionado", "description": "Contraseña y archivo necesarios para importar una cuenta" }, - "validFileImport": { - "message": "Debes selecionar un archivo valido para importar" + "negativeETH": { + "message": "No se pueden mandar cantidades negativas de ETH" }, "networks": { "message": "Redes" @@ -416,6 +497,9 @@ "newPassword": { "message": "Nueva contraseña (mínimo [8] caracteres)" }, + "newRPC": { + "message": "Nueva URL del RPC" + }, "newRecipient": { "message": "Nuevo destinatario" }, @@ -431,9 +515,6 @@ "noTransactionHistory": { "message": "Sin historial de transacciones" }, - "transactions": { - "message": "Transacciones" - }, "noTransactions": { "message": "Sin transacciones" }, @@ -443,9 +524,6 @@ "oldUI": { "message": "Antigua UI" }, - "useOldUI": { - "message": "Usar UI antigua" - }, "oldUIMessage": { "message": "Regresaste a la antigua UI. Puedes regresar a la nueva UI mediante la opcion en la barra desplegable del menu de arriba a la derecha." }, @@ -453,6 +531,12 @@ "message": "o", "description": "opción entre crear o importar una cuenta" }, + "password": { + "message": "Contraseña" + }, + "passwordCorrect": { + "message": "Asegurate que tu contraseña es correcta" + }, "passwordMismatch": { "message": "Contraseña no concide", "description": "en el proceso de creación de contraseña, los dos campos de contraseña no coincidieron" @@ -468,12 +552,15 @@ "pasteSeed": { "message": "Pegue su frase semilla aquí!" }, - "generatingSeed": { - "message": "Generando semilla..." + "personalAddressDetected": { + "message": "Dirección personal detectada. Ingresa la dirección del contrato del token" }, "pleaseReviewTransaction": { "message": "Por favor revisa tu transaccion" }, + "privacyMsg": { + "message": "Política de privacidad" + }, "privateKey": { "message": "Llave privada", "description": "select this type of file to use to import an account" @@ -487,12 +574,15 @@ "qrCode": { "message": "Mostrar codigo QR" }, - "readdToken": { - "message": "Puede volver a agregar este token en el futuro yendo a 'Agregar token' en el menú de opciones de su cuenta.." - }, "readMore": { "message": "Leer más aquí" }, + "readMore2": { + "message": "Leer más." + }, + "readdToken": { + "message": "Puede volver a agregar este token en el futuro yendo a 'Agregar token' en el menú de opciones de su cuenta.." + }, "receive": { "message": "Recibir" }, @@ -508,9 +598,21 @@ "required": { "message": "Requerido" }, + "resetAccount": { + "message": "Reiniciar cuenta" + }, + "restoreFromSeed": { + "message": "Restaurar desde semilla" + }, "retryWithMoreGas": { "message": "Vuelva a intentar con un precio de Gas más alto aquí" }, + "revealSeedWords": { + "message": "Revelar palabras de semilla" + }, + "revealSeedWordsWarning": { + "message": "No recuperes tu semilla en un lugar publico! Esas palabras pueden ser usadas para robarte todas tus cuentas" + }, "revert": { "message": "Revertir" }, @@ -531,27 +633,48 @@ "message": "Guardar como archivo", "description": "Proceso de exportación de cuenta" }, + "saveLogs": { + "message": "Logs de estado contienen tus direcciones publicas y transacciones enviadas" + }, + "saveSeedAsFile": { + "message": "Guardar la semilla como archivo" + }, + "search": { + "message": "Buscar" + }, + "secretPhrase": { + "message": "Ingresa tu frase de 12 palabras para restaurar tu bóveda" + }, + "seedPhraseReq": { + "message": "las frases semilla tienen doce (12) palabras de largo" + }, + "select": { + "message": "Seleccionar" + }, + "selectCurrency": { + "message": "Seleccionar moneda" + }, "selectService": { "message": "Seleccionar servicio" }, + "selectType": { + "message": "Seleccionar tipo" + }, "send": { "message": "Enviar" }, - "sendTokens": { - "message": "Enviar Tokens" - }, "sendETH": { "message": "Enviar ETH" }, + "sendTokens": { + "message": "Enviar Tokens" + }, "sendTokensAnywhere": { "message": "Enviar Tokens a cualquiera con una cuenta de Ethereum" }, "settings": { "message": "Configuración" }, - "info": { - "message": "Información" - }, "shapeshiftBuy": { "message": "Comprar con ShapeShift" }, @@ -561,6 +684,12 @@ "showQRCode": { "message": "Mostrar codigo QR" }, + "sigRequest": { + "message": "Solicitud de firma" + }, + "sigRequested": { + "message": "Firma solicitada" + }, "sign": { "message": "Firmar" }, @@ -570,11 +699,11 @@ "signNotice": { "message": "Firmar este mensaje puede tener\n efectos secundarios peligrosos. Firma sólo\nmensajes desde sitios a los cuales tú estés dispuesto a confiar completamente tu cuenta.\nEste método peligroso va a ser \nremovido en una version futura." }, - "sigRequest": { - "message": "Solicitud de firma" + "spaceBetween": { + "message": "Sólo puede haber un espacio entre las palabras" }, - "sigRequested": { - "message": "Firma solicitada" + "stateLogs": { + "message": "Logs de estado" }, "status": { "message": "Estado" @@ -582,9 +711,18 @@ "submit": { "message": "Enviar" }, + "supportCenter": { + "message": "Visita nuestro centro de atención" + }, + "symbolBetweenZeroTen": { + "message": "Símbolo debe ser entre 0 y 10 caracteres" + }, "takesTooLong": { "message": "¿Está tomando demasiado?" }, + "terms": { + "message": "Terminos de Uso" + }, "testFaucet": { "message": "Testear Faucet" }, @@ -595,9 +733,24 @@ "message": "$1 a ETH via ShapeShift", "description": "el sistema llenará el tipo de depósito al principio del mensaje" }, + "tokenAddress": { + "message": "Dirección del token" + }, + "tokenAlreadyAdded": { + "message": "El token esta actualmente agregado" + }, "tokenBalance": { "message": "Tu balance de Tokens es:" }, + "tokenSelection": { + "message": "Busca tokens o selecciónalo de nuestra lista de tokens populares" + }, + "tokenSymbol": { + "message": "Símbolo del token" + }, + "tokenWarning1": { + "message": "Mantenga un registro de los tokens que ha comprado con su cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." + }, "total": { "message": "Total" }, @@ -607,6 +760,9 @@ "transactionNumber": { "message": "Número de transacción" }, + "transactions": { + "message": "Transacciones" + }, "transfers": { "message": "Transferencias" }, @@ -614,6 +770,9 @@ "message": "Tuvimos problemas para cargar sus balances de tokens. Puedes verlos ", "description": "Followed by a link (here) to view token balances" }, + "twelveWords": { + "message": "Estas 12 palabras son la única forma de restablecer sus cuentas de MetaMask. \nGuardalas en un lugar seguro y secreto." + }, "typePassword": { "message": "Escribe tu contraseña" }, @@ -635,206 +794,47 @@ "unknownNetworkId": { "message": "ID (identidad) de Red desconocida" }, - "currentNetwork": { - "message": "Red actual" + "up": { + "message": "arriba" + }, + "urlErrorMsg": { + "message": "URI necesita el prefijo HTTP/HTTPS apropiado" }, "usaOnly": { "message": "Sólo USA (Estados Unidos)", "description": "El uso de este exchange (casa de cambio) estaá limitado a las personas dentro de los Estados Unidos de America" }, + "useOldUI": { + "message": "Usar UI antigua" + }, "usedByClients": { "message": "Utilizado por una variedad de clientes diferentes" }, - "viewAccount": { - "message": "Mirar cuenta" - }, - "warning": { - "message": "Advertencia" - }, - "whatsThis": { - "message": "Qué es esto?" - }, - "yourSigRequested": { - "message": "Tu firma ya fue solicidada" - }, - "youSign": { - "message": "Usted está firmando" - }, - "importedAccountMsg": { - "message": "Cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas. " - }, - "selectType": { - "message": "Seleccionar tipo" - }, - "selectCurrency": { - "message": "Seleccionar moneda" - }, - "password": { - "message": "Contraseña" - }, - "select": { - "message": "Seleccionar" - }, - "readMore2": { - "message": "Leer más." - }, - "secretPhrase": { - "message": "Ingresa tu frase de 12 palabras para restaurar tu bóveda" - }, - "spaceBetween": { - "message": "Sólo puede haber un espacio entre las palabras" - }, - "loweCaseWords": { - "message": "las frases semilla sólo pueden tener minúsculas" - }, - "seedPhraseReq": { - "message": "las frases semilla tienen doce (12) palabras de largo" - }, - "addTokens": { - "message": "Agregar tokens" - }, - "addCustomTokens": { - "message": "Agregar token personalizados" - }, - "up": { - "message": "arriba" - }, - "down": { - "message": "abajo" - }, - "tokenWarning1": { - "message": "Mantenga un registro de los tokens que ha comprado con su cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." - }, - "tokenSelection": { - "message": "Busca tokens o selecciónalo de nuestra lista de tokens populares" - }, - "search": { - "message": "Buscar" - }, - "privacyMsg": { - "message": "Política de privacidad" - }, - "terms": { - "message": "Terminos de Uso" - }, - "attributions": { - "message": "Atribuciones" - }, - "supportCenter": { - "message": "Visita nuestro centro de atención" - }, - "knowledgeDataBase": { - "message": "Visita nuestra base de conocimiento" - }, - "visitWebSite": { - "message": "Visita nuestro sitio web" - }, - "followTwitter": { - "message": "Síguenos en Twitter" - }, - "emailUs": { - "message": "Envíanos un correo!" - }, - "hereList": { - "message": "Aquí está una lista!!!" - }, - "insufficientFounds": { - "message": "Fondos insuficientes" - }, - "insufficientTokens": { - "message": "Tokens insuficientes" - }, - "negativeETH": { - "message": "No se pueden mandar cantidades negativas de ETH" - }, - "urlErrorMsg": { - "message": "URI necesita el prefijo HTTP/HTTPS apropiado" - }, - "invalidRPC": { - "message": "Invalida URL del RPC" - }, - "saveLogs": { - "message": "Logs de estado contienen tus direcciones publicas y transacciones enviadas" - }, - "stateLogs": { - "message": "Logs de estado" - }, - "downloadStatelogs": { - "message": "Descargar logs de estados" - }, - "revealSeedWords": { - "message": "Revelar palabras de semilla" - }, - "revealSeedWordsWarning": { - "message": "No recuperes tu semilla en un lugar publico! Esas palabras pueden ser usadas para robarte todas tus cuentas" - }, - "resetAccount": { - "message": "Reiniciar cuenta" - }, - "builtInCalifornia": { - "message": "Metamask fue diseñado y construido en California " - }, - "classicInterface": { - "message": "Usar interfaz clasica " - }, - "welcomeBeta": { - "message": "Bienvenido a Metamask Beta" - }, - "metamaskDescription": { - "message": "Metamask es una identidad segura en Ethereum" - }, - "holdEther": { - "message": "Te permite mantener tus ether y tokens, así como puente para aplicaciones descentralizadas" - }, - "decimalsMustZerotoTen": { - "message": "Los decimales deben ser al menos 0 y no más de 36" - }, - "symbolBetweenZeroTen": { - "message": "Símbolo debe ser entre 0 y 10 caracteres" - }, - "personalAddressDetected": { - "message": "Dirección personal detectada. Ingresa la dirección del contrato del token" - }, - "tokenAlreadyAdded": { - "message": "El token esta actualmente agregado" - }, - "mustSelectOne": { - "message": "Debe seleccionar al menos un (1) token" - }, - "tokenAddress": { - "message": "Dirección del token" - }, - "tokenSymbol": { - "message": "Símbolo del token" - }, - "decimalsPrecision": { - "message": "Decimales de precisión" - }, - "likeToAddTokens": { - "message": "¿Te gustaría agregar estos tokens?" - }, - "msgCompose1": { - "message": "Solo manda " - }, - "msgCompose2": { - "message": " a una dirección de Ethereum" - }, - "blockiesIdenticon": { - "message": "Usar Blockies Identicon (Iconos)" + "validFileImport": { + "message": "Debes selecionar un archivo valido para importar" }, "vaultCreated": { "message": "Bóveda creada" }, - "twelveWords": { - "message": "Estas 12 palabras son la única forma de restablecer sus cuentas de MetaMask. \nGuardalas en un lugar seguro y secreto." + "viewAccount": { + "message": "Mirar cuenta" }, - "copiedSafe": { - "message": "Ya lo guardé en un lugar seguro" + "visitWebSite": { + "message": "Visita nuestro sitio web" }, - "saveSeedAsFile": { - "message": "Guardar la semilla como archivo" + "warning": { + "message": "Advertencia" }, - "restoreFromSeed": { - "message": "Restaurar desde semilla" + "welcomeBeta": { + "message": "Bienvenido a Metamask Beta" + }, + "whatsThis": { + "message": "Qué es esto?" + }, + "youSign": { + "message": "Usted está firmando" + }, + "yourSigRequested": { + "message": "Tu firma ya fue solicidada" } -} \ No newline at end of file +} From 1cc1737d4272b9a7b725ecd5ce51c0e878b419fb Mon Sep 17 00:00:00 2001 From: Herman Junge Date: Tue, 20 Mar 2018 19:32:13 -0300 Subject: [PATCH 15/30] all 264 strings declared in your locale were found in the english one --- app/_locales/es/messages.json | 34 ++++++++-------------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 2737e4eca..980365347 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -11,7 +11,7 @@ "accountName": { "message": "Nombre de la cuenta" }, - "addCustomTokens": { + "addCustomToken": { "message": "Agregar token personalizados" }, "addToken": { @@ -159,7 +159,7 @@ "currentNetwork": { "message": "Red actual" }, - "currentRPC": { + "currentRpc": { "message": "RPC actual" }, "customGas": { @@ -171,12 +171,12 @@ "customize": { "message": "Personalizar" }, + "decimal": { + "message": "Decimales de precisión" + }, "decimalsMustZerotoTen": { "message": "Los decimales deben ser al menos 0 y no más de 36" }, - "decimalsPrecision": { - "message": "Decimales de precisión" - }, "defaultNetwork": { "message": "La red por defecto para las transacciones de Ether es MainNet (red principal)" }, @@ -226,9 +226,6 @@ "done": { "message": "Completo" }, - "down": { - "message": "abajo" - }, "downloadStatelogs": { "message": "Descargar logs de estados" }, @@ -366,7 +363,7 @@ "message": "Importado", "description": "estado que muestra que una cuenta ha sido completamente cargada en el llavero" }, - "importedAccountMsg": { + "importAccountMsg": { "message": "Cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas. " }, "info": { @@ -375,7 +372,7 @@ "infoHelp": { "message": "Informacion y Ayuda" }, - "insufficientFounds": { + "insufficientFunds": { "message": "Fondos insuficientes" }, "insufficientTokens": { @@ -455,12 +452,6 @@ "min": { "message": "Minimo" }, - "msgCompose1": { - "message": "Solo manda " - }, - "msgCompose2": { - "message": " a una dirección de Ethereum" - }, "mustSelectOne": { "message": "Debe seleccionar al menos un (1) token" }, @@ -531,9 +522,6 @@ "message": "o", "description": "opción entre crear o importar una cuenta" }, - "password": { - "message": "Contraseña" - }, "passwordCorrect": { "message": "Asegurate que tu contraseña es correcta" }, @@ -633,9 +621,6 @@ "message": "Guardar como archivo", "description": "Proceso de exportación de cuenta" }, - "saveLogs": { - "message": "Logs de estado contienen tus direcciones publicas y transacciones enviadas" - }, "saveSeedAsFile": { "message": "Guardar la semilla como archivo" }, @@ -794,10 +779,7 @@ "unknownNetworkId": { "message": "ID (identidad) de Red desconocida" }, - "up": { - "message": "arriba" - }, - "urlErrorMsg": { + "uriErrorMsg": { "message": "URI necesita el prefijo HTTP/HTTPS apropiado" }, "usaOnly": { From 7e614ec6dbb33837fad505c9629ba90b11b10f70 Mon Sep 17 00:00:00 2001 From: Herman Junge Date: Tue, 20 Mar 2018 19:49:10 -0300 Subject: [PATCH 16/30] all 286 english strings were found in your locale --- app/_locales/es/messages.json | 66 +++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 980365347..390a93f2c 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -37,6 +37,9 @@ "message": "MetaMask", "description": "El nombre de la aplicación" }, + "approved": { + "message": "Aprobado" + }, "attemptingConnect": { "message": "Intentando conectar a la Blockchain" }, @@ -98,12 +101,30 @@ "confirmContract": { "message": "Confirmar contrato" }, + "confirmed": { + "message": "Confirmado" + }, "confirmPassword": { "message": "Confirmar contraseña" }, "confirmTransaction": { "message": "Confirmar transacción " }, + "connectingToMainnet": { + "message": "Conectando a la Red Principal de Ethereum (Main Net)" + }, + "connectingToRopsten": { + "message": "Conectando a la Red de Test Ropsten" + }, + "connectingToKovan": { + "message": "Conectando a la Red de Test Kovan" + }, + "connectingToRinkeby": { + "message": "Conectando a la Red de Test Rinkeby" + }, + "connectingToUnknown": { + "message": "Conectando a una red desconocida" + }, "continue": { "message": "Continuar" }, @@ -229,6 +250,9 @@ "downloadStatelogs": { "message": "Descargar logs de estados" }, + "dropped": { + "message": "Caído" + }, "edit": { "message": "Editar" }, @@ -419,6 +443,9 @@ "limit": { "message": "Límite" }, + "links": { + "message": "Enlaces" + }, "loading": { "message": "Cargando..." }, @@ -443,6 +470,9 @@ "mainnet": { "message": "Red principal de Ethereum (MainNet)" }, + "max": { + "message": "Max" + }, "message": { "message": "Mensaje" }, @@ -488,6 +518,9 @@ "newPassword": { "message": "Nueva contraseña (mínimo [8] caracteres)" }, + "newPassword8Chars": { + "message": "Nueva contraseña (mínimo [8] caracteres)" + }, "newRPC": { "message": "Nueva URL del RPC" }, @@ -512,12 +545,18 @@ "notStarted": { "message": "Sin iniciar" }, + "ok": { + "message": "Ok" + }, "oldUI": { "message": "Antigua UI" }, "oldUIMessage": { "message": "Regresaste a la antigua UI. Puedes regresar a la nueva UI mediante la opcion en la barra desplegable del menu de arriba a la derecha." }, + "onlySendToEtherAddress": { + "message": "Sólo envía a una dirección de Ethereum" + }, "or": { "message": "o", "description": "opción entre crear o importar una cuenta" @@ -529,6 +568,12 @@ "message": "Contraseña no concide", "description": "en el proceso de creación de contraseña, los dos campos de contraseña no coincidieron" }, + "passwordNotLongEnough": { + "message": "La contraseña no es lo suficientemente larga" + }, + "passwordsDontMatch": { + "message": "Contraseñas no coínciden" + }, "passwordShort": { "message": "Contraseña no es lo suficientemente larga", "description": "in password creation process, the password is not long enough to be secure" @@ -592,6 +637,9 @@ "restoreFromSeed": { "message": "Restaurar desde semilla" }, + "restoreVault": { + "message": "Restaurar Bóveda" + }, "retryWithMoreGas": { "message": "Vuelva a intentar con un precio de Gas más alto aquí" }, @@ -678,6 +726,9 @@ "sign": { "message": "Firmar" }, + "signed": { + "message": "Firmado" + }, "signMessage": { "message": "Firmar Mensaje" }, @@ -690,12 +741,21 @@ "stateLogs": { "message": "Logs de estado" }, + "stateLogsDescription": { + "message": "Los Logs de estado contienen tus direcciones de cuentas públicas y transacciones envíadas" + }, + "stateLogError": { + "message": "Error en la recogida de logs de estado" + }, "status": { "message": "Estado" }, "submit": { "message": "Enviar" }, + "submitted": { + "message": "Enviado" + }, "supportCenter": { "message": "Visita nuestro centro de atención" }, @@ -770,6 +830,9 @@ "unavailable": { "message": "No disponible" }, + "unapproved": { + "message": "No Aprobado" + }, "unknown": { "message": "Desconocido (a)" }, @@ -804,6 +867,9 @@ "visitWebSite": { "message": "Visita nuestro sitio web" }, + "walletSeed": { + "message": "Semilla de la billetera" + }, "warning": { "message": "Advertencia" }, From a69480d78d3a97310c7f39792133003b9bc058cb Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Tue, 20 Mar 2018 20:20:30 -0230 Subject: [PATCH 17/30] Gas inputs can be changed by up and down arrows (#3598) * Up and down arrows can control gas inputs. * input-number.js just uses number type. --- ui/app/components/currency-input.js | 2 ++ ui/app/components/input-number.js | 1 + 2 files changed, 3 insertions(+) diff --git a/ui/app/components/currency-input.js b/ui/app/components/currency-input.js index 940238fa5..ece3eb43d 100644 --- a/ui/app/components/currency-input.js +++ b/ui/app/components/currency-input.js @@ -91,6 +91,7 @@ CurrencyInput.prototype.render = function () { placeholder, readOnly, inputRef, + type, } = this.props const { emptyState, focused } = this.state @@ -99,6 +100,7 @@ CurrencyInput.prototype.render = function () { const valueToRender = this.getValueToRender() return h('input', { className, + type, value: emptyState ? '' : valueToRender, placeholder: focused ? '' : placeholder, size: valueToRender.length * inputSizeMultiplier, diff --git a/ui/app/components/input-number.js b/ui/app/components/input-number.js index fd8c5c309..5600e35ee 100644 --- a/ui/app/components/input-number.js +++ b/ui/app/components/input-number.js @@ -55,6 +55,7 @@ InputNumber.prototype.render = function () { className: 'customize-gas-input', value, placeholder, + type: 'number', onInputChange: newValue => { this.setValue(newValue) }, From 89acc955fade3e42d33948119cb877a46dc001a2 Mon Sep 17 00:00:00 2001 From: Herman Junge Date: Tue, 20 Mar 2018 20:08:09 -0300 Subject: [PATCH 18/30] last pass (for now) --- app/_locales/es/messages.json | 106 +++++++++++++++++----------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 390a93f2c..aa2701c2c 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -15,7 +15,7 @@ "message": "Agregar token personalizados" }, "addToken": { - "message": "Agregar Token" + "message": "Agregar token" }, "addTokens": { "message": "Agregar tokens" @@ -30,7 +30,7 @@ "message": "Cantidad + Gas" }, "appDescription": { - "message": "Extensión del explorador usar Ethereum", + "message": "Extensión del navegador para Ethereum", "description": "La descripción de la aplicación" }, "appName": { @@ -84,13 +84,13 @@ "message": "Comprar en Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase es la manera más popular en el mundo para comprar y vender bitcoin, ethereum y litecoin" + "message": "Coinbase es la forma global más popular para comprar y vender bitcoin, ethereum y litecoin" }, "cancel": { "message": "Cancelar" }, "classicInterface": { - "message": "Usar interfaz clasica " + "message": "Usar interfaz clásica " }, "clickCopy": { "message": "Click para copiar" @@ -108,19 +108,19 @@ "message": "Confirmar contraseña" }, "confirmTransaction": { - "message": "Confirmar transacción " + "message": "Confirmar transacción" }, "connectingToMainnet": { - "message": "Conectando a la Red Principal de Ethereum (Main Net)" + "message": "Conectando a la red principal de Ethereum (Main Net)" }, "connectingToRopsten": { - "message": "Conectando a la Red de Test Ropsten" + "message": "Conectando a la red de test Ropsten" }, "connectingToKovan": { - "message": "Conectando a la Red de Test Kovan" + "message": "Conectando a la red de test Kovan" }, "connectingToRinkeby": { - "message": "Conectando a la Red de Test Rinkeby" + "message": "Conectando a la red de test Rinkeby" }, "connectingToUnknown": { "message": "Conectando a una red desconocida" @@ -132,7 +132,7 @@ "message": "Continuar a Coinbase" }, "contractDeployment": { - "message": "Deployar contrato" + "message": "Desplegar (Deploy) contrato" }, "conversionProgress": { "message": "Conversión en progreso" @@ -215,7 +215,7 @@ "description": "Informa al usuario que moneda ha elegido para depositar en shapeshift" }, "depositEth": { - "message": "Depositar Eth" + "message": "Depositar Ether" }, "depositEther": { "message": "Depositar Ether" @@ -230,25 +230,25 @@ "message": "Depositar con ShapeShift" }, "depositShapeShiftExplainer": { - "message": "Si tu tienes otras criptomonedas, puedes intercambiar y depositar Ether directamente en tu billetera de MetaMask. No necesitas tener una cuenta." + "message": "Si tu tienes otras criptomonedas, puedes intercambiar y depositar Ether directamente en tu billetera de MetaMask. No necesitas tener una cuenta" }, "details": { "message": "Detalles" }, "directDeposit": { - "message": "Deposito directo" + "message": "Depósito directo" }, "directDepositEther": { "message": "Depositar Ether directamente" }, "directDepositEtherExplainer": { - "message": "Si tu tienes algo de Ether, la forma rapida para tener Ether en tu nueva billetera es depositando directamente" + "message": "Si tu tienes algo de Ether, la forma rápida para tener Ether en tu nueva billetera es depositando directamente" }, "done": { "message": "Completo" }, "downloadStatelogs": { - "message": "Descargar logs de estados" + "message": "Descargar logs de estado" }, "dropped": { "message": "Caído" @@ -288,7 +288,7 @@ }, "fiat": { "message": "FIAT", - "description": "Exchange type" + "description": "Tipo de cambio" }, "fileImportFail": { "message": "No funciona importar el archivo? Haz Click Aquí!", @@ -349,7 +349,7 @@ "description": "helper para ingresar hex como entrada decimal" }, "here": { - "message": "Aqui", + "message": "Aquí", "description": "como en -haz click aquí- para más información" }, "hereList": { @@ -375,7 +375,7 @@ "description": "Botón para importar una cuenta desde un archivo seleccionado" }, "importAccount": { - "message": "Importar Cuenta" + "message": "Importar cuenta" }, "importAnAccount": { "message": "Importar una cuenta" @@ -385,10 +385,10 @@ }, "imported": { "message": "Importado", - "description": "estado que muestra que una cuenta ha sido completamente cargada en el llavero" + "description": "Estado que muestra que una cuenta ha sido completamente cargada en el llavero" }, "importAccountMsg": { - "message": "Cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas. " + "message": "Cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas." }, "info": { "message": "Información" @@ -403,13 +403,13 @@ "message": "Tokens insuficientes" }, "invalidAddress": { - "message": "Dirección Inválida" + "message": "Dirección inválida" }, "invalidAddressRecipient": { - "message": "Dirección del recipiente invalida" + "message": "Dirección del destinatario invalida" }, "invalidGasParams": { - "message": "Parametros de Gas Inválidos" + "message": "Parametros de gas inválidos" }, "invalidInput": { "message": "Entrada inválida" @@ -418,14 +418,14 @@ "message": "Invalida URL del RPC" }, "invalidRequest": { - "message": "Peticion inválida" + "message": "Petición inválida" }, "jsonFail": { "message": "Algo malo pasó. Asegurate que tu JSON tiene el formato correcto" }, "jsonFile": { "message": "Archivo JSON", - "description": "formato para importar una cuenta" + "description": "Formato para importar una cuenta" }, "knowledgeDataBase": { "message": "Visita nuestra base de conocimiento" @@ -435,7 +435,7 @@ }, "lessThanMax": { "message": "Debe ser menor o igual a $1", - "description": "helper para ingresar hex como decimal" + "description": "Helper para ingresar hex como decimal" }, "likeToAddTokens": { "message": "¿Te gustaría agregar estos tokens?" @@ -450,7 +450,7 @@ "message": "Cargando..." }, "loadingTokens": { - "message": "Cargando Tokens..." + "message": "Cargando tokens..." }, "localhost": { "message": "Localhost 8545" @@ -459,16 +459,16 @@ "message": "Ingresar" }, "logout": { - "message": "Cerrar sesion" + "message": "Cerrar sesión" }, "loose": { - "message": "Loose" + "message": "Suelto" }, "loweCaseWords": { "message": "las frases semilla sólo pueden tener minúsculas" }, "mainnet": { - "message": "Red principal de Ethereum (MainNet)" + "message": "Red principal de Ethereum (Main Net)" }, "max": { "message": "Max" @@ -480,7 +480,7 @@ "message": "Metamask es una identidad segura en Ethereum" }, "min": { - "message": "Minimo" + "message": "Mínimo" }, "mustSelectOne": { "message": "Debe seleccionar al menos un (1) token" @@ -549,10 +549,10 @@ "message": "Ok" }, "oldUI": { - "message": "Antigua UI" + "message": "Antigua UI (Interfaz de Usuario)" }, "oldUIMessage": { - "message": "Regresaste a la antigua UI. Puedes regresar a la nueva UI mediante la opcion en la barra desplegable del menu de arriba a la derecha." + "message": "Regresaste a la antigua UI (Interfaz de Usuario). Puedes regresar a la nueva UI mediante la opcion en la barra desplegable del menu de arriba a la derecha." }, "onlySendToEtherAddress": { "message": "Sólo envía a una dirección de Ethereum" @@ -565,25 +565,25 @@ "message": "Asegurate que tu contraseña es correcta" }, "passwordMismatch": { - "message": "Contraseña no concide", - "description": "en el proceso de creación de contraseña, los dos campos de contraseña no coincidieron" + "message": "Contraseña no coincide", + "description": "En el proceso de creación de contraseña, los dos campos de contraseña no coincidieron" }, "passwordNotLongEnough": { "message": "La contraseña no es lo suficientemente larga" }, "passwordsDontMatch": { - "message": "Contraseñas no coínciden" + "message": "Contraseñas no coinciden" }, "passwordShort": { "message": "Contraseña no es lo suficientemente larga", - "description": "in password creation process, the password is not long enough to be secure" + "description": "En el proceso de creación de contraseña, esta no es lo suficientemente larga para ser segura" }, "pastePrivateKey": { "message": "Pega tu llave privada aqui", "description": "Para importar una cuenta desde una llave privada" }, "pasteSeed": { - "message": "Pegue su frase semilla aquí!" + "message": "Pega tu frase semilla aquí!" }, "personalAddressDetected": { "message": "Dirección personal detectada. Ingresa la dirección del contrato del token" @@ -596,10 +596,10 @@ }, "privateKey": { "message": "Llave privada", - "description": "select this type of file to use to import an account" + "description": "Selecciona este tupo de archivo para importar una cuenta" }, "privateKeyWarning": { - "message": "Advertencia: Nunca revele esta clave. Cualquier persona con sus claves privadas puede robar cualquier activo retenido en su cuenta." + "message": "Advertencia: NUNCA reveles esta clave. Cualquier persona con tus claves privadas puede robar los activos retenidos en tu cuenta" }, "privateNetwork": { "message": "Red Privada" @@ -611,10 +611,10 @@ "message": "Leer más aquí" }, "readMore2": { - "message": "Leer más." + "message": "Leer más" }, "readdToken": { - "message": "Puede volver a agregar este token en el futuro yendo a 'Agregar token' en el menú de opciones de su cuenta.." + "message": "Puede volver a agregar este token en el futuro yendo a 'Agregar token' en el menú de opciones de tu cuenta" }, "receive": { "message": "Recibir" @@ -623,7 +623,7 @@ "message": "Dirección del receptor" }, "refundAddress": { - "message": "Su dirección de reembolso" + "message": "Tu dirección de reembolso" }, "rejected": { "message": "Rechazado" @@ -676,7 +676,7 @@ "message": "Buscar" }, "secretPhrase": { - "message": "Ingresa tu frase de 12 palabras para restaurar tu bóveda" + "message": "Ingresa tu frase de doce (12) palabras para restaurar tu bóveda" }, "seedPhraseReq": { "message": "las frases semilla tienen doce (12) palabras de largo" @@ -697,7 +697,7 @@ "message": "Enviar" }, "sendETH": { - "message": "Enviar ETH" + "message": "Enviar Ether" }, "sendTokens": { "message": "Enviar Tokens" @@ -769,7 +769,7 @@ "message": "Terminos de Uso" }, "testFaucet": { - "message": "Testear Faucet" + "message": "Probar Faucet" }, "to": { "message": "Para:" @@ -785,7 +785,7 @@ "message": "El token esta actualmente agregado" }, "tokenBalance": { - "message": "Tu balance de Tokens es:" + "message": "Tu balance de tokens es:" }, "tokenSelection": { "message": "Busca tokens o selecciónalo de nuestra lista de tokens populares" @@ -794,7 +794,7 @@ "message": "Símbolo del token" }, "tokenWarning1": { - "message": "Mantenga un registro de los tokens que ha comprado con su cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." + "message": "Manten un registro de los tokens que has comprado con tu cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." }, "total": { "message": "Total" @@ -812,11 +812,11 @@ "message": "Transferencias" }, "troubleTokenBalances": { - "message": "Tuvimos problemas para cargar sus balances de tokens. Puedes verlos ", - "description": "Followed by a link (here) to view token balances" + "message": "Tuvimos problemas para cargar tus saldos de tokens. Puedes verlos ", + "description": "Seguidos por un enlace (aquí) para ver los saldos de token" }, "twelveWords": { - "message": "Estas 12 palabras son la única forma de restablecer sus cuentas de MetaMask. \nGuardalas en un lugar seguro y secreto." + "message": "Estas 12 palabras son la única forma de restablecer tus cuentas de MetaMask. \nGuardalas en un lugar seguro y secreto." }, "typePassword": { "message": "Escribe tu contraseña" @@ -847,7 +847,7 @@ }, "usaOnly": { "message": "Sólo USA (Estados Unidos)", - "description": "El uso de este exchange (casa de cambio) estaá limitado a las personas dentro de los Estados Unidos de America" + "description": "El uso de este exchange (casa de cambio) está limitado a las personas dentro de los Estados Unidos de America" }, "useOldUI": { "message": "Usar UI antigua" @@ -883,6 +883,6 @@ "message": "Usted está firmando" }, "yourSigRequested": { - "message": "Tu firma ya fue solicidada" + "message": "Tu firma ya fue solicitada" } } From ac34c8f4800562f9ad1d6b6332a05f8d943b483b Mon Sep 17 00:00:00 2001 From: Herman Junge Date: Tue, 20 Mar 2018 20:43:20 -0300 Subject: [PATCH 19/30] Nuke the es_419 locale --- app/_locales/es_419/messages.json | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 app/_locales/es_419/messages.json diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json deleted file mode 100644 index 78fc64dbf..000000000 --- a/app/_locales/es_419/messages.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "appName": { - "message": "MetaMask", - "description": "The name of the application" - }, - "appDescription": { - "message": "Administración de identidad en Ethereum", - "description": "The description of the application" - } -} From 759b65ddf95bf0063c843c1dc44f50f478ff6604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 21 Mar 2018 10:51:44 +0000 Subject: [PATCH 20/30] Minor adjustments to Spanish translation --- app/_locales/es/messages.json | 106 +++++++++++++++++----------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index aa2701c2c..fa28b09da 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -75,7 +75,7 @@ "message": "Pedir prestado con Dharma (Beta)" }, "builtInCalifornia": { - "message": "Metamask fue diseñado y construido en California " + "message": "Metamask fue diseñado y construido en California" }, "buy": { "message": "Comprar" @@ -84,13 +84,13 @@ "message": "Comprar en Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase es la forma global más popular para comprar y vender bitcoin, ethereum y litecoin" + "message": "Coinbase es la plataforma global más popular para comprar y vender Bitcoin, Ethereum y Litecoin" }, "cancel": { "message": "Cancelar" }, "classicInterface": { - "message": "Usar interfaz clásica " + "message": "Usar interfaz clásica" }, "clickCopy": { "message": "Click para copiar" @@ -144,7 +144,7 @@ "message": "Copiado al portapapeles" }, "copiedExclamation": { - "message": "Copiado!" + "message": "¡Copiado!" }, "copiedSafe": { "message": "Ya lo guardé en un lugar seguro" @@ -156,7 +156,7 @@ "message": " Copiar " }, "copyPrivateKey": { - "message": "Esta es tu llave privada (Click para copiar)" + "message": "Ésta es tu llave privada (haz click para copiar)" }, "copyToClipboard": { "message": "Copiar al portapapeles" @@ -165,17 +165,17 @@ "message": "Crear" }, "createAccount": { - "message": "Crear Cuenta" + "message": "Crear cuenta" }, "createDen": { "message": "Crear" }, "crypto": { "message": "Crypto", - "description": "Tipo de Cambio (criptomonedas)" + "description": "Tipo de cambio (criptomonedas)" }, "currentConversion": { - "message": "Conversión Actual" + "message": "Conversión actual" }, "currentNetwork": { "message": "Red actual" @@ -184,10 +184,10 @@ "message": "RPC actual" }, "customGas": { - "message": "Personalizar Gas" + "message": "Personalizar gas" }, "customRPC": { - "message": "RPC Personalizado" + "message": "RPC personalizado" }, "customize": { "message": "Personalizar" @@ -202,7 +202,7 @@ "message": "La red por defecto para las transacciones de Ether es MainNet (red principal)" }, "denExplainer": { - "message": "Tu DEN es tu contraseña encriptada guardada dentro de MetaMask" + "message": "El DEN es tu contraseña encriptada almacenada dentro de MetaMask" }, "deposit": { "message": "Depositar" @@ -221,7 +221,7 @@ "message": "Depositar Ether" }, "depositFiat": { - "message": "Depositar con Fiat (divisa nacional)" + "message": "Depositar con fiat (divisa nacional)" }, "depositFromAccount": { "message": "Depositar con otra cuenta" @@ -230,7 +230,7 @@ "message": "Depositar con ShapeShift" }, "depositShapeShiftExplainer": { - "message": "Si tu tienes otras criptomonedas, puedes intercambiar y depositar Ether directamente en tu billetera de MetaMask. No necesitas tener una cuenta" + "message": "Si posees otras criptomonedas, puedes intercambiar y depositar Ether directamente en tu billetera de MetaMask. No necesitas tener una cuenta." }, "details": { "message": "Detalles" @@ -242,7 +242,7 @@ "message": "Depositar Ether directamente" }, "directDepositEtherExplainer": { - "message": "Si tu tienes algo de Ether, la forma rápida para tener Ether en tu nueva billetera es depositando directamente" + "message": "Si posees Ether, la forma más rápida de transferirlo a tu nueva billetera es depositándolo directamente" }, "done": { "message": "Completo" @@ -260,7 +260,7 @@ "message": "Editar el nombre de la cuenta" }, "emailUs": { - "message": "Envíanos un correo!" + "message": "¡Envíanos un correo!" }, "encryptNewDen": { "message": "Encriptar tu nuevo DEN" @@ -291,7 +291,7 @@ "description": "Tipo de cambio" }, "fileImportFail": { - "message": "No funciona importar el archivo? Haz Click Aquí!", + "message": "¿La importación no funcionó? ¡Haz click aquí!", "description": "Ayuda al usuario a importar su cuenta desde un archivo JSON" }, "followTwitter": { @@ -320,7 +320,7 @@ "message": "Calculamos el límite de gas sugerido en función de las tasas de éxito de la red" }, "gasLimitRequired": { - "message": "Límite de Gas requerido" + "message": "Límite de gas requerido" }, "gasLimitTooLow": { "message": "El límite de gas debe ser de al menos 21000" @@ -353,22 +353,22 @@ "description": "como en -haz click aquí- para más información" }, "hereList": { - "message": "Aquí está una lista!!!" + "message": "¡¡¡Aquí está una lista!!!" }, "hide": { "message": "Ocultar" }, "hideToken": { - "message": "Ocultar Token" + "message": "Ocultar token" }, "hideTokenPrompt": { - "message": "Ocultar Token?" + "message": "¿Ocultar token?" }, "holdEther": { "message": "Te permite mantener tus ether y tokens, así como puente para aplicaciones descentralizadas" }, "howToDeposit": { - "message": "Cómo te gustaria depositar Ether?" + "message": "¿Cómo te gustaria depositar Ether?" }, "import": { "message": "Importar", @@ -388,13 +388,13 @@ "description": "Estado que muestra que una cuenta ha sido completamente cargada en el llavero" }, "importAccountMsg": { - "message": "Cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas." + "message": "Las cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas." }, "info": { "message": "Información" }, "infoHelp": { - "message": "Informacion y Ayuda" + "message": "Informacion y ayuda" }, "insufficientFunds": { "message": "Fondos insuficientes" @@ -421,7 +421,7 @@ "message": "Petición inválida" }, "jsonFail": { - "message": "Algo malo pasó. Asegurate que tu JSON tiene el formato correcto" + "message": "Algo falló. Asegúrate que tu JSON tiene el formato correcto" }, "jsonFile": { "message": "Archivo JSON", @@ -477,7 +477,7 @@ "message": "Mensaje" }, "metamaskDescription": { - "message": "Metamask es una identidad segura en Ethereum" + "message": "MetaMask es una identidad segura en Ethereum" }, "min": { "message": "Mínimo" @@ -489,7 +489,7 @@ "message": "Mis cuentas" }, "needEtherInWallet": { - "message": "Para interactuar con una aplicación descentralizada usando MetaMask, vas a necesitar tener Ether en tu billetera" + "message": "Para interactuar con una aplicación descentralizada usando MetaMask, necesitas tener Ether en tu billetera" }, "needImportFile": { "message": "Debes seleccionar un archivo para importar", @@ -565,17 +565,17 @@ "message": "Asegurate que tu contraseña es correcta" }, "passwordMismatch": { - "message": "Contraseña no coincide", + "message": "La contraseña no coincide", "description": "En el proceso de creación de contraseña, los dos campos de contraseña no coincidieron" }, "passwordNotLongEnough": { "message": "La contraseña no es lo suficientemente larga" }, "passwordsDontMatch": { - "message": "Contraseñas no coinciden" + "message": "Las contraseñas no coinciden" }, "passwordShort": { - "message": "Contraseña no es lo suficientemente larga", + "message": "La contraseña no es lo suficientemente larga", "description": "En el proceso de creación de contraseña, esta no es lo suficientemente larga para ser segura" }, "pastePrivateKey": { @@ -583,13 +583,13 @@ "description": "Para importar una cuenta desde una llave privada" }, "pasteSeed": { - "message": "Pega tu frase semilla aquí!" + "message": "¡Pega tu frase semilla aquí!" }, "personalAddressDetected": { "message": "Dirección personal detectada. Ingresa la dirección del contrato del token" }, "pleaseReviewTransaction": { - "message": "Por favor revisa tu transaccion" + "message": "Por favor, revisa tu transaccion" }, "privacyMsg": { "message": "Política de privacidad" @@ -602,7 +602,7 @@ "message": "Advertencia: NUNCA reveles esta clave. Cualquier persona con tus claves privadas puede robar los activos retenidos en tu cuenta" }, "privateNetwork": { - "message": "Red Privada" + "message": "Red privada" }, "qrCode": { "message": "Mostrar codigo QR" @@ -614,7 +614,7 @@ "message": "Leer más" }, "readdToken": { - "message": "Puede volver a agregar este token en el futuro yendo a 'Agregar token' en el menú de opciones de tu cuenta" + "message": "Puedes volver a agregar este token en el futuro pinchando sobre 'Agregar token' en el menú de opciones de tu cuenta" }, "receive": { "message": "Recibir" @@ -641,13 +641,13 @@ "message": "Restaurar Bóveda" }, "retryWithMoreGas": { - "message": "Vuelva a intentar con un precio de Gas más alto aquí" + "message": "Vuelva a intentar con un precio de gas más alto aquí" }, "revealSeedWords": { "message": "Revelar palabras de semilla" }, "revealSeedWordsWarning": { - "message": "No recuperes tu semilla en un lugar publico! Esas palabras pueden ser usadas para robarte todas tus cuentas" + "message": "¡No recuperes tu semilla en un lugar pública! Esas palabras pueden ser usadas para robarte todas tus cuentas" }, "revert": { "message": "Revertir" @@ -659,7 +659,7 @@ "message": "Red privada Ropsten" }, "sampleAccountName": { - "message": "Ej. Mi nueva cuenta", + "message": "P.ej. Mi nueva cuenta", "description": "Ayuda al usuario a entender el concepto de agregar un nombre, leíble por humanos, a su cuenta" }, "save": { @@ -700,10 +700,10 @@ "message": "Enviar Ether" }, "sendTokens": { - "message": "Enviar Tokens" + "message": "Enviar tokens" }, "sendTokensAnywhere": { - "message": "Enviar Tokens a cualquiera con una cuenta de Ethereum" + "message": "Enviar tokens a cualquiera con una cuenta de Ethereum" }, "settings": { "message": "Configuración" @@ -730,10 +730,10 @@ "message": "Firmado" }, "signMessage": { - "message": "Firmar Mensaje" + "message": "Firmar mensaje" }, "signNotice": { - "message": "Firmar este mensaje puede tener\n efectos secundarios peligrosos. Firma sólo\nmensajes desde sitios a los cuales tú estés dispuesto a confiar completamente tu cuenta.\nEste método peligroso va a ser \nremovido en una version futura." + "message": "Firmar este mensaje puede tener\n efectos secundarios peligrosos. Firma sólo\nmensajes desde sitios a los que estés plenamente dispuesto a confiar tu cuenta.\nEste método peligroso va a ser \neliminado en una version futura." }, "spaceBetween": { "message": "Sólo puede haber un espacio entre las palabras" @@ -742,7 +742,7 @@ "message": "Logs de estado" }, "stateLogsDescription": { - "message": "Los Logs de estado contienen tus direcciones de cuentas públicas y transacciones envíadas" + "message": "Los logs de estado contienen tus direcciones de cuentas públicas y transacciones envíadas" }, "stateLogError": { "message": "Error en la recogida de logs de estado" @@ -763,10 +763,10 @@ "message": "Símbolo debe ser entre 0 y 10 caracteres" }, "takesTooLong": { - "message": "¿Está tomando demasiado?" + "message": "¿Está tardando demasiado?" }, "terms": { - "message": "Terminos de Uso" + "message": "Términos de uso" }, "testFaucet": { "message": "Probar Faucet" @@ -782,7 +782,7 @@ "message": "Dirección del token" }, "tokenAlreadyAdded": { - "message": "El token esta actualmente agregado" + "message": "El token está actualmente agregado" }, "tokenBalance": { "message": "Tu balance de tokens es:" @@ -794,13 +794,13 @@ "message": "Símbolo del token" }, "tokenWarning1": { - "message": "Manten un registro de los tokens que has comprado con tu cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." + "message": "Mantén un registro de los tokens que has comprado con tu cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." }, "total": { "message": "Total" }, "transactionMemo": { - "message": "Memo de transaccion (opcional)" + "message": "Memo de transacción (opcional)" }, "transactionNumber": { "message": "Número de transacción" @@ -816,7 +816,7 @@ "description": "Seguidos por un enlace (aquí) para ver los saldos de token" }, "twelveWords": { - "message": "Estas 12 palabras son la única forma de restablecer tus cuentas de MetaMask. \nGuardalas en un lugar seguro y secreto." + "message": "Estas 12 palabras son la única forma de restablecer tus cuentas de MetaMask. \nGuárdalas en un lugar seguro y secreto." }, "typePassword": { "message": "Escribe tu contraseña" @@ -825,13 +825,13 @@ "message": "Bienvenido a la nueva UI (Beta)" }, "uiWelcomeMessage": { - "message": "Estás usando la nueva UI de MetaMask. Echa un vistazo alrededor, prueba las nuevas características, tales como mandar tokens, y déjanos saber si tienes algún problema" + "message": "Estás usando la nueva UI de MetaMask. Echa un vistazo alrededor, prueba las nuevas características, tales como mandar tokens, y háznos saber si tienes algún problema" }, "unavailable": { "message": "No disponible" }, "unapproved": { - "message": "No Aprobado" + "message": "No aprobado" }, "unknown": { "message": "Desconocido (a)" @@ -840,14 +840,14 @@ "message": "Red privada desconocida" }, "unknownNetworkId": { - "message": "ID (identidad) de Red desconocida" + "message": "ID (identidad) de red desconocida" }, "uriErrorMsg": { - "message": "URI necesita el prefijo HTTP/HTTPS apropiado" + "message": "URI necesita el prefijo HTTP/HTTPS apropiado" }, "usaOnly": { "message": "Sólo USA (Estados Unidos)", - "description": "El uso de este exchange (casa de cambio) está limitado a las personas dentro de los Estados Unidos de America" + "description": "El uso de este exchange (casa de cambio) está limitado a las personas dentro de los Estados Unidos de América" }, "useOldUI": { "message": "Usar UI antigua" @@ -877,7 +877,7 @@ "message": "Bienvenido a Metamask Beta" }, "whatsThis": { - "message": "Qué es esto?" + "message": "¿Qué es esto?" }, "youSign": { "message": "Usted está firmando" From 332a0203ac31bd42415e944b8df4dc062c59da49 Mon Sep 17 00:00:00 2001 From: N1X Date: Wed, 21 Mar 2018 18:33:32 +0000 Subject: [PATCH 21/30] hn _locales : message.json [HINDI] (#3611) adding hn_IN `_locales` --- README.md | 2 - app/_locales/hn/messages.json | 819 ++++++++++++++++++++++++++++++++++ 2 files changed, 819 insertions(+), 2 deletions(-) create mode 100644 app/_locales/hn/messages.json diff --git a/README.md b/README.md index 278357c23..a3bf27709 100644 --- a/README.md +++ b/README.md @@ -76,5 +76,3 @@ To write tests that will be run in the browser using QUnit, add your test files - [How to generate a visualization of this repository's development](./docs/development-visualization.md) [1]: http://www.nomnoml.com/#view/%5B%3Cactor%3Euser%5D%0A%0A%5Bmetamask-ui%7C%0A%20%20%20%5Btools%7C%0A%20%20%20%20%20react%0A%20%20%20%20%20redux%0A%20%20%20%20%20thunk%0A%20%20%20%20%20ethUtils%0A%20%20%20%20%20jazzicon%0A%20%20%20%5D%0A%20%20%20%5Bcomponents%7C%0A%20%20%20%20%20app%0A%20%20%20%20%20account-detail%0A%20%20%20%20%20accounts%0A%20%20%20%20%20locked-screen%0A%20%20%20%20%20restore-vault%0A%20%20%20%20%20identicon%0A%20%20%20%20%20config%0A%20%20%20%20%20info%0A%20%20%20%5D%0A%20%20%20%5Breducers%7C%0A%20%20%20%20%20app%0A%20%20%20%20%20metamask%0A%20%20%20%20%20identities%0A%20%20%20%5D%0A%20%20%20%5Bactions%7C%0A%20%20%20%20%20%5BaccountManager%5D%0A%20%20%20%5D%0A%20%20%20%5Bcomponents%5D%3A-%3E%5Bactions%5D%0A%20%20%20%5Bactions%5D%3A-%3E%5Breducers%5D%0A%20%20%20%5Breducers%5D%3A-%3E%5Bcomponents%5D%0A%5D%0A%0A%5Bweb%20dapp%7C%0A%20%20%5Bui%20code%5D%0A%20%20%5Bweb3%5D%0A%20%20%5Bmetamask-inpage%5D%0A%20%20%0A%20%20%5B%3Cactor%3Eui%20developer%5D%0A%20%20%5Bui%20developer%5D-%3E%5Bui%20code%5D%0A%20%20%5Bui%20code%5D%3C-%3E%5Bweb3%5D%0A%20%20%5Bweb3%5D%3C-%3E%5Bmetamask-inpage%5D%0A%5D%0A%0A%5Bmetamask-background%7C%0A%20%20%5Bprovider-engine%5D%0A%20%20%5Bhooked%20wallet%20subprovider%5D%0A%20%20%5Bid%20store%5D%0A%20%20%0A%20%20%5Bprovider-engine%5D%3C-%3E%5Bhooked%20wallet%20subprovider%5D%0A%20%20%5Bhooked%20wallet%20subprovider%5D%3C-%3E%5Bid%20store%5D%0A%20%20%5Bconfig%20manager%7C%0A%20%20%20%20%5Brpc%20configuration%5D%0A%20%20%20%20%5Bencrypted%20keys%5D%0A%20%20%20%20%5Bwallet%20nicknames%5D%0A%20%20%5D%0A%20%20%0A%20%20%5Bprovider-engine%5D%3C-%5Bconfig%20manager%5D%0A%20%20%5Bid%20store%5D%3C-%3E%5Bconfig%20manager%5D%0A%5D%0A%0A%5Buser%5D%3C-%3E%5Bmetamask-ui%5D%0A%0A%5Buser%5D%3C%3A--%3A%3E%5Bweb%20dapp%5D%0A%0A%5Bmetamask-contentscript%7C%0A%20%20%5Bplugin%20restart%20detector%5D%0A%20%20%5Brpc%20passthrough%5D%0A%5D%0A%0A%5Brpc%20%7C%0A%20%20%5Bethereum%20blockchain%20%7C%0A%20%20%20%20%5Bcontracts%5D%0A%20%20%20%20%5Baccounts%5D%0A%20%20%5D%0A%5D%0A%0A%5Bweb%20dapp%5D%3C%3A--%3A%3E%5Bmetamask-contentscript%5D%0A%5Bmetamask-contentscript%5D%3C-%3E%5Bmetamask-background%5D%0A%5Bmetamask-background%5D%3C-%3E%5Bmetamask-ui%5D%0A%5Bmetamask-background%5D%3C-%3E%5Brpc%5D%0A - - diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json new file mode 100644 index 000000000..3703faa13 --- /dev/null +++ b/app/_locales/hn/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": "आवेदन का विवरण" + }, + "appName": { + "message": "मेटामास्क/MetaMask", + "description": "एप्लिकेशन का नाम" + }, + "attemptingConnect": { + "message": "ब्लॉकचैन से कनेक्ट करने का प्रयास करना होगा।सब्र करे।" + }, + "attributions": { + "message": "एट्रिब्यूशन" + }, + "available": { + "message": "एट्रिब्यूशन उपलब्ध ह्ने" + }, + "back": { + "message": "वापस" + }, + "balance": { + "message": "उपलब्ध बैलेंस।" + }, + "balances": { + "message": "ापके उपलब्ध बैलेंस" + }, + "balanceIsInsufficientGas": { + "message": "वर्तमान गैस कुल के लिए अपर्याप्त शेष" + }, + "beta": { + "message": "BETA/बीटा" + }, + "betweenMinAndMax": { + "message": "$1 के बराबर या ज्यदा या, $2 के बराबर या कम होना चाहिए।", + "description": "हेक्स इनपुट के लिए दशमलव इनपुट के रूप में सहायक" + }, + "blockiesIdenticon": { + "message": "ब्लॉकीज पहचान का उपयोग करें" + }, + "borrowDharma": { + "message": "धर्मा (बीटा) से / के साथ उधार लें" + }, + "builtInCalifornia": { + "message": "मेटामास्क कैलिफ़ोर्निया में डिज़ाइन और बनाया गया है।" + }, + "buy": { + "message": "खरीदें" + }, + "buyCoinbase": { + "message": "कॉनबेस पर खरीदें" + }, + "buyCoinbaseExplainer": { + "message": "बिल्टकोइन, एथरेम और लाइटकोइन खरीदने और बेचने के लिए दुनिया का सबसे लोकप्रिय तरीका Coinbase है।" + }, + "cancel": { + "message": "रद्द करें" + }, + "classicInterface": { + "message": "क्लासिक इंटरफ़ेस का उपयोग क" + }, + "clickCopy": { + "message": "कॉपी करने के लिए क्लिक करें" + }, + "confirm": { + "message": "पुष्टि करें" + }, + "confirmContract": { + "message": "अनुबंध की पुष्टि करें" + }, + "confirmPassword": { + "message": "पासवर्ड की पुष्टि करें" + }, + "confirmTransaction": { + "message": "लेनदेन की पुष्टि करें" + }, + "continue": { + "message": "जारी रखें" + }, + "continueToCoinbase": { + "message": "कॉ्ोनबेस को ब्हेजना जारी रखें" + }, + "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": "एक्सचेंज टाइप (क्रिप्टोक्यूचरस)" + }, + "currentConversion": { + "message": "वर्तमान रूपांतरण" + }, + "currentNetwork": { + "message": "वर्तमान नेटवर्क" + }, + "customGas": { + "message": "अनुकूलित करें गैस" + }, + "customize": { + "message": "अनुकूलित करें" + }, + "customRPC": { + "message": "कस्टम RPC" + }, + "decimalsMustZerotoTen": { + "message": "दशमलव कम से कम 0 होनी चाहिए, और 36 से अधिक नहीं होनी चाहिए।" + }, + "decimal": { + "message": "दशमलव परिशुद्धता" + }, + "defaultNetwork": { + "message": "ईथर लेनदेन के लिए डिफ़ॉल्ट नेटवर्क मुख्य नेट है।" + }, + "denExplainer": { + "message": "आपका डेन मेटामास्क के भीतर आपका पासवर्ड-एन्क्रिप्टेड स्टोरेज है।" + }, + "deposit": { + "message": "जमा" + }, + "depositBTC": { + "message": "नीचे दिए गए पते पर अपना बीटीसी जमा करें:" + }, + "depositCoin": { + "message": "नीचे दिए गए पते पर अपना $1 जमा करें", + "description": "उपयोगकर्ता को बताता है कि उन्होंने सिक्का के साथ जमा करने के लिए किस सिक्का का चयन किया है" + }, + "depositEth": { + "message": "Eth जमाआर्थ" + }, + "depositEther": { + "message": "जमा - Ether" + }, + "depositFiat": { + "message": "फिएट के साथ जमा हो" + }, + "depositFromAccount": { + "message": "दूसरे खाते से जमा करें" + }, + "depositShapeShift": { + "message": "शेपशिप के साथ जमा करें" + }, + "depositShapeShiftExplainer": { + "message": "यदि आप अन्य क्रिप्टोकाउंटरज रखते हैं, तो आप सीधे मेटामास्क वॉलेट में ईथर को व्यापार और जमा कर सकते हैं। कोई खाता आवश्यक नहीं है।" + }, + "details": { + "message": "संदेश विवरण" + }, + "directDeposit": { + "message": "प्रत्यक्ष जमा" + }, + "directDepositEther": { + "message": "सीधे ईथर जमा करें" + }, + "directDepositEtherExplainer": { + "message": "यदि आपके पास पहले से कुछ ईथर है, तो सीधे जमा द्वारा अपने नए बटुए में ईथर प्राप्त करने का तेज़ तरीका है।" + }, + "done": { + "message": "संपन्न" + }, + "downloadStatelogs": { + "message": "राज्य लॉग डाउनलोड करें" + }, + "edit": { + "message": "संपादित करें" + }, + "editAccountName": { + "message": "खाता नाम संपादित करें" + }, + "emailUs": { + "message": "हमें ईमेल करें!" + }, + "encryptNewDen": { + "message": "अपना नया डेन एन्क्रिप्ट करें" + }, + "enterPassword": { + "message": "पासवर्ड दर्ज करें" + }, + "enterPasswordConfirm": { + "message": "पुष्टि करने के लिए अपना पासवर्ड दर्ज करें" + }, + "etherscanView": { + "message": "ईथरस्कैन पर खाता देखें" + }, + "exchangeRate": { + "message": "विनिमय दरै" + }, + "exportPrivateKey": { + "message": "निजी कुंजी निर्यात करें" + }, + "exportPrivateKeyWarning": { + "message": "अपने जोखिम पर निजी कुंजी निर्यात करें।" + }, + "failed": { + "message": "विफल" + }, + "fiat": { + "message": "FIAT एक्सचेंज टाइप", + "description": "एक्सचेंज FIAT टाइप" + }, + "fileImportFail": { + "message": "फ़ाइल आयात काम नहीं कर रहा है? यहां क्लिक करें!", + "description": "यूजर को अपने खाते को जे.एस.ौ.एन फ़ाइल से आयात करने में मदद करता है" + }, + "followTwitter": { + "message": "हमें ट्विटर पर अनुसरण करें" + }, + "from": { + "message": "की तरफ से - संदेश" + }, + "fromToSame": { + "message": "से और पता करने के लिए समान नहीं हो सकता" + }, + "fromShapeShift": { + "message": "सेशशशफ्ट का" + }, + "gas": { + "message": "गैस की लागत", + "description": "गैस की लागत का संक्षिप्त संकेत" + }, + "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": "ईथर नल के लिए नेटवर्क नाम प्रदर्शित करता है" + }, + "greaterThanMin": { + "message": "$1 के बराबर या बराबर होना चाहिए।", + "description": "हेक्स इनपुट के लिए दशमलव इनपुट के रूप में सहायक" + }, + "here": { + "message": "यहां", + "description": "अधिक जानकारी के लिए यहां क्लिक करें- (परेशानी के साथ जाता है टोकनबैलेंस) (troubleTokenBalances)" + }, + "hereList": { + "message": "यहां एक सूची है !!!!" + }, + "hide": { + "message": "छुपाएं" + }, + "hideToken": { + "message": "टोकन छिपाएं" + }, + "hideTokenPrompt": { + "message": "टोकन छिपाएंn?" + }, + "howToDeposit": { + "message": "आप ईथर जमा कैसे करना चाहेंगे?" + }, + "holdEther": { + "message": "यह आपको आकाश और टोकन रखने की अनुमति देता है, और विकेंद्रीकृत अनुप्रयोगों के लिए आपके पुल के रूप में कार्य करता है।" + }, + "import": { + "message": "आयात", + "description": "एक चयनित फ़ाइल से एक खाता आयात करने के लिए बटन " + }, + "importAccount": { + "message": "खाता आयात" + }, + "importAccountMsg": { + "message": "आयात किए गए खाते आपके मूल रूप से बनाए गए मेटामास्क अकाउंट सीडफ्रेज से संबद्ध नहीं होंगे। आयात किए गए खातों के बारे में और जानें" + }, + "importAnAccount": { + "message": "खाता आयात करैॉ" + }, + "importDen": { + "message": "मौजूदा डेन आयात करें - DEN" + }, + "imported": { + "message": "आयातित", + "description": "यह स्थिति दिखाती है कि कोई खाता पूरी तरह से कीरिंग में लोड हो चुका है" + }, + "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": "एक खाता आयात करने के लिए प्रारूप" + }, + "kovan": { + "message": "कोवान टेस्ट नेटवर्क" + }, + "knowledgeDataBase": { + "message": "हमारे नॉलेज बेस पर जाएं" + }, + "lessThanMax": { + "message": "$1 से कम या बराबर होना चाहिए।", + "description": "हेक्स इनपुट के लिए दशमलव इनपुट के रूप में सहायक" + }, + "likeToAddTokens": { + "message": "क्या आप इन टोकनों को जोड़ना चाहते हैं?" + }, + "limit": { + "message": "सीमा" + }, + "loading": { + "message": "लोड हो रहा है ....." + }, + "loadingTokens": { + "message": "टोकन लोड हो रहा है ....." + }, + "localhost": { + "message": "स्थानीयहोस्ट 8545" + }, + "login": { + "message": "लॉग इन करें" + }, + "logout": { + "message": "लॉग आउट करें" + }, + "loose": { + "message": "ढीला" + }, + "loweCaseWords": { + "message": "बीज शब्द में केवल लोअरकेस वर्ण होते हैं" + }, + "mainnet": { + "message": "मुख्य ईथरम नेटवर्क" + }, + "message": { + "message": "संदेश" + }, + "metamaskDescription": { + "message": "मेटामास्क एथर्मम के लिए एक सुरक्षित पहचान वॉल्ट है।" + }, + "min": { + "message": "न्यूनतम" + }, + "myAccounts": { + "message": "मेरे खाते" + }, + "mustSelectOne": { + "message": "कम से कम 1 टोकन का चयन करना आवश्यक है।" + }, + "needEtherInWallet": { + "message": "मेटामास्क का उपयोग करने वाले विकेन्द्रीकृत अनुप्रयोगों के साथ बातचीत करने के लिए, आपको अपने वॉलेट में ईथर की आवश्यकता होगी।" + }, + "needImportFile": { + "message": "आयात करने के लिए आपको एक फ़ाइल का चयन करना होगा।", + "description": "प्रयोक्ता महत्वपूर्ण खाता है और उसे जारी रखने के लिए एक फ़ाइल जोड़ने की आवश्यकता है" + }, + "needImportPassword": { + "message": "चयनित फ़ाइल के लिए आपको एक पासवर्ड दर्ज करना होगा।", + "description": "पासवर्ड और फाइल को एक खाते आयात करने के लिए आवश्यक है" + }, + "negativeETH": { + "message": "ईटीएच की नकारात्मक मात्रा नहीं भेज सकते हैं।." + }, + "networks": { + "message": "नेटवर्क" + }, + "newAccount": { + "message": "नया खाता" + }, + "newAccountNumberName": { + "message": "नया खाता $1", + "description": "खाते का खाता बनाने पर अगले खाते का डिफ़ॉल्ट नाम" + }, + "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": "पुराना UI" + }, + "oldUIMessage": { + "message": "आप पुराने UI पर वापस आ गए हैं। आप ऊपर दाईं ओर ड्रॉपडाउन मेनू में विकल्प के माध्यम से नए UI पर वापस स्विच कर सकते हैं।" + }, + "or": { + "message": "या", + "description": "एक नया खाता बनाने या आयात करने के बीच की पसंद" + }, + "passwordCorrect": { + "message": "कृपया सुनिश्चित करें कि आपका पासवर्ड सही है।" + }, + "passwordMismatch": { + "message": "पासवर्ड मेल नहीं खाते", + "description": "पासवर्ड निर्माण प्रक्रिया में, दो नए पासवर्ड फ़ील्ड मेल नहीं खाते" + }, + "passwordShort": { + "message": "पासवर्ड पर्याप्त लंबा नहीं", + "description": "पासवर्ड बनाने की प्रक्रिया में, पासवर्ड सुरक्षित होने के लिए पर्याप्त नहीं है" + }, + "pastePrivateKey": { + "message": "यहां अपनी निजी कुंजी स्ट्रिंग चिपकाएं:", + "description": "किसी निजी कुंजी से किसी खाते को आयात करने के लिए" + }, + "pasteSeed": { + "message": "यहां अपने बीज वाक्यांश पेस्ट करें!" + }, + "personalAddressDetected": { + "message": "व्यक्तिगत पता मिला। टोकन अनुबंध का पता इनपुट।" + }, + "pleaseReviewTransaction": { + "message": "कृपया अपने लेनदेन की समीक्षा करें।" + }, + "privacyMsg": { + "message": "गोपनीयता नीति" + }, + "privateKey": { + "message": "निजी कुंजी", + "description": "खाता आयात करने के लिए उपयोग करने के लिए इस प्रकार की फ़ाइल का चयन करें" + }, + "privateKeyWarning": { + "message": "चेतावनी: कभी भी इस कुंजी का खुलासा न करें। आपकी निजी कुंजी वाले कोई भी आपके खाते में रखी किसी भी संपत्ति को चुरा सकता है।" + }, + "privateNetwork": { + "message": "निजी नेटवर्क" + }, + "qrCode": { + "message": "QR कोड दिखाएं" + }, + "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": "रिचीव टेस्ट नेटवर्क" + }, + "ropsten": { + "message": "रॉप्स्टेन टेस्ट नेटवर्क" + }, + "sampleAccountName": { + "message": "उदाहरण के लिए मेरा नया खाता", + "description": "उपयोगकर्ता को अपने खाते में मानव-पठनीय नाम जोड़ने की अवधारणा को समझें." + }, + "save": { + "message": "सहेजें" + }, + "saveAsFile": { + "message": "फ़ाइल के रूप में सहेजें", + "description": "खाता निर्यात प्रक्रिया" + }, + "saveSeedAsFile": { + "message": "सेड वर्ड्स - फाईल्स सेव करें" + }, + "search": { + "message": "खोज करें" + }, + "secretPhrase": { + "message": "अपनी गुप्त बारह शब्द वाक्यांश यहाँ अपनी तिजोरी को पुनर्स्थापित करने के लिए दर्ज करें।" + }, + "seedPhraseReq": { + "message": "बीज वाक्यांश 12 शब्द लंबा हैं" + }, + "select": { + "message": "चुनें" + }, + "selectCurrency": { + "message": "मुद्रा चुनें" + }, + "selectService": { + "message": "सेवा चुनें" + }, + "selectType": { + "message": "प्रकार चुनें" + }, + "send": { + "message": "भेजें" + }, + "sendETH": { + "message": "भेजें ETH" + }, + "sendTokens": { + "message": "भेजें टोकन" + }, + "sendTokensAnywhere": { + "message": "इटोरम खाते वाले किसी को भी टोकन भेजें" + }, + "settings": { + "message": "सेटिंग्स" + }, + "shapeshiftBuy": { + "message": "शेपेशिस्ट के साथ खरीदें" + }, + "showPrivateKeys": { + "message": "निजी कुंजी दिखाएँ" + }, + "showQRCode": { + "message": "QR कोड दिखाएं" + }, + "sign": { + "message": "हस्ताक्षर" + }, + "signMessage": { + "message": "हस्ताक्षर संदेश" + }, + "signNotice": { + "message": "इस संदेश पर हस्ताक्षर करने से \n साइड इफेक्ट हो सकते हैं। \n केवल अपने पूरे खाते के साथ पूरी तरह से भरोसेमंद \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 से ETH में जमा", + "description": "संदेश की शुरुआत में जमा प्रकार भर जाएगा" + }, + "tokenAddress": { + "message": "टोकन पता" + }, + "tokenAlreadyAdded": { + "message": "टोकन पहले ही जोड़ा जा चुका है।" + }, + "tokenBalance": { + "message": "आपका टोकन बैलेंस है:" + }, + "tokenSelection": { + "message": "टोकन के लिए खोजें या हमारी लोकप्रिय टॉकेन्स की सूची से चुनें।" + }, + "tokenSymbol": { + "message": "टोकन प्रतीक" + }, + "tokenWarning1": { + "message": "अपने मेटामास्क अकाउंट से खरीदे गए टोकनों का नज़र रखें। अगर आप किसी अलग खाते का उपयोग कर टोकन खरीदे हैं, तो ये टोकन यहां दिखाई नहीं देंगे।" + }, + "total": { + "message": "कुल" + }, + "transactions": { + "message": "लेनदेन" + }, + "transactionMemo": { + "message": "लेनदेन मेमो (वैकल्पिक)" + }, + "transactionNumber": { + "message": "लेनदेन संख्या" + }, + "transfers": { + "message": "स्थानांतरण" + }, + "troubleTokenBalances": { + "message": "मुसीबत... आपके टोकन शेष राशि को लोड करने में हमें परेशानी हुई थी। आप उन्हें देख सकते हैं", + "description": "टोकन शेष देखने के लिए एक लिंक ... (यहां)" + }, + "twelveWords": { + "message": "ये 12 शब्द आपके मेटामास्क खातों को पुनर्स्थापित करने का एकमात्र तरीका है। \n उन्हें कहीं सुरक्षित और गुप्त रूप से सहेजें।" + }, + "typePassword": { + "message": "अपना पासवर्ड टाइप करें" + }, + "uiWelcome": { + "message": "नया यूआई (बीटा) में आपका स्वागत है" + }, + "uiWelcomeMessage": { + "message": "आप अब नए मेटामास्क UI का उपयोग कर रहे हैं। चारों ओर एक नज़र डालें, टोकन भेजने की तरह नई सुविधाएं देखें, और हमें बताएं कि आपके पास कोई समस्या है।" + }, + "unavailable": { + "message": "अनुपलब्ध" + }, + "unknown": { + "message": "अज्ञात नेटवर्क" + }, + "unknownNetwork": { + "message": "अज्ञात निजी नेटवर्क" + }, + "unknownNetworkId": { + "message": "अज्ञात नेटवर्क आईडी.य़" + }, + "uriErrorMsg": { + "message": "URI-यूआरआई को उपयुक्त HTTP / HTTPS उपसर्ग की आवश्यकता होती है।" + }, + "usaOnly": { + "message": "केवल यूएसए - USA", + "description": "इस एक्सचेंज का उपयोग करना संयुक्त राज्य अमेरिका के अंदर ही सीमित है" + }, + "usedByClients": { + "message": "विभिन्न क्लाइंट्स द्वारा उपयोग किया जाता है" + }, + "useOldUI": { + "message": "पुराने UI का उपयोग करें" + }, + "validFileImport": { + "message": "आयात करने के लिए आपको एक वैध फ़ाइल चुननी होगी।" + }, + "vaultCreated": { + "message": "वॉल्ट बनाया गया" + }, + "viewAccount": { + "message": "खाता देखें" + }, + "visitWebSite": { + "message": "हमारी वेब साइट पर जाएं" + }, + "warning": { + "message": "चेतावनी" + }, + "welcomeBeta": { + "message": "मेटामास्क बीटा में आपका स्वागत है" + }, + "whatsThis": { + "message": "यह क्या है?" + }, + "yourSigRequested": { + "message": "आपका हस्ताक्षर अनुरोध किया जा रहा है" + }, + "youSign": { + "message": "आप हस्ताक्षर कर रहे हैं" + } +} From ec1188f25017b6b352744646aee61155d84fc999 Mon Sep 17 00:00:00 2001 From: Victor Charapaev Date: Wed, 21 Mar 2018 11:37:54 -0700 Subject: [PATCH 22/30] Translate to Russian (#3644) * Add Russian localization --- app/_locales/ru/messages.json | 819 ++++++++++++++++++++++++++++++++++ 1 file changed, 819 insertions(+) create mode 100644 app/_locales/ru/messages.json diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json new file mode 100644 index 000000000..e3a1935f5 --- /dev/null +++ b/app/_locales/ru/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": "Расширение браузера для Ethereum", + "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 - самый популярный в мире способ купить и продать биткойн, ethereum и litecoin." + }, + "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": "Сеть по умолчанию для транзакций 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": "Депозит Эфир" + }, + "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": "Следуйте за нами на Twitter" + }, + "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": " Импортированные аккаунты не будут связаны с вашей первоначально созданным аккаунтом MetaMask. Подробнее о импортированных аккаунтах " + }, + "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": "Недопустимый URI RPC" + }, + "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": "Локальный адрес 8545" + }, + "login": { + "message": "Авторизоваться" + }, + "logout": { + "message": "Выйти" + }, + "loose": { + "message": "Рыхлый" + }, + "loweCaseWords": { + "message": "семенные слова имеют только символы нижнего регистра" + }, + "mainnet": { + "message": "Основная сеть Ethereum" + }, + "message": { + "message": "Сообщение" + }, + "metamaskDescription": { + "message": "MetaMask - это безопасное хранилище для Ethereum." + }, + "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": "Невозможно отправить отрицательные количества ETH." + }, + "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": "Новый URL-адрес RPC" + }, + "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-код" + }, + "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": "Отправить ETH" + }, + "sendTokens": { + "message": "Отправить Токены" + }, + "sendTokensAnywhere": { + "message": "Отправить Токены кому-либо с аккаунтом Ethereum" + }, + "settings": { + "message": "Настройки" + }, + "shapeshiftBuy": { + "message": "Купить с помощью Shapeshift" + }, + "showPrivateKeys": { + "message": "Показать приватные ключи" + }, + "showQRCode": { + "message": "Показать QR-код" + }, + "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 в ETH через ShapeShift", + "description": "system will fill in deposit type in start of message" + }, + "tokenAddress": { + "message": "Адрес Токена" + }, + "tokenAlreadyAdded": { + "message": "Токен уже добавлен." + }, + "tokenBalance": { + "message": "Баланс Вашых Tокенов:" + }, + "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 Beta" + }, + "whatsThis": { + "message": "Что это?" + }, + "yourSigRequested": { + "message": "Ваша подпись запрашивается" + }, + "youSign": { + "message": "Вы подписываете" + } +} From 1eee1909ace9120e8ddedee6f525d48cd07368a4 Mon Sep 17 00:00:00 2001 From: Nico <35919226+AKingUltra@users.noreply.github.com> Date: Wed, 21 Mar 2018 19:41:17 +0100 Subject: [PATCH 23/30] Tranlate to German (#3575) Translation into German --- app/_locales/de/messages.json | 874 ++++++++++++++++++++++++++++++++++ 1 file changed, 874 insertions(+) create mode 100644 app/_locales/de/messages.json diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json new file mode 100644 index 000000000..e2e08315d --- /dev/null +++ b/app/_locales/de/messages.json @@ -0,0 +1,874 @@ +{ + "accept": { + "message": "Annehmen" + }, + "account": { + "message": "Account" + }, + "accountDetails": { + "message": "Accountdetails" + }, + "accountName": { + "message": "Accountname" + }, + "address": { + "message": "Adresse" + }, + "addToken": { + "message": "Token hinzufügen" + }, + "amount": { + "message": "Betrag" + }, + "amountPlusGas": { + "message": "Betrag + Gas" + }, + "appDescription": { + "message": "Ethereum Browsererweiterung", + "description": "Die Beschreibung der Erweiterung" + }, + "appName": { + "message": "MetaMask", + "description": "Der Name der Erweiterung" + }, + "attemptingConnect": { + "message": "Versuch mit der Blockchain zu verbinden." + }, + "available": { + "message": "Verfügbar" + }, + "back": { + "message": "Zurück" + }, + "balance": { + "message": "Guthaben:" + }, + "balanceIsInsufficientGas": { + "message": "Guthaben unzureichend für den aktuellen gesamten Gasbetrag" + }, + "beta": { + "message": "BETA" + }, + "betweenMinAndMax": { + "message": "Muss größer oder gleich $1 und kleiner oder gleich $2 sein.", + "description": "Helfer für die Eingabe von hex als dezimal" + }, + "blockiesIdenticon": { + "message": "Blockies Identicon verwenden" + }, + "borrowDharma": { + "message": "Mit Dharma ausleihen (Beta)" + }, + "builtInCalifornia": { + "message": "MetaMask wurde in Kalifornien entwickelt und gebaut." + }, + "buy": { + "message": "Kaufen" + }, + "buyCoinbase": { + "message": "Auf Coinbase kaufen" + }, + "buyCoinbaseExplainer": { + "message": "Coinbase ist die weltweit bekannteste Möglichkeit bitcoin, ethereum und litecoin zu kaufen und verkaufen." + }, + "ok": { + "message": "Ok" + }, + "cancel": { + "message": "Abbrechen" + }, + "classicInterface": { + "message": "Klassische Oberfläche verwenden" + }, + "clickCopy": { + "message": "Klicken um zu kopieren" + }, + "confirm": { + "message": "Bestätigen" + }, + "confirmed": { + "message": "Bestätigt" + }, + "confirmContract": { + "message": "Smart Contract bestätigen" + }, + "confirmPassword": { + "message": "Passwort bestätigen" + }, + "confirmTransaction": { + "message": "Transaktion bestätigen" + }, + "continue": { + "message": "Weiter" + }, + "continueToCoinbase": { + "message": "Zu Coinbase fortfahren" + }, + "contractDeployment": { + "message": "Smart Contract ausführen" + }, + "conversionProgress": { + "message": "Umtausch in Arbeit" + }, + "copiedButton": { + "message": "Kopiert" + }, + "copiedClipboard": { + "message": "In die Zwischenablage kopiert" + }, + "copiedExclamation": { + "message": "Kopiert!" + }, + "copiedSafe": { + "message": "Ich habe es an einen sicheren Ort kopiert" + }, + "copy": { + "message": "Kopieren" + }, + "copyToClipboard": { + "message": "In die Zwischenablage kopieren" + }, + "copyButton": { + "message": " Kopieren " + }, + "copyPrivateKey": { + "message": "Das ist Ihr Private Key (klicken um zu kopieren)" + }, + "create": { + "message": "Erstellen" + }, + "createAccount": { + "message": "Account erstellen" + }, + "createDen": { + "message": "Erstellen" + }, + "crypto": { + "message": "Krypto", + "description": "Börsentyp (Kryptowährungen)" + }, + "currentConversion": { + "message": "Aktueller Umtausch" + }, + "currentNetwork": { + "message": "Aktuelles Netzwerk" + }, + "customGas": { + "message": "Gas anpassen" + }, + "customize": { + "message": "Anpassen" + }, + "customRPC": { + "message": "Spezieller RPC" + }, + "decimalsMustZerotoTen": { + "message": "Die Dezimalangabe muss mindestens 0 und nicht höher als 36 sein." + }, + "decimal": { + "message": "Dezimalangabe der Präzision" + }, + "defaultNetwork": { + "message": "Das Standardnetzwerk für Ether Transaktionen ist das Main Net." + }, + "denExplainer": { + "message": "Dein DEN ist dein passwortverschlüsselter Speicher innerhalb von MetaMask." + }, + "deposit": { + "message": "Einzahlen" + }, + "depositBTC": { + "message": "Zahle dein BTC in die unten stehende Adresse ein:" + }, + "depositCoin": { + "message": "Zahle deine $1 in die unten stehende Adresse ein", + "description": "Teilt dem Benutzer mit welchen Token er beim Einzahlen mit Shapeshift ausgewählt hat" + }, + "depositEth": { + "message": "Eth einzahlen" + }, + "depositEther": { + "message": "Ether einzahlen" + }, + "depositFiat": { + "message": "Fiat einzahlen" + }, + "depositFromAccount": { + "message": "Von einem anderen Account einzahlen" + }, + "depositShapeShift": { + "message": "Mit ShapeShift einzahlen" + }, + "depositShapeShiftExplainer": { + "message": "Wenn du andere Kryptowährungen besitzt, kannst du diese direkt mit Hilfe deiner MetaMask Wallet handeln und einzahlen. Du benötigst keinen Account." + }, + "details": { + "message": "Details" + }, + "directDeposit": { + "message": "Sofortige Einzahlung" + }, + "directDepositEther": { + "message": "Sofort Ether einzahlen" + }, + "directDepositEtherExplainer": { + "message": "Wenn du bereits Ether besitzt, ist die sofortige Einzahlung die schnellste Methode Ether in deine neue Wallet zu bekommen." + }, + "done": { + "message": "Fertig" + }, + "downloadStatelogs": { + "message": "Statelogs herunterladen" + }, + "dropped": { + "message": "Abgewählt" + }, + "edit": { + "message": "Editieren" + }, + "editAccountName": { + "message": "Namen des Accounts editieren" + }, + "emailUs": { + "message": "Schreib uns eine Mail!" + }, + "encryptNewDen": { + "message": "Verschlüssele deine neue DEN" + }, + "enterPassword": { + "message": "Passwort eingeben" + }, + "enterPasswordConfirm": { + "message": "Gib dein neues Passwort zur Bestätigung ein" + }, + "passwordNotLongEnough": { + "message": "Passwort ist nicht lang genug" + }, + "passwordsDontMatch": { + "message": "Passwörter stimmen nicht überein" + }, + "etherscanView": { + "message": "Account auf Etherscan anschauen" + }, + "exchangeRate": { + "message": "Wechselrate" + }, + "exportPrivateKey": { + "message": "Private Key exportieren" + }, + "exportPrivateKeyWarning": { + "message": "Der Export von Private Keys verläuft auf eigene Verantwortung." + }, + "failed": { + "message": "Fehlgeschlagen" + }, + "fiat": { + "message": "FIAT", + "description": "Börsentyp" + }, + "fileImportFail": { + "message": "Dateiimport fehlgeschlagen? Bitte hier klicken!", + "description": "Hilft dem Benutzer sein Benutzerkonto durch eine JSON Datei zu importieren" + }, + "followTwitter": { + "message": "Folge uns auf Twitter" + }, + "from": { + "message": "von" + }, + "fromToSame": { + "message": "Ziel- und Ursprungsadresse dürfen nicht identisch sein" + }, + "fromShapeShift": { + "message": "Von ShapeShift" + }, + "gas": { + "message": "Gas", + "description": "Kleiner Hinweis bzgl. der Gaskosten" + }, + "gasFee": { + "message": "Gasgebühren" + }, + "gasLimit": { + "message": "Gaslimit" + }, + "gasLimitCalculation": { + "message": "Wir berechnen das empfohlene Gaslimit basierend auf der Erfolgsrate des Netzwerks." + }, + "gasLimitRequired": { + "message": "Gaslimit benötigt" + }, + "gasLimitTooLow": { + "message": "Gaslimit muss mindestens 21000 betragen" + }, + "generatingSeed": { + "message": "Seed generieren..." + }, + "gasPrice": { + "message": "Gaspreis (GWEI)" + }, + "gasPriceCalculation": { + "message": "Wir berechnen den empfohlenen Gaspreis basierend auf der Erfolgsrate des Netzwerks." + }, + "gasPriceRequired": { + "message": "Gaspreis benötigt" + }, + "getEther": { + "message": "Ether holen" + }, + "getEtherFromFaucet": { + "message": "Ether für $1 vom Faucet holen", + "description": "Zeigt den Netzwerknamen für den Ether Faucet an" + }, + "greaterThanMin": { + "message": "Muss größer oder gleich $1 sein.", + "description": "Helfer für die Eingabe von hex als dezimal" + }, + "here": { + "message": "hier", + "description": "z.B. für klick hier für mehr Informationen (in Zusammenhang mit troubleTokenBalances)" + }, + "hereList": { + "message": "Hier ist eine Liste!!!!" + }, + "hide": { + "message": "Ausblenden" + }, + "hideToken": { + "message": "Token ausblenden" + }, + "hideTokenPrompt": { + "message": "Token ausblenden?" + }, + "howToDeposit": { + "message": "Wie möchtest du Ether einzahlen?" + }, + "holdEther": { + "message": "Es erlaubt dir ether & Token zu halten und dient dir als Verbindung zu dezentralisierten Applikationen." + }, + "import": { + "message": "Import", + "description": "Button um den Account aus einer ausgewählten Datei zu importieren" + }, + "importAccount": { + "message": "Account importieren" + }, + "importAccountMsg": { + "message":" Importierte Accounts werden nicht mit der Seed Wörterfolge deines ursprünglichen MetaMask Accounts verknüpft. Erfahre mehr über importierte Accounts." + }, + "importAnAccount": { + "message": "Einen Account importieren" + }, + "importDen": { + "message": "Vorhandenes DEN importieren" + }, + "imported": { + "message": "Importiert", + "description": "Status der angezeigt wird wenn ein Benutzerkonto vollständig in das Schlüsselbund geladen wurde." + }, + "infoHelp": { + "message": "Info & Hilfe" + }, + "insufficientFunds": { + "message": "Nicht genügend Guthaben." + }, + "insufficientTokens": { + "message": "Nicht genügend Token." + }, + "invalidAddress": { + "message": "Ungültige Adresse" + }, + "invalidAddressRecipient": { + "message": "Empfängeradresse ist unzulässig" + }, + "invalidGasParams": { + "message": "Ungültige Gasparameter" + }, + "invalidInput": { + "message": "Ungültige Eingabe." + }, + "invalidRequest": { + "message": "Ungültige Abfrage" + }, + "invalidRPC": { + "message": "Ungültige RPC URI" + }, + "jsonFail": { + "message": "Irgendetwas ist schief gelaufen. Bitte überprüfe ob deine JSON Datei korrekt formatiert ist.“ + }, + "jsonFile": { + "message": "JSON Datei", + "description": "Dateiformat für das Importieren eines Accounts" + }, + "kovan": { + "message": "Kovan Testnetzwerk" + }, + "knowledgeDataBase": { + "message": "Schau in unsere Wissensdatenbank" + }, + "max": { + "message": "Max" + }, + "lessThanMax": { + "message": "Muss kleiner oder gleich $1 sein.", + "description": "Helfer für die Eingabe von hex als dezimal" + }, + "likeToAddTokens": { + "message": "Möchtest du diese Token hinzufügen?" + }, + "links": { + "message": "Links" + }, + "limit": { + "message": "Limit" + }, + "loading": { + "message": "Laden..." + }, + "loadingTokens": { + "message": "Token laden..." + }, + "localhost": { + "message": "Localhost 8545" + }, + "login": { + "message": "Login" + }, + "logout": { + "message": "Ausloggen" + }, + "loose": { + "message": "Frei" + }, + "loweCaseWords": { + "message": "Die Wörter der Seed Wörterfolgen sind alle kleingeschrieben" + }, + "mainnet": { + "message": "Ethereum Hauptnetzwerk (Main Net)" + }, + "message": { + "message": "Nachricht" + }, + "metamaskDescription": { + "message": "MetaMask ist ein sicherer Identitätssafe für Ethereum." + }, + "min": { + "message": "Minimum" + }, + "myAccounts": { + "message": "Meine Accounts" + }, + "mustSelectOne": { + "message": "Du musst mindestens 1 Token auswählen." + }, + "needEtherInWallet": { + "message": "Um dezentralisierte Applikationen mit MetaMask verwenden zu können, benötigst du Ether in deiner Wallet." + }, + "needImportFile": { + "message": "Für den Import musst du eine Datei auswählen.", + "description": "Benutzer importiert ein Benutzerkonto und muss eine Datei hinzufügen um fortzufahren" + }, + "needImportPassword": { + "message": "Für die ausgewählte Datei muss ein Passwort eingegeben werden.", + "description": "Passwort und Datei sind notwendig um einen Account zu importieren" + }, + "negativeETH": { + "message": "Negative ETH Beträge können nicht versendet werden." + }, + "networks": { + "message": "Netzwerke" + }, + "newAccount": { + "message": "Neuer Account" + }, + "newAccountNumberName": { + "message": "Account $1", + "description": "Standardname für einen weiteren Account der angelegt wird, wenn create account screen geklickt wird" + }, + "newContract": { + "message": "Neuer Smart Contract" + }, + "newPassword": { + "message": "Neues Passwort (min. 8 Zeichen)" + }, + "newRecipient": { + "message": "Neuer Empfänger" + }, + "newRPC": { + "message": "Neue RPC URL" + }, + "next": { + "message": "Weiter" + }, + "noAddressForName": { + "message": "Für den angegebene Namen wurde keine Adresse eingegeben." + }, + "noDeposits": { + "message": "Keine Einzahlung erhalten" + }, + "noTransactionHistory": { + "message": "Keine Transaktionshistorie." + }, + "noTransactions": { + "message": "Keine Transaktionen" + }, + "notStarted": { + "message": "Nicht gestartet" + }, + "oldUI": { + "message": "Alte Oberfläche" + }, + "oldUIMessage": { + "message": "Du bist zur alten Oberfläche zurückgewechselt. Du kannst mit Hilfe der Option im oberen rechten Dropdown Menü zur neuen Oberfläche zurückwechseln." + }, + "or": { + "message": "oder", + "description": "Wahl zwischen erstellen oder importieren eines Accounts." + }, + "passwordCorrect": { + "message": "Bitte überzeuge dich davon, dass dein Passwort korrekt ist." + }, + "passwordMismatch": { + "message": "Passwörter stimmen nicht überein", + "description": "Im Passwort erstellen Prozess stimmen beide Passwörter nicht miteinander überein" + }, + "passwordShort": { + "message": "Passwort ist nicht lang genug", + "description": "Im Passwort erstellen Prozess ist das eingegebene Passwort nicht lang genug um sicher zu sein" + }, + "pastePrivateKey": { + "message": "Füge deine Private Key Zeichenfolge hier ein:", + "description": "Für den Import eine Accounts mit Hilfe eines Private Keys" + }, + "pasteSeed": { + "message": "Füge deine Seed Wörterfolge hier ein!" + }, + "personalAddressDetected": { + "message": "Personalisierte Adresse identifiziert. Bitte füge die Token Contract Adresse ein." + }, + "pleaseReviewTransaction": { + "message": "Bitte überprüfe deine Transaktion." + }, + "privacyMsg": { + "message": "Datenschutzrichtlinie" + }, + "privateKey": { + "message": "Private Key", + "description": "Wähle diesen Dateityp um damit einen Account zu importieren" + }, + "privateKeyWarning": { + "message": "Warnung: Niemals jemanden deinen Private Key mitteilen. Jeder der im Besitz deines Private Keys ist, kann jegliches Guthaben deines Accounts stehlen." + }, + "privateNetwork": { + "message": "Privates Netzwerk" + }, + "qrCode": { + "message": "QR Code anzeigen" + }, + "readdToken": { + "message": "Du kannst diesen Token zukünftig wieder hinzufügen indem du in den Menüpunkt \"Token hinzufügen"\ in den Einstellungen deines Accounts gehst." + }, + "readMore": { + "message": "Hier mehr erfahren." + }, + "readMore2": { + "message": "Mehr erfahren." + }, + "receive": { + "message": "Erhalten" + }, + "recipientAddress": { + "message": "Empfängeradresse" + }, + "refundAddress": { + "message": "Rückerstattungsadresse" + }, + "rejected": { + "message": "Abgelehnt" + }, + "resetAccount": { + "message": "Account zurücksetzten" + }, + "restoreFromSeed": { + "message": "Mit Hilfe der Seed Wörterfolge wiederherstellen." + }, + "restoreVault": { + "message": "Vault wiederherstellen" + }, + "required": { + "message": "Benötigt" + }, + "retryWithMoreGas": { + "message": "Versuche es hier mit einem höheren Gaspreis noch einmal" + }, + "walletSeed": { + "message": "Wallet Seed" + }, + "revealSeedWords": { + "message": "Seed Wörterfolge anzeigen" + }, + "revealSeedWordsWarning": { + "message": "Bitte niemals deine Seed Wörterfolge an einem öffentlichen Ort kenntlich machen. Mit diesen Wörtern können alle deine Accounts gestohlen werden." + }, + "revert": { + "message": "Zurück gehen" + }, + "rinkeby": { + "message": "Rinkeby Testnetzwerk" + }, + "ropsten": { + "message": "Ropsten Testnetzwerk" + }, + "currentRpc": { + "message": "Aktueller RPC" + }, + "connectingToMainnet": { + "message": "Verbinde zum Ethereum Hauptnetzwerk (Main Net)" + }, + "connectingToRopsten": { + "message": " Verbinde zum Ropsten Testnetzwerk" + }, + "connectingToKovan": { + "message": " Verbinde zum Kovan Testnetzwerk" + }, + "connectingToRinkeby": { + "message": " Verbinde zum Rinkeby Testnetzwerk" + }, + "connectingToUnknown": { + "message": "Verbinde zu einem unbekanntem Netzwerk" + }, + "sampleAccountName": { + "message": "Z.B. mein neuer Account", + "description": "Dem Benutzer helfen das Konzept des Hinzufügens eines menschlich lesbaren Namen für den Account hinzuzufügen" + }, + "save": { + "message": "Speichern" + }, + "saveAsFile": { + "message": "Als Datei speichern", + "description": "Prozess des Exportieren eines Accounts" + }, + "saveSeedAsFile": { + "message": "Seed Wörterfolge als Datei speichern" + }, + "search": { + "message": "Suche" + }, + "secretPhrase": { + "message": "Gib die 12 Wörter deiner geheimem Wörterfolge ein um deinen Vault wiederherzustellen." + }, + "newPassword8Chars": { + "message": "Neues Passwort (min. 8 Zeichen)" + }, + "seedPhraseReq": { + "message": "Seed Wörterfolgen bestehen aus 12 Wörtern" + }, + "select": { + "message": "Auswählen" + }, + "selectCurrency": { + "message": "Währung auswählen" + }, + "selectService": { + "message": "Service auswählen" + }, + "selectType": { + "message": "Typ auswählen" + }, + "send": { + "message": "Senden" + }, + "sendETH": { + "message": "ETH senden" + }, + "sendTokens": { + "message": "Token senden" + }, + "onlySendToEtherAddress": { + "message": "ETH nur zu einer Ethereum Adresse senden." + }, + "sendTokensAnywhere": { + "message": "Token zu einer beliebigen Person mit einem Ethereumaccount senden" + }, + "settings": { + "message": "Einstellungen" + }, + "info": { + "message": "Info" + }, + "shapeshiftBuy": { + "message": "Mit Shapeshift kaufen" + }, + "showPrivateKeys": { + "message": "Private Keys anzeigen" + }, + "showQRCode": { + "message": "QR Code anzeigen" + }, + "sign": { + "message": "Unterschreiben" + }, + "signed": { + "message": "Unterschrieben" + }, + "signMessage": { + "message": "Nachricht unterschreiben" + }, + "signNotice": { + "message": "Das Unterschreiben dieser Nachricht kann gefährliche Nebeneffekte haben. Bitte nur Nachrichten von Webseiten unterschreiben denen du deinen vollständigen Account anvertrauen würdest. Diese gefährliche Variante wird in zukünftigen Versionen entfernt werden." + }, + "sigRequest": { + "message": "Unterschriftsanfrage" + }, + "sigRequested": { + "message": "Unterschrift angefragt" + }, + "spaceBetween": { + "message": "Es darf nur ein Leerzeichen zwischen den Wörtern sein" + }, + "status": { + "message": "Status" + }, + "stateLogs": { + "message": "Statelogs" + }, + "stateLogsDescription": { + "message": "Statelogs zeigen die Public Adresse und die gesendeten Transaktionen deines Accounts." + }, + "stateLogError": { + "message": "Fehler beim Abfragen der Statelogs." + }, + "submit": { + "message": "Einreichen" + }, + "submitted": { + "message": "Eingereicht" + }, + "supportCenter": { + "message": "Gehe zu unserem Support Center" + }, + "symbolBetweenZeroTen": { + "message": "Das Symbol muss zwischen 0 und 10 Zeichen haben." + }, + "takesTooLong": { + "message": "Dauert es zu lang?" + }, + "terms": { + "message": "Nutzungsbedingungen" + }, + "testFaucet": { + "message": "Testfaucet" + }, + "to": { + "message": "An:" + }, + "toETHviaShapeShift": { + "message": "$1 an ETH via ShapeShift", + "description": "Das System wird den Einzahlungstyp im Beginn der Nachricht eintragen" + }, + "tokenAddress": { + "message": "Tokenadresse" + }, + "tokenAlreadyAdded": { + "message": "Der Token wurde bereits hinzugefügt." + }, + "tokenBalance": { + "message": "Dein Tokenguthaben beträgt:" + }, + "tokenSelection": { + "message": "Suche nach Token oder wähle aus einer Liste der beliebtesten Token aus." + }, + "tokenSymbol": { + "message": "Tokensymbol" + }, + "tokenWarning1": { + "message": "Behalte die Token die du mit deinem MetaMask Account gekauft hast im Auge. Wenn du Token mit einem anderen Account gekauft hast, werden diese hier nicht angezeigt.“ + }, + "total": { + "message": "Gesamt" + }, + "transactions": { + "message": "Transaktionen" + }, + "transactionMemo": { + "message": "Transaktionsmemo (optional)" + }, + "transactionNumber": { + "message": "Transaktionsnummer" + }, + "transfers": { + "message": "Transfers" + }, + "troubleTokenBalances": { + "message": "Wir haben Schwierigkeiten dein Tokenguthaben zu laden. Du kannst es hier anzeigen lassen", + "description": "Gefolgt von einem Link (hier) um die Tokenguthaben anzuzeigen" + }, + "twelveWords": { + "message": "Diese 12 Wörter stellen die einzige Möglichkeit dar deinen MetaMask Account wiederherzustellen. Speichere sie daher an einem sicheren und geheimen Ort.” + }, + "typePassword": { + "message": "Passwort eingeben" + }, + "uiWelcome": { + "message": "Willkommen zur neuen Oberfläche (Beta)" + }, + "uiWelcomeMessage": { + "message": "Du verwendest nun die neue Metamask Oberfläche. Schau dich um, teste die neuen Features wie z.B. das Senden von Token und lass es uns wissen falls du irgendwelche Probleme hast." + }, + "unapproved": { + "message": "Nicht genehmigt" + }, + "unavailable": { + "message": "Nicht verfügbar" + }, + "unknown": { + "message": "Unbekannt" + }, + "unknownNetwork": { + "message": "Unbekanntes privates Netzwerk" + }, + "uriErrorMsg": { + "message": "URIs benötigen die korrekten HTTP/HTTPS Präfixe." + }, + "unknownNetworkId": { + "message": "Unbekannte Netzwerk ID" + }, + "usaOnly": { + "message": "Nur USA ", + "description": "Diese Börse ist nur für Einwohner der USA verfügbar" + }, + "usedByClients": { + "message": "Verwendet von einer Reihe verschiedenen Kunden" + }, + "useOldUI": { + "message": "Alte Oberfläche verwenden" + }, + "validFileImport": { + "message": "Du musst eine gültige Datei für den Import auswählen." + }, + "vaultCreated": { + "message": "Vault erstellt" + }, + "viewAccount": { + "message": " Account einsehen" + }, + "visitWebSite": { + "message": "Gehe zu unsere Webseite" + }, + "warning": { + "message": "Warnung" + }, + "welcomeBeta": { + "message": "Willkommen zu MetaMask Beta" + }, + "whatsThis": { + "message": "Was ist das?" + }, + "yourSigRequested": { + "message": "Deine Unterschrift wird angefordert" + }, + "youSign": { + "message": "Du unterschreibst" + } +} + From dc4752c703d44e2ee5ac8636d5fced931299ab6a Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 11:44:31 -0700 Subject: [PATCH 24/30] i18n - fix german json formatting --- app/_locales/de/messages.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index e2e08315d..0bdce516c 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -369,7 +369,7 @@ "infoHelp": { "message": "Info & Hilfe" }, - "insufficientFunds": { + "insufficientFunds": { "message": "Nicht genügend Guthaben." }, "insufficientTokens": { @@ -394,7 +394,7 @@ "message": "Ungültige RPC URI" }, "jsonFail": { - "message": "Irgendetwas ist schief gelaufen. Bitte überprüfe ob deine JSON Datei korrekt formatiert ist.“ + "message": "Irgendetwas ist schief gelaufen. Bitte überprüfe ob deine JSON Datei korrekt formatiert ist." }, "jsonFile": { "message": "JSON Datei", @@ -557,7 +557,7 @@ "description": "Wähle diesen Dateityp um damit einen Account zu importieren" }, "privateKeyWarning": { - "message": "Warnung: Niemals jemanden deinen Private Key mitteilen. Jeder der im Besitz deines Private Keys ist, kann jegliches Guthaben deines Accounts stehlen." + "message": "Warnung: Niemals jemanden deinen Private Key mitteilen. Jeder der im Besitz deines Private Keys ist, kann jegliches Guthaben deines Accounts stehlen." }, "privateNetwork": { "message": "Privates Netzwerk" @@ -566,7 +566,7 @@ "message": "QR Code anzeigen" }, "readdToken": { - "message": "Du kannst diesen Token zukünftig wieder hinzufügen indem du in den Menüpunkt \"Token hinzufügen"\ in den Einstellungen deines Accounts gehst." + "message": "Du kannst diesen Token zukünftig wieder hinzufügen indem du in den Menüpunkt \"Token hinzufügen\" in den Einstellungen deines Accounts gehst." }, "readMore": { "message": "Hier mehr erfahren." @@ -782,7 +782,7 @@ "message": "Tokensymbol" }, "tokenWarning1": { - "message": "Behalte die Token die du mit deinem MetaMask Account gekauft hast im Auge. Wenn du Token mit einem anderen Account gekauft hast, werden diese hier nicht angezeigt.“ + "message": "Behalte die Token die du mit deinem MetaMask Account gekauft hast im Auge. Wenn du Token mit einem anderen Account gekauft hast, werden diese hier nicht angezeigt." }, "total": { "message": "Gesamt" @@ -804,7 +804,7 @@ "description": "Gefolgt von einem Link (hier) um die Tokenguthaben anzuzeigen" }, "twelveWords": { - "message": "Diese 12 Wörter stellen die einzige Möglichkeit dar deinen MetaMask Account wiederherzustellen. Speichere sie daher an einem sicheren und geheimen Ort.” + "message": "Diese 12 Wörter stellen die einzige Möglichkeit dar deinen MetaMask Account wiederherzustellen. Speichere sie daher an einem sicheren und geheimen Ort." }, "typePassword": { "message": "Passwort eingeben" @@ -871,4 +871,3 @@ "message": "Du unterschreibst" } } - From 6a428bbef78d8d73bf4fcf315f19d6c4e97efbdb Mon Sep 17 00:00:00 2001 From: Thomas Huang Date: Wed, 21 Mar 2018 12:22:15 -0700 Subject: [PATCH 25/30] Revert "Issue 3505 | Transpile to ES5" --- gulpfile.js | 6 +----- package.json | 4 +--- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index dbbb1e4ff..adfb148a9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -408,11 +408,7 @@ function bundleTask(opts) { .pipe(gulpif(debug, sourcemaps.init({ loadMaps: true }))) // Minification .pipe(gulpif(opts.isBuild, uglify({ - mangle: { reserved: [ 'MetamaskInpageProvider' ] }, - }))) - // Transpile to ES5 - .pipe(gulpif(opts.isBuild, babel({ - presets: ['env'] + mangle: { reserved: [ 'MetamaskInpageProvider' ] }, }))) // writes .map file .pipe(gulpif(debug, sourcemaps.write('./'))) diff --git a/package.json b/package.json index 8f05bc7f1..1aae1092e 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,9 @@ "mock": "beefy development/mock-dev.js:bundle.js --live --open --index=./development/index.html --cwd ./", "watch": "mocha watch --recursive \"test/unit/**/*.js\"", "mascara": "gulp build && cross-env METAMASK_DEBUG=true node ./mascara/example/server", - "dist": "npm run dist:clear && npm install && gulp dist && npm run test:es5", + "dist": "npm run dist:clear && npm install && gulp dist", "dist:clear": "rm -rf node_modules/eth-contract-metadata && rm -rf node_modules/eth-phishing-detect", "test": "npm run lint && npm run test:coverage && npm run test:integration", - "test:es5": "es-check es5 ./dist/**/*.js", "test:unit": "cross-env METAMASK_ENV=test mocha --exit --require babel-core/register --require test/helper.js --recursive \"test/unit/**/*.js\"", "test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js", "test:integration": "npm run test:integration:build && npm run test:flat && npm run test:mascara", @@ -201,7 +200,6 @@ "envify": "^4.0.0", "enzyme": "^3.3.0", "enzyme-adapter-react-15": "^1.0.5", - "es-check": "^2.0.2", "eslint-plugin-chai": "0.0.1", "eslint-plugin-mocha": "^4.9.0", "eslint-plugin-react": "^7.4.0", From 3e79941658e58f5ef74cd9545c2b69136362ec76 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 13:12:59 -0700 Subject: [PATCH 26/30] ui - tx conf - only show special token tx conf screen for token send --- ui/app/components/pending-tx/index.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/app/components/pending-tx/index.js b/ui/app/components/pending-tx/index.js index 9676e9c86..9c0453a3b 100644 --- a/ui/app/components/pending-tx/index.js +++ b/ui/app/components/pending-tx/index.js @@ -63,10 +63,14 @@ PendingTx.prototype.componentWillMount = async function () { isFetching: false, }) } - const tokenData = txParams && abiDecoder.decodeMethod(txParams.data) - const { name: tokenMethodName } = tokenData || {} - const isTokenTransaction = ['transfer', 'approve', 'transferFrom'] - .find(possibleName => tokenMethodName === possibleName) + + // inspect tx data for supported special confirmation screens + let isTokenTransaction = false + if (txParams.data) { + const tokenData = abiDecoder.decodeMethod(txParams.data) + const { name: tokenMethodName } = tokenData || {} + isTokenTransaction = (tokenMethodName === 'transfer') + } if (isTokenTransaction) { const token = util.getContractAtAddress(txParams.to) From 4c2cf15d2ad9cdfee4ce67b795877c7ab60231a7 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 13:31:43 -0700 Subject: [PATCH 27/30] test - flat - add extra timeout, idk maybe --- test/integration/lib/send-new-ui.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/integration/lib/send-new-ui.js b/test/integration/lib/send-new-ui.js index 3fc7c79f8..46e0ef0e4 100644 --- a/test/integration/lib/send-new-ui.js +++ b/test/integration/lib/send-new-ui.js @@ -127,6 +127,7 @@ 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 a3a24d718db52baa88b5995124a7f72ebdd2a975 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 14:14:17 -0700 Subject: [PATCH 28/30] changelog - update with new changes --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75ba7670f..fe31a9f52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,13 @@ ## Current Master -- MetaMask will no longer allow nonces to be specified by the dapp -- Add ability for internationalization. +- Add internationalization support! Includes translations for 13 (!!) new languages: French, Spanish, Italian, German, Dutch, Portuguese, Japanese, Korean, Vietnamese, Mandarin, Hindi, Tagalog, and Russian! Read more about the community effort [here](https://medium.com/gitcoin/metamask-internationalizes-via-gitcoin-bf1390c0301c) +- No longer uses nonces specified by the dapp - Will now throw an error if the `to` field in txParams is not valid. - Will strip null values from the `to` field. -- Fix flashing to Log in screen after logging in or restoring from seed phrase. +- (beta) No longer shows token confirmation screen when performing a non-send +- (beta) Fixes bug where tx data was nullified when repricing a tx +- Fix flashing Login screen after logging in or restoring from seed phrase. - Increase tap areas for menu buttons on mobile - Change all fonts in new-ui onboarding to Roboto, size 400 - Add a welcome screen to new-ui onboarding flow From 93622392312b89bcf0a8d5bcc132d800867c8704 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 14:16:00 -0700 Subject: [PATCH 29/30] v4.3.0 --- CHANGELOG.md | 2 ++ app/manifest.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe31a9f52..f9087d5ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Current Master +## 4.3.0 Wed Mar 21 2018 + - Add internationalization support! Includes translations for 13 (!!) new languages: French, Spanish, Italian, German, Dutch, Portuguese, Japanese, Korean, Vietnamese, Mandarin, Hindi, Tagalog, and Russian! Read more about the community effort [here](https://medium.com/gitcoin/metamask-internationalizes-via-gitcoin-bf1390c0301c) - No longer uses nonces specified by the dapp - Will now throw an error if the `to` field in txParams is not valid. diff --git a/app/manifest.json b/app/manifest.json index 6fcf6cd7c..0aac1c8df 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_appName__", "short_name": "__MSG_appName__", - "version": "4.2.0", + "version": "4.3.0", "manifest_version": 2, "author": "https://metamask.io", "description": "__MSG_appDescription__", From ea137777abe39747a9e54bacd48d76f9ddf987a9 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 21 Mar 2018 14:33:03 -0700 Subject: [PATCH 30/30] changelog - add note on i18n being beta only --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9087d5ad..40d77bc9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ## 4.3.0 Wed Mar 21 2018 -- Add internationalization support! Includes translations for 13 (!!) new languages: French, Spanish, Italian, German, Dutch, Portuguese, Japanese, Korean, Vietnamese, Mandarin, Hindi, Tagalog, and Russian! Read more about the community effort [here](https://medium.com/gitcoin/metamask-internationalizes-via-gitcoin-bf1390c0301c) +- (beta) Add internationalization support! Includes translations for 13 (!!) new languages: French, Spanish, Italian, German, Dutch, Portuguese, Japanese, Korean, Vietnamese, Mandarin, Hindi, Tagalog, and Russian! Select "Try Beta" in the menu to take them for a spin. Read more about the community effort [here](https://medium.com/gitcoin/metamask-internationalizes-via-gitcoin-bf1390c0301c) - No longer uses nonces specified by the dapp - Will now throw an error if the `to` field in txParams is not valid. - Will strip null values from the `to` field.