diff --git a/angular-bitcore-wallet-client/index.js b/angular-bitcore-wallet-client/index.js index a7d0c09d6..0765b6df0 100644 --- a/angular-bitcore-wallet-client/index.js +++ b/angular-bitcore-wallet-client/index.js @@ -36,6 +36,7 @@ bwcModule.provider("bwcService", function() { var bwc = new Client({ baseUrl: opts.bwsurl || 'https://bws.bitpay.com/bws/api', verbose: opts.verbose, + timeout: 100000, transports: ['polling'], }); if (walletData) diff --git a/app-template/bitpay/appConfig.json b/app-template/bitpay/appConfig.json index 320a3dcc0..2bc965cb4 100644 --- a/app-template/bitpay/appConfig.json +++ b/app-template/bitpay/appConfig.json @@ -9,20 +9,20 @@ "nameNoSpace": "bitpay", "nameCase": "BitPay", "nameCaseNoSpace": "BitPay", - "gitHubRepoName": "bitpay-wallet", - "gitHubRepoUrl": "git://github.com/bitpay/bitpay-wallet.git", - "gitHubRepoBugs": "https://github.com/bitpay/bitpay-wallet/issues", + "gitHubRepoName": "copay", + "gitHubRepoUrl": "git://github.com/bitpay/copay.git", + "gitHubRepoBugs": "https://github.com/bitpay/copay/issues", "disclaimerUrl": "", "url": "https://bitpay.com", "appDescription": "Secure Bitcoin Wallet", "winAppName": "BitPayWallet", "wpPublisherId": "{}", "wpProductId": "{}", - "windowsAppId": "", + "windowsAppId": "2d1002d7-ee34-4f60-bd29-0c871ba0c195", "pushSenderId": "1036948132229", "description": "Secure Bitcoin Wallet", - "version": "1.0.1", - "androidVersion": "1", + "version": "1.2.1", + "androidVersion": "12100", "_extraCSS": null, "_enabledExtensions": { "coinbase": true, diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 9f54116f4..406dc1c34 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -65,6 +65,7 @@ + diff --git a/app-template/package-template.json b/app-template/package-template.json index a1d87faf0..093217de2 100644 --- a/app-template/package-template.json +++ b/app-template/package-template.json @@ -56,7 +56,7 @@ "bezier-easing": "^2.0.3", "bhttp": "^1.2.1", "bitauth": "^0.3.2", - "bitcore-wallet-client": "4.3.2", + "bitcore-wallet-client": "4.4.0", "bower": "^1.7.9", "chai": "^3.5.0", "cordova-android": "5.1.1", @@ -87,6 +87,7 @@ "start": "npm run build:www && ionic serve --nolivereload --nogulp -s", "start:ios": "npm run build:www && npm run build:ios && npm run open:ios", "start:android": "npm run build:www && npm run build:android && npm run run:android", + "start:desktop": "npm start", "watch": "grunt watch", "build:www": "grunt", "build:www-release": "grunt prod", diff --git a/app-template/setup-win.iss b/app-template/setup-win.iss index 762d1434e..8b053baa2 100755 --- a/app-template/setup-win.iss +++ b/app-template/setup-win.iss @@ -5,7 +5,7 @@ #define MyAppVersion "*VERSION*" #define MyAppPublisher "BitPay" #define MyAppURL "*URL*" -#define MyAppExeName "*PACKAGENAME*.exe" +#define MyAppExeName "*USERVISIBLENAME*.exe" #define AppId "*WINDOWSAPPID*" [Setup] @@ -19,7 +19,7 @@ AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DefaultGroupName={#MyAppName} -OutputBaseFilename=*PACKAGENAME*-win +OutputBaseFilename=*USERVISIBLENAME*-win OutputDir=./ Compression=lzma SolidCompression=yes @@ -33,9 +33,9 @@ Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] -Source: "*PACKAGENAME*\win64\*PACKAGENAME*.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "*PACKAGENAME*\win64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs -Source: "../www/img/icons/favicon.ico"; DestDir: "{app}"; DestName: "icon.ico"; Flags: ignoreversion +Source: "*USERVISIBLENAME*\win64\*USERVISIBLENAME*.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "*USERVISIBLENAME*\win64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "../www/img/app/favicon.ico"; DestDir: "{app}"; DestName: "icon.ico"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] diff --git a/backupRecovery.md b/backupRecovery.md index 3865b66f2..db8f19989 100644 --- a/backupRecovery.md +++ b/backupRecovery.md @@ -19,7 +19,7 @@ Copay is a Multisig HD Wallet. Copay app holds the extended private keys for the ### Wallet Recovery Scope * Basic Recovery: Wallet access is restored. It is possible to see wallet balance and past transactions. It is possible to send and receive payments. - * Full Recovery: All the features of Partial Recovery + wallet name, copayer names are recovered, past payment proposal metadata (who signed, and notes) are recoved. + * Full Recovery: All the features of Partial Recovery + wallet name, copayer names are recovered, past payment proposal metadata (who signed, and notes) are recovered. ## Wallet Restore Scenarios diff --git a/i18n/crowdin_update.js b/i18n/crowdin_update.js index 8f351f3c8..b69d276ec 100644 --- a/i18n/crowdin_update.js +++ b/i18n/crowdin_update.js @@ -40,10 +40,10 @@ var local_file3 = fs.createReadStream(local_file_name3) // obtain the crowdin api key var crowdin_api_key = fs.readFileSync(path.join(__dirname, 'crowdin_api_key.txt')) -//console.log('api key: ' + crowdin_api_key); + //console.log('api key: ' + crowdin_api_key); if (crowdin_api_key != '') { - + var payload = { 'files[template.pot]': local_file1, 'files[appstore/appstore_en.txt]': local_file2, @@ -51,8 +51,9 @@ if (crowdin_api_key != '') { }; bhttp.post('https://api.crowdin.com/api/project/' + crowdin_identifier + '/update-file?key=' + crowdin_api_key, payload, {}, function(err, response) { - console.log('\nResponse from update file call:\n', response.body.toString()); - + if (!err) console.log('\nResponse from update file call:\n', response.body.toString()); + else console.log('\nError from update file call:\n', err.toString()); + // This call will tell the server to generate a new zip file for you based on most recent translations. https.get('https://api.crowdin.com/api/project/' + crowdin_identifier + '/export?key=' + crowdin_api_key, function(res) { console.log('Export Got response: ' + res.statusCode); diff --git a/i18n/po/es.po b/i18n/po/es.po index e93619c90..19e5be482 100644 --- a/i18n/po/es.po +++ b/i18n/po/es.po @@ -12,2038 +12,2898 @@ msgstr "" "Last-Translator: cmgustavo83\n" "Language-Team: Spanish\n" "Language: es\n" -"PO-Revision-Date: 2016-07-15 09:26-0400\n" +"PO-Revision-Date: 2016-12-13 08:01-0500\n" -#: www/views/modals/search.html -#: www/views/walletHome.html -msgid "(possible double spend)" -msgstr "(Posible doble gasto)" - -#: www/views/modals/paypro.html +#: www/views/modals/paypro.html:34 msgid "(Trusted)" msgstr "(De confianza)" -#: www/views/walletHome.html -msgid "[Balance Hidden]" -msgstr "[Balance Oculto]" +#: www/views/includes/txp.html:27 +#: www/views/modals/search.html:27 +#: www/views/walletDetails.html:249 +msgid "(possible double spend)" +msgstr "(Posible doble gasto)" -#: src/js/controllers/walletHome.js -msgid "{{fee}} will be deducted for bitcoin networking fees" -msgstr "{{fee}} se descontará por comisión de la red bitcoin" - -#: www/views/includes/confirm-tx.html -msgid "{{feeRateStr}} of the transaction" -msgstr "{{feeRateStr}} de la transacción" - -#: www/views/copayers.html -#: www/views/includes/walletInfo.html -msgid "{{index.m}}-of-{{index.n}}" -msgstr "{{index.m}}-de-{{index.n}}" - -#: www/views/modals/search.html -msgid "{{index.result.length - index.txHistorySearchResults.length}} more" -msgstr "{{index.result.length - index.txHistorySearchResults.length}} más" - -#: www/views/walletHome.html -msgid "{{index.txProgress}} transactions downloaded" -msgstr "{{index.txProgress}} transacciones descargadas" - -#: www/views/includes/sidebar.html -msgid "{{item.m}}-of-{{item.n}}" -msgstr "{{item.m}}-de-{{item.n}}" - -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:154 msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." msgstr "* Una propuesta de pago puede ser eliminada si 1) Ud. es el creador, y ningún otro copayer la haya firmado, o 2) hayan transcurrido 24 horas desde la creación de la propuesta." -#: www/views/includes/terms.html -msgid "IF YOU LOSE ACCESS TO YOUR COPAY WALLET OR YOUR ENCRYPTED PRIVATE KEYS AND YOU HAVE NOT SEPARATELY STORED A BACKUP OF YOUR WALLET AND CORRESPONDING PASSWORD, YOU ACKNOWLEDGE AND AGREE THAT ANY BITCOIN YOU HAVE ASSOCIATED WITH THAT COPAY WALLET WILL BECOME INACCESSIBLE." -msgstr "SI UD. PIERDE ACCESO A SU MONEDERO COPAY O A SUS CLAVES PRIVADAS ENCRIPTADAS Y NO HA GUARDADO POR SEPARADO UNA COPIA DE SEGURIDAD DE SU MONEDERO Y CONTRASEÑA CORRESPONDIENTES, USTED RECONOCE Y ACEPTA QUE CUALQUIER BITCOIN QUE HA ASOCIADO CON ESE MONEDERO COPAY SERÁ INACCESIBLE." +#: www/views/feedback/rateApp.html:7 +msgid "5-star ratings help us get BitPay into more hands, and more users means more resources can be committed to the app!" +msgstr "Una calificación de 5 estrellas nos ayuda a que BitPay sea más utilizado, y más usuarios significa más razones para seguir comprometidos con esta aplicación!" -#: www/views/backup.html -msgid "OR 1 wallet export file and the remaining quorum of wallet recovery phrases (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet recovery phrases of any of the other copayers)." -msgstr "O 1 archivo exportado del monedero y el quórum restante de la frase de recuperación (por ejemplo en un monedero 3-5: 1 archivo exportado + 2 frases de recuperación del monedero de cualquiera de los otros copayers)." +#: src/js/controllers/confirm.js:454 +msgid "A SMS containing a confirmation code was sent to your phone." +msgstr "Un SMS con el código de confirmación fue enviado a tu teléfono." -#: www/views/backup.html -msgid "OR the wallet recovery phrase of all copayers in the wallet" -msgstr "O la frase de recuperación de todos los copayers del monedero" +#: src/js/controllers/feedback/send.js:27 +#: www/views/feedback/complete.html:17 +msgid "A member of the team will review your feedback as soon as possible." +msgstr "Un miembro del equipo revisará sus comentarios tan pronto como sea posible." -#: www/views/backup.html -msgid "OR the wallet recovery phrases of all copayers in the wallet" -msgstr "O las frases de recuperación de todos los copayers del monedero" +#: src/js/controllers/confirm.js:212 +msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." +msgstr "Se excluyeron un total de {{amountAboveMaxSizeStr}}. Fue excedido el tamaño máximo permitido para una transacción." -#: www/views/disclaimer.html -msgid "A multisignature bitcoin wallet" -msgstr "Monedero multifirma de bitcoin" +#: src/js/controllers/confirm.js:206 +msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." +msgstr "Se excluyeron un total de {{amountBelowFeeStr}}. Estos fondos provienen del UTXOs más pequeños que la comisión de red suministrada." -#: www/views/preferencesGlobal.html -msgid "About Copay" -msgstr "Acerca de Copay" +#: src/js/controllers/preferencesAbout.js:6 +#: www/views/tab-settings.html:159 +msgid "About" +msgstr "Acerca de" -#: www/views/modals/txp-details.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js +#: src/js/services/confirmDialog.js:8 msgid "Accept" msgstr "Aceptar" -#: www/views/preferencesInformation.html +#: src/js/controllers/modals/txpDetails.js:39 +#: src/js/controllers/tx-details.js:65 +msgid "Accepted" +msgstr "Aceptado" + +#: www/views/preferencesInformation.html:59 msgid "Account" msgstr "Cuenta" -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html +#: www/views/join.html:71 +#: www/views/tab-create-personal.html:42 +#: www/views/tab-create-shared.html:72 +#: www/views/tab-import-hardware.html:19 msgid "Account Number" msgstr "Número de cuenta" -#: www/views/walletHome.html -#: src/js/controllers/index.js +#: www/views/bitpayCard.html:51 msgid "Activity" msgstr "Actividad" -#: www/views/modals/addressbook.html -msgid "Add a new entry" -msgstr "Agregar una nueva entrada" +#: src/js/controllers/bitpayCardIntro.js:34 +msgid "Add Account" +msgstr "Agregar Cuenta" -#: www/views/create.html -#: www/views/join.html +#: src/js/controllers/bitpayCardIntro.js:30 +msgid "Add BitPay Card Account?" +msgstr "¿Agregar cuenta de tarjeta BitPay?" + +#: www/views/tab-home.html:155 +msgid "Add BitPay Visa® Card" +msgstr "Añadir tarjeta BitPay Visa®" + +#: www/views/addressbook.add.html:4 +#: www/views/addressbook.html:22 +msgid "Add Contact" +msgstr "Agregar contacto" + +#: www/views/bitpayCard.html:23 +msgid "Add Funds" +msgstr "Añadir fondos" + +#: www/views/confirm.html:72 +msgid "Add Memo" +msgstr "Añadir Nota" + +#: www/views/tab-send.html:42 +msgid "Add a Contact" +msgstr "Agregar un contacto" + +#: www/views/join.html:90 +#: www/views/join.html:99 +#: www/views/tab-create-personal.html:59 +#: www/views/tab-create-personal.html:67 +#: www/views/tab-create-shared.html:89 +#: www/views/tab-create-shared.html:97 msgid "Add a Password" msgstr "Agregar una contraseña" -#: www/views/create.html -#: www/views/join.html +#: www/views/join.html:92 +#: www/views/tab-create-personal.html:61 +#: www/views/tab-create-shared.html:91 msgid "Add an optional password to secure the recovery phrase" msgstr "Agregar una contraseña opcional para asegurar la frase de recuperación" -#: www/views/includes/note.html -#: www/views/modals/tx-details.html -msgid "Add comment" -msgstr "Añadir comentario" +#: src/js/controllers/confirm.js:266 +msgid "Add description" +msgstr "Añadir Descripción" -#: www/views/includes/sidebar.html +#: www/views/add.html:3 msgid "Add wallet" msgstr "Agregar monedero" -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/modals/paypro.html -#: www/views/paymentUri.html +#: www/views/addressbook.view.html:23 +#: www/views/customAmount.html:26 +#: www/views/modals/paypro.html:25 +#: www/views/paymentUri.html:15 msgid "Address" msgstr "Dirección" -#: www/views/preferencesInformation.html +#: www/views/addressbook.html:6 +#: www/views/tab-settings.html:20 +msgid "Address Book" +msgstr "Agenda de contactos" + +#: www/views/preferencesInformation.html:35 msgid "Address Type" msgstr "Tipo de Dirección" -#: www/views/preferences.html +#: www/views/addresses.html:55 +msgid "Addresses With Balance" +msgstr "Direcciones con fondos" + +#: www/views/tab-settings.html:152 msgid "Advanced" msgstr "Avanzado" -#: www/views/preferences.html -msgid "Alias" -msgstr "Alias" +#: www/views/advancedSettings.html:3 +msgid "Advanced Settings" +msgstr "Preferencias Avanzadas" -#: www/views/preferencesAlias.html -msgid "Alias for {{index.walletName}}" -msgstr "Alias de {{index.walletName}}" +#: www/views/bitpayCard.html:57 +msgid "All" +msgstr "Todos" -#: www/views/preferencesLanguage.html -#: www/views/translators.html -msgid "All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at" -msgstr "Todas las contribuciones a la traducción de Copay son bienvenidas. Regístrese en crowdin.com y únase al proyecto Copay en" +#: www/views/allAddresses.html:3 +msgid "All Addresses" +msgstr "Todas las direcciones" -#: www/views/includes/terms.html -msgid "All transaction requests are irreversible." -msgstr "Todas las solicitudes de transacciones son irreversibles." +#: www/views/backupWarning.html:15 +msgid "All clear, let's do this" +msgstr "Todo claro, vamos a hacer esto" -#: www/views/preferencesGlobal.html +#: www/views/tab-receive.html:38 +msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." +msgstr "Todos los dispositivos de los firmantes deben ser agregados a este monedero compartido antes de que se puedan crear direcciones bitcoin." + +#: www/views/onboarding/notifications.html:7 +msgid "Allow notifications" +msgstr "Permitir notificaciones" + +#: www/views/onboarding/disclaimer.html:14 +msgid "Almost done! Let's review." +msgstr "¡Casi listo! Vamos a revisar." + +#: www/views/preferencesAltCurrency.html:4 +#: www/views/tab-settings.html:81 msgid "Alternative Currency" msgstr "Moneda Alternativa" -#: www/views/includes/output.html -#: www/views/modals/customized-amount.html -#: www/views/paymentUri.html -#: www/views/walletHome.html +#: www/views/tab-home.html:138 +msgid "Amazon.com Gift Cards" +msgstr "Tarjetas de regalo de Amazon.com" + +#: www/views/amount.html:43 +#: www/views/customAmount.html:32 +#: www/views/includes/output.html:7 +#: www/views/paymentUri.html:16 msgid "Amount" msgstr "Importe" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:110 msgid "Amount below minimum allowed" msgstr "Cantidad por debajo del mínimo permitido" -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Amount in" -msgstr "Importe en" +#: www/views/tab-home.html:14 +msgid "An update to this app is available" +msgstr "Una actualización de esta aplicación está disponible" -#: src/js/controllers/preferencesDeleteWords.js -msgid "Are you sure you want to delete the recovery phrase?" -msgstr "¿Está seguro que quiere eliminar la frase de recuperación?" +#: www/views/backupWarning.html:14 +msgid "Anyone with your backup phrase can access or spend your bitcoin." +msgstr "Cualquier con tu copia de seguridad puede acceder o gastar tus bitcoins." -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js +#: www/views/backupWarning.html:10 +msgid "Are you being watched?" +msgstr "¿Estás siendo observado?" + +#: src/js/controllers/copayers.js:43 +msgid "Are you sure you want to cancel and delete this wallet?" +msgstr "¿Está seguro que desea cancelar y borrar este monedero?" + +#: src/js/controllers/preferencesDelete.js:11 msgid "Are you sure you want to delete this wallet?" msgstr "¿Estas seguro de borrar este monedero?" -#: www/views/includes/walletInfo.html +#: src/js/controllers/modals/txpDetails.js:127 +msgid "Are you sure you want to reject this transaction?" +msgstr "¿Está seguro de que desea rechazar esta transacción?" + +#: src/js/controllers/modals/txpDetails.js:144 +msgid "Are you sure you want to remove this transaction?" +msgstr "¿Está seguro que desea eliminar esta transacción?" + +#: src/js/controllers/onboarding/backupRequest.js:16 +msgid "Are you sure you want to skip the backup?" +msgstr "¿Está seguro que desea omitir la copia de seguridad?" + +#: src/js/controllers/preferencesBitpayCard.js:7 +msgid "Are you sure you would like to remove your BitPay Card account from this device?" +msgstr "¿Realmente desea eliminar su cuenta de tarjeta de BitPay de este dispositivo?" + +#: www/views/includes/walletInfo.html:3 msgid "Auditable" msgstr "Auditables" -#: www/views/includes/available-balance.html +#: www/views/walletDetails.html:121 +#: www/views/walletDetails.html:60 +msgid "Available" +msgstr "Disponible" + +#: www/views/includes/available-balance.html:3 msgid "Available Balance" msgstr "Balance disponible" -#: www/views/preferencesFee.html -msgid "Average confirmation time: {{fee.nbBlocks * 10}} minutes" -msgstr "Tiempo promedio de confirmación: {{fee.nbBlocks * 10}} minutos" +#: www/views/preferencesFee.html:15 +msgid "Average confirmation time: {{fee.nbBlocks * 10}} minutes" +msgstr "Promedio de tiempo de confirmación: {{fee.nbBlocks * 10}} minutos" -#: www/views/includes/topbar.html -msgid "Back" -msgstr "Volver" - -#: www/views/preferences.html -msgid "Backup" -msgstr "Copia de seguridad" - -#: www/views/backup.html -msgid "Backup failed" -msgstr "Falló la copia de seguridad" - -#: www/views/paperWallet.html -#: www/views/walletHome.html -msgid "Backup Needed" -msgstr "Se requiere hacer copia de seguridad" - -#: www/views/walletHome.html -msgid "Backup now" -msgstr "Realizar copia de seguridad ahora" - -#: src/js/services/profileService.js -msgid "Bad wallet invitation" -msgstr "Invitación incorrecta al monedero" - -#: www/views/preferencesInformation.html -msgid "Balance By Address" -msgstr "Balance por Dirección" - -#: www/views/paperWallet.html -#: www/views/walletHome.html -msgid "Before receiving funds, you must backup your wallet. If this device is lost, it is impossible to access your funds without a backup." -msgstr "Antes de recibir fondos, es necesario hacer una copia de seguridad de su monedero. Si pierde este dispositivo, es imposible tener acceso a sus fondos sin una copia de seguridad." - -#: www/views/preferencesInformation.html -msgid "BETA: Android Key Derivation Test:" -msgstr "BETA: Prueba de derivación de claves Android:" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html +#: www/views/join.html:118 +#: www/views/tab-create-personal.html:85 +#: www/views/tab-create-shared.html:115 +#: www/views/tab-import-phrase.html:46 msgid "BIP32 path for address derivation" msgstr "BIP32 para el camino de derivación de direcciones" -#: www/views/walletHome.html -msgid "Bitcoin address" -msgstr "Dirección bitcoin" +#: www/views/preferences.html:41 +msgid "Backup" +msgstr "Copia de seguridad" -#: www/views/preferencesGlobal.html +#: www/views/includes/backupNeededPopup.html:7 +msgid "Backup Needed" +msgstr "Se requiere hacer copia de seguridad" + +#: www/views/includes/backupNeededPopup.html:9 +msgid "Backup now" +msgstr "Realizar copia de seguridad ahora" + +#: www/views/onboarding/backupRequest.html:11 +#: www/views/tab-export-file.html:87 +msgid "Backup wallet" +msgstr "Copia de seguridad del monedero" + +#: src/js/controllers/bitpayCard.js:140 +msgid "Bad param" +msgstr "Parametro incorrecto" + +#: src/js/services/profileService.js:458 +msgid "Bad wallet invitation" +msgstr "Invitación incorrecta al monedero" + +#: www/views/preferencesInformation.html:89 +msgid "Balance By Address" +msgstr "Balance por Dirección" + +#: www/views/includes/confirmBackupPopup.html:7 +msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." +msgstr "Asegúrese de guardar su frase de recuperación en un lugar seguro. Si se elimina esta aplicación, no se puede recuperar su dinero sin ella." + +#: www/views/addressbook.add.html:38 +msgid "Bitcoin Address" +msgstr "Dirección Bitcoin" + +#: www/views/tab-settings.html:13 +msgid "Bitcoin Exchanges" +msgstr "Bitcoin Exchanges" + +#: www/views/preferencesFee.html:4 +#: www/views/tab-settings.html:92 msgid "Bitcoin Network Fee Policy" msgstr "Política de Comisión de la Red Bitcoin" -#: www/views/preferencesFee.html -msgid "Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." -msgstr "Las transacciones de Bitcoin pueden incluir una comisión colectada por los mineros en la red. Cuanto mayor sea la comisión, mayor será el incentivo para que el minero incluya esa transacción en un bloque. Las comisiones actuales se determinan en base a la carga de la red y a la política seleccionada." - -#: www/views/paymentUri.html +#: www/views/paymentUri.html:10 msgid "Bitcoin URI is NOT valid!" msgstr "¡Bitcoin URI no es válida!" -#: www/views/modals/txp-details.html +#: www/views/tab-settings.html:70 +msgid "Bitcoin Unit" +msgstr "Unidad de Bitcoin" + +#: www/views/onboarding/tour.html:26 +msgid "Bitcoin is a currency." +msgstr "Bitcoin es una moneda." + +#: www/views/onboarding/disclaimer.html:15 +msgid "Bitcoin is different – it cannot be safely held with a bank or web service." +msgstr "Bitcoin es diferente – no se puede resguardar con ningún servicio web o banco." + +#: www/views/onboarding/tour.html:13 +msgid "Bitcoin is secure,
digital money." +msgstr "Bitcoin es seguro,
dinero digital." + +#: www/views/preferencesFee.html:11 +msgid "Bitcoin transactions include a fee collected by miners on the network." +msgstr "Las transacciones Bitcoin incluyen una comisión de red recogida por los mineros en la red." + +#: www/views/modals/txp-details.html:36 msgid "Broadcast Payment" msgstr "Enviar Pago" -#: src/js/services/onGoingProcess.js +#: src/js/controllers/modals/txpDetails.js:41 +#: src/js/controllers/tx-details.js:67 +msgid "Broadcasted" +msgstr "Enviado" + +#: src/js/services/onGoingProcess.js:10 msgid "Broadcasting transaction" msgstr "Finalizando transacción" -#: www/views/unsupported.html +#: www/views/unsupported.html:6 msgid "Browser unsupported" msgstr "Navegador no soportado" -#: www/views/includes/sidebar.html -msgid "Buy and Sell" -msgstr "Comprar y Vender" +#: www/views/tab-home.html:118 +msgid "Buy & Sell Bitcoin" +msgstr "Comprar & Vender Bitcoin" -#: src/js/services/onGoingProcess.js +#: www/views/tab-send.html:15 +msgid "Buy Bitcoin" +msgstr "Comprar Bitcoin" + +#: www/views/tab-home.html:169 +msgid "Buy an Amazon Gift Card" +msgstr "Comprar una tarjeta de regalo de Amazon" + +#: www/views/buyandsell.html:5 +msgid "Buy and sell" +msgstr "Compra y venta" + +#: www/views/tab-home.html:162 +msgid "Buy or Sell Bitcoin" +msgstr "Comprar y vender Bitcoin" + +#: src/js/services/onGoingProcess.js:41 +msgid "Buying Bitcoin..." +msgstr "Comprando Bitcoins..." + +#: src/js/services/onGoingProcess.js:11 msgid "Calculating fee" msgstr "Calculando comisión" -#: www/views/includes/confirm-tx.html -#: www/views/includes/note.html -#: www/views/includes/password.html -#: www/views/modals/addressbook.html -#: www/views/modals/confirmation.html -#: www/views/walletHome.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js +#: src/js/controllers/confirm.js:510 +#: src/js/services/confirmDialog.js:9 +#: src/js/services/popupService.js:58 +#: www/views/addressbook.add.html:10 +#: www/views/feedback/send.html:5 +#: www/views/includes/confirm-tx.html:30 +#: www/views/includes/note.html:6 +#: www/views/includes/password.html:22 +#: www/views/modals/confirmation.html:13 msgid "Cancel" msgstr "Cancelar" -#: www/views/copayers.html -msgid "Cancel and delete the wallet" -msgstr "Cancelar y borrar el monedero" +#: src/js/controllers/onboarding/tour.js:55 +msgid "Cannot Create Wallet" +msgstr "No se pudo crear el monedero" -#: src/js/controllers/walletHome.js -msgid "Cannot create transaction. Insufficient funds" -msgstr "No se puede crear transacciones. Insuficiencia de fondos" - -#: src/js/services/profileService.js +#: src/js/services/profileService.js:454 msgid "Cannot join the same wallet more that once" msgstr "No puede unirse al mismo monedero más de una vez" -#: src/js/controllers/walletHome.js -msgid "Cannot sign: The payment request has expired" -msgstr "No se pudo firmar: la solicitud de pago ha expirado" +#: src/js/controllers/amazon.js:25 +msgid "Card not found" +msgstr "Tarjeta no encontrada" -#: www/views/modals/paypro.html +#: www/views/preferencesBitpayCard.html:10 +#: www/views/tab-home.html:99 +msgid "Cards" +msgstr "Tarjetas" + +#: www/views/modals/paypro.html:29 msgid "Certified by" msgstr "Certificado por" -#: www/views/preferencesAlias.html -msgid "Changing wallet alias only affects the local wallet name." -msgstr "Cambiar el alias del monedero solo afecta al nombre del monedero local." - -#: www/views/translators.html -msgid "Chinese" -msgstr "Chino" - -#: www/views/import.html +#: www/views/tab-import-file.html:4 msgid "Choose a backup file from your computer" msgstr "Seleccione el archivo de copia de seguridad de su computadora" -#: www/views/preferencesHistory.html +#: www/views/modals/wallets.html:9 +msgid "Choose your destination wallet" +msgstr "Elegir monedero destino" + +#: www/views/modals/wallets.html:10 +msgid "Choose your source wallet" +msgstr "Elegir monedero de origen" + +#: www/views/backup.html:54 +msgid "Clear" +msgstr "Resetear" + +#: www/views/preferencesHistory.html:23 msgid "Clear cache" msgstr "Limpiar cache" -#: www/views/includes/topbar.html -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/modals/paypro.html -#: www/views/modals/scanner.html -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: www/views/modals/paypro.html:4 +#: www/views/modals/wallets.html:5 msgid "Close" msgstr "Cerrar" -#: www/views/preferences.html +#: www/views/preferences.html:26 msgid "Color" msgstr "Color" -#: www/views/modals/tx-details.html -msgid "Comment" -msgstr "Comentario" - -#: www/views/preferencesAbout.html +#: www/views/preferencesAbout.html:21 msgid "Commit hash" msgstr "Commit hash" -#: www/views/includes/confirm-tx.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js +#: src/js/controllers/confirm.js:509 +#: src/js/controllers/copayers.js:42 +#: src/js/services/confirmDialog.js:10 +#: www/views/backup.html:53 +#: www/views/backup.html:72 +#: www/views/confirm.html:4 +#: www/views/includes/confirm-tx.html:35 msgid "Confirm" msgstr "Confirmar" -#: www/views/backup.html -msgid "Confirm your wallet recovery phrase" -msgstr "Confirmar frase de recuperación del monedero" +#: www/views/modals/terms.html:26 +#: www/views/onboarding/disclaimer.html:45 +msgid "Confirm & Finish" +msgstr "Confirmar & Terminar" -#: www/views/modals/tx-details.html +#: src/js/services/walletService.js:839 +msgid "Confirm you new spending password" +msgstr "Confirme su contraseña para enviar" + +#: www/views/tx-details.html:77 msgid "Confirmations" msgstr "Confirmaciones" -#: www/views/backup.html -msgid "Congratulations!" -msgstr "¡Felicitaciones!" +#: www/views/walletDetails.html:122 +#: www/views/walletDetails.html:61 +msgid "Confirming" +msgstr "Confirmando" -#: src/js/services/onGoingProcess.js +#: www/views/bitpayCardIntro.html:37 +msgid "Connect my BitPay Card" +msgstr "Conecte mi tarjeta de BitPay" + +#: src/js/services/onGoingProcess.js:12 msgid "Connecting to Coinbase..." msgstr "Conectando a Coinbase..." -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:13 msgid "Connecting to Glidera..." msgstr "Conectando a Glidera..." -#: src/js/services/bwcError.js +#: www/views/glideraUri.html:16 +msgid "Connecting..." +msgstr "Conectando..." + +#: src/js/services/bwcError.js:53 msgid "Connection reset by peer" msgstr "Conexión re establecida" -#: www/views/backup.html +#: www/views/tab-send.html:32 +msgid "Contacts" +msgstr "Contactos" + +#: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "Continuar" -#: src/js/services/bwcError.js +#: www/views/preferencesLanguage.html:26 +#: www/views/translators.html:33 +msgid "Contribute Translations" +msgstr "Contribuir con las traducciones" + +#: src/js/services/bwcError.js:62 msgid "Copayer already in this wallet" msgstr "Ya se encuentra en este monedero" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:77 msgid "Copayer already voted on this spend proposal" msgstr "Ya ha votado en esta propuesta de gasto" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:107 msgid "Copayer data mismatch" msgstr "Discrepancia en los datos del Copayer" -#: www/views/preferencesInformation.html -msgid "Copayers" -msgstr "Copayers" +#: www/views/includes/walletActivity.html:2 +msgid "Copayer joined" +msgstr "Copayer unido" -#: src/js/controllers/copayers.js -#: src/js/controllers/export.js -#: src/js/controllers/preferencesInformation.js -#: src/js/controllers/walletHome.js +#: www/views/preferencesInformation.html:81 +msgid "Copayer {{$index}}" +msgstr "Copayer {{$index}}" + +#: src/js/controllers/copayers.js:64 +#: src/js/controllers/export.js:177 +#: www/views/includes/copyToClipboard.html:4 msgid "Copied to clipboard" msgstr "Copiado al portapapeles" -#: www/views/export.html +#: www/views/tab-export-file.html:92 msgid "Copy this text as it is to a safe place (notepad or email)" msgstr "Copiar el texto como esta en un lugar seguro (bloc de notas o correo electrónico)" -#: www/views/export.html +#: www/views/preferencesLogs.html:11 +#: www/views/tab-export-file.html:76 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" -#: www/views/import.html +#: www/views/tab-import-phrase.html:2 msgid "Could not access the wallet at the server. Please check:" msgstr "No se pudo acceder al monedero del servidor. Por favor verificar:" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:524 msgid "Could not access wallet" msgstr "No se pudo acceder al monedero" -#: src/js/controllers/index.js -msgid "Could not access Wallet Service: Not found" -msgstr "No se pudo acceder a Wallet Service: No encontrado" - -#: src/js/controllers/modals/txpDetails.js +#: src/js/controllers/modals/txpDetails.js:172 msgid "Could not broadcast payment" msgstr "No se pudo enviar el pago" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:41 msgid "Could not build transaction" msgstr "No se pudo construir la transacción" -#: src/js/services/addressService.js +#: src/js/services/walletService.js:755 msgid "Could not create address" msgstr "No se pudo crear la dirección" -#: src/js/controllers/walletHome.js -msgid "Could not create payment proposal" -msgstr "No se pudo crear la propuesta de pago" - -#: src/js/services/profileService.js +#: src/js/services/profileService.js:371 msgid "Could not create using the specified extended private key" msgstr "No se pudo crear el monedero usando la clave privada ingresada" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:381 msgid "Could not create using the specified extended public key" msgstr "No se pudo crear con la clave pública extendida especificada" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:364 msgid "Could not create: Invalid wallet recovery phrase" msgstr "No se pudo crear: frase de recuperación inválida" -#: src/js/controllers/import.js +#: src/js/controllers/import.js:79 msgid "Could not decrypt file, check your password" msgstr "No se pudo descifrar el archivo, verifique su contraseña" -#: src/js/controllers/modals/txpDetails.js +#: src/js/controllers/modals/txpDetails.js:154 msgid "Could not delete payment proposal" msgstr "No se pudo eliminar la propuesta de pago" -#: src/js/controllers/walletHome.js -msgid "Could not fetch payment information" -msgstr "No se pudo obtener información del pago" +#: src/js/services/feeService.js:51 +msgid "Could not get dynamic fee" +msgstr "No se pudo obtener comisión dinámica" -#: src/js/controllers/walletHome.js -msgid "Could not get fee value" -msgstr "No se pudo obtener valor de la comisión" +#: src/js/services/feeService.js:31 +msgid "Could not get dynamic fee for level: {{feeLevel}}" +msgstr "No se pudo obtener comisión dinámica: {{feeLevel}}" -#: src/js/services/profileService.js +#: src/js/controllers/confirm.js:655 +msgid "Could not get the destination bitcoin address" +msgstr "No se pudo obtener la dirección bitcoin destino" + +#: src/js/controllers/bitpayCard.js:68 +#: src/js/controllers/glidera.js:100 +msgid "Could not get transactions" +msgstr "No se pudo obtener las transacciones" + +#: src/js/services/profileService.js:629 +#: src/js/services/profileService.js:660 +#: src/js/services/profileService.js:683 msgid "Could not import" msgstr "No se pudo importar" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:598 msgid "Could not import. Check input file and spending password" msgstr "No se pudo importar. Verifique el archivo y la contraseña para enviar" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:467 msgid "Could not join wallet" msgstr "No se pudo unir al monedero" -#: src/js/controllers/walletHome.js -msgid "Could not recognize a valid Bitcoin QR Code" -msgstr "No se reconoció el código QR de Bitcoin válido" - -#: src/js/controllers/modals/txpDetails.js +#: src/js/controllers/modals/txpDetails.js:134 msgid "Could not reject payment" msgstr "No se pudo rechazar el pago" -#: src/js/controllers/walletHome.js +#: src/js/controllers/preferencesBitpayCard.js:16 +msgid "Could not remove card" +msgstr "No se pudo quitar tarjeta" + +#: src/js/controllers/confirm.js:449 +msgid "Could not send confirmation code to your phone" +msgstr "No se pudo enviar código de confirmación al teléfono" + +#: src/js/controllers/modals/txpDetails.js:120 msgid "Could not send payment" msgstr "No se pudo enviar el pago" -#: src/js/controllers/index.js +#: src/js/controllers/tab-home.js:200 +msgid "Could not update" +msgstr "No se pudo actualizar" + +#: src/js/services/walletService.js:147 msgid "Could not update Wallet" msgstr "No se pudo actualizar el monedero" -#: www/views/walletHome.html -msgid "Create" -msgstr "Crear" +#: www/views/tab-create-personal.html:3 +msgid "Create Personal Wallet" +msgstr "Crear monedero Personal" -#: www/views/create.html -msgid "Create {{requiredCopayers}}-of-{{totalCopayers}} wallet" -msgstr "Crea monedero {{requiredCopayers}}-de-{{totalCopayers}}" +#: www/views/tab-create-shared.html:3 +msgid "Create Shared Wallet" +msgstr "Crear monedero compartido" -#: www/views/add.html -#: www/views/create.html +#: www/views/tab-home.html:66 +msgid "Create a bitcoin wallet" +msgstr "Crear monedero bitcoin" + +#: www/views/tab-send.html:16 +msgid "Create bitcoin wallet" +msgstr "Crear monedero bitcoin" + +#: www/views/tab-create-personal.html:103 msgid "Create new wallet" msgstr "Crear un nuevo monedero" -#: www/views/includes/sidebar.html -msgid "Create, join or import" -msgstr "Crear, unirse o importar" +#: www/views/add.html:22 +msgid "Create shared wallet" +msgstr "Crear monedero compartido" -#: www/views/modals/txp-details.html +#: www/views/tab-create-shared.html:133 +msgid "Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet" +msgstr "Crear monedero {{formData.requiredCopayers}}-de-{{formData.totalCopayers}}" + +#: www/views/modals/txp-details.html:83 +#: www/views/tx-details.html:58 msgid "Created by" msgstr "Creado por" -#: src/js/services/onGoingProcess.js -msgid "Creating transaction" -msgstr "Creando transacción" - -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:17 msgid "Creating Wallet..." msgstr "Creando monedero..." -#: www/views/preferencesFee.html -msgid "Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB" -msgstr "Comisión actual para esta política: {{fee.feePerKBUnit}}/kiB" +#: src/js/services/onGoingProcess.js:16 +msgid "Creating transaction" +msgstr "Creando transacción" -#: www/views/translators.html -msgid "Czech" -msgstr "Checo" +#: www/views/preferencesFee.html:17 +msgid "Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB" +msgstr "Comisión actual para esta política: {{fee.feePerKBUnit}}/kiB" -#: www/views/modals/tx-details.html -msgid "Date" -msgstr "Fecha" +#: www/views/customAmount.html:4 +msgid "Custom Amount" +msgstr "Importe Específico" -#: www/views/paperWallet.html -msgid "Decrypting a paper wallet could take around 5 minutes on this device. please be patient and keep the app open." -msgstr "Descifrar un monedero de papel podría tomar alrededor de 5 minutos en este dispositivo. Por favor, sea paciente y mantenga la aplicación abierta." +#: www/views/preferencesDeleteWallet.html:21 +msgid "Delete" +msgstr "Eliminar" -#: www/views/copayers.html -msgid "Delete it and create a new one" -msgstr "Borrar y crear uno nuevo" - -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:159 msgid "Delete Payment Proposal" msgstr "Eliminar Propuesta de Pago" -#: www/views/preferences.html -msgid "Delete recovery phrase" -msgstr "Eliminar frase de recuperación" - -#: www/views/preferencesDeleteWords.html -msgid "Delete Recovery Phrase" -msgstr "Eliminar Frase de Recuperación" - -#: www/views/preferencesDeleteWallet.html -msgid "Delete wallet" -msgstr "Eliminar monedero" - -#: www/views/preferencesAdvanced.html +#: www/views/preferencesAdvanced.html:28 +#: www/views/preferencesDeleteWallet.html:3 msgid "Delete Wallet" msgstr "Eliminar Monedero" -#: src/js/services/onGoingProcess.js +#: www/views/copayers.html:59 +msgid "Delete it and create a new one" +msgstr "Borrar y crear uno nuevo" + +#: src/js/services/onGoingProcess.js:18 msgid "Deleting Wallet..." msgstr "Eliminando Monedero..." -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html +#: src/js/services/onGoingProcess.js:27 +msgid "Deleting payment proposal" +msgstr "Eliminando la propuesta de pago" + +#: www/views/join.html:116 +#: www/views/tab-create-personal.html:83 +#: www/views/tab-create-shared.html:113 +#: www/views/tab-import-phrase.html:44 msgid "Derivation Path" msgstr "Camino de derivación" -#: www/views/preferencesInformation.html +#: www/views/preferencesInformation.html:41 msgid "Derivation Strategy" msgstr "Estrategia de derivación" -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/walletHome.html -msgid "Description" -msgstr "Descripción" - -#: www/views/modals/coinbase-tx-details.html -#: www/views/modals/customized-amount.html -#: www/views/modals/glidera-tx-details.html -#: www/views/modals/paypro.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: www/views/modals/coinbase-tx-details.html:9 +#: www/views/modals/paypro.html:17 msgid "Details" msgstr "Detalles" -#: www/views/preferences.html -msgid "Disabled" -msgstr "Deshabilitado" +#: www/views/advancedSettings.html:55 +#: www/views/advancedSettings.html:71 +msgid "Development Utilities" +msgstr "Utilidades de desarrollo" -#: www/views/export.html +#: www/views/tab-export-file.html:27 msgid "Do not include private key" msgstr "No incluir la clave privada" -#: www/views/preferencesLanguage.html -#: www/views/translators.html +#: www/views/preferencesLanguage.html:21 +#: www/views/translators.html:28 msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." msgstr "¿No ve su idioma en Crowdin? Contáctese con el encargado del proyecto! Nos encantaría soportar su idioma." -#: www/views/modals/addressbook.html -msgid "Done" -msgstr "Listo" - -#: www/views/export.html +#: www/views/tab-export-file.html:57 msgid "Download" msgstr "Descargar" -#: src/js/services/feeService.js +#: www/views/addresses.html:23 +msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." +msgstr "Cada monedero bitcoin puede generar billones de direcciones desde sus 12 palabras. Una nueva dirección es generada y mostrada automáticamente cada vez que recibe un pago." + +#: src/js/services/feeService.js:10 msgid "Economy" msgstr "Económico" -#: www/views/modals/addressbook.html -msgid "Edit" -msgstr "Editar" +#: www/views/addressbook.add.html:29 +#: www/views/addressbook.view.html:19 +msgid "Email" +msgstr "Correo electrónico" -#: www/views/includes/note.html -#: www/views/modals/tx-details.html -msgid "Edit comment" -msgstr "Editar comentario" +#: www/views/preferencesNotifications.html:38 +msgid "Email Address" +msgstr "Dirección de correo electrónico" -#: www/views/modals/tx-details.html -msgid "Edited by" -msgstr "Editado por" - -#: www/views/preferencesEmail.html -msgid "Email for wallet notifications" -msgstr "Correo electrónico para notificaciones del monedero" - -#: www/views/preferences.html +#: www/views/onboarding/collectEmail.html:9 msgid "Email Notifications" msgstr "Notificaciones por Correo electrónico" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:122 msgid "Empty addresses limit reached. New addresses cannot be generated." msgstr "Se ha alcanzado el límite de direcciones vacías. No se pueden generar nuevas direcciones." -#: www/views/preferencesGlobal.html -msgid "Enable Coinbase Service" -msgstr "Habilitar Coinbase" +#: www/views/advancedSettings.html:17 +msgid "Enable Amazon Integration" +msgstr "Habilitar la integración con Amazon" -#: www/views/preferencesGlobal.html +#: www/views/advancedSettings.html:13 +msgid "Enable BitPay Card Integration" +msgstr "Habilitar Integración con Tarjeta BitPay" + +#: www/views/advancedSettings.html:21 msgid "Enable Glidera Service" msgstr "Habilitar Glidera" -#: www/views/preferencesGlobal.html +#: www/views/tab-scan.html:19 +msgid "Enable camera access in your device settings to get started." +msgstr "Habilitar el acceso de la cámara en su configuración de dispositivo para empezar." + +#: www/views/preferencesNotifications.html:25 +msgid "Enable email notifications" +msgstr "Activar notificaciones de correo electrónico" + +#: www/views/preferencesNotifications.html:14 msgid "Enable push notifications" msgstr "Activar notificaciones push" -#: src/js/controllers/export.js -msgid "Encrypted export file saved" -msgstr "El archivo cifrado se ha exportado y guardado" +#: www/views/tab-scan.html:18 +msgid "Enable the camera to get started." +msgstr "Activar la cámara empezar." -#: www/views/create.html -#: www/views/join.html +#: www/views/advancedSettings.html:10 +msgid "Enabled Integrations" +msgstr "Habilitación de Integraciones" + +#: www/views/join.html:86 +#: www/views/tab-create-personal.html:55 +#: www/views/tab-create-shared.html:85 +msgid "Encrypt with a Password" +msgstr "Encriptar con una contraseña" + +#: www/views/amount.html:4 +msgid "Enter Amount" +msgstr "Ingrese el monto" + +#: src/js/services/walletService.js:852 +#: src/js/services/walletService.js:867 +msgid "Enter Spending Password" +msgstr "Ingrese contraseña para enviar" + +#: src/js/controllers/bitpayCardIntro.js:6 +msgid "Enter Two Factor for BitPay Card" +msgstr "Ingrese Two Factor para BitPay Card" + +#: src/js/services/walletService.js:837 +msgid "Enter new spending password" +msgstr "Ingrese una nueva contraseña para enviar" + +#: www/views/join.html:78 +#: www/views/tab-create-personal.html:48 +#: www/views/tab-create-shared.html:78 msgid "Enter the recovery phrase (BIP39)" msgstr "Introduzca la frase de recuperación (BIP39)" -#: www/views/backup.html +#: www/views/backup.html:62 msgid "Enter your password" msgstr "Ingrese su contraseña" -#: www/views/includes/password.html +#: www/views/includes/password.html:8 msgid "Enter your spending password" msgstr "Introduzca la contraseña para enviar" -#: src/js/controllers/index.js -msgid "Error at Wallet Service" -msgstr "Error en Wallet Service" +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/activity.js:45 +#: src/js/controllers/addressbook.js:50 +#: src/js/controllers/addressbookAdd.js:30 +#: src/js/controllers/addresses.js:24 +#: src/js/controllers/addresses.js:32 +#: src/js/controllers/addresses.js:84 +#: src/js/controllers/addresses.js:85 +#: src/js/controllers/amazon.js:15 +#: src/js/controllers/amazon.js:25 +#: src/js/controllers/amazon.js:46 +#: src/js/controllers/amazon.js:66 +#: src/js/controllers/amount.js:265 +#: src/js/controllers/amount.js:272 +#: src/js/controllers/amount.js:280 +#: src/js/controllers/amount.js:309 +#: src/js/controllers/amount.js:322 +#: src/js/controllers/amount.js:329 +#: src/js/controllers/amount.js:338 +#: src/js/controllers/bitpayCard.js:145 +#: src/js/controllers/bitpayCard.js:68 +#: src/js/controllers/bitpayCardIntro.js:27 +#: src/js/controllers/confirm.js:152 +#: src/js/controllers/confirm.js:165 +#: src/js/controllers/confirm.js:171 +#: src/js/controllers/confirm.js:449 +#: src/js/controllers/confirm.js:460 +#: src/js/controllers/confirm.js:472 +#: src/js/controllers/confirm.js:621 +#: src/js/controllers/confirm.js:649 +#: src/js/controllers/confirm.js:655 +#: src/js/controllers/confirm.js:683 +#: src/js/controllers/confirm.js:689 +#: src/js/controllers/confirm.js:696 +#: src/js/controllers/confirm.js:703 +#: src/js/controllers/confirm.js:721 +#: src/js/controllers/confirm.js:740 +#: src/js/controllers/confirm.js:754 +#: src/js/controllers/confirm.js:797 +#: src/js/controllers/copayers.js:54 +#: src/js/controllers/create.js:101 +#: src/js/controllers/create.js:129 +#: src/js/controllers/create.js:142 +#: src/js/controllers/create.js:149 +#: src/js/controllers/create.js:164 +#: src/js/controllers/create.js:182 +#: src/js/controllers/export.js:110 +#: src/js/controllers/export.js:138 +#: src/js/controllers/export.js:144 +#: src/js/controllers/export.js:155 +#: src/js/controllers/export.js:35 +#: src/js/controllers/export.js:93 +#: src/js/controllers/export.js:99 +#: src/js/controllers/feedback/send.js:23 +#: src/js/controllers/glidera.js:100 +#: src/js/controllers/glidera.js:27 +#: src/js/controllers/glidera.js:82 +#: src/js/controllers/glideraUri.js:13 +#: src/js/controllers/import.js:114 +#: src/js/controllers/import.js:164 +#: src/js/controllers/import.js:192 +#: src/js/controllers/import.js:201 +#: src/js/controllers/import.js:216 +#: src/js/controllers/import.js:228 +#: src/js/controllers/import.js:239 +#: src/js/controllers/import.js:248 +#: src/js/controllers/import.js:261 +#: src/js/controllers/import.js:273 +#: src/js/controllers/import.js:283 +#: src/js/controllers/import.js:293 +#: src/js/controllers/import.js:317 +#: src/js/controllers/import.js:329 +#: src/js/controllers/import.js:50 +#: src/js/controllers/import.js:63 +#: src/js/controllers/import.js:84 +#: src/js/controllers/import.js:96 +#: src/js/controllers/join.js:108 +#: src/js/controllers/join.js:122 +#: src/js/controllers/join.js:129 +#: src/js/controllers/join.js:143 +#: src/js/controllers/join.js:161 +#: src/js/controllers/join.js:86 +#: src/js/controllers/modals/amazonCardDetails.js:10 +#: src/js/controllers/modals/amazonCardDetails.js:32 +#: src/js/controllers/modals/amazonCardDetails.js:40 +#: src/js/controllers/modals/txpDetails.js:113 +#: src/js/controllers/paperWallet.js:47 +#: src/js/controllers/preferencesBitpayCard.js:16 +#: src/js/controllers/preferencesDelete.js:22 +#: src/js/controllers/preferencesFee.js:9 +#: src/js/controllers/preferencesGlidera.js:60 +#: src/js/controllers/tab-home.js:154 +#: src/js/controllers/tab-receive.js:24 +#: src/js/controllers/tabsController.js:7 +#: src/js/controllers/tx-details.js:18 +msgid "Error" +msgstr "Error" -#: src/js/services/profileService.js +#: src/js/controllers/confirm.js:353 +msgid "Error at confirm" +msgstr "Error al confirmar" + +#: src/js/services/profileService.js:424 msgid "Error creating wallet" msgstr "Error al crear monedero" -#: www/views/modals/txp-details.html +#: src/js/controllers/paperWallet.js:41 +msgid "Error scanning funds:" +msgstr "Error al escanear fondos:" + +#: src/js/controllers/paperWallet.js:91 +msgid "Error sweeping wallet:" +msgstr "Error al buscar fondos:" + +#: src/js/services/bwcError.js:143 +msgid "Exceeded daily limit of $500 per user" +msgstr "Se excedió el limite de $500 por usuario" + +#: www/views/advancedSettings.html:40 +msgid "Experimental Features" +msgstr "Características Experimentales" + +#: src/js/controllers/confirm.js:311 +#: www/views/confirm.html:30 +#: www/views/modals/txp-details.html:114 msgid "Expired" msgstr "Expirada" -#: www/views/modals/paypro.html -#: www/views/modals/txp-details.html +#: www/views/modals/paypro.html:52 +#: www/views/modals/txp-details.html:120 msgid "Expires" msgstr "Expira" -#: www/views/export.html -msgid "Export options" -msgstr "Opciones de exportación" - -#: www/views/preferencesHistory.html -msgid "Export to file" -msgstr "Exportar a archivo" - -#: www/views/preferencesAdvanced.html +#: www/views/preferencesAdvanced.html:16 msgid "Export Wallet" msgstr "Exportar Monedero" -#: www/views/export.html +#: www/views/preferencesHistory.html:10 +#: www/views/preferencesHistory.html:13 +msgid "Export to file" +msgstr "Exportar a archivo" + +#: www/views/export.html:3 +msgid "Export wallet" +msgstr "Exportar Monedero" + +#: src/js/services/walletService.js:999 +#: www/views/tab-export-qrCode.html:9 msgid "Exporting via QR not supported for this wallet" msgstr "Exportar vía código QR no es compatible para este monedero" -#: www/views/preferencesInformation.html +#: www/views/preferencesInformation.html:76 msgid "Extended Public Keys" msgstr "Claves Públicas Extendidas" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:19 msgid "Extracting Wallet Information..." msgstr "Obteniendo Información del Monedero..." -#: www/views/export.html +#: src/js/controllers/export.js:110 +#: src/js/controllers/export.js:144 +#: src/js/controllers/export.js:155 +#: src/js/controllers/export.js:99 +#: www/views/tab-export-file.html:4 msgid "Failed to export" msgstr "Error al exportar" -#: www/views/backup.html -msgid "Failed to verify backup. Please check your information" -msgstr "No se pudo comprobar la copia de seguridad. Por favor verifique su información" - -#: www/views/create.html +#: www/views/tab-create-personal.html:14 +#: www/views/tab-create-shared.html:14 msgid "Family vacation funds" msgstr "Fondos para vacaciones en familia" -#: www/views/includes/confirm-tx.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: www/views/includes/confirm-tx.html:19 +#: www/views/modals/txp-details.html:95 +#: www/views/tx-details.html:71 msgid "Fee" msgstr "Comisión" -#: src/js/services/onGoingProcess.js +#: www/views/confirm.html:79 +msgid "Fee: {{feeLevel}}" +msgstr "Comisión: {{feeLevel}}" + +#: src/js/controllers/feedback/send.js:23 +msgid "Feedback could not be submitted. Please try again later." +msgstr "No se pudo enviar la sugerencia. Por favor intente nuevamente." + +#: src/js/services/onGoingProcess.js:20 msgid "Fetching Payment Information" msgstr "Obteniendo información del pago" -#: www/views/export.html -#: www/views/import.html +#: www/views/export.html:11 +#: www/views/import.html:16 msgid "File/Text" msgstr "Archivo/Texto" -#: src/js/services/fingerprintService.js +#: src/js/services/fingerprintService.js:43 +#: src/js/services/fingerprintService.js:48 msgid "Finger Scan Failed" msgstr "Fallo en la verificación de la huella" -#: www/views/backup.html +#: src/js/controllers/feedback/send.js:34 +#: www/views/customAmount.html:9 msgid "Finish" msgstr "Finalizar" -#: www/views/create.html +#: www/views/tab-create-personal.html:95 +#: www/views/tab-create-shared.html:125 msgid "For audit purposes" msgstr "Para propósitos de auditoría" -#: www/views/translators.html +#: www/views/paperWallet.html:34 +msgid "Founds transferred" +msgstr "Fondos transferidos" + +#: www/views/translators.html:13 msgid "French" msgstr "Francés" -#: www/views/export.html +#: www/views/confirm.html:60 +#: www/views/confirm.html:62 +#: www/views/modals/txp-details.html:74 +#: www/views/tx-details.html:48 +msgid "From" +msgstr "Desde" + +#: www/views/tab-export-qrCode.html:5 msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" msgstr "Desde el dispositivo de destino, ir a Agregar monedero > Importar y escanear este código QR" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:74 msgid "Funds are locked by pending spend proposals" msgstr "Los fondos están bloqueados por propuestas de gastos pendientes" -#: www/views/paperWallet.html -msgid "Funds found" -msgstr "Fondos encontrados" +#: www/views/paperWallet.html:16 +msgid "Funds found:" +msgstr "Fondos encontrados:" -#: src/js/services/notificationsService.js -msgid "Funds received" -msgstr "Fondos Recibidos" - -#: www/views/paperWallet.html +#: www/views/paperWallet.html:23 msgid "Funds will be transferred to" msgstr "Los fondos serán transferidos a" -#: www/views/walletHome.html -msgid "Generate new address" -msgstr "Generar nueva dirección" - -#: www/views/modals/customized-amount.html -msgid "Generate QR Code" -msgstr "Generar código QR" - -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:21 msgid "Generating .csv file..." msgstr "Generando archivo .csv..." -#: www/views/translators.html -msgid "German" -msgstr "Alemán" +#: src/js/services/onGoingProcess.js:37 +msgid "Generating new address..." +msgstr "Generando una nueva dirección..." -#: www/views/modals/addressbook.html -msgid "Getting address for wallet {{selectedWalletName}} ..." -msgstr "Obteniendo direcciones para el monedero {{selectedWalletName}} ..." +#: www/views/bitpayCardIntro.html:23 +msgid "Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply." +msgstr "Consigue efectivo local dondequiera que vayas, desde cualquier ATM Visa® compatible. Comisión de parte del ATM pueden ser aplicadas." -#: www/views/includes/sidebar.html -msgid "Global preferences" -msgstr "Preferencias globales" +#: www/views/onboarding/collectEmail.html:15 +msgid "Get news and updates from BitPay" +msgstr "Recibir noticias y actualizaciones de BitPay" -#: www/views/preferences.html -msgid "Hardware wallet" -msgstr "Monedero de Hardware" +#: www/views/onboarding/welcome.html:9 +msgid "Get started" +msgstr "Empezar ahora" -#: www/views/import.html +#: src/js/services/onGoingProcess.js:38 +msgid "Getting addresses..." +msgstr "Consiguiendo direcciones..." + +#: src/js/services/onGoingProcess.js:22 +msgid "Getting fee levels..." +msgstr "Obteniendo niveles de comisión..." + +#: www/views/glidera.html:39 +msgid "Glidera Inc. (Glidera) is providing the service of buying or selling bitcoin to BitPay users. To enable this service, Glidera has registered with US Treasury Department’s FinCEN as a Money Service Business (#31000042625755). Users of BitPay must agree to the service agreement presented by Glidera prior to obtaining Glidera’s service of buying or selling bitcoin." +msgstr "Glidera Inc. (Glidera) provee el servicio para comprar y vender bitcoins a los usuarios de BitPay. Para habilitar este servicio, Glidera se ha registrado con US Treasury Department’s FinCEN como Money Service Business (#31000042625755). Los usuarios de BitPay deben aceptar los términos y condiciones presentados por Glidera, antes de obtener el servicio de compra y venta de bitcoin de éste." + +#: src/js/controllers/bitpayCardIntro.js:35 +#: src/js/controllers/onboarding/backupRequest.js:13 +#: src/js/controllers/onboarding/backupRequest.js:19 +#: www/views/includes/backupLaterPopup.html:4 +msgid "Go back" +msgstr "Volver" + +#: www/views/includes/backupWarningPopup.html:4 +#: www/views/includes/confirmBackupPopup.html:8 +msgid "Got it" +msgstr "Entiendo" + +#: www/views/preferences.html:20 +#: www/views/preferencesInformation.html:47 msgid "Hardware Wallet" msgstr "Monedero Físico" -#: www/views/create.html -#: www/views/export.html -#: www/views/import.html -#: www/views/join.html +#: www/views/import.html:20 +msgid "Hardware wallet" +msgstr "Monedero de Hardware" + +#: www/views/glidera.html:34 +msgid "Have the OAuth Code?" +msgstr "¿Tiene el código OAuth?" + +#: www/views/tab-settings.html:27 +msgid "Help & Support" +msgstr "Ayuda & Soporte" + +#: www/views/addresses.html:29 +msgid "Hide" +msgstr "Ocultar" + +#: www/views/preferences.html:34 +msgid "Hide Balance" +msgstr "Balance Oculto" + +#: www/views/join.html:48 +#: www/views/tab-create-personal.html:25 +#: www/views/tab-create-shared.html:55 +#: www/views/tab-export-file.html:23 +#: www/views/tab-import-file.html:28 +#: www/views/tab-import-hardware.html:31 +#: www/views/tab-import-phrase.html:31 msgid "Hide advanced options" msgstr "Ocultar opciones avanzadas" -#: www/views/disclaimer.html -msgid "I affirm that I have read, understood, and agree with these terms." -msgstr "Confirmo haber leído, entendido y aceptado estos términos." +#: www/views/tabs.html:3 +msgid "Home" +msgstr "Inicio" -#: www/views/disclaimer.html -msgid "I AGREE. GET STARTED" -msgstr "DE ACUERDO. COMENZAR" +#: src/js/controllers/feedback/send.js:55 +#: src/js/controllers/feedback/send.js:59 +#: src/js/controllers/feedback/send.js:63 +msgid "How could we improve your experience?" +msgstr "¿Cómo podríamos mejorar su experiencia?" -#: www/views/import.html +#: www/views/feedback/rateCard.html:3 +msgid "How do you like BitPay?" +msgstr "¿Te gusta BitPay?" + +#: src/js/controllers/feedback/rateCard.js:28 +msgid "I don't like it" +msgstr "No me gusta" + +#: www/views/onboarding/disclaimer.html:44 +msgid "I have read, understood, and agree to the Terms of Use." +msgstr "He leido, entendido y acepto los Terminos de Uso." + +#: www/views/modals/terms.html:22 +msgid "I have read, understood, and agree with the Terms of use." +msgstr "He leído, entendido y acepto los términos de uso." + +#: www/views/join.html:112 +#: www/views/tab-create-personal.html:79 +#: www/views/tab-create-shared.html:109 +msgid "I have written it down" +msgstr "Lo he anotado" + +#: src/js/controllers/feedback/rateCard.js:34 +msgid "I like the app" +msgstr "Me gusta la aplicación" + +#: src/js/controllers/feedback/rateCard.js:25 +msgid "I think this app is terrible." +msgstr "Creo que esta aplicación es terrible." + +#: src/js/controllers/onboarding/backupRequest.js:12 +#: www/views/includes/backupLaterPopup.html:7 +#: www/views/includes/screenshotWarningModal.html:9 +msgid "I understand" +msgstr "Entiendo" + +#: www/views/onboarding/disclaimer.html:21 +msgid "I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase." +msgstr "Entiendo que si esta aplicación se mueve a otro dispositivo o es borrada, mis bitcoins pueden solamente ser recuperados con la frase de copia de seguridad." + +#: www/views/onboarding/disclaimer.html:18 +msgid "I understand that my funds are held securely on this device, not by a company." +msgstr "Entiendo que mis fondos están resguardados en este dispositivo, no por una empresa." + +#: www/views/onboarding/backupRequest.html:12 +msgid "I'll backup my wallet later" +msgstr "Haré la copia de seguridad más tarde" + +#: www/views/includes/backupNeededPopup.html:10 +msgid "I'll do it later" +msgstr "Lo haré más adelante" + +#: www/views/backup.html:29 +msgid "I've written it down" +msgstr "Lo he anotado" + +#: www/views/advancedSettings.html:50 +msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab." +msgstr "Si está habilitado, la tarjeta con Transacciones Recientes - una lista de las transacciones mas recientes de todas sus wallets - aparecerá en su pantalla principal." + +#: www/views/advancedSettings.html:36 +msgid "If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays." +msgstr "Si es habilitado, mis monederos intentarán gastar fondos sin confirmar. Esta opción puede causar retrasos en la transacción." + +#: www/views/includes/backupLaterPopup.html:3 +msgid "If something happens to this device, this app is deleted, or your password forgotten, neither you nor Bitpay can recover your funds." +msgstr "Si algo le pasa a este dispositivo, esta aplicación es eliminada, o olvidó su contraseña, ni usted ni BitPay puede recuperar sus fondos." + +#: src/js/controllers/onboarding/backupRequest.js:11 +msgid "If this device is replaced or this app is deleted, neither you nor BitPay can recover your funds without a backup." +msgstr "Si se sustituye este dispositivo o esta aplicación es eliminada, ni usted ni BitPay podrán recuperar sus fondos sin una copia de seguridad." + +#: www/views/feedback/complete.html:19 +msgid "If you have additional feedback, please let us know by tapping the \"Send feedback\" option in the Settings tab." +msgstr "Si tiene comentarios adicionales, por favor, háganoslo saber pulsando la opción \"Enviar comentarios\" en preferencias." + +#: www/views/includes/screenshotWarningModal.html:8 +msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen." +msgstr "Si usted toma una captura de pantalla, otras aplicaciones podrían ver su copia de seguridad. La forma más acertada es hacer una copia de seguridad con tinta y papel." + +#: www/views/tab-import-hardware.html:42 +#: www/views/tab-import-phrase.html:61 msgid "Import" msgstr "Importar" -#: www/views/import.html +#: www/views/import.html:3 +msgid "Import Wallet" +msgstr "Importar monedero" + +#: www/views/tab-import-file.html:39 msgid "Import backup" msgstr "Importar copia de seguridad" -#: www/views/add.html +#: www/views/add.html:38 msgid "Import wallet" msgstr "Importar monedero" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:23 msgid "Importing Wallet..." msgstr "Importando Monedero..." -#: www/views/includes/terms.html -msgid "In no event shall the authors of the software, employees and affiliates of Bitpay, copyright holders, or BitPay, Inc. be held liable for any claim, damages or other liability, whether in an action of contract, tort, or otherwise, arising from, out of or in connection with the software." -msgstr "En ningún caso los autores, empleados y afiliados de Bitpay, los titulares de derechos de autor, o BitPay, Inc. serán declarados responsables de los reclamos, daños o cualquier otra responsabilidad, ya sea en una acción de contrato, agravio o de otra manera, que surja fuera de la conexión con el software." +#: www/views/backup.html:65 +msgid "In order to verify your wallet backup, please type your password." +msgstr "Con el fin de verificar la copia de seguridad del monedero, por favor escriba su contraseña." -#: www/views/backup.html -msgid "In order to verify your wallet backup, please type your password:" -msgstr "Con el fin de verificar la copia de seguridad del monedero, por favor escriba su contraseña:" +#: www/views/includes/walletSelector.html:18 +#: www/views/tab-home.html:79 +#: www/views/tab-settings.html:114 +msgid "Incomplete" +msgstr "Incompleta" -#: src/js/services/bwcError.js +#: www/views/tab-receive.html:35 +msgid "Incomplete wallet" +msgstr "Monedero Incompleto" + +#: src/js/services/bwcError.js:113 msgid "Incorrect address network" msgstr "Dirección de red incorrecta" #. Trying to import a malformed wallet export QR code -#: src/js/controllers/import.js +#: src/js/controllers/import.js:50 msgid "Incorrect code format" msgstr "Formato de código incorrecto" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:44 +#: www/views/confirm.html:116 msgid "Insufficient funds" msgstr "Fondos insuficientes" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:71 msgid "Insufficient funds for fee" msgstr "Fondos insuficientes para el pago de la comisión" -#: www/views/modals/search.html -#: www/views/walletHome.html +#: www/views/modals/search.html:70 +#: www/views/walletDetails.html:236 msgid "Invalid" msgstr "Inválido" -#: src/js/controllers/create.js -#: src/js/controllers/import.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:149 +#: src/js/controllers/import.js:293 +#: src/js/controllers/join.js:129 msgid "Invalid account number" msgstr "Número de cuenta inválido" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:119 msgid "Invalid address" msgstr "Dirección inválida" -#: src/js/controllers/create.js -#: src/js/controllers/import.js -#: src/js/controllers/join.js +#: src/js/controllers/tabsController.js:7 +msgid "Invalid data" +msgstr "Datos no válidos" + +#: src/js/controllers/create.js:129 +#: src/js/controllers/import.js:228 +#: src/js/controllers/join.js:108 msgid "Invalid derivation path" msgstr "Camino de derivación no válido" -#: src/js/controllers/copayers.js -msgid "Invitation to share a Copay Wallet" -msgstr "Invitación para compartir un monedero de Copay" +#: src/js/controllers/copayers.js:75 +msgid "Invitation to share a {{appName}} Wallet" +msgstr "Invitación para unirse al monedero {{appName}} compartido" -#: www/views/translators.html -msgid "Italian" -msgstr "Italiano" +#: src/js/controllers/feedback/send.js:71 +msgid "Is there anything we could do better?" +msgstr "¿Hay algo que podríamos mejorar?" -#: www/views/translators.html -msgid "Japanese" -msgstr "Japonés" +#: www/views/backup.html:47 +msgid "Is this correct?" +msgstr "¿Es esto correcto?" -#: www/views/create.html -#: www/views/join.html +#: www/views/onboarding/collectEmail.html:22 +msgid "Is this email address correct?" +msgstr "¿Es correcta esta dirección de correo electrónico?" + +#: www/views/addresses.html:29 +msgid "It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers." +msgstr "Es una buena idea evitar rehusar las direcciones- esto protege su privacidad y mantiene tus bitcoins seguro contra hipotéticos ataques de ordenadores cuánticos." + +#: src/js/controllers/backup.js:76 +msgid "It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again." +msgstr "Es importante que usted escriba su frase copia de seguridad correctamente. Si algo le pasa a su monedero, necesitarás de esta para recuperar su dinero. Revise la copia de seguridad y vuelva a intentarlo." + +#: www/views/join.html:18 msgid "John" msgstr "Juan" -#: www/views/join.html +#: www/views/join.html:126 msgid "Join" msgstr "Unirse" -#: src/js/controllers/copayers.js -msgid "Join my Copay wallet. Here is the invitation code: {{secret}} You can download Copay for your phone or desktop at https://copay.io" -msgstr "Únase a mi monedero Copay. Aquí esta el código de invitación: {{secret}}. Puedes descargar Copay a su teléfono o computadora desde https://copay.io" +#: src/js/controllers/copayers.js:70 +msgid "Join my {{appName}} Wallet. Here is the invitation code: {{secret}} You can download {{appName}} for your phone or desktop at {{appUrl}}" +msgstr "Únete a mi monedero {{appName}}. Aquí está el código de invitación: {{secret}} puede descargar {{appName}} para su teléfono o escritorio en {{appUrl}}" -#: www/views/add.html +#: www/views/add.html:30 +#: www/views/join.html:5 msgid "Join shared wallet" msgstr "Unirse a un monedero compartido" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:24 msgid "Joining Wallet..." msgstr "Uniéndose al monedero..." -#: src/js/services/bwcError.js +#: www/views/onboarding/tour.html:17 +msgid "Just scan the code to pay." +msgstr "Escanea y paga." + +#: src/js/services/bwcError.js:116 msgid "Key already associated with an existing wallet" msgstr "La clave ya esta asociada a un monedero existente" -#: www/views/modals/addressbook.html -msgid "Label" -msgstr "Etiqueta" - -#: www/views/preferencesGlobal.html +#: www/views/preferencesLanguage.html:4 +#: www/views/tab-settings.html:60 msgid "Language" msgstr "Idioma" -#: www/views/preferencesInformation.html -msgid "Last Wallet Addresses" -msgstr "Últimas Direcciones del Monedero" +#: www/views/bitpayCard.html:56 +msgid "Last Month" +msgstr "Mes pasado" -#: www/views/backup.html -msgid "Learn more about Copay backups" -msgstr "Más información sobre copias de seguridad en Copay" +#: www/views/backup.html:36 +msgid "Let's verify your backup phrase." +msgstr "Vamos a verificar su frase copia de seguridad." -#: www/views/preferencesFee.html -msgid "Loading..." -msgstr "Cargando..." +#: src/js/services/onGoingProcess.js:35 +msgid "Loading transaction info..." +msgstr "Cargando información de transacción..." -#: www/views/includes/available-balance.html -msgid "locked by pending payments" -msgstr "bloqueado por pagos pendientes" - -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:86 msgid "Locktime in effect. Please wait to create a new spend proposal" msgstr "Bloqueo temporal. Por favor espere para crear una nueva propuesta de gasto" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:89 msgid "Locktime in effect. Please wait to remove this spend proposal" msgstr "Bloqueo temporal. Por favor espere para eliminar esta propuesta de gasto" -#: www/views/paymentUri.html +#: www/views/paymentUri.html:13 msgid "Make a payment to" msgstr "Hacer un pago a" -#: src/js/controllers/index.js +#: src/js/controllers/modals/search.js:61 msgid "Matches:" msgstr "Coincidencias:" -#: src/js/services/profileService.js -msgid "me" -msgstr "yo" - -#: www/views/includes/copayers.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/preferencesInformation.html +#: www/views/includes/copayers.html:4 +#: www/views/preferencesInformation.html:72 msgid "Me" msgstr "Yo" -#: www/views/modals/paypro.html +#: src/js/controllers/feedback/rateCard.js:31 +msgid "Meh - it's alright" +msgstr "Buu - está bien" + +#: src/js/controllers/tx-details.js:100 +#: www/views/modals/paypro.html:48 +#: www/views/modals/txp-details.html:89 +#: www/views/tx-details.html:64 msgid "Memo" msgstr "Nota" -#: www/views/modals/tx-details.html -msgid "Merchant message" +#: www/views/modals/txp-details.html:126 +msgid "Merchant Message" msgstr "Mensaje del negocio" -#: www/views/paymentUri.html +#: www/views/paymentUri.html:17 msgid "Message" msgstr "Mensaje" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:134 msgid "Missing parameter" msgstr "Faltan parámetros" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:32 msgid "Missing private keys to sign" msgstr "Faltan las claves privadas para firmar" -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html +#: www/views/preferences.html:56 +#: www/views/preferencesAdvanced.html:3 +msgid "More Options" +msgstr "Más opciones" + +#: www/views/modals/search.html:67 +#: www/views/walletDetails.html:234 msgid "Moved" msgstr "Movido" -#: www/views/includes/confirm-tx.html -#: www/views/modals/txp-details.html +#: src/js/controllers/tx-details.js:24 +msgid "Moved Funds" +msgstr "Fondos movidos" + +#: www/views/includes/confirm-tx.html:13 +#: www/views/modals/txp-details.html:57 msgid "Multiple recipients" msgstr "Varios destinatarios" -#: www/views/walletHome.html -msgid "My Bitcoin address" -msgstr "Mi dirección Bitcoin" - -#: www/views/modals/addressbook.html -msgid "My contacts" -msgstr "Mis contactos" - -#: www/views/modals/addressbook.html -msgid "My wallets" -msgstr "Mis monederos" - -#: www/views/preferencesDeleteWords.html -msgid "Need to do backup" -msgstr "Necesita hacer una copias de seguridad" - -#: www/views/paymentUri.html -msgid "Network" -msgstr "Red" - -#: src/js/services/bwcError.js -msgid "Network connection error" -msgstr "Error de conexión a la red" - -#: src/js/services/notificationsService.js -msgid "New Payment Proposal" -msgstr "Nueva Propuesta de Pago" - -#: src/js/controllers/create.js -#: src/js/controllers/join.js -msgid "New Random Recovery Phrase" -msgstr "Nueva frase de recuperación aleatoria" - -#: www/views/import.html -msgid "No hardware wallets supported on this device" -msgstr "No hay monederos hardware compatibles con este dispositivo" - -#: www/views/walletHome.html -msgid "No transactions yet" -msgstr "Sin transacciones todavía" - -#: src/js/services/feeService.js -msgid "Normal" -msgstr "Normal" - -#: src/js/services/bwcError.js -msgid "Not authorized" -msgstr "No autorizado" - -#: www/views/preferences.html -msgid "Not completed" -msgstr "No completado" - -#: src/js/controllers/walletHome.js -msgid "Not enough funds for fee" -msgstr "No hay suficientes fondos para la comisión" - -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Not valid" -msgstr "No válido" - -#: www/views/includes/output.html -msgid "Note" -msgstr "Nota" - -#: src/js/controllers/walletHome.js -msgid "Note: a total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded" -msgstr "Nota: se excluyeron un total de {{amountAboveMaxSizeStr}}. El tamaño máximo permitido para una transacción se ha excedido" - -#: src/js/controllers/walletHome.js -msgid "Note: a total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." -msgstr "Nota: se excluyeron un total de {{amountBelowFeeStr}}. Estos fondos provienen de UTXOs más pequeños que la tarifa de red suministrada." - -#: www/views/import.html +#: www/views/tab-import-phrase.html:8 msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." msgstr "Nota: Para importar un monedero de un software de tercero, por favor vaya a Añadir Monedero > Crear Monedero, y especificar la frase de recuperación allí." -#: www/views/disclaimer.html -#: www/views/termOfUse.html -msgid "Official English Disclaimer" -msgstr "Renuncia oficial en inglés" +#: www/views/addressbook.add.html:21 +#: www/views/addressbook.view.html:15 +#: www/views/preferences.html:13 +#: www/views/preferencesAlias.html:17 +msgid "Name" +msgstr "Nombre" -#: www/views/modals/tx-status.html +#: www/views/paymentUri.html:18 +msgid "Network" +msgstr "Red" + +#: src/js/services/bwcError.js:47 +msgid "Network connection error" +msgstr "Error de conexión a la red" + +#: www/views/includes/walletActivity.html:43 +msgid "New Proposal" +msgstr "Nueva propuesta de pago" + +#: src/js/controllers/addresses.js:85 +msgid "New address could not be generated. Please try again." +msgstr "No se pudo generar la nueva dirección. Por favor, inténtelo de nuevo." + +#: www/views/add.html:14 +msgid "New personal wallet" +msgstr "Nuevo monedero personal" + +#: www/views/tab-home.html:146 +msgid "Next steps" +msgstr "Próximos pasos" + +#: www/views/onboarding/collectEmail.html:27 +msgid "No" +msgstr "No" + +#: www/views/tab-receive.html:12 +msgid "No Wallet" +msgstr "Sin monedero" + +#: www/views/onboarding/backupRequest.html:5 +msgid "No backup, no bitcoin." +msgstr "Sin copia de seguridad, no bitcoin." + +#: www/views/addressbook.html:19 +msgid "No contacts yet" +msgstr "Aún no hay contactos" + +#: www/views/tab-import-hardware.html:3 +msgid "No hardware wallets supported on this device" +msgstr "No hay monederos hardware compatibles con este dispositivo" + +#: www/views/proposals.html:25 +msgid "No pending proposals" +msgstr "No propuestas de pago pendientes" + +#: www/views/activity.html:25 +msgid "No recent transactions" +msgstr "No hay transacciones recientes" + +#: www/views/walletDetails.html:179 +msgid "No transactions yet" +msgstr "Sin transacciones todavía" + +#: src/js/controllers/amount.js:309 +msgid "No wallet found!" +msgstr "¡No hay monedero!" + +#: www/views/confirm.html:113 +msgid "No wallets available" +msgstr "No hay monederos disponibles" + +#: www/views/paperWallet.html:28 +msgid "No wallets available to receive funds" +msgstr "No hay monederos disponibles para recibir fondos" + +#: src/js/services/feeService.js:9 +msgid "Normal" +msgstr "Normal" + +#: src/js/services/bwcError.js:80 +msgid "Not authorized" +msgstr "No autorizado" + +#: src/js/controllers/confirm.js:171 +msgid "Not enough funds for fee" +msgstr "No hay suficientes fondos para la comisión" + +#: www/views/onboarding/tour.html:45 +msgid "Not even BitPay can access it." +msgstr "Ni BitPay puede acceder a él." + +#: src/js/controllers/paperWallet.js:47 +msgid "Not funds found" +msgstr "Fondos no encontrados" + +#: www/views/feedback/rateApp.html:3 +#: www/views/onboarding/notifications.html:8 +msgid "Not now" +msgstr "Ahora no" + +#: www/views/includes/output.html:15 +msgid "Note" +msgstr "Nota" + +#: www/views/modals/wallets.html:25 +msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" +msgstr "Aviso: solo monederos 1-1 (única firma) pueden ser utilizados para vender bitcoin" + +#: www/views/preferencesNotifications.html:10 +#: www/views/preferencesNotifications.html:3 +#: www/views/tab-settings.html:53 +msgid "Notifications" +msgstr "Notificaciones" + +#: www/views/includes/backupNeededPopup.html:8 +msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." +msgstr "Ahora es un buen momento para realizar la copia de seguridad de tu monedero. Si este dispositivo se pierde, es imposible tener acceso a sus fondos sin una copia de seguridad." + +#: www/views/backupWarning.html:11 +msgid "Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?" +msgstr "Ahora es el momento perfecto para revisar sus alrededores. ¿Ventanas? ¿Cámaras ocultas? ¿Espías?" + +#: src/js/services/popupService.js:15 +#: src/js/services/popupService.js:57 +msgid "OK" +msgstr "OK" + +#: www/views/modals/tx-status.html:12 +#: www/views/modals/tx-status.html:24 +#: www/views/modals/tx-status.html:36 +#: www/views/modals/tx-status.html:46 msgid "OKAY" msgstr "LISTO" -#: www/views/preferencesDeleteWords.html -msgid "Once you have copied your wallet recovery phrase down, it is recommended to delete it from this device." -msgstr "Una vez que ha copiado la frase de recuperación del monedero en un papel, es recomendable eliminarla del dispositivo." +#: www/views/modals/terms.html:15 +#: www/views/termsOfUse.html:12 +msgid "Official English Disclaimer" +msgstr "Renuncia oficial en inglés" -#: www/views/preferencesInformation.html -msgid "Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time." -msgstr "Sólo las direcciones principales aparecen (no las usadas para el vuelto). Las direcciones de esta lista no fueron verificadas localmente en este momento." +#: src/js/controllers/feedback/send.js:58 +msgid "Oh no!" +msgstr "¡Oh no!" -#: www/views/preferencesGlobal.html -msgid "Open Settings app" -msgstr "Abrir Configuración de la Aplicación" +#: www/views/tab-home.html:29 +msgid "On this screen you can see all your wallets, accounts, and assets." +msgstr "En esta pantalla puedes ver tus monederos, cuentas y activos." -#: www/views/walletHome.html -msgid "optional" -msgstr "opcional" +#: www/views/tab-receive.html:41 +msgid "Open wallet" +msgstr "Abrir monedero" -#: www/views/paperWallet.html -msgid "Paper Wallet Private Key" -msgstr "Clave privada del monedero de papel" +#: www/views/bitpayCardIntro.html:34 +msgid "Order the BitPay Card" +msgstr "Solicitar tarjeta de BitPay" -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Participants" -msgstr "Participantes" - -#: www/views/paperWallet.html -msgid "Passphrase" -msgstr "Contraseña" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -#: www/views/paperWallet.html +#: www/views/tab-import-file.html:18 +#: www/views/tab-import-phrase.html:36 msgid "Password" msgstr "Contraseña" -#: src/js/controllers/import.js +#: src/js/controllers/import.js:63 msgid "Password required. Make sure to enter your password in advanced options" msgstr "Contraseña necesaria. Asegúrese de introducir su contraseña en opciones avanzadas" -#: www/views/join.html +#: www/views/join.html:35 msgid "Paste invitation here" msgstr "Pegar invitación aquí" -#: www/views/import.html +#: www/views/tab-import-file.html:13 msgid "Paste the backup plain text code" msgstr "Pegar copia de seguridad en texto plano" -#: www/views/paperWallet.html -msgid "Paste your paper wallet private key here" -msgstr "Pegar la clave privada del monedero aquí" +#: www/views/bitpayCardIntro.html:28 +msgid "Pay 0% fees to turn bitcoin into dollars." +msgstr "Paga 0% de comisión para transformar tus bitcoin en dólares." -#: src/js/controllers/walletHome.js -msgid "Pasted from clipboard" -msgstr "Pegado desde el portapapeles" - -#: www/views/modals/paypro.html +#: www/views/modals/paypro.html:21 msgid "Pay To" msgstr "Pagar A" -#: www/views/modals/tx-status.html +#: www/views/modals/tx-status.html:33 msgid "Payment Accepted" msgstr "Pago Aceptado" -#: www/views/modals/txp-details.html -msgid "Payment accepted, but not yet broadcasted" -msgstr "Pago aceptado, pero aún no fue enviado" +#: www/views/confirm.html:28 +msgid "Payment Expires:" +msgstr "Pago expira:" -#: www/views/modals/txp-details.html -msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." -msgstr "Pago aceptado. Se transmitirá por Glidera. En caso de que haya un problema, puede eliminar la transacción 6 horas después de fue creada." - -#: www/views/modals/txp-details.html -msgid "Payment details" -msgstr "Detalles del pago" - -#: www/views/walletHome.html -msgid "Payment expires" -msgstr "Pago expira" - -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:6 msgid "Payment Proposal" msgstr "Propuesta de Pago" -#: www/views/modals/tx-status.html +#: www/views/modals/tx-status.html:21 msgid "Payment Proposal Created" msgstr "Propuesta de Pago Creada" -#: src/js/services/notificationsService.js -msgid "Payment Proposal Rejected" -msgstr "Propuesta de Pago Rechazada" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Rejected by Copayer" -msgstr "Propuesta de Pago Rechazada por Copayer" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Signed by Copayer" -msgstr "Propuesta de Pago Firmada por Copayer" - -#: www/views/walletHome.html +#: www/views/tab-home.html:36 msgid "Payment Proposals" msgstr "Propuestas de Pago" -#: src/js/controllers/walletHome.js +#: src/js/services/payproService.js:42 msgid "Payment Protocol Invalid" msgstr "Protocolo de Pago Inválido" -#: src/js/controllers/walletHome.js +#: src/js/services/payproService.js:18 msgid "Payment Protocol not supported on Chrome App" msgstr "El protocolo de pago no está soportado en Chrome" -#: www/views/modals/tx-status.html -#: www/views/modals/txp-details.html +#: www/views/includes/walletActivity.html:20 +msgid "Payment Received" +msgstr "Pago recibido" + +#: www/views/modals/tx-status.html:43 +#: www/views/modals/txp-details.html:43 msgid "Payment Rejected" msgstr "Pago Rechazado" -#: www/views/modals/paypro.html -msgid "Payment request" -msgstr "Solicitud de pago" - -#: www/views/modals/txp-details.html -#: src/js/services/notificationsService.js +#: www/views/includes/walletActivity.html:11 +#: www/views/modals/txp-details.html:42 msgid "Payment Sent" msgstr "Pago Enviado" -#: www/views/walletHome.html -msgid "Payment to" -msgstr "Pago a" +#: www/views/modals/txp-details.html:32 +msgid "Payment accepted, but not yet broadcasted" +msgstr "Pago aceptado, pero aún no fue enviado" -#: www/views/walletHome.html -msgid "Pending Confirmation" -msgstr "Confirmación Pendiente" +#: www/views/modals/txp-details.html:40 +msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." +msgstr "Pago aceptado. Se transmitirá por Glidera. En caso de que haya un problema, puede eliminar la transacción 6 horas después de fue creada." -#: www/views/preferencesDeleteWallet.html -msgid "Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED" -msgstr "Borrar permanentemente este monedero. ESTA ACCIÓN NO PUEDE SER REVERTIDA" +#: www/views/modals/txp-details.html:102 +msgid "Payment details" +msgstr "Detalles del pago" -#: www/views/create.html -#: src/js/services/profileService.js +#: www/views/modals/paypro.html:6 +msgid "Payment request" +msgstr "Solicitud de pago" + +#: www/views/bitpayCard.html:99 +msgid "Pending" +msgstr "Pendiente" + +#: www/views/proposals.html:5 +msgid "Pending Proposals" +msgstr "Propuestas de pago pendientes" + +#: www/views/preferencesDeleteWallet.html:11 +msgid "Permanently delete this wallet." +msgstr "Eliminar este monedero de forma permanente." + +#: src/js/services/profileService.js:416 msgid "Personal Wallet" msgstr "Monedero Personal" -#: src/js/controllers/import.js +#: www/views/backup.html:18 +msgid "Please carefully write down this phrase." +msgstr "Por favor, escriba con atención esta frase." + +#: www/views/tab-scan.html:20 +msgid "Please connect a camera to get started." +msgstr "Por favor, conecte una cámara para empezar." + +#: src/js/controllers/import.js:239 msgid "Please enter the recovery phrase" msgstr "Por favor ingrese la frase de recuperación" -#: src/js/controllers/create.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:101 +#: src/js/controllers/join.js:86 msgid "Please enter the required fields" msgstr "Por favor ingrese los campos requeridos" -#: src/js/controllers/create.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:142 +#: src/js/controllers/join.js:122 msgid "Please enter the wallet recovery phrase" msgstr "Por favor ingrese la frase de recuperación del monedero" -#: www/views/backup.html -msgid "Please tap the words in order to confirm your backup phrase is correctly written." -msgstr "Por favor presione las palabras para confirmar que su copia de seguridad está correctamente escrita." +#: www/views/backup.html:46 +msgid "Please tap each word in the correct order." +msgstr "Por favor, pulse cada palabra en el orden correcto." -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:101 msgid "Please upgrade Copay to perform this action" msgstr "Por favor actualice Copay para realizar esta acción" -#: www/views/uri.html -msgid "Please wait to be redirected..." -msgstr "Por favor, espere a ser redirigido..." +#: src/js/controllers/confirm.js:453 +msgid "Please, enter the code below" +msgstr "Por favor, introduzca el código" -#: src/js/controllers/import.js +#: src/js/controllers/import.js:201 msgid "Please, select your backup file" msgstr "Por favor, seleccione el archivo de copia de seguridad" -#: www/views/translators.html -msgid "Polish" -msgstr "Polaco" - -#: www/views/paperWallet.html +#: www/views/tab-settings.html:47 msgid "Preferences" msgstr "Preferencias" -#: src/js/controllers/export.js +#: src/js/services/onGoingProcess.js:39 +msgid "Preparing addresses..." +msgstr "Preparando direcciones..." + +#: src/js/controllers/export.js:182 msgid "Preparing backup..." msgstr "Preparando copia de seguridad..." -#: www/views/preferencesHistory.html -msgid "preparing..." -msgstr "preparando..." - -#: src/js/routes.js +#: src/js/routes.js:1099 msgid "Press again to exit" msgstr "Presione nuevamente para salir" -#: src/js/services/feeService.js +#: src/js/services/feeService.js:8 msgid "Priority" msgstr "Prioritario" -#: src/js/services/bwcError.js +#: src/js/controllers/paperWallet.js:142 +msgid "Private key encrypted. Enter password" +msgstr "Clave privada cifrada. Escriba la contraseña" + +#: src/js/services/bwcError.js:35 msgid "Private key is encrypted, cannot sign" msgstr "La clave privada esta encriptada, no puede firmar" -#: www/views/preferencesGlobal.html -msgid "Push notifications for Copay are currently disabled. Enable them in the Settings app." -msgstr "Notificaciones push para Copay están deshabilitadas. Habilitarla en la configuración de la aplicación." +#: www/views/includes/walletActivity.html:51 +msgid "Proposal Accepted" +msgstr "Propuesta Aceptada" -#: www/views/export.html -#: www/views/modals/customized-amount.html +#: src/js/controllers/modals/txpDetails.js:38 +#: src/js/controllers/tx-details.js:64 +msgid "Proposal Created" +msgstr "Propuesta Creada" + +#: www/views/includes/walletActivity.html:27 +msgid "Proposal Deleted" +msgstr "Propuesta Eliminada" + +#: www/views/includes/walletActivity.html:35 +msgid "Proposal Rejected" +msgstr "Propuesta Rechazada" + +#: www/views/walletDetails.html:164 +msgid "Proposals" +msgstr "Propuestas" + +#: www/views/onboarding/notifications.html:3 +msgid "Push Notifications" +msgstr "Notificaciones Push" + +#: www/views/preferencesNotifications.html:19 +msgid "Push notifications for {{appName}} are currently disabled. Enable them in the Settings app." +msgstr "Notificaciones push para {{appName}} están deshabilitadas. Habilitarla en la configuración de la aplicación." + +#: www/views/export.html:14 msgid "QR Code" msgstr "Código QR" -#: www/views/modals/scanner.html -msgid "QR-Scanner" -msgstr "Lector de QR" +#: www/views/onboarding/disclaimer.html:13 +msgid "Quick review!" +msgstr "¡Revisión rápida!" -#: src/js/controllers/index.js +#: src/js/controllers/create.js:70 +#: src/js/controllers/join.js:53 +msgid "Random" +msgstr "Al azar" + +#: www/views/feedback/rateApp.html:14 +msgid "Rate on the app store" +msgstr "Califica en la app store" + +#: www/views/addresses.html:43 +msgid "Read less" +msgstr "Mostrar menos" + +#: www/views/addresses.html:42 +msgid "Read more" +msgstr "Leer más" + +#: www/views/tab-receive.html:3 +#: www/views/tabs.html:7 msgid "Receive" msgstr "Recibir" -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html +#: www/views/modals/search.html:51 +#: www/views/walletDetails.html:220 msgid "Received" msgstr "Recibido" -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: src/js/controllers/tx-details.js:23 +msgid "Received Funds" +msgstr "Fondos recibidos" + +#: www/views/walletDetails.html:242 +msgid "Receiving" +msgstr "Recibiendo" + +#: www/views/bitpayCard.html:55 +#: www/views/walletDetails.html:199 +msgid "Recent" +msgstr "Recientes" + +#: www/views/advancedSettings.html:48 +msgid "Recent Transaction Card" +msgstr "Tarjeta con Transacciones Recientes" + +#: www/views/activity.html:4 +#: www/views/tab-home.html:48 +msgid "Recent Transactions" +msgstr "Transacciones Recientes" + +#: www/views/amount.html:18 +#: www/views/tab-send.html:22 +msgid "Recipient" +msgstr "Destinatario" + +#: www/views/modals/txp-details.html:62 msgid "Recipients" msgstr "Destinatarios" -#: www/views/import.html -msgid "Recovery Phrase" +#: www/views/import.html:12 +msgid "Recovery phrase" msgstr "Frase de Recuperación" -#: src/js/controllers/preferencesDeleteWords.js -msgid "Recovery phrase deleted" -msgstr "Frase de recuperación eliminada" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:114 +#: www/views/walletDetails.html:35 msgid "Recreate" msgstr "Recrear" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:25 msgid "Recreating Wallet..." msgstr "Recreando Monedero..." -#: www/views/modals/txp-details.html -msgid "Reject" -msgstr "Rechazar" +#: src/js/controllers/modals/txpDetails.js:40 +#: src/js/controllers/tx-details.js:66 +msgid "Rejected" +msgstr "Rechazado" -#: www/views/preferencesAbout.html -msgid "Release Information" +#: src/js/services/onGoingProcess.js:26 +msgid "Rejecting payment proposal" +msgstr "Rechazando propuesta de pago" + +#: www/views/preferencesAbout.html:9 +msgid "Release information" msgstr "Información de la versión" -#: www/views/modals/addressbook.html -msgid "Remove" -msgstr "Eliminar" - -#: www/views/export.html +#: www/views/tab-export-file.html:16 msgid "Repeat password" msgstr "Escriba nuevamente la contraseña" -#: www/views/export.html +#: www/views/tab-export-file.html:15 msgid "Repeat the password" msgstr "Repetir la contraseña" -#: www/views/includes/password.html +#: www/views/includes/password.html:5 msgid "Repeat the spending password" msgstr "Repetir la contraseña para enviar" -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Request a specific amount" -msgstr "Solicitar importe específico" +#: www/views/preferences.html:51 +msgid "Request Fingerprint" +msgstr "Solicitar Huella Digital" -#: www/views/preferences.html +#: src/js/controllers/tab-receive.js:153 +msgid "Request Specific amount" +msgstr "Solicitar importe Especifico" + +#: www/views/preferences.html:46 msgid "Request Spending Password" msgstr "Solicitar contraseña para enviar" -#: www/views/join.html -msgid "Required" -msgstr "Requerido" - -#: www/views/create.html +#: www/views/tab-create-shared.html:42 msgid "Required number of signatures" msgstr "Número requerido de firmas" -#: src/js/services/onGoingProcess.js +#: www/views/onboarding/welcome.html:10 +msgid "Restore from backup" +msgstr "Restaurar desde copia de seguridad" + +#: src/js/services/onGoingProcess.js:28 msgid "Retrieving inputs information" msgstr "Recuperando información de las entradas" -#: www/views/translators.html -msgid "Russian" -msgstr "Ruso" +#: src/js/controllers/onboarding/tour.js:59 +msgid "Retry" +msgstr "Vuelva a intentarlo" -#: www/views/includes/note.html -#: www/views/modals/addressbook.html -#: www/views/preferencesAlias.html -#: www/views/preferencesBwsUrl.html -#: www/views/preferencesEmail.html -msgid "Save" -msgstr "Guardar" - -#: www/views/preferencesInformation.html -msgid "Scan addresses for funds" -msgstr "Busca direcciones con fondos" - -#: www/views/preferences.html -msgid "Scan Fingerprint" -msgstr "Lector de huella digital" - -#: src/js/services/notificationsService.js -msgid "Scan Finished" -msgstr "Búsqueda Finalizada" - -#: www/views/walletHome.html -msgid "Scan status finished with error" -msgstr "La búsqueda finalizó con error" - -#: www/views/paperWallet.html -msgid "Scan Wallet Funds" -msgstr "Buscar fondos del monedero" - -#: src/js/services/fingerprintService.js -msgid "Scan your fingerprint please" -msgstr "Por favor ingrese su huella digital" - -#: src/js/services/onGoingProcess.js -msgid "Scanning Wallet funds..." -msgstr "Buscando fondos en el Monedero..." - -#: www/views/modals/search.html -msgid "Search transactions" -msgstr "Buscar transacciones" - -#: www/views/modals/search.html -msgid "Search Transactions" -msgstr "Buscar transacciones" - -#: www/views/preferences.html -msgid "Security preferences" -msgstr "Preferencias de seguridad" - -#: www/views/modals/tx-details.html -msgid "See it on the blockchain" -msgstr "Ver en la blockchain" - -#: www/views/import.html -msgid "Select a backup file" -msgstr "Seleccionar el archivo de copia de seguridad" - -#: www/views/paymentUri.html -msgid "Select a wallet" -msgstr "Seleccionar un monedero" - -#: www/views/modals/paypro.html -msgid "Self-signed Certificate" -msgstr "Certificado autofirmado" - -#: www/views/walletHome.html -#: src/js/controllers/index.js -msgid "Send" -msgstr "Enviar" - -#: www/views/preferencesInformation.html -msgid "Send addresses by email" -msgstr "Enviar las direcciones por email" - -#: www/views/includes/confirm-tx.html -msgid "Send bitcoin" -msgstr "Enviar bitcoin" - -#: www/views/export.html -#: www/views/preferencesLogs.html -msgid "Send by email" -msgstr "Enviar por correo electrónico" - -#: www/views/walletHome.html -msgid "Send Max" -msgstr "Enviar máximo" - -#: www/views/includes/transaction.html -msgid "Sending" -msgstr "Enviando" - -#: src/js/services/onGoingProcess.js -msgid "Sending transaction" -msgstr "Enviando transacción" - -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/modals/tx-status.html -#: www/views/walletHome.html -msgid "Sent" -msgstr "Enviado" - -#: src/js/services/bwcError.js -msgid "Server response could not be verified" -msgstr "La respuesta del servidor no se ha podido verificar" - -#: www/views/preferencesAbout.html -msgid "Session log" -msgstr "Registro de sesión" - -#: www/views/includes/password.html +#: www/views/includes/password.html:31 msgid "SET" msgstr "ESTABLECER" -#: www/views/preferencesBwsUrl.html -msgid "Set default url" -msgstr "Establecer URL predeterminada" +#: www/views/addressbook.add.html:58 +#: www/views/includes/note.html:9 +#: www/views/preferencesAlias.html:21 +#: www/views/preferencesBwsUrl.html:18 +#: www/views/preferencesNotifications.html:42 +msgid "Save" +msgstr "Guardar" -#: www/views/export.html +#: www/views/tab-scan.html:3 +#: www/views/tabs.html:11 +msgid "Scan" +msgstr "Escanear" + +#: www/views/tab-scan.html:15 +msgid "Scan QR Codes" +msgstr "Escanear Código QR" + +#: src/js/controllers/addresses.js:119 +msgid "Scan addresses for funds" +msgstr "Busca direcciones con fondos" + +#: www/views/walletDetails.html:39 +msgid "Scan status finished with error" +msgstr "La búsqueda finalizó con error" + +#: src/js/services/fingerprintService.js:56 +msgid "Scan your fingerprint please" +msgstr "Por favor ingrese su huella digital" + +#: src/js/services/onGoingProcess.js:29 +msgid "Scanning Wallet funds..." +msgstr "Buscando fondos en el Monedero..." + +#: www/views/includes/backupWarningPopup.html:2 +#: www/views/includes/screenshotWarningModal.html:7 +msgid "Screenshots are not secure" +msgstr "Capturas de pantallas no son seguras" + +#: www/views/modals/search.html:6 +msgid "Search Transactions" +msgstr "Buscar transacciones" + +#: www/views/tab-send.html:26 +msgid "Search or enter bitcoin address" +msgstr "Buscar o introducir dirección bitcoin" + +#: www/views/modals/search.html:16 +msgid "Search transactions" +msgstr "Buscar transacciones" + +#: www/views/preferences.html:37 +msgid "Security" +msgstr "Seguridad" + +#: www/views/tab-import-file.html:7 +msgid "Select a backup file" +msgstr "Seleccionar el archivo de copia de seguridad" + +#: www/views/paymentUri.html:30 +msgid "Select a wallet" +msgstr "Seleccionar un monedero" + +#: www/views/modals/paypro.html:38 +msgid "Self-signed Certificate" +msgstr "Certificado autofirmado" + +#: src/js/services/onGoingProcess.js:42 +msgid "Selling Bitcoin..." +msgstr "Vendiendo Bitcoins..." + +#: www/views/feedback/send.html:13 +#: www/views/feedback/send.html:43 +#: www/views/tab-send.html:3 +#: www/views/tabs.html:15 +msgid "Send" +msgstr "Enviar" + +#: www/views/feedback/send.html:3 +#: www/views/tab-settings.html:36 +msgid "Send Feedback" +msgstr "Enviar Sugerencia" + +#: www/views/addressbook.view.html:27 +msgid "Send Money" +msgstr "Enviar dinero" + +#: src/js/controllers/addresses.js:124 +msgid "Send addresses by email" +msgstr "Enviar las direcciones por email" + +#: www/views/includes/confirm-tx.html:3 +msgid "Send bitcoin" +msgstr "Enviar bitcoin" + +#: www/views/preferencesLogs.html:15 +#: www/views/tab-export-file.html:80 +msgid "Send by email" +msgstr "Enviar por correo electrónico" + +#: src/js/controllers/confirm.js:247 +msgid "Send from" +msgstr "Enviar desde" + +#: src/js/controllers/amount.js:97 +msgid "Send max amount" +msgstr "Enviar la máxima cantidad" + +#: www/views/feedback/rateApp.html:17 +msgid "Send us feedback instead" +msgstr "En su lugar, enviar sugerencia" + +#: www/views/confirm.html:15 +#: www/views/includes/txp.html:14 +#: www/views/modals/txp-details.html:19 +#: www/views/walletDetails.html:241 +msgid "Sending" +msgstr "Enviando" + +#: src/js/services/onGoingProcess.js:40 +msgid "Sending 2FA code..." +msgstr "Enviando código 2FA..." + +#: src/js/services/onGoingProcess.js:36 +msgid "Sending feedback..." +msgstr "Enviando sugerencia..." + +#: www/views/confirm.html:16 +msgid "Sending maximum amount" +msgstr "Enviando cantidad máxima" + +#: src/js/services/onGoingProcess.js:30 +msgid "Sending transaction" +msgstr "Enviando transacción" + +#: src/js/controllers/confirm.js:505 +msgid "Sending {{amountStr}} from your {{name}} wallet" +msgstr "Enviando {{amountStr}} desde tu monedero {{name}}" + +#: www/views/modals/search.html:60 +#: www/views/modals/tx-status.html:9 +#: www/views/walletDetails.html:229 +msgid "Sent" +msgstr "Enviado" + +#: src/js/controllers/tx-details.js:22 +msgid "Sent Funds" +msgstr "Fondos enviados" + +#: src/js/services/bwcError.js:38 +msgid "Server response could not be verified" +msgstr "La respuesta del servidor no se ha podido verificar" + +#: www/views/preferencesLogs.html:3 +msgid "Session Log" +msgstr "Registro de sesión" + +#: www/views/preferencesAbout.html:40 +msgid "Session log" +msgstr "Registro de sesión" + +#: www/views/tab-export-file.html:10 msgid "Set up a password" msgstr "Configurar una contraseña" -#: www/views/includes/password.html +#: www/views/includes/password.html:4 msgid "Set up a spending password" msgstr "Configurar contraseña para enviar" -#: www/views/preferencesEmail.html -msgid "Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more." -msgstr "Configurar notificaciones por correo electrónico podría debilitar su privacidad, si el proveedor de Wallet Service se ve comprometido. La información disponible para un atacante incluiría sus direcciones del monedero y su balance, pero no más." - -#: www/views/includes/sidebar.html +#: www/views/tab-settings.html:3 +#: www/views/tabs.html:19 msgid "Settings" msgstr "Configuración" -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Share address" -msgstr "Compartir dirección" +#: www/views/customAmount.html:20 +#: www/views/tab-receive.html:70 +#: www/views/tab-settings.html:43 +msgid "Share" +msgstr "Compartir" -#: www/views/copayers.html +#: www/views/feedback/complete.html:5 +msgid "Share BitPay" +msgstr "Compartir BitPay" + +#: www/views/copayers.html:36 msgid "Share invitation" msgstr "Compartir invitación" -#: www/views/copayers.html +#: www/views/feedback/complete.html:13 +#: www/views/feedback/complete.html:22 +msgid "Share the love by inviting your friends." +msgstr "Comparte la pasión invitando a tus amigos." + +#: www/views/copayers.html:17 msgid "Share this invitation with your copayers" msgstr "Compartir esta invitación con sus copayers" -#: www/views/walletHome.html -msgid "Share this wallet address to receive payments" -msgstr "Compartir esta dirección del monedero para recibir pagos" - -#: www/views/walletHome.html -msgid "Share this wallet address to receive payments. To protect your privacy, new addresses are generated automatically once you use them." -msgstr "Compartir esta dirección para recibir pagos. Para proteger su privacidad, se generan nuevas direcciones automáticamente luego de recibir un pago." - -#: www/views/create.html -#: www/views/import.html +#: www/views/tab-import-hardware.html:24 msgid "Shared Wallet" msgstr "Monedero Compartido" -#: www/views/create.html -#: www/views/export.html -#: www/views/import.html -#: www/views/join.html +#: www/views/join.html:47 +#: www/views/tab-create-personal.html:24 +#: www/views/tab-create-shared.html:54 +#: www/views/tab-export-file.html:22 +#: www/views/tab-import-file.html:27 +#: www/views/tab-import-hardware.html:30 +#: www/views/tab-import-phrase.html:30 msgid "Show advanced options" msgstr "Mostrar opciones avanzadas" -#: src/js/services/bwcError.js +#: www/views/tab-send.html:17 +msgid "Show bitcoin address" +msgstr "Mostrar dirección bitcoin" + +#: www/views/tab-send.html:52 +msgid "Show more" +msgstr "Ver más" + +#: src/js/services/bwcError.js:104 msgid "Signatures rejected by server" msgstr "Firmas rechazadas por el servidor" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:31 msgid "Signing transaction" msgstr "Firmando transacción" -#: www/views/create.html +#: www/views/onboarding/backupRequest.html:6 +msgid "Since only you control your money, you’ll need to save your backup phrase in case this app is deleted." +msgstr "Ya que sólo usted controla su dinero, necesitará guardar su frase copia de seguridad en caso de que esta aplicación sea eliminada." + +#: www/views/tab-create-personal.html:94 +#: www/views/tab-create-shared.html:124 msgid "Single Address Wallet" msgstr "Monedero de una sola dirección" -#: www/views/translators.html +#: www/views/onboarding/collectEmail.html:40 +msgid "Skip" +msgstr "Omitir" + +#: www/views/translators.html:15 msgid "Spanish" msgstr "Español" -#: src/js/controllers/create.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:73 +#: src/js/controllers/join.js:56 msgid "Specify Recovery Phrase..." msgstr "Especificar la frase de recuperación..." -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:92 msgid "Spend proposal is not accepted" msgstr "La propuesta de gasto no se ha aceptado" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:95 msgid "Spend proposal not found" msgstr "La propuesta de gasto no se ha encontrado" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:137 msgid "Spending Password needed" msgstr "Se necesita la contraseña para enviar" -#: src/js/controllers/index.js -msgid "Spending Passwords do not match" -msgstr "Las contraseña para enviar no coinciden" +#: www/views/tab-send.html:11 +msgid "Start sending bitcoin" +msgstr "Empezar a enviar bitcoin" -#: src/js/controllers/copayers.js -#: src/js/controllers/export.js -#: src/js/controllers/import.js -#: src/js/controllers/preferencesDelete.js -msgid "Success" -msgstr "Listo" +#: src/js/routes.js:112 +msgid "Starting..." +msgstr "Empezando..." -#: src/js/services/feeService.js +#: src/js/services/feeService.js:11 msgid "Super Economy" msgstr "Súper Económico" -#: www/views/preferencesAdvanced.html +#: www/views/paperWallet.html:7 +msgid "Sweep" +msgstr "Importar" + +#: www/views/paperWallet.html:3 msgid "Sweep paper wallet" msgstr "Importar monedero en papel" -#: www/views/paperWallet.html -msgid "Sweep Wallet" -msgstr "Importar Monedero" - -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:32 msgid "Sweeping Wallet..." msgstr "Leyendo el Monedero..." -#: www/views/walletHome.html +#: www/views/preferencesDeleteWallet.html:14 +msgid "THIS ACTION CANNOT BE REVERSED" +msgstr "ESTA ACCIÓN NO SE PUEDE REVERTIR" + +#: www/views/onboarding/welcome.html:6 +msgid "Take control of your money,
get started with bitcoin." +msgstr "Toma control sobre tu dinero,
comienza a utilizar bitcoin." + +#: www/views/walletDetails.html:128 +#: www/views/walletDetails.html:70 msgid "Tap and hold to show" msgstr "Tocar y mantener para mostrar" -#: www/views/walletHome.html +#: www/views/walletDetails.html:109 +#: www/views/walletDetails.html:30 +#: www/views/walletDetails.html:40 msgid "Tap to retry" msgstr "Toque para reintentar" -#: www/views/disclaimer.html -#: www/views/preferencesAbout.html +#: www/views/tab-settings.html:142 +msgid "Tell a friend" +msgstr "Recomendar a un amigo" + +#: www/views/termsOfUse.html:3 +msgid "Terms Of Use" +msgstr "Términos de uso" + +#: www/views/modals/terms.html:3 +#: www/views/onboarding/disclaimer.html:29 +#: www/views/onboarding/disclaimer.html:44 +#: www/views/preferencesAbout.html:30 msgid "Terms of Use" msgstr "Términos de Uso" -#: www/views/includes/terms.html -msgid "The authors of the software, employees and affiliates of Bitpay, copyright holders, and BitPay, Inc. cannot retrieve your private keys or passwords if you lose or forget them and cannot guarantee transaction confirmation as they do not have control over the Bitcoin network." -msgstr "Los autores de los software, empleados y afiliados de Bitpay, los titulares de derechos de autor, y BitPay, Inc. no pueden recuperar sus claves privadas o contraseñas si se pierde o se olvida de ellos y no se puede garantizar la confirmación de la transacción, ya que no tienen control sobre la red Bitcoin." +#: www/views/tab-create-personal.html:90 +msgid "Testnet" +msgstr "Testnet" -#: www/views/import.html -msgid "The derivation path" -msgstr "La ruta de derivación" +#: src/js/controllers/feedback/send.js:27 +#: src/js/controllers/feedback/send.js:70 +#: www/views/feedback/complete.html:16 +#: www/views/feedback/rateApp.html:4 +msgid "Thank you!" +msgstr "¡Gracias!" -#: src/js/services/ledger.js +#: src/js/controllers/feedback/send.js:66 +msgid "Thanks!" +msgstr "¡Gracias!" + +#: src/js/controllers/feedback/send.js:67 +msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" +msgstr "Es emocionante escucharlo. Nos encantaría ganar esa quinta estrella de usted – ¿cómo podemos mejorar tu experiencia?" + +#: src/js/services/ledger.js:139 msgid "The Ledger Chrome application is not installed" msgstr "La aplicación Ledger de Chrome no esta instalada" -#: www/views/import.html +#: www/views/tab-import-phrase.html:5 +msgid "The derivation path" +msgstr "La ruta de derivación" + +#: www/views/onboarding/tour.html:32 +msgid "The exchange rate changes with the market." +msgstr "El tipo de cambio varía según el mercado." + +#: www/views/preferencesFee.html:12 +msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." +msgstr "Mientras más grande la comisión, mayor incentivo tiene el minero para agregar tu transacción a un bloque. Las comisiones están determinadas en base a la carga de la red y la política de comisión de la red elegida." + +#: www/views/addresses.html:42 +msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." +msgstr "Se ha alcanzado el número máximo de direcciones no utilizados consecutivas (20). Cuando una de sus direcciones reciba un pago, una nueva dirección se generará y se mostrará en la pestaña 'Recibir'." + +#: www/views/tab-import-phrase.html:4 msgid "The password of the recovery phrase (if set)" msgstr "La contraseña de la frase de recuperación (si existe)" -#: src/js/controllers/walletHome.js +#: src/js/services/walletService.js:951 msgid "The payment was created but could not be completed. Please try again from home screen" msgstr "El pago fue creado pero no se pudo completar. Por favor intente nuevamente desde la pantalla de inicio" -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:26 msgid "The payment was removed by creator" msgstr "El pago fue eliminado por el creador" -#: www/views/create.html -#: www/views/join.html +#: www/views/join.html:101 +#: www/views/tab-create-personal.html:69 +#: www/views/tab-create-shared.html:99 +#: www/views/tab-import-phrase.html:38 msgid "The recovery phrase could require a password to be imported" msgstr "La frase de recuperación podría requerir una contraseña para ser importada" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:56 msgid "The request could not be understood by the server" msgstr "La solicitud no pudo ser comprendida por el servidor" -#: www/views/includes/terms.html -msgid "The software does not constitute an account where BitPay or other third parties serve as financial intermediaries or custodians of your bitcoin." -msgstr "El software no constituye una cuenta donde BitPay u otras terceras partes sirven como intermediarios financieros o custodios de su bitcoin." +#: www/views/addresses.html:43 +msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." +msgstr "El proceso generación de nuevas direcciones se detendrá cuando 20 direcciones se generan de manera consecutiva. Luego, deberá realizar un pago a una de las direcciones sin uso, para obtener una nueva dirección." -#: www/views/includes/terms.html -msgid "The software you are about to use functions as a free, open source, and multi-signature digital wallet." -msgstr "El software que va a utilizar es un monedero digital de código abierto y multi-firmas." - -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:98 msgid "The spend proposal is not pending" msgstr "La propuesta de gasto no esta pendiente" -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -msgid "The wallet \"{{walletName}}\" was deleted" -msgstr "El monedero \"{{walletName}}\" fue eliminado" +#: www/views/preferencesHistory.html:26 +msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" +msgstr "El historial de transacciones y cada nueva transacción entrantes se almacenan en caché en la aplicación. Esta característica limpia y sincroniza otra vez desde el servidor" -#: www/views/import.html -msgid "The Wallet Recovery Phrase could require a password to be imported" -msgstr "La frase de recuperación del monedero podría requerir una contraseña para ser importado" - -#: www/views/import.html +#: www/views/tab-import-phrase.html:6 msgid "The wallet service URL" msgstr "URL de Wallet Service" -#: www/views/paymentUri.html +#: www/views/paymentUri.html:23 msgid "There are no wallets to make this payment" msgstr "No dispone de monederos para realizar este pago" -#: src/js/controllers/index.js -msgid "There is a new version of Copay. Please update" -msgstr "Hay una nueva versión de Copay. Por favor actualizar" - -#: src/js/controllers/import.js +#: src/js/controllers/import.js:192 +#: src/js/controllers/import.js:216 +#: src/js/controllers/import.js:283 msgid "There is an error in the form" msgstr "Hay un error en el formulario" -#: www/views/backup.html +#: src/js/controllers/feedback/send.js:55 +#: src/js/controllers/feedback/send.js:59 +msgid "There's obviously something we're doing wrong." +msgstr "Obviamente hay algo que estamos haciendo mal." + +#: www/views/advancedSettings.html:42 +msgid "These features aren't quite ready for primetime. They may change, stop working, or disappear at any time." +msgstr "Estas características no están absolutamente listas por el momento. Pueden cambiar, dejar de trabajar o desaparecer en cualquier momento." + +#: www/views/advancedSettings.html:57 +msgid "These features make it easier to test complex functionality on all devices. They may be unstable." +msgstr "Estas características hacen más fácil de probar la funcionalidad compleja en todos los dispositivos. Pueden ser inestables." + +#: www/views/advancedSettings.html:73 +msgid "These utilities may be unstable. Proceed at your own risk." +msgstr "Estas utilidades pueden ser inestables. Proceda bajo su propio riesgo." + +#: src/js/controllers/feedback/rateCard.js:37 +msgid "This app is fantastic!" +msgstr "¡Esta aplicación es fantástica!" + +#: www/views/onboarding/tour.html:42 +msgid "This app stores your bitcoin with cutting-edge security." +msgstr "Esta aplicación almacena su bitcoin con seguridad avanzada." + +#: src/js/controllers/confirm.js:438 +msgid "This bitcoin payment request has expired." +msgstr "Esta solicitud de pago ha caducado." + +#: www/views/join.html:108 +#: www/views/tab-create-personal.html:75 +#: www/views/tab-create-shared.html:105 +msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." +msgstr "Esta contraseña no puede ser recuperada. Si pierde la contraseña, no hay ninguna manera de que pueda recuperar sus fondos." + +#: www/views/backup.html:24 msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." msgstr "Esta frase de recuperación fue creada con una contraseña. Para recuperar este monedero, la frase de recuperación y la contraseña son necesarios." -#: www/views/modals/tx-details.html -msgid "This transaction has become invalid; possibly due to a double spend attempt." -msgstr "Esta transacción se ha invalidado; posiblemente debido a un intento de doble gasto." - -#: www/views/walletHome.html +#: www/views/walletDetails.html:113 +#: www/views/walletDetails.html:34 msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." msgstr "Este monedero no esta registrado en el servidor de Bitcore Wallet Service (BWS). Debe recrearlo con la información local disponible." -#: www/views/modals/txp-details.html -msgid "Time" -msgstr "Hora" +#: www/views/modals/txp-details.html:131 +#: www/views/tx-details.html:91 +msgid "Timeline" +msgstr "Línea de tiempo" -#: www/views/includes/output.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/walletHome.html +#: www/views/confirm.html:33 +#: www/views/confirm.html:61 +#: www/views/includes/output.html:2 +#: www/views/modals/txp-details.html:104 +#: www/views/modals/txp-details.html:53 +#: www/views/tx-details.html:37 +#: www/views/tx-details.html:49 msgid "To" msgstr "Para" -#: www/views/backup.html -msgid "To restore this {{index.m}}-{{index.n}} shared wallet you will need" -msgstr "Para restaurar el monedero compartido {{index.m}}-{{index.n}} necesitará" +#: www/views/tab-send.html:12 +msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service." +msgstr "Para empezar, compra bitcoin o comparte tu dirección. Puedes recibir bitcoin desde cualquier monedero o servicio." -#: www/views/includes/terms.html -msgid "To the fullest extent permitted by law, this software is provided “as is” and no representations or warranties can be made of any kind, express or implied, including but not limited to the warranties of merchantability, fitness or a particular purpose and noninfringement." -msgstr "En la máxima medida permitida por la ley, este software se proporciona \"tal cual está\" y no asume la responsabilidad ni ofrece garantías de ningún tipo, expresa o implícita, incluyendo, pero no limitado a las garantías comerciales, de conveniencia o a un propósito particular." +#: www/views/tab-send.html:13 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Para empezar, usted necesitará crear un monedero bitcoin y obtener bitcoins." -#: www/views/walletHome.html -msgid "too long!" -msgstr "¡demasiado largo!" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:171 msgid "Total Locked Balance" msgstr "Balance Total Bloqueado" -#: www/views/create.html +#: www/views/tab-create-shared.html:33 msgid "Total number of copayers" msgstr "Número total de copayers" -#: src/js/services/fingerprintService.js +#: src/js/services/fingerprintService.js:63 +#: src/js/services/fingerprintService.js:68 msgid "Touch ID Failed" msgstr "Falló Touch ID" -#: www/views/modals/tx-details.html +#: src/js/controllers/tx-details.js:6 msgid "Transaction" msgstr "Transacción" -#: src/js/services/bwcError.js -msgid "Transaction already broadcasted" -msgstr "La transacción ya fue enviada" - -#: www/views/preferencesAdvanced.html +#: www/views/preferencesAdvanced.html:24 +#: www/views/preferencesHistory.html:3 msgid "Transaction History" msgstr "Historial de Transacciones" -#: www/views/translators.html +#: src/js/services/bwcError.js:83 +msgid "Transaction already broadcasted" +msgstr "La transacción ya fue enviada" + +#: src/js/controllers/activity.js:45 +#: src/js/controllers/tab-home.js:154 +#: src/js/controllers/tx-details.js:18 +msgid "Transaction not found" +msgstr "Transacción no encontrada" + +#: www/views/tab-send.html:61 +msgid "Transfer to Wallet" +msgstr "Transferir a monedero" + +#: www/views/translators.html:9 msgid "Translation Credits" msgstr "Créditos de traducción" -#: www/views/preferencesAbout.html +#: www/views/preferencesAbout.html:35 +#: www/views/translators.html:3 msgid "Translators" msgstr "Traductores" -#: www/views/backup.html -msgid "Try again" -msgstr "Vuelva a intentarlo" +#: www/views/bitpayCardIntro.html:18 +msgid "Turn bitcoin into dollars, swipe anywhere Visa® is accepted." +msgstr "Convierta Bitcoins en Dólares, use Visa®." -#: www/views/import.html +#: www/views/tab-import-phrase.html:17 msgid "Type the Recovery Phrase (usually 12 words)" msgstr "Escriba la frase de recuperación (normalmente 12 palabras)" -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html +#: www/views/modals/search.html:36 +#: www/views/tx-details.html:79 msgid "Unconfirmed" msgstr "Sin confirmar" -#: www/views/preferencesGlobal.html +#: www/views/preferencesUnit.html:4 msgid "Unit" msgstr "Unidad" -#: www/views/walletHome.html +#: www/views/walletDetails.html:165 msgid "Unsent transactions" msgstr "Transacciones no enviadas" -#: www/views/walletHome.html +#: www/views/addresses.html:35 +msgid "Unused Addresses" +msgstr "Direcciones no utilizadas" + +#: www/views/addresses.html:41 +msgid "Unused Addresses Limit" +msgstr "Limite de direcciones sin uso" + +#: www/views/proposals.html:15 +msgid "Updating pending proposals. Please stand by" +msgstr "Actualizando propuestas de pago pendientes. Por favor, espere" + +#: www/views/walletDetails.html:189 msgid "Updating transaction history. Please stand by." msgstr "Actualizando el historial de transacciones. Por favor aguarde un momento." -#: www/views/walletHome.html -msgid "Updating Wallet..." -msgstr "Actualizando Monedero..." +#: www/views/activity.html:14 +msgid "Updating... Please stand by" +msgstr "Actualizando... Por favor, espere" -#: www/views/preferencesGlobal.html +#: www/views/advancedSettings.html:34 msgid "Use Unconfirmed Funds" msgstr "Utilizar los fondos sin confirmar" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:34 msgid "Validating recovery phrase..." msgstr "Validando la frase de recuperación..." -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:33 msgid "Validating wallet integrity..." msgstr "Validación de integridad del monedero..." -#: www/views/preferencesAbout.html +#: www/views/preferencesAbout.html:14 msgid "Version" msgstr "Versión" -#: www/views/export.html +#: www/views/tab-export-file.html:67 msgid "View" msgstr "Ver" -#: www/views/copayers.html -msgid "Waiting for copayers" -msgstr "Esperando a los demás copayers" +#: www/views/addresses.html:66 +msgid "View All Addresses" +msgstr "Ver todas las direcciones" -#: src/js/services/onGoingProcess.js -msgid "Waiting for Ledger..." -msgstr "Esperando a Ledger..." +#: www/views/tx-details.html:117 +msgid "View on blockchain" +msgstr "Ver en blockchain" -#: src/js/services/onGoingProcess.js -msgid "Waiting for Trezor..." -msgstr "Esperando a Trezor..." - -#: www/views/copayers.html -msgid "Waiting..." -msgstr "Esperando..." - -#: src/js/services/bwcError.js -msgid "Wallet already exists" -msgstr "El monedero ya existe" - -#: src/js/services/profileService.js -msgid "Wallet already in Copay" -msgstr "El monedero ya existe en Copay" - -#: www/views/preferencesInformation.html -msgid "Wallet Configuration (m-n)" -msgstr "Configuración del Monedero (m-n)" - -#: www/views/export.html -msgid "Wallet Export" -msgstr "Exportar Monedero" - -#: www/views/preferencesInformation.html -msgid "Wallet Id" -msgstr "Id del Monedero" - -#: www/views/copayers.html -msgid "Wallet incomplete and broken" -msgstr "Monedero incompleto y roto" - -#: www/views/preferencesAdvanced.html -#: www/views/preferencesInformation.html -msgid "Wallet Information" -msgstr "Información del Monedero" - -#: www/views/join.html -msgid "Wallet Invitation" -msgstr "Invitación para unirse al monedero" - -#: www/views/join.html -msgid "Wallet Invitation is not valid!" -msgstr "¡Invitación no válida!" - -#: src/js/services/bwcError.js -msgid "Wallet is full" -msgstr "El monedero está completo" - -#: src/js/services/bwcError.js -msgid "Wallet is locked" -msgstr "Monedero bloqueado" - -#: src/js/services/bwcError.js -msgid "Wallet is not complete" -msgstr "El monedero no esta completo" - -#: www/views/create.html -msgid "Wallet name" -msgstr "Nombre del monedero" - -#: www/views/preferencesInformation.html -msgid "Wallet Name (at creation)" -msgstr "Nombre del Monedero (al crear)" - -#: src/js/services/bwcError.js -msgid "Wallet needs backup" -msgstr "El monedero requiere copia de seguridad" - -#: www/views/preferencesInformation.html -msgid "Wallet Network" -msgstr "Red del Monedero" - -#: src/js/services/bwcError.js -msgid "Wallet not found" -msgstr "Monedero no encontrado" - -#: src/js/services/bwcError.js -msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" -msgstr "El monedero no esta registrado en Wallet Service. Para volver a crear, utilice \"Crear Monedero\", \"Opciones avanzadas\" e ingrese la frase de recuperación" - -#: src/js/controllers/index.js -msgid "Wallet Preferences" -msgstr "Preferencias del Monedero" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -msgid "Wallet Recovery Phrase" -msgstr "Frase de recuperación del monedero" - -#: src/js/services/bwcError.js -msgid "Wallet Recovery Phrase is invalid" -msgstr "La frase de recuperación es inválida" - -#: www/views/backup.html -#: www/views/preferencesDeleteWords.html -msgid "Wallet recovery phrase not available. You can still export it from Advanced > Export." -msgstr "La frase de recuperación del monedero no está disponible. Todavía puede exportar de avanzado > Exportar." - -#: src/js/services/bwcError.js -msgid "Wallet service not found" -msgstr "Wallet Service no encontrado" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:153 msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." msgstr "ADVERTENCIA: Derivación de la clave no funciona en este dispositivo/monedero. Acciones no pueden realizarse en este monedero." -#: www/views/export.html +#: www/views/tab-export-file.html:43 msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." msgstr "ADVERTENCIA: No incluir la clave privada permite verificar el saldo del monedero, historial de transacciones y crear propuestas de gastos. Sin embargo, no permite aprobar propuestas (firmar), así que los fondos no serán accesibles al exportar." -#: www/views/create.html -#: www/views/join.html -msgid "WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password." -msgstr "ADVERTENCIA: La contraseña no puede ser recuperada. Asegúrese de escribirlo en papel. El monedero no puede ser restaurado sin la contraseña." - -#: www/views/export.html +#: www/views/tab-export-file.html:34 msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." msgstr "ADVERTENCIA: La clave privada de este monedero no está disponible. La exportación permite verificar el saldo del monedero, historial de transacciones y crear propuestas de gastos en la exportación. Sin embargo, no permite aprobar propuestas (firmar), así que los fondos no serán accesibles al exportar." -#: www/views/modals/txp-details.html -msgid "Warning: this transaction has unconfirmed inputs" -msgstr "Advertencia: esta operación tiene entradas sin confirmar" - -#: www/views/modals/paypro.html +#: www/views/modals/paypro.html:42 msgid "WARNING: UNTRUSTED CERTIFICATE" msgstr "ADVERTENCIA: NO ES DE CONFIANZA EL CERTIFICADO" -#: www/views/walletHome.html -msgid "WARNING: Wallet not registered" -msgstr "ADVERTENCIA: Monedero no registrado" +#: src/js/services/onGoingProcess.js:14 +msgid "Waiting for Ledger..." +msgstr "Esperando a Ledger..." -#: www/views/preferencesDeleteWallet.html -#: www/views/preferencesDeleteWords.html +#: src/js/services/onGoingProcess.js:15 +msgid "Waiting for Trezor..." +msgstr "Esperando a Trezor..." + +#: www/views/copayers.html:48 +msgid "Waiting for copayers" +msgstr "Esperando a los demás copayers" + +#: www/views/copayers.html:53 +msgid "Waiting..." +msgstr "Esperando..." + +#: www/views/addresses.html:3 +msgid "Wallet Addresses" +msgstr "Direcciones del Monedero" + +#: www/views/preferencesColor.html:4 +msgid "Wallet Color" +msgstr "Color del Monedero" + +#: www/views/preferencesInformation.html:23 +msgid "Wallet Configuration (m-n)" +msgstr "Configuración del Monedero (m-n)" + +#: www/views/onboarding/collectEmail.html:5 +msgid "Wallet Created" +msgstr "Monedero Creado" + +#: www/views/preferencesInformation.html:17 +msgid "Wallet Id" +msgstr "Id del Monedero" + +#: www/views/preferencesAdvanced.html:12 +#: www/views/preferencesInformation.html:3 +msgid "Wallet Information" +msgstr "Información del Monedero" + +#: www/views/join.html:26 +msgid "Wallet Invitation" +msgstr "Invitación para unirse al monedero" + +#: www/views/join.html:59 +#: www/views/tab-create-personal.html:35 +#: www/views/tab-create-shared.html:65 +msgid "Wallet Key" +msgstr "Llave de Monedero" + +#: www/views/preferencesAlias.html:4 +msgid "Wallet Name" +msgstr "Nombre del Monedero" + +#: www/views/preferencesInformation.html:11 +msgid "Wallet Name (at creation)" +msgstr "Nombre del Monedero (al crear)" + +#: www/views/preferencesInformation.html:29 +msgid "Wallet Network" +msgstr "Red del Monedero" + +#: www/views/advancedSettings.html:31 +msgid "Wallet Operation" +msgstr "Operaciones con tu Monedero" + +#: www/views/join.html:76 +#: www/views/tab-create-personal.html:47 +#: www/views/tab-create-shared.html:77 +msgid "Wallet Recovery Phrase" +msgstr "Frase de recuperación del monedero" + +#: src/js/services/bwcError.js:26 +msgid "Wallet Recovery Phrase is invalid" +msgstr "La frase de recuperación es inválida" + +#: www/views/preferencesAdvanced.html:20 +msgid "Wallet Service URL" +msgstr "Wallet Service URL" + +#: www/views/preferences.html:4 +msgid "Wallet Settings" +msgstr "Preferencias del Monedero" + +#: www/views/tab-import-hardware.html:11 +msgid "Wallet Type" +msgstr "Tipo de monedero" + +#: src/js/services/bwcError.js:59 +msgid "Wallet already exists" +msgstr "El monedero ya existe" + +#: src/js/services/profileService.js:529 +msgid "Wallet already in Copay" +msgstr "El monedero ya existe en Copay" + +#: www/views/includes/walletActivity.html:6 +msgid "Wallet created" +msgstr "Monedero Creado" + +#: www/views/copayers.html:58 +msgid "Wallet incomplete and broken" +msgstr "Monedero incompleto y roto" + +#: src/js/services/bwcError.js:65 +msgid "Wallet is full" +msgstr "El monedero está completo" + +#: src/js/services/bwcError.js:125 +msgid "Wallet is locked" +msgstr "Monedero bloqueado" + +#: src/js/services/bwcError.js:128 +msgid "Wallet is not complete" +msgstr "El monedero no esta completo" + +#: www/views/tab-create-personal.html:12 +#: www/views/tab-create-shared.html:12 +msgid "Wallet name" +msgstr "Nombre del monedero" + +#: src/js/services/bwcError.js:131 +msgid "Wallet needs backup" +msgstr "El monedero requiere copia de seguridad" + +#: www/views/tab-receive.html:56 +#: www/views/walletDetails.html:145 +msgid "Wallet not backed up" +msgstr "Monedero sin copia de seguridad" + +#: src/js/services/bwcError.js:68 +msgid "Wallet not found" +msgstr "Monedero no encontrado" + +#: src/js/controllers/tab-home.js:199 +msgid "Wallet not registered" +msgstr "Monedero no registrado" + +#: src/js/services/bwcError.js:29 +msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" +msgstr "El monedero no esta registrado en Wallet Service. Para volver a crear, utilice \"Crear Monedero\", \"Opciones avanzadas\" e ingrese la frase de recuperación" + +#: www/views/backup.html:11 +msgid "Wallet recovery phrase not available." +msgstr "Frase de recuperación del monedero no disponible." + +#: src/js/services/bwcError.js:50 +msgid "Wallet service not found" +msgstr "Wallet Service no encontrado" + +#: www/views/tab-home.html:58 +msgid "Wallets" +msgstr "Monederos" + +#: www/views/tab-settings.html:99 +msgid "Wallets & Integrations" +msgstr "Monederos & Integraciones" + +#: src/js/controllers/modals/txpDetails.js:126 +#: src/js/controllers/modals/txpDetails.js:143 +#: src/js/controllers/preferencesDelete.js:10 +#: www/views/preferencesDeleteWallet.html:9 msgid "Warning!" msgstr "¡Advertencia!" -#: www/views/includes/terms.html -msgid "We reserve the right to modify this disclaimer from time to time." -msgstr "Nos reservamos el derecho a modificar el presente aviso legal de vez en cuando." +#: www/views/modals/txp-details.html:47 +msgid "Warning: this transaction has unconfirmed inputs" +msgstr "Advertencia: esta operación tiene entradas sin confirmar" -#: www/views/disclaimer.html -msgid "WELCOME TO COPAY" -msgstr "BIENVENIDO A COPAY" +#: src/js/controllers/feedback/send.js:63 +msgid "We'd love to do better." +msgstr "Nos encantaría hacerlo mejor." -#: www/views/includes/terms.html -msgid "While the software has undergone beta testing and continues to be improved by feedback from the open-source user and developer community, we cannot guarantee that there will be no bugs in the software." -msgstr "Mientras que el software ha experimentado pruebas en beta y aún sigue mejorando mediante la retroalimentación de la comunidad de desarrollador y usuarios de código abierto, no podemos garantizar que no habrá errores en el software." +#: www/views/backup.html:28 +msgid "We'll confirm on the next screen." +msgstr "Confirmamos en la siguiente pantalla." -#: www/views/backup.html -msgid "Write your wallet recovery phrase" -msgstr "Escriba la frase de recuperación del monedero" +#: src/js/controllers/feedback/send.js:71 +msgid "We're always looking for ways to improve BitPay." +msgstr "Siempre estamos buscando maneras de mejorar BitPay." -#: src/js/controllers/import.js +#: src/js/controllers/feedback/send.js:75 +msgid "We're always looking for ways to improve BitPay. How could we improve your experience?" +msgstr "Siempre estamos buscando maneras de mejorar BitPay. ¿Cómo podríamos mejorar su experiencia?" + +#: www/views/preferencesLanguage.html:16 +#: www/views/translators.html:23 +msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." +msgstr "¡Siempre estamos buscando aportes de traducción! Puede hacer correcciones o ayudar a hacer esta aplicación disponible en su idioma nativo al unirse a nuestra comunidad en Crowdin." + +#: www/views/preferencesAlias.html:11 +msgid "What do you call this wallet?" +msgstr "¿Como desea llamar a este monedero?" + +#: www/views/preferencesAlias.html:12 +msgid "When this wallet was created, it was called “{{walletName}}”. You can change the name displayed on this device below." +msgstr "Cuando fue creado este monedero, se llamaba “{{walletName}}”. Aquí puede cambiar el nombre que se mostrara en este dispositivo." + +#: www/views/onboarding/collectEmail.html:10 +msgid "Where would you like to receive email notifications about payments?" +msgstr "¿A donde le gustaría recibir notificaciones por email sobre sus transacciones?" + +#: www/views/addresses.html:23 +msgid "Why?" +msgstr "¿Por qué?" + +#: www/views/includes/backupLaterPopup.html:2 +msgid "Without a backup, you could lose money" +msgstr "Sin una copia de seguridad, usted podría perder el dinero" + +#: src/js/controllers/onboarding/backupRequest.js:10 +msgid "Without a backup, you could lose money." +msgstr "Sin una copia de seguridad, usted podría perder dinero." + +#: www/views/feedback/rateApp.html:10 +msgid "Would you be willing to rate BitPay in the app store?" +msgstr "¿Estaría usted dispuesto a opinar sobre BitPay en la app store?" + +#: src/js/controllers/bitpayCardIntro.js:31 +msgid "Would you like to add this account ({{email}}) to your wallet?" +msgstr "¿Quieres agregar esta cuenta ({{email}}) a su monedero?" + +#: www/views/onboarding/notifications.html:4 +msgid "Would you like to receive push notifications about payments?" +msgstr "¿Quieres recibir notificaciones push sobre sus transacciones?" + +#: src/js/controllers/import.js:248 msgid "Wrong number of recovery words:" msgstr "Número incorrecto de palabras:" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:140 msgid "Wrong spending password" msgstr "Contraseña para enviar incorrecta" -#: www/views/modals/confirmation.html +#: www/views/modals/confirmation.html:7 +#: www/views/onboarding/collectEmail.html:32 msgid "Yes" msgstr "Si" -#: www/views/includes/terms.html -msgid "You acknowledge that your use of this software is at your own discretion and in compliance with all applicable laws." -msgstr "Usted reconoce que el uso de este software es bajo tu propia responsabilidad y en cumplimiento con todas las leyes aplicables." +#: src/js/controllers/onboarding/backupRequest.js:18 +msgid "Yes, skip backup" +msgstr "Sí, omitir la copia de seguridad" -#: www/views/includes/terms.html -msgid "You are responsible for safekeeping your passwords, private key pairs, PINs and any other codes you use to access the software." -msgstr "Usted es responsable de la custodia de sus contraseñas, pares de claves privadas, PIN y cualquier otro código que se utiliza para acceder al software." +#: src/js/controllers/onboarding/backupRequest.js:17 +msgid "You can create a backup later from your wallet settings." +msgstr "Puede crear una copia de seguridad después en las preferencias de su monedero." -#: www/views/includes/terms.html -msgid "You assume any and all risks associated with the use of the software." -msgstr "Usted asume todos los riesgos asociados con el uso del software." +#: www/views/tab-scan.html:16 +msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." +msgstr "Puede scanear direcciones bitcoin, solicitudes de pago, monederos de papel y más." -#: www/views/backup.html -msgid "You backed up your wallet. You can now restore this wallet at any time." -msgstr "Ya realizó una copia de seguridad de su monedero. Ahora puede restaurarlo en cualquier momento." +#: www/views/onboarding/tour.html:14 +msgid "You can spend bitcoin at millions of websites and stores worldwide." +msgstr "Puede utilizar bitcoins en millones de páginas web y tiendas en todo el mundo." -#: www/views/backup.html -msgid "You can safely install your wallet on another device and use it from multiple devices at the same time." -msgstr "Con seguridad puede instalar su monedero en otro dispositivo y usarlo desde varios dispositivos al mismo tiempo." +#: www/views/backup.html:12 +msgid "You can still export it from Advanced > Export." +msgstr "Todavía puede exportar en Avanzados > Exportar." -#: www/views/walletHome.html -msgid "You do not have any wallet" -msgstr "No tienes ningún monedero" +#: www/views/onboarding/tour.html:27 +msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." +msgstr "Puede cambiarlo por otras monedas como Dólares, Euros o Libras." -#: www/views/backup.html -msgid "You need the wallet recovery phrase to restore this personal wallet. Write it down and keep them somewhere safe." -msgstr "Necesita la frase de recuperación para restaurar su monedero personal. Anótela y guárdela en algún lugar seguro." +#: www/views/onboarding/tour.html:41 +msgid "You control your bitcoin." +msgstr "Tú controlas tus bitcoins." -#: www/views/create.html -#: www/views/join.html +#: www/views/addressbook.html:20 +msgid "You haven’t added any contacts to your address book yet. Get started by adding your first one." +msgstr "Usted aún no ha añadido ningún contacto a su libreta de direcciones. Comenzar agregando el primero de ellos." + +#: www/views/preferencesNotifications.html:30 +msgid "You'll receive email notifications about payments sent and received from your wallets." +msgstr "Usted recibirá notificaciones por correo electrónico acerca de pagos enviados y recibidos de sus monederos." + +#: www/views/includes/confirmBackupPopup.html:6 +msgid "Your bitcoin wallet is backed up!" +msgstr "¡Su monedero bitcoin esta asegurado!" + +#: www/views/tab-home.html:26 +msgid "Your bitcoin wallet is ready!" +msgstr "¡Su monedero bitcoin está listo!" + +#: www/views/tab-create-shared.html:22 +msgid "Your name" +msgstr "Nombre" + +#: www/views/join.html:16 msgid "Your nickname" msgstr "Sobrenombre" -#: www/views/export.html -#: www/views/import.html +#: www/views/tab-export-file.html:11 +#: www/views/tab-import-file.html:20 msgid "Your password" msgstr "Contraseña" -#: www/views/includes/password.html +#: www/views/includes/password.html:12 msgid "Your spending password" msgstr "Contraseña para enviar" -#: src/js/controllers/import.js -msgid "Your wallet has been imported correctly" -msgstr "El monedero se ha importado correctamente" +#: www/views/onboarding/backupRequest.html:10 +msgid "Your wallet is never saved to cloud storage or standard device backups." +msgstr "Tu monedero nunca se guarda en almacenamientos en la nube o dispositivos para copias de seguridad." -#: www/views/includes/password.html +#: www/views/includes/password.html:39 msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down" msgstr "La clave del monedero se cifrará. La contraseña para enviar no puede ser recuperada. Asegúrese de escribirla" -#: www/views/backup.html -msgid "Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend." -msgstr "Su frase de recuperación del monedero y el acceso al servidor que coordina la creación del monedero inicial. Aún necesita de {{index.m}} claves para enviar." +#: www/views/includes/walletSelector.html:23 +#: www/views/includes/wallets.html:13 +#: www/views/tab-home.html:84 +#: www/views/walletDetails.html:127 +#: www/views/walletDetails.html:69 +msgid "[Balance Hidden]" +msgstr "[Balance Oculto]" + +#: www/views/tab-receive.html:48 +msgid "address not yet available" +msgstr "dirección no disponible" + +#: www/views/includes/backupWarningPopup.html:3 +msgid "if you take a screenshot, your backup may be viewed by others apps. You can make a safe backup with paper and a pen." +msgstr "Si usted toma una captura de pantalla, otras aplicaciones podrían ver su copia de seguridad. La forma más acertada es hacer una copia de seguridad con tinta y papel." + +#: www/views/includes/available-balance.html:8 +msgid "locked by pending payments" +msgstr "bloqueado por pagos pendientes" + +#: src/js/services/profileService.js:417 +msgid "me" +msgstr "yo" + +#: www/views/preferencesHistory.html:14 +msgid "preparing..." +msgstr "preparando..." + +#: www/views/includes/confirm-tx.html:23 +msgid "{{feeRateStr}} of the transaction" +msgstr "{{feeRateStr}} de la transacción" + +#: src/js/controllers/confirm.js:185 +msgid "{{fee}} will be deducted for bitcoin networking fees." +msgstr "{{fee}} se descontará por comisión de la red bitcoin." + +#: www/views/walletDetails.html:192 +msgid "{{updatingTxHistoryProgress}} transactions downloaded" +msgstr "{{updatingTxHistoryProgress}} transacciones descargadas" + +#: www/views/copayers.html:46 +#: www/views/includes/walletInfo.html:2 +msgid "{{wallet.m}}-of-{{wallet.n}}" +msgstr "{{wallet.m}}-de-{{wallet.n}}" diff --git a/i18n/po/fr.po b/i18n/po/fr.po index 1fdfb8ee0..4b93aff7f 100644 --- a/i18n/po/fr.po +++ b/i18n/po/fr.po @@ -1,2049 +1,2909 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Project-Id-Version: copay\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: copay\n" -"X-Crowdin-Language: fr\n" -"X-Crowdin-File: template.pot\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Last-Translator: cmgustavo83\n" -"Language-Team: French\n" -"Language: fr\n" -"PO-Revision-Date: 2016-07-15 09:25-0400\n" - -#: www/views/modals/search.html -#: www/views/walletHome.html -msgid "(possible double spend)" -msgstr "(double dépense possible)" - -#: www/views/modals/paypro.html -msgid "(Trusted)" -msgstr "(Fiable)" - -#: www/views/walletHome.html -msgid "[Balance Hidden]" -msgstr "[Solde masqué]" - -#: src/js/controllers/walletHome.js -msgid "{{fee}} will be deducted for bitcoin networking fees" -msgstr "{{fee}} seront déduits pour les frais de réseau Bitcoin" - -#: www/views/includes/confirm-tx.html -msgid "{{feeRateStr}} of the transaction" -msgstr "{{feeRateStr}} de la transaction" - -#: www/views/copayers.html -#: www/views/includes/walletInfo.html -msgid "{{index.m}}-of-{{index.n}}" -msgstr "{{index.m}}-sur-{{index.n}}" - -#: www/views/modals/search.html -msgid "{{index.result.length - index.txHistorySearchResults.length}} more" -msgstr "{{index.result.length - index.txHistorySearchResults.length}} de plus" - -#: www/views/walletHome.html -msgid "{{index.txProgress}} transactions downloaded" -msgstr "{{index.txProgress}} transactions téléchargées" - -#: www/views/includes/sidebar.html -msgid "{{item.m}}-of-{{item.n}}" -msgstr "{{item.m}}-sur-{{item.n}}" - -#: www/views/modals/txp-details.html -msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." -msgstr "* Une proposition de paiement peut être supprimée si vous en êtes le créateur et qu'aucun des autres copayers n'a signé, ou si 24 heures sont passées depuis la création de la proposition." - -#: www/views/includes/terms.html -msgid "IF YOU LOSE ACCESS TO YOUR COPAY WALLET OR YOUR ENCRYPTED PRIVATE KEYS AND YOU HAVE NOT SEPARATELY STORED A BACKUP OF YOUR WALLET AND CORRESPONDING PASSWORD, YOU ACKNOWLEDGE AND AGREE THAT ANY BITCOIN YOU HAVE ASSOCIATED WITH THAT COPAY WALLET WILL BECOME INACCESSIBLE." -msgstr "SI VOUS PERDEZ L'ACCÈS À VOTRE PORTEFEUILLE COPAY OU À VOS CLÉS PRIVÉES CHIFFRÉES ET QUE VOUS N'AVEZ PAS ENTREPOSÉ SÉPARÉMENT UNE SAUVEGARDE DE VOTRE PORTEFEUILLE ET LES MOTS DE PASSE CORRESPONDANT, VOUS RECONNAISSEZ ET ACCEPTEZ QUE LES BITCOINS QUE VOUS AVEZ ASSOCIÉ À CE PORTEFEUILLE COPAY DEVIENNENT INACCESSIBLES." - -#: www/views/backup.html -msgid "OR 1 wallet export file and the remaining quorum of wallet recovery phrases (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet recovery phrases of any of the other copayers)." -msgstr "OU 1 fichier d'exportation de portefeuille et le quorum restant en phrases de récupération de portefeuille (ex. dans un portefeuille 3-5 : 1 fichier d'exportation du portefeuille + 2 phrases de récupération du portefeuille de n'importe quels autres copayers)." - -#: www/views/backup.html -msgid "OR the wallet recovery phrase of all copayers in the wallet" -msgstr "OU la phrase de récupération de portefeuille de tous les copayers du portefeuille" - -#: www/views/backup.html -msgid "OR the wallet recovery phrases of all copayers in the wallet" -msgstr "OU les phrases de récupération de portefeuille de tous les copayers du portefeuille" - -#: www/views/disclaimer.html -msgid "A multisignature bitcoin wallet" -msgstr "Un portefeuille bitcoin multi-signatures" - -#: www/views/preferencesGlobal.html -msgid "About Copay" -msgstr "À propos de Copay" - -#: www/views/modals/txp-details.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js -msgid "Accept" -msgstr "Accepter" - -#: www/views/preferencesInformation.html -msgid "Account" -msgstr "Compte" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -msgid "Account Number" -msgstr "Numéro de compte" - -#: www/views/walletHome.html -#: src/js/controllers/index.js -msgid "Activity" -msgstr "Activité" - -#: www/views/modals/addressbook.html -msgid "Add a new entry" -msgstr "Ajouter une nouvelle entrée" - -#: www/views/create.html -#: www/views/join.html -msgid "Add a Password" -msgstr "Ajouter un mot de passe" - -#: www/views/create.html -#: www/views/join.html -msgid "Add an optional password to secure the recovery phrase" -msgstr "Ajouter un mot de passe optionnel pour sécuriser la phrase de récupération" - -#: www/views/includes/note.html -#: www/views/modals/tx-details.html -msgid "Add comment" -msgstr "Ajouter un commentaire" - -#: www/views/includes/sidebar.html -msgid "Add wallet" -msgstr "Ajouter portefeuille" - -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/modals/paypro.html -#: www/views/paymentUri.html -msgid "Address" -msgstr "Adresse" - -#: www/views/preferencesInformation.html -msgid "Address Type" -msgstr "Type d'adresse" - -#: www/views/preferences.html -msgid "Advanced" -msgstr "Paramètres avancés" - -#: www/views/preferences.html -msgid "Alias" -msgstr "Alias" - -#: www/views/preferencesAlias.html -msgid "Alias for {{index.walletName}}" -msgstr "Alias pour {{index.walletName}}" - -#: www/views/preferencesLanguage.html -#: www/views/translators.html -msgid "All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at" -msgstr "Toutes les contributions à la traduction de Copay sont les bienvenues. Inscrivez-vous sur crowdin.com et rejoignez le projet Copay sur" - -#: www/views/includes/terms.html -msgid "All transaction requests are irreversible." -msgstr "Toutes les transactions sont irréversibles." - -#: www/views/preferencesGlobal.html -msgid "Alternative Currency" -msgstr "Devise alternative" - -#: www/views/includes/output.html -#: www/views/modals/customized-amount.html -#: www/views/paymentUri.html -#: www/views/walletHome.html -msgid "Amount" -msgstr "Montant" - -#: src/js/services/bwcError.js -msgid "Amount below minimum allowed" -msgstr "Montant en dessous du minimum autorisé" - -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Amount in" -msgstr "Montant en" - -#: src/js/controllers/preferencesDeleteWords.js -msgid "Are you sure you want to delete the recovery phrase?" -msgstr "Êtes-vous sûr(e) de vouloir supprimer la phrase de récupération ?" - -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -msgid "Are you sure you want to delete this wallet?" -msgstr "Êtes-vous certain(e) de vouloir supprimer ce portefeuille ?" - -#: www/views/includes/walletInfo.html -msgid "Auditable" -msgstr "Vérifiable" - -#: www/views/includes/available-balance.html -msgid "Available Balance" -msgstr "Solde disponible" - -#: www/views/preferencesFee.html -msgid "Average confirmation time: {{fee.nbBlocks * 10}} minutes" -msgstr "Temps de confirmation moyen : {{fee.nbBlocks * 10}} minutes" - -#: www/views/includes/topbar.html -msgid "Back" -msgstr "Retour" - -#: www/views/preferences.html -msgid "Backup" -msgstr "Sauvegarder" - -#: www/views/backup.html -msgid "Backup failed" -msgstr "La sauvegarde a échoué" - -#: www/views/paperWallet.html -#: www/views/walletHome.html -msgid "Backup Needed" -msgstr "Sauvegarde requise" - -#: www/views/walletHome.html -msgid "Backup now" -msgstr "Sauvegarder" - -#: src/js/services/profileService.js -msgid "Bad wallet invitation" -msgstr "Mauvaise invitation de portefeuille" - -#: www/views/preferencesInformation.html -msgid "Balance By Address" -msgstr "Solde par adresse" - -#: www/views/paperWallet.html -#: www/views/walletHome.html -msgid "Before receiving funds, you must backup your wallet. If this device is lost, it is impossible to access your funds without a backup." -msgstr "Avant de recevoir des fonds, vous devez sauvegarder votre portefeuille. Si vous perdez cet appareil, vos fonds seront irrécupérables sans une sauvegarde." - -#: www/views/preferencesInformation.html -msgid "BETA: Android Key Derivation Test:" -msgstr "BETA: Android Key Derivation Test:" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -msgid "BIP32 path for address derivation" -msgstr "Chemin BIP32 pour la dérivation de l'adresse" - -#: www/views/walletHome.html -msgid "Bitcoin address" -msgstr "Adresse Bitcoin" - -#: www/views/preferencesGlobal.html -msgid "Bitcoin Network Fee Policy" -msgstr "Frais de réseau" - -#: www/views/preferencesFee.html -msgid "Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." -msgstr "Les transactions Bitcoin peuvent inclure des frais prélevés par les mineurs du réseau. Plus les frais sont importants, et plus un mineur sera incité à inclure cette transaction dans un bloc. Les frais actuels sont déterminés en fonction de la charge du réseau et du choix sélectionné." - -#: www/views/paymentUri.html -msgid "Bitcoin URI is NOT valid!" -msgstr "L'URI Bitcoin n'est pas valide !" - -#: www/views/modals/txp-details.html -msgid "Broadcast Payment" -msgstr "Diffuser le paiement" - -#: src/js/services/onGoingProcess.js -msgid "Broadcasting transaction" -msgstr "Diffusion de la transaction" - -#: www/views/unsupported.html -msgid "Browser unsupported" -msgstr "Navigateur non supporté" - -#: www/views/includes/sidebar.html -msgid "Buy and Sell" -msgstr "Acheter et Vendre" - -#: src/js/services/onGoingProcess.js -msgid "Calculating fee" -msgstr "Calcul des frais" - -#: www/views/includes/confirm-tx.html -#: www/views/includes/note.html -#: www/views/includes/password.html -#: www/views/modals/addressbook.html -#: www/views/modals/confirmation.html -#: www/views/walletHome.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js -msgid "Cancel" -msgstr "Annuler" - -#: www/views/copayers.html -msgid "Cancel and delete the wallet" -msgstr "Annuler et supprimer le portefeuille" - -#: src/js/controllers/walletHome.js -msgid "Cannot create transaction. Insufficient funds" -msgstr "Impossible de créer la transaction. Fonds insuffisants" - -#: src/js/services/profileService.js -msgid "Cannot join the same wallet more that once" -msgstr "Impossible de rejoindre le même portefeuille plus d'une fois" - -#: src/js/controllers/walletHome.js -msgid "Cannot sign: The payment request has expired" -msgstr "Impossible de signer : la demande de paiement a expiré" - -#: www/views/modals/paypro.html -msgid "Certified by" -msgstr "Certifié par" - -#: www/views/preferencesAlias.html -msgid "Changing wallet alias only affects the local wallet name." -msgstr "La modification d'un alias de portefeuille affecte uniquement le nom du portefeuille local." - -#: www/views/translators.html -msgid "Chinese" -msgstr "Chinois" - -#: www/views/import.html -msgid "Choose a backup file from your computer" -msgstr "Choisissez un fichier de sauvegarde depuis votre ordinateur" - -#: www/views/preferencesHistory.html -msgid "Clear cache" -msgstr "Vider le cache" - -#: www/views/includes/topbar.html -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/modals/paypro.html -#: www/views/modals/scanner.html -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Close" -msgstr "Fermer" - -#: www/views/preferences.html -msgid "Color" -msgstr "Couleur" - -#: www/views/modals/tx-details.html -msgid "Comment" -msgstr "Commentaire" - -#: www/views/preferencesAbout.html -msgid "Commit hash" -msgstr "Commit hash" - -#: www/views/includes/confirm-tx.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js -msgid "Confirm" -msgstr "Confirmer" - -#: www/views/backup.html -msgid "Confirm your wallet recovery phrase" -msgstr "Confirmez votre phrase de récupération du portefeuille" - -#: www/views/modals/tx-details.html -msgid "Confirmations" -msgstr "Confirmations" - -#: www/views/backup.html -msgid "Congratulations!" -msgstr "Félicitations !" - -#: src/js/services/onGoingProcess.js -msgid "Connecting to Coinbase..." -msgstr "Connexion à Coinbase..." - -#: src/js/services/onGoingProcess.js -msgid "Connecting to Glidera..." -msgstr "Connexion à Glidera..." - -#: src/js/services/bwcError.js -msgid "Connection reset by peer" -msgstr "Connexion réinitialisée par un pair" - -#: www/views/backup.html -msgid "Continue" -msgstr "Continuer" - -#: src/js/services/bwcError.js -msgid "Copayer already in this wallet" -msgstr "Copayer déjà dans ce portefeuille" - -#: src/js/services/bwcError.js -msgid "Copayer already voted on this spend proposal" -msgstr "Le Copayer a déjà voté pour cette proposition de dépense" - -#: src/js/services/bwcError.js -msgid "Copayer data mismatch" -msgstr "Les données Copayer ne correspondent pas" - -#: www/views/preferencesInformation.html -msgid "Copayers" -msgstr "Copayers" - -#: src/js/controllers/copayers.js -#: src/js/controllers/export.js -#: src/js/controllers/preferencesInformation.js -#: src/js/controllers/walletHome.js -msgid "Copied to clipboard" -msgstr "Copié dans le presse-papier" - -#: www/views/export.html -msgid "Copy this text as it is to a safe place (notepad or email)" -msgstr "Copiez ce texte présenté tel quel vers un endroit sûr (bloc-notes ou e-mail)" - -#: www/views/export.html -msgid "Copy to clipboard" -msgstr "Copier dans le presse-papier" - -#: www/views/import.html -msgid "Could not access the wallet at the server. Please check:" -msgstr "Impossible d'accéder au portefeuille via le serveur. Veuillez vérifier :" - -#: src/js/services/profileService.js -msgid "Could not access wallet" -msgstr "Impossible d’accéder au portefeuille" - -#: src/js/controllers/index.js -msgid "Could not access Wallet Service: Not found" -msgstr "Impossible d'accéder au Wallet Service : Introuvable" - -#: src/js/controllers/modals/txpDetails.js -msgid "Could not broadcast payment" -msgstr "Impossible de diffuser le paiement" - -#: src/js/services/bwcError.js -msgid "Could not build transaction" -msgstr "Impossible de créer la transaction" - -#: src/js/services/addressService.js -msgid "Could not create address" -msgstr "Impossible de créer l'adresse" - -#: src/js/controllers/walletHome.js -msgid "Could not create payment proposal" -msgstr "Impossible de créer la proposition de paiement" - -#: src/js/services/profileService.js -msgid "Could not create using the specified extended private key" -msgstr "Impossible de créer en utilisant la clé privée étendue spécifiée" - -#: src/js/services/profileService.js -msgid "Could not create using the specified extended public key" -msgstr "Impossible de créer en utilisant la clé publique étendue spécifiée" - -#: src/js/services/profileService.js -msgid "Could not create: Invalid wallet recovery phrase" -msgstr "Impossible de créer : Phrase de récupération du portefeuille invalide" - -#: src/js/controllers/import.js -msgid "Could not decrypt file, check your password" -msgstr "Impossible de déchiffrer le fichier, vérifiez votre mot de passe" - -#: src/js/controllers/modals/txpDetails.js -msgid "Could not delete payment proposal" -msgstr "Impossible de supprimer la proposition de paiement" - -#: src/js/controllers/walletHome.js -msgid "Could not fetch payment information" -msgstr "Impossible de récupérer les informations de paiement" - -#: src/js/controllers/walletHome.js -msgid "Could not get fee value" -msgstr "Impossible d'obtenir la valeur des frais" - -#: src/js/services/profileService.js -msgid "Could not import" -msgstr "Impossible d'importer" - -#: src/js/services/profileService.js -msgid "Could not import. Check input file and spending password" -msgstr "Impossible d'importer. Vérifiez le fichier d'entrée et le code de dépenses" - -#: src/js/services/profileService.js -msgid "Could not join wallet" -msgstr "Impossible de rejoindre le portefeuille" - -#: src/js/controllers/walletHome.js -msgid "Could not recognize a valid Bitcoin QR Code" -msgstr "Impossible de reconnaître un code QR Bitcoin valide" - -#: src/js/controllers/modals/txpDetails.js -msgid "Could not reject payment" -msgstr "Impossible de rejeter le paiement" - -#: src/js/controllers/walletHome.js -msgid "Could not send payment" -msgstr "Impossible d'envoyer le paiement" - -#: src/js/controllers/index.js -msgid "Could not update Wallet" -msgstr "Impossible de mettre à jour le portefeuille" - -#: www/views/walletHome.html -msgid "Create" -msgstr "Créer" - -#: www/views/create.html -msgid "Create {{requiredCopayers}}-of-{{totalCopayers}} wallet" -msgstr "Créer un portefeuille {{requiredCopayers}}-sur-{{totalCopayers}}" - -#: www/views/add.html -#: www/views/create.html -msgid "Create new wallet" -msgstr "Créer" - -#: www/views/includes/sidebar.html -msgid "Create, join or import" -msgstr "Créer, rejoindre ou importer" - -#: www/views/modals/txp-details.html -msgid "Created by" -msgstr "Créée par" - -#: src/js/services/onGoingProcess.js -msgid "Creating transaction" -msgstr "Création de la transaction" - -#: src/js/services/onGoingProcess.js -msgid "Creating Wallet..." -msgstr "Création du portefeuille..." - -#: www/views/preferencesFee.html -msgid "Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB" -msgstr "Frais actuels pour ce choix : {{fee.feePerKBUnit}}/kiB" - -#: www/views/translators.html -msgid "Czech" -msgstr "Tchèque" - -#: www/views/modals/tx-details.html -msgid "Date" -msgstr "Date" - -#: www/views/paperWallet.html -msgid "Decrypting a paper wallet could take around 5 minutes on this device. please be patient and keep the app open." -msgstr "Le déchiffrement d'un portefeuille de papier peut prendre environ 5 minutes sur cet appareil. Veuillez être patient et gardez l'application ouverte." - -#: www/views/copayers.html -msgid "Delete it and create a new one" -msgstr "Le supprimer et en créer un nouveau" - -#: www/views/modals/txp-details.html -msgid "Delete Payment Proposal" -msgstr "Supprimer la proposition de paiement" - -#: www/views/preferences.html -msgid "Delete recovery phrase" -msgstr "Supprimer la phrase de récupération" - -#: www/views/preferencesDeleteWords.html -msgid "Delete Recovery Phrase" -msgstr "Supprimer la phrase de récupération" - -#: www/views/preferencesDeleteWallet.html -msgid "Delete wallet" -msgstr "Supprimer le portefeuille" - -#: www/views/preferencesAdvanced.html -msgid "Delete Wallet" -msgstr "Supprimer le portefeuille" - -#: src/js/services/onGoingProcess.js -msgid "Deleting Wallet..." -msgstr "Suppression du portefeuille..." - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -msgid "Derivation Path" -msgstr "Chemin de dérivation" - -#: www/views/preferencesInformation.html -msgid "Derivation Strategy" -msgstr "Stratégie de dérivation" - -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/walletHome.html -msgid "Description" -msgstr "Description" - -#: www/views/modals/coinbase-tx-details.html -#: www/views/modals/customized-amount.html -#: www/views/modals/glidera-tx-details.html -#: www/views/modals/paypro.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Details" -msgstr "Détails" - -#: www/views/preferences.html -msgid "Disabled" -msgstr "Désactivé" - -#: www/views/export.html -msgid "Do not include private key" -msgstr "Ne pas inclure la clé privée" - -#: www/views/preferencesLanguage.html -#: www/views/translators.html -msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." -msgstr "Vous ne voyez pas votre langue sur Crowdin ? Contactez le propriétaire sur Crowdin ! Nous serions ravis de prendre en charge votre langue." - -#: www/views/modals/addressbook.html -msgid "Done" -msgstr "Terminé" - -#: www/views/export.html -msgid "Download" -msgstr "Télécharger" - -#: src/js/services/feeService.js -msgid "Economy" -msgstr "Faibles" - -#: www/views/modals/addressbook.html -msgid "Edit" -msgstr "Modifier" - -#: www/views/includes/note.html -#: www/views/modals/tx-details.html -msgid "Edit comment" -msgstr "Modifier le commentaire" - -#: www/views/modals/tx-details.html -msgid "Edited by" -msgstr "Modifié par" - -#: www/views/preferencesEmail.html -msgid "Email for wallet notifications" -msgstr "E-mail pour les notifications de portefeuille" - -#: www/views/preferences.html -msgid "Email Notifications" -msgstr "Notifications e-mail" - -#: src/js/services/bwcError.js -msgid "Empty addresses limit reached. New addresses cannot be generated." -msgstr "La limite d'adresses vides a été atteinte. Les nouvelles adresses ne peuvent plus être générées." - -#: www/views/preferencesGlobal.html -msgid "Enable Coinbase Service" -msgstr "Activer le service Coinbase" - -#: www/views/preferencesGlobal.html -msgid "Enable Glidera Service" -msgstr "Activer le service Glidera" - -#: www/views/preferencesGlobal.html -msgid "Enable push notifications" -msgstr "Autoriser les notifications push" - -#: src/js/controllers/export.js -msgid "Encrypted export file saved" -msgstr "Le fichier d'exportation chiffré a été enregistré" - -#: www/views/create.html -#: www/views/join.html -msgid "Enter the recovery phrase (BIP39)" -msgstr "Saisissez la phrase de récupération (BIP39)" - -#: www/views/backup.html -msgid "Enter your password" -msgstr "Écrivez votre mot de passe" - -#: www/views/includes/password.html -msgid "Enter your spending password" -msgstr "Saisissez votre code de dépenses" - -#: src/js/controllers/index.js -msgid "Error at Wallet Service" -msgstr "Erreur au niveau de Wallet Service" - -#: src/js/services/profileService.js -msgid "Error creating wallet" -msgstr "Erreur de création du portefeuille" - -#: www/views/modals/txp-details.html -msgid "Expired" -msgstr "Expiré" - -#: www/views/modals/paypro.html -#: www/views/modals/txp-details.html -msgid "Expires" -msgstr "Expire" - -#: www/views/export.html -msgid "Export options" -msgstr "Options d'exportation" - -#: www/views/preferencesHistory.html -msgid "Export to file" -msgstr "Exporter vers un fichier" - -#: www/views/preferencesAdvanced.html -msgid "Export Wallet" -msgstr "Exporter le portefeuille" - -#: www/views/export.html -msgid "Exporting via QR not supported for this wallet" -msgstr "L'exportation via QR n'est pas supportée pour ce portefeuille" - -#: www/views/preferencesInformation.html -msgid "Extended Public Keys" -msgstr "Clés publiques étendues" - -#: src/js/services/onGoingProcess.js -msgid "Extracting Wallet Information..." -msgstr "Extraction des informations du portefeuille..." - -#: www/views/export.html -msgid "Failed to export" -msgstr "Impossible d'exporter" - -#: www/views/backup.html -msgid "Failed to verify backup. Please check your information" -msgstr "Impossible de vérifier la sauvegarde. Veuillez vérifier vos informations" - -#: www/views/create.html -msgid "Family vacation funds" -msgstr "Fonds pour les vacances familiales" - -#: www/views/includes/confirm-tx.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Fee" -msgstr "Frais" - -#: src/js/services/onGoingProcess.js -msgid "Fetching Payment Information" -msgstr "Récupération des informations de paiement" - -#: www/views/export.html -#: www/views/import.html -msgid "File/Text" -msgstr "Fichier / Texte" - -#: src/js/services/fingerprintService.js -msgid "Finger Scan Failed" -msgstr "La numérisation digitale a échoué" - -#: www/views/backup.html -msgid "Finish" -msgstr "Terminer" - -#: www/views/create.html -msgid "For audit purposes" -msgstr "À des fins de vérification" - -#: www/views/translators.html -msgid "French" -msgstr "Français" - -#: www/views/export.html -msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" -msgstr "Depuis le périphérique de destination, allez sur « Ajouter portefeuille » > « Importer » et numérisez ce code QR" - -#: src/js/services/bwcError.js -msgid "Funds are locked by pending spend proposals" -msgstr "Les fonds sont verrouillés par des propositions de dépenses en attente" - -#: www/views/paperWallet.html -msgid "Funds found" -msgstr "Fonds trouvés" - -#: src/js/services/notificationsService.js -msgid "Funds received" -msgstr "Fonds reçus" - -#: www/views/paperWallet.html -msgid "Funds will be transferred to" -msgstr "Les fonds seront transférés à" - -#: www/views/walletHome.html -msgid "Generate new address" -msgstr "Générer une nouvelle adresse" - -#: www/views/modals/customized-amount.html -msgid "Generate QR Code" -msgstr "Générer un code QR" - -#: src/js/services/onGoingProcess.js -msgid "Generating .csv file..." -msgstr "Génération du fichier .csv..." - -#: www/views/translators.html -msgid "German" -msgstr "Allemand" - -#: www/views/modals/addressbook.html -msgid "Getting address for wallet {{selectedWalletName}} ..." -msgstr "Obtention d'une adresse pour le portefeuille {{selectedWalletName}} ..." - -#: www/views/includes/sidebar.html -msgid "Global preferences" -msgstr "Préférences globales" - -#: www/views/preferences.html -msgid "Hardware wallet" -msgstr "Portefeuille matériel" - -#: www/views/import.html -msgid "Hardware Wallet" -msgstr "Portefeuille matériel" - -#: www/views/create.html -#: www/views/export.html -#: www/views/import.html -#: www/views/join.html -msgid "Hide advanced options" -msgstr "Masquer les options avancées" - -#: www/views/disclaimer.html -msgid "I affirm that I have read, understood, and agree with these terms." -msgstr "Je confirme que j'ai lu, compris et suis d'accord avec ces conditions." - -#: www/views/disclaimer.html -msgid "I AGREE. GET STARTED" -msgstr "J’ACCEPTE. COMMENCER" - -#: www/views/import.html -msgid "Import" -msgstr "Importer" - -#: www/views/import.html -msgid "Import backup" -msgstr "Importer la sauvegarde" - -#: www/views/add.html -msgid "Import wallet" -msgstr "Importer" - -#: src/js/services/onGoingProcess.js -msgid "Importing Wallet..." -msgstr "Importation du portefeuille..." - -#: www/views/includes/terms.html -msgid "In no event shall the authors of the software, employees and affiliates of Bitpay, copyright holders, or BitPay, Inc. be held liable for any claim, damages or other liability, whether in an action of contract, tort, or otherwise, arising from, out of or in connection with the software." -msgstr "En aucun cas les auteurs du logiciel, employés et sociétés affiliés de Bitpay, détenteurs de droits d'auteur, ou BitPay, Inc. ne peuvent être tenus responsables de toute réclamation, dommages ou autre responsabilité, que ce soit dans une action contractuelle, délictuelle ou autre, découlant ou en étant en connexion avec le logiciel." - -#: www/views/backup.html -msgid "In order to verify your wallet backup, please type your password:" -msgstr "Afin de vérifier votre sauvegarde du portefeuille, veuillez saisir votre mot de passe :" - -#: src/js/services/bwcError.js -msgid "Incorrect address network" -msgstr "Adresse réseau incorrecte" - +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: copay\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: copay\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: template.pot\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Last-Translator: cmgustavo83\n" +"Language-Team: French\n" +"Language: fr\n" +"PO-Revision-Date: 2016-12-13 08:00-0500\n" + +#: www/views/modals/paypro.html:34 +msgid "(Trusted)" +msgstr "(Fiable)" + +#: www/views/includes/txp.html:27 +#: www/views/modals/search.html:27 +#: www/views/walletDetails.html:249 +msgid "(possible double spend)" +msgstr "(double dépense possible)" + +#: www/views/modals/txp-details.html:154 +msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." +msgstr "* Une proposition de paiement peut être supprimée si vous en êtes le créateur et qu'aucun des autres copayers n'a signé, ou si 24 heures sont passées depuis la création de la proposition." + +#: www/views/feedback/rateApp.html:7 +msgid "5-star ratings help us get BitPay into more hands, and more users means more resources can be committed to the app!" +msgstr "Une note de 5 étoiles permet à BitPay de gagner en popularité, et plus d'utilisateurs signifie davantage de ressources allouées à l'appli !" + +#: src/js/controllers/confirm.js:454 +msgid "A SMS containing a confirmation code was sent to your phone." +msgstr "Un SMS contenant un code de confirmation a été envoyé à votre téléphone." + +#: src/js/controllers/feedback/send.js:27 +#: www/views/feedback/complete.html:17 +msgid "A member of the team will review your feedback as soon as possible." +msgstr "Un membre de l’équipe passera en revue votre avis dès que possible." + +#: src/js/controllers/confirm.js:212 +msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." +msgstr "Un total de {{amountAboveMaxSizeStr}} a été exclu. La taille maximale autorisée pour une transaction a été dépassée." + +#: src/js/controllers/confirm.js:206 +msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." +msgstr "Un total de {{amountBelowFeeStr}} a été exclu. Ces fonds proviennent d'UTXOs plus petites que les frais de réseau prévus." + +#: src/js/controllers/preferencesAbout.js:6 +#: www/views/tab-settings.html:159 +msgid "About" +msgstr "À propos" + +#: src/js/services/confirmDialog.js:8 +msgid "Accept" +msgstr "Accepter" + +#: src/js/controllers/modals/txpDetails.js:39 +#: src/js/controllers/tx-details.js:65 +msgid "Accepted" +msgstr "Acceptée" + +#: www/views/preferencesInformation.html:59 +msgid "Account" +msgstr "Compte" + +#: www/views/join.html:71 +#: www/views/tab-create-personal.html:42 +#: www/views/tab-create-shared.html:72 +#: www/views/tab-import-hardware.html:19 +msgid "Account Number" +msgstr "Numéro de compte" + +#: www/views/bitpayCard.html:51 +msgid "Activity" +msgstr "Activité" + +#: src/js/controllers/bitpayCardIntro.js:34 +msgid "Add Account" +msgstr "Ajouter un account" + +#: src/js/controllers/bitpayCardIntro.js:30 +msgid "Add BitPay Card Account?" +msgstr "Ajouter un compte BitPay Card ?" + +#: www/views/tab-home.html:155 +msgid "Add BitPay Visa® Card" +msgstr "Ajouter une BitPay Visa® Card" + +#: www/views/addressbook.add.html:4 +#: www/views/addressbook.html:22 +msgid "Add Contact" +msgstr "Ajouter un contact" + +#: www/views/bitpayCard.html:23 +msgid "Add Funds" +msgstr "Ajouter des fonds" + +#: www/views/confirm.html:72 +msgid "Add Memo" +msgstr "Ajouter une note" + +#: www/views/tab-send.html:42 +msgid "Add a Contact" +msgstr "Ajouter un contact" + +#: www/views/join.html:90 +#: www/views/join.html:99 +#: www/views/tab-create-personal.html:59 +#: www/views/tab-create-personal.html:67 +#: www/views/tab-create-shared.html:89 +#: www/views/tab-create-shared.html:97 +msgid "Add a Password" +msgstr "Ajouter un mot de passe" + +#: www/views/join.html:92 +#: www/views/tab-create-personal.html:61 +#: www/views/tab-create-shared.html:91 +msgid "Add an optional password to secure the recovery phrase" +msgstr "Ajouter un mot de passe optionnel pour sécuriser la phrase de récupération" + +#: src/js/controllers/confirm.js:266 +msgid "Add description" +msgstr "Ajouter une description" + +#: www/views/add.html:3 +msgid "Add wallet" +msgstr "Ajouter portefeuille" + +#: www/views/addressbook.view.html:23 +#: www/views/customAmount.html:26 +#: www/views/modals/paypro.html:25 +#: www/views/paymentUri.html:15 +msgid "Address" +msgstr "Adresse" + +#: www/views/addressbook.html:6 +#: www/views/tab-settings.html:20 +msgid "Address Book" +msgstr "Répertoire" + +#: www/views/preferencesInformation.html:35 +msgid "Address Type" +msgstr "Type d'adresse" + +#: www/views/addresses.html:55 +msgid "Addresses With Balance" +msgstr "Adresses avec un solde" + +#: www/views/tab-settings.html:152 +msgid "Advanced" +msgstr "Paramètres avancés" + +#: www/views/advancedSettings.html:3 +msgid "Advanced Settings" +msgstr "Paramètres avancés" + +#: www/views/bitpayCard.html:57 +msgid "All" +msgstr "Tout" + +#: www/views/allAddresses.html:3 +msgid "All Addresses" +msgstr "Toutes les adresses" + +#: www/views/backupWarning.html:15 +msgid "All clear, let's do this" +msgstr "Tout est normal, allons-y !" + +#: www/views/tab-receive.html:38 +msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." +msgstr "Tous les appareils de signature doivent être ajoutés à ce portefeuille multisig avant que les adresses bitcoin ne puissent être créées." + +#: www/views/onboarding/notifications.html:7 +msgid "Allow notifications" +msgstr "Autoriser les notifications" + +#: www/views/onboarding/disclaimer.html:14 +msgid "Almost done! Let's review." +msgstr "C'est presque terminé ! Vérifions." + +#: www/views/preferencesAltCurrency.html:4 +#: www/views/tab-settings.html:81 +msgid "Alternative Currency" +msgstr "Devise alternative" + +#: www/views/tab-home.html:138 +msgid "Amazon.com Gift Cards" +msgstr "Cartes cadeaux Amazon.com" + +#: www/views/amount.html:43 +#: www/views/customAmount.html:32 +#: www/views/includes/output.html:7 +#: www/views/paymentUri.html:16 +msgid "Amount" +msgstr "Montant" + +#: src/js/services/bwcError.js:110 +msgid "Amount below minimum allowed" +msgstr "Montant en dessous du minimum autorisé" + +#: www/views/tab-home.html:14 +msgid "An update to this app is available" +msgstr "Une mise à jour de cette appli est disponible" + +#: www/views/backupWarning.html:14 +msgid "Anyone with your backup phrase can access or spend your bitcoin." +msgstr "Quelqu'un disposant de votre phrase de sauvegarde peut accéder ou dépenser vos bitcoins." + +#: www/views/backupWarning.html:10 +msgid "Are you being watched?" +msgstr "Êtes-vous espionné(e) ?" + +#: src/js/controllers/copayers.js:43 +msgid "Are you sure you want to cancel and delete this wallet?" +msgstr "Êtes-vous certain(e) de vouloir annuler et supprimer ce portefeuille ?" + +#: src/js/controllers/preferencesDelete.js:11 +msgid "Are you sure you want to delete this wallet?" +msgstr "Êtes-vous certain(e) de vouloir supprimer ce portefeuille ?" + +#: src/js/controllers/modals/txpDetails.js:127 +msgid "Are you sure you want to reject this transaction?" +msgstr "Êtes-vous certain(e) de vouloir rejeter cette transaction ?" + +#: src/js/controllers/modals/txpDetails.js:144 +msgid "Are you sure you want to remove this transaction?" +msgstr "Êtes-vous certain(e) de vouloir supprimer cette transaction ?" + +#: src/js/controllers/onboarding/backupRequest.js:16 +msgid "Are you sure you want to skip the backup?" +msgstr "Êtes-vous sûr(e) de vouloir ignorer la sauvegarde ?" + +#: src/js/controllers/preferencesBitpayCard.js:7 +msgid "Are you sure you would like to remove your BitPay Card account from this device?" +msgstr "Êtes-vous sûr(e) de vouloir supprimer votre compte BitPay Card de cet appareil ?" + +#: www/views/includes/walletInfo.html:3 +msgid "Auditable" +msgstr "Vérifiable" + +#: www/views/walletDetails.html:121 +#: www/views/walletDetails.html:60 +msgid "Available" +msgstr "Disponible" + +#: www/views/includes/available-balance.html:3 +msgid "Available Balance" +msgstr "Solde disponible" + +#: www/views/preferencesFee.html:15 +msgid "Average confirmation time: {{fee.nbBlocks * 10}} minutes" +msgstr "Temps de confirmation moyen : {{fee.nbBlocks * 10}} minutes" + +#: www/views/join.html:118 +#: www/views/tab-create-personal.html:85 +#: www/views/tab-create-shared.html:115 +#: www/views/tab-import-phrase.html:46 +msgid "BIP32 path for address derivation" +msgstr "Chemin BIP32 pour la dérivation de l'adresse" + +#: www/views/preferences.html:41 +msgid "Backup" +msgstr "Sauvegarder" + +#: www/views/includes/backupNeededPopup.html:7 +msgid "Backup Needed" +msgstr "Sauvegarde requise" + +#: www/views/includes/backupNeededPopup.html:9 +msgid "Backup now" +msgstr "Sauvegarder" + +#: www/views/onboarding/backupRequest.html:11 +#: www/views/tab-export-file.html:87 +msgid "Backup wallet" +msgstr "Sauvegarder le portefeuille" + +#: src/js/controllers/bitpayCard.js:140 +msgid "Bad param" +msgstr "Mauvais paramètre" + +#: src/js/services/profileService.js:458 +msgid "Bad wallet invitation" +msgstr "Mauvaise invitation de portefeuille" + +#: www/views/preferencesInformation.html:89 +msgid "Balance By Address" +msgstr "Solde par adresse" + +#: www/views/includes/confirmBackupPopup.html:7 +msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." +msgstr "N’oubliez pas de conserver votre phrase de récupération dans un endroit sûr. Si cette application est supprimée, votre argent ne peut pas être récupéré sans elle." + +#: www/views/addressbook.add.html:38 +msgid "Bitcoin Address" +msgstr "Adresse bitcoin" + +#: www/views/tab-settings.html:13 +msgid "Bitcoin Exchanges" +msgstr "Bitcoin Exchanges" + +#: www/views/preferencesFee.html:4 +#: www/views/tab-settings.html:92 +msgid "Bitcoin Network Fee Policy" +msgstr "Frais de réseau" + +#: www/views/paymentUri.html:10 +msgid "Bitcoin URI is NOT valid!" +msgstr "L'URI Bitcoin n'est pas valide !" + +#: www/views/tab-settings.html:70 +msgid "Bitcoin Unit" +msgstr "Unité de bitcoin" + +#: www/views/onboarding/tour.html:26 +msgid "Bitcoin is a currency." +msgstr "Bitcoin est une monnaie." + +#: www/views/onboarding/disclaimer.html:15 +msgid "Bitcoin is different – it cannot be safely held with a bank or web service." +msgstr "Bitcoin est différent – il ne peut pas être conservé en toute sécurité avec un service internet ou bancaire." + +#: www/views/onboarding/tour.html:13 +msgid "Bitcoin is secure,
digital money." +msgstr "Bitcoin est de l'argent
numérique sécurisé." + +#: www/views/preferencesFee.html:11 +msgid "Bitcoin transactions include a fee collected by miners on the network." +msgstr "Les transactions Bitcoin incluent des frais collectés par les mineurs du réseau." + +#: www/views/modals/txp-details.html:36 +msgid "Broadcast Payment" +msgstr "Diffuser le paiement" + +#: src/js/controllers/modals/txpDetails.js:41 +#: src/js/controllers/tx-details.js:67 +msgid "Broadcasted" +msgstr "Diffusée" + +#: src/js/services/onGoingProcess.js:10 +msgid "Broadcasting transaction" +msgstr "Diffusion de la transaction" + +#: www/views/unsupported.html:6 +msgid "Browser unsupported" +msgstr "Navigateur non supporté" + +#: www/views/tab-home.html:118 +msgid "Buy & Sell Bitcoin" +msgstr "Acheter & vendre des bitcoins" + +#: www/views/tab-send.html:15 +msgid "Buy Bitcoin" +msgstr "Acheter des bitcoins" + +#: www/views/tab-home.html:169 +msgid "Buy an Amazon Gift Card" +msgstr "Acheter une carte cadeau Amazon" + +#: www/views/buyandsell.html:5 +msgid "Buy and sell" +msgstr "Acheter et vendre" + +#: www/views/tab-home.html:162 +msgid "Buy or Sell Bitcoin" +msgstr "Acheter ou vendre des bitcoins" + +#: src/js/services/onGoingProcess.js:41 +msgid "Buying Bitcoin..." +msgstr "Achat de bitcoins..." + +#: src/js/services/onGoingProcess.js:11 +msgid "Calculating fee" +msgstr "Calcul des frais" + +#: src/js/controllers/confirm.js:510 +#: src/js/services/confirmDialog.js:9 +#: src/js/services/popupService.js:58 +#: www/views/addressbook.add.html:10 +#: www/views/feedback/send.html:5 +#: www/views/includes/confirm-tx.html:30 +#: www/views/includes/note.html:6 +#: www/views/includes/password.html:22 +#: www/views/modals/confirmation.html:13 +msgid "Cancel" +msgstr "Annuler" + +#: src/js/controllers/onboarding/tour.js:55 +msgid "Cannot Create Wallet" +msgstr "Impossible de créer le portefeuille" + +#: src/js/services/profileService.js:454 +msgid "Cannot join the same wallet more that once" +msgstr "Impossible de rejoindre le même portefeuille plus d'une fois" + +#: src/js/controllers/amazon.js:25 +msgid "Card not found" +msgstr "Carte introuvable" + +#: www/views/preferencesBitpayCard.html:10 +#: www/views/tab-home.html:99 +msgid "Cards" +msgstr "Cartes" + +#: www/views/modals/paypro.html:29 +msgid "Certified by" +msgstr "Certifié par" + +#: www/views/tab-import-file.html:4 +msgid "Choose a backup file from your computer" +msgstr "Choisissez un fichier de sauvegarde depuis votre ordinateur" + +#: www/views/modals/wallets.html:9 +msgid "Choose your destination wallet" +msgstr "Choisissez votre portefeuille de destination" + +#: www/views/modals/wallets.html:10 +msgid "Choose your source wallet" +msgstr "Choisissez votre portefeuille source" + +#: www/views/backup.html:54 +msgid "Clear" +msgstr "Effacer" + +#: www/views/preferencesHistory.html:23 +msgid "Clear cache" +msgstr "Vider le cache" + +#: www/views/modals/paypro.html:4 +#: www/views/modals/wallets.html:5 +msgid "Close" +msgstr "Fermer" + +#: www/views/preferences.html:26 +msgid "Color" +msgstr "Couleur" + +#: www/views/preferencesAbout.html:21 +msgid "Commit hash" +msgstr "Commit hash" + +#: src/js/controllers/confirm.js:509 +#: src/js/controllers/copayers.js:42 +#: src/js/services/confirmDialog.js:10 +#: www/views/backup.html:53 +#: www/views/backup.html:72 +#: www/views/confirm.html:4 +#: www/views/includes/confirm-tx.html:35 +msgid "Confirm" +msgstr "Confirmer" + +#: www/views/modals/terms.html:26 +#: www/views/onboarding/disclaimer.html:45 +msgid "Confirm & Finish" +msgstr "Confirmer & Terminer" + +#: src/js/services/walletService.js:839 +msgid "Confirm you new spending password" +msgstr "Confirmez votre nouveau code de dépenses" + +#: www/views/tx-details.html:77 +msgid "Confirmations" +msgstr "Confirmations" + +#: www/views/walletDetails.html:122 +#: www/views/walletDetails.html:61 +msgid "Confirming" +msgstr "Confirmation" + +#: www/views/bitpayCardIntro.html:37 +msgid "Connect my BitPay Card" +msgstr "Connecter ma BitPay Card" + +#: src/js/services/onGoingProcess.js:12 +msgid "Connecting to Coinbase..." +msgstr "Connexion à Coinbase..." + +#: src/js/services/onGoingProcess.js:13 +msgid "Connecting to Glidera..." +msgstr "Connexion à Glidera..." + +#: www/views/glideraUri.html:16 +msgid "Connecting..." +msgstr "Connexion..." + +#: src/js/services/bwcError.js:53 +msgid "Connection reset by peer" +msgstr "Connexion réinitialisée par un pair" + +#: www/views/tab-send.html:32 +msgid "Contacts" +msgstr "Contacts" + +#: www/views/onboarding/notifications.html:9 +msgid "Continue" +msgstr "Continuer" + +#: www/views/preferencesLanguage.html:26 +#: www/views/translators.html:33 +msgid "Contribute Translations" +msgstr "Contribuer aux traductions" + +#: src/js/services/bwcError.js:62 +msgid "Copayer already in this wallet" +msgstr "Copayer déjà dans ce portefeuille" + +#: src/js/services/bwcError.js:77 +msgid "Copayer already voted on this spend proposal" +msgstr "Le Copayer a déjà voté pour cette proposition de dépense" + +#: src/js/services/bwcError.js:107 +msgid "Copayer data mismatch" +msgstr "Les données Copayer ne correspondent pas" + +#: www/views/includes/walletActivity.html:2 +msgid "Copayer joined" +msgstr "Un Copayer à rejoint" + +#: www/views/preferencesInformation.html:81 +msgid "Copayer {{$index}}" +msgstr "Copayer {{$index}}" + +#: src/js/controllers/copayers.js:64 +#: src/js/controllers/export.js:177 +#: www/views/includes/copyToClipboard.html:4 +msgid "Copied to clipboard" +msgstr "Copié(e) dans le presse-papier" + +#: www/views/tab-export-file.html:92 +msgid "Copy this text as it is to a safe place (notepad or email)" +msgstr "Copiez ce texte présenté tel quel vers un endroit sûr (bloc-notes ou e-mail)" + +#: www/views/preferencesLogs.html:11 +#: www/views/tab-export-file.html:76 +msgid "Copy to clipboard" +msgstr "Copier dans le presse-papier" + +#: www/views/tab-import-phrase.html:2 +msgid "Could not access the wallet at the server. Please check:" +msgstr "Impossible d'accéder au portefeuille via le serveur. Veuillez vérifier :" + +#: src/js/services/profileService.js:524 +msgid "Could not access wallet" +msgstr "Impossible d’accéder au portefeuille" + +#: src/js/controllers/modals/txpDetails.js:172 +msgid "Could not broadcast payment" +msgstr "Impossible de diffuser le paiement" + +#: src/js/services/bwcError.js:41 +msgid "Could not build transaction" +msgstr "Impossible de créer la transaction" + +#: src/js/services/walletService.js:755 +msgid "Could not create address" +msgstr "Impossible de créer l'adresse" + +#: src/js/services/profileService.js:371 +msgid "Could not create using the specified extended private key" +msgstr "Impossible de créer en utilisant la clé privée étendue spécifiée" + +#: src/js/services/profileService.js:381 +msgid "Could not create using the specified extended public key" +msgstr "Impossible de créer en utilisant la clé publique étendue spécifiée" + +#: src/js/services/profileService.js:364 +msgid "Could not create: Invalid wallet recovery phrase" +msgstr "Impossible de créer : Phrase de récupération du portefeuille invalide" + +#: src/js/controllers/import.js:79 +msgid "Could not decrypt file, check your password" +msgstr "Impossible de déchiffrer le fichier, vérifiez votre mot de passe" + +#: src/js/controllers/modals/txpDetails.js:154 +msgid "Could not delete payment proposal" +msgstr "Impossible de supprimer la proposition de paiement" + +#: src/js/services/feeService.js:51 +msgid "Could not get dynamic fee" +msgstr "Impossible d'obtenir les frais dynamiques" + +#: src/js/services/feeService.js:31 +msgid "Could not get dynamic fee for level: {{feeLevel}}" +msgstr "Impossible d'obtenir les frais dynamiques pour ce choix : {{feeLevel}}" + +#: src/js/controllers/confirm.js:655 +msgid "Could not get the destination bitcoin address" +msgstr "Impossible d'obtenir l'adresse bitcoin de destination" + +#: src/js/controllers/bitpayCard.js:68 +#: src/js/controllers/glidera.js:100 +msgid "Could not get transactions" +msgstr "Impossible de récupérer les transactions" + +#: src/js/services/profileService.js:629 +#: src/js/services/profileService.js:660 +#: src/js/services/profileService.js:683 +msgid "Could not import" +msgstr "Impossible d'importer" + +#: src/js/services/profileService.js:598 +msgid "Could not import. Check input file and spending password" +msgstr "Impossible d'importer. Vérifiez le fichier d'entrée et le code de dépenses" + +#: src/js/services/profileService.js:467 +msgid "Could not join wallet" +msgstr "Impossible de rejoindre le portefeuille" + +#: src/js/controllers/modals/txpDetails.js:134 +msgid "Could not reject payment" +msgstr "Impossible de rejeter le paiement" + +#: src/js/controllers/preferencesBitpayCard.js:16 +msgid "Could not remove card" +msgstr "Impossible de supprimer la carte" + +#: src/js/controllers/confirm.js:449 +msgid "Could not send confirmation code to your phone" +msgstr "Impossible d'envoyer le code de confirmation à votre téléphone" + +#: src/js/controllers/modals/txpDetails.js:120 +msgid "Could not send payment" +msgstr "Impossible d'envoyer le paiement" + +#: src/js/controllers/tab-home.js:200 +msgid "Could not update" +msgstr "Impossible de mettre à jour" + +#: src/js/services/walletService.js:147 +msgid "Could not update Wallet" +msgstr "Impossible de mettre à jour le portefeuille" + +#: www/views/tab-create-personal.html:3 +msgid "Create Personal Wallet" +msgstr "Créer un portefeuille personnel" + +#: www/views/tab-create-shared.html:3 +msgid "Create Shared Wallet" +msgstr "Créer un portefeuille partagé" + +#: www/views/tab-home.html:66 +msgid "Create a bitcoin wallet" +msgstr "Créer un portefeuille bitcoin" + +#: www/views/tab-send.html:16 +msgid "Create bitcoin wallet" +msgstr "Créer un portefeuille bitcoin" + +#: www/views/tab-create-personal.html:103 +msgid "Create new wallet" +msgstr "Créer" + +#: www/views/add.html:22 +msgid "Create shared wallet" +msgstr "Créer un portefeuille partagé" + +#: www/views/tab-create-shared.html:133 +msgid "Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet" +msgstr "Créer un portefeuille {{formData.requiredCopayers}}--sur--{{formData.totalCopayers}}" + +#: www/views/modals/txp-details.html:83 +#: www/views/tx-details.html:58 +msgid "Created by" +msgstr "Créée par" + +#: src/js/services/onGoingProcess.js:17 +msgid "Creating Wallet..." +msgstr "Création du portefeuille..." + +#: src/js/services/onGoingProcess.js:16 +msgid "Creating transaction" +msgstr "Création de la transaction" + +#: www/views/preferencesFee.html:17 +msgid "Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB" +msgstr "Frais actuels pour ce choix : {{fee.feePerKBUnit}}/kiB" + +#: www/views/customAmount.html:4 +msgid "Custom Amount" +msgstr "Montant personnalisé" + +#: www/views/preferencesDeleteWallet.html:21 +msgid "Delete" +msgstr "Supprimer" + +#: www/views/modals/txp-details.html:159 +msgid "Delete Payment Proposal" +msgstr "Supprimer la proposition de paiement" + +#: www/views/preferencesAdvanced.html:28 +#: www/views/preferencesDeleteWallet.html:3 +msgid "Delete Wallet" +msgstr "Supprimer le portefeuille" + +#: www/views/copayers.html:59 +msgid "Delete it and create a new one" +msgstr "Le supprimer et en créer un nouveau" + +#: src/js/services/onGoingProcess.js:18 +msgid "Deleting Wallet..." +msgstr "Suppression du portefeuille..." + +#: src/js/services/onGoingProcess.js:27 +msgid "Deleting payment proposal" +msgstr "Suppression de la proposition de paiement" + +#: www/views/join.html:116 +#: www/views/tab-create-personal.html:83 +#: www/views/tab-create-shared.html:113 +#: www/views/tab-import-phrase.html:44 +msgid "Derivation Path" +msgstr "Chemin de dérivation" + +#: www/views/preferencesInformation.html:41 +msgid "Derivation Strategy" +msgstr "Stratégie de dérivation" + +#: www/views/modals/coinbase-tx-details.html:9 +#: www/views/modals/paypro.html:17 +msgid "Details" +msgstr "Détails" + +#: www/views/advancedSettings.html:55 +#: www/views/advancedSettings.html:71 +msgid "Development Utilities" +msgstr "Utilitaires de développement" + +#: www/views/tab-export-file.html:27 +msgid "Do not include private key" +msgstr "Ne pas inclure la clé privée" + +#: www/views/preferencesLanguage.html:21 +#: www/views/translators.html:28 +msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." +msgstr "Vous ne voyez pas votre langue sur Crowdin ? Contactez le propriétaire sur Crowdin ! Nous serions ravis de prendre en charge votre langue." + +#: www/views/tab-export-file.html:57 +msgid "Download" +msgstr "Télécharger" + +#: www/views/addresses.html:23 +msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." +msgstr "Chaque portefeuille bitcoin peut générer des milliards d’adresses depuis votre sauvegarde de 12 mots. Une nouvelle adresse est automatiquement générée et affichée à chaque fois que vous recevez un paiement." + +#: src/js/services/feeService.js:10 +msgid "Economy" +msgstr "Faibles" + +#: www/views/addressbook.add.html:29 +#: www/views/addressbook.view.html:19 +msgid "Email" +msgstr "E-mail" + +#: www/views/preferencesNotifications.html:38 +msgid "Email Address" +msgstr "Adresse e-mail" + +#: www/views/onboarding/collectEmail.html:9 +msgid "Email Notifications" +msgstr "Notifications e-mail" + +#: src/js/services/bwcError.js:122 +msgid "Empty addresses limit reached. New addresses cannot be generated." +msgstr "La limite d'adresses vides a été atteinte. Les nouvelles adresses ne peuvent plus être générées." + +#: www/views/advancedSettings.html:17 +msgid "Enable Amazon Integration" +msgstr "Activer l'intégration d'Amazon" + +#: www/views/advancedSettings.html:13 +msgid "Enable BitPay Card Integration" +msgstr "Activer l’intégration de la BitPay Card" + +#: www/views/advancedSettings.html:21 +msgid "Enable Glidera Service" +msgstr "Activer le service Glidera" + +#: www/views/tab-scan.html:19 +msgid "Enable camera access in your device settings to get started." +msgstr "Autorisez l’accès à la caméra dans les réglages de votre appareil pour commencer." + +#: www/views/preferencesNotifications.html:25 +msgid "Enable email notifications" +msgstr "Activer les notifications e-mail" + +#: www/views/preferencesNotifications.html:14 +msgid "Enable push notifications" +msgstr "Autoriser les notifications" + +#: www/views/tab-scan.html:18 +msgid "Enable the camera to get started." +msgstr "Autorisez la caméra commencer." + +#: www/views/advancedSettings.html:10 +msgid "Enabled Integrations" +msgstr "Intégrations activées" + +#: www/views/join.html:86 +#: www/views/tab-create-personal.html:55 +#: www/views/tab-create-shared.html:85 +msgid "Encrypt with a Password" +msgstr "Chiffrer avec un mot de passe" + +#: www/views/amount.html:4 +msgid "Enter Amount" +msgstr "Saisissez un montant" + +#: src/js/services/walletService.js:852 +#: src/js/services/walletService.js:867 +msgid "Enter Spending Password" +msgstr "Saisissez le code de dépenses" + +#: src/js/controllers/bitpayCardIntro.js:6 +msgid "Enter Two Factor for BitPay Card" +msgstr "Saisissez le code à deux facteurs pour votre BitPay Card" + +#: src/js/services/walletService.js:837 +msgid "Enter new spending password" +msgstr "Saisissez un nouveau code de dépenses" + +#: www/views/join.html:78 +#: www/views/tab-create-personal.html:48 +#: www/views/tab-create-shared.html:78 +msgid "Enter the recovery phrase (BIP39)" +msgstr "Saisissez la phrase de récupération (BIP39)" + +#: www/views/backup.html:62 +msgid "Enter your password" +msgstr "Écrivez votre mot de passe" + +#: www/views/includes/password.html:8 +msgid "Enter your spending password" +msgstr "Saisissez votre code de dépenses" + #. Trying to import a malformed wallet export QR code -#: src/js/controllers/import.js -msgid "Incorrect code format" -msgstr "Format du code incorrect" - -#: src/js/services/bwcError.js -msgid "Insufficient funds" -msgstr "Fonds insuffisants" - -#: src/js/services/bwcError.js -msgid "Insufficient funds for fee" -msgstr "Fonds insuffisants pour les frais" - -#: www/views/modals/search.html -#: www/views/walletHome.html -msgid "Invalid" -msgstr "Invalide" - -#: src/js/controllers/create.js -#: src/js/controllers/import.js -#: src/js/controllers/join.js -msgid "Invalid account number" -msgstr "Numéro de compte invalide" - -#: src/js/services/bwcError.js -msgid "Invalid address" -msgstr "Adresse invalide" - -#: src/js/controllers/create.js -#: src/js/controllers/import.js -#: src/js/controllers/join.js -msgid "Invalid derivation path" -msgstr "Chemin de dérivation invalide" - -#: src/js/controllers/copayers.js -msgid "Invitation to share a Copay Wallet" -msgstr "Invitation pour partager un portefeuille Copay" - -#: www/views/translators.html -msgid "Italian" -msgstr "Italien" - -#: www/views/translators.html -msgid "Japanese" -msgstr "Japonais" - -#: www/views/create.html -#: www/views/join.html -msgid "John" -msgstr "John" - -#: www/views/join.html -msgid "Join" -msgstr "Rejoindre" - -#: src/js/controllers/copayers.js -msgid "Join my Copay wallet. Here is the invitation code: {{secret}} You can download Copay for your phone or desktop at https://copay.io" -msgstr "Rejoignez mon portefeuille Copay. Voici le code d'invitation : {{secret}} Vous pouvez télécharger Copay pour votre téléphone ou pour votre ordinateur sur https://copay.io" - -#: www/views/add.html -msgid "Join shared wallet" -msgstr "Rejoindre" - -#: src/js/services/onGoingProcess.js -msgid "Joining Wallet..." -msgstr "Connexion au portefeuille..." - -#: src/js/services/bwcError.js -msgid "Key already associated with an existing wallet" -msgstr "La clé est déjà associée avec un portefeuille existant" - -#: www/views/modals/addressbook.html -msgid "Label" -msgstr "Étiquette" - -#: www/views/preferencesGlobal.html -msgid "Language" -msgstr "Langue" - -#: www/views/preferencesInformation.html -msgid "Last Wallet Addresses" -msgstr "Dernières adresses du portefeuille" - -#: www/views/backup.html -msgid "Learn more about Copay backups" -msgstr "En savoir plus sur les sauvegardes de Copay" - -#: www/views/preferencesFee.html -msgid "Loading..." -msgstr "Chargement..." - -#: www/views/includes/available-balance.html -msgid "locked by pending payments" -msgstr "verrouillés par les paiements en attente" - -#: src/js/services/bwcError.js -msgid "Locktime in effect. Please wait to create a new spend proposal" -msgstr "Locktime effectif. Veuillez patienter pour créer une nouvelle proposition de dépense" - -#: src/js/services/bwcError.js -msgid "Locktime in effect. Please wait to remove this spend proposal" -msgstr "Locktime effectif. Veuillez patienter pour supprimer cette proposition de dépense" - -#: www/views/paymentUri.html -msgid "Make a payment to" -msgstr "Faire un paiement à" - -#: src/js/controllers/index.js -msgid "Matches:" -msgstr "Correspondances :" - -#: src/js/services/profileService.js -msgid "me" -msgstr "moi" - -#: www/views/includes/copayers.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/preferencesInformation.html -msgid "Me" -msgstr "Moi" - -#: www/views/modals/paypro.html -msgid "Memo" -msgstr "Note" - -#: www/views/modals/tx-details.html -msgid "Merchant message" -msgstr "Message marchand" - -#: www/views/paymentUri.html -msgid "Message" -msgstr "Message" - -#: src/js/services/bwcError.js -msgid "Missing parameter" -msgstr "Paramètre manquant" - -#: src/js/services/bwcError.js -msgid "Missing private keys to sign" -msgstr "Clés privées manquantes pour signer" - -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html -msgid "Moved" -msgstr "Déplacés" - -#: www/views/includes/confirm-tx.html -#: www/views/modals/txp-details.html -msgid "Multiple recipients" -msgstr "Plusieurs destinataires" - -#: www/views/walletHome.html -msgid "My Bitcoin address" -msgstr "Mon adresse Bitcoin" - -#: www/views/modals/addressbook.html -msgid "My contacts" -msgstr "Mes contacts" - -#: www/views/modals/addressbook.html -msgid "My wallets" -msgstr "Mes portefeuilles" - -#: www/views/preferencesDeleteWords.html -msgid "Need to do backup" -msgstr "Vous devez faire une sauvegarde" - -#: www/views/paymentUri.html -msgid "Network" -msgstr "Réseau" - -#: src/js/services/bwcError.js -msgid "Network connection error" -msgstr "Erreur de connexion réseau" - -#: src/js/services/notificationsService.js -msgid "New Payment Proposal" -msgstr "Nouvelle proposition de paiement" - -#: src/js/controllers/create.js -#: src/js/controllers/join.js -msgid "New Random Recovery Phrase" -msgstr "Nouvelle phrase de récupération aléatoire" - -#: www/views/import.html -msgid "No hardware wallets supported on this device" -msgstr "Aucun portefeuille matériel pris en charge sur cet appareil" - -#: www/views/walletHome.html -msgid "No transactions yet" -msgstr "Aucune transaction" - -#: src/js/services/feeService.js -msgid "Normal" -msgstr "Normaux" - -#: src/js/services/bwcError.js -msgid "Not authorized" -msgstr "Non autorisé" - -#: www/views/preferences.html -msgid "Not completed" -msgstr "Inachevée" - -#: src/js/controllers/walletHome.js -msgid "Not enough funds for fee" -msgstr "Pas assez de fonds pour les frais" - -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Not valid" -msgstr "Invalide" - -#: www/views/includes/output.html -msgid "Note" -msgstr "Note" - -#: src/js/controllers/walletHome.js -msgid "Note: a total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded" -msgstr "Note : un total de {{amountAboveMaxSizeStr}} a été exclu. La taille maximale autorisée d'une transaction a été dépassée" - -#: src/js/controllers/walletHome.js -msgid "Note: a total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." -msgstr "Note : un total de {{amountBelowFeeStr}} a été exclu. Ces fonds proviennent d'une entrée plus petite que les frais de réseau prévus." - -#: www/views/import.html -msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." -msgstr "Remarque : Pour importer un portefeuille d’un autre logiciel que Copay, veuillez aller dans « Ajouter portefeuille » > « Créer » et spécifier la phrase de récupération." - -#: www/views/disclaimer.html -#: www/views/termOfUse.html -msgid "Official English Disclaimer" -msgstr "Clause de non-responsabilité anglaise officielle" - -#: www/views/modals/tx-status.html -msgid "OKAY" -msgstr "OK" - -#: www/views/preferencesDeleteWords.html -msgid "Once you have copied your wallet recovery phrase down, it is recommended to delete it from this device." -msgstr "Une fois que vous avez écrit votre phrase de récupération du portefeuille, il est recommandé de la supprimer de cet appareil." - -#: www/views/preferencesInformation.html -msgid "Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time." -msgstr "Seules les adresses principales (pas celles de change) sont indiquées. Les adresses sur cette liste n'ont pas été vérifiées localement à ce moment." - -#: www/views/preferencesGlobal.html -msgid "Open Settings app" -msgstr "Ouvrir les paramètres de l'appli" - -#: www/views/walletHome.html -msgid "optional" -msgstr "optionnelle" - -#: www/views/paperWallet.html -msgid "Paper Wallet Private Key" -msgstr "Clé privée du portefeuille de papier" - -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Participants" -msgstr "Participants" - -#: www/views/paperWallet.html -msgid "Passphrase" -msgstr "Phrase de passe" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -#: www/views/paperWallet.html -msgid "Password" -msgstr "Mot de passe" - -#: src/js/controllers/import.js -msgid "Password required. Make sure to enter your password in advanced options" -msgstr "Mot de passe requis. Veuillez saisir votre mot de passe dans les options avancées" - -#: www/views/join.html -msgid "Paste invitation here" -msgstr "Collez l'invitation ici" - -#: www/views/import.html -msgid "Paste the backup plain text code" -msgstr "Collez le code texte de sauvegarde" - -#: www/views/paperWallet.html -msgid "Paste your paper wallet private key here" -msgstr "Collez ici votre clé privée du portefeuille de papier" - -#: src/js/controllers/walletHome.js -msgid "Pasted from clipboard" -msgstr "Collé depuis le presse-papier" - -#: www/views/modals/paypro.html -msgid "Pay To" -msgstr "Payer à" - -#: www/views/modals/tx-status.html -msgid "Payment Accepted" -msgstr "Paiement accepté" - -#: www/views/modals/txp-details.html -msgid "Payment accepted, but not yet broadcasted" -msgstr "Paiement accepté, mais pas encore diffusé" - -#: www/views/modals/txp-details.html -msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." -msgstr "Paiement accepté. Il sera diffusé par Glidera. Dans le cas où il y a un problème, il peut être supprimé 6 heures après avoir été créé." - -#: www/views/modals/txp-details.html -msgid "Payment details" -msgstr "Détails du paiement" - -#: www/views/walletHome.html -msgid "Payment expires" -msgstr "Paiement expiré" - -#: www/views/modals/txp-details.html -msgid "Payment Proposal" -msgstr "Proposition de paiement" - -#: www/views/modals/tx-status.html -msgid "Payment Proposal Created" -msgstr "Proposition de paiement créée" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Rejected" -msgstr "Proposition de paiement rejetée" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Rejected by Copayer" -msgstr "Proposition de paiement rejetée par les Copayer" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Signed by Copayer" -msgstr "Proposition de paiement signée par les Copayers" - -#: www/views/walletHome.html -msgid "Payment Proposals" -msgstr "Propositions de paiement" - -#: src/js/controllers/walletHome.js -msgid "Payment Protocol Invalid" -msgstr "Protocole de paiement invalide" - -#: src/js/controllers/walletHome.js -msgid "Payment Protocol not supported on Chrome App" -msgstr "Le protocole de paiement n'est pas supporté sur l'application Chrome" - -#: www/views/modals/tx-status.html -#: www/views/modals/txp-details.html -msgid "Payment Rejected" -msgstr "Paiement rejeté" - -#: www/views/modals/paypro.html -msgid "Payment request" -msgstr "Demande de paiement" - -#: www/views/modals/txp-details.html -#: src/js/services/notificationsService.js -msgid "Payment Sent" -msgstr "Paiement envoyé" - -#: www/views/walletHome.html -msgid "Payment to" -msgstr "Paiement à" - -#: www/views/walletHome.html -msgid "Pending Confirmation" -msgstr "Confirmation en attente" - -#: www/views/preferencesDeleteWallet.html -msgid "Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED" -msgstr "Supprimer définitivement ce portefeuille.
CETTE ACTION NE PEUT PAS ÊTRE ANNULÉE" - -#: www/views/create.html -#: src/js/services/profileService.js -msgid "Personal Wallet" -msgstr "Portefeuille personnel" - -#: src/js/controllers/import.js -msgid "Please enter the recovery phrase" -msgstr "Veuillez saisir la phrase de récupération" - -#: src/js/controllers/create.js -#: src/js/controllers/join.js -msgid "Please enter the required fields" -msgstr "Veuillez saisir les champs requis" - -#: src/js/controllers/create.js -#: src/js/controllers/join.js -msgid "Please enter the wallet recovery phrase" -msgstr "Veuillez saisir la phrase de récupération du portefeuille" - -#: www/views/backup.html -msgid "Please tap the words in order to confirm your backup phrase is correctly written." -msgstr "Veuillez sélectionner les mots afin de confirmer que votre phrase de sauvegarde est correctement écrite." - -#: src/js/services/bwcError.js -msgid "Please upgrade Copay to perform this action" -msgstr "Veuillez mettre à jour Copay pour effectuer cette action" - -#: www/views/uri.html -msgid "Please wait to be redirected..." -msgstr "Veuillez attendre la redirection..." - -#: src/js/controllers/import.js -msgid "Please, select your backup file" -msgstr "Veuillez sélectionner votre fichier de sauvegarde" - -#: www/views/translators.html -msgid "Polish" -msgstr "Polonais" - -#: www/views/paperWallet.html -msgid "Preferences" -msgstr "Préférences" - -#: src/js/controllers/export.js -msgid "Preparing backup..." -msgstr "Préparation de la sauvegarde..." - -#: www/views/preferencesHistory.html -msgid "preparing..." -msgstr "préparation..." - -#: src/js/routes.js -msgid "Press again to exit" -msgstr "Appuyez de nouveau pour quitter" - -#: src/js/services/feeService.js -msgid "Priority" -msgstr "Importants" - -#: src/js/services/bwcError.js -msgid "Private key is encrypted, cannot sign" -msgstr "La clé privée est chiffrée, impossible de signer" - -#: www/views/preferencesGlobal.html -msgid "Push notifications for Copay are currently disabled. Enable them in the Settings app." -msgstr "Les notifications push de Copay sont actuellement désactivées. Activez-les dans les paramètres de l'appli." - -#: www/views/export.html -#: www/views/modals/customized-amount.html -msgid "QR Code" -msgstr "Code QR" - -#: www/views/modals/scanner.html -msgid "QR-Scanner" -msgstr "QR-Scanner" - -#: src/js/controllers/index.js -msgid "Receive" -msgstr "Recevoir" - -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html -msgid "Received" -msgstr "Reçus" - -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Recipients" -msgstr "Destinataire(s)" - -#: www/views/import.html -msgid "Recovery Phrase" -msgstr "Phrase de récupération" - -#: src/js/controllers/preferencesDeleteWords.js -msgid "Recovery phrase deleted" -msgstr "Phrase de récupération supprimée" - -#: www/views/walletHome.html -msgid "Recreate" -msgstr "Recréer" - -#: src/js/services/onGoingProcess.js -msgid "Recreating Wallet..." -msgstr "Recréation du portefeuille..." - -#: www/views/modals/txp-details.html -msgid "Reject" -msgstr "Rejeter" - -#: www/views/preferencesAbout.html -msgid "Release Information" -msgstr "Informations de version" - -#: www/views/modals/addressbook.html -msgid "Remove" -msgstr "Supprimer" - -#: www/views/export.html -msgid "Repeat password" -msgstr "Confirmez le mot de passe" - -#: www/views/export.html -msgid "Repeat the password" -msgstr "Confirmez le mot de passe" - -#: www/views/includes/password.html -msgid "Repeat the spending password" -msgstr "Confirmez le code de dépenses" - -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Request a specific amount" -msgstr "Demander un montant précis" - -#: www/views/preferences.html -msgid "Request Spending Password" -msgstr "Demander un code de dépenses" - -#: www/views/join.html -msgid "Required" -msgstr "Requis" - -#: www/views/create.html -msgid "Required number of signatures" -msgstr "Nombre requis de signatures" - -#: src/js/services/onGoingProcess.js -msgid "Retrieving inputs information" -msgstr "Récupération des informations d'entrée" - -#: www/views/translators.html -msgid "Russian" -msgstr "Russe" - -#: www/views/includes/note.html -#: www/views/modals/addressbook.html -#: www/views/preferencesAlias.html -#: www/views/preferencesBwsUrl.html -#: www/views/preferencesEmail.html -msgid "Save" -msgstr "Valider" - -#: www/views/preferencesInformation.html -msgid "Scan addresses for funds" -msgstr "Analyser les adresses pour des fonds" - -#: www/views/preferences.html -msgid "Scan Fingerprint" -msgstr "Scanner l'empreinte digitale" - -#: src/js/services/notificationsService.js -msgid "Scan Finished" -msgstr "Analyse terminée" - -#: www/views/walletHome.html -msgid "Scan status finished with error" -msgstr "Analyse terminée avec des erreurs" - -#: www/views/paperWallet.html -msgid "Scan Wallet Funds" -msgstr "Analyser les fonds du portefeuille" - -#: src/js/services/fingerprintService.js -msgid "Scan your fingerprint please" -msgstr "Veuillez scanner votre empreinte digitale" - -#: src/js/services/onGoingProcess.js -msgid "Scanning Wallet funds..." -msgstr "Analyse des fonds du portefeuille..." - -#: www/views/modals/search.html -msgid "Search transactions" -msgstr "Rechercher des transactions" - -#: www/views/modals/search.html -msgid "Search Transactions" -msgstr "Rechercher des transactions" - -#: www/views/preferences.html -msgid "Security preferences" -msgstr "Préférences de sécurité" - -#: www/views/modals/tx-details.html -msgid "See it on the blockchain" -msgstr "Voir sur la blockchain" - -#: www/views/import.html -msgid "Select a backup file" -msgstr "Sélectionner un fichier de sauvegarde" - -#: www/views/paymentUri.html -msgid "Select a wallet" -msgstr "Sélectionner un portefeuille" - -#: www/views/modals/paypro.html -msgid "Self-signed Certificate" -msgstr "Certificat auto-signé" - -#: www/views/walletHome.html -#: src/js/controllers/index.js -msgid "Send" -msgstr "Envoyer" - -#: www/views/preferencesInformation.html -msgid "Send addresses by email" -msgstr "Envoyer les adresses par e-mail" - -#: www/views/includes/confirm-tx.html -msgid "Send bitcoin" -msgstr "Envoyer les bitcoins" - -#: www/views/export.html -#: www/views/preferencesLogs.html -msgid "Send by email" -msgstr "Envoyer par e-mail" - -#: www/views/walletHome.html -msgid "Send Max" -msgstr "Envoyer le maximum" - -#: www/views/includes/transaction.html -msgid "Sending" -msgstr "Envoi" - -#: src/js/services/onGoingProcess.js -msgid "Sending transaction" -msgstr "Envoi de la transaction" - -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/modals/tx-status.html -#: www/views/walletHome.html -msgid "Sent" -msgstr "Envoyés" - -#: src/js/services/bwcError.js -msgid "Server response could not be verified" -msgstr "La réponse du serveur n'a pas pu être vérifiée" - -#: www/views/preferencesAbout.html -msgid "Session log" -msgstr "Journal de session" - -#: www/views/includes/password.html -msgid "SET" -msgstr "DÉFINIR" - -#: www/views/preferencesBwsUrl.html -msgid "Set default url" -msgstr "Définir l'url par défaut" - -#: www/views/export.html -msgid "Set up a password" -msgstr "Spécifiez un mot de passe" - -#: www/views/includes/password.html -msgid "Set up a spending password" -msgstr "Configurer un code de dépenses" - -#: www/views/preferencesEmail.html -msgid "Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more." -msgstr "Configurer des notifications e-mail peut affaiblir votre anonymat si le fournisseur du service de portefeuille est compromis. Les informations disponibles à un attaquant incluent les adresses de votre portefeuille et leurs soldes, mais rien de plus." - -#: www/views/includes/sidebar.html -msgid "Settings" -msgstr "Paramètres" - -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Share address" -msgstr "Partager l'adresse" - -#: www/views/copayers.html -msgid "Share invitation" -msgstr "Partager l'invitation" - -#: www/views/copayers.html -msgid "Share this invitation with your copayers" -msgstr "Partagez cette invitation avec vos copayers" - -#: www/views/walletHome.html -msgid "Share this wallet address to receive payments" -msgstr "Partagez cette adresse de portefeuille pour recevoir des paiements" - -#: www/views/walletHome.html -msgid "Share this wallet address to receive payments. To protect your privacy, new addresses are generated automatically once you use them." -msgstr "Partagez cette adresse de portefeuille pour recevoir des paiements. Pour protéger votre anonymat, de nouvelles adresses sont générées automatiquement une fois que vous les utilisez." - -#: www/views/create.html -#: www/views/import.html -msgid "Shared Wallet" -msgstr "Portefeuille partagé" - -#: www/views/create.html -#: www/views/export.html -#: www/views/import.html -#: www/views/join.html -msgid "Show advanced options" -msgstr "Afficher les options avancées" - -#: src/js/services/bwcError.js -msgid "Signatures rejected by server" -msgstr "Signatures rejetées par le serveur" - -#: src/js/services/onGoingProcess.js -msgid "Signing transaction" -msgstr "Signature de la transaction" - -#: www/views/create.html -msgid "Single Address Wallet" -msgstr "Portefeuille d'adresse unique" - -#: www/views/translators.html -msgid "Spanish" -msgstr "Espagnol" - -#: src/js/controllers/create.js -#: src/js/controllers/join.js -msgid "Specify Recovery Phrase..." -msgstr "Spécifier la phrase de récupération..." - -#: src/js/services/bwcError.js -msgid "Spend proposal is not accepted" -msgstr "La proposition de dépense n'est pas acceptée" - -#: src/js/services/bwcError.js -msgid "Spend proposal not found" -msgstr "Propostion de dépense introuvable" - -#: src/js/services/bwcError.js -msgid "Spending Password needed" -msgstr "Code de dépenses requis" - -#: src/js/controllers/index.js -msgid "Spending Passwords do not match" -msgstr "Les codes de dépenses ne correspondent pas" - -#: src/js/controllers/copayers.js -#: src/js/controllers/export.js -#: src/js/controllers/import.js -#: src/js/controllers/preferencesDelete.js -msgid "Success" -msgstr "Succès" - -#: src/js/services/feeService.js -msgid "Super Economy" -msgstr "Infimes" - -#: www/views/preferencesAdvanced.html -msgid "Sweep paper wallet" -msgstr "Balayer un portefeuille de papier" - -#: www/views/paperWallet.html -msgid "Sweep Wallet" -msgstr "Balayer un portefeuille" - -#: src/js/services/onGoingProcess.js -msgid "Sweeping Wallet..." -msgstr "Balayage du portefeuille..." - -#: www/views/walletHome.html -msgid "Tap and hold to show" -msgstr "Appuyez et maintenez pour afficher" - -#: www/views/walletHome.html -msgid "Tap to retry" -msgstr "Tapotez pour réessayer" - -#: www/views/disclaimer.html -#: www/views/preferencesAbout.html -msgid "Terms of Use" -msgstr "Conditions d'utilisation" - -#: www/views/includes/terms.html -msgid "The authors of the software, employees and affiliates of Bitpay, copyright holders, and BitPay, Inc. cannot retrieve your private keys or passwords if you lose or forget them and cannot guarantee transaction confirmation as they do not have control over the Bitcoin network." -msgstr "Les auteurs de ce logiciel, employés et sociétés affiliés à BitPay, détenteurs de droits d'auteur, et BitPay, Inc. ne peuvent pas récupérer vos clés privées ou mots de passe si vous les perdez et ne peuvent pas garantir la confirmation des transactions étant donné qu'ils n'ont pas de contrôle sur le réseau Bitcoin." - -#: www/views/import.html -msgid "The derivation path" -msgstr "Le chemin de dérivation" - -#: src/js/services/ledger.js -msgid "The Ledger Chrome application is not installed" -msgstr "L'application Ledger pour Chrome n'est pas installée" - -#: www/views/import.html -msgid "The password of the recovery phrase (if set)" -msgstr "Le mot de passe de la phrase de récupération (si configuré)" - -#: src/js/controllers/walletHome.js -msgid "The payment was created but could not be completed. Please try again from home screen" -msgstr "Le paiement a été créé mais n'a pas pu être achevé. Veuillez réessayer depuis l'écran d'accueil" - -#: www/views/modals/txp-details.html -msgid "The payment was removed by creator" -msgstr "Le paiement a été supprimé par le créateur" - -#: www/views/create.html -#: www/views/join.html -msgid "The recovery phrase could require a password to be imported" -msgstr "La phrase de récupération pourrait demander un mot de passe pour être importée" - -#: src/js/services/bwcError.js -msgid "The request could not be understood by the server" -msgstr "La demande n'a pas été comprise par le serveur" - -#: www/views/includes/terms.html -msgid "The software does not constitute an account where BitPay or other third parties serve as financial intermediaries or custodians of your bitcoin." -msgstr "Le logiciel ne constitue pas un compte où BitPay, ou des tiers, agissent comme des intermédiaires financiers ou dépositaires de vos bitcoins." - -#: www/views/includes/terms.html -msgid "The software you are about to use functions as a free, open source, and multi-signature digital wallet." -msgstr "Le logiciel que vous êtes sur le point d'utiliser fonctionne comme un portefeuille numérique gratuit, open source et multi-signatures." - -#: src/js/services/bwcError.js -msgid "The spend proposal is not pending" -msgstr "La proposition de dépense n'est pas en attente" - -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -msgid "The wallet \"{{walletName}}\" was deleted" -msgstr "Le portefeuille \"{{walletName}}\" a été supprimé" - -#: www/views/import.html -msgid "The Wallet Recovery Phrase could require a password to be imported" -msgstr "La phrase de récupération du portefeuille pourrait demander un mot de passe pour être importée" - -#: www/views/import.html -msgid "The wallet service URL" -msgstr "L’URL du service de portefeuille" - -#: www/views/paymentUri.html -msgid "There are no wallets to make this payment" -msgstr "Il n'y a pas de portefeuilles pour faire ce paiement" - -#: src/js/controllers/index.js -msgid "There is a new version of Copay. Please update" -msgstr "Il y a une nouvelle version de Copay. Veuillez mettre à jour" - -#: src/js/controllers/import.js -msgid "There is an error in the form" -msgstr "Il y a une erreur dans la forme" - -#: www/views/backup.html -msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." -msgstr "Cette phrase de récupération a été créée avec un mot de passe. Pour récupérer ce portefeuille, la phrase de récupération et le mot de passe sont requis." - -#: www/views/modals/tx-details.html -msgid "This transaction has become invalid; possibly due to a double spend attempt." -msgstr "Cette transaction est devenue invalide ; il s'agit peut-être d'une tentative de double dépense." - -#: www/views/walletHome.html -msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." -msgstr "Ce portefeuille n'est pas enregistré dans le Bitcore Wallet Service (BWS) donné. Vous pouvez le recréer depuis l'information locale." - -#: www/views/modals/txp-details.html -msgid "Time" -msgstr "Ancienneté" - -#: www/views/includes/output.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/walletHome.html -msgid "To" -msgstr "À" - -#: www/views/backup.html -msgid "To restore this {{index.m}}-{{index.n}} shared wallet you will need" -msgstr "Pour restaurer ce portefeuille partagé {{index.m}}-{{index.n}} vous aurez besoin de" - -#: www/views/includes/terms.html -msgid "To the fullest extent permitted by law, this software is provided “as is” and no representations or warranties can be made of any kind, express or implied, including but not limited to the warranties of merchantability, fitness or a particular purpose and noninfringement." -msgstr "Dans toute la mesure permise par la loi, ce logiciel est fourni “tel quel” et aucune représentation ou garantie ne peut être faite de toute nature, expresse ou implicite, y compris, mais sans s'y limiter, aux garanties de qualité marchande, à la conformité ou à un usage particulier et absent de contrefaçon." - -#: www/views/walletHome.html -msgid "too long!" -msgstr "trop long !" - -#: www/views/walletHome.html -msgid "Total Locked Balance" -msgstr "Solde verrouillé total" - -#: www/views/create.html -msgid "Total number of copayers" -msgstr "Nombre total de copayers" - -#: src/js/services/fingerprintService.js -msgid "Touch ID Failed" -msgstr "Touch ID a échoué" - -#: www/views/modals/tx-details.html -msgid "Transaction" -msgstr "Transaction" - -#: src/js/services/bwcError.js -msgid "Transaction already broadcasted" -msgstr "Transaction déjà diffusée" - -#: www/views/preferencesAdvanced.html -msgid "Transaction History" -msgstr "Historique des transactions" - -#: www/views/translators.html -msgid "Translation Credits" -msgstr "Crédits de traduction" - -#: www/views/preferencesAbout.html -msgid "Translators" -msgstr "Traducteurs" - -#: www/views/backup.html -msgid "Try again" -msgstr "Réessayer" - -#: www/views/import.html -msgid "Type the Recovery Phrase (usually 12 words)" -msgstr "Saisissez la phrase de récupération (généralement 12 mots)" - -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html -msgid "Unconfirmed" -msgstr "Non confirmée" - -#: www/views/preferencesGlobal.html -msgid "Unit" -msgstr "Unité" - -#: www/views/walletHome.html -msgid "Unsent transactions" -msgstr "Transactions non envoyées" - -#: www/views/walletHome.html -msgid "Updating transaction history. Please stand by." -msgstr "Mise à jour de l'historique des transactions. Veuillez patienter." - -#: www/views/walletHome.html -msgid "Updating Wallet..." -msgstr "Mise à jour du portefeuille..." - -#: www/views/preferencesGlobal.html -msgid "Use Unconfirmed Funds" -msgstr "Utiliser les fonds non confirmés" - -#: src/js/services/onGoingProcess.js -msgid "Validating recovery phrase..." -msgstr "Validation de la phrase de récupération..." - -#: src/js/services/onGoingProcess.js -msgid "Validating wallet integrity..." -msgstr "Validation de l’intégrité du portefeuille..." - -#: www/views/preferencesAbout.html -msgid "Version" -msgstr "Version" - -#: www/views/export.html -msgid "View" -msgstr "Voir" - -#: www/views/copayers.html -msgid "Waiting for copayers" -msgstr "Attente des copayers" - -#: src/js/services/onGoingProcess.js -msgid "Waiting for Ledger..." -msgstr "En attente de Ledger..." - -#: src/js/services/onGoingProcess.js -msgid "Waiting for Trezor..." -msgstr "En attente de Trezor..." - -#: www/views/copayers.html -msgid "Waiting..." -msgstr "Attente..." - -#: src/js/services/bwcError.js -msgid "Wallet already exists" -msgstr "Le portefeuille existe déjà" - -#: src/js/services/profileService.js -msgid "Wallet already in Copay" -msgstr "Le portefeuille existe déjà dans Copay" - -#: www/views/preferencesInformation.html -msgid "Wallet Configuration (m-n)" -msgstr "Configuration du portefeuille (m-n)" - -#: www/views/export.html -msgid "Wallet Export" -msgstr "Exportation du portefeuille" - -#: www/views/preferencesInformation.html -msgid "Wallet Id" -msgstr "Id du portefeuille" - -#: www/views/copayers.html -msgid "Wallet incomplete and broken" -msgstr "Portefeuille incomplet et cassé " - -#: www/views/preferencesAdvanced.html -#: www/views/preferencesInformation.html -msgid "Wallet Information" -msgstr "Informations du portefeuille" - -#: www/views/join.html -msgid "Wallet Invitation" -msgstr "Invitation de portefeuille" - -#: www/views/join.html -msgid "Wallet Invitation is not valid!" -msgstr "L'invitation de portefeuille n'est pas valide !" - -#: src/js/services/bwcError.js -msgid "Wallet is full" -msgstr "Le portefeuille est plein" - -#: src/js/services/bwcError.js -msgid "Wallet is locked" -msgstr "Le portefeuille est verrouillé" - -#: src/js/services/bwcError.js -msgid "Wallet is not complete" -msgstr "Le portefeuille n'est pas complet" - -#: www/views/create.html -msgid "Wallet name" -msgstr "Nom du portefeuille" - -#: www/views/preferencesInformation.html -msgid "Wallet Name (at creation)" -msgstr "Nom du portefeuille (à la création)" - -#: src/js/services/bwcError.js -msgid "Wallet needs backup" -msgstr "Le portefeuille a besoin d'une sauvegarde" - -#: www/views/preferencesInformation.html -msgid "Wallet Network" -msgstr "Réseau du portefeuille" - -#: src/js/services/bwcError.js -msgid "Wallet not found" -msgstr "Portefeuille introuvable" - -#: src/js/services/bwcError.js -msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" -msgstr "Le portefeuille n'est pas enregistré au Wallet Service. Vous pouvez le recréer depuis « Créer » en utilisant les « Options avancées » pour configurer votre phrase de récupération" - -#: src/js/controllers/index.js -msgid "Wallet Preferences" -msgstr "Préférences du portefeuille" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -msgid "Wallet Recovery Phrase" -msgstr "Phrase de récupération" - -#: src/js/services/bwcError.js -msgid "Wallet Recovery Phrase is invalid" -msgstr "La phrase de récupération du portefeuille est invalide" - -#: www/views/backup.html -#: www/views/preferencesDeleteWords.html -msgid "Wallet recovery phrase not available. You can still export it from Advanced > Export." -msgstr "La phrase de récupération du portefeuille n'est pas disponible. Vous pouvez toujours l'exporter depuis les « Paramètres avancés » > « Exporter »." - -#: src/js/services/bwcError.js -msgid "Wallet service not found" -msgstr "Wallet Service introuvable" - -#: www/views/walletHome.html -msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." -msgstr "ATTENTION : La dérivation de la clé ne fonctionne pas sur cet appareil / portefeuille. Impossible d’effectuer des actions sur ce portefeuille." - -#: www/views/export.html -msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." -msgstr "ATTENTION : Ne pas inclure la clé privée permet de vérifier le solde du portefeuille, l'historique des transactions, et de créer des demandes de dépenses depuis le fichier exporté. Cependant, cela ne permet pas d'approuver (signer) les propositions et les fonds ne seront pas accessibles depuis le fichier exporté." - -#: www/views/create.html -#: www/views/join.html -msgid "WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password." -msgstr "ATTENTION : Le mot de passe ne peut pas être récupéré. Veillez l'écrire sur papier. Le portefeuille ne peut pas être restauré sans le mot de passe." - -#: www/views/export.html -msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." -msgstr "ATTENTION : La clé privée de ce portefeuille n'est pas disponible. L'exportation permet de vérifier le solde du portefeuille, l'historique des transactions, et de créer des propositions de dépenses depuis le fichier exporté. Cependant, cela ne permet pas d'approuver (signer) les propositions et les fonds ne seront pas accessibles depuis le fichier exporté." - -#: www/views/modals/txp-details.html -msgid "Warning: this transaction has unconfirmed inputs" -msgstr "ATTENTION : Cette transaction a des entrées non confirmées" - -#: www/views/modals/paypro.html -msgid "WARNING: UNTRUSTED CERTIFICATE" -msgstr "ATTENTION : CERTIFICAT NON APPROUVÉ" - -#: www/views/walletHome.html -msgid "WARNING: Wallet not registered" -msgstr "ATTENTION : Portefeuille non enregistré" - -#: www/views/preferencesDeleteWallet.html -#: www/views/preferencesDeleteWords.html -msgid "Warning!" -msgstr "Attention !" - -#: www/views/includes/terms.html -msgid "We reserve the right to modify this disclaimer from time to time." -msgstr "Nous nous réservons le droit de modifier cette clause de non-responsabilité de temps à autre." - -#: www/views/disclaimer.html -msgid "WELCOME TO COPAY" -msgstr "BIENVENUE SUR COPAY" - -#: www/views/includes/terms.html -msgid "While the software has undergone beta testing and continues to be improved by feedback from the open-source user and developer community, we cannot guarantee that there will be no bugs in the software." -msgstr "Bien que le logiciel ait subi des tests bêta et continue d'être amélioré par les retours d'utilisateurs et de développeurs de la communauté open source, nous ne pouvons pas garantir qu'il n'y aura plus de bugs dans le logiciel." - -#: www/views/backup.html -msgid "Write your wallet recovery phrase" -msgstr "Écrivez votre phrase de récupération du portefeuille" - -#: src/js/controllers/import.js -msgid "Wrong number of recovery words:" -msgstr "Nombre incorrect de mots de récupération :" - -#: src/js/services/bwcError.js -msgid "Wrong spending password" -msgstr "Code de dépenses incorrect" - -#: www/views/modals/confirmation.html -msgid "Yes" -msgstr "Oui" - -#: www/views/includes/terms.html -msgid "You acknowledge that your use of this software is at your own discretion and in compliance with all applicable laws." -msgstr "Vous reconnaissez que votre utilisation de ce logiciel est à votre propre discrétion et est en conformité avec toutes les lois applicables." - -#: www/views/includes/terms.html -msgid "You are responsible for safekeeping your passwords, private key pairs, PINs and any other codes you use to access the software." -msgstr "Vous êtes responsable de la sauvegarde de vos mots de passe, paires de clés privées, codes PIN et autres codes que vous utilisez pour accéder au logiciel." - -#: www/views/includes/terms.html -msgid "You assume any and all risks associated with the use of the software." -msgstr "Vous assumez tous les risques associés à l'utilisation du logiciel." - -#: www/views/backup.html -msgid "You backed up your wallet. You can now restore this wallet at any time." -msgstr "Vous avez sauvegardé votre portefeuille. Vous pouvez maintenant restaurer ce portefeuille à n'importe quel moment." - -#: www/views/backup.html -msgid "You can safely install your wallet on another device and use it from multiple devices at the same time." -msgstr "Vous pouvez installer en toute sécurité votre portefeuille sur un autre appareil et l'utiliser à partir de plusieurs périphériques en même temps." - -#: www/views/walletHome.html -msgid "You do not have any wallet" -msgstr "Vous n'avez aucun portefeuille" - -#: www/views/backup.html -msgid "You need the wallet recovery phrase to restore this personal wallet. Write it down and keep them somewhere safe." -msgstr "Vous avez besoin de la phrase de récupération du portefeuille pour restaurer ce portefeuille personnel. Notez-la et conservez-la dans un endroit sûr." - -#: www/views/create.html -#: www/views/join.html -msgid "Your nickname" -msgstr "Votre surnom" - -#: www/views/export.html -#: www/views/import.html -msgid "Your password" -msgstr "Votre mot de passe" - -#: www/views/includes/password.html -msgid "Your spending password" -msgstr "Votre code de dépenses" - -#: src/js/controllers/import.js -msgid "Your wallet has been imported correctly" -msgstr "Votre portefeuille a été correctement importé" - -#: www/views/includes/password.html -msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down" -msgstr "La clé de votre portefeuille sera chiffrée. Le code de dépenses ne peut pas être récupéré. N'oubliez pas de l'écrire" - -#: www/views/backup.html -msgid "Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend." -msgstr "Votre phrase de récupération du portefeuille et l'accès au serveur qui a coordonné la création du portefeuille initial. Vous avez encore besoin de {{index.m}} clés pour dépenser." - +#: src/js/controllers/activity.js:45 +#: src/js/controllers/addressbook.js:50 +#: src/js/controllers/addressbookAdd.js:30 +#: src/js/controllers/addresses.js:24 +#: src/js/controllers/addresses.js:32 +#: src/js/controllers/addresses.js:84 +#: src/js/controllers/addresses.js:85 +#: src/js/controllers/amazon.js:15 +#: src/js/controllers/amazon.js:25 +#: src/js/controllers/amazon.js:46 +#: src/js/controllers/amazon.js:66 +#: src/js/controllers/amount.js:265 +#: src/js/controllers/amount.js:272 +#: src/js/controllers/amount.js:280 +#: src/js/controllers/amount.js:309 +#: src/js/controllers/amount.js:322 +#: src/js/controllers/amount.js:329 +#: src/js/controllers/amount.js:338 +#: src/js/controllers/bitpayCard.js:145 +#: src/js/controllers/bitpayCard.js:68 +#: src/js/controllers/bitpayCardIntro.js:27 +#: src/js/controllers/confirm.js:152 +#: src/js/controllers/confirm.js:165 +#: src/js/controllers/confirm.js:171 +#: src/js/controllers/confirm.js:449 +#: src/js/controllers/confirm.js:460 +#: src/js/controllers/confirm.js:472 +#: src/js/controllers/confirm.js:621 +#: src/js/controllers/confirm.js:649 +#: src/js/controllers/confirm.js:655 +#: src/js/controllers/confirm.js:683 +#: src/js/controllers/confirm.js:689 +#: src/js/controllers/confirm.js:696 +#: src/js/controllers/confirm.js:703 +#: src/js/controllers/confirm.js:721 +#: src/js/controllers/confirm.js:740 +#: src/js/controllers/confirm.js:754 +#: src/js/controllers/confirm.js:797 +#: src/js/controllers/copayers.js:54 +#: src/js/controllers/create.js:101 +#: src/js/controllers/create.js:129 +#: src/js/controllers/create.js:142 +#: src/js/controllers/create.js:149 +#: src/js/controllers/create.js:164 +#: src/js/controllers/create.js:182 +#: src/js/controllers/export.js:110 +#: src/js/controllers/export.js:138 +#: src/js/controllers/export.js:144 +#: src/js/controllers/export.js:155 +#: src/js/controllers/export.js:35 +#: src/js/controllers/export.js:93 +#: src/js/controllers/export.js:99 +#: src/js/controllers/feedback/send.js:23 +#: src/js/controllers/glidera.js:100 +#: src/js/controllers/glidera.js:27 +#: src/js/controllers/glidera.js:82 +#: src/js/controllers/glideraUri.js:13 +#: src/js/controllers/import.js:114 +#: src/js/controllers/import.js:164 +#: src/js/controllers/import.js:192 +#: src/js/controllers/import.js:201 +#: src/js/controllers/import.js:216 +#: src/js/controllers/import.js:228 +#: src/js/controllers/import.js:239 +#: src/js/controllers/import.js:248 +#: src/js/controllers/import.js:261 +#: src/js/controllers/import.js:273 +#: src/js/controllers/import.js:283 +#: src/js/controllers/import.js:293 +#: src/js/controllers/import.js:317 +#: src/js/controllers/import.js:329 +#: src/js/controllers/import.js:50 +#: src/js/controllers/import.js:63 +#: src/js/controllers/import.js:84 +#: src/js/controllers/import.js:96 +#: src/js/controllers/join.js:108 +#: src/js/controllers/join.js:122 +#: src/js/controllers/join.js:129 +#: src/js/controllers/join.js:143 +#: src/js/controllers/join.js:161 +#: src/js/controllers/join.js:86 +#: src/js/controllers/modals/amazonCardDetails.js:10 +#: src/js/controllers/modals/amazonCardDetails.js:32 +#: src/js/controllers/modals/amazonCardDetails.js:40 +#: src/js/controllers/modals/txpDetails.js:113 +#: src/js/controllers/paperWallet.js:47 +#: src/js/controllers/preferencesBitpayCard.js:16 +#: src/js/controllers/preferencesDelete.js:22 +#: src/js/controllers/preferencesFee.js:9 +#: src/js/controllers/preferencesGlidera.js:60 +#: src/js/controllers/tab-home.js:154 +#: src/js/controllers/tab-receive.js:24 +#: src/js/controllers/tabsController.js:7 +#: src/js/controllers/tx-details.js:18 +msgid "Error" +msgstr "Erreur" + +#: src/js/controllers/confirm.js:353 +msgid "Error at confirm" +msgstr "Erreur à la confirmation" + +#: src/js/services/profileService.js:424 +msgid "Error creating wallet" +msgstr "Erreur de création du portefeuille" + +#: src/js/controllers/paperWallet.js:41 +msgid "Error scanning funds:" +msgstr "Erreur de numérisation des fonds :" + +#: src/js/controllers/paperWallet.js:91 +msgid "Error sweeping wallet:" +msgstr "Erreur de balayage de portefeuille :" + +#: src/js/services/bwcError.js:143 +msgid "Exceeded daily limit of $500 per user" +msgstr "La limite quotidienne de 500$ par utilisateur a été dépassée" + +#: www/views/advancedSettings.html:40 +msgid "Experimental Features" +msgstr "Fonctionnalités expérimentales" + +#: src/js/controllers/confirm.js:311 +#: www/views/confirm.html:30 +#: www/views/modals/txp-details.html:114 +msgid "Expired" +msgstr "Expiré" + +#: www/views/modals/paypro.html:52 +#: www/views/modals/txp-details.html:120 +msgid "Expires" +msgstr "Expire" + +#: www/views/preferencesAdvanced.html:16 +msgid "Export Wallet" +msgstr "Exporter le portefeuille" + +#: www/views/preferencesHistory.html:10 +#: www/views/preferencesHistory.html:13 +msgid "Export to file" +msgstr "Exporter vers un fichier" + +#: www/views/export.html:3 +msgid "Export wallet" +msgstr "Exporter le portefeuille" + +#: src/js/services/walletService.js:999 +#: www/views/tab-export-qrCode.html:9 +msgid "Exporting via QR not supported for this wallet" +msgstr "L'exportation via QR n'est pas supportée pour ce portefeuille" + +#: www/views/preferencesInformation.html:76 +msgid "Extended Public Keys" +msgstr "Clés publiques étendues" + +#: src/js/services/onGoingProcess.js:19 +msgid "Extracting Wallet Information..." +msgstr "Extraction des informations du portefeuille..." + +#: src/js/controllers/export.js:110 +#: src/js/controllers/export.js:144 +#: src/js/controllers/export.js:155 +#: src/js/controllers/export.js:99 +#: www/views/tab-export-file.html:4 +msgid "Failed to export" +msgstr "Impossible d'exporter" + +#: www/views/tab-create-personal.html:14 +#: www/views/tab-create-shared.html:14 +msgid "Family vacation funds" +msgstr "Fonds pour les vacances familiales" + +#: www/views/includes/confirm-tx.html:19 +#: www/views/modals/txp-details.html:95 +#: www/views/tx-details.html:71 +msgid "Fee" +msgstr "Frais" + +#: www/views/confirm.html:79 +msgid "Fee: {{feeLevel}}" +msgstr "Frais : {{feeLevel}}" + +#: src/js/controllers/feedback/send.js:23 +msgid "Feedback could not be submitted. Please try again later." +msgstr "Vos commentaires n'ont pas pu être envoyés. Veuillez réessayer plus tard." + +#: src/js/services/onGoingProcess.js:20 +msgid "Fetching Payment Information" +msgstr "Récupération des informations de paiement" + +#: www/views/export.html:11 +#: www/views/import.html:16 +msgid "File/Text" +msgstr "Fichier / Texte" + +#: src/js/services/fingerprintService.js:43 +#: src/js/services/fingerprintService.js:48 +msgid "Finger Scan Failed" +msgstr "La numérisation digitale a échoué" + +#: src/js/controllers/feedback/send.js:34 +#: www/views/customAmount.html:9 +msgid "Finish" +msgstr "Terminer" + +#: www/views/tab-create-personal.html:95 +#: www/views/tab-create-shared.html:125 +msgid "For audit purposes" +msgstr "À des fins de vérification" + +#: www/views/paperWallet.html:34 +msgid "Founds transferred" +msgstr "Fonds transférés" + +#: www/views/translators.html:13 +msgid "French" +msgstr "Français" + +#: www/views/confirm.html:60 +#: www/views/confirm.html:62 +#: www/views/modals/txp-details.html:74 +#: www/views/tx-details.html:48 +msgid "From" +msgstr "De" + +#: www/views/tab-export-qrCode.html:5 +msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" +msgstr "Depuis le périphérique de destination, allez sur « Ajouter portefeuille » > « Importer » et numérisez ce code QR" + +#: src/js/services/bwcError.js:74 +msgid "Funds are locked by pending spend proposals" +msgstr "Les fonds sont verrouillés par des propositions de dépenses en attente" + +#: www/views/paperWallet.html:16 +msgid "Funds found:" +msgstr "Fonds trouvés :" + +#: www/views/paperWallet.html:23 +msgid "Funds will be transferred to" +msgstr "Les fonds seront transférés à" + +#: src/js/services/onGoingProcess.js:21 +msgid "Generating .csv file..." +msgstr "Génération du fichier .csv..." + +#: src/js/services/onGoingProcess.js:37 +msgid "Generating new address..." +msgstr "Génération d'une nouvelle adresse..." + +#: www/views/bitpayCardIntro.html:23 +msgid "Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply." +msgstr "Retirez de l'argent partout où vous allez, depuis n'importe quel distributeur compatible Visa®. Des frais bancaires de distributeur peuvent s'appliquer." + +#: www/views/onboarding/collectEmail.html:15 +msgid "Get news and updates from BitPay" +msgstr "Obtenir les actualités et mises à jour de BitPay" + +#: www/views/onboarding/welcome.html:9 +msgid "Get started" +msgstr "Commencer" + +#: src/js/services/onGoingProcess.js:38 +msgid "Getting addresses..." +msgstr "Obtention d'adresses..." + +#: src/js/services/onGoingProcess.js:22 +msgid "Getting fee levels..." +msgstr "Obtention des niveaux de frais..." + +#: www/views/glidera.html:39 +msgid "Glidera Inc. (Glidera) is providing the service of buying or selling bitcoin to BitPay users. To enable this service, Glidera has registered with US Treasury Department’s FinCEN as a Money Service Business (#31000042625755). Users of BitPay must agree to the service agreement presented by Glidera prior to obtaining Glidera’s service of buying or selling bitcoin." +msgstr "Glidera Inc. (Glidera) fournit le service d’achat ou de vente de bitcoins aux utilisateurs de BitPay. Pour autoriser ce service, Glidera a été enregistré avec le FinCEN du département du Trésor des États-Unis comme une Money Service Business (#31000042625755). Les utilisateurs de BitPay doivent accepter le contrat de service présenté par Glidera avant d’obtenir le service d’achat ou de vente de bitcoins par Glidera." + +#: src/js/controllers/bitpayCardIntro.js:35 +#: src/js/controllers/onboarding/backupRequest.js:13 +#: src/js/controllers/onboarding/backupRequest.js:19 +#: www/views/includes/backupLaterPopup.html:4 +msgid "Go back" +msgstr "Retour" + +#: www/views/includes/backupWarningPopup.html:4 +#: www/views/includes/confirmBackupPopup.html:8 +msgid "Got it" +msgstr "J'ai compris" + +#: www/views/preferences.html:20 +#: www/views/preferencesInformation.html:47 +msgid "Hardware Wallet" +msgstr "Portefeuille matériel" + +#: www/views/import.html:20 +msgid "Hardware wallet" +msgstr "Portefeuille matériel" + +#: www/views/glidera.html:34 +msgid "Have the OAuth Code?" +msgstr "Vous avez le code OAuth ?" + +#: www/views/tab-settings.html:27 +msgid "Help & Support" +msgstr "Aide & Support" + +#: www/views/addresses.html:29 +msgid "Hide" +msgstr "Masquer" + +#: www/views/preferences.html:34 +msgid "Hide Balance" +msgstr "Masquer le solde" + +#: www/views/join.html:48 +#: www/views/tab-create-personal.html:25 +#: www/views/tab-create-shared.html:55 +#: www/views/tab-export-file.html:23 +#: www/views/tab-import-file.html:28 +#: www/views/tab-import-hardware.html:31 +#: www/views/tab-import-phrase.html:31 +msgid "Hide advanced options" +msgstr "Masquer les options avancées" + +#: www/views/tabs.html:3 +msgid "Home" +msgstr "Accueil" + +#: src/js/controllers/feedback/send.js:55 +#: src/js/controllers/feedback/send.js:59 +#: src/js/controllers/feedback/send.js:63 +msgid "How could we improve your experience?" +msgstr "Comment pourrions-nous améliorer votre expérience ?" + +#: www/views/feedback/rateCard.html:3 +msgid "How do you like BitPay?" +msgstr "Comment avez-vous trouvé BitPay ?" + +#: src/js/controllers/feedback/rateCard.js:28 +msgid "I don't like it" +msgstr "Je ne l'aime pas" + +#: www/views/onboarding/disclaimer.html:44 +msgid "I have read, understood, and agree to the Terms of Use." +msgstr "J’ai lu, compris et suis d'accord avec les Conditions d'utilisation." + +#: www/views/modals/terms.html:22 +msgid "I have read, understood, and agree with the Terms of use." +msgstr "J'ai lu, compris et suis d'accord avec les conditions d'utilisation." + +#: www/views/join.html:112 +#: www/views/tab-create-personal.html:79 +#: www/views/tab-create-shared.html:109 +msgid "I have written it down" +msgstr "Je l'ai bien écrite" + +#: src/js/controllers/feedback/rateCard.js:34 +msgid "I like the app" +msgstr "J'aime l'appli" + +#: src/js/controllers/feedback/rateCard.js:25 +msgid "I think this app is terrible." +msgstr "Je pense que l'appli est mauvaise." + +#: src/js/controllers/onboarding/backupRequest.js:12 +#: www/views/includes/backupLaterPopup.html:7 +#: www/views/includes/screenshotWarningModal.html:9 +msgid "I understand" +msgstr "Je comprends" + +#: www/views/onboarding/disclaimer.html:21 +msgid "I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase." +msgstr "Je comprends que si cette application est déplacée vers un autre appareil ou supprimée, mes bitcoins ne peuvent être récupérés qu'avec la phrase de sauvegarde." + +#: www/views/onboarding/disclaimer.html:18 +msgid "I understand that my funds are held securely on this device, not by a company." +msgstr "Je comprends que mes fonds sont en toute sécurité sur cet appareil et non détenus par une entreprise." + +#: www/views/onboarding/backupRequest.html:12 +msgid "I'll backup my wallet later" +msgstr "Je sauvegarderai mon portefeuille plus tard" + +#: www/views/includes/backupNeededPopup.html:10 +msgid "I'll do it later" +msgstr "Je le ferai plus tard" + +#: www/views/backup.html:29 +msgid "I've written it down" +msgstr "Je l'ai bien écrite" + +#: www/views/advancedSettings.html:50 +msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab." +msgstr "Si ceci est activé, la carte des transactions récentes - une liste des transactions qui se produisent dans l’ensemble des portefeuilles - s’affiche dans l’onglet Accueil." + +#: www/views/advancedSettings.html:36 +msgid "If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays." +msgstr "Si ceci est activé, les portefeuilles vont également essayer de dépenser des fonds non confirmés. Cette option peut entraîner des retards de transaction." + +#: www/views/includes/backupLaterPopup.html:3 +msgid "If something happens to this device, this app is deleted, or your password forgotten, neither you nor Bitpay can recover your funds." +msgstr "Si quelque chose arrive à cet appareil, que cette appli est supprimée ou votre mot de passe oublié, ni vous ni Bitpay ne peuvent récupérer vos fonds." + +#: src/js/controllers/onboarding/backupRequest.js:11 +msgid "If this device is replaced or this app is deleted, neither you nor BitPay can recover your funds without a backup." +msgstr "Si cet appareil est remplacé ou si cette appli est supprimée, ni vous ni BitPay ne peuvent récupérer vos fonds sans une sauvegarde." + +#: www/views/feedback/complete.html:19 +msgid "If you have additional feedback, please let us know by tapping the \"Send feedback\" option in the Settings tab." +msgstr "Si vous avez d'autres commentaires, veuillez nous en informer en appuyant sur l'option « Envoyer un avis » dans l'onglet Paramètres." + +#: www/views/includes/screenshotWarningModal.html:8 +msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen." +msgstr "Si vous prenez une capture d’écran, votre sauvegarde peut être vue par d’autres applications. Vous pouvez faire une sauvegarde physique sécurisée avec du papier et un stylo." + +#: www/views/tab-import-hardware.html:42 +#: www/views/tab-import-phrase.html:61 +msgid "Import" +msgstr "Importer" + +#: www/views/import.html:3 +msgid "Import Wallet" +msgstr "Importer un portefeuille" + +#: www/views/tab-import-file.html:39 +msgid "Import backup" +msgstr "Importer la sauvegarde" + +#: www/views/add.html:38 +msgid "Import wallet" +msgstr "Importer" + +#: src/js/services/onGoingProcess.js:23 +msgid "Importing Wallet..." +msgstr "Importation du portefeuille..." + +#: www/views/backup.html:65 +msgid "In order to verify your wallet backup, please type your password." +msgstr "Afin de vérifier la sauvegarde de votre portefeuille, veuillez saisir votre mot de passe." + +#: www/views/includes/walletSelector.html:18 +#: www/views/tab-home.html:79 +#: www/views/tab-settings.html:114 +msgid "Incomplete" +msgstr "Non terminé" + +#: www/views/tab-receive.html:35 +msgid "Incomplete wallet" +msgstr "Portefeuille non terminé" + +#: src/js/services/bwcError.js:113 +msgid "Incorrect address network" +msgstr "Adresse réseau incorrecte" + +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/import.js:50 +msgid "Incorrect code format" +msgstr "Format du code incorrect" + +#: src/js/services/bwcError.js:44 +#: www/views/confirm.html:116 +msgid "Insufficient funds" +msgstr "Fonds insuffisants" + +#: src/js/services/bwcError.js:71 +msgid "Insufficient funds for fee" +msgstr "Fonds insuffisants pour les frais" + +#: www/views/modals/search.html:70 +#: www/views/walletDetails.html:236 +msgid "Invalid" +msgstr "Invalide" + +#: src/js/controllers/create.js:149 +#: src/js/controllers/import.js:293 +#: src/js/controllers/join.js:129 +msgid "Invalid account number" +msgstr "Numéro de compte invalide" + +#: src/js/services/bwcError.js:119 +msgid "Invalid address" +msgstr "Adresse invalide" + +#: src/js/controllers/tabsController.js:7 +msgid "Invalid data" +msgstr "Données invalides" + +#: src/js/controllers/create.js:129 +#: src/js/controllers/import.js:228 +#: src/js/controllers/join.js:108 +msgid "Invalid derivation path" +msgstr "Chemin de dérivation invalide" + +#: src/js/controllers/copayers.js:75 +msgid "Invitation to share a {{appName}} Wallet" +msgstr "Invitation pour partager un portefeuille {{appName}}" + +#: src/js/controllers/feedback/send.js:71 +msgid "Is there anything we could do better?" +msgstr "Y a-t-il quelque chose que nous pourrions améliorer ?" + +#: www/views/backup.html:47 +msgid "Is this correct?" +msgstr "Est-ce correct ?" + +#: www/views/onboarding/collectEmail.html:22 +msgid "Is this email address correct?" +msgstr "Cette adresse e-mail est-elle correcte ?" + +#: www/views/addresses.html:29 +msgid "It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers." +msgstr "C’est une bonne idée d'éviter la réutilisation des adresses. Cela fois protège votre anonymat et garde vos bitcoins en sécurité contre les attaques hypothétiques des ordinateurs quantiques." + +#: src/js/controllers/backup.js:76 +msgid "It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again." +msgstr "Il est important d’écrire correctement votre phrase de sauvegarde. Si quelque chose arrive à votre portefeuille, vous aurez besoin de cette sauvegarde afin de récupérer votre argent. Vérifiez votre sauvegarde et réessayez." + +#: www/views/join.html:18 +msgid "John" +msgstr "John" + +#: www/views/join.html:126 +msgid "Join" +msgstr "Rejoindre" + +#: src/js/controllers/copayers.js:70 +msgid "Join my {{appName}} Wallet. Here is the invitation code: {{secret}} You can download {{appName}} for your phone or desktop at {{appUrl}}" +msgstr "Rejoins mon portefeuille {{appName}}. Voici le code d'invitation : {{secret}} Tu peux télécharger {{appName}} pour ton téléphone ou pour ton ordinateur sur {{appUrl}}" + +#: www/views/add.html:30 +#: www/views/join.html:5 +msgid "Join shared wallet" +msgstr "Rejoindre" + +#: src/js/services/onGoingProcess.js:24 +msgid "Joining Wallet..." +msgstr "Connexion au portefeuille..." + +#: www/views/onboarding/tour.html:17 +msgid "Just scan the code to pay." +msgstr "Numérisez juste le code pour payer." + +#: src/js/services/bwcError.js:116 +msgid "Key already associated with an existing wallet" +msgstr "La clé est déjà associée avec un portefeuille existant" + +#: www/views/preferencesLanguage.html:4 +#: www/views/tab-settings.html:60 +msgid "Language" +msgstr "Langue" + +#: www/views/bitpayCard.html:56 +msgid "Last Month" +msgstr "Le mois dernier" + +#: www/views/backup.html:36 +msgid "Let's verify your backup phrase." +msgstr "Vérifions votre phrase de sauvegarde." + +#: src/js/services/onGoingProcess.js:35 +msgid "Loading transaction info..." +msgstr "Chargement des infos de transaction..." + +#: src/js/services/bwcError.js:86 +msgid "Locktime in effect. Please wait to create a new spend proposal" +msgstr "Locktime effectif. Veuillez patienter pour créer une nouvelle proposition de dépense" + +#: src/js/services/bwcError.js:89 +msgid "Locktime in effect. Please wait to remove this spend proposal" +msgstr "Locktime effectif. Veuillez patienter pour supprimer cette proposition de dépense" + +#: www/views/paymentUri.html:13 +msgid "Make a payment to" +msgstr "Faire un paiement à" + +#: src/js/controllers/modals/search.js:61 +msgid "Matches:" +msgstr "Correspondances :" + +#: www/views/includes/copayers.html:4 +#: www/views/preferencesInformation.html:72 +msgid "Me" +msgstr "Moi" + +#: src/js/controllers/feedback/rateCard.js:31 +msgid "Meh - it's alright" +msgstr "Ça peut aller" + +#: src/js/controllers/tx-details.js:100 +#: www/views/modals/paypro.html:48 +#: www/views/modals/txp-details.html:89 +#: www/views/tx-details.html:64 +msgid "Memo" +msgstr "Note" + +#: www/views/modals/txp-details.html:126 +msgid "Merchant Message" +msgstr "Message marchand" + +#: www/views/paymentUri.html:17 +msgid "Message" +msgstr "Message" + +#: src/js/services/bwcError.js:134 +msgid "Missing parameter" +msgstr "Paramètre manquant" + +#: src/js/services/bwcError.js:32 +msgid "Missing private keys to sign" +msgstr "Clés privées manquantes pour signer" + +#: www/views/preferences.html:56 +#: www/views/preferencesAdvanced.html:3 +msgid "More Options" +msgstr "Plus d'options" + +#: www/views/modals/search.html:67 +#: www/views/walletDetails.html:234 +msgid "Moved" +msgstr "Déplacés" + +#: src/js/controllers/tx-details.js:24 +msgid "Moved Funds" +msgstr "Fonds déplacés" + +#: www/views/includes/confirm-tx.html:13 +#: www/views/modals/txp-details.html:57 +msgid "Multiple recipients" +msgstr "Plusieurs destinataires" + +#: www/views/tab-import-phrase.html:8 +msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." +msgstr "Remarque : Pour importer un portefeuille d’un autre logiciel que Copay, veuillez aller dans « Ajouter portefeuille » > « Créer » et spécifier la phrase de récupération." + +#: www/views/addressbook.add.html:21 +#: www/views/addressbook.view.html:15 +#: www/views/preferences.html:13 +#: www/views/preferencesAlias.html:17 +msgid "Name" +msgstr "Nom" + +#: www/views/paymentUri.html:18 +msgid "Network" +msgstr "Réseau" + +#: src/js/services/bwcError.js:47 +msgid "Network connection error" +msgstr "Erreur de connexion réseau" + +#: www/views/includes/walletActivity.html:43 +msgid "New Proposal" +msgstr "Nouvelle proposition" + +#: src/js/controllers/addresses.js:85 +msgid "New address could not be generated. Please try again." +msgstr "La nouvelle adresse n'a pas pu être générée. Veuillez réessayer." + +#: www/views/add.html:14 +msgid "New personal wallet" +msgstr "Nouveau portefeuille personnel" + +#: www/views/tab-home.html:146 +msgid "Next steps" +msgstr "Prochaines étapes" + +#: www/views/onboarding/collectEmail.html:27 +msgid "No" +msgstr "Non" + +#: www/views/tab-receive.html:12 +msgid "No Wallet" +msgstr "Aucun portefeuille" + +#: www/views/onboarding/backupRequest.html:5 +msgid "No backup, no bitcoin." +msgstr "Pas de sauvegarde, pas de bitcoin." + +#: www/views/addressbook.html:19 +msgid "No contacts yet" +msgstr "Aucun contact" + +#: www/views/tab-import-hardware.html:3 +msgid "No hardware wallets supported on this device" +msgstr "Aucun portefeuille matériel pris en charge sur cet appareil" + +#: www/views/proposals.html:25 +msgid "No pending proposals" +msgstr "Aucune proposition en attente" + +#: www/views/activity.html:25 +msgid "No recent transactions" +msgstr "Aucune transaction récente" + +#: www/views/walletDetails.html:179 +msgid "No transactions yet" +msgstr "Aucune transaction" + +#: src/js/controllers/amount.js:309 +msgid "No wallet found!" +msgstr "Aucun portefeuille trouvé !" + +#: www/views/confirm.html:113 +msgid "No wallets available" +msgstr "Aucun portefeuille disponible" + +#: www/views/paperWallet.html:28 +msgid "No wallets available to receive funds" +msgstr "Aucun portefeuille disponible pour recevoir des fonds" + +#: src/js/services/feeService.js:9 +msgid "Normal" +msgstr "Normaux" + +#: src/js/services/bwcError.js:80 +msgid "Not authorized" +msgstr "Non autorisé" + +#: src/js/controllers/confirm.js:171 +msgid "Not enough funds for fee" +msgstr "Pas assez de fonds pour les frais" + +#: www/views/onboarding/tour.html:45 +msgid "Not even BitPay can access it." +msgstr "Même BitPay ne peut y accéder." + +#: src/js/controllers/paperWallet.js:47 +msgid "Not funds found" +msgstr "Aucun fonds trouvé" + +#: www/views/feedback/rateApp.html:3 +#: www/views/onboarding/notifications.html:8 +msgid "Not now" +msgstr "Pas maintenant" + +#: www/views/includes/output.html:15 +msgid "Note" +msgstr "Note" + +#: www/views/modals/wallets.html:25 +msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" +msgstr "Note : seuls les portefeuilles 1-1 (signature unique) peuvent être utilisés pour vendre des bitcoins" + +#: www/views/preferencesNotifications.html:10 +#: www/views/preferencesNotifications.html:3 +#: www/views/tab-settings.html:53 +msgid "Notifications" +msgstr "Notifications" + +#: www/views/includes/backupNeededPopup.html:8 +msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." +msgstr "C'est un bon moment pour sauvegarder votre portefeuille. Si cet appareil est perdu, vos fonds seront irrécupérables sans une sauvegarde." + +#: www/views/backupWarning.html:11 +msgid "Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?" +msgstr "C'est un bon moment pour observer autour de vous. Personne aux fenêtres ? Derrière vous ? Aucune caméra cachée ?" + +#: src/js/services/popupService.js:15 +#: src/js/services/popupService.js:57 +msgid "OK" +msgstr "Ok" + +#: www/views/modals/tx-status.html:12 +#: www/views/modals/tx-status.html:24 +#: www/views/modals/tx-status.html:36 +#: www/views/modals/tx-status.html:46 +msgid "OKAY" +msgstr "OK" + +#: www/views/modals/terms.html:15 +#: www/views/termsOfUse.html:12 +msgid "Official English Disclaimer" +msgstr "Clause de non-responsabilité anglaise officielle" + +#: src/js/controllers/feedback/send.js:58 +msgid "Oh no!" +msgstr "Oh non !" + +#: www/views/tab-home.html:29 +msgid "On this screen you can see all your wallets, accounts, and assets." +msgstr "Sur cet écran vous pouvez voir tous vos portefeuilles, comptes et actifs." + +#: www/views/tab-receive.html:41 +msgid "Open wallet" +msgstr "Ouvrir le portefeuille" + +#: www/views/bitpayCardIntro.html:34 +msgid "Order the BitPay Card" +msgstr "Commander la BitPay Card" + +#: www/views/tab-import-file.html:18 +#: www/views/tab-import-phrase.html:36 +msgid "Password" +msgstr "Mot de passe" + +#: src/js/controllers/import.js:63 +msgid "Password required. Make sure to enter your password in advanced options" +msgstr "Mot de passe requis. Veuillez saisir votre mot de passe dans les options avancées" + +#: www/views/join.html:35 +msgid "Paste invitation here" +msgstr "Collez l'invitation ici" + +#: www/views/tab-import-file.html:13 +msgid "Paste the backup plain text code" +msgstr "Collez le code texte de sauvegarde" + +#: www/views/bitpayCardIntro.html:28 +msgid "Pay 0% fees to turn bitcoin into dollars." +msgstr "Aucun frais pour échanger des bitcoins en dollars." + +#: www/views/modals/paypro.html:21 +msgid "Pay To" +msgstr "Payer à" + +#: www/views/modals/tx-status.html:33 +msgid "Payment Accepted" +msgstr "Paiement accepté" + +#: www/views/confirm.html:28 +msgid "Payment Expires:" +msgstr "Le paiement expirera dans :" + +#: www/views/modals/txp-details.html:6 +msgid "Payment Proposal" +msgstr "Proposition de paiement" + +#: www/views/modals/tx-status.html:21 +msgid "Payment Proposal Created" +msgstr "Proposition de paiement créée" + +#: www/views/tab-home.html:36 +msgid "Payment Proposals" +msgstr "Propositions de paiement" + +#: src/js/services/payproService.js:42 +msgid "Payment Protocol Invalid" +msgstr "Protocole de paiement invalide" + +#: src/js/services/payproService.js:18 +msgid "Payment Protocol not supported on Chrome App" +msgstr "Le protocole de paiement n'est pas supporté sur l'application Chrome" + +#: www/views/includes/walletActivity.html:20 +msgid "Payment Received" +msgstr "Paiement reçu" + +#: www/views/modals/tx-status.html:43 +#: www/views/modals/txp-details.html:43 +msgid "Payment Rejected" +msgstr "Paiement rejeté" + +#: www/views/includes/walletActivity.html:11 +#: www/views/modals/txp-details.html:42 +msgid "Payment Sent" +msgstr "Paiement envoyé" + +#: www/views/modals/txp-details.html:32 +msgid "Payment accepted, but not yet broadcasted" +msgstr "Paiement accepté, mais pas encore diffusé" + +#: www/views/modals/txp-details.html:40 +msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." +msgstr "Paiement accepté. Il sera diffusé par Glidera. Dans le cas où il y a un problème, il peut être supprimé 6 heures après avoir été créé." + +#: www/views/modals/txp-details.html:102 +msgid "Payment details" +msgstr "Détails du paiement" + +#: www/views/modals/paypro.html:6 +msgid "Payment request" +msgstr "Demande de paiement" + +#: www/views/bitpayCard.html:99 +msgid "Pending" +msgstr "En attente" + +#: www/views/proposals.html:5 +msgid "Pending Proposals" +msgstr "Propositions en attente" + +#: www/views/preferencesDeleteWallet.html:11 +msgid "Permanently delete this wallet." +msgstr "Supprimer définitivement ce portefeuille." + +#: src/js/services/profileService.js:416 +msgid "Personal Wallet" +msgstr "Portefeuille personnel" + +#: www/views/backup.html:18 +msgid "Please carefully write down this phrase." +msgstr "Veuillez écrire soigneusement cette phrase." + +#: www/views/tab-scan.html:20 +msgid "Please connect a camera to get started." +msgstr "Veuillez connecter une caméra pour commencer." + +#: src/js/controllers/import.js:239 +msgid "Please enter the recovery phrase" +msgstr "Veuillez saisir la phrase de récupération" + +#: src/js/controllers/create.js:101 +#: src/js/controllers/join.js:86 +msgid "Please enter the required fields" +msgstr "Veuillez saisir les champs requis" + +#: src/js/controllers/create.js:142 +#: src/js/controllers/join.js:122 +msgid "Please enter the wallet recovery phrase" +msgstr "Veuillez saisir la phrase de récupération du portefeuille" + +#: www/views/backup.html:46 +msgid "Please tap each word in the correct order." +msgstr "Veuillez sélectionner chaque mot dans le bon ordre." + +#: src/js/services/bwcError.js:101 +msgid "Please upgrade Copay to perform this action" +msgstr "Veuillez mettre à jour Copay pour effectuer cette action" + +#: src/js/controllers/confirm.js:453 +msgid "Please, enter the code below" +msgstr "Veuillez saisir le code ci-dessous" + +#: src/js/controllers/import.js:201 +msgid "Please, select your backup file" +msgstr "Veuillez sélectionner votre fichier de sauvegarde" + +#: www/views/tab-settings.html:47 +msgid "Preferences" +msgstr "Préférences" + +#: src/js/services/onGoingProcess.js:39 +msgid "Preparing addresses..." +msgstr "Préparation des adresses..." + +#: src/js/controllers/export.js:182 +msgid "Preparing backup..." +msgstr "Préparation de la sauvegarde..." + +#: src/js/routes.js:1099 +msgid "Press again to exit" +msgstr "Appuyez de nouveau pour quitter" + +#: src/js/services/feeService.js:8 +msgid "Priority" +msgstr "Importants" + +#: src/js/controllers/paperWallet.js:142 +msgid "Private key encrypted. Enter password" +msgstr "Clé privée chiffrée. Saisissez le mot de passe" + +#: src/js/services/bwcError.js:35 +msgid "Private key is encrypted, cannot sign" +msgstr "La clé privée est chiffrée, impossible de signer" + +#: www/views/includes/walletActivity.html:51 +msgid "Proposal Accepted" +msgstr "Proposition acceptée" + +#: src/js/controllers/modals/txpDetails.js:38 +#: src/js/controllers/tx-details.js:64 +msgid "Proposal Created" +msgstr "Proposition créée" + +#: www/views/includes/walletActivity.html:27 +msgid "Proposal Deleted" +msgstr "Proposition supprimée" + +#: www/views/includes/walletActivity.html:35 +msgid "Proposal Rejected" +msgstr "Proposition rejetée" + +#: www/views/walletDetails.html:164 +msgid "Proposals" +msgstr "Propositions" + +#: www/views/onboarding/notifications.html:3 +msgid "Push Notifications" +msgstr "Notifications" + +#: www/views/preferencesNotifications.html:19 +msgid "Push notifications for {{appName}} are currently disabled. Enable them in the Settings app." +msgstr "Les notifications pour {{appName}} sont actuellement désactivées. Activez-les dans les paramètres de l'appli." + +#: www/views/export.html:14 +msgid "QR Code" +msgstr "Code QR" + +#: www/views/onboarding/disclaimer.html:13 +msgid "Quick review!" +msgstr "Revue rapide !" + +#: src/js/controllers/create.js:70 +#: src/js/controllers/join.js:53 +msgid "Random" +msgstr "Aléatoire" + +#: www/views/feedback/rateApp.html:14 +msgid "Rate on the app store" +msgstr "Évaluer dans la boutique" + +#: www/views/addresses.html:43 +msgid "Read less" +msgstr "En savoir moins" + +#: www/views/addresses.html:42 +msgid "Read more" +msgstr "En savoir plus" + +#: www/views/tab-receive.html:3 +#: www/views/tabs.html:7 +msgid "Receive" +msgstr "Recevoir" + +#: www/views/modals/search.html:51 +#: www/views/walletDetails.html:220 +msgid "Received" +msgstr "Reçus" + +#: src/js/controllers/tx-details.js:23 +msgid "Received Funds" +msgstr "Fonds reçus" + +#: www/views/walletDetails.html:242 +msgid "Receiving" +msgstr "Réception" + +#: www/views/bitpayCard.html:55 +#: www/views/walletDetails.html:199 +msgid "Recent" +msgstr "Récentes" + +#: www/views/advancedSettings.html:48 +msgid "Recent Transaction Card" +msgstr "Carte des transactions récentes" + +#: www/views/activity.html:4 +#: www/views/tab-home.html:48 +msgid "Recent Transactions" +msgstr "Transactions récentes" + +#: www/views/amount.html:18 +#: www/views/tab-send.html:22 +msgid "Recipient" +msgstr "Destinataire" + +#: www/views/modals/txp-details.html:62 +msgid "Recipients" +msgstr "Destinataire(s)" + +#: www/views/import.html:12 +msgid "Recovery phrase" +msgstr "Phrase de récupération" + +#: www/views/walletDetails.html:114 +#: www/views/walletDetails.html:35 +msgid "Recreate" +msgstr "Recréer" + +#: src/js/services/onGoingProcess.js:25 +msgid "Recreating Wallet..." +msgstr "Recréation du portefeuille..." + +#: src/js/controllers/modals/txpDetails.js:40 +#: src/js/controllers/tx-details.js:66 +msgid "Rejected" +msgstr "Rejetée" + +#: src/js/services/onGoingProcess.js:26 +msgid "Rejecting payment proposal" +msgstr "Rejet de la proposition de paiement" + +#: www/views/preferencesAbout.html:9 +msgid "Release information" +msgstr "Informations de version" + +#: www/views/tab-export-file.html:16 +msgid "Repeat password" +msgstr "Confirmez le mot de passe" + +#: www/views/tab-export-file.html:15 +msgid "Repeat the password" +msgstr "Confirmez le mot de passe" + +#: www/views/includes/password.html:5 +msgid "Repeat the spending password" +msgstr "Confirmez le code de dépenses" + +#: www/views/preferences.html:51 +msgid "Request Fingerprint" +msgstr "Demander l'empreinte digitale" + +#: src/js/controllers/tab-receive.js:153 +msgid "Request Specific amount" +msgstr "Demander un montant précis" + +#: www/views/preferences.html:46 +msgid "Request Spending Password" +msgstr "Demander un code de dépenses" + +#: www/views/tab-create-shared.html:42 +msgid "Required number of signatures" +msgstr "Nombre requis de signatures" + +#: www/views/onboarding/welcome.html:10 +msgid "Restore from backup" +msgstr "Restaurer à partir d'une sauvegarde" + +#: src/js/services/onGoingProcess.js:28 +msgid "Retrieving inputs information" +msgstr "Récupération des informations d'entrée" + +#: src/js/controllers/onboarding/tour.js:59 +msgid "Retry" +msgstr "Rééssayer" + +#: www/views/includes/password.html:31 +msgid "SET" +msgstr "DÉFINIR" + +#: www/views/addressbook.add.html:58 +#: www/views/includes/note.html:9 +#: www/views/preferencesAlias.html:21 +#: www/views/preferencesBwsUrl.html:18 +#: www/views/preferencesNotifications.html:42 +msgid "Save" +msgstr "Valider" + +#: www/views/tab-scan.html:3 +#: www/views/tabs.html:11 +msgid "Scan" +msgstr "Numériser" + +#: www/views/tab-scan.html:15 +msgid "Scan QR Codes" +msgstr "Numérisez des codes QR" + +#: src/js/controllers/addresses.js:119 +msgid "Scan addresses for funds" +msgstr "Analyser les adresses pour des fonds" + +#: www/views/walletDetails.html:39 +msgid "Scan status finished with error" +msgstr "Analyse terminée avec des erreurs" + +#: src/js/services/fingerprintService.js:56 +msgid "Scan your fingerprint please" +msgstr "Veuillez scanner votre empreinte digitale" + +#: src/js/services/onGoingProcess.js:29 +msgid "Scanning Wallet funds..." +msgstr "Analyse des fonds du portefeuille..." + +#: www/views/includes/backupWarningPopup.html:2 +#: www/views/includes/screenshotWarningModal.html:7 +msgid "Screenshots are not secure" +msgstr "Les captures d’écran ne sont pas sécurisées" + +#: www/views/modals/search.html:6 +msgid "Search Transactions" +msgstr "Rechercher des transactions" + +#: www/views/tab-send.html:26 +msgid "Search or enter bitcoin address" +msgstr "Recherchez ou saisissez une adresse bitcoin" + +#: www/views/modals/search.html:16 +msgid "Search transactions" +msgstr "Rechercher des transactions" + +#: www/views/preferences.html:37 +msgid "Security" +msgstr "Sécurité " + +#: www/views/tab-import-file.html:7 +msgid "Select a backup file" +msgstr "Sélectionner un fichier de sauvegarde" + +#: www/views/paymentUri.html:30 +msgid "Select a wallet" +msgstr "Sélectionner un portefeuille" + +#: www/views/modals/paypro.html:38 +msgid "Self-signed Certificate" +msgstr "Certificat auto-signé" + +#: src/js/services/onGoingProcess.js:42 +msgid "Selling Bitcoin..." +msgstr "Vente de bitcoins..." + +#: www/views/feedback/send.html:13 +#: www/views/feedback/send.html:43 +#: www/views/tab-send.html:3 +#: www/views/tabs.html:15 +msgid "Send" +msgstr "Envoyer" + +#: www/views/feedback/send.html:3 +#: www/views/tab-settings.html:36 +msgid "Send Feedback" +msgstr "Envoyer un avis" + +#: www/views/addressbook.view.html:27 +msgid "Send Money" +msgstr "Envoyer de l'argent" + +#: src/js/controllers/addresses.js:124 +msgid "Send addresses by email" +msgstr "Envoyer les adresses par e-mail" + +#: www/views/includes/confirm-tx.html:3 +msgid "Send bitcoin" +msgstr "Envoyer les bitcoins" + +#: www/views/preferencesLogs.html:15 +#: www/views/tab-export-file.html:80 +msgid "Send by email" +msgstr "Envoyer par e-mail" + +#: src/js/controllers/confirm.js:247 +msgid "Send from" +msgstr "Envoyer à partir de" + +#: src/js/controllers/amount.js:97 +msgid "Send max amount" +msgstr "Envoyer le montant maximal" + +#: www/views/feedback/rateApp.html:17 +msgid "Send us feedback instead" +msgstr "Nous envoyer un avis à la place" + +#: www/views/confirm.html:15 +#: www/views/includes/txp.html:14 +#: www/views/modals/txp-details.html:19 +#: www/views/walletDetails.html:241 +msgid "Sending" +msgstr "Envoi" + +#: src/js/services/onGoingProcess.js:40 +msgid "Sending 2FA code..." +msgstr "Envoi du code 2FA..." + +#: src/js/services/onGoingProcess.js:36 +msgid "Sending feedback..." +msgstr "Envoi de votre avis..." + +#: www/views/confirm.html:16 +msgid "Sending maximum amount" +msgstr "Envoi du montant maximal" + +#: src/js/services/onGoingProcess.js:30 +msgid "Sending transaction" +msgstr "Envoi de la transaction" + +#: src/js/controllers/confirm.js:505 +msgid "Sending {{amountStr}} from your {{name}} wallet" +msgstr "Envoi de {{amountStr}} depuis votre portefeuille {{name}}" + +#: www/views/modals/search.html:60 +#: www/views/modals/tx-status.html:9 +#: www/views/walletDetails.html:229 +msgid "Sent" +msgstr "Envoyés" + +#: src/js/controllers/tx-details.js:22 +msgid "Sent Funds" +msgstr "Fonds envoyés" + +#: src/js/services/bwcError.js:38 +msgid "Server response could not be verified" +msgstr "La réponse du serveur n'a pas pu être vérifiée" + +#: www/views/preferencesLogs.html:3 +msgid "Session Log" +msgstr "Journal de session" + +#: www/views/preferencesAbout.html:40 +msgid "Session log" +msgstr "Journal de session" + +#: www/views/tab-export-file.html:10 +msgid "Set up a password" +msgstr "Spécifiez un mot de passe" + +#: www/views/includes/password.html:4 +msgid "Set up a spending password" +msgstr "Configurer un code de dépenses" + +#: www/views/tab-settings.html:3 +#: www/views/tabs.html:19 +msgid "Settings" +msgstr "Paramètres" + +#: www/views/customAmount.html:20 +#: www/views/tab-receive.html:70 +#: www/views/tab-settings.html:43 +msgid "Share" +msgstr "Partager" + +#: www/views/feedback/complete.html:5 +msgid "Share BitPay" +msgstr "Partager BitPay" + +#: www/views/copayers.html:36 +msgid "Share invitation" +msgstr "Partager l'invitation" + +#: www/views/feedback/complete.html:13 +#: www/views/feedback/complete.html:22 +msgid "Share the love by inviting your friends." +msgstr "Partagez l’amour en invitant vos amis." + +#: www/views/copayers.html:17 +msgid "Share this invitation with your copayers" +msgstr "Partagez cette invitation avec vos copayers" + +#: www/views/tab-import-hardware.html:24 +msgid "Shared Wallet" +msgstr "Portefeuille partagé" + +#: www/views/join.html:47 +#: www/views/tab-create-personal.html:24 +#: www/views/tab-create-shared.html:54 +#: www/views/tab-export-file.html:22 +#: www/views/tab-import-file.html:27 +#: www/views/tab-import-hardware.html:30 +#: www/views/tab-import-phrase.html:30 +msgid "Show advanced options" +msgstr "Afficher les options avancées" + +#: www/views/tab-send.html:17 +msgid "Show bitcoin address" +msgstr "Afficher les adresses bitcoin" + +#: www/views/tab-send.html:52 +msgid "Show more" +msgstr "En afficher plus" + +#: src/js/services/bwcError.js:104 +msgid "Signatures rejected by server" +msgstr "Signatures rejetées par le serveur" + +#: src/js/services/onGoingProcess.js:31 +msgid "Signing transaction" +msgstr "Signature de la transaction" + +#: www/views/onboarding/backupRequest.html:6 +msgid "Since only you control your money, you’ll need to save your backup phrase in case this app is deleted." +msgstr "Puisque vous êtes le seul à pouvoir contrôler votre argent, vous aurez à enregistrer votre phrase de sauvegarde au cas où cette appli est supprimée." + +#: www/views/tab-create-personal.html:94 +#: www/views/tab-create-shared.html:124 +msgid "Single Address Wallet" +msgstr "Portefeuille d'adresse unique" + +#: www/views/onboarding/collectEmail.html:40 +msgid "Skip" +msgstr "Ignorer" + +#: www/views/translators.html:15 +msgid "Spanish" +msgstr "Espagnol" + +#: src/js/controllers/create.js:73 +#: src/js/controllers/join.js:56 +msgid "Specify Recovery Phrase..." +msgstr "Spécifier la phrase de récupération..." + +#: src/js/services/bwcError.js:92 +msgid "Spend proposal is not accepted" +msgstr "La proposition de dépense n'est pas acceptée" + +#: src/js/services/bwcError.js:95 +msgid "Spend proposal not found" +msgstr "Propostion de dépense introuvable" + +#: src/js/services/bwcError.js:137 +msgid "Spending Password needed" +msgstr "Code de dépenses requis" + +#: www/views/tab-send.html:11 +msgid "Start sending bitcoin" +msgstr "Commencez à envoyer des bitcoins" + +#: src/js/routes.js:112 +msgid "Starting..." +msgstr "Démarrage..." + +#: src/js/services/feeService.js:11 +msgid "Super Economy" +msgstr "Infimes" + +#: www/views/paperWallet.html:7 +msgid "Sweep" +msgstr "Balayer" + +#: www/views/paperWallet.html:3 +msgid "Sweep paper wallet" +msgstr "Balayer un portefeuille de papier" + +#: src/js/services/onGoingProcess.js:32 +msgid "Sweeping Wallet..." +msgstr "Balayage du portefeuille..." + +#: www/views/preferencesDeleteWallet.html:14 +msgid "THIS ACTION CANNOT BE REVERSED" +msgstr "CETTE ACTION NE PEUT PAS ÊTRE ANNULÉE" + +#: www/views/onboarding/welcome.html:6 +msgid "Take control of your money,
get started with bitcoin." +msgstr "Prenez le contrôle de votre argent,
commencez avec bitcoin." + +#: www/views/walletDetails.html:128 +#: www/views/walletDetails.html:70 +msgid "Tap and hold to show" +msgstr "Appuyez et maintenez pour afficher" + +#: www/views/walletDetails.html:109 +#: www/views/walletDetails.html:30 +#: www/views/walletDetails.html:40 +msgid "Tap to retry" +msgstr "Tapotez pour réessayer" + +#: www/views/tab-settings.html:142 +msgid "Tell a friend" +msgstr "En parler à un ami" + +#: www/views/termsOfUse.html:3 +msgid "Terms Of Use" +msgstr "Conditions d'utilisation" + +#: www/views/modals/terms.html:3 +#: www/views/onboarding/disclaimer.html:29 +#: www/views/onboarding/disclaimer.html:44 +#: www/views/preferencesAbout.html:30 +msgid "Terms of Use" +msgstr "Conditions d'utilisation" + +#: www/views/tab-create-personal.html:90 +msgid "Testnet" +msgstr "Testnet" + +#: src/js/controllers/feedback/send.js:27 +#: src/js/controllers/feedback/send.js:70 +#: www/views/feedback/complete.html:16 +#: www/views/feedback/rateApp.html:4 +msgid "Thank you!" +msgstr "Merci !" + +#: src/js/controllers/feedback/send.js:66 +msgid "Thanks!" +msgstr "Merci !" + +#: src/js/controllers/feedback/send.js:67 +msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" +msgstr "C'est intéressant à entendre. Nous aimerions obtenir une note de 5 étoiles de votre part – comment pourrions-nous améliorer votre expérience ?" + +#: src/js/services/ledger.js:139 +msgid "The Ledger Chrome application is not installed" +msgstr "L'application Ledger pour Chrome n'est pas installée" + +#: www/views/tab-import-phrase.html:5 +msgid "The derivation path" +msgstr "Le chemin de dérivation" + +#: www/views/onboarding/tour.html:32 +msgid "The exchange rate changes with the market." +msgstr "Le taux de change varie avec le marché." + +#: www/views/preferencesFee.html:12 +msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." +msgstr "Plus les frais sont importants, plus les mineurs sont incités à inclure votre transaction dans un bloc. Les frais actuels sont déterminés en fonction de la charge du réseau et du choix sélectionné." + +#: www/views/addresses.html:42 +msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." +msgstr "Le nombre maximal d’adresses inutilisées consécutives (20) a été atteint. Lorsqu'une de vos adresses inutilisées reçoit un paiement, une nouvelle adresse sera générée et affichée dans votre onglet Recevoir." + +#: www/views/tab-import-phrase.html:4 +msgid "The password of the recovery phrase (if set)" +msgstr "Le mot de passe de la phrase de récupération (si configuré)" + +#: src/js/services/walletService.js:951 +msgid "The payment was created but could not be completed. Please try again from home screen" +msgstr "Le paiement a été créé mais n'a pas pu être achevé. Veuillez réessayer depuis l'écran d'accueil" + +#: www/views/modals/txp-details.html:26 +msgid "The payment was removed by creator" +msgstr "Le paiement a été supprimé par le créateur" + +#: www/views/join.html:101 +#: www/views/tab-create-personal.html:69 +#: www/views/tab-create-shared.html:99 +#: www/views/tab-import-phrase.html:38 +msgid "The recovery phrase could require a password to be imported" +msgstr "La phrase de récupération pourrait demander un mot de passe pour être importée" + +#: src/js/services/bwcError.js:56 +msgid "The request could not be understood by the server" +msgstr "La demande n'a pas été comprise par le serveur" + +#: www/views/addresses.html:43 +msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." +msgstr "Le processus de restauration s’arrête lorsque 20 adresses sont générées consécutivement sans qu'elles ne contiennent de fonds. Pour générer plus d'adresses en toute sécurité, effectuez un paiement à l’une des adresses inutilisées qui a déjà été générée." + +#: src/js/services/bwcError.js:98 +msgid "The spend proposal is not pending" +msgstr "La proposition de dépense n'est pas en attente" + +#: www/views/preferencesHistory.html:26 +msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" +msgstr "L’historique des transactions et chaque nouvelle transaction entrante sont mis en cache dans l’application. Cette fonctionnalité efface cela et synchronise à nouveau à partir du serveur" + +#: www/views/tab-import-phrase.html:6 +msgid "The wallet service URL" +msgstr "L’URL du service de portefeuille" + +#: www/views/paymentUri.html:23 +msgid "There are no wallets to make this payment" +msgstr "Il n'y a pas de portefeuilles pour faire ce paiement" + +#: src/js/controllers/import.js:192 +#: src/js/controllers/import.js:216 +#: src/js/controllers/import.js:283 +msgid "There is an error in the form" +msgstr "Il y a une erreur dans la forme" + +#: src/js/controllers/feedback/send.js:55 +#: src/js/controllers/feedback/send.js:59 +msgid "There's obviously something we're doing wrong." +msgstr "Il y a visiblement quelque chose que nous faisons mal." + +#: www/views/advancedSettings.html:42 +msgid "These features aren't quite ready for primetime. They may change, stop working, or disappear at any time." +msgstr "Ces fonctionnalités ne sont pas tout à fait prêtes pour le grand public. Elles peuvent changer, s’arrêter de fonctionner ou disparaître à tout moment." + +#: www/views/advancedSettings.html:57 +msgid "These features make it easier to test complex functionality on all devices. They may be unstable." +msgstr "Ces fonctionnalités facilitent les tests de fonctionnalités complexes sur tous les appareils. Elles peuvent être instables." + +#: www/views/advancedSettings.html:73 +msgid "These utilities may be unstable. Proceed at your own risk." +msgstr "Ces utilitaires peuvent être instables. À utiliser à vos propres risques." + +#: src/js/controllers/feedback/rateCard.js:37 +msgid "This app is fantastic!" +msgstr "Cette appli est fantastique !" + +#: www/views/onboarding/tour.html:42 +msgid "This app stores your bitcoin with cutting-edge security." +msgstr "Cette appli conserve vos bitcoins avec une sécurité de pointe." + +#: src/js/controllers/confirm.js:438 +msgid "This bitcoin payment request has expired." +msgstr "Cette demande de paiement bitcoin a expiré." + +#: www/views/join.html:108 +#: www/views/tab-create-personal.html:75 +#: www/views/tab-create-shared.html:105 +msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." +msgstr "Ce mot de passe ne peut pas être récupéré. Si le mot de passe est perdu, il n’y a aucun moyen pour vous de récupérer vos fonds." + +#: www/views/backup.html:24 +msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." +msgstr "Cette phrase de récupération a été créée avec un mot de passe. Pour récupérer ce portefeuille, la phrase de récupération et le mot de passe sont requis." + +#: www/views/walletDetails.html:113 +#: www/views/walletDetails.html:34 +msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." +msgstr "Ce portefeuille n'est pas enregistré dans le Bitcore Wallet Service (BWS) donné. Vous pouvez le recréer depuis l'information locale." + +#: www/views/modals/txp-details.html:131 +#: www/views/tx-details.html:91 +msgid "Timeline" +msgstr "Chronologie" + +#: www/views/confirm.html:33 +#: www/views/confirm.html:61 +#: www/views/includes/output.html:2 +#: www/views/modals/txp-details.html:104 +#: www/views/modals/txp-details.html:53 +#: www/views/tx-details.html:37 +#: www/views/tx-details.html:49 +msgid "To" +msgstr "À" + +#: www/views/tab-send.html:12 +msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service." +msgstr "Pour commencer, achetez des bitcoins ou partagez votre adresse. Vous pouvez recevoir des bitcoins par n'importe quel portefeuille ou service." + +#: www/views/tab-send.html:13 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." +msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins." + +#: www/views/walletDetails.html:171 +msgid "Total Locked Balance" +msgstr "Solde verrouillé total" + +#: www/views/tab-create-shared.html:33 +msgid "Total number of copayers" +msgstr "Nombre total de copayers" + +#: src/js/services/fingerprintService.js:63 +#: src/js/services/fingerprintService.js:68 +msgid "Touch ID Failed" +msgstr "Touch ID a échoué" + +#: src/js/controllers/tx-details.js:6 +msgid "Transaction" +msgstr "Transaction" + +#: www/views/preferencesAdvanced.html:24 +#: www/views/preferencesHistory.html:3 +msgid "Transaction History" +msgstr "Historique des transactions" + +#: src/js/services/bwcError.js:83 +msgid "Transaction already broadcasted" +msgstr "Transaction déjà diffusée" + +#: src/js/controllers/activity.js:45 +#: src/js/controllers/tab-home.js:154 +#: src/js/controllers/tx-details.js:18 +msgid "Transaction not found" +msgstr "Transaction introuvable" + +#: www/views/tab-send.html:61 +msgid "Transfer to Wallet" +msgstr "Transférer vers un portefeuille" + +#: www/views/translators.html:9 +msgid "Translation Credits" +msgstr "Crédits de traduction" + +#: www/views/preferencesAbout.html:35 +#: www/views/translators.html:3 +msgid "Translators" +msgstr "Traducteurs" + +#: www/views/bitpayCardIntro.html:18 +msgid "Turn bitcoin into dollars, swipe anywhere Visa® is accepted." +msgstr "Convertissez des bitcoins en dollars et dépensez partout où Visa® est accepté." + +#: www/views/tab-import-phrase.html:17 +msgid "Type the Recovery Phrase (usually 12 words)" +msgstr "Saisissez la phrase de récupération (généralement 12 mots)" + +#: www/views/modals/search.html:36 +#: www/views/tx-details.html:79 +msgid "Unconfirmed" +msgstr "Non confirmée" + +#: www/views/preferencesUnit.html:4 +msgid "Unit" +msgstr "Unité" + +#: www/views/walletDetails.html:165 +msgid "Unsent transactions" +msgstr "Transactions non envoyées" + +#: www/views/addresses.html:35 +msgid "Unused Addresses" +msgstr "Adresses inutilisées" + +#: www/views/addresses.html:41 +msgid "Unused Addresses Limit" +msgstr "Limite des adresses inutilisées" + +#: www/views/proposals.html:15 +msgid "Updating pending proposals. Please stand by" +msgstr "Mise à jour des propositions en attente. Veuillez patienter" + +#: www/views/walletDetails.html:189 +msgid "Updating transaction history. Please stand by." +msgstr "Mise à jour de l'historique des transactions. Veuillez patienter." + +#: www/views/activity.html:14 +msgid "Updating... Please stand by" +msgstr "Mise à jour... veuillez patienter" + +#: www/views/advancedSettings.html:34 +msgid "Use Unconfirmed Funds" +msgstr "Utiliser les fonds non confirmés" + +#: src/js/services/onGoingProcess.js:34 +msgid "Validating recovery phrase..." +msgstr "Validation de la phrase de récupération..." + +#: src/js/services/onGoingProcess.js:33 +msgid "Validating wallet integrity..." +msgstr "Validation de l’intégrité du portefeuille..." + +#: www/views/preferencesAbout.html:14 +msgid "Version" +msgstr "Version" + +#: www/views/tab-export-file.html:67 +msgid "View" +msgstr "Voir" + +#: www/views/addresses.html:66 +msgid "View All Addresses" +msgstr "Voir toutes les adresses" + +#: www/views/tx-details.html:117 +msgid "View on blockchain" +msgstr "Voir sur la blockchain" + +#: www/views/walletDetails.html:153 +msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." +msgstr "ATTENTION : La dérivation de la clé ne fonctionne pas sur cet appareil / portefeuille. Impossible d’effectuer des actions sur ce portefeuille." + +#: www/views/tab-export-file.html:43 +msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." +msgstr "ATTENTION : Ne pas inclure la clé privée permet de vérifier le solde du portefeuille, l'historique des transactions, et de créer des demandes de dépenses depuis le fichier exporté. Cependant, cela ne permet pas d'approuver (signer) les propositions et les fonds ne seront pas accessibles depuis le fichier exporté." + +#: www/views/tab-export-file.html:34 +msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." +msgstr "ATTENTION : La clé privée de ce portefeuille n'est pas disponible. L'exportation permet de vérifier le solde du portefeuille, l'historique des transactions, et de créer des propositions de dépenses depuis le fichier exporté. Cependant, cela ne permet pas d'approuver (signer) les propositions et les fonds ne seront pas accessibles depuis le fichier exporté." + +#: www/views/modals/paypro.html:42 +msgid "WARNING: UNTRUSTED CERTIFICATE" +msgstr "ATTENTION : CERTIFICAT NON APPROUVÉ" + +#: src/js/services/onGoingProcess.js:14 +msgid "Waiting for Ledger..." +msgstr "En attente de Ledger..." + +#: src/js/services/onGoingProcess.js:15 +msgid "Waiting for Trezor..." +msgstr "En attente de Trezor..." + +#: www/views/copayers.html:48 +msgid "Waiting for copayers" +msgstr "Attente des copayers" + +#: www/views/copayers.html:53 +msgid "Waiting..." +msgstr "Attente..." + +#: www/views/addresses.html:3 +msgid "Wallet Addresses" +msgstr "Adresses du portefeuille" + +#: www/views/preferencesColor.html:4 +msgid "Wallet Color" +msgstr "Couleur du portefeuille" + +#: www/views/preferencesInformation.html:23 +msgid "Wallet Configuration (m-n)" +msgstr "Configuration du portefeuille (m-n)" + +#: www/views/onboarding/collectEmail.html:5 +msgid "Wallet Created" +msgstr "Portefeuille créé" + +#: www/views/preferencesInformation.html:17 +msgid "Wallet Id" +msgstr "Id du portefeuille" + +#: www/views/preferencesAdvanced.html:12 +#: www/views/preferencesInformation.html:3 +msgid "Wallet Information" +msgstr "Informations du portefeuille" + +#: www/views/join.html:26 +msgid "Wallet Invitation" +msgstr "Invitation de portefeuille" + +#: www/views/join.html:59 +#: www/views/tab-create-personal.html:35 +#: www/views/tab-create-shared.html:65 +msgid "Wallet Key" +msgstr "Clé du portefeuille" + +#: www/views/preferencesAlias.html:4 +msgid "Wallet Name" +msgstr "Nom du portefeuille" + +#: www/views/preferencesInformation.html:11 +msgid "Wallet Name (at creation)" +msgstr "Nom du portefeuille (à la création)" + +#: www/views/preferencesInformation.html:29 +msgid "Wallet Network" +msgstr "Réseau du portefeuille" + +#: www/views/advancedSettings.html:31 +msgid "Wallet Operation" +msgstr "Opérations de portefeuille" + +#: www/views/join.html:76 +#: www/views/tab-create-personal.html:47 +#: www/views/tab-create-shared.html:77 +msgid "Wallet Recovery Phrase" +msgstr "Phrase de récupération" + +#: src/js/services/bwcError.js:26 +msgid "Wallet Recovery Phrase is invalid" +msgstr "La phrase de récupération du portefeuille est invalide" + +#: www/views/preferencesAdvanced.html:20 +msgid "Wallet Service URL" +msgstr "Wallet Service URL" + +#: www/views/preferences.html:4 +msgid "Wallet Settings" +msgstr "Paramètres du portefeuille" + +#: www/views/tab-import-hardware.html:11 +msgid "Wallet Type" +msgstr "Type de portefeuille" + +#: src/js/services/bwcError.js:59 +msgid "Wallet already exists" +msgstr "Le portefeuille existe déjà" + +#: src/js/services/profileService.js:529 +msgid "Wallet already in Copay" +msgstr "Le portefeuille existe déjà dans Copay" + +#: www/views/includes/walletActivity.html:6 +msgid "Wallet created" +msgstr "Portefeuille créé" + +#: www/views/copayers.html:58 +msgid "Wallet incomplete and broken" +msgstr "Portefeuille incomplet et cassé " + +#: src/js/services/bwcError.js:65 +msgid "Wallet is full" +msgstr "Le portefeuille est plein" + +#: src/js/services/bwcError.js:125 +msgid "Wallet is locked" +msgstr "Le portefeuille est verrouillé" + +#: src/js/services/bwcError.js:128 +msgid "Wallet is not complete" +msgstr "Le portefeuille n'est pas complet" + +#: www/views/tab-create-personal.html:12 +#: www/views/tab-create-shared.html:12 +msgid "Wallet name" +msgstr "Nom du portefeuille" + +#: src/js/services/bwcError.js:131 +msgid "Wallet needs backup" +msgstr "Le portefeuille a besoin d'une sauvegarde" + +#: www/views/tab-receive.html:56 +#: www/views/walletDetails.html:145 +msgid "Wallet not backed up" +msgstr "Le portefeuille n'est pas sauvegardé" + +#: src/js/services/bwcError.js:68 +msgid "Wallet not found" +msgstr "Portefeuille introuvable" + +#: src/js/controllers/tab-home.js:199 +msgid "Wallet not registered" +msgstr "Portefeuille non enregistré" + +#: src/js/services/bwcError.js:29 +msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" +msgstr "Le portefeuille n'est pas enregistré au Wallet Service. Vous pouvez le recréer depuis « Créer » en utilisant les « Options avancées » pour configurer votre phrase de récupération" + +#: www/views/backup.html:11 +msgid "Wallet recovery phrase not available." +msgstr "La phrase de récupération du portefeuille est indisponible." + +#: src/js/services/bwcError.js:50 +msgid "Wallet service not found" +msgstr "Wallet Service introuvable" + +#: www/views/tab-home.html:58 +msgid "Wallets" +msgstr "Portefeuilles" + +#: www/views/tab-settings.html:99 +msgid "Wallets & Integrations" +msgstr "Portefeuilles & intégrations" + +#: src/js/controllers/modals/txpDetails.js:126 +#: src/js/controllers/modals/txpDetails.js:143 +#: src/js/controllers/preferencesDelete.js:10 +#: www/views/preferencesDeleteWallet.html:9 +msgid "Warning!" +msgstr "Attention !" + +#: www/views/modals/txp-details.html:47 +msgid "Warning: this transaction has unconfirmed inputs" +msgstr "ATTENTION : Cette transaction a des entrées non confirmées" + +#: src/js/controllers/feedback/send.js:63 +msgid "We'd love to do better." +msgstr "Nous serions ravis de faire mieux." + +#: www/views/backup.html:28 +msgid "We'll confirm on the next screen." +msgstr "Nous allons la confirmer sur l’écran suivant." + +#: src/js/controllers/feedback/send.js:71 +msgid "We're always looking for ways to improve BitPay." +msgstr "Nous cherchons toujours des moyens afin d'améliorer BitPay." + +#: src/js/controllers/feedback/send.js:75 +msgid "We're always looking for ways to improve BitPay. How could we improve your experience?" +msgstr "Nous cherchons toujours des moyens afin d'améliorer BitPay. Comment pourrions-nous améliorer votre expérience ?" + +#: www/views/preferencesLanguage.html:16 +#: www/views/translators.html:23 +msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." +msgstr "Nous recherchons toujours des contributions de traduction ! Vous pouvez apporter des corrections ou aider à rendre cette application disponible dans votre langue maternelle en rejoignant notre communauté sur Crowdin." + +#: www/views/preferencesAlias.html:11 +msgid "What do you call this wallet?" +msgstr "Comment voulez-vous appeler ce portefeuille ?" + +#: www/views/preferencesAlias.html:12 +msgid "When this wallet was created, it was called “{{walletName}}”. You can change the name displayed on this device below." +msgstr "Lorsque ce portefeuille a été créé, il se nommait “{{walletName}}”. Vous pouvez modifier ci-dessous le nom affiché sur cet appareil." + +#: www/views/onboarding/collectEmail.html:10 +msgid "Where would you like to receive email notifications about payments?" +msgstr "Souhaitez-vous recevoir des notifications par e-mail à propos des paiements ?" + +#: www/views/addresses.html:23 +msgid "Why?" +msgstr "Pourquoi ?" + +#: www/views/includes/backupLaterPopup.html:2 +msgid "Without a backup, you could lose money" +msgstr "Sans une sauvegarde, vous risquez de perdre de l'argent" + +#: src/js/controllers/onboarding/backupRequest.js:10 +msgid "Without a backup, you could lose money." +msgstr "Sans une sauvegarde, vous risquez de perdre de l'argent." + +#: www/views/feedback/rateApp.html:10 +msgid "Would you be willing to rate BitPay in the app store?" +msgstr "Seriez-vous prêt à évaluer BitPay dans la boutique d'application ?" + +#: src/js/controllers/bitpayCardIntro.js:31 +msgid "Would you like to add this account ({{email}}) to your wallet?" +msgstr "Souhaitez-vous ajouter ce compte ({{email}}) à votre portefeuille ?" + +#: www/views/onboarding/notifications.html:4 +msgid "Would you like to receive push notifications about payments?" +msgstr "Souhaitez-vous recevoir des notifications à propos des paiements ?" + +#: src/js/controllers/import.js:248 +msgid "Wrong number of recovery words:" +msgstr "Nombre incorrect de mots de récupération :" + +#: src/js/services/bwcError.js:140 +msgid "Wrong spending password" +msgstr "Code de dépenses incorrect" + +#: www/views/modals/confirmation.html:7 +#: www/views/onboarding/collectEmail.html:32 +msgid "Yes" +msgstr "Oui" + +#: src/js/controllers/onboarding/backupRequest.js:18 +msgid "Yes, skip backup" +msgstr "Oui, ignorer la sauvegarde" + +#: src/js/controllers/onboarding/backupRequest.js:17 +msgid "You can create a backup later from your wallet settings." +msgstr "Vous pouvez créer une sauvegarde plus tard à partir des paramètres de votre portefeuille." + +#: www/views/tab-scan.html:16 +msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." +msgstr "Vous pouvez numériser des adresses bitcoin, des demandes de paiement, des portefeuilles de papier et plus." + +#: www/views/onboarding/tour.html:14 +msgid "You can spend bitcoin at millions of websites and stores worldwide." +msgstr "Vous pouvez dépenser des bitcoins dans des millions de sites internet et de boutiques à travers le monde." + +#: www/views/backup.html:12 +msgid "You can still export it from Advanced > Export." +msgstr "Vous pouvez l’exporter depuis le menu « Avancé » > « Exporter »." + +#: www/views/onboarding/tour.html:27 +msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." +msgstr "Vous pouvez l’échanger contre d'autres monnaies comme le dollar américain, l'euro ou la livre." + +#: www/views/onboarding/tour.html:41 +msgid "You control your bitcoin." +msgstr "Vous contrôlez vos bitcoins." + +#: www/views/addressbook.html:20 +msgid "You haven’t added any contacts to your address book yet. Get started by adding your first one." +msgstr "Vous n’avez pas encore ajouté de contact à votre répertoire. Commencez par en ajouter un." + +#: www/views/preferencesNotifications.html:30 +msgid "You'll receive email notifications about payments sent and received from your wallets." +msgstr "Vous recevrez des notifications par e-mail concernant les paiements envoyés et reçus depuis vos portefeuilles." + +#: www/views/includes/confirmBackupPopup.html:6 +msgid "Your bitcoin wallet is backed up!" +msgstr "Votre portefeuille bitcoin est sauvegardé !" + +#: www/views/tab-home.html:26 +msgid "Your bitcoin wallet is ready!" +msgstr "Votre portefeuille bitcoin est prêt !" + +#: www/views/tab-create-shared.html:22 +msgid "Your name" +msgstr "Votre nom" + +#: www/views/join.html:16 +msgid "Your nickname" +msgstr "Votre surnom" + +#: www/views/tab-export-file.html:11 +#: www/views/tab-import-file.html:20 +msgid "Your password" +msgstr "Votre mot de passe" + +#: www/views/includes/password.html:12 +msgid "Your spending password" +msgstr "Votre code de dépenses" + +#: www/views/onboarding/backupRequest.html:10 +msgid "Your wallet is never saved to cloud storage or standard device backups." +msgstr "Votre portefeuille n’est jamais enregistré en dehors de votre appareil ou dans des sauvegardes qui lui sont propres." + +#: www/views/includes/password.html:39 +msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down" +msgstr "La clé de votre portefeuille sera chiffrée. Le code de dépenses ne peut pas être récupéré. N'oubliez pas de l'écrire" + +#: www/views/includes/walletSelector.html:23 +#: www/views/includes/wallets.html:13 +#: www/views/tab-home.html:84 +#: www/views/walletDetails.html:127 +#: www/views/walletDetails.html:69 +msgid "[Balance Hidden]" +msgstr "[Solde masqué]" + +#: www/views/tab-receive.html:48 +msgid "address not yet available" +msgstr "adresse indisponible" + +#: www/views/includes/backupWarningPopup.html:3 +msgid "if you take a screenshot, your backup may be viewed by others apps. You can make a safe backup with paper and a pen." +msgstr "si vous prenez une capture d’écran, votre sauvegarde peut être vue par d’autres applications. Vous pouvez faire une sauvegarde sécurisée avec du papier et un stylo." + +#: www/views/includes/available-balance.html:8 +msgid "locked by pending payments" +msgstr "verrouillés par les paiements en attente" + +#: src/js/services/profileService.js:417 +msgid "me" +msgstr "moi" + +#: www/views/preferencesHistory.html:14 +msgid "preparing..." +msgstr "préparation..." + +#: www/views/includes/confirm-tx.html:23 +msgid "{{feeRateStr}} of the transaction" +msgstr "{{feeRateStr}} de la transaction" + +#: src/js/controllers/confirm.js:185 +msgid "{{fee}} will be deducted for bitcoin networking fees." +msgstr "{{fee}} seront déduits pour les frais de réseau Bitcoin." + +#: www/views/walletDetails.html:192 +msgid "{{updatingTxHistoryProgress}} transactions downloaded" +msgstr "{{updatingTxHistoryProgress}} transactions téléchargées" + +#: www/views/copayers.html:46 +#: www/views/includes/walletInfo.html:2 +msgid "{{wallet.m}}-of-{{wallet.n}}" +msgstr "{{wallet.m}}-sur-{{wallet.n}}" + diff --git a/i18n/po/template.pot b/i18n/po/template.pot index b9556f615..915e072c4 100644 --- a/i18n/po/template.pot +++ b/i18n/po/template.pot @@ -4,2035 +4,2999 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" -#: www/views/modals/search.html -#: www/views/walletHome.html -msgid "(possible double spend)" -msgstr "" - -#: www/views/modals/paypro.html +#: www/views/modals/paypro.html:34 msgid "(Trusted)" msgstr "" -#: www/views/walletHome.html -msgid "[Balance Hidden]" +#: www/views/includes/txp.html:27 +#: www/views/modals/search.html:27 +#: www/views/walletDetails.html:249 +msgid "(possible double spend)" msgstr "" -#: src/js/controllers/walletHome.js -msgid "{{fee}} will be deducted for bitcoin networking fees" -msgstr "" - -#: www/views/includes/confirm-tx.html -msgid "{{feeRateStr}} of the transaction" -msgstr "" - -#: www/views/copayers.html -#: www/views/includes/walletInfo.html -msgid "{{index.m}}-of-{{index.n}}" -msgstr "" - -#: www/views/modals/search.html -msgid "{{index.result.length - index.txHistorySearchResults.length}} more" -msgstr "" - -#: www/views/walletHome.html -msgid "{{index.txProgress}} transactions downloaded" -msgstr "" - -#: www/views/includes/sidebar.html -msgid "{{item.m}}-of-{{item.n}}" -msgstr "" - -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:154 msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created." msgstr "" -#: www/views/includes/terms.html -msgid "IF YOU LOSE ACCESS TO YOUR COPAY WALLET OR YOUR ENCRYPTED PRIVATE KEYS AND YOU HAVE NOT SEPARATELY STORED A BACKUP OF YOUR WALLET AND CORRESPONDING PASSWORD, YOU ACKNOWLEDGE AND AGREE THAT ANY BITCOIN YOU HAVE ASSOCIATED WITH THAT COPAY WALLET WILL BECOME INACCESSIBLE." +#: www/views/feedback/rateApp.html:7 +msgid "5-star ratings help us get BitPay into more hands, and more users means more resources can be committed to the app!" msgstr "" -#: www/views/backup.html -msgid "OR 1 wallet export file and the remaining quorum of wallet recovery phrases (e.g. in a 3-5 wallet: 1 wallet export file + 2 wallet recovery phrases of any of the other copayers)." +#: src/js/controllers/confirm.js:455 +msgid "A SMS containing a confirmation code was sent to your phone." msgstr "" -#: www/views/backup.html -msgid "OR the wallet recovery phrase of all copayers in the wallet" +#: src/js/controllers/feedback/send.js:27 +#: www/views/feedback/complete.html:17 +msgid "A member of the team will review your feedback as soon as possible." msgstr "" -#: www/views/backup.html -msgid "OR the wallet recovery phrases of all copayers in the wallet" +#: src/js/controllers/confirm.js:213 +msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded." msgstr "" -#: www/views/disclaimer.html -msgid "A multisignature bitcoin wallet" +#: src/js/controllers/confirm.js:207 +msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." msgstr "" -#: www/views/preferencesGlobal.html -msgid "About Copay" +#: src/js/controllers/preferencesAbout.js:6 +#: www/views/tab-settings.html:149 +msgid "About" msgstr "" -#: www/views/modals/txp-details.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js +#: src/js/services/confirmDialog.js:8 msgid "Accept" msgstr "" -#: www/views/preferencesInformation.html +#: src/js/controllers/modals/txpDetails.js:39 +#: src/js/controllers/tx-details.js:65 +msgid "Accepted" +msgstr "" + +#: www/views/preferencesInformation.html:59 msgid "Account" msgstr "" -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html +#: www/views/join.html:71 +#: www/views/tab-create-personal.html:42 +#: www/views/tab-create-shared.html:72 +#: www/views/tab-import-hardware.html:19 msgid "Account Number" msgstr "" -#: www/views/walletHome.html -#: src/js/controllers/index.js +#: www/views/bitpayCard.html:51 msgid "Activity" msgstr "" -#: www/views/modals/addressbook.html -msgid "Add a new entry" +#: src/js/controllers/bitpayCardIntro.js:34 +msgid "Add Account" msgstr "" -#: www/views/create.html -#: www/views/join.html +#: src/js/controllers/bitpayCardIntro.js:30 +msgid "Add BitPay Card Account?" +msgstr "" + +#: www/views/tab-home.html:155 +msgid "Add BitPay Visa® Card" +msgstr "" + +#: www/views/addressbook.add.html:4 +#: www/views/addressbook.html:22 +msgid "Add Contact" +msgstr "" + +#: www/views/bitpayCard.html:23 +msgid "Add Funds" +msgstr "" + +#: www/views/confirm.html:72 +msgid "Add Memo" +msgstr "" + +#: www/views/tab-send.html:42 +msgid "Add a Contact" +msgstr "" + +#: www/views/join.html:90 +#: www/views/join.html:99 +#: www/views/tab-create-personal.html:59 +#: www/views/tab-create-personal.html:67 +#: www/views/tab-create-shared.html:89 +#: www/views/tab-create-shared.html:97 msgid "Add a Password" msgstr "" -#: www/views/create.html -#: www/views/join.html +#: www/views/join.html:92 +#: www/views/tab-create-personal.html:61 +#: www/views/tab-create-shared.html:91 msgid "Add an optional password to secure the recovery phrase" msgstr "" -#: www/views/includes/note.html -#: www/views/modals/tx-details.html -msgid "Add comment" +#: src/js/controllers/confirm.js:267 +msgid "Add description" msgstr "" -#: www/views/includes/sidebar.html +#: www/views/add.html:3 msgid "Add wallet" msgstr "" -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/modals/paypro.html -#: www/views/paymentUri.html +#: www/views/addressbook.view.html:23 +#: www/views/customAmount.html:26 +#: www/views/modals/paypro.html:25 +#: www/views/paymentUri.html:15 msgid "Address" msgstr "" -#: www/views/preferencesInformation.html +#: www/views/addressbook.html:6 +#: www/views/tab-settings.html:20 +msgid "Address Book" +msgstr "" + +#: www/views/preferencesInformation.html:35 msgid "Address Type" msgstr "" -#: www/views/preferences.html +#: www/views/addresses.html:55 +msgid "Addresses With Balance" +msgstr "" + +#: www/views/tab-settings.html:142 msgid "Advanced" msgstr "" -#: www/views/preferences.html -msgid "Alias" +#: www/views/advancedSettings.html:3 +msgid "Advanced Settings" msgstr "" -#: www/views/preferencesAlias.html -msgid "Alias for {{index.walletName}}" +#: www/views/bitpayCard.html:57 +msgid "All" msgstr "" -#: www/views/preferencesLanguage.html -#: www/views/translators.html -msgid "All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at" +#: www/views/allAddresses.html:3 +msgid "All Addresses" msgstr "" -#: www/views/includes/terms.html -msgid "All transaction requests are irreversible." +#: www/views/backupWarning.html:15 +msgid "All clear, let's do this" msgstr "" -#: www/views/preferencesGlobal.html +#: www/views/tab-receive.html:38 +msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created." +msgstr "" + +#: www/views/onboarding/notifications.html:7 +msgid "Allow notifications" +msgstr "" + +#: www/views/onboarding/disclaimer.html:14 +msgid "Almost done! Let's review." +msgstr "" + +#: www/views/preferencesAltCurrency.html:4 +#: www/views/tab-settings.html:81 msgid "Alternative Currency" msgstr "" -#: www/views/includes/output.html -#: www/views/modals/customized-amount.html -#: www/views/paymentUri.html -#: www/views/walletHome.html +#: www/views/tab-home.html:138 +msgid "Amazon.com Gift Cards" +msgstr "" + +#: www/views/amount.html:43 +#: www/views/customAmount.html:32 +#: www/views/includes/output.html:7 +#: www/views/paymentUri.html:16 msgid "Amount" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:110 msgid "Amount below minimum allowed" msgstr "" -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Amount in" +#: src/js/controllers/confirm.js:382 +msgid "Amount too big" msgstr "" -#: src/js/controllers/preferencesDeleteWords.js -msgid "Are you sure you want to delete the recovery phrase?" +#: www/views/tab-home.html:14 +msgid "An update to this app is available" msgstr "" -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js +#: src/js/controllers/tab-home.js:133 +msgid "An update to this app is available. For your security, please update to the latest version." +msgstr "" + +#: www/views/backupWarning.html:14 +msgid "Anyone with your backup phrase can access or spend your bitcoin." +msgstr "" + +#: www/views/backupWarning.html:10 +msgid "Are you being watched?" +msgstr "" + +#: src/js/controllers/copayers.js:43 +msgid "Are you sure you want to cancel and delete this wallet?" +msgstr "" + +#: src/js/controllers/preferencesDelete.js:11 msgid "Are you sure you want to delete this wallet?" msgstr "" -#: www/views/includes/walletInfo.html +#: src/js/controllers/modals/txpDetails.js:127 +msgid "Are you sure you want to reject this transaction?" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:144 +msgid "Are you sure you want to remove this transaction?" +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:16 +msgid "Are you sure you want to skip the backup?" +msgstr "" + +#: src/js/controllers/preferencesBitpayCard.js:7 +msgid "Are you sure you would like to remove your BitPay Card account from this device?" +msgstr "" + +#: www/views/includes/walletInfo.html:3 msgid "Auditable" msgstr "" -#: www/views/includes/available-balance.html +#: www/views/walletDetails.html:121 +#: www/views/walletDetails.html:60 +msgid "Available" +msgstr "" + +#: www/views/includes/available-balance.html:3 msgid "Available Balance" msgstr "" -#: www/views/preferencesFee.html -msgid "Average confirmation time: {{fee.nbBlocks * 10}} minutes" +#: www/views/preferencesFee.html:15 +msgid "Average confirmation time: {{fee.nbBlocks * 10}} minutes" msgstr "" -#: www/views/includes/topbar.html -msgid "Back" -msgstr "" - -#: www/views/preferences.html -msgid "Backup" -msgstr "" - -#: www/views/backup.html -msgid "Backup failed" -msgstr "" - -#: www/views/paperWallet.html -#: www/views/walletHome.html -msgid "Backup Needed" -msgstr "" - -#: www/views/walletHome.html -msgid "Backup now" -msgstr "" - -#: src/js/services/profileService.js -msgid "Bad wallet invitation" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Balance By Address" -msgstr "" - -#: www/views/paperWallet.html -#: www/views/walletHome.html -msgid "Before receiving funds, you must backup your wallet. If this device is lost, it is impossible to access your funds without a backup." -msgstr "" - -#: www/views/preferencesInformation.html -msgid "BETA: Android Key Derivation Test:" -msgstr "" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html +#: www/views/join.html:118 +#: www/views/tab-create-personal.html:85 +#: www/views/tab-create-shared.html:115 +#: www/views/tab-import-phrase.html:46 msgid "BIP32 path for address derivation" msgstr "" -#: www/views/walletHome.html -msgid "Bitcoin address" +#: www/views/preferences.html:41 +msgid "Backup" msgstr "" -#: www/views/preferencesGlobal.html +#: www/views/includes/backupNeededPopup.html:7 +msgid "Backup Needed" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:9 +msgid "Backup now" +msgstr "" + +#: www/views/onboarding/backupRequest.html:11 +#: www/views/tab-export-file.html:87 +msgid "Backup wallet" +msgstr "" + +#: src/js/controllers/bitpayCard.js:140 +msgid "Bad param" +msgstr "" + +#: src/js/services/profileService.js:458 +msgid "Bad wallet invitation" +msgstr "" + +#: www/views/preferencesInformation.html:89 +msgid "Balance By Address" +msgstr "" + +#: www/views/includes/confirmBackupPopup.html:7 +msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it." +msgstr "" + +#: src/js/controllers/tab-settings.js:52 +msgid "BitPay Help Center" +msgstr "" + +#: www/views/addressbook.add.html:38 +msgid "Bitcoin Address" +msgstr "" + +#: www/views/tab-settings.html:13 +msgid "Bitcoin Exchanges" +msgstr "" + +#: www/views/preferencesFee.html:4 +#: www/views/tab-settings.html:92 msgid "Bitcoin Network Fee Policy" msgstr "" -#: www/views/preferencesFee.html -msgid "Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." -msgstr "" - -#: www/views/paymentUri.html +#: www/views/paymentUri.html:10 msgid "Bitcoin URI is NOT valid!" msgstr "" -#: www/views/modals/txp-details.html +#: www/views/tab-settings.html:70 +msgid "Bitcoin Unit" +msgstr "" + +#: www/views/onboarding/tour.html:26 +msgid "Bitcoin is a currency." +msgstr "" + +#: www/views/onboarding/disclaimer.html:15 +msgid "Bitcoin is different – it cannot be safely held with a bank or web service." +msgstr "" + +#: www/views/onboarding/tour.html:13 +msgid "Bitcoin is secure,
digital money." +msgstr "" + +#: www/views/preferencesFee.html:11 +msgid "Bitcoin transactions include a fee collected by miners on the network." +msgstr "" + +#: www/views/modals/txp-details.html:36 msgid "Broadcast Payment" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/controllers/modals/txpDetails.js:41 +#: src/js/controllers/tx-details.js:67 +msgid "Broadcasted" +msgstr "" + +#: src/js/services/onGoingProcess.js:10 msgid "Broadcasting transaction" msgstr "" -#: www/views/unsupported.html +#: www/views/unsupported.html:6 msgid "Browser unsupported" msgstr "" -#: www/views/includes/sidebar.html -msgid "Buy and Sell" +#: www/views/tab-home.html:118 +msgid "Buy & Sell Bitcoin" msgstr "" -#: src/js/services/onGoingProcess.js +#: www/views/tab-send.html:15 +msgid "Buy Bitcoin" +msgstr "" + +#: www/views/tab-home.html:169 +msgid "Buy an Amazon Gift Card" +msgstr "" + +#: www/views/buyandsell.html:5 +msgid "Buy and sell" +msgstr "" + +#: www/views/tab-home.html:162 +msgid "Buy or Sell Bitcoin" +msgstr "" + +#: src/js/services/onGoingProcess.js:41 +msgid "Buying Bitcoin..." +msgstr "" + +#: src/js/services/onGoingProcess.js:11 msgid "Calculating fee" msgstr "" -#: www/views/includes/confirm-tx.html -#: www/views/includes/note.html -#: www/views/includes/password.html -#: www/views/modals/addressbook.html -#: www/views/modals/confirmation.html -#: www/views/walletHome.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js +#: src/js/controllers/confirm.js:511 +#: src/js/services/confirmDialog.js:9 +#: src/js/services/popupService.js:58 +#: www/views/addressbook.add.html:10 +#: www/views/feedback/send.html:5 +#: www/views/includes/confirm-tx.html:30 +#: www/views/includes/note.html:6 +#: www/views/includes/password.html:22 +#: www/views/modals/confirmation.html:13 msgid "Cancel" msgstr "" -#: www/views/copayers.html -msgid "Cancel and delete the wallet" +#: src/js/controllers/onboarding/tour.js:55 +msgid "Cannot Create Wallet" msgstr "" -#: src/js/controllers/walletHome.js -msgid "Cannot create transaction. Insufficient funds" -msgstr "" - -#: src/js/services/profileService.js +#: src/js/services/profileService.js:454 msgid "Cannot join the same wallet more that once" msgstr "" -#: src/js/controllers/walletHome.js -msgid "Cannot sign: The payment request has expired" +#: src/js/controllers/amazon.js:27 +msgid "Card not found" msgstr "" -#: www/views/modals/paypro.html +#: www/views/preferencesBitpayCard.html:10 +#: www/views/tab-home.html:99 +msgid "Cards" +msgstr "" + +#: www/views/modals/paypro.html:29 msgid "Certified by" msgstr "" -#: www/views/preferencesAlias.html -msgid "Changing wallet alias only affects the local wallet name." -msgstr "" - -#: www/views/translators.html -msgid "Chinese" -msgstr "" - -#: www/views/import.html +#: www/views/tab-import-file.html:4 msgid "Choose a backup file from your computer" msgstr "" -#: www/views/preferencesHistory.html +#: www/views/modals/wallets.html:9 +msgid "Choose your destination wallet" +msgstr "" + +#: www/views/modals/wallets.html:10 +msgid "Choose your source wallet" +msgstr "" + +#: www/views/backup.html:54 +msgid "Clear" +msgstr "" + +#: www/views/preferencesHistory.html:23 msgid "Clear cache" msgstr "" -#: www/views/includes/topbar.html -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/modals/paypro.html -#: www/views/modals/scanner.html -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: www/views/modals/paypro.html:4 +#: www/views/modals/wallets.html:5 msgid "Close" msgstr "" -#: www/views/preferences.html +#: www/views/preferences.html:26 msgid "Color" msgstr "" -#: www/views/modals/tx-details.html -msgid "Comment" -msgstr "" - -#: www/views/preferencesAbout.html +#: www/views/preferencesAbout.html:21 msgid "Commit hash" msgstr "" -#: www/views/includes/confirm-tx.html -#: src/js/services/confirmDialog.js -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -#: src/js/controllers/walletHome.js +#: src/js/controllers/confirm.js:510 +#: src/js/controllers/copayers.js:42 +#: src/js/services/confirmDialog.js:10 +#: www/views/backup.html:53 +#: www/views/backup.html:72 +#: www/views/confirm.html:4 +#: www/views/includes/confirm-tx.html:35 msgid "Confirm" msgstr "" -#: www/views/backup.html -msgid "Confirm your wallet recovery phrase" +#: www/views/modals/terms.html:26 +#: www/views/onboarding/disclaimer.html:45 +msgid "Confirm & Finish" msgstr "" -#: www/views/modals/tx-details.html +#: src/js/services/walletService.js:840 +#: src/js/services/walletService.js:841 +msgid "Confirm you new spending password" +msgstr "" + +#: www/views/tx-details.html:77 msgid "Confirmations" msgstr "" -#: www/views/backup.html -msgid "Congratulations!" +#: www/views/walletDetails.html:122 +#: www/views/walletDetails.html:61 +msgid "Confirming" msgstr "" -#: src/js/services/onGoingProcess.js +#: www/views/bitpayCardIntro.html:37 +msgid "Connect my BitPay Card" +msgstr "" + +#: src/js/services/onGoingProcess.js:12 msgid "Connecting to Coinbase..." msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:13 msgid "Connecting to Glidera..." msgstr "" -#: src/js/services/bwcError.js +#: www/views/glideraUri.html:16 +msgid "Connecting..." +msgstr "" + +#: src/js/services/bwcError.js:53 msgid "Connection reset by peer" msgstr "" -#: www/views/backup.html +#: www/views/tab-send.html:32 +msgid "Contacts" +msgstr "" + +#: www/views/onboarding/notifications.html:9 msgid "Continue" msgstr "" -#: src/js/services/bwcError.js +#: www/views/preferencesLanguage.html:26 +#: www/views/translators.html:33 +msgid "Contribute Translations" +msgstr "" + +#: src/js/services/bwcError.js:62 msgid "Copayer already in this wallet" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:77 msgid "Copayer already voted on this spend proposal" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:107 msgid "Copayer data mismatch" msgstr "" -#: www/views/preferencesInformation.html -msgid "Copayers" +#: www/views/includes/walletActivity.html:2 +msgid "Copayer joined" msgstr "" -#: src/js/controllers/copayers.js -#: src/js/controllers/export.js -#: src/js/controllers/preferencesInformation.js -#: src/js/controllers/walletHome.js +#: www/views/preferencesInformation.html:81 +msgid "Copayer {{$index}}" +msgstr "" + +#: src/js/controllers/copayers.js:64 +#: src/js/controllers/export.js:177 +#: www/views/includes/copyToClipboard.html:4 msgid "Copied to clipboard" msgstr "" -#: www/views/export.html +#: www/views/tab-export-file.html:92 msgid "Copy this text as it is to a safe place (notepad or email)" msgstr "" -#: www/views/export.html +#: www/views/preferencesLogs.html:11 +#: www/views/tab-export-file.html:76 msgid "Copy to clipboard" msgstr "" -#: www/views/import.html +#: www/views/tab-import-phrase.html:2 msgid "Could not access the wallet at the server. Please check:" msgstr "" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:524 msgid "Could not access wallet" msgstr "" -#: src/js/controllers/index.js -msgid "Could not access Wallet Service: Not found" +#: src/js/controllers/confirm.js:376 +msgid "Could not add message to imported wallet without shared encrypting key" msgstr "" -#: src/js/controllers/modals/txpDetails.js +#: src/js/controllers/modals/txpDetails.js:172 msgid "Could not broadcast payment" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:41 msgid "Could not build transaction" msgstr "" -#: src/js/services/addressService.js +#: src/js/services/walletService.js:755 msgid "Could not create address" msgstr "" -#: src/js/controllers/walletHome.js -msgid "Could not create payment proposal" -msgstr "" - -#: src/js/services/profileService.js +#: src/js/services/profileService.js:371 msgid "Could not create using the specified extended private key" msgstr "" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:381 msgid "Could not create using the specified extended public key" msgstr "" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:364 msgid "Could not create: Invalid wallet recovery phrase" msgstr "" -#: src/js/controllers/import.js +#: src/js/controllers/import.js:79 msgid "Could not decrypt file, check your password" msgstr "" -#: src/js/controllers/modals/txpDetails.js +#: src/js/controllers/modals/txpDetails.js:154 msgid "Could not delete payment proposal" msgstr "" -#: src/js/controllers/walletHome.js -msgid "Could not fetch payment information" +#: src/js/services/feeService.js:51 +msgid "Could not get dynamic fee" msgstr "" -#: src/js/controllers/walletHome.js -msgid "Could not get fee value" +#: src/js/services/feeService.js:31 +msgid "Could not get dynamic fee for level: {{feeLevel}}" msgstr "" -#: src/js/services/profileService.js +#: src/js/controllers/confirm.js:656 +msgid "Could not get the destination bitcoin address" +msgstr "" + +#: src/js/controllers/bitpayCard.js:68 +#: src/js/controllers/glidera.js:100 +msgid "Could not get transactions" +msgstr "" + +#: src/js/services/profileService.js:629 +#: src/js/services/profileService.js:660 +#: src/js/services/profileService.js:683 msgid "Could not import" msgstr "" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:598 msgid "Could not import. Check input file and spending password" msgstr "" -#: src/js/services/profileService.js +#: src/js/services/profileService.js:467 msgid "Could not join wallet" msgstr "" -#: src/js/controllers/walletHome.js -msgid "Could not recognize a valid Bitcoin QR Code" -msgstr "" - -#: src/js/controllers/modals/txpDetails.js +#: src/js/controllers/modals/txpDetails.js:134 msgid "Could not reject payment" msgstr "" -#: src/js/controllers/walletHome.js +#: src/js/controllers/preferencesBitpayCard.js:16 +msgid "Could not remove card" +msgstr "" + +#: src/js/controllers/confirm.js:450 +msgid "Could not send confirmation code to your phone" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:120 msgid "Could not send payment" msgstr "" -#: src/js/controllers/index.js -msgid "Could not update Wallet" +#: src/js/controllers/tab-home.js:206 +msgid "Could not update" msgstr "" -#: www/views/walletHome.html -msgid "Create" +#: www/views/tab-create-personal.html:3 +msgid "Create Personal Wallet" msgstr "" -#: www/views/create.html -msgid "Create {{requiredCopayers}}-of-{{totalCopayers}} wallet" +#: www/views/tab-create-shared.html:3 +msgid "Create Shared Wallet" msgstr "" -#: www/views/add.html -#: www/views/create.html +#: www/views/tab-home.html:66 +msgid "Create a bitcoin wallet" +msgstr "" + +#: www/views/onboarding/tour.html:46 +#: www/views/tab-send.html:16 +msgid "Create bitcoin wallet" +msgstr "" + +#: www/views/tab-create-personal.html:103 msgid "Create new wallet" msgstr "" -#: www/views/includes/sidebar.html -msgid "Create, join or import" +#: www/views/add.html:22 +msgid "Create shared wallet" msgstr "" -#: www/views/modals/txp-details.html +#: www/views/tab-create-shared.html:133 +msgid "Create {{formData.requiredCopayers}}-of-{{formData.totalCopayers}} wallet" +msgstr "" + +#: www/views/modals/txp-details.html:83 +#: www/views/tx-details.html:58 msgid "Created by" msgstr "" -#: src/js/services/onGoingProcess.js -msgid "Creating transaction" -msgstr "" - -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:17 msgid "Creating Wallet..." msgstr "" -#: www/views/preferencesFee.html -msgid "Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB" +#: src/js/services/onGoingProcess.js:16 +msgid "Creating transaction" msgstr "" -#: www/views/translators.html -msgid "Czech" +#: www/views/preferencesFee.html:17 +msgid "Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB" msgstr "" -#: www/views/modals/tx-details.html -msgid "Date" +#: www/views/customAmount.html:4 +msgid "Custom Amount" msgstr "" -#: www/views/paperWallet.html -msgid "Decrypting a paper wallet could take around 5 minutes on this device. please be patient and keep the app open." +#: www/views/preferencesDeleteWallet.html:21 +msgid "Delete" msgstr "" -#: www/views/copayers.html -msgid "Delete it and create a new one" -msgstr "" - -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:159 msgid "Delete Payment Proposal" msgstr "" -#: www/views/preferences.html -msgid "Delete recovery phrase" -msgstr "" - -#: www/views/preferencesDeleteWords.html -msgid "Delete Recovery Phrase" -msgstr "" - -#: www/views/preferencesDeleteWallet.html -msgid "Delete wallet" -msgstr "" - -#: www/views/preferencesAdvanced.html +#: www/views/preferencesAdvanced.html:28 +#: www/views/preferencesDeleteWallet.html:3 msgid "Delete Wallet" msgstr "" -#: src/js/services/onGoingProcess.js +#: www/views/copayers.html:59 +msgid "Delete it and create a new one" +msgstr "" + +#: src/js/services/onGoingProcess.js:18 msgid "Deleting Wallet..." msgstr "" -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html +#: src/js/services/onGoingProcess.js:27 +msgid "Deleting payment proposal" +msgstr "" + +#: www/views/join.html:116 +#: www/views/tab-create-personal.html:83 +#: www/views/tab-create-shared.html:113 +#: www/views/tab-import-phrase.html:44 msgid "Derivation Path" msgstr "" -#: www/views/preferencesInformation.html +#: www/views/preferencesInformation.html:41 msgid "Derivation Strategy" msgstr "" -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/walletHome.html -msgid "Description" -msgstr "" - -#: www/views/modals/coinbase-tx-details.html -#: www/views/modals/customized-amount.html -#: www/views/modals/glidera-tx-details.html -#: www/views/modals/paypro.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: www/views/modals/coinbase-tx-details.html:9 +#: www/views/modals/paypro.html:17 msgid "Details" msgstr "" -#: www/views/preferences.html -msgid "Disabled" +#: www/views/advancedSettings.html:55 +#: www/views/advancedSettings.html:71 +msgid "Development Utilities" msgstr "" -#: www/views/export.html +#: www/views/tab-export-file.html:27 msgid "Do not include private key" msgstr "" -#: www/views/preferencesLanguage.html -#: www/views/translators.html +#: www/views/preferencesLanguage.html:21 +#: www/views/translators.html:28 msgid "Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language." msgstr "" -#: www/views/modals/addressbook.html -msgid "Done" -msgstr "" - -#: www/views/export.html +#: www/views/tab-export-file.html:57 msgid "Download" msgstr "" -#: src/js/services/feeService.js +#: www/views/addresses.html:23 +msgid "Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment." +msgstr "" + +#: src/js/services/feeService.js:10 msgid "Economy" msgstr "" -#: www/views/modals/addressbook.html -msgid "Edit" +#: www/views/addressbook.add.html:29 +#: www/views/addressbook.view.html:19 +msgid "Email" msgstr "" -#: www/views/includes/note.html -#: www/views/modals/tx-details.html -msgid "Edit comment" +#: www/views/preferencesNotifications.html:38 +msgid "Email Address" msgstr "" -#: www/views/modals/tx-details.html -msgid "Edited by" -msgstr "" - -#: www/views/preferencesEmail.html -msgid "Email for wallet notifications" -msgstr "" - -#: www/views/preferences.html +#: www/views/onboarding/collectEmail.html:9 msgid "Email Notifications" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:122 msgid "Empty addresses limit reached. New addresses cannot be generated." msgstr "" -#: www/views/preferencesGlobal.html -msgid "Enable Coinbase Service" +#: www/views/advancedSettings.html:17 +msgid "Enable Amazon Integration" msgstr "" -#: www/views/preferencesGlobal.html +#: www/views/advancedSettings.html:13 +msgid "Enable BitPay Card Integration" +msgstr "" + +#: www/views/advancedSettings.html:21 msgid "Enable Glidera Service" msgstr "" -#: www/views/preferencesGlobal.html +#: www/views/tab-scan.html:19 +msgid "Enable camera access in your device settings to get started." +msgstr "" + +#: www/views/preferencesNotifications.html:25 +msgid "Enable email notifications" +msgstr "" + +#: www/views/preferencesNotifications.html:14 msgid "Enable push notifications" msgstr "" -#: src/js/controllers/export.js -msgid "Encrypted export file saved" +#: www/views/tab-scan.html:18 +msgid "Enable the camera to get started." msgstr "" -#: www/views/create.html -#: www/views/join.html +#: www/views/advancedSettings.html:10 +msgid "Enabled Integrations" +msgstr "" + +#: www/views/join.html:86 +#: www/views/tab-create-personal.html:55 +#: www/views/tab-create-shared.html:85 +msgid "Encrypt with a Password" +msgstr "" + +#: www/views/amount.html:4 +msgid "Enter Amount" +msgstr "" + +#: src/js/services/walletService.js:854 +#: src/js/services/walletService.js:869 +msgid "Enter Spending Password" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:6 +msgid "Enter Two Factor for BitPay Card" +msgstr "" + +#: src/js/services/walletService.js:837 +msgid "Enter new spending password" +msgstr "" + +#: www/views/join.html:78 +#: www/views/tab-create-personal.html:48 +#: www/views/tab-create-shared.html:78 msgid "Enter the recovery phrase (BIP39)" msgstr "" -#: www/views/backup.html +#: www/views/backup.html:62 msgid "Enter your password" msgstr "" -#: www/views/includes/password.html +#: www/views/includes/password.html:8 msgid "Enter your spending password" msgstr "" -#: src/js/controllers/index.js -msgid "Error at Wallet Service" +#. Trying to import a malformed wallet export QR code +#: src/js/controllers/activity.js:45 +#: src/js/controllers/addressbook.js:50 +#: src/js/controllers/addressbookAdd.js:30 +#: src/js/controllers/addresses.js:24 +#: src/js/controllers/addresses.js:32 +#: src/js/controllers/addresses.js:84 +#: src/js/controllers/addresses.js:85 +#: src/js/controllers/amazon.js:15 +#: src/js/controllers/amazon.js:27 +#: src/js/controllers/amazon.js:48 +#: src/js/controllers/amazon.js:68 +#: src/js/controllers/amount.js:265 +#: src/js/controllers/amount.js:272 +#: src/js/controllers/amount.js:280 +#: src/js/controllers/amount.js:309 +#: src/js/controllers/amount.js:322 +#: src/js/controllers/amount.js:329 +#: src/js/controllers/amount.js:338 +#: src/js/controllers/bitpayCard.js:145 +#: src/js/controllers/bitpayCard.js:68 +#: src/js/controllers/bitpayCardIntro.js:27 +#: src/js/controllers/confirm.js:153 +#: src/js/controllers/confirm.js:166 +#: src/js/controllers/confirm.js:172 +#: src/js/controllers/confirm.js:450 +#: src/js/controllers/confirm.js:461 +#: src/js/controllers/confirm.js:473 +#: src/js/controllers/confirm.js:622 +#: src/js/controllers/confirm.js:650 +#: src/js/controllers/confirm.js:656 +#: src/js/controllers/confirm.js:684 +#: src/js/controllers/confirm.js:690 +#: src/js/controllers/confirm.js:697 +#: src/js/controllers/confirm.js:704 +#: src/js/controllers/confirm.js:722 +#: src/js/controllers/confirm.js:741 +#: src/js/controllers/confirm.js:755 +#: src/js/controllers/confirm.js:798 +#: src/js/controllers/copayers.js:54 +#: src/js/controllers/create.js:101 +#: src/js/controllers/create.js:129 +#: src/js/controllers/create.js:142 +#: src/js/controllers/create.js:149 +#: src/js/controllers/create.js:164 +#: src/js/controllers/create.js:182 +#: src/js/controllers/export.js:110 +#: src/js/controllers/export.js:138 +#: src/js/controllers/export.js:144 +#: src/js/controllers/export.js:155 +#: src/js/controllers/export.js:35 +#: src/js/controllers/export.js:93 +#: src/js/controllers/export.js:99 +#: src/js/controllers/feedback/send.js:23 +#: src/js/controllers/glidera.js:100 +#: src/js/controllers/glidera.js:27 +#: src/js/controllers/glidera.js:82 +#: src/js/controllers/glideraUri.js:13 +#: src/js/controllers/import.js:114 +#: src/js/controllers/import.js:164 +#: src/js/controllers/import.js:192 +#: src/js/controllers/import.js:201 +#: src/js/controllers/import.js:216 +#: src/js/controllers/import.js:228 +#: src/js/controllers/import.js:239 +#: src/js/controllers/import.js:248 +#: src/js/controllers/import.js:261 +#: src/js/controllers/import.js:273 +#: src/js/controllers/import.js:283 +#: src/js/controllers/import.js:293 +#: src/js/controllers/import.js:317 +#: src/js/controllers/import.js:329 +#: src/js/controllers/import.js:50 +#: src/js/controllers/import.js:63 +#: src/js/controllers/import.js:84 +#: src/js/controllers/import.js:96 +#: src/js/controllers/join.js:108 +#: src/js/controllers/join.js:122 +#: src/js/controllers/join.js:129 +#: src/js/controllers/join.js:143 +#: src/js/controllers/join.js:161 +#: src/js/controllers/join.js:86 +#: src/js/controllers/modals/amazonCardDetails.js:10 +#: src/js/controllers/modals/amazonCardDetails.js:32 +#: src/js/controllers/modals/amazonCardDetails.js:40 +#: src/js/controllers/modals/txpDetails.js:113 +#: src/js/controllers/paperWallet.js:47 +#: src/js/controllers/preferencesBitpayCard.js:16 +#: src/js/controllers/preferencesDelete.js:22 +#: src/js/controllers/preferencesFee.js:9 +#: src/js/controllers/preferencesGlidera.js:60 +#: src/js/controllers/tab-home.js:160 +#: src/js/controllers/tab-receive.js:24 +#: src/js/controllers/tabsController.js:7 +#: src/js/controllers/tx-details.js:18 +msgid "Error" msgstr "" -#: src/js/services/profileService.js +#: src/js/controllers/confirm.js:354 +msgid "Error at confirm" +msgstr "" + +#: src/js/services/profileService.js:424 msgid "Error creating wallet" msgstr "" -#: www/views/modals/txp-details.html +#: src/js/controllers/paperWallet.js:41 +msgid "Error scanning funds:" +msgstr "" + +#: src/js/controllers/paperWallet.js:91 +msgid "Error sweeping wallet:" +msgstr "" + +#: src/js/services/bwcError.js:143 +msgid "Exceeded daily limit of $500 per user" +msgstr "" + +#: www/views/advancedSettings.html:40 +msgid "Experimental Features" +msgstr "" + +#: src/js/controllers/confirm.js:312 +#: www/views/confirm.html:30 +#: www/views/modals/txp-details.html:114 msgid "Expired" msgstr "" -#: www/views/modals/paypro.html -#: www/views/modals/txp-details.html +#: www/views/modals/paypro.html:52 +#: www/views/modals/txp-details.html:120 msgid "Expires" msgstr "" -#: www/views/export.html -msgid "Export options" -msgstr "" - -#: www/views/preferencesHistory.html -msgid "Export to file" -msgstr "" - -#: www/views/preferencesAdvanced.html +#: www/views/preferencesAdvanced.html:16 msgid "Export Wallet" msgstr "" -#: www/views/export.html +#: www/views/preferencesHistory.html:10 +#: www/views/preferencesHistory.html:13 +msgid "Export to file" +msgstr "" + +#: www/views/export.html:3 +msgid "Export wallet" +msgstr "" + +#: src/js/services/walletService.js:1000 +#: www/views/tab-export-qrCode.html:9 msgid "Exporting via QR not supported for this wallet" msgstr "" -#: www/views/preferencesInformation.html +#: www/views/preferencesInformation.html:76 msgid "Extended Public Keys" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:19 msgid "Extracting Wallet Information..." msgstr "" -#: www/views/export.html +#: src/js/controllers/export.js:110 +#: src/js/controllers/export.js:144 +#: src/js/controllers/export.js:155 +#: src/js/controllers/export.js:99 +#: www/views/tab-export-file.html:4 msgid "Failed to export" msgstr "" -#: www/views/backup.html -msgid "Failed to verify backup. Please check your information" -msgstr "" - -#: www/views/create.html +#: www/views/tab-create-personal.html:14 +#: www/views/tab-create-shared.html:14 msgid "Family vacation funds" msgstr "" -#: www/views/includes/confirm-tx.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: www/views/confirm.html:79 +#: www/views/includes/confirm-tx.html:19 +#: www/views/modals/txp-details.html:95 +#: www/views/tx-details.html:71 msgid "Fee" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/controllers/feedback/send.js:23 +msgid "Feedback could not be submitted. Please try again later." +msgstr "" + +#: src/js/services/onGoingProcess.js:20 msgid "Fetching Payment Information" msgstr "" -#: www/views/export.html -#: www/views/import.html +#: www/views/export.html:11 +#: www/views/import.html:16 msgid "File/Text" msgstr "" -#: src/js/services/fingerprintService.js +#: src/js/services/fingerprintService.js:43 +#: src/js/services/fingerprintService.js:48 msgid "Finger Scan Failed" msgstr "" -#: www/views/backup.html +#: src/js/controllers/feedback/send.js:34 +#: www/views/customAmount.html:9 msgid "Finish" msgstr "" -#: www/views/create.html +#: www/views/tab-create-personal.html:95 +#: www/views/tab-create-shared.html:125 msgid "For audit purposes" msgstr "" -#: www/views/translators.html +#: www/views/paperWallet.html:34 +msgid "Founds transferred" +msgstr "" + +#: www/views/translators.html:13 msgid "French" msgstr "" -#: www/views/export.html +#: www/views/confirm.html:60 +#: www/views/confirm.html:62 +#: www/views/modals/txp-details.html:74 +#: www/views/tx-details.html:48 +msgid "From" +msgstr "" + +#: www/views/tab-export-qrCode.html:5 msgid "From the destination device, go to Add wallet > Import wallet and scan this QR code" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:74 msgid "Funds are locked by pending spend proposals" msgstr "" -#: www/views/paperWallet.html -msgid "Funds found" +#: www/views/paperWallet.html:16 +msgid "Funds found:" msgstr "" -#: src/js/services/notificationsService.js -msgid "Funds received" -msgstr "" - -#: www/views/paperWallet.html +#: www/views/paperWallet.html:23 msgid "Funds will be transferred to" msgstr "" -#: www/views/walletHome.html -msgid "Generate new address" -msgstr "" - -#: www/views/modals/customized-amount.html -msgid "Generate QR Code" -msgstr "" - -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:21 msgid "Generating .csv file..." msgstr "" -#: www/views/translators.html -msgid "German" +#: src/js/services/onGoingProcess.js:37 +msgid "Generating new address..." msgstr "" -#: www/views/modals/addressbook.html -msgid "Getting address for wallet {{selectedWalletName}} ..." +#: www/views/bitpayCardIntro.html:23 +msgid "Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply." msgstr "" -#: www/views/includes/sidebar.html -msgid "Global preferences" +#: www/views/onboarding/collectEmail.html:15 +msgid "Get news and updates from BitPay" msgstr "" -#: www/views/preferences.html -msgid "Hardware wallet" +#: www/views/onboarding/welcome.html:9 +msgid "Get started" msgstr "" -#: www/views/import.html +#: src/js/services/onGoingProcess.js:38 +msgid "Getting addresses..." +msgstr "" + +#: src/js/services/onGoingProcess.js:22 +msgid "Getting fee levels..." +msgstr "" + +#: www/views/glidera.html:39 +msgid "Glidera Inc. (Glidera) is providing the service of buying or selling bitcoin to BitPay users. To enable this service, Glidera has registered with US Treasury Department’s FinCEN as a Money Service Business (#31000042625755). Users of BitPay must agree to the service agreement presented by Glidera prior to obtaining Glidera’s service of buying or selling bitcoin." +msgstr "" + +#: src/js/controllers/onboarding/terms.js:23 +#: src/js/controllers/preferencesAbout.js:15 +#: src/js/controllers/preferencesLanguage.js:14 +#: src/js/controllers/tab-home.js:135 +#: src/js/controllers/tab-settings.js:55 +#: src/js/controllers/translators.js:11 +#: src/js/controllers/tx-details.js:128 +msgid "Go Back" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:35 +#: src/js/controllers/onboarding/backupRequest.js:13 +#: src/js/controllers/onboarding/backupRequest.js:19 +#: www/views/includes/backupLaterPopup.html:4 +msgid "Go back" +msgstr "" + +#: www/views/includes/backupWarningPopup.html:4 +#: www/views/includes/confirmBackupPopup.html:8 +msgid "Got it" +msgstr "" + +#: www/views/onboarding/tour.html:18 +msgid "Got it →" +msgstr "" + +#: www/views/preferences.html:20 +#: www/views/preferencesInformation.html:47 msgid "Hardware Wallet" msgstr "" -#: www/views/create.html -#: www/views/export.html -#: www/views/import.html -#: www/views/join.html +#: www/views/import.html:20 +msgid "Hardware wallet" +msgstr "" + +#: www/views/glidera.html:34 +msgid "Have the OAuth Code?" +msgstr "" + +#: www/views/tab-settings.html:27 +msgid "Help & Support" +msgstr "" + +#: src/js/controllers/tab-settings.js:53 +msgid "Help and support information is available at the BitPay Help Center website. Would you like to go there now?" +msgstr "" + +#: www/views/addresses.html:29 +msgid "Hide" +msgstr "" + +#: www/views/preferences.html:34 +msgid "Hide Balance" +msgstr "" + +#: www/views/join.html:48 +#: www/views/tab-create-personal.html:25 +#: www/views/tab-create-shared.html:55 +#: www/views/tab-export-file.html:23 +#: www/views/tab-import-file.html:28 +#: www/views/tab-import-hardware.html:31 +#: www/views/tab-import-phrase.html:31 msgid "Hide advanced options" msgstr "" -#: www/views/disclaimer.html -msgid "I affirm that I have read, understood, and agree with these terms." +#: www/views/tabs.html:3 +msgid "Home" msgstr "" -#: www/views/disclaimer.html -msgid "I AGREE. GET STARTED" +#: src/js/controllers/feedback/send.js:55 +#: src/js/controllers/feedback/send.js:59 +#: src/js/controllers/feedback/send.js:63 +msgid "How could we improve your experience?" msgstr "" -#: www/views/import.html +#: www/views/feedback/rateCard.html:3 +msgid "How do you like BitPay?" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:28 +msgid "I don't like it" +msgstr "" + +#: www/views/onboarding/disclaimer.html:44 +msgid "I have read, understood, and agree to the Terms of Use." +msgstr "" + +#: www/views/modals/terms.html:22 +msgid "I have read, understood, and agree with the Terms of use." +msgstr "" + +#: www/views/join.html:112 +#: www/views/tab-create-personal.html:79 +#: www/views/tab-create-shared.html:109 +msgid "I have written it down" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:34 +msgid "I like the app" +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:25 +msgid "I think this app is terrible." +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:12 +#: www/views/includes/backupLaterPopup.html:7 +#: www/views/includes/screenshotWarningModal.html:9 +msgid "I understand" +msgstr "" + +#: www/views/onboarding/disclaimer.html:21 +msgid "I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase." +msgstr "" + +#: www/views/onboarding/disclaimer.html:18 +msgid "I understand that my funds are held securely on this device, not by a company." +msgstr "" + +#: www/views/onboarding/backupRequest.html:12 +msgid "I'll backup my wallet later" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:10 +msgid "I'll do it later" +msgstr "" + +#: www/views/backup.html:29 +msgid "I've written it down" +msgstr "" + +#: www/views/advancedSettings.html:50 +msgid "If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab." +msgstr "" + +#: www/views/advancedSettings.html:36 +msgid "If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays." +msgstr "" + +#: www/views/includes/backupLaterPopup.html:3 +msgid "If something happens to this device, this app is deleted, or your password forgotten, neither you nor Bitpay can recover your funds." +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:11 +msgid "If this device is replaced or this app is deleted, neither you nor BitPay can recover your funds without a backup." +msgstr "" + +#: www/views/feedback/complete.html:19 +msgid "If you have additional feedback, please let us know by tapping the \"Send feedback\" option in the Settings tab." +msgstr "" + +#: www/views/includes/screenshotWarningModal.html:8 +msgid "If you take a screenshot, your backup may be viewed by other apps. You can make a safe backup with physical paper and a pen." +msgstr "" + +#: www/views/tab-import-hardware.html:42 +#: www/views/tab-import-phrase.html:61 msgid "Import" msgstr "" -#: www/views/import.html +#: www/views/import.html:3 +msgid "Import Wallet" +msgstr "" + +#: www/views/tab-import-file.html:39 msgid "Import backup" msgstr "" -#: www/views/add.html +#: www/views/add.html:38 msgid "Import wallet" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:23 msgid "Importing Wallet..." msgstr "" -#: www/views/includes/terms.html -msgid "In no event shall the authors of the software, employees and affiliates of Bitpay, copyright holders, or BitPay, Inc. be held liable for any claim, damages or other liability, whether in an action of contract, tort, or otherwise, arising from, out of or in connection with the software." +#: www/views/backup.html:65 +msgid "In order to verify your wallet backup, please type your password." msgstr "" -#: www/views/backup.html -msgid "In order to verify your wallet backup, please type your password:" +#: www/views/includes/walletSelector.html:18 +#: www/views/tab-home.html:79 +#: www/views/tab-settings.html:114 +msgid "Incomplete" msgstr "" -#: src/js/services/bwcError.js +#: www/views/tab-receive.html:35 +msgid "Incomplete wallet" +msgstr "" + +#: src/js/services/bwcError.js:113 msgid "Incorrect address network" msgstr "" #. Trying to import a malformed wallet export QR code -#: src/js/controllers/import.js +#: src/js/controllers/import.js:50 msgid "Incorrect code format" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:44 +#: www/views/confirm.html:116 msgid "Insufficient funds" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:71 msgid "Insufficient funds for fee" msgstr "" -#: www/views/modals/search.html -#: www/views/walletHome.html +#: www/views/modals/search.html:70 +#: www/views/walletDetails.html:236 msgid "Invalid" msgstr "" -#: src/js/controllers/create.js -#: src/js/controllers/import.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:149 +#: src/js/controllers/import.js:293 +#: src/js/controllers/join.js:129 msgid "Invalid account number" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:119 msgid "Invalid address" msgstr "" -#: src/js/controllers/create.js -#: src/js/controllers/import.js -#: src/js/controllers/join.js +#: src/js/controllers/tabsController.js:7 +msgid "Invalid data" +msgstr "" + +#: src/js/controllers/create.js:129 +#: src/js/controllers/import.js:228 +#: src/js/controllers/join.js:108 msgid "Invalid derivation path" msgstr "" -#: src/js/controllers/copayers.js -msgid "Invitation to share a Copay Wallet" +#: src/js/controllers/copayers.js:75 +msgid "Invitation to share a {{appName}} Wallet" msgstr "" -#: www/views/translators.html -msgid "Italian" +#: src/js/controllers/feedback/send.js:71 +msgid "Is there anything we could do better?" msgstr "" -#: www/views/translators.html -msgid "Japanese" +#: www/views/backup.html:47 +msgid "Is this correct?" msgstr "" -#: www/views/create.html -#: www/views/join.html +#: www/views/onboarding/collectEmail.html:22 +msgid "Is this email address correct?" +msgstr "" + +#: www/views/addresses.html:29 +msgid "It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers." +msgstr "" + +#: src/js/controllers/backup.js:76 +msgid "It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again." +msgstr "" + +#: www/views/join.html:18 msgid "John" msgstr "" -#: www/views/join.html +#: www/views/join.html:126 msgid "Join" msgstr "" -#: src/js/controllers/copayers.js -msgid "Join my Copay wallet. Here is the invitation code: {{secret}} You can download Copay for your phone or desktop at https://copay.io" +#: src/js/controllers/copayers.js:70 +msgid "Join my {{appName}} Wallet. Here is the invitation code: {{secret}} You can download {{appName}} for your phone or desktop at {{appUrl}}" msgstr "" -#: www/views/add.html +#: www/views/add.html:30 +#: www/views/join.html:5 msgid "Join shared wallet" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:24 msgid "Joining Wallet..." msgstr "" -#: src/js/services/bwcError.js +#: www/views/onboarding/tour.html:17 +msgid "Just scan the code to pay." +msgstr "" + +#: src/js/services/bwcError.js:116 msgid "Key already associated with an existing wallet" msgstr "" -#: www/views/modals/addressbook.html -msgid "Label" -msgstr "" - -#: www/views/preferencesGlobal.html +#: www/views/preferencesLanguage.html:4 +#: www/views/tab-settings.html:60 msgid "Language" msgstr "" -#: www/views/preferencesInformation.html -msgid "Last Wallet Addresses" +#: www/views/bitpayCard.html:56 +msgid "Last Month" msgstr "" -#: www/views/backup.html -msgid "Learn more about Copay backups" +#: www/views/backup.html:36 +msgid "Let's verify your backup phrase." msgstr "" -#: www/views/preferencesFee.html -msgid "Loading..." +#: src/js/services/onGoingProcess.js:35 +msgid "Loading transaction info..." msgstr "" -#: www/views/includes/available-balance.html -msgid "locked by pending payments" -msgstr "" - -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:86 msgid "Locktime in effect. Please wait to create a new spend proposal" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:89 msgid "Locktime in effect. Please wait to remove this spend proposal" msgstr "" -#: www/views/paymentUri.html +#: www/views/paymentUri.html:13 msgid "Make a payment to" msgstr "" -#: src/js/controllers/index.js +#: www/views/onboarding/tour.html:33 +msgid "Makes sense →" +msgstr "" + +#: src/js/controllers/modals/search.js:61 msgid "Matches:" msgstr "" -#: src/js/services/profileService.js -msgid "me" -msgstr "" - -#: www/views/includes/copayers.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/preferencesInformation.html +#: www/views/includes/copayers.html:4 +#: www/views/preferencesInformation.html:72 msgid "Me" msgstr "" -#: www/views/modals/paypro.html +#: src/js/controllers/feedback/rateCard.js:31 +msgid "Meh - it's alright" +msgstr "" + +#: src/js/controllers/tx-details.js:100 +#: www/views/modals/paypro.html:48 +#: www/views/modals/txp-details.html:89 +#: www/views/tx-details.html:64 msgid "Memo" msgstr "" -#: www/views/modals/tx-details.html -msgid "Merchant message" +#: www/views/modals/txp-details.html:126 +msgid "Merchant Message" msgstr "" -#: www/views/paymentUri.html +#: www/views/paymentUri.html:17 msgid "Message" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:134 msgid "Missing parameter" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:32 msgid "Missing private keys to sign" msgstr "" -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html +#: www/views/preferences.html:56 +#: www/views/preferencesAdvanced.html:3 +msgid "More Options" +msgstr "" + +#: www/views/modals/search.html:67 +#: www/views/walletDetails.html:234 msgid "Moved" msgstr "" -#: www/views/includes/confirm-tx.html -#: www/views/modals/txp-details.html +#: src/js/controllers/tx-details.js:24 +msgid "Moved Funds" +msgstr "" + +#: www/views/includes/confirm-tx.html:13 +#: www/views/modals/txp-details.html:57 msgid "Multiple recipients" msgstr "" -#: www/views/walletHome.html -msgid "My Bitcoin address" -msgstr "" - -#: www/views/modals/addressbook.html -msgid "My contacts" -msgstr "" - -#: www/views/modals/addressbook.html -msgid "My wallets" -msgstr "" - -#: www/views/preferencesDeleteWords.html -msgid "Need to do backup" -msgstr "" - -#: www/views/paymentUri.html -msgid "Network" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Network connection error" -msgstr "" - -#: src/js/services/notificationsService.js -msgid "New Payment Proposal" -msgstr "" - -#: src/js/controllers/create.js -#: src/js/controllers/join.js -msgid "New Random Recovery Phrase" -msgstr "" - -#: www/views/import.html -msgid "No hardware wallets supported on this device" -msgstr "" - -#: www/views/walletHome.html -msgid "No transactions yet" -msgstr "" - -#: src/js/services/feeService.js -msgid "Normal" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Not authorized" -msgstr "" - -#: www/views/preferences.html -msgid "Not completed" -msgstr "" - -#: src/js/controllers/walletHome.js -msgid "Not enough funds for fee" -msgstr "" - -#: www/views/modals/addressbook.html -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Not valid" -msgstr "" - -#: www/views/includes/output.html -msgid "Note" -msgstr "" - -#: src/js/controllers/walletHome.js -msgid "Note: a total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded" -msgstr "" - -#: src/js/controllers/walletHome.js -msgid "Note: a total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided." -msgstr "" - -#: www/views/import.html +#: www/views/tab-import-phrase.html:8 msgid "NOTE: To import a wallet from a 3rd party software, please go to Add Wallet > Create Wallet, and specify the Recovery Phrase there." msgstr "" -#: www/views/disclaimer.html -#: www/views/termOfUse.html -msgid "Official English Disclaimer" +#: www/views/addressbook.add.html:21 +#: www/views/addressbook.view.html:15 +#: www/views/preferences.html:13 +#: www/views/preferencesAlias.html:17 +msgid "Name" msgstr "" -#: www/views/modals/tx-status.html +#: www/views/paymentUri.html:18 +msgid "Network" +msgstr "" + +#: src/js/services/bwcError.js:47 +msgid "Network connection error" +msgstr "" + +#: www/views/includes/walletActivity.html:43 +msgid "New Proposal" +msgstr "" + +#: src/js/controllers/addresses.js:85 +msgid "New address could not be generated. Please try again." +msgstr "" + +#: www/views/add.html:14 +msgid "New personal wallet" +msgstr "" + +#: www/views/tab-home.html:146 +msgid "Next steps" +msgstr "" + +#: www/views/onboarding/collectEmail.html:27 +msgid "No" +msgstr "" + +#: www/views/tab-receive.html:12 +msgid "No Wallet" +msgstr "" + +#: www/views/onboarding/backupRequest.html:5 +msgid "No backup, no bitcoin." +msgstr "" + +#: www/views/addressbook.html:19 +msgid "No contacts yet" +msgstr "" + +#: www/views/tab-import-hardware.html:3 +msgid "No hardware wallets supported on this device" +msgstr "" + +#: www/views/proposals.html:25 +msgid "No pending proposals" +msgstr "" + +#: www/views/activity.html:25 +msgid "No recent transactions" +msgstr "" + +#: www/views/walletDetails.html:179 +msgid "No transactions yet" +msgstr "" + +#: src/js/controllers/amount.js:309 +msgid "No wallet found!" +msgstr "" + +#: www/views/confirm.html:113 +msgid "No wallets available" +msgstr "" + +#: www/views/paperWallet.html:28 +msgid "No wallets available to receive funds" +msgstr "" + +#: src/js/services/feeService.js:9 +msgid "Normal" +msgstr "" + +#: src/js/services/bwcError.js:80 +msgid "Not authorized" +msgstr "" + +#: src/js/controllers/confirm.js:172 +msgid "Not enough funds for fee" +msgstr "" + +#: www/views/onboarding/tour.html:45 +msgid "Not even BitPay can access it." +msgstr "" + +#: src/js/controllers/paperWallet.js:47 +msgid "Not funds found" +msgstr "" + +#: www/views/feedback/rateApp.html:3 +#: www/views/onboarding/notifications.html:8 +msgid "Not now" +msgstr "" + +#: www/views/includes/output.html:15 +msgid "Note" +msgstr "" + +#: www/views/modals/wallets.html:25 +msgid "Notice: only 1-1 (single signature) wallets can be used for sell bitcoin" +msgstr "" + +#: www/views/preferencesNotifications.html:10 +#: www/views/preferencesNotifications.html:3 +#: www/views/tab-settings.html:53 +msgid "Notifications" +msgstr "" + +#: www/views/includes/backupNeededPopup.html:8 +msgid "Now is a good time to backup your wallet. If this device is lost, it is impossible to access your funds without a backup." +msgstr "" + +#: www/views/backupWarning.html:11 +msgid "Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?" +msgstr "" + +#: src/js/services/popupService.js:15 +#: src/js/services/popupService.js:57 +msgid "OK" +msgstr "" + +#: www/views/modals/tx-status.html:12 +#: www/views/modals/tx-status.html:24 +#: www/views/modals/tx-status.html:36 +#: www/views/modals/tx-status.html:46 msgid "OKAY" msgstr "" -#: www/views/preferencesDeleteWords.html -msgid "Once you have copied your wallet recovery phrase down, it is recommended to delete it from this device." +#: www/views/modals/terms.html:15 +#: www/views/termsOfUse.html:12 +msgid "Official English Disclaimer" msgstr "" -#: www/views/preferencesInformation.html -msgid "Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time." +#: src/js/controllers/feedback/send.js:58 +msgid "Oh no!" msgstr "" -#: www/views/preferencesGlobal.html -msgid "Open Settings app" +#: www/views/tab-home.html:29 +msgid "On this screen you can see all your wallets, accounts, and assets." msgstr "" -#: www/views/walletHome.html -msgid "optional" +#: src/js/controllers/preferencesLanguage.js:13 +#: src/js/controllers/translators.js:10 +msgid "Open Crowdin" msgstr "" -#: www/views/paperWallet.html -msgid "Paper Wallet Private Key" +#: src/js/controllers/preferencesAbout.js:14 +msgid "Open GitHub" msgstr "" -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -msgid "Participants" +#: src/js/controllers/preferencesAbout.js:12 +msgid "Open GitHub Project" msgstr "" -#: www/views/paperWallet.html -msgid "Passphrase" +#: src/js/controllers/tab-settings.js:54 +msgid "Open Help Center" msgstr "" -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -#: www/views/paperWallet.html +#: src/js/controllers/tx-details.js:127 +msgid "Open Insight" +msgstr "" + +#: src/js/controllers/preferencesLanguage.js:11 +#: src/js/controllers/translators.js:8 +msgid "Open Translation Community" +msgstr "" + +#: src/js/controllers/onboarding/terms.js:22 +msgid "Open Website" +msgstr "" + +#: www/views/tab-receive.html:41 +msgid "Open wallet" +msgstr "" + +#: www/views/bitpayCardIntro.html:34 +msgid "Order the BitPay Card" +msgstr "" + +#: www/views/tab-import-file.html:18 +#: www/views/tab-import-phrase.html:36 msgid "Password" msgstr "" -#: src/js/controllers/import.js +#: src/js/controllers/import.js:63 msgid "Password required. Make sure to enter your password in advanced options" msgstr "" -#: www/views/join.html +#: www/views/join.html:35 msgid "Paste invitation here" msgstr "" -#: www/views/import.html +#: www/views/tab-import-file.html:13 msgid "Paste the backup plain text code" msgstr "" -#: www/views/paperWallet.html -msgid "Paste your paper wallet private key here" +#: www/views/bitpayCardIntro.html:28 +msgid "Pay 0% fees to turn bitcoin into dollars." msgstr "" -#: src/js/controllers/walletHome.js -msgid "Pasted from clipboard" -msgstr "" - -#: www/views/modals/paypro.html +#: www/views/modals/paypro.html:21 msgid "Pay To" msgstr "" -#: www/views/modals/tx-status.html +#: www/views/modals/tx-status.html:33 msgid "Payment Accepted" msgstr "" -#: www/views/modals/txp-details.html -msgid "Payment accepted, but not yet broadcasted" +#: www/views/confirm.html:28 +msgid "Payment Expires:" msgstr "" -#: www/views/modals/txp-details.html -msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." -msgstr "" - -#: www/views/modals/txp-details.html -msgid "Payment details" -msgstr "" - -#: www/views/walletHome.html -msgid "Payment expires" -msgstr "" - -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:6 msgid "Payment Proposal" msgstr "" -#: www/views/modals/tx-status.html +#: www/views/modals/tx-status.html:21 msgid "Payment Proposal Created" msgstr "" -#: src/js/services/notificationsService.js -msgid "Payment Proposal Rejected" -msgstr "" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Rejected by Copayer" -msgstr "" - -#: src/js/services/notificationsService.js -msgid "Payment Proposal Signed by Copayer" -msgstr "" - -#: www/views/walletHome.html +#: www/views/tab-home.html:36 msgid "Payment Proposals" msgstr "" -#: src/js/controllers/walletHome.js +#: src/js/services/payproService.js:42 msgid "Payment Protocol Invalid" msgstr "" -#: src/js/controllers/walletHome.js +#: src/js/services/payproService.js:18 msgid "Payment Protocol not supported on Chrome App" msgstr "" -#: www/views/modals/tx-status.html -#: www/views/modals/txp-details.html +#: www/views/includes/walletActivity.html:20 +msgid "Payment Received" +msgstr "" + +#: www/views/modals/tx-status.html:43 +#: www/views/modals/txp-details.html:43 msgid "Payment Rejected" msgstr "" -#: www/views/modals/paypro.html -msgid "Payment request" -msgstr "" - -#: www/views/modals/txp-details.html -#: src/js/services/notificationsService.js +#: www/views/includes/walletActivity.html:11 +#: www/views/modals/txp-details.html:42 msgid "Payment Sent" msgstr "" -#: www/views/walletHome.html -msgid "Payment to" +#: www/views/modals/txp-details.html:32 +msgid "Payment accepted, but not yet broadcasted" msgstr "" -#: www/views/walletHome.html -msgid "Pending Confirmation" +#: www/views/modals/txp-details.html:40 +msgid "Payment accepted. It will be broadcasted by Glidera. In case there is a problem, it can be deleted 6 hours after it was created." msgstr "" -#: www/views/preferencesDeleteWallet.html -msgid "Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED" +#: www/views/modals/txp-details.html:102 +msgid "Payment details" msgstr "" -#: www/views/create.html -#: src/js/services/profileService.js +#: www/views/modals/paypro.html:6 +msgid "Payment request" +msgstr "" + +#: www/views/bitpayCard.html:99 +msgid "Pending" +msgstr "" + +#: www/views/proposals.html:5 +msgid "Pending Proposals" +msgstr "" + +#: www/views/preferencesDeleteWallet.html:11 +msgid "Permanently delete this wallet." +msgstr "" + +#: src/js/services/profileService.js:416 msgid "Personal Wallet" msgstr "" -#: src/js/controllers/import.js +#: www/views/backup.html:18 +msgid "Please carefully write down this phrase." +msgstr "" + +#: www/views/tab-scan.html:20 +msgid "Please connect a camera to get started." +msgstr "" + +#: src/js/controllers/import.js:239 msgid "Please enter the recovery phrase" msgstr "" -#: src/js/controllers/create.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:101 +#: src/js/controllers/join.js:86 msgid "Please enter the required fields" msgstr "" -#: src/js/controllers/create.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:142 +#: src/js/controllers/join.js:122 msgid "Please enter the wallet recovery phrase" msgstr "" -#: www/views/backup.html -msgid "Please tap the words in order to confirm your backup phrase is correctly written." +#: www/views/backup.html:46 +msgid "Please tap each word in the correct order." msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:101 msgid "Please upgrade Copay to perform this action" msgstr "" -#: www/views/uri.html -msgid "Please wait to be redirected..." +#: src/js/controllers/confirm.js:454 +msgid "Please, enter the code below" msgstr "" -#: src/js/controllers/import.js +#: src/js/controllers/import.js:201 msgid "Please, select your backup file" msgstr "" -#: www/views/translators.html -msgid "Polish" -msgstr "" - -#: www/views/paperWallet.html +#: www/views/tab-settings.html:47 msgid "Preferences" msgstr "" -#: src/js/controllers/export.js +#: src/js/services/onGoingProcess.js:39 +msgid "Preparing addresses..." +msgstr "" + +#: src/js/controllers/export.js:182 msgid "Preparing backup..." msgstr "" -#: www/views/preferencesHistory.html -msgid "preparing..." -msgstr "" - -#: src/js/routes.js +#: src/js/routes.js:1099 msgid "Press again to exit" msgstr "" -#: src/js/services/feeService.js +#: src/js/services/feeService.js:8 msgid "Priority" msgstr "" -#: src/js/services/bwcError.js +#: src/js/controllers/paperWallet.js:142 +msgid "Private key encrypted. Enter password" +msgstr "" + +#: src/js/services/bwcError.js:35 msgid "Private key is encrypted, cannot sign" msgstr "" -#: www/views/preferencesGlobal.html -msgid "Push notifications for Copay are currently disabled. Enable them in the Settings app." +#: www/views/includes/walletActivity.html:51 +msgid "Proposal Accepted" msgstr "" -#: www/views/export.html -#: www/views/modals/customized-amount.html +#: src/js/controllers/modals/txpDetails.js:38 +#: src/js/controllers/tx-details.js:64 +msgid "Proposal Created" +msgstr "" + +#: www/views/includes/walletActivity.html:27 +msgid "Proposal Deleted" +msgstr "" + +#: www/views/includes/walletActivity.html:35 +msgid "Proposal Rejected" +msgstr "" + +#: www/views/walletDetails.html:164 +msgid "Proposals" +msgstr "" + +#: www/views/onboarding/notifications.html:3 +msgid "Push Notifications" +msgstr "" + +#: www/views/preferencesNotifications.html:19 +msgid "Push notifications for {{appName}} are currently disabled. Enable them in the Settings app." +msgstr "" + +#: www/views/export.html:14 msgid "QR Code" msgstr "" -#: www/views/modals/scanner.html -msgid "QR-Scanner" +#: www/views/onboarding/disclaimer.html:13 +msgid "Quick review!" msgstr "" -#: src/js/controllers/index.js +#: src/js/controllers/create.js:70 +#: src/js/controllers/join.js:53 +msgid "Random" +msgstr "" + +#: www/views/feedback/rateApp.html:14 +msgid "Rate on the app store" +msgstr "" + +#: www/views/addresses.html:43 +msgid "Read less" +msgstr "" + +#: www/views/addresses.html:42 +msgid "Read more" +msgstr "" + +#: www/views/tab-receive.html:3 +#: www/views/tabs.html:7 msgid "Receive" msgstr "" -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html +#: www/views/modals/search.html:51 +#: www/views/walletDetails.html:220 msgid "Received" msgstr "" -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html +#: src/js/controllers/tx-details.js:23 +msgid "Received Funds" +msgstr "" + +#: www/views/walletDetails.html:242 +msgid "Receiving" +msgstr "" + +#: www/views/bitpayCard.html:55 +#: www/views/walletDetails.html:199 +msgid "Recent" +msgstr "" + +#: www/views/advancedSettings.html:48 +msgid "Recent Transaction Card" +msgstr "" + +#: www/views/activity.html:4 +#: www/views/tab-home.html:48 +msgid "Recent Transactions" +msgstr "" + +#: www/views/amount.html:18 +#: www/views/tab-send.html:22 +msgid "Recipient" +msgstr "" + +#: www/views/modals/txp-details.html:62 msgid "Recipients" msgstr "" -#: www/views/import.html -msgid "Recovery Phrase" +#: www/views/import.html:12 +msgid "Recovery phrase" msgstr "" -#: src/js/controllers/preferencesDeleteWords.js -msgid "Recovery phrase deleted" -msgstr "" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:114 +#: www/views/walletDetails.html:35 msgid "Recreate" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:25 msgid "Recreating Wallet..." msgstr "" -#: www/views/modals/txp-details.html -msgid "Reject" +#: src/js/controllers/modals/txpDetails.js:40 +#: src/js/controllers/tx-details.js:66 +msgid "Rejected" msgstr "" -#: www/views/preferencesAbout.html -msgid "Release Information" +#: src/js/services/onGoingProcess.js:26 +msgid "Rejecting payment proposal" msgstr "" -#: www/views/modals/addressbook.html -msgid "Remove" +#: www/views/preferencesAbout.html:9 +msgid "Release information" msgstr "" -#: www/views/export.html +#: www/views/tab-export-file.html:16 msgid "Repeat password" msgstr "" -#: www/views/export.html +#: www/views/tab-export-file.html:15 msgid "Repeat the password" msgstr "" -#: www/views/includes/password.html +#: www/views/includes/password.html:5 msgid "Repeat the spending password" msgstr "" -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Request a specific amount" +#: www/views/preferences.html:51 +msgid "Request Fingerprint" msgstr "" -#: www/views/preferences.html +#: src/js/controllers/tab-receive.js:153 +msgid "Request Specific amount" +msgstr "" + +#: www/views/preferences.html:46 msgid "Request Spending Password" msgstr "" -#: www/views/join.html -msgid "Required" -msgstr "" - -#: www/views/create.html +#: www/views/tab-create-shared.html:42 msgid "Required number of signatures" msgstr "" -#: src/js/services/onGoingProcess.js +#: www/views/onboarding/welcome.html:10 +msgid "Restore from backup" +msgstr "" + +#: src/js/services/onGoingProcess.js:28 msgid "Retrieving inputs information" msgstr "" -#: www/views/translators.html -msgid "Russian" +#: src/js/controllers/onboarding/tour.js:59 +msgid "Retry" msgstr "" -#: www/views/includes/note.html -#: www/views/modals/addressbook.html -#: www/views/preferencesAlias.html -#: www/views/preferencesBwsUrl.html -#: www/views/preferencesEmail.html -msgid "Save" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Scan addresses for funds" -msgstr "" - -#: www/views/preferences.html -msgid "Scan Fingerprint" -msgstr "" - -#: src/js/services/notificationsService.js -msgid "Scan Finished" -msgstr "" - -#: www/views/walletHome.html -msgid "Scan status finished with error" -msgstr "" - -#: www/views/paperWallet.html -msgid "Scan Wallet Funds" -msgstr "" - -#: src/js/services/fingerprintService.js -msgid "Scan your fingerprint please" -msgstr "" - -#: src/js/services/onGoingProcess.js -msgid "Scanning Wallet funds..." -msgstr "" - -#: www/views/modals/search.html -msgid "Search transactions" -msgstr "" - -#: www/views/modals/search.html -msgid "Search Transactions" -msgstr "" - -#: www/views/preferences.html -msgid "Security preferences" -msgstr "" - -#: www/views/modals/tx-details.html -msgid "See it on the blockchain" -msgstr "" - -#: www/views/import.html -msgid "Select a backup file" -msgstr "" - -#: www/views/paymentUri.html -msgid "Select a wallet" -msgstr "" - -#: www/views/modals/paypro.html -msgid "Self-signed Certificate" -msgstr "" - -#: www/views/walletHome.html -#: src/js/controllers/index.js -msgid "Send" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Send addresses by email" -msgstr "" - -#: www/views/includes/confirm-tx.html -msgid "Send bitcoin" -msgstr "" - -#: www/views/export.html -#: www/views/preferencesLogs.html -msgid "Send by email" -msgstr "" - -#: www/views/walletHome.html -msgid "Send Max" -msgstr "" - -#: www/views/includes/transaction.html -msgid "Sending" -msgstr "" - -#: src/js/services/onGoingProcess.js -msgid "Sending transaction" -msgstr "" - -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/modals/tx-status.html -#: www/views/walletHome.html -msgid "Sent" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Server response could not be verified" -msgstr "" - -#: www/views/preferencesAbout.html -msgid "Session log" -msgstr "" - -#: www/views/includes/password.html +#: www/views/includes/password.html:31 msgid "SET" msgstr "" -#: www/views/preferencesBwsUrl.html -msgid "Set default url" +#: www/views/addressbook.add.html:58 +#: www/views/includes/note.html:9 +#: www/views/preferencesAlias.html:21 +#: www/views/preferencesBwsUrl.html:18 +#: www/views/preferencesNotifications.html:42 +msgid "Save" msgstr "" -#: www/views/export.html +#: www/views/tab-scan.html:3 +#: www/views/tabs.html:11 +msgid "Scan" +msgstr "" + +#: www/views/tab-scan.html:15 +msgid "Scan QR Codes" +msgstr "" + +#: src/js/controllers/addresses.js:119 +msgid "Scan addresses for funds" +msgstr "" + +#: www/views/walletDetails.html:39 +msgid "Scan status finished with error" +msgstr "" + +#: src/js/services/fingerprintService.js:56 +msgid "Scan your fingerprint please" +msgstr "" + +#: src/js/services/onGoingProcess.js:29 +msgid "Scanning Wallet funds..." +msgstr "" + +#: www/views/includes/backupWarningPopup.html:2 +#: www/views/includes/screenshotWarningModal.html:7 +msgid "Screenshots are not secure" +msgstr "" + +#: www/views/modals/search.html:6 +msgid "Search Transactions" +msgstr "" + +#: www/views/tab-send.html:26 +msgid "Search or enter bitcoin address" +msgstr "" + +#: www/views/modals/search.html:16 +msgid "Search transactions" +msgstr "" + +#: www/views/preferences.html:37 +msgid "Security" +msgstr "" + +#: www/views/tab-import-file.html:7 +msgid "Select a backup file" +msgstr "" + +#: www/views/paymentUri.html:30 +msgid "Select a wallet" +msgstr "" + +#: www/views/modals/paypro.html:38 +msgid "Self-signed Certificate" +msgstr "" + +#: src/js/services/onGoingProcess.js:42 +msgid "Selling Bitcoin..." +msgstr "" + +#: www/views/feedback/send.html:13 +#: www/views/feedback/send.html:43 +#: www/views/tab-send.html:3 +#: www/views/tabs.html:15 +msgid "Send" +msgstr "" + +#: www/views/feedback/send.html:3 +#: www/views/tab-settings.html:36 +msgid "Send Feedback" +msgstr "" + +#: www/views/addressbook.view.html:27 +msgid "Send Money" +msgstr "" + +#: src/js/controllers/addresses.js:124 +msgid "Send addresses by email" +msgstr "" + +#: www/views/includes/confirm-tx.html:3 +msgid "Send bitcoin" +msgstr "" + +#: www/views/preferencesLogs.html:15 +#: www/views/tab-export-file.html:80 +msgid "Send by email" +msgstr "" + +#: src/js/controllers/confirm.js:248 +msgid "Send from" +msgstr "" + +#: src/js/controllers/amount.js:97 +msgid "Send max amount" +msgstr "" + +#: www/views/feedback/rateApp.html:17 +msgid "Send us feedback instead" +msgstr "" + +#: www/views/confirm.html:15 +#: www/views/includes/txp.html:14 +#: www/views/modals/txp-details.html:19 +#: www/views/walletDetails.html:241 +msgid "Sending" +msgstr "" + +#: src/js/services/onGoingProcess.js:40 +msgid "Sending 2FA code..." +msgstr "" + +#: src/js/services/onGoingProcess.js:36 +msgid "Sending feedback..." +msgstr "" + +#: www/views/confirm.html:16 +msgid "Sending maximum amount" +msgstr "" + +#: src/js/services/onGoingProcess.js:30 +msgid "Sending transaction" +msgstr "" + +#: src/js/controllers/confirm.js:506 +msgid "Sending {{amountStr}} from your {{name}} wallet" +msgstr "" + +#: www/views/modals/search.html:60 +#: www/views/modals/tx-status.html:9 +#: www/views/walletDetails.html:229 +msgid "Sent" +msgstr "" + +#: src/js/controllers/tx-details.js:22 +msgid "Sent Funds" +msgstr "" + +#: src/js/services/bwcError.js:38 +msgid "Server response could not be verified" +msgstr "" + +#: www/views/preferencesLogs.html:3 +msgid "Session Log" +msgstr "" + +#: www/views/preferencesAbout.html:40 +msgid "Session log" +msgstr "" + +#: www/views/tab-export-file.html:10 msgid "Set up a password" msgstr "" -#: www/views/includes/password.html +#: www/views/includes/password.html:4 msgid "Set up a spending password" msgstr "" -#: www/views/preferencesEmail.html -msgid "Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more." -msgstr "" - -#: www/views/includes/sidebar.html +#: www/views/tab-settings.html:3 +#: www/views/tabs.html:19 msgid "Settings" msgstr "" -#: www/views/modals/customized-amount.html -#: www/views/walletHome.html -msgid "Share address" +#: www/views/customAmount.html:20 +#: www/views/tab-receive.html:70 +#: www/views/tab-settings.html:43 +msgid "Share" msgstr "" -#: www/views/copayers.html +#: www/views/feedback/complete.html:5 +msgid "Share BitPay" +msgstr "" + +#: www/views/copayers.html:36 msgid "Share invitation" msgstr "" -#: www/views/copayers.html +#: www/views/feedback/complete.html:13 +#: www/views/feedback/complete.html:22 +msgid "Share the love by inviting your friends." +msgstr "" + +#: www/views/copayers.html:17 msgid "Share this invitation with your copayers" msgstr "" -#: www/views/walletHome.html -msgid "Share this wallet address to receive payments" -msgstr "" - -#: www/views/walletHome.html -msgid "Share this wallet address to receive payments. To protect your privacy, new addresses are generated automatically once you use them." -msgstr "" - -#: www/views/create.html -#: www/views/import.html +#: www/views/tab-import-hardware.html:24 msgid "Shared Wallet" msgstr "" -#: www/views/create.html -#: www/views/export.html -#: www/views/import.html -#: www/views/join.html +#: www/views/join.html:47 +#: www/views/tab-create-personal.html:24 +#: www/views/tab-create-shared.html:54 +#: www/views/tab-export-file.html:22 +#: www/views/tab-import-file.html:27 +#: www/views/tab-import-hardware.html:30 +#: www/views/tab-import-phrase.html:30 msgid "Show advanced options" msgstr "" -#: src/js/services/bwcError.js +#: www/views/tab-send.html:17 +msgid "Show bitcoin address" +msgstr "" + +#: www/views/tab-send.html:52 +msgid "Show more" +msgstr "" + +#: src/js/services/bwcError.js:104 msgid "Signatures rejected by server" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:31 msgid "Signing transaction" msgstr "" -#: www/views/create.html +#: www/views/onboarding/backupRequest.html:6 +msgid "Since only you control your money, you’ll need to save your backup phrase in case this app is deleted." +msgstr "" + +#: www/views/tab-create-personal.html:94 +#: www/views/tab-create-shared.html:124 msgid "Single Address Wallet" msgstr "" -#: www/views/translators.html +#: www/views/onboarding/collectEmail.html:40 +msgid "Skip" +msgstr "" + +#: www/views/translators.html:15 msgid "Spanish" msgstr "" -#: src/js/controllers/create.js -#: src/js/controllers/join.js +#: src/js/controllers/create.js:73 +#: src/js/controllers/join.js:56 msgid "Specify Recovery Phrase..." msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:92 msgid "Spend proposal is not accepted" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:95 msgid "Spend proposal not found" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:137 msgid "Spending Password needed" msgstr "" -#: src/js/controllers/index.js -msgid "Spending Passwords do not match" +#: www/views/tab-send.html:11 +msgid "Start sending bitcoin" msgstr "" -#: src/js/controllers/copayers.js -#: src/js/controllers/export.js -#: src/js/controllers/import.js -#: src/js/controllers/preferencesDelete.js -msgid "Success" +#: src/js/routes.js:112 +msgid "Starting..." msgstr "" -#: src/js/services/feeService.js +#: src/js/services/feeService.js:11 msgid "Super Economy" msgstr "" -#: www/views/preferencesAdvanced.html +#: www/views/paperWallet.html:7 +msgid "Sweep" +msgstr "" + +#: www/views/paperWallet.html:3 msgid "Sweep paper wallet" msgstr "" -#: www/views/paperWallet.html -msgid "Sweep Wallet" -msgstr "" - -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:32 msgid "Sweeping Wallet..." msgstr "" -#: www/views/walletHome.html +#: www/views/preferencesDeleteWallet.html:14 +msgid "THIS ACTION CANNOT BE REVERSED" +msgstr "" + +#: www/views/onboarding/welcome.html:6 +msgid "Take control of your money,
get started with bitcoin." +msgstr "" + +#: www/views/walletDetails.html:128 +#: www/views/walletDetails.html:70 msgid "Tap and hold to show" msgstr "" -#: www/views/walletHome.html +#: www/views/walletDetails.html:109 +#: www/views/walletDetails.html:30 +#: www/views/walletDetails.html:40 msgid "Tap to retry" msgstr "" -#: www/views/disclaimer.html -#: www/views/preferencesAbout.html +#: www/views/termsOfUse.html:3 +msgid "Terms Of Use" +msgstr "" + +#: www/views/modals/terms.html:3 +#: www/views/onboarding/disclaimer.html:29 +#: www/views/onboarding/disclaimer.html:44 +#: www/views/preferencesAbout.html:30 msgid "Terms of Use" msgstr "" -#: www/views/includes/terms.html -msgid "The authors of the software, employees and affiliates of Bitpay, copyright holders, and BitPay, Inc. cannot retrieve your private keys or passwords if you lose or forget them and cannot guarantee transaction confirmation as they do not have control over the Bitcoin network." +#: www/views/tab-create-personal.html:90 +msgid "Testnet" msgstr "" -#: www/views/import.html -msgid "The derivation path" +#: src/js/controllers/feedback/send.js:27 +#: src/js/controllers/feedback/send.js:70 +#: www/views/feedback/complete.html:16 +#: www/views/feedback/rateApp.html:4 +msgid "Thank you!" msgstr "" -#: src/js/services/ledger.js +#: src/js/controllers/feedback/send.js:66 +msgid "Thanks!" +msgstr "" + +#: src/js/controllers/feedback/send.js:67 +msgid "That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?" +msgstr "" + +#: src/js/services/ledger.js:139 msgid "The Ledger Chrome application is not installed" msgstr "" -#: www/views/import.html +#: www/views/tab-import-phrase.html:5 +msgid "The derivation path" +msgstr "" + +#: www/views/onboarding/tour.html:32 +msgid "The exchange rate changes with the market." +msgstr "" + +#: www/views/preferencesFee.html:12 +msgid "The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy." +msgstr "" + +#: www/views/addresses.html:42 +msgid "The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab." +msgstr "" + +#: src/js/controllers/onboarding/terms.js:21 +msgid "The official English Terms of Service are available on the BitPay website. Would you like to view them?" +msgstr "" + +#: www/views/tab-import-phrase.html:4 msgid "The password of the recovery phrase (if set)" msgstr "" -#: src/js/controllers/walletHome.js +#: src/js/services/walletService.js:952 msgid "The payment was created but could not be completed. Please try again from home screen" msgstr "" -#: www/views/modals/txp-details.html +#: www/views/modals/txp-details.html:26 msgid "The payment was removed by creator" msgstr "" -#: www/views/create.html -#: www/views/join.html +#: www/views/join.html:101 +#: www/views/tab-create-personal.html:69 +#: www/views/tab-create-shared.html:99 +#: www/views/tab-import-phrase.html:38 msgid "The recovery phrase could require a password to be imported" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:56 msgid "The request could not be understood by the server" msgstr "" -#: www/views/includes/terms.html -msgid "The software does not constitute an account where BitPay or other third parties serve as financial intermediaries or custodians of your bitcoin." +#: www/views/addresses.html:43 +msgid "The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated." msgstr "" -#: www/views/includes/terms.html -msgid "The software you are about to use functions as a free, open source, and multi-signature digital wallet." -msgstr "" - -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:98 msgid "The spend proposal is not pending" msgstr "" -#: src/js/controllers/copayers.js -#: src/js/controllers/preferencesDelete.js -msgid "The wallet \"{{walletName}}\" was deleted" +#: www/views/preferencesHistory.html:26 +msgid "The transaction history and every new incoming transaction are cached in the app. This feature clean this up and synchronizes again from the server" msgstr "" -#: www/views/import.html -msgid "The Wallet Recovery Phrase could require a password to be imported" -msgstr "" - -#: www/views/import.html +#: www/views/tab-import-phrase.html:6 msgid "The wallet service URL" msgstr "" -#: www/views/paymentUri.html +#: www/views/paymentUri.html:23 msgid "There are no wallets to make this payment" msgstr "" -#: src/js/controllers/index.js -msgid "There is a new version of Copay. Please update" -msgstr "" - -#: src/js/controllers/import.js +#: src/js/controllers/import.js:192 +#: src/js/controllers/import.js:216 +#: src/js/controllers/import.js:283 msgid "There is an error in the form" msgstr "" -#: www/views/backup.html +#: src/js/controllers/feedback/send.js:55 +#: src/js/controllers/feedback/send.js:59 +msgid "There's obviously something we're doing wrong." +msgstr "" + +#: www/views/advancedSettings.html:42 +msgid "These features aren't quite ready for primetime. They may change, stop working, or disappear at any time." +msgstr "" + +#: www/views/advancedSettings.html:57 +msgid "These features make it easier to test complex functionality on all devices. They may be unstable." +msgstr "" + +#: www/views/advancedSettings.html:73 +msgid "These utilities may be unstable. Proceed at your own risk." +msgstr "" + +#: src/js/controllers/feedback/rateCard.js:37 +msgid "This app is fantastic!" +msgstr "" + +#: www/views/onboarding/tour.html:42 +msgid "This app stores your bitcoin with cutting-edge security." +msgstr "" + +#: src/js/controllers/confirm.js:439 +msgid "This bitcoin payment request has expired." +msgstr "" + +#: www/views/join.html:108 +#: www/views/tab-create-personal.html:75 +#: www/views/tab-create-shared.html:105 +msgid "This password cannot be recovered. If the password is lost, there is no way you could recover your funds." +msgstr "" + +#: www/views/backup.html:24 msgid "This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed." msgstr "" -#: www/views/modals/tx-details.html -msgid "This transaction has become invalid; possibly due to a double spend attempt." -msgstr "" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:113 +#: www/views/walletDetails.html:34 msgid "This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information." msgstr "" -#: www/views/modals/txp-details.html -msgid "Time" +#: www/views/modals/txp-details.html:131 +#: www/views/tx-details.html:91 +msgid "Timeline" msgstr "" -#: www/views/includes/output.html -#: www/views/modals/tx-details.html -#: www/views/modals/txp-details.html -#: www/views/walletHome.html +#: www/views/confirm.html:33 +#: www/views/confirm.html:61 +#: www/views/includes/output.html:2 +#: www/views/modals/txp-details.html:104 +#: www/views/modals/txp-details.html:53 +#: www/views/tx-details.html:37 +#: www/views/tx-details.html:49 msgid "To" msgstr "" -#: www/views/backup.html -msgid "To restore this {{index.m}}-{{index.n}} shared wallet you will need" +#: www/views/tab-send.html:12 +msgid "To get started, buy bitcoin or share your address. You can receive bitcoin from any wallet or service." msgstr "" -#: www/views/includes/terms.html -msgid "To the fullest extent permitted by law, this software is provided “as is” and no representations or warranties can be made of any kind, express or implied, including but not limited to the warranties of merchantability, fitness or a particular purpose and noninfringement." +#: www/views/tab-send.html:13 +msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin." msgstr "" -#: www/views/walletHome.html -msgid "too long!" -msgstr "" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:171 msgid "Total Locked Balance" msgstr "" -#: www/views/create.html +#: www/views/tab-create-shared.html:33 msgid "Total number of copayers" msgstr "" -#: src/js/services/fingerprintService.js +#: src/js/services/fingerprintService.js:63 +#: src/js/services/fingerprintService.js:68 msgid "Touch ID Failed" msgstr "" -#: www/views/modals/tx-details.html +#: src/js/controllers/tx-details.js:6 msgid "Transaction" msgstr "" -#: src/js/services/bwcError.js -msgid "Transaction already broadcasted" -msgstr "" - -#: www/views/preferencesAdvanced.html +#: www/views/preferencesAdvanced.html:24 +#: www/views/preferencesHistory.html:3 msgid "Transaction History" msgstr "" -#: www/views/translators.html +#: src/js/services/bwcError.js:83 +msgid "Transaction already broadcasted" +msgstr "" + +#: src/js/controllers/activity.js:45 +#: src/js/controllers/tab-home.js:160 +#: src/js/controllers/tx-details.js:18 +msgid "Transaction not found" +msgstr "" + +#: www/views/tab-send.html:61 +msgid "Transfer to Wallet" +msgstr "" + +#: www/views/translators.html:9 msgid "Translation Credits" msgstr "" -#: www/views/preferencesAbout.html +#: www/views/preferencesAbout.html:35 +#: www/views/translators.html:3 msgid "Translators" msgstr "" -#: www/views/backup.html -msgid "Try again" +#: www/views/bitpayCardIntro.html:18 +msgid "Turn bitcoin into dollars, swipe anywhere Visa® is accepted." msgstr "" -#: www/views/import.html +#: www/views/tab-import-phrase.html:17 msgid "Type the Recovery Phrase (usually 12 words)" msgstr "" -#: www/views/modals/search.html -#: www/views/modals/tx-details.html -#: www/views/walletHome.html +#: src/js/controllers/backup.js:75 +msgid "Uh oh..." +msgstr "" + +#: www/views/modals/search.html:36 +#: www/views/tx-details.html:79 msgid "Unconfirmed" msgstr "" -#: www/views/preferencesGlobal.html +#: www/views/preferencesUnit.html:4 msgid "Unit" msgstr "" -#: www/views/walletHome.html +#: www/views/walletDetails.html:165 msgid "Unsent transactions" msgstr "" -#: www/views/walletHome.html +#: www/views/addresses.html:35 +msgid "Unused Addresses" +msgstr "" + +#: www/views/addresses.html:41 +msgid "Unused Addresses Limit" +msgstr "" + +#: src/js/controllers/tab-home.js:132 +msgid "Update Available" +msgstr "" + +#: www/views/proposals.html:15 +msgid "Updating pending proposals. Please stand by" +msgstr "" + +#: www/views/walletDetails.html:189 msgid "Updating transaction history. Please stand by." msgstr "" -#: www/views/walletHome.html -msgid "Updating Wallet..." +#: www/views/activity.html:14 +msgid "Updating... Please stand by" msgstr "" -#: www/views/preferencesGlobal.html +#: www/views/advancedSettings.html:34 msgid "Use Unconfirmed Funds" msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:34 msgid "Validating recovery phrase..." msgstr "" -#: src/js/services/onGoingProcess.js +#: src/js/services/onGoingProcess.js:33 msgid "Validating wallet integrity..." msgstr "" -#: www/views/preferencesAbout.html +#: www/views/preferencesAbout.html:14 msgid "Version" msgstr "" -#: www/views/export.html +#: www/views/tab-export-file.html:67 msgid "View" msgstr "" -#: www/views/copayers.html -msgid "Waiting for copayers" +#: www/views/addresses.html:66 +msgid "View All Addresses" msgstr "" -#: src/js/services/onGoingProcess.js -msgid "Waiting for Ledger..." +#: src/js/controllers/onboarding/terms.js:20 +msgid "View Terms of Service" msgstr "" -#: src/js/services/onGoingProcess.js -msgid "Waiting for Trezor..." +#: src/js/controllers/tx-details.js:125 +msgid "View Transaction on Insight" msgstr "" -#: www/views/copayers.html -msgid "Waiting..." +#: src/js/controllers/tab-home.js:134 +msgid "View Update" msgstr "" -#: src/js/services/bwcError.js -msgid "Wallet already exists" +#: www/views/tx-details.html:117 +msgid "View on blockchain" msgstr "" -#: src/js/services/profileService.js -msgid "Wallet already in Copay" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Wallet Configuration (m-n)" -msgstr "" - -#: www/views/export.html -msgid "Wallet Export" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Wallet Id" -msgstr "" - -#: www/views/copayers.html -msgid "Wallet incomplete and broken" -msgstr "" - -#: www/views/preferencesAdvanced.html -#: www/views/preferencesInformation.html -msgid "Wallet Information" -msgstr "" - -#: www/views/join.html -msgid "Wallet Invitation" -msgstr "" - -#: www/views/join.html -msgid "Wallet Invitation is not valid!" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet is full" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet is locked" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet is not complete" -msgstr "" - -#: www/views/create.html -msgid "Wallet name" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Wallet Name (at creation)" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet needs backup" -msgstr "" - -#: www/views/preferencesInformation.html -msgid "Wallet Network" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet not found" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" -msgstr "" - -#: src/js/controllers/index.js -msgid "Wallet Preferences" -msgstr "" - -#: www/views/create.html -#: www/views/import.html -#: www/views/join.html -msgid "Wallet Recovery Phrase" -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet Recovery Phrase is invalid" -msgstr "" - -#: www/views/backup.html -#: www/views/preferencesDeleteWords.html -msgid "Wallet recovery phrase not available. You can still export it from Advanced > Export." -msgstr "" - -#: src/js/services/bwcError.js -msgid "Wallet service not found" -msgstr "" - -#: www/views/walletHome.html +#: www/views/walletDetails.html:153 msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet." msgstr "" -#: www/views/export.html +#: www/views/tab-export-file.html:43 msgid "WARNING: Not including the private key allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." msgstr "" -#: www/views/create.html -#: www/views/join.html -msgid "WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password." -msgstr "" - -#: www/views/export.html +#: www/views/tab-export-file.html:34 msgid "WARNING: The private key of this wallet is not available. The export allows to check the wallet balance, transaction history, and create spend proposals from the export. However, does not allow to approve (sign) proposals, so funds will not be accessible from the export." msgstr "" -#: www/views/modals/txp-details.html -msgid "Warning: this transaction has unconfirmed inputs" -msgstr "" - -#: www/views/modals/paypro.html +#: www/views/modals/paypro.html:42 msgid "WARNING: UNTRUSTED CERTIFICATE" msgstr "" -#: www/views/walletHome.html -msgid "WARNING: Wallet not registered" +#: src/js/services/onGoingProcess.js:14 +msgid "Waiting for Ledger..." msgstr "" -#: www/views/preferencesDeleteWallet.html -#: www/views/preferencesDeleteWords.html +#: src/js/services/onGoingProcess.js:15 +msgid "Waiting for Trezor..." +msgstr "" + +#: www/views/copayers.html:48 +msgid "Waiting for copayers" +msgstr "" + +#: www/views/copayers.html:53 +msgid "Waiting..." +msgstr "" + +#: www/views/addresses.html:3 +msgid "Wallet Addresses" +msgstr "" + +#: www/views/preferencesColor.html:4 +msgid "Wallet Color" +msgstr "" + +#: www/views/preferencesInformation.html:23 +msgid "Wallet Configuration (m-n)" +msgstr "" + +#: www/views/onboarding/collectEmail.html:5 +msgid "Wallet Created" +msgstr "" + +#: www/views/preferencesInformation.html:17 +msgid "Wallet Id" +msgstr "" + +#: www/views/preferencesAdvanced.html:12 +#: www/views/preferencesInformation.html:3 +msgid "Wallet Information" +msgstr "" + +#: www/views/join.html:26 +msgid "Wallet Invitation" +msgstr "" + +#: www/views/join.html:59 +#: www/views/tab-create-personal.html:35 +#: www/views/tab-create-shared.html:65 +msgid "Wallet Key" +msgstr "" + +#: www/views/preferencesAlias.html:4 +msgid "Wallet Name" +msgstr "" + +#: www/views/preferencesInformation.html:11 +msgid "Wallet Name (at creation)" +msgstr "" + +#: www/views/preferencesInformation.html:29 +msgid "Wallet Network" +msgstr "" + +#: www/views/advancedSettings.html:31 +msgid "Wallet Operation" +msgstr "" + +#: www/views/join.html:76 +#: www/views/tab-create-personal.html:47 +#: www/views/tab-create-shared.html:77 +msgid "Wallet Recovery Phrase" +msgstr "" + +#: src/js/services/bwcError.js:26 +msgid "Wallet Recovery Phrase is invalid" +msgstr "" + +#: www/views/preferencesAdvanced.html:20 +msgid "Wallet Service URL" +msgstr "" + +#: www/views/preferences.html:4 +msgid "Wallet Settings" +msgstr "" + +#: www/views/tab-import-hardware.html:11 +msgid "Wallet Type" +msgstr "" + +#: src/js/services/bwcError.js:59 +msgid "Wallet already exists" +msgstr "" + +#: src/js/services/profileService.js:529 +msgid "Wallet already in Copay" +msgstr "" + +#: www/views/includes/walletActivity.html:6 +msgid "Wallet created" +msgstr "" + +#: www/views/copayers.html:58 +msgid "Wallet incomplete and broken" +msgstr "" + +#: src/js/services/bwcError.js:65 +msgid "Wallet is full" +msgstr "" + +#: src/js/services/bwcError.js:125 +msgid "Wallet is locked" +msgstr "" + +#: src/js/services/bwcError.js:128 +msgid "Wallet is not complete" +msgstr "" + +#: www/views/tab-create-personal.html:12 +#: www/views/tab-create-shared.html:12 +msgid "Wallet name" +msgstr "" + +#: src/js/services/bwcError.js:131 +msgid "Wallet needs backup" +msgstr "" + +#: www/views/tab-receive.html:56 +#: www/views/walletDetails.html:145 +msgid "Wallet not backed up" +msgstr "" + +#: src/js/services/bwcError.js:68 +msgid "Wallet not found" +msgstr "" + +#: src/js/controllers/tab-home.js:205 +msgid "Wallet not registered" +msgstr "" + +#: src/js/services/bwcError.js:29 +msgid "Wallet not registered at the wallet service. Recreate it from \"Create Wallet\" using \"Advanced Options\" to set your recovery phrase" +msgstr "" + +#: www/views/backup.html:11 +msgid "Wallet recovery phrase not available." +msgstr "" + +#: src/js/services/bwcError.js:50 +msgid "Wallet service not found" +msgstr "" + +#: www/views/tab-home.html:58 +msgid "Wallets" +msgstr "" + +#: www/views/tab-settings.html:99 +msgid "Wallets & Integrations" +msgstr "" + +#: src/js/controllers/modals/txpDetails.js:126 +#: src/js/controllers/modals/txpDetails.js:143 +#: src/js/controllers/preferencesDelete.js:10 +#: www/views/preferencesDeleteWallet.html:9 msgid "Warning!" msgstr "" -#: www/views/includes/terms.html -msgid "We reserve the right to modify this disclaimer from time to time." +#: www/views/modals/txp-details.html:47 +msgid "Warning: this transaction has unconfirmed inputs" msgstr "" -#: www/views/disclaimer.html -msgid "WELCOME TO COPAY" +#: src/js/controllers/feedback/send.js:63 +msgid "We'd love to do better." msgstr "" -#: www/views/includes/terms.html -msgid "While the software has undergone beta testing and continues to be improved by feedback from the open-source user and developer community, we cannot guarantee that there will be no bugs in the software." +#: www/views/backup.html:28 +msgid "We'll confirm on the next screen." msgstr "" -#: www/views/backup.html -msgid "Write your wallet recovery phrase" +#: src/js/controllers/feedback/send.js:71 +msgid "We're always looking for ways to improve BitPay." msgstr "" -#: src/js/controllers/import.js +#: src/js/controllers/feedback/send.js:75 +msgid "We're always looking for ways to improve BitPay. How could we improve your experience?" +msgstr "" + +#: www/views/preferencesLanguage.html:16 +#: www/views/translators.html:23 +msgid "We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin." +msgstr "" + +#: www/views/preferencesAlias.html:11 +msgid "What do you call this wallet?" +msgstr "" + +#: www/views/preferencesAlias.html:12 +msgid "When this wallet was created, it was called “{{walletName}}”. You can change the name displayed on this device below." +msgstr "" + +#: www/views/onboarding/collectEmail.html:10 +msgid "Where would you like to receive email notifications about payments?" +msgstr "" + +#: www/views/addresses.html:23 +msgid "Why?" +msgstr "" + +#: www/views/includes/backupLaterPopup.html:2 +msgid "Without a backup, you could lose money" +msgstr "" + +#: src/js/controllers/onboarding/backupRequest.js:10 +msgid "Without a backup, you could lose money." +msgstr "" + +#: www/views/feedback/rateApp.html:10 +msgid "Would you be willing to rate BitPay in the app store?" +msgstr "" + +#: src/js/controllers/bitpayCardIntro.js:31 +msgid "Would you like to add this account ({{email}}) to your wallet?" +msgstr "" + +#: www/views/onboarding/notifications.html:4 +msgid "Would you like to receive push notifications about payments?" +msgstr "" + +#: src/js/controllers/tx-details.js:126 +msgid "Would you like to view this transaction on the Insight blockchain explorer?" +msgstr "" + +#: src/js/controllers/import.js:248 msgid "Wrong number of recovery words:" msgstr "" -#: src/js/services/bwcError.js +#: src/js/services/bwcError.js:140 msgid "Wrong spending password" msgstr "" -#: www/views/modals/confirmation.html +#: www/views/modals/confirmation.html:7 +#: www/views/onboarding/collectEmail.html:32 msgid "Yes" msgstr "" -#: www/views/includes/terms.html -msgid "You acknowledge that your use of this software is at your own discretion and in compliance with all applicable laws." +#: src/js/controllers/onboarding/backupRequest.js:18 +msgid "Yes, skip backup" msgstr "" -#: www/views/includes/terms.html -msgid "You are responsible for safekeeping your passwords, private key pairs, PINs and any other codes you use to access the software." +#: src/js/controllers/onboarding/backupRequest.js:17 +msgid "You can create a backup later from your wallet settings." msgstr "" -#: www/views/includes/terms.html -msgid "You assume any and all risks associated with the use of the software." +#: src/js/controllers/preferencesLanguage.js:12 +#: src/js/controllers/translators.js:9 +msgid "You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!" msgstr "" -#: www/views/backup.html -msgid "You backed up your wallet. You can now restore this wallet at any time." +#: www/views/tab-scan.html:16 +msgid "You can scan bitcoin addresses, payment requests, paper wallets, and more." msgstr "" -#: www/views/backup.html -msgid "You can safely install your wallet on another device and use it from multiple devices at the same time." +#: src/js/controllers/preferencesAbout.js:13 +msgid "You can see the latest developments and contribute to this open source app by visiting our project on GitHub." msgstr "" -#: www/views/walletHome.html -msgid "You do not have any wallet" +#: www/views/onboarding/tour.html:14 +msgid "You can spend bitcoin at millions of websites and stores worldwide." msgstr "" -#: www/views/backup.html -msgid "You need the wallet recovery phrase to restore this personal wallet. Write it down and keep them somewhere safe." +#: www/views/backup.html:12 +msgid "You can still export it from Advanced > Export." msgstr "" -#: www/views/create.html -#: www/views/join.html +#: www/views/onboarding/tour.html:27 +msgid "You can trade it for other currencies like US Dollars, Euros, or Pounds." +msgstr "" + +#: www/views/onboarding/tour.html:41 +msgid "You control your bitcoin." +msgstr "" + +#: www/views/addressbook.html:20 +msgid "You haven’t added any contacts to your address book yet. Get started by adding your first one." +msgstr "" + +#: www/views/preferencesNotifications.html:30 +msgid "You'll receive email notifications about payments sent and received from your wallets." +msgstr "" + +#: www/views/includes/confirmBackupPopup.html:6 +msgid "Your bitcoin wallet is backed up!" +msgstr "" + +#: www/views/tab-home.html:26 +msgid "Your bitcoin wallet is ready!" +msgstr "" + +#: www/views/feedback/send.html:42 +msgid "Your ideas, feedback, or comments" +msgstr "" + +#: www/views/tab-create-shared.html:22 +msgid "Your name" +msgstr "" + +#: www/views/join.html:16 msgid "Your nickname" msgstr "" -#: www/views/export.html -#: www/views/import.html +#: www/views/tab-export-file.html:11 +#: www/views/tab-import-file.html:20 msgid "Your password" msgstr "" -#: www/views/includes/password.html +#: www/views/includes/password.html:12 msgid "Your spending password" msgstr "" -#: src/js/controllers/import.js -msgid "Your wallet has been imported correctly" +#: www/views/onboarding/backupRequest.html:10 +msgid "Your wallet is never saved to cloud storage or standard device backups." msgstr "" -#: www/views/includes/password.html +#: www/views/includes/password.html:39 msgid "Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down" msgstr "" -#: www/views/backup.html -msgid "Your wallet recovery phrase and access to the server that coordinated the initial wallet creation. You still need {{index.m}} keys to spend." +#: www/views/includes/walletSelector.html:23 +#: www/views/includes/wallets.html:13 +#: www/views/tab-home.html:84 +#: www/views/walletDetails.html:127 +#: www/views/walletDetails.html:69 +msgid "[Balance Hidden]" +msgstr "" + +#: www/views/tab-receive.html:48 +msgid "address not yet available" +msgstr "" + +#: www/views/includes/backupWarningPopup.html:3 +msgid "if you take a screenshot, your backup may be viewed by others apps. You can make a safe backup with paper and a pen." +msgstr "" + +#: www/views/includes/available-balance.html:8 +msgid "locked by pending payments" +msgstr "" + +#: src/js/services/profileService.js:417 +msgid "me" +msgstr "" + +#: www/views/addressbook.add.html:32 +msgid "name@example.com" +msgstr "" + +#: www/views/preferencesHistory.html:14 +msgid "preparing..." +msgstr "" + +#: www/views/includes/confirm-tx.html:23 +msgid "{{feeRateStr}} of the transaction" +msgstr "" + +#: src/js/controllers/confirm.js:186 +msgid "{{fee}} will be deducted for bitcoin networking fees." +msgstr "" + +#: www/views/walletDetails.html:192 +msgid "{{updatingTxHistoryProgress}} transactions downloaded" +msgstr "" + +#: www/views/copayers.html:46 +#: www/views/includes/walletInfo.html:2 +msgid "{{wallet.m}}-of-{{wallet.n}}" msgstr "" diff --git a/src/js/controllers/activity.js b/src/js/controllers/activity.js index 29721ca3b..9ea9a31e9 100644 --- a/src/js/controllers/activity.js +++ b/src/js/controllers/activity.js @@ -26,7 +26,10 @@ angular.module('copayApp.controllers').controller('activityController', $scope.openNotificationModal = function(n) { if (n.txid) { - openTxModal(n); + $state.transitionTo('tabs.wallet.tx-details', { + txid: n.txid, + walletId: n.walletId + }); } else { var txp = lodash.find($scope.txps, { id: n.txpId @@ -46,35 +49,4 @@ angular.module('copayApp.controllers').controller('activityController', } } }; - - var openTxModal = function(n) { - var wallet = profileService.getWallet(n.walletId); - - ongoingProcess.set('loadingTxInfo', true); - walletService.getTx(wallet, n.txid, function(err, tx) { - ongoingProcess.set('loadingTxInfo', false); - - if (err) { - $log.error(err); - return popupService.showAlert(gettextCatalog.getString('Error'), err); - } - - if (!tx) { - $log.warn('No tx found'); - return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Transaction not found')); - } - - $scope.wallet = wallet; - $scope.btx = lodash.cloneDeep(tx); - $state.transitionTo('tabs.wallet.tx-details', { - txid: $scope.btx.txid, - walletId: $scope.walletId - }); - - walletService.getTxNote(wallet, n.txid, function(err, note) { - if (err) $log.warn('Could not fetch transaction note: ' + err); - $scope.btx.note = note; - }); - }); - }; }); diff --git a/src/js/controllers/addressbook.js b/src/js/controllers/addressbook.js index 00931bc83..b86bbcc54 100644 --- a/src/js/controllers/addressbook.js +++ b/src/js/controllers/addressbook.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressbookListController', function($scope, $log, $timeout, addressbookService, lodash, popupService) { +angular.module('copayApp.controllers').controller('addressbookListController', function($scope, $log, $timeout, addressbookService, lodash, popupService, gettextCatalog) { var contacts; diff --git a/src/js/controllers/addressbookAdd.js b/src/js/controllers/addressbookAdd.js index a1bc7fd7a..15c5ae9e8 100644 --- a/src/js/controllers/addressbookAdd.js +++ b/src/js/controllers/addressbookAdd.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, addressbookService, popupService) { +angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService) { $scope.fromSendTab = $stateParams.fromSendTab; diff --git a/src/js/controllers/addresses.js b/src/js/controllers/addresses.js new file mode 100644 index 000000000..90cf0bb5e --- /dev/null +++ b/src/js/controllers/addresses.js @@ -0,0 +1,199 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('addressesController', function($scope, $stateParams, $state, $timeout, $ionicHistory, $ionicPopover, $ionicScrollDelegate, configService, popupService, gettextCatalog, ongoingProcess, lodash, profileService, walletService, platformInfo) { + var UNUSED_ADDRESS_LIMIT = 5; + var BALANCE_ADDRESS_LIMIT = 5; + var MENU_ITEM_HEIGHT = 55; + var config; + var unitName; + var unitToSatoshi; + var satToUnit; + var unitDecimals; + var withBalance; + $scope.showInfo = false; + $scope.showMore = false; + $scope.allAddressesView = false; + $scope.isCordova = platformInfo.isCordova; + $scope.wallet = profileService.getWallet($stateParams.walletId); + + function init() { + ongoingProcess.set('gettingAddresses', true); + walletService.getMainAddresses($scope.wallet, {}, function(err, addresses) { + if (err) { + ongoingProcess.set('gettingAddresses', false); + return popupService.showAlert(gettextCatalog.getString('Error'), err); + } + + var allAddresses = addresses; + + walletService.getBalance($scope.wallet, {}, function(err, resp) { + ongoingProcess.set('gettingAddresses', false); + if (err) { + return popupService.showAlert(gettextCatalog.getString('Error'), err); + } + + withBalance = resp.byAddress; + var idx = lodash.indexBy(withBalance, 'address'); + $scope.noBalance = lodash.reject(allAddresses, function(x) { + return idx[x.address]; + }); + + processPaths($scope.noBalance); + processPaths(withBalance); + + $scope.latestUnused = lodash.slice($scope.noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.latestWithBalance = lodash.slice(withBalance, 0, BALANCE_ADDRESS_LIMIT); + + lodash.each(withBalance, function(a) { + a.balanceStr = (a.amount * satToUnit).toFixed(unitDecimals) + ' ' + unitName; + }); + + $scope.viewAll = { + value: $scope.noBalance.length > UNUSED_ADDRESS_LIMIT || withBalance.length > BALANCE_ADDRESS_LIMIT + }; + $scope.allAddresses = $scope.noBalance.concat(withBalance); + $scope.$digest(); + }); + }); + }; + + function processPaths(list) { + lodash.each(list, function(n) { + n.path = n.path.replace(/^m/g, 'xpub'); + }); + }; + + $scope.newAddress = function() { + if ($scope.gapReached) return; + + ongoingProcess.set('generatingNewAddress', true); + walletService.getAddress($scope.wallet, true, function(err, addr) { + if (err) { + ongoingProcess.set('generatingNewAddress', false); + $scope.gapReached = true; + $timeout(function() { + $scope.$digest(); + }); + return; + } + + walletService.getMainAddresses($scope.wallet, { + limit: 1 + }, function(err, _addr) { + ongoingProcess.set('generatingNewAddress', false); + if (err) return popupService.showAlert(gettextCatalog.getString('Error'), err); + if (addr != _addr[0].address) return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('New address could not be generated. Please try again.')); + + $scope.noBalance = [_addr[0]].concat($scope.noBalance); + $scope.latestUnused = lodash.slice($scope.noBalance, 0, UNUSED_ADDRESS_LIMIT); + $scope.viewAll = { + value: $scope.noBalance.length > UNUSED_ADDRESS_LIMIT + }; + $scope.$digest(); + }); + }); + }; + + $scope.viewAllAddresses = function() { + $state.go('tabs.receive.allAddresses', { + walletId: $scope.wallet.id + }); + }; + + $scope.showInformation = function() { + $timeout(function() { + $scope.showInfo = !$scope.showInfo; + $ionicScrollDelegate.resize(); + }, 10); + }; + + $scope.readMore = function() { + $timeout(function() { + $scope.showMore = !$scope.showMore; + $ionicScrollDelegate.resize(); + }, 10); + }; + + $scope.showMenu = function(allAddresses, $event) { + var scanObj = { + text: gettextCatalog.getString('Scan addresses for funds'), + action: scan, + }; + + var sendAddressesObj = { + text: gettextCatalog.getString('Send addresses by email'), + action: sendByEmail, + } + + $scope.items = allAddresses ? [sendAddressesObj] : [scanObj]; + $scope.height = $scope.items.length * MENU_ITEM_HEIGHT; + + $ionicPopover.fromTemplateUrl('views/includes/menu-popover.html', { + scope: $scope + }).then(function(popover) { + $scope.menu = popover; + $scope.menu.show($event); + }); + }; + + var scan = function() { + walletService.startScan($scope.wallet); + $scope.menu.hide(); + $ionicHistory.clearHistory(); + $state.go('tabs.home'); + }; + + var sendByEmail = function() { + function formatDate(ts) { + var dateObj = new Date(ts * 1000); + if (!dateObj) { + $log.debug('Error formating a date'); + return 'DateError'; + } + if (!dateObj.toJSON()) { + return ''; + } + return dateObj.toJSON(); + }; + + ongoingProcess.set('sendingByEmail', true); + $timeout(function() { + var body = 'Copay Wallet "' + $scope.walletName + '" Addresses\n Only Main Addresses are shown.\n\n'; + body += "\n"; + body += $scope.allAddresses.map(function(v) { + return ('* ' + v.address + ' ' + 'xpub' + v.path.substring(1) + ' ' + formatDate(v.createdOn)); + }).join("\n"); + ongoingProcess.set('sendingByEmail', false); + + window.plugins.socialsharing.shareViaEmail( + body, + 'Copay Addresses', + null, // TO: must be null or an array + null, // CC: must be null or an array + null, // BCC: must be null or an array + null, // FILES: can be null, a string, or an array + function() {}, + function() {} + ); + + $scope.menu.hide(); + }); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.allAddressesView = data.stateName == 'tabs.receive.allAddresses' ? true : false; + $timeout(function() { + $scope.$apply(); + }); + }); + + $scope.$on("$ionicView.afterEnter", function(event, data) { + config = configService.getSync().wallet.settings; + unitToSatoshi = config.unitToSatoshi; + satToUnit = 1 / unitToSatoshi; + unitName = config.unitName; + unitDecimals = config.unitDecimals; + + if (!$scope.allAddresses || $scope.allAddresses.length < 0) init(); + }); +}); diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 16b556501..4abb4c261 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $timeout, $ionicScrollDelegate) { var updateConfig = function() { @@ -29,6 +29,50 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }; }; + $scope.global = $rootScope; + if (!$scope.global.developmentUtilitiesEnabled) { + $scope.global.developmentUtilitiesEnabled = { + value: false + }; + } + + $scope.toggledDevelopmentUtils = function() { + if ($scope.global.developmentUtilitiesEnabled.value) { + $log.debug('User enabled development utilities.'); + $timeout(function() { + $ionicScrollDelegate.resize(); + }, 10); + } else { + $log.debug('User disabled development utilities.'); + } + } + + $scope.activateFeedbackCard = function() { + $scope.feedbackCardActivating = true; + storageService.getFeedbackInfo(function(error, info) { + var feedbackInfo = JSON.parse(info); + // hardcoding so we can distinguish from normal operation + feedbackInfo.time = 1231006505; // genesis block time + feedbackInfo.version = window.version; + feedbackInfo.sent = false; + storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() { + $log.debug('Activated feedback card with: ' + JSON.stringify(feedbackInfo)); + $ionicHistory.clearCache(); + $timeout(function() { + $scope.feedbackCardActivating = false; + $scope.feedbackCardActivated = true; + $timeout(function() { + $scope.feedbackCardActivated = false; + }, 10000); + }, 500); + }); + }); + } + + $scope.resetActivateFeedbackCard = function() { + $scope.feedbackCardActivated = false; + } + $scope.spendUnconfirmedChange = function() { var opts = { wallet: { diff --git a/src/js/controllers/amazon.js b/src/js/controllers/amazon.js index 6bc4a4108..402f831de 100644 --- a/src/js/controllers/amazon.js +++ b/src/js/controllers/amazon.js @@ -1,12 +1,12 @@ 'use strict'; angular.module('copayApp.controllers').controller('amazonController', - function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, externalLinkService, popupService) { + function($scope, $timeout, $ionicModal, $log, lodash, amazonService, platformInfo, externalLinkService, popupService, gettextCatalog) { $scope.network = amazonService.getEnvironment(); - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { - externalLinkService.open(url, optIn, title, message, okText, cancelText); + $scope.openExternalLink = function(url) { + externalLinkService.open(url); }; var initAmazon = function() { @@ -19,6 +19,16 @@ angular.module('copayApp.controllers').controller('amazonController', $timeout(function() { $scope.$digest(); }); + if ($scope.cardClaimCode) { + var card = lodash.find($scope.giftCards, { + claimCode: $scope.cardClaimCode + }); + if (lodash.isEmpty(card)) { + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Card not found')); + return; + } + $scope.openCardModal(card); + } }); $scope.updatePendingGiftCards(); }; @@ -26,12 +36,16 @@ angular.module('copayApp.controllers').controller('amazonController', $scope.updatePendingGiftCards = lodash.debounce(function() { amazonService.getPendingGiftCards(function(err, gcds) { + $timeout(function() { + $scope.giftCards = gcds; + $scope.$digest(); + }); lodash.forEach(gcds, function(dataFromStorage) { if (dataFromStorage.status == 'PENDING') { $log.debug("creating gift card"); amazonService.createGiftCard(dataFromStorage, function(err, giftCard) { if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); + popupService.showAlert(gettextCatalog.getString('Error'), err); return; } if (giftCard.status != 'PENDING') { @@ -84,6 +98,7 @@ angular.module('copayApp.controllers').controller('amazonController', }; $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.cardClaimCode = data.stateParams.cardClaimCode; initAmazon(); }); }); diff --git a/src/js/controllers/amount.js b/src/js/controllers/amount.js index 5eee4d003..b273bc401 100644 --- a/src/js/controllers/amount.js +++ b/src/js/controllers/amount.js @@ -1,34 +1,51 @@ 'use strict'; -angular.module('copayApp.controllers').controller('amountController', function($rootScope, $scope, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService) { - +angular.module('copayApp.controllers').controller('amountController', function($scope, $filter, $timeout, $ionicScrollDelegate, $ionicHistory, $ionicPopover, gettextCatalog, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, txFormatService, ongoingProcess, bitpayCardService, popupService, bwcError, payproService, profileService, bitcore, amazonService, glideraService) { var unitToSatoshi; var satToUnit; var unitDecimals; var satToBtc; - var self = $scope.self; var SMALL_FONT_SIZE_LIMIT = 10; var LENGTH_EXPRESSION_LIMIT = 19; + var MENU_ITEM_HEIGHT = 55; $scope.$on('$ionicView.leave', function() { angular.element($window).off('keydown'); }); $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.isGiftCard = data.stateParams.isGiftCard; + + // Glidera parameters + $scope.isGlidera = data.stateParams.isGlidera; + $scope.glideraAccessToken = data.stateParams.glideraAccessToken; - $scope.isWallet = data.stateParams.isWallet; $scope.cardId = data.stateParams.cardId; + $scope.showMenu = $ionicHistory.backView().stateName == 'tabs.send'; + var isWallet = data.stateParams.isWallet || 'false'; + $scope.isWallet = (isWallet.toString().trim().toLowerCase() == 'true' ? true : false); $scope.toAddress = data.stateParams.toAddress; $scope.toName = data.stateParams.toName; $scope.toEmail = data.stateParams.toEmail; - $scope.showAlternativeAmount = !!$scope.cardId; + $scope.showAlternativeAmount = !!$scope.cardId || !!$scope.isGiftCard || !!$scope.isGlidera; $scope.toColor = data.stateParams.toColor; - if (!$scope.cardId && !$stateParams.toAddress) { + $scope.customAmount = data.stateParams.customAmount; + + if (!$scope.cardId && !$scope.isGiftCard && !$scope.isGlidera && !data.stateParams.toAddress) { $log.error('Bad params at amount') throw ('bad params'); } + if ($scope.isGlidera) { + glideraService.getLimits($scope.glideraAccessToken, function(err, limits) { + $scope.limits = limits; + $timeout(function() { + $scope.$apply(); + }); + }); + } + var reNr = /^[1234567890\.]$/; var reOp = /^[\*\+\-\/]$/; @@ -49,8 +66,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ $timeout(function() { $scope.$apply(); - }, 10); - + }); }); var config = configService.getSync().wallet.settings; @@ -77,6 +93,35 @@ angular.module('copayApp.controllers').controller('amountController', function($ }, 10); }); + $scope.showSendMaxMenu = function($event) { + var sendMaxObj = { + text: gettextCatalog.getString('Send max amount'), + action: setSendMax, + }; + + $scope.items = [sendMaxObj]; + $scope.height = $scope.items.length * MENU_ITEM_HEIGHT; + + $ionicPopover.fromTemplateUrl('views/includes/menu-popover.html', { + scope: $scope + }).then(function(popover) { + $scope.menu = popover; + $scope.menu.show($event); + }); + }; + + function setSendMax() { + $scope.menu.hide(); + $state.transitionTo('tabs.send.confirm', { + isWallet: $scope.isWallet, + toAmount: null, + toAddress: $scope.toAddress, + toName: $scope.toName, + toEmail: $scope.toEmail, + useSendMax: true, + }); + }; + $scope.toggleAlternative = function() { $scope.showAlternativeAmount = !$scope.showAlternativeAmount; @@ -121,7 +166,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ function isExpression(val) { var regex = /^\.?\d+(\.?\d+)?([\/\-\+\*x]\d?\.?\d+)+$/; - return regex.test(val); }; @@ -134,7 +178,6 @@ angular.module('copayApp.controllers').controller('amountController', function($ $scope.resetAmount = function() { $scope.amount = $scope.alternativeResult = $scope.amountResult = $scope.globalResult = ''; $scope.allowSend = false; - checkFontSize(); }; @@ -189,6 +232,20 @@ angular.module('copayApp.controllers').controller('amountController', function($ return result.replace('x', '*'); }; + $scope.getRates = function() { + bitpayCardService.getRates($scope.alternativeIsoCode, function(err, res) { + if (err) { + $log.warn(err); + return; + } + if ($scope.unitName == 'bits') { + $scope.exchangeRate = '1,000,000 bits ~ ' + res.rate + ' ' + $scope.alternativeIsoCode; + } else { + $scope.exchangeRate = '1 BTC ~ ' + res.rate + ' ' + $scope.alternativeIsoCode; + } + }); + }; + $scope.finish = function() { var _amount = evaluate(format($scope.amount)); @@ -199,6 +256,7 @@ angular.module('copayApp.controllers').controller('amountController', function($ amount: amountUSD, currency: 'USD' }; + ongoingProcess.set('Preparing transaction...', true); $timeout(function() { @@ -238,15 +296,87 @@ angular.module('copayApp.controllers').controller('amountController', function($ }); }); + } else if ($scope.isGiftCard) { + ongoingProcess.set('Preparing transaction...', true); + // Get first wallet as UUID + var uuid; + try { + uuid = profileService.getWallets({ + onlyComplete: true, + network: 'livenet', + })[0].id; + } catch (err) { + ongoingProcess.set('Preparing transaction...', false); + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('No wallet found!')); + return; + }; + var amountUSD = $scope.showAlternativeAmount ? _amount : $filter('formatFiatAmount')(toFiat(_amount)); + var dataSrc = { + currency: 'USD', + amount: amountUSD, + uuid: uuid + }; + + amazonService.createBitPayInvoice(dataSrc, function(err, dataInvoice) { + if (err) { + ongoingProcess.set('Preparing transaction...', false); + popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); + return; + } + + amazonService.getBitPayInvoice(dataInvoice.invoiceId, function(err, invoice) { + if (err) { + ongoingProcess.set('Preparing transaction...', false); + popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); + return; + } + + var payProUrl = invoice.paymentUrls.BIP73; + + payproService.getPayProDetails(payProUrl, function(err, payProDetails) { + ongoingProcess.set('Preparing transaction...', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); + return; + } + var stateParams = { + giftCardAmountUSD: amountUSD, + giftCardAccessKey: dataInvoice.accessKey, + giftCardInvoiceTime: invoice.invoiceTime, + giftCardUUID: dataSrc.uuid, + toAmount: payProDetails.amount, + toAddress: payProDetails.toAddress, + description: payProDetails.memo, + paypro: payProDetails + }; + + $state.transitionTo('tabs.giftcards.amazon.confirm', stateParams); + }, true); + }); + }); + } else if ($scope.isGlidera) { + var amount = $scope.showAlternativeAmount ? fromFiat(_amount) : _amount; + $state.transitionTo('tabs.buyandsell.glidera.confirm', { + toAmount: (amount * unitToSatoshi).toFixed(0), + isGlidera: $scope.isGlidera, + glideraAccessToken: $scope.glideraAccessToken + }); } else { var amount = $scope.showAlternativeAmount ? fromFiat(_amount) : _amount; - $state.transitionTo('tabs.send.confirm', { - isWallet: $scope.isWallet, - toAmount: (amount * unitToSatoshi).toFixed(0), - toAddress: $scope.toAddress, - toName: $scope.toName, - toEmail: $scope.toEmail - }); + if ($scope.customAmount) { + $state.transitionTo('tabs.receive.customAmount', { + toAmount: (amount * unitToSatoshi).toFixed(0), + toAddress: $scope.toAddress + }); + } else { + $state.transitionTo('tabs.send.confirm', { + isWallet: $scope.isWallet, + toAmount: (amount * unitToSatoshi).toFixed(0), + toAddress: $scope.toAddress, + toName: $scope.toName, + toEmail: $scope.toEmail + }); + } } }; }); diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index f40af13d8..63e6d996f 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -72,7 +72,7 @@ angular.module('copayApp.controllers').controller('backupController', var showBackupResult = function() { if ($scope.backupError) { - var title = 'Uh oh...'; + var title = gettextCatalog.getString('Uh oh...'); var message = gettextCatalog.getString("It's important that you write your backup phrase down correctly. If something happens to your wallet, you'll need this backup to recover your money. Please review your backup and try again."); popupService.showAlert(title, message, function() { $scope.setFlow(2); diff --git a/src/js/controllers/bitpayCard.js b/src/js/controllers/bitpayCard.js index 48ec83506..40187b4ef 100644 --- a/src/js/controllers/bitpayCard.js +++ b/src/js/controllers/bitpayCard.js @@ -63,7 +63,9 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi if (err) { $log.error(err); - $scope.error = gettextCatalog.getString('Could not get transactions'); + self.bitpayCardTransactionHistory = null; + self.bitpayCardCurrentBalance = null; + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get transactions')); return; } diff --git a/src/js/controllers/bitpayCardIntro.js b/src/js/controllers/bitpayCardIntro.js index f2abecdf0..49f29ffe8 100644 --- a/src/js/controllers/bitpayCardIntro.js +++ b/src/js/controllers/bitpayCardIntro.js @@ -36,7 +36,7 @@ angular.module('copayApp.controllers').controller('bitpayCardIntroController', f popupService.showConfirm(title, msg, ok, cancel, function(res) { if (res) { // Set flag for nextStep - storageService.setNextStep('BitpayCard', true, function(err) {}); + storageService.setNextStep('BitpayCard', 'true', function(err) {}); // Save data bitpayCardService.setBitpayDebitCards(data, function(err) { if (err) return; diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js deleted file mode 100644 index ca2aede91..000000000 --- a/src/js/controllers/buyAmazon.js +++ /dev/null @@ -1,224 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('buyAmazonController', - function($scope, $log, $timeout, $state, lodash, profileService, bwcError, gettextCatalog, configService, walletService, amazonService, ongoingProcess, platformInfo, externalLinkService, popupService) { - - var self = this; - var network = amazonService.getEnvironment(); - var wallet; - - $scope.$on('Wallet/Changed', function(event, w) { - if (lodash.isEmpty(w)) { - $log.debug('No wallet provided'); - return; - } - wallet = w; - $log.debug('Wallet changed: ' + w.name); - }); - - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { - externalLinkService.open(url, optIn, title, message, okText, cancelText); - }; - - this.confirm = function() { - var message = gettextCatalog.getString('Amazon.com Gift Card purchase for ${{amount}} USD', { - amount: $scope.formData.fiat - }); - var ok = gettextCatalog.getString('Buy'); - popupService.showConfirm(null, message, ok, null, function(res) { - if (res) self.createTx(); - }); - }; - - this.createTx = function() { - self.errorInfo = null; - - if (lodash.isEmpty(wallet)) return; - - if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { - $log.info('No signing proposal: No private key'); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg('MISSING_PRIVATE_KEY')); - return; - } - - var dataSrc = { - currency: 'USD', - amount: $scope.formData.fiat, - uuid: wallet.id - }; - var outputs = []; - var config = configService.getSync(); - var configWallet = config.wallet; - var walletSettings = configWallet.settings; - - - ongoingProcess.set('Processing Transaction...', true); - $timeout(function() { - amazonService.createBitPayInvoice(dataSrc, function(err, dataInvoice) { - if (err) { - ongoingProcess.set('Processing Transaction...', false); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); - return; - } - - amazonService.getBitPayInvoice(dataInvoice.invoiceId, function(err, invoice) { - if (err) { - ongoingProcess.set('Processing Transaction...', false); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); - return; - } - - $log.debug('Fetch PayPro Request...', invoice.paymentUrls.BIP73); - - wallet.fetchPayPro({ - payProUrl: invoice.paymentUrls.BIP73, - }, function(err, paypro) { - - if (err) { - ongoingProcess.set('Processing Transaction...', false); - $log.warn('Could not fetch payment request:', err); - var msg = err.toString(); - if (msg.match('HTTP')) { - msg = gettextCatalog.getString('Could not fetch payment information'); - } - popupService.showAlert(gettextCatalog.getString('Error'), msg); - return; - } - - if (!paypro.verified) { - ongoingProcess.set('Processing Transaction...', false); - $log.warn('Failed to verify payment protocol signatures'); - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Payment Protocol Invalid')); - $timeout(function() { - $scope.$digest(); - }); - return; - } - - var address, comment, amount, url; - - address = paypro.toAddress; - amount = paypro.amount; - url = paypro.url; - comment = 'Amazon.com Gift Card'; - - outputs.push({ - 'toAddress': address, - 'amount': amount, - 'message': comment - }); - - var txp = { - toAddress: address, - amount: amount, - outputs: outputs, - message: comment, - payProUrl: url, - excludeUnconfirmedUtxos: configWallet.spendUnconfirmed ? false : true, - feeLevel: walletSettings.feeLevel || 'normal' - }; - - walletService.createTx(wallet, txp, function(err, createdTxp) { - ongoingProcess.set('Processing Transaction...', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); - return; - } - walletService.publishAndSign(wallet, createdTxp, function(err, tx) { - if (err) { - ongoingProcess.set('Processing Transaction...', false); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); - walletService.removeTx(wallet, tx, function(err) { - if (err) $log.debug(err); - }); - $timeout(function() { - $scope.$digest(); - }); - return; - } - var count = 0; - ongoingProcess.set('Processing Transaction...', true); - - dataSrc.accessKey = dataInvoice.accessKey; - dataSrc.invoiceId = invoice.id; - dataSrc.invoiceUrl = invoice.url; - dataSrc.invoiceTime = invoice.invoiceTime; - - self.debounceCreate(count, dataSrc); - }); - }); - }); - }); - }); - }, 100); - }; - - self.debounceCreate = lodash.throttle(function(count, dataSrc) { - self.debounceCreateGiftCard(count, dataSrc); - }, 8000, { - 'leading': true - }); - - self.debounceCreateGiftCard = function(count, dataSrc) { - - amazonService.createGiftCard(dataSrc, function(err, giftCard) { - $log.debug("creating gift card " + count); - if (err) { - giftCard = {}; - giftCard.status = 'FAILURE'; - ongoingProcess.set('Processing Transaction...', false); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); - self.errorInfo = dataSrc; - $timeout(function() { - $scope.$digest(); - }); - } - - if (giftCard.status == 'PENDING' && count < 3) { - $log.debug("pending gift card not available yet"); - self.debounceCreate(count + 1, dataSrc, dataSrc); - return; - } - - var now = moment().unix() * 1000; - - var newData = giftCard; - newData['invoiceId'] = dataSrc.invoiceId; - newData['accessKey'] = dataSrc.accessKey; - newData['invoiceUrl'] = dataSrc.invoiceUrl; - newData['amount'] = dataSrc.amount; - newData['date'] = dataSrc.invoiceTime || now; - newData['uuid'] = dataSrc.uuid; - - if (newData.status == 'expired') { - amazonService.savePendingGiftCard(newData, { - remove: true - }, function(err) { - return; - }); - } - - amazonService.savePendingGiftCard(newData, null, function(err) { - ongoingProcess.set('Processing Transaction...', false); - $log.debug("Saving new gift card with status: " + newData.status); - - self.giftCard = newData; - if (newData.status == 'PENDING') $state.transitionTo('tabs.giftcards.amazon'); - $timeout(function() { - $scope.$digest(); - }); - }); - }); - }; - - $scope.$on("$ionicView.enter", function(event, data) { - $scope.formData = { - fiat: null - }; - $scope.wallets = profileService.getWallets({ - network: network, - onlyComplete: true - }); - }); - - }); diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js deleted file mode 100644 index e15632185..000000000 --- a/src/js/controllers/buyGlidera.js +++ /dev/null @@ -1,146 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('buyGlideraController', - function($scope, $timeout, $log, profileService, walletService, glideraService, bwcError, lodash, ongoingProcess, popupService, gettextCatalog) { - - var wallet; - var self = this; - this.show2faCodeInput = null; - this.success = null; - $scope.network = glideraService.getEnvironment(); - - $scope.$on('Wallet/Changed', function(event, w) { - if (lodash.isEmpty(w)) { - $log.debug('No wallet provided'); - return; - } - wallet = w; - $log.debug('Wallet changed: ' + w.name); - }); - - $scope.update = function(opts) { - if (!$scope.token || !$scope.permissions) return; - $log.debug('Updating Glidera Account...'); - var accessToken = $scope.token; - var permissions = $scope.permissions; - - opts = opts || {}; - - glideraService.getStatus(accessToken, function(err, data) { - $scope.status = data; - }); - - glideraService.getLimits(accessToken, function(err, limits) { - $scope.limits = limits; - }); - - if (permissions.transaction_history) { - glideraService.getTransactions(accessToken, function(err, data) { - $scope.txs = data; - }); - } - - if (permissions.view_email_address && opts.fullUpdate) { - glideraService.getEmail(accessToken, function(err, data) { - $scope.email = data.email; - }); - } - if (permissions.personal_info && opts.fullUpdate) { - glideraService.getPersonalInfo(accessToken, function(err, data) { - $scope.personalInfo = data; - }); - } - }; - - this.getBuyPrice = function(token, price) { - var self = this; - if (!price || (price && !price.qty && !price.fiat)) { - this.buyPrice = null; - return; - } - this.gettingBuyPrice = true; - glideraService.buyPrice(token, price, function(err, buyPrice) { - self.gettingBuyPrice = false; - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get exchange information. Please, try again')); - return; - } - self.buyPrice = buyPrice; - }); - }; - - this.get2faCode = function(token) { - var self = this; - ongoingProcess.set('Sending 2FA code...', true); - $timeout(function() { - glideraService.get2faCode(token, function(err, sent) { - ongoingProcess.set('Sending 2FA code...', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send confirmation code to your phone')); - return; - } - self.show2faCodeInput = sent; - }); - }, 100); - }; - - this.sendRequest = function(token, permissions, twoFaCode) { - var self = this; - ongoingProcess.set('Buying Bitcoin...', true); - $timeout(function() { - walletService.getAddress(wallet, false, function(err, walletAddr) { - if (err) { - ongoingProcess.set('Buying Bitcoin...', false); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.cb(err, 'Could not create address')); - return; - } - var data = { - destinationAddress: walletAddr, - qty: self.buyPrice.qty, - priceUuid: self.buyPrice.priceUuid, - useCurrentPrice: false, - ip: null - }; - glideraService.buy(token, twoFaCode, data, function(err, data) { - ongoingProcess.set('Buying Bitcoin...', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err); - return; - } - self.success = data; - $timeout(function() { - $scope.$digest(); - }); - }); - }); - }, 100); - }; - - $scope.$on("$ionicView.enter", function(event, data){ - $scope.token = null; - $scope.permissions = null; - $scope.email = null; - $scope.personalInfo = null; - $scope.txs = null; - $scope.status = null; - $scope.limits = null; - - ongoingProcess.set('connectingGlidera', true); - glideraService.init($scope.token, function(err, glidera) { - ongoingProcess.set('connectingGlidera'); - if (err || !glidera) { - if (err) popupService.showAlert(gettextCatalog.getString('Error'), err); - return; - } - $scope.token = glidera.token; - $scope.permissions = glidera.permissions; - $scope.update({fullUpdate: true}); - }); - - $scope.wallets = profileService.getWallets({ - network: $scope.network, - onlyComplete: true - }); - }); - - }); diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 3c8ac591d..f7365ec65 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -1,103 +1,240 @@ 'use strict'; -angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, gettext, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService) { +angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, rateService, $stateParams, $window, $state, $log, profileService, bitcore, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, amazonService, glideraService, bwcError, bitpayCardService) { var cachedTxp = {}; + var toAmount; var isChromeApp = platformInfo.isChromeApp; var countDown = null; + var giftCardAmountUSD; + var giftCardAccessKey; + var giftCardInvoiceTime; + var giftCardUUID; + var cachedSendMax = {}; $scope.isCordova = platformInfo.isCordova; $ionicConfig.views.swipeBackEnabled(false); $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isWallet = data.stateParams.isWallet; + // Amazon.com Gift Card parameters + $scope.isGiftCard = data.stateParams.isGiftCard; + giftCardAmountUSD = data.stateParams.giftCardAmountUSD; + giftCardAccessKey = data.stateParams.giftCardAccessKey; + giftCardInvoiceTime = data.stateParams.giftCardInvoiceTime; + giftCardUUID = data.stateParams.giftCardUUID; + + // Glidera parameters + $scope.isGlidera = data.stateParams.isGlidera; + $scope.glideraAccessToken = data.stateParams.glideraAccessToken; + + toAmount = data.stateParams.toAmount; + cachedSendMax = {}; + $scope.useSendMax = data.stateParams.useSendMax == 'true' ? true : false; + var isWallet = data.stateParams.isWallet || 'false'; + $scope.isWallet = (isWallet.toString().trim().toLowerCase() == 'true' ? true : false); $scope.cardId = data.stateParams.cardId; - $scope.toAmount = data.stateParams.toAmount; $scope.toAddress = data.stateParams.toAddress; $scope.toName = data.stateParams.toName; $scope.toEmail = data.stateParams.toEmail; $scope.description = data.stateParams.description; $scope.paypro = data.stateParams.paypro; + $scope.insufficientFunds = false; + $scope.noMatchingWallet = false; $scope.paymentExpired = { value: false }; $scope.remainingTimeStr = { value: null }; - initConfirm(); - }); - - var initConfirm = function() { - // TODO (URL , etc) - if (!$scope.toAddress || !$scope.toAmount) { - $log.error('Bad params at amount'); - throw ('bad params'); - } var config = configService.getSync().wallet; - $scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; + var feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; + $scope.feeLevel = feeService.feeOpts[feeLevel]; + if ($scope.isGlidera) $scope.network = glideraService.getEnvironment(); + else $scope.network = (new bitcore.Address($scope.toAddress)).network.name; + resetValues(); + setwallets(); + }); - $scope.toAmount = parseInt($scope.toAmount); - $scope.amountStr = txFormatService.formatAmountStr($scope.toAmount); - $scope.displayAmount = getDisplayAmount($scope.amountStr); - $scope.displayUnit = getDisplayUnit($scope.amountStr); - - var networkName = (new bitcore.Address($scope.toAddress)).network.name; - $scope.network = networkName; - - $scope.insuffientFunds = false; - $scope.noMatchingWallet = false; - - var wallets = profileService.getWallets({ + function setwallets() { + $scope.wallets = profileService.getWallets({ onlyComplete: true, - network: networkName, + network: $scope.network }); - if (!wallets || !wallets.length) { + if (!$scope.wallets || !$scope.wallets.length) { $scope.noMatchingWallet = true; + if ($scope.paypro) { + displayValues(); + } + $timeout(function() { + $scope.$apply(); + }); + return; + } + + if ($scope.isGlidera == 'buy') { + initConfirm(); + return; } var filteredWallets = []; var index = 0; var enoughFunds = false; - lodash.each(wallets, function(w) { + lodash.each($scope.wallets, function(w) { walletService.getStatus(w, {}, function(err, status) { if (err || !status) { $log.error(err); } else { w.status = status; if (!status.availableBalanceSat) $log.debug('No balance available in: ' + w.name); - if (status.availableBalanceSat > $scope.toAmount) { + if (status.availableBalanceSat > toAmount) { filteredWallets.push(w); enoughFunds = true; } } - if (++index == wallets.length) { + if (++index == $scope.wallets.length) { if (!lodash.isEmpty(filteredWallets)) { $scope.wallets = lodash.clone(filteredWallets); - setWallet($scope.wallets[0]); + if ($scope.useSendMax) { + if ($scope.wallets.length > 1) + $scope.showWalletSelector(); + else { + $scope.wallet = $scope.wallets[0]; + $scope.getSendMaxInfo(); + } + } else initConfirm(); } else { - - if (!enoughFunds) - $scope.insuffientFunds = true; - + if (!enoughFunds) $scope.insufficientFunds = true; $log.warn('No wallet available to make the payment'); - $timeout(function() { - $scope.$apply(); - }); } + $timeout(function() { + $scope.$apply(); + }); } }); }); + }; - txFormatService.formatAlternativeStr($scope.toAmount, function(v) { + var initConfirm = function() { + if ($scope.paypro) _paymentTimeControl($scope.paypro.expires); + + displayValues(); + if ($scope.wallets.length > 1) $scope.showWalletSelector(); + else setWallet($scope.wallets[0]); + $timeout(function() { + $scope.$apply(); + }); + }; + + function displayValues() { + toAmount = parseInt(toAmount); + $scope.amountStr = txFormatService.formatAmountStr(toAmount); + $scope.displayAmount = getDisplayAmount($scope.amountStr); + $scope.displayUnit = getDisplayUnit($scope.amountStr); + txFormatService.formatAlternativeStr(toAmount, function(v) { $scope.alternativeAmountStr = v; }); + if ($scope.isGlidera == 'buy') $scope.getBuyPrice(); + if ($scope.isGlidera == 'sell') $scope.getSellPrice(); + }; - if($scope.paypro) { - _paymentTimeControl($scope.paypro.expires); - } + function resetValues() { + $scope.displayAmount = $scope.displayUnit = $scope.fee = $scope.alternativeAmountStr = $scope.insufficientFunds = $scope.noMatchingWallet = null; + }; + $scope.getSendMaxInfo = function() { + resetValues(); + + ongoingProcess.set('gettingFeeLevels', true); + feeService.getCurrentFeeValue($scope.network, function(err, feePerKb) { + ongoingProcess.set('gettingFeeLevels', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message); + return; + } + var config = configService.getSync().wallet; + + ongoingProcess.set('retrievingInputs', true); + walletService.getSendMaxInfo($scope.wallet, { + feePerKb: feePerKb, + excludeUnconfirmedUtxos: !config.spendUnconfirmed, + returnInputs: true, + }, function(err, resp) { + ongoingProcess.set('retrievingInputs', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + + if (resp.amount == 0) { + $scope.insufficientFunds = true; + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not enough funds for fee')); + return; + } + + $scope.sendMaxInfo = { + sendMax: true, + amount: resp.amount, + inputs: resp.inputs, + fee: resp.fee, + feePerKb: feePerKb, + }; + + cachedSendMax[$scope.wallet.id] = $scope.sendMaxInfo; + + var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", { + fee: txFormatService.formatAmountStr(resp.fee) + }); + var warningMsg = verifyExcludedUtxos(); + + if (!lodash.isEmpty(warningMsg)) + msg += '\n' + warningMsg; + + popupService.showAlert(null, msg, function() { + setSendMaxValues(resp); + + createTx($scope.wallet, true, function(err, txp) { + if (err) return; + cachedTxp[$scope.wallet.id] = txp; + apply(txp); + }); + }); + + function verifyExcludedUtxos() { + var warningMsg = []; + if (resp.utxosBelowFee > 0) { + warningMsg.push(gettextCatalog.getString("A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided.", { + amountBelowFeeStr: txFormatService.formatAmountStr(resp.amountBelowFee) + })); + } + + if (resp.utxosAboveMaxSize > 0) { + warningMsg.push(gettextCatalog.getString("A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded.", { + amountAboveMaxSizeStr: txFormatService.formatAmountStr(resp.amountAboveMaxSize) + })); + } + return warningMsg.join('\n'); + }; + }); + }); + }; + + function setSendMaxValues(data) { + resetValues(); + var config = configService.getSync().wallet; + var unitToSatoshi = config.settings.unitToSatoshi; + var satToUnit = 1 / unitToSatoshi; + var unitDecimals = config.settings.unitDecimals; + + $scope.amountStr = txFormatService.formatAmountStr(data.amount, true); + $scope.displayAmount = getDisplayAmount($scope.amountStr); + $scope.displayUnit = getDisplayUnit($scope.amountStr); + $scope.fee = txFormatService.formatAmountStr(data.fee); + toAmount = parseFloat((data.amount * satToUnit).toFixed(unitDecimals)); + txFormatService.formatAlternativeStr(data.amount, function(v) { + $scope.alternativeAmountStr = v; + }); $timeout(function() { $scope.$apply(); }); @@ -107,24 +244,25 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.approve(); }); - $scope.$on('Wallet/Changed', function(event, wallet) { - if (lodash.isEmpty(wallet)) { - $log.debug('No wallet provided'); - return; - } - $log.debug('Wallet changed: ' + wallet.name); - setWallet(wallet, true); - }); - $scope.showWalletSelector = function() { + $scope.walletSelectorTitle = $scope.isGlidera == 'buy' ? 'Receive in' : $scope.isGlidera == 'sell' ? 'Sell From' : gettextCatalog.getString('Send from'); + if (!$scope.useSendMax && ($scope.insufficientFunds || $scope.noMatchingWallet)) return; $scope.showWallets = true; }; $scope.onWalletSelect = function(wallet) { - setWallet(wallet); + if ($scope.useSendMax) { + $scope.wallet = wallet; + if (cachedSendMax[wallet.id]) { + $log.debug('Send max cached for wallet:', wallet.id); + setSendMaxValues(cachedSendMax[wallet.id]); + return; + } + $scope.getSendMaxInfo(); + } else + setWallet(wallet); }; - $scope.showDescriptionPopup = function() { var message = gettextCatalog.getString('Add description'); var opts = { @@ -135,17 +273,17 @@ angular.module('copayApp.controllers').controller('confirmController', function( if (typeof res != 'undefined') $scope.description = res; $timeout(function() { $scope.$apply(); - }, 100); + }); }); }; function getDisplayAmount(amountStr) { - return amountStr.split(' ')[0]; - } + return $scope.amountStr.split(' ')[0]; + }; function getDisplayUnit(amountStr) { - return amountStr.split(' ')[1]; - } + return $scope.amountStr.split(' ')[1]; + }; function _paymentTimeControl(expirationTime) { $scope.paymentExpired.value = false; @@ -167,7 +305,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( var m = Math.floor(totalSecs / 60); var s = totalSecs % 60; $scope.remainingTimeStr.value = ('0' + m).slice(-2) + ":" + ('0' + s).slice(-2); - } + }; function setExpiredValues() { $scope.paymentExpired.value = true; @@ -176,19 +314,15 @@ angular.module('copayApp.controllers').controller('confirmController', function( $timeout(function() { $scope.$apply(); }); - } - } + }; + }; function setWallet(wallet, delayed) { var stop; $scope.wallet = wallet; $scope.fee = $scope.txp = null; - $timeout(function() { - $ionicScrollDelegate.resize(); - $scope.$apply(); - }, 10); - + if ($scope.isGlidera) return; if (stop) { $timeout.cancel(stop); stop = null; @@ -205,67 +339,75 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }, delayed ? 2000 : 1); } - } + + $timeout(function() { + $ionicScrollDelegate.resize(); + $scope.$apply(); + }, 10); + }; var setSendError = function(msg) { $scope.sendStatus = ''; $timeout(function() { $scope.$apply(); }); - popupService.showAlert(gettextCatalog.getString('Error at confirm:'), msg); + popupService.showAlert(gettextCatalog.getString('Error at confirm'), bwcError.msg(msg)); }; function apply(txp) { $scope.fee = txFormatService.formatAmountStr(txp.fee); $scope.txp = txp; - $scope.$apply(); - } + $timeout(function() { + $scope.$apply(); + }); + }; var createTx = function(wallet, dryRun, cb) { var config = configService.getSync().wallet; var currentSpendUnconfirmed = config.spendUnconfirmed; - var outputs = []; - var paypro = $scope.paypro; var toAddress = $scope.toAddress; - var toAmount = $scope.toAmount; var description = $scope.description; + var unitToSatoshi = config.settings.unitToSatoshi; + var unitDecimals = config.settings.unitDecimals; // ToDo: use a credential's (or fc's) function for this if (description && !wallet.credentials.sharedEncryptingKey) { - var msg = 'Could not add message to imported wallet without shared encrypting key'; + var msg = gettextCatalog.getString('Could not add message to imported wallet without shared encrypting key'); $log.warn(msg); return setSendError(msg); } if (toAmount > Number.MAX_SAFE_INTEGER) { - var msg = 'Amount too big'; + var msg = gettextCatalog.getString('Amount too big'); $log.warn(msg); return setSendError(msg); } - outputs.push({ - 'toAddress': toAddress, - 'amount': toAmount, - 'message': description - }); - var txp = {}; + var amount; - // TODO - if (!lodash.isEmpty($scope.sendMaxInfo)) { - txp.sendMax = true; + if ($scope.useSendMax) amount = parseFloat((toAmount * unitToSatoshi).toFixed(0)); + else amount = toAmount; + + txp.outputs = [{ + 'toAddress': toAddress, + 'amount': amount, + 'message': description + }]; + + if ($scope.sendMaxInfo) { txp.inputs = $scope.sendMaxInfo.inputs; txp.fee = $scope.sendMaxInfo.fee; - } + } else + txp.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; - txp.outputs = outputs; txp.message = description; - if(paypro) { + + if (paypro) { txp.payProUrl = paypro.url; } - txp.excludeUnconfirmedUtxos = config.spendUnconfirmed ? false : true; - txp.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal'; + txp.excludeUnconfirmedUtxos = !currentSpendUnconfirmed; txp.dryRun = dryRun; walletService.createTx(wallet, txp, function(err, ctxp) { @@ -288,6 +430,11 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.approve = function(onSendStatusChange) { + var wallet = $scope.wallet; + if (!wallet) { + return; + } + if ($scope.paypro && $scope.paymentExpired.value) { popupService.showAlert(null, gettextCatalog.getString('This bitcoin payment request has expired.')); $scope.sendStatus = ''; @@ -297,17 +444,45 @@ angular.module('copayApp.controllers').controller('confirmController', function( return; } - var wallet = $scope.wallet; - if (!wallet) { - return setSendError(gettextCatalog.getString('No wallet selected')); - } - - if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { - $log.info('No signing proposal: No private key'); - - return walletService.onlyPublish(wallet, txp, function(err, txp) { - if (err) return setSendError(err); + if ($scope.isGlidera) { + $scope.get2faCode(function(err, sent) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send confirmation code to your phone')); + return; + } + if (sent) { + var title = gettextCatalog.getString("Please, enter the code below"); + var message = gettextCatalog.getString("A SMS containing a confirmation code was sent to your phone."); + popupService.showPrompt(title, message, null, function(twoFaCode) { + if (typeof twoFaCode == 'undefined') return; + if ($scope.isGlidera == 'buy') { + $scope.buyRequest(wallet, twoFaCode, function(err, data) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + $scope.sendStatus = 'success'; + $timeout(function() { + $scope.$digest(); + }); + }) + } + if ($scope.isGlidera == 'sell') { + $scope.sellRequest(wallet, twoFaCode, function(err, data) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + $scope.sendStatus = 'success'; + $timeout(function() { + $scope.$digest(); + }); + }) + } + }); + } }); + return; } ongoingProcess.set('creatingTx', true, onSendStatusChange); @@ -356,13 +531,18 @@ angular.module('copayApp.controllers').controller('confirmController', function( function statusChangeHandler(processName, showName, isOn) { $log.debug('statusChangeHandler: ', processName, showName, isOn); - if ((processName === 'broadcastingTx' || ((processName === 'signingTx') && $scope.wallet.m > 1)) && !isOn) { + if ( + ( + processName === 'broadcastingTx' || + ((processName === 'signingTx') && $scope.wallet.m > 1) || + (processName == 'sendingTx' && !$scope.wallet.canSign() && !$scope.wallet.isPrivKeyExternal()) + ) && !isOn) { $scope.sendStatus = 'success'; $scope.$digest(); } else if (showName) { $scope.sendStatus = showName; } - } + }; $scope.statusChangeHandler = statusChangeHandler; @@ -373,6 +553,8 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.onSuccessConfirm = function() { var previousView = $ionicHistory.viewHistory().backView && $ionicHistory.viewHistory().backView.stateName; var fromBitPayCard = previousView.match(/tabs.bitpayCard/) ? true : false; + var fromAmazon = previousView.match(/tabs.giftcards.amazon/) ? true : false; + var fromGlidera = previousView.match(/tabs.buyandsell.glidera/) ? true : false; $ionicHistory.nextViewOptions({ disableAnimate: true @@ -386,14 +568,288 @@ angular.module('copayApp.controllers').controller('confirmController', function( id: $stateParams.cardId }); }, 100); + } else if (fromAmazon) { + $ionicHistory.nextViewOptions({ + disableAnimate: true, + historyRoot: true + }); + $ionicHistory.clearHistory(); + $state.go('tabs.home').then(function() { + $state.transitionTo('tabs.giftcards.amazon', { + cardClaimCode: $scope.amazonGiftCard ? $scope.amazonGiftCard.claimCode : null + }); + }); + } else if (fromGlidera) { + $ionicHistory.nextViewOptions({ + disableAnimate: true, + historyRoot: true + }); + $ionicHistory.clearHistory(); + $state.go('tabs.home').then(function() { + $state.transitionTo('tabs.buyandsell.glidera'); + }); } else { - $state.go('tabs.send'); + $ionicHistory.nextViewOptions({ + disableAnimate: true, + historyRoot: true + }); + $ionicHistory.clearHistory(); + $state.go('tabs.send').then(function() { + $state.transitionTo('tabs.home'); + }); } }; + $scope.get2faCode = function(cb) { + ongoingProcess.set('sending2faCode', true); + $timeout(function() { + glideraService.get2faCode($scope.glideraAccessToken, function(err, sent) { + ongoingProcess.set('sending2faCode', false); + return cb(err, sent); + }); + }, 100); + }; + + $scope.buyRequest = function(wallet, twoFaCode, cb) { + ongoingProcess.set('buyingBitcoin', true); + $timeout(function() { + walletService.getAddress(wallet, false, function(err, walletAddr) { + if (err) { + ongoingProcess.set('buyingBitcoin', false); + popupService.showAlert(gettextCatalog.getString('Error'), bwcError.cb(err, 'Could not create address')); + return; + } + var data = { + destinationAddress: walletAddr, + qty: $scope.buyPrice.qty, + priceUuid: $scope.buyPrice.priceUuid, + useCurrentPrice: false, + ip: null + }; + glideraService.buy($scope.glideraAccessToken, twoFaCode, data, function(err, data) { + ongoingProcess.set('buyingBitcoin', false); + return cb(err, data); + }); + }); + }, 100); + }; + + $scope.sellRequest = function(wallet, twoFaCode, cb) { + var outputs = []; + var config = configService.getSync(); + var configWallet = config.wallet; + var walletSettings = configWallet.settings; + + ongoingProcess.set('creatingTx', true); + walletService.getAddress(wallet, null, function(err, refundAddress) { + if (!refundAddress) { + ongoingProcess.clear(); + popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err, 'Could not create address')); + return; + } + glideraService.getSellAddress($scope.glideraAccessToken, function(err, sellAddress) { + if (!sellAddress || err) { + ongoingProcess.clear(); + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get the destination bitcoin address')); + return; + } + var amount = parseInt(($scope.sellPrice.qty * 100000000).toFixed(0)); + var comment = 'Glidera transaction'; + + outputs.push({ + 'toAddress': sellAddress, + 'amount': amount, + 'message': comment + }); + + var txp = { + toAddress: sellAddress, + amount: amount, + outputs: outputs, + message: comment, + payProUrl: null, + excludeUnconfirmedUtxos: configWallet.spendUnconfirmed ? false : true, + feeLevel: walletSettings.feeLevel || 'normal', + customData: { + 'glideraToken': $scope.glideraAccessToken + } + }; + + walletService.createTx(wallet, txp, function(err, createdTxp) { + ongoingProcess.clear(); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); + return; + } + walletService.prepare(wallet, function(err, password) { + if (err) { + ongoingProcess.clear(); + popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); + return; + } + ongoingProcess.set('signingTx', true); + walletService.publishTx(wallet, createdTxp, function(err, publishedTxp) { + if (err) { + ongoingProcess.clear(); + popupService.showAlert(gettextCatalog.getString('Error'), err.message ||  bwcError.msg(err)); + return; + } + + walletService.signTx(wallet, publishedTxp, password, function(err, signedTxp) { + if (err) { + ongoingProcess.clear(); + popupService.showAlert(gettextCatalog.getString('Error'), err.message ||  bwcError.msg(err)); + walletService.removeTx(wallet, signedTxp, function(err) { + if (err) $log.debug(err); + }); + return; + } + var rawTx = signedTxp.raw; + var data = { + refundAddress: refundAddress, + signedTransaction: rawTx, + priceUuid: $scope.sellPrice.priceUuid, + useCurrentPrice: $scope.sellPrice.priceUuid ? false : true, + ip: null + }; + ongoingProcess.set('sellingBitcoin', true); + glideraService.sell($scope.glideraAccessToken, twoFaCode, data, function(err, data) { + ongoingProcess.clear(); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err.message ||  bwcError.msg(err)); + return; + } + return cb(err, data) + }); + }); + }); + }); + }); + }); + }); + } + + $scope.getBuyPrice = function() { + var satToBtc = 1 / 100000000; + var price = {}; + price.qty = (toAmount * satToBtc).toFixed(8); + glideraService.buyPrice($scope.glideraAccessToken, price, function(err, buyPrice) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), 'Could not get exchange information. Please, try again'); + return; + } + $scope.buyPrice = buyPrice; + }); + }; + + $scope.getSellPrice = function() { + var satToBtc = 1 / 100000000; + var price = {}; + price.qty = (toAmount * satToBtc).toFixed(8); + + glideraService.sellPrice($scope.glideraAccessToken, price, function(err, sellPrice) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), 'Could not get exchange information. Please, try again'); + return; + } + $scope.sellPrice = sellPrice; + }); + }; + function publishAndSign(wallet, txp, onSendStatusChange) { + + if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { + $log.info('No signing proposal: No private key'); + + return walletService.onlyPublish(wallet, txp, function(err) { + if (err) setSendError(err); + }, onSendStatusChange); + } + walletService.publishAndSign(wallet, txp, function(err, txp) { if (err) return setSendError(err); + + var previousView = $ionicHistory.viewHistory().backView && $ionicHistory.viewHistory().backView.stateName; + var fromAmazon = previousView.match(/tabs.giftcards.amazon/) ? true : false; + if (fromAmazon) { + var count = 0; + var invoiceId = JSON.parse($scope.paypro.merchant_data).invoiceId; + var dataSrc = { + currency: 'USD', + amount: giftCardAmountUSD, + uuid: giftCardUUID, + accessKey: giftCardAccessKey, + invoiceId: invoiceId, + invoiceUrl: $scope.paypro.url, + invoiceTime: giftCardInvoiceTime + }; + debounceCreate(count, dataSrc, onSendStatusChange); + } }, onSendStatusChange); } + + var debounceCreate = lodash.throttle(function(count, dataSrc) { + debounceCreateGiftCard(count, dataSrc); + }, 8000, { + 'leading': true + }); + + var debounceCreateGiftCard = function(count, dataSrc, onSendStatusChange) { + + amazonService.createGiftCard(dataSrc, function(err, giftCard) { + $log.debug("creating gift card " + count); + if (err) { + giftCard = {}; + giftCard.status = 'FAILURE'; + popupService.showAlert(gettextCatalog.getString('Error'), err); + } + + if (giftCard.status == 'PENDING' && count < 3) { + $log.debug("pending gift card not available yet"); + debounceCreate(count + 1, dataSrc); + return; + } + + var now = moment().unix() * 1000; + + var newData = giftCard; + newData['invoiceId'] = dataSrc.invoiceId; + newData['accessKey'] = dataSrc.accessKey; + newData['invoiceUrl'] = dataSrc.invoiceUrl; + newData['amount'] = dataSrc.amount; + newData['date'] = dataSrc.invoiceTime || now; + newData['uuid'] = dataSrc.uuid; + + if (newData.status == 'expired') { + amazonService.savePendingGiftCard(newData, { + remove: true + }, function(err) { + $log.error(err); + return; + }); + } + + amazonService.savePendingGiftCard(newData, null, function(err) { + $log.debug("Saving new gift card with status: " + newData.status); + $scope.amazonGiftCard = newData; + }); + }); + }; + + $scope.getRates = function() { + var config = configService.getSync().wallet.settings; + var unitName = config.unitName; + var alternativeIsoCode = config.alternativeIsoCode; + bitpayCardService.getRates(alternativeIsoCode, function(err, res) { + if (err) { + $log.warn(err); + return; + } + if (unitName == 'bits') { + $scope.exchangeRate = '1,000,000 bits ~ ' + res.rate + ' ' + alternativeIsoCode; + } else { + $scope.exchangeRate = '1 BTC ~ ' + res.rate + ' ' + alternativeIsoCode; + } + }); + }; }); diff --git a/src/js/controllers/copayers.js b/src/js/controllers/copayers.js index d5ae4c41e..cc4a97c69 100644 --- a/src/js/controllers/copayers.js +++ b/src/js/controllers/copayers.js @@ -79,8 +79,8 @@ angular.module('copayApp.controllers').controller('copayersController', }; $scope.goHome = function() { - $ionicHistory.removeBackView(); $state.go('tabs.home'); + $ionicHistory.clearHistory(); }; }); diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index bad361d93..ed567bf0d 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('createController', - function($scope, $rootScope, $timeout, $log, lodash, $state, $ionicScrollDelegate, $ionicHistory, profileService, configService, gettext, gettextCatalog, ledger, trezor, platformInfo, derivationPathHelper, ongoingProcess, walletService, storageService, popupService) { + function($scope, $rootScope, $timeout, $log, lodash, $state, $ionicScrollDelegate, $ionicHistory, profileService, configService, gettextCatalog, ledger, trezor, platformInfo, derivationPathHelper, ongoingProcess, walletService, storageService, popupService, $window) { var isChromeApp = platformInfo.isChromeApp; var isCordova = platformInfo.isCordova; @@ -33,7 +33,6 @@ angular.module('copayApp.controllers').controller('createController', $scope.formData.derivationPath = derivationPathHelper.default; $scope.setTotalCopayers(tc); updateRCSelect(tc); - updateSeedSourceSelect(tc); }; $scope.showAdvChange = function() { @@ -44,7 +43,7 @@ angular.module('copayApp.controllers').controller('createController', $scope.resizeView = function() { $timeout(function() { $ionicScrollDelegate.resize(); - }); + }, 10); checkPasswordFields(); }; @@ -67,26 +66,35 @@ angular.module('copayApp.controllers').controller('createController', function updateSeedSourceSelect(n) { var seedOptions = [{ id: 'new', - label: gettext('Random'), + label: gettextCatalog.getString('Random'), }, { id: 'set', - label: gettext('Specify Recovery Phrase...'), + label: gettextCatalog.getString('Specify Recovery Phrase...'), }]; $scope.seedSource = seedOptions[0]; - if (n > 1 && isChromeApp) - seedOptions.push({ - id: 'ledger', - label: 'Ledger Hardware Wallet', - }); + /* - if (isChromeApp || isDevel) { - seedOptions.push({ - id: 'trezor', - label: 'Trezor Hardware Wallet', - }); + Disable Hardware Wallets for BitPay distribution + + */ + + if ($window.appConfig.name == 'copay') { + if (n > 1 && isChromeApp) { + seedOptions.push({ + id: 'ledger', + label: 'Ledger Hardware Wallet', + }); + } + if (isChromeApp || isDevel) { + seedOptions.push({ + id: 'trezor', + label: 'Trezor Hardware Wallet', + }); + } } + $scope.seedOptions = seedOptions; }; diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js new file mode 100644 index 000000000..ea3e56ceb --- /dev/null +++ b/src/js/controllers/customAmount.js @@ -0,0 +1,27 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('customAmountController', function($rootScope, $scope, $stateParams, $ionicHistory, txFormatService, platformInfo) { + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + var satToBtc = 1 / 100000000; + $scope.isCordova = platformInfo.isCordova; + $scope.address = data.stateParams.toAddress; + $scope.amount = parseInt(data.stateParams.toAmount); + $scope.amountBtc = ($scope.amount * satToBtc).toFixed(8); + $scope.amountStr = txFormatService.formatAmountStr($scope.amount); + $scope.altAmountStr = txFormatService.formatAlternativeStr($scope.amount); + }); + + $scope.shareAddress = function(uri) { + window.plugins.socialsharing.share(uri, null, null, null); + }; + + $scope.finish = function() { + $ionicHistory.nextViewOptions({ + disableAnimate: false, + historyRoot: true + }); + $ionicHistory.goBack(-2); + }; + +}); diff --git a/src/js/controllers/export.js b/src/js/controllers/export.js index 4c0b8c773..bec190995 100644 --- a/src/js/controllers/export.js +++ b/src/js/controllers/export.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('exportController', - function($scope, $timeout, $log, $ionicHistory, $ionicScrollDelegate, backupService, walletService, storageService, profileService, platformInfo, gettextCatalog, $state, $stateParams, popupService) { + function($scope, $timeout, $log, $ionicHistory, $ionicScrollDelegate, backupService, walletService, storageService, profileService, platformInfo, gettextCatalog, $state, $stateParams, popupService, $window) { var wallet = profileService.getWallet($stateParams.walletId); $scope.showAdvChange = function() { @@ -12,7 +12,7 @@ angular.module('copayApp.controllers').controller('exportController', $scope.resizeView = function() { $timeout(function() { $ionicScrollDelegate.resize(); - }); + }, 10); }; function getPassword(cb) { @@ -191,7 +191,7 @@ angular.module('copayApp.controllers').controller('exportController', if ($scope.formData.noSignEnabled) name = name + '(No Private Key)'; - var subject = 'Copay Wallet Backup: ' + name; + var subject = $window.appConfig.nameCase + ' Wallet Backup: ' + name; var body = 'Here is the encrypted backup of the wallet ' + name + ': \n\n' + ew + '\n\n To import this backup, copy all text between {...}, including the symbols {}'; window.plugins.socialsharing.shareViaEmail( body, diff --git a/src/js/controllers/feedback/complete.js b/src/js/controllers/feedback/complete.js new file mode 100644 index 000000000..20e04b44a --- /dev/null +++ b/src/js/controllers/feedback/complete.js @@ -0,0 +1,130 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash) { + $scope.isCordova = platformInfo.isCordova; + var defaults = configService.getDefaults(); + + function quickFeedback(cb) { + window.plugins.spinnerDialog.show(); + $timeout(window.plugins.spinnerDialog.hide, 300); + $timeout(cb, 20); + } + + $scope.shareFacebook = function() { + quickFeedback(function() { + window.plugins.socialsharing.shareVia($scope.shareFacebookVia, null, null, null, defaults.download.url); + }); + }; + + $scope.shareTwitter = function() { + quickFeedback(function() { + window.plugins.socialsharing.shareVia($scope.shareTwitterVia, null, null, null, defaults.download.url); + }); + }; + + $scope.shareGooglePlus = function() { + quickFeedback(function() { + window.plugins.socialsharing.shareVia($scope.shareGooglePlusVia, defaults.download.url); + }); + }; + + $scope.shareEmail = function() { + quickFeedback(function() { + window.plugins.socialsharing.shareViaEmail(defaults.download.url); + }); + }; + + $scope.shareWhatsapp = function() { + quickFeedback(function() { + window.plugins.socialsharing.shareViaWhatsApp(defaults.download.url); + }); + }; + + $scope.shareMessage = function() { + quickFeedback(function() { + window.plugins.socialsharing.shareViaSMS(defaults.download.url); + }); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null; + $scope.skipped = (data.stateParams && data.stateParams.skipped) ? true : false; + $scope.rated = (data.stateParams && data.stateParams.rated) ? true : false; + $scope.fromSettings = (data.stateParams && data.stateParams.fromSettings) ? true : false; + + if (!$scope.fromSettings) { + $ionicConfig.views.swipeBackEnabled(false); + } else { + $ionicNavBarDelegate.showBackButton(true); + $ionicConfig.views.swipeBackEnabled(true); + } + + storageService.getFeedbackInfo(function(error, info) { + var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null; + feedbackInfo.sent = true; + storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {}); + }); + + if (!$scope.isCordova) return; + $scope.animate = true; + + window.plugins.socialsharing.available(function(isAvailable) { + // the boolean is only false on iOS < 6 + $scope.socialsharing = isAvailable; + if (isAvailable) { + window.plugins.socialsharing.canShareVia('com.apple.social.facebook', 'msg', null, null, null, function(e) { + $scope.shareFacebookVia = 'com.apple.social.facebook'; + $scope.facebook = true; + }, function(e) { + window.plugins.socialsharing.canShareVia('com.facebook.katana', 'msg', null, null, null, function(e) { + $scope.shareFacebookVia = 'com.facebook.katana'; + $scope.facebook = true; + }, function(e) { + $log.debug('facebook error: ' + e); + $scope.facebook = false; + }); + }); + window.plugins.socialsharing.canShareVia('com.apple.social.twitter', 'msg', null, null, null, function(e) { + $scope.shareTwitterVia = 'com.apple.social.twitter'; + $scope.twitter = true; + }, function(e) { + window.plugins.socialsharing.canShareVia('com.twitter.android', 'msg', null, null, null, function(e) { + $scope.shareTwitterVia = 'com.twitter.android'; + $scope.twitter = true; + }, function(e) { + $log.debug('twitter error: ' + e); + $scope.twitter = false; + }); + }); + window.plugins.socialsharing.canShareVia('com.google.android.apps.plus', 'msg', null, null, null, function(e) { + $scope.shareGooglePlusVia = 'com.google.android.apps.plus'; + $scope.googleplus = true; + }, function(e) { + $log.debug('googlePlus error: ' + e); + $scope.googleplus = false; + }); + window.plugins.socialsharing.canShareViaEmail(function(e) { + $scope.email = true; + }, function(e) { + $log.debug('email error: ' + e); + $scope.email = false; + }); + window.plugins.socialsharing.canShareVia('whatsapp', 'msg', null, null, null, function(e) { + $scope.whatsapp = true; + }, function(e) { + $log.debug('whatsapp error: ' + e); + $scope.whatsapp = false; + }); + } + }, 100); + }); + + $scope.close = function() { + $ionicHistory.nextViewOptions({ + disableAnimate: false, + historyRoot: true + }); + if ($scope.score == 5) $ionicHistory.goBack(-3); + else $ionicHistory.goBack(-2); + }; +}); diff --git a/src/js/controllers/feedback/rateApp.js b/src/js/controllers/feedback/rateApp.js new file mode 100644 index 000000000..e94982e03 --- /dev/null +++ b/src/js/controllers/feedback/rateApp.js @@ -0,0 +1,50 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, $window, lodash, externalLinkService, configService, platformInfo, feedbackService, ongoingProcess, popupService) { + $scope.score = parseInt($stateParams.score); + var isAndroid = platformInfo.isAndroid; + var isIOS = platformInfo.isIOS; + var isWP = platformInfo.isWP; + var config = configService.getSync(); + + $scope.skip = function() { + var dataSrc = { + "Email": lodash.values(config.emailFor)[0] || ' ', + "Feedback": ' ', + "Score": $stateParams.score, + "AppVersion": $window.version, + "Platform": ionic.Platform.platform(), + "DeviceVersion": ionic.Platform.version() + }; + feedbackService.send(dataSrc, function(err) { + if (err) { + // try to send, but not essential, since the user didn't add a message + $log.warn('Could not send feedback.'); + } + }); + $state.go('tabs.rate.complete', { + score: $stateParams.score, + skipped: true + }); + }; + + $scope.sendFeedback = function() { + $state.go('tabs.rate.send', { + score: $scope.score + }); + }; + + $scope.goAppStore = function() { + var defaults = configService.getDefaults(); + var url; + if (isAndroid) url = defaults.rateApp.android; + if (isIOS) url = defaults.rateApp.ios; + // if (isWP) url = defaults.rateApp.windows; // TODO + externalLinkService.open(url); + $state.go('tabs.rate.complete', { + score: $stateParams.score, + skipped: true, + rated: true + }); + }; +}); diff --git a/src/js/controllers/feedback/rateCard.js b/src/js/controllers/feedback/rateCard.js new file mode 100644 index 000000000..a8162b061 --- /dev/null +++ b/src/js/controllers/feedback/rateCard.js @@ -0,0 +1,59 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('rateCardController', function($scope, $state, $timeout, $log, gettextCatalog, platformInfo, storageService) { + + $scope.isCordova = platformInfo.isCordova; + $scope.score = 0; + + $scope.goFeedbackFlow = function() { + $scope.hideCard(); + if ($scope.isCordova && $scope.score == 5) { + $state.go('tabs.rate.rateApp', { + score: $scope.score + }); + } else { + $state.go('tabs.rate.send', { + score: $scope.score + }); + } + }; + + $scope.setScore = function(score) { + $scope.score = score; + switch ($scope.score) { + case 1: + $scope.button_title = gettextCatalog.getString("I think this app is terrible."); + break; + case 2: + $scope.button_title = gettextCatalog.getString("I don't like it"); + break; + case 3: + $scope.button_title = gettextCatalog.getString("Meh - it's alright"); + break; + case 4: + $scope.button_title = gettextCatalog.getString("I like the app"); + break; + case 5: + $scope.button_title = gettextCatalog.getString("This app is fantastic!"); + break; + } + $timeout(function() { + $scope.$apply(); + }); + }; + + $scope.hideCard = function() { + $log.debug('Feedback card dismissed.') + storageService.getFeedbackInfo(function(error, info) { + var feedbackInfo = JSON.parse(info); + feedbackInfo.sent = true; + storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() { + $scope.showRateCard.value = false; + $timeout(function() { + $scope.$apply(); + }, 100); + }); + }); + } + +}); diff --git a/src/js/controllers/feedback/send.js b/src/js/controllers/feedback/send.js new file mode 100644 index 000000000..aef8df948 --- /dev/null +++ b/src/js/controllers/feedback/send.js @@ -0,0 +1,92 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, $window, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess) { + + $scope.sendFeedback = function(feedback, goHome) { + + var config = configService.getSync(); + + var dataSrc = { + "Email": lodash.values(config.emailFor)[0] || ' ', + "Feedback": goHome ? ' ' : feedback, + "Score": $stateParams.score || ' ', + "AppVersion": $window.version, + "Platform": ionic.Platform.platform(), + "DeviceVersion": ionic.Platform.version() + }; + + if (!goHome) ongoingProcess.set('sendingFeedback', true); + feedbackService.send(dataSrc, function(err) { + if (goHome) return; + ongoingProcess.set('sendingFeedback', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Feedback could not be submitted. Please try again later.')); + return; + } + if (!$stateParams.score) { + popupService.showAlert(gettextCatalog.getString('Thank you!'), gettextCatalog.getString('A member of the team will review your feedback as soon as possible.'), function() { + $scope.feedback.value = ''; + $ionicHistory.nextViewOptions({ + disableAnimate: false, + historyRoot: true + }); + $ionicHistory.goBack(); + }, gettextCatalog.getString('Finish')); + return; + } + $state.go('tabs.rate.complete', { + score: $stateParams.score + }); + }); + if (goHome) $state.go('tabs.home'); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null; + $scope.feedback = {}; + + if ($scope.score) { + $ionicConfig.views.swipeBackEnabled(false); + } + + switch ($scope.score) { + case 1: + $scope.reaction = "Ouch!"; + $scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?"); + break; + case 2: + $scope.reaction = gettextCatalog.getString("Oh no!"); + $scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?"); + break; + case 3: + $scope.reaction = "Hmm..."; + $scope.comment = gettextCatalog.getString("We'd love to do better.") + ' ' + gettextCatalog.getString("How could we improve your experience?"); + break; + case 4: + $scope.reaction = gettextCatalog.getString("Thanks!"); + $scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you – how could we improve your experience?"); + break; + case 5: + $scope.reaction = gettextCatalog.getString("Thank you!"); + $scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay.") + ' ' + gettextCatalog.getString("Is there anything we could do better?"); + break; + default: + $scope.justFeedback = true; + $scope.comment = gettextCatalog.getString("We're always looking for ways to improve BitPay. How could we improve your experience?"); + break; + } + }); + + $scope.$on("$ionicView.afterEnter", function() { + $scope.showForm = true; + }); + + $scope.goBack = function() { + $ionicHistory.nextViewOptions({ + disableAnimate: false, + historyRoot: true + }); + $ionicHistory.goBack(); + }; + +}); diff --git a/src/js/controllers/glidera.js b/src/js/controllers/glidera.js index f3fc9af6c..bb746274f 100644 --- a/src/js/controllers/glidera.js +++ b/src/js/controllers/glidera.js @@ -18,9 +18,11 @@ angular.module('copayApp.controllers').controller('glideraController', $scope.status = null; $scope.limits = null; + $scope.connectingGlidera = true; ongoingProcess.set('connectingGlidera', true); glideraService.init($scope.token, function(err, glidera) { ongoingProcess.set('connectingGlidera'); + $scope.connectingGlidera = false; if (err || !glidera) { if (err) popupService.showAlert(gettextCatalog.getString('Error'), err); return; @@ -67,11 +69,11 @@ angular.module('copayApp.controllers').controller('glideraController', } }; - this.getAuthenticateUrl = function() { + $scope.getAuthenticateUrl = function() { return glideraService.getOauthCodeUrl(); }; - this.submitOauthCode = function(code) { + $scope.submitOauthCode = function(code) { ongoingProcess.set('connectingGlidera', true); $timeout(function() { glideraService.getToken(code, function(err, data) { @@ -90,10 +92,7 @@ angular.module('copayApp.controllers').controller('glideraController', }, 100); }; - this.openTxModal = function(token, tx) { - var self = this; - - $scope.self = self; + $scope.openTxModal = function(token, tx) { $scope.tx = tx; glideraService.getTransaction(token, tx.transactionUuid, function(err, tx) { diff --git a/src/js/controllers/headController.js b/src/js/controllers/headController.js index 663126321..a33c2d8be 100644 --- a/src/js/controllers/headController.js +++ b/src/js/controllers/headController.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('headController', - function($scope, $window, $log, glideraService) { + function($scope, $window, $log) { $scope.appConfig = $window.appConfig; $log.info('Running head controller:' + $window.appConfig.nameCase) }); diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js index af9dd6e31..9c8ae8873 100644 --- a/src/js/controllers/import.js +++ b/src/js/controllers/import.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('importController', - function($scope, $timeout, $log, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, profileService, configService, sjcl, ledger, trezor, derivationPathHelper, platformInfo, bwcService, ongoingProcess, walletService, popupService, gettextCatalog) { + function($scope, $timeout, $log, $state, $stateParams, $ionicHistory, $ionicScrollDelegate, profileService, configService, sjcl, ledger, trezor, derivationPathHelper, platformInfo, bwcService, ongoingProcess, walletService, popupService, gettextCatalog, $window) { var isChromeApp = platformInfo.isChromeApp; var isDevel = platformInfo.isDevel; @@ -17,6 +17,7 @@ angular.module('copayApp.controllers').controller('importController', $scope.formData.derivationPath = derivationPathHelper.default; $scope.formData.account = 1; $scope.importErr = false; + $scope.showHardwareWallet = $window.appConfig.name == 'copay'; if ($stateParams.code) $scope.processWalletInfo($stateParams.code); @@ -359,7 +360,11 @@ angular.module('copayApp.controllers').controller('importController', $scope.resizeView = function() { $timeout(function() { $ionicScrollDelegate.resize(); - }); + }, 10); }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.init(); + }); + }); diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js index c358b7fc9..8dbf6cffb 100644 --- a/src/js/controllers/join.js +++ b/src/js/controllers/join.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('joinController', - function($scope, $rootScope, $timeout, $state, $ionicHistory, $ionicScrollDelegate, profileService, configService, storageService, applicationService, gettext, gettextCatalog, lodash, ledger, trezor, platformInfo, derivationPathHelper, ongoingProcess, walletService, $log, $stateParams, popupService) { + function($scope, $rootScope, $timeout, $state, $ionicHistory, $ionicScrollDelegate, profileService, configService, storageService, applicationService, gettextCatalog, lodash, ledger, trezor, platformInfo, derivationPathHelper, ongoingProcess, walletService, $log, $stateParams, popupService, $window) { var isChromeApp = platformInfo.isChromeApp; var isDevel = platformInfo.isDevel; @@ -20,7 +20,7 @@ angular.module('copayApp.controllers').controller('joinController', $scope.resizeView = function() { $timeout(function() { $ionicScrollDelegate.resize(); - }); + }, 10); checkPasswordFields(); }; @@ -50,26 +50,33 @@ angular.module('copayApp.controllers').controller('joinController', var updateSeedSourceSelect = function() { self.seedOptions = [{ id: 'new', - label: gettext('Random'), + label: gettextCatalog.getString('Random'), }, { id: 'set', - label: gettext('Specify Recovery Phrase...'), + label: gettextCatalog.getString('Specify Recovery Phrase...'), }]; $scope.seedSource = self.seedOptions[0]; + /* - if (isChromeApp) { - self.seedOptions.push({ - id: 'ledger', - label: 'Ledger Hardware Wallet', - }); - } + Disable Hardware Wallets - if (isChromeApp || isDevel) { - self.seedOptions.push({ - id: 'trezor', - label: 'Trezor Hardware Wallet', - }); + */ + + if ($window.appConfig.name == 'copay') { + if (isChromeApp) { + self.seedOptions.push({ + id: 'ledger', + label: 'Ledger Hardware Wallet', + }); + } + + if (isChromeApp || isDevel) { + self.seedOptions.push({ + id: 'trezor', + label: 'Trezor Hardware Wallet', + }); + } } }; diff --git a/src/js/controllers/modals/amazonCardDetails.js b/src/js/controllers/modals/amazonCardDetails.js index ffe54b713..b567c99b1 100644 --- a/src/js/controllers/modals/amazonCardDetails.js +++ b/src/js/controllers/modals/amazonCardDetails.js @@ -62,8 +62,8 @@ angular.module('copayApp.controllers').controller('amazonCardDetailsController', $scope.amazonCardDetailsModal.hide(); }; - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { - externalLinkService.open(url, optIn, title, message, okText, cancelText); + $scope.openExternalLink = function(url) { + externalLinkService.open(url); }; }); diff --git a/src/js/controllers/modals/customAmount.js b/src/js/controllers/modals/customAmount.js deleted file mode 100644 index 386ed1073..000000000 --- a/src/js/controllers/modals/customAmount.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('customAmountController', function($scope, $timeout, $filter, platformInfo, rateService) { - var self = $scope.self; - - $scope.unitName = self.unitName; - $scope.alternativeAmount = self.alternativeAmount; - $scope.alternativeName = self.alternativeName; - $scope.alternativeIsoCode = self.alternativeIsoCode; - $scope.isRateAvailable = self.isRateAvailable; - $scope.unitToSatoshi = self.unitToSatoshi; - $scope.unitDecimals = self.unitDecimals; - var satToUnit = 1 / self.unitToSatoshi; - $scope.showAlternative = false; - $scope.isCordova = platformInfo.isCordova; - - Object.defineProperty($scope, - "_customAlternative", { - get: function() { - return $scope.customAlternative; - }, - set: function(newValue) { - $scope.customAlternative = newValue; - if (typeof(newValue) === 'number' && $scope.isRateAvailable) { - $scope.customAmount = parseFloat((rateService.fromFiat(newValue, $scope.alternativeIsoCode) * satToUnit).toFixed($scope.unitDecimals), 10); - } else { - $scope.customAmount = null; - } - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty($scope, - "_customAmount", { - get: function() { - return $scope.customAmount; - }, - set: function(newValue) { - $scope.customAmount = newValue; - if (typeof(newValue) === 'number' && $scope.isRateAvailable) { - $scope.customAlternative = parseFloat((rateService.toFiat(newValue * $scope.unitToSatoshi, $scope.alternativeIsoCode)).toFixed(2), 10); - } else { - $scope.customAlternative = null; - } - $scope.alternativeAmount = $scope.customAlternative; - }, - enumerable: true, - configurable: true - }); - - $scope.submitForm = function(form) { - var satToBtc = 1 / 100000000; - var amount = form.amount.$modelValue; - var amountSat = parseInt((amount * $scope.unitToSatoshi).toFixed(0)); - $timeout(function() { - $scope.customizedAmountUnit = amount + ' ' + $scope.unitName; - $scope.customizedAlternativeUnit = $filter('formatFiatAmount')(form.alternative.$modelValue) + ' ' + $scope.alternativeIsoCode; - if ($scope.unitName == 'bits') { - amount = (amountSat * satToBtc).toFixed(8); - } - $scope.customizedAmountBtc = amount; - }, 1); - }; - - $scope.toggleAlternative = function() { - $scope.showAlternative = !$scope.showAlternative; - }; - - $scope.shareAddress = function(uri) { - if (platformInfo.isCordova) { - window.plugins.socialsharing.share(uri, null, null, null); - } - }; - - $scope.cancel = function() { - $scope.customAmountModal.hide(); - }; -}); diff --git a/src/js/controllers/modals/search.js b/src/js/controllers/modals/search.js index ed1861074..963e89e18 100644 --- a/src/js/controllers/modals/search.js +++ b/src/js/controllers/modals/search.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('searchController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) { +angular.module('copayApp.controllers').controller('searchController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicScrollDelegate, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService) { var HISTORY_SHOW_LIMIT = 10; var currentTxHistoryPage = 0; diff --git a/src/js/controllers/modals/txpDetails.js b/src/js/controllers/modals/txpDetails.js index d67c2f7a4..a5783de17 100644 --- a/src/js/controllers/modals/txpDetails.js +++ b/src/js/controllers/modals/txpDetails.js @@ -1,9 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('txpDetailsController', function($scope, $rootScope, $timeout, $interval, $ionicModal, $log, ongoingProcess, platformInfo, $ionicScrollDelegate, txFormatService, fingerprintService, bwcError, gettextCatalog, lodash, walletService, popupService, $state, $ionicHistory) { - var self = $scope.self; - var tx = $scope.tx; - var copayers = $scope.copayers; +angular.module('copayApp.controllers').controller('txpDetailsController', function($scope, $rootScope, $timeout, $interval, $log, ongoingProcess, platformInfo, $ionicScrollDelegate, txFormatService, bwcError, gettextCatalog, lodash, walletService, popupService, $ionicHistory) { var isGlidera = $scope.isGlidera; var GLIDERA_LOCK_TIME = 6 * 60 * 60; var now = Math.floor(Date.now() / 1000); @@ -18,8 +15,8 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi $scope.color = $scope.wallet.color; $scope.data = {}; $scope.hasClick = platformInfo.hasClick; - $scope.displayAmount = getDisplayAmount(tx.amountStr); - $scope.displayUnit = getDisplayUnit(tx.amountStr); + $scope.displayAmount = getDisplayAmount($scope.tx.amountStr); + $scope.displayUnit = getDisplayUnit($scope.tx.amountStr); initActionList(); checkPaypro(); } @@ -46,12 +43,12 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi $scope.actionList.push({ type: 'created', - time: tx.createdOn, + time: $scope.tx.createdOn, description: actionDescriptions['created'], - by: tx.creatorName + by: $scope.tx.creatorName }); - lodash.each(tx.actions, function(action) { + lodash.each($scope.tx.actions, function(action) { $scope.actionList.push({ type: action.type, time: action.createdOn, @@ -61,103 +58,14 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi }); }; - $scope.$on('accepted', function(event) { - $scope.sign(); - }); - - // ToDo: use tx.customData instead of tx.message - if (tx.message === 'Glidera transaction' && isGlidera) { - tx.isGlidera = true; - if (tx.canBeRemoved) { - tx.canBeRemoved = (Date.now() / 1000 - (tx.ts || tx.createdOn)) > GLIDERA_LOCK_TIME; - } - } - - var setSendError = function(msg) { - $scope.sendStatus = ''; - var error = msg || gettextCatalog.getString('Could not send payment'); - popupService.showAlert(gettextCatalog.getString('Error'), error); - } - - $scope.sign = function(onSendStatusChange) { - $scope.loading = true; - walletService.publishAndSign($scope.wallet, $scope.tx, function(err, txp) { - $scope.$emit('UpdateTx'); - if (err) return setSendError(err); - success(); - }, onSendStatusChange); - }; - - function setError(err, prefix) { - $scope.loading = false; - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err, prefix)); - }; - - $scope.reject = function(txp) { - var title = gettextCatalog.getString('Warning!'); - var msg = gettextCatalog.getString('Are you sure you want to reject this transaction?'); - popupService.showConfirm(title, msg, null, null, function(res) { - if (res) { - $scope.loading = true; - - walletService.reject($scope.wallet, $scope.tx, function(err, txpr) { - if (err) - return setError(err, gettextCatalog.getString('Could not reject payment')); - - $scope.close(); - }); - } - }); - }; - - $scope.remove = function() { - $scope.loading = true; - - $timeout(function() { - ongoingProcess.set('removeTx', true); - walletService.removeTx($scope.wallet, $scope.tx, function(err) { - ongoingProcess.set('removeTx', false); - - // Hacky: request tries to parse an empty response - if (err && !(err.message && err.message.match(/Unexpected/))) { - $scope.$emit('UpdateTx'); - return setError(err, gettextCatalog.getString('Could not delete payment proposal')); - } - - $scope.close(); - }); - }, 10); - }; - - $scope.broadcast = function(txp) { - $scope.loading = true; - - $timeout(function() { - ongoingProcess.set('broadcastTx', true); - walletService.broadcastTx($scope.wallet, $scope.tx, function(err, txpb) { - ongoingProcess.set('broadcastTx', false); - - if (err) { - return setError(err, gettextCatalog.getString('Could not broadcast payment')); - } - - $scope.close(); - }); - }, 10); - }; - - $scope.getShortNetworkName = function() { - return $scope.wallet.credentials.networkName.substring(0, 4); - }; - function checkPaypro() { - if (tx.payProUrl && !platformInfo.isChromeApp) { + if ($scope.tx.payProUrl && !platformInfo.isChromeApp) { $scope.wallet.fetchPayPro({ - payProUrl: tx.payProUrl, + payProUrl: $scope.tx.payProUrl, }, function(err, paypro) { if (err) return; - tx.paypro = paypro; - paymentTimeControl(tx.paypro.expires); + $scope.tx.paypro = paypro; + paymentTimeControl($scope.tx.paypro.expires); $timeout(function() { $ionicScrollDelegate.resize(); }, 10); @@ -187,32 +95,132 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi }; }; - lodash.each(['TxProposalRejectedBy', 'TxProposalAcceptedBy', 'transactionProposalRemoved', 'TxProposalRemoved', 'NewOutgoingTx', 'UpdateTx'], function(eventName) { - $rootScope.$on(eventName, function() { - $scope.wallet.getTx($scope.tx.id, function(err, tx) { - if (err) { - if (err.message && err.message == 'TX_NOT_FOUND' && - (eventName == 'transactionProposalRemoved' || eventName == 'TxProposalRemoved')) { - $scope.tx.removed = true; - $scope.tx.canBeRemoved = false; - $scope.tx.pendingForUs = false; - $scope.$apply(); + $scope.$on('accepted', function(event) { + $scope.sign(); + }); + + // ToDo: use tx.customData instead of tx.message + if ($scope.tx.message === 'Glidera transaction' && isGlidera) { + $scope.tx.isGlidera = true; + if ($scope.tx.canBeRemoved) { + $scope.tx.canBeRemoved = (Date.now() / 1000 - ($scope.tx.ts || $scope.tx.createdOn)) > GLIDERA_LOCK_TIME; + } + } + + var setError = function(err, prefix) { + $scope.sendStatus = ''; + $scope.loading = false; + popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err, prefix)); + }; + + $scope.sign = function(onSendStatusChange) { + $scope.loading = true; + walletService.publishAndSign($scope.wallet, $scope.tx, function(err, txp) { + $scope.$emit('UpdateTx'); + if (err) return setError(err, gettextCatalog.getString('Could not send payment')); + success(); + }, onSendStatusChange); + }; + + $scope.reject = function(txp) { + var title = gettextCatalog.getString('Warning!'); + var msg = gettextCatalog.getString('Are you sure you want to reject this transaction?'); + popupService.showConfirm(title, msg, null, null, function(res) { + if (res) { + $scope.loading = true; + + walletService.reject($scope.wallet, $scope.tx, function(err, txpr) { + if (err) + return setError(err, gettextCatalog.getString('Could not reject payment')); + + $scope.close(); + }); + } + }); + }; + + $scope.remove = function() { + var title = gettextCatalog.getString('Warning!'); + var msg = gettextCatalog.getString('Are you sure you want to remove this transaction?'); + popupService.showConfirm(title, msg, null, null, function(res) { + if (res) { + ongoingProcess.set('removeTx', true); + walletService.removeTx($scope.wallet, $scope.tx, function(err) { + ongoingProcess.set('removeTx', false); + + // Hacky: request tries to parse an empty response + if (err && !(err.message && err.message.match(/Unexpected/))) { + $scope.$emit('UpdateTx'); + return setError(err, gettextCatalog.getString('Could not delete payment proposal')); } - return; + + $scope.close(); + }); + } + }); + }; + + $scope.broadcast = function(txp) { + $scope.loading = true; + + $timeout(function() { + ongoingProcess.set('broadcastingTx', true); + walletService.broadcastTx($scope.wallet, $scope.tx, function(err, txpb) { + ongoingProcess.set('broadcastingTx', false); + + if (err) { + return setError(err, gettextCatalog.getString('Could not broadcast payment')); } - var action = lodash.find(tx.actions, { - copayerId: $scope.wallet.credentials.copayerId - }); - - $scope.tx = txFormatService.processTx(tx); - - if (!action && tx.status == 'pending') - $scope.tx.pendingForUs = true; - - $scope.updateCopayerList(); - $scope.$apply(); + $scope.close(); }); + }, 10); + }; + + $scope.getShortNetworkName = function() { + return $scope.wallet.credentials.networkName.substring(0, 4); + }; + + var updateTxInfo = function(eventName) { + $scope.wallet.getTx($scope.tx.id, function(err, tx) { + if (err) { + if (err.message && err.message == 'Transaction proposal not found' && + (eventName == 'transactionProposalRemoved' || eventName == 'TxProposalRemoved')) { + $scope.tx.removed = true; + $scope.tx.canBeRemoved = false; + $scope.tx.pendingForUs = false; + $scope.$apply(); + } + return; + } + + var action = lodash.find(tx.actions, { + copayerId: $scope.wallet.credentials.copayerId + }); + + $scope.tx = txFormatService.processTx(tx); + + if (!action && tx.status == 'pending') + $scope.tx.pendingForUs = true; + + $scope.updateCopayerList(); + initActionList(); + $scope.$apply(); + }); + }; + + var bwsEvent = $rootScope.$on('bwsEvent', function(e, walletId, type, n) { + lodash.each([ + 'TxProposalRejectedBy', + 'TxProposalAcceptedBy', + 'transactionProposalRemoved', + 'TxProposalRemoved', + 'NewOutgoingTx', + 'UpdateTx' + ], function(eventName) { + if (walletId == $scope.wallet.id && type == eventName) { + updateTxInfo(eventName); + } }); }); @@ -252,6 +260,7 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi }; $scope.close = function() { + bwsEvent(); $scope.loading = null; $scope.txpDetailsModal.hide(); }; diff --git a/src/js/controllers/onboarding/backupWarning.js b/src/js/controllers/onboarding/backupWarning.js index ee57c03d5..f6e6ab68c 100644 --- a/src/js/controllers/onboarding/backupWarning.js +++ b/src/js/controllers/onboarding/backupWarning.js @@ -9,8 +9,8 @@ angular.module('copayApp.controllers').controller('backupWarningController', fun $scope.openPopup = function() { $ionicModal.fromTemplateUrl('views/includes/screenshotWarningModal.html', { scope: $scope, - backdropClickToClose: false, - hardwareBackButtonClose: false + backdropClickToClose: true, + hardwareBackButtonClose: true }).then(function(modal) { $scope.warningModal = modal; $scope.warningModal.show(); diff --git a/src/js/controllers/onboarding/disclaimer.js b/src/js/controllers/onboarding/disclaimer.js index a18be4e6d..7609b64f5 100644 --- a/src/js/controllers/onboarding/disclaimer.js +++ b/src/js/controllers/onboarding/disclaimer.js @@ -1,17 +1,18 @@ 'use strict'; -angular.module('copayApp.controllers').controller('disclaimerController', function($scope, $timeout, $state, $log, $ionicModal, profileService, uxLanguage, externalLinkService, storageService, $stateParams, startupService) { +angular.module('copayApp.controllers').controller('disclaimerController', function($scope, $timeout, $state, $log, $ionicModal, profileService, uxLanguage, externalLinkService, storageService, $stateParams, startupService, $rootScope) { $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); }); - $scope.init = function() { $scope.lang = uxLanguage.currentLanguage; $scope.terms = {}; - $scope.accept1 = $scope.accept2 = $scope.accept3 = false; + $scope.accepted = {}; + $scope.accepted.first = $scope.accepted.second = $scope.accepted.third = false; $scope.backedUp = $stateParams.backedUp; $scope.resume = $stateParams.resume; + $scope.shrinkView = false; $timeout(function() { $scope.$apply(); }, 1); @@ -32,14 +33,9 @@ angular.module('copayApp.controllers').controller('disclaimerController', functi externalLinkService.open(url, target); }; - $scope.openTermsModal = function() { - $ionicModal.fromTemplateUrl('views/modals/terms.html', { - scope: $scope - }).then(function(modal) { - $scope.termsModal = modal; - $scope.termsModal.show(); - }); - }; + $scope.openTerms = function() { + $scope.shrinkView = !$scope.shrinkView; + } $scope.goBack = function() { $state.go('onboarding.backupRequest', { diff --git a/src/js/controllers/onboarding/terms.js b/src/js/controllers/onboarding/terms.js index f06b8ca20..7cab71203 100644 --- a/src/js/controllers/onboarding/terms.js +++ b/src/js/controllers/onboarding/terms.js @@ -1,8 +1,7 @@ 'use strict'; -angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, $window, uxLanguage, profileService, externalLinkService) { +angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, $window, uxLanguage, profileService, externalLinkService, gettextCatalog) { $scope.lang = uxLanguage.currentLanguage; - $scope.disclaimerUrl = $window.appConfig.disclaimerUrl; $scope.confirm = function() { profileService.setDisclaimerAccepted(function(err) { @@ -15,7 +14,13 @@ angular.module('copayApp.controllers').controller('termsController', function($s }); }; - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { + $scope.openExternalLink = function() { + var url = $window.appConfig.disclaimerUrl; + var optIn = true; + var title = gettextCatalog.getString('View Terms of Service'); + var message = gettextCatalog.getString('The official English Terms of Service are available on the BitPay website. Would you like to view them?'); + var okText = gettextCatalog.getString('Open Website'); + var cancelText = gettextCatalog.getString('Go Back'); externalLinkService.open(url, optIn, title, message, okText, cancelText); }; diff --git a/src/js/controllers/onboarding/welcomeController.js b/src/js/controllers/onboarding/welcomeController.js index 3a1651f75..1a7e3a6a6 100644 --- a/src/js/controllers/onboarding/welcomeController.js +++ b/src/js/controllers/onboarding/welcomeController.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('welcomeController', function($scope, $state, $timeout, $ionicConfig, $log, profileService, startupService) { +angular.module('copayApp.controllers').controller('welcomeController', function($scope, $state, $timeout, $ionicConfig, $log, profileService, startupService, storageService) { $ionicConfig.views.swipeBackEnabled(false); diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index b460b125e..5d9be8376 100644 --- a/src/js/controllers/paperWallet.js +++ b/src/js/controllers/paperWallet.js @@ -1,24 +1,14 @@ angular.module('copayApp.controllers').controller('paperWalletController', - function($scope, $timeout, $log, $ionicModal, $ionicHistory, popupService, gettextCatalog, platformInfo, configService, profileService, $state, bitcore, ongoingProcess, txFormatService, $stateParams, walletService) { - - $scope.onQrCodeScanned = function(data) { - $scope.formData.inputData = data; - $scope.onData(data); - }; - - $scope.onData = function(data) { - $scope.scannedKey = data; - $scope.isPkEncrypted = (data.substring(0, 2) == '6P'); - }; + function($scope, $timeout, $log, $ionicModal, $ionicHistory, feeService, popupService, gettextCatalog, platformInfo, configService, profileService, $state, bitcore, ongoingProcess, txFormatService, $stateParams, walletService) { function _scanFunds(cb) { function getPrivateKey(scannedKey, isPkEncrypted, passphrase, cb) { if (!isPkEncrypted) return cb(null, scannedKey); - wallet.decryptBIP38PrivateKey(scannedKey, passphrase, null, cb); + $scope.wallet.decryptBIP38PrivateKey(scannedKey, passphrase, null, cb); }; function getBalance(privateKey, cb) { - wallet.getBalanceFromPrivateKey(privateKey, cb); + $scope.wallet.getBalanceFromPrivateKey(privateKey, cb); }; function checkPrivateKey(privateKey) { @@ -42,9 +32,6 @@ angular.module('copayApp.controllers').controller('paperWalletController', }; $scope.scanFunds = function() { - $scope.privateKey = ''; - $scope.balanceSat = 0; - ongoingProcess.set('scanning', true); $timeout(function() { _scanFunds(function(err, privateKey, balance) { @@ -52,32 +39,40 @@ angular.module('copayApp.controllers').controller('paperWalletController', if (err) { $log.error(err); popupService.showAlert(gettextCatalog.getString('Error scanning funds:'), err || err.toString()); + $state.go('tabs.home'); } else { $scope.privateKey = privateKey; $scope.balanceSat = balance; + if ($scope.balanceSat <= 0) + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Not funds found')); var config = configService.getSync().wallet.settings; $scope.balance = txFormatService.formatAmount(balance) + ' ' + config.unitName; - $scope.scanned = true; } - $scope.$apply(); }); }, 100); }; function _sweepWallet(cb) { - walletService.getAddress(wallet, true, function(err, destinationAddress) { + walletService.getAddress($scope.wallet, true, function(err, destinationAddress) { if (err) return cb(err); - wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, null, function(err, tx) { + $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, null, function(err, testTx) { if (err) return cb(err); - - wallet.broadcastRawTx({ - rawTx: tx.serialize(), - network: 'livenet' - }, function(err, txid) { - if (err) return cb(err); - return cb(null, destinationAddress, txid); + var rawTxLength = testTx.serialize().length; + feeService.getCurrentFeeValue('livenet', function(err, feePerKB) { + var opts = {}; + opts.fee = Math.round((feePerKB * rawTxLength) / 2000); + $scope.wallet.buildTxFromPrivateKey($scope.privateKey, destinationAddress, opts, function(err, tx) { + if (err) return cb(err); + $scope.wallet.broadcastRawTx({ + rawTx: tx.serialize(), + network: 'livenet' + }, function(err, txid) { + if (err) return cb(err); + return cb(null, destinationAddress, txid); + }); + }); }); }); }); @@ -95,45 +90,61 @@ angular.module('copayApp.controllers').controller('paperWalletController', $log.error(err); popupService.showAlert(gettextCatalog.getString('Error sweeping wallet:'), err || err.toString()); } else { - $scope.openStatusModal('broadcasted', function() { - $ionicHistory.removeBackView(); - $state.go('tabs.home'); - }); + $scope.sendStatus = 'success'; } $scope.$apply(); }); }, 100); }; - $scope.openStatusModal = function(type, cb) { - $scope.tx = {}; - $scope.tx.amountStr = $scope.balance; - $scope.type = type; - $scope.color = wallet.backgroundColor; - $scope.cb = cb; - - $ionicModal.fromTemplateUrl('views/modals/tx-status.html', { - scope: $scope - }).then(function(modal) { - $scope.txStatusModal = modal; - $scope.txStatusModal.show(); - }); + $scope.onSuccessConfirm = function() { + $state.go('tabs.home'); }; - $scope.$on("$ionicView.beforeEnter", function(event, data) { - var wallet = profileService.getWallet($stateParams.walletId); + $scope.$on('Wallet/Changed', function(event, wallet) { + if (!wallet) { + $log.debug('No wallet provided'); + return; + } + if (wallet == $scope.wallet) { + $log.debug('No change in wallet'); + return; + } $scope.wallet = wallet; - $scope.needsBackup = wallet.needsBackup; - $scope.walletAlias = wallet.name; - $scope.walletName = wallet.credentials.walletName; - $scope.formData = {}; - $scope.formData.inputData = null; - $scope.scannedKey = null; - $scope.balance = null; - $scope.balanceSat = null; - $scope.scanned = false; + $log.debug('Wallet changed: ' + wallet.name); $timeout(function() { $scope.$apply(); - }, 10); + }); }); + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.scannedKey = (data.stateParams && data.stateParams.privateKey) ? data.stateParams.privateKey : null; + $scope.isPkEncrypted = $scope.scannedKey ? ($scope.scannedKey.substring(0, 2) == '6P') : null; + $scope.sendStatus = null; + $scope.error = false; + + $scope.wallets = profileService.getWallets({ + onlyComplete: true, + network: 'livenet', + }); + + if (!$scope.wallets || !$scope.wallets.length) { + $scope.noMatchingWallet = true; + return; + } + }); + + $scope.$on("$ionicView.enter", function(event, data) { + $scope.wallet = $scope.wallets[0]; + if (!$scope.wallet) return; + if (!$scope.isPkEncrypted) $scope.scanFunds(); + else { + var message = gettextCatalog.getString('Private key encrypted. Enter password'); + popupService.showPrompt(null, message, null, function(res) { + $scope.passphrase = res; + $scope.scanFunds(); + }); + } + }); + }); diff --git a/src/js/controllers/preferences.js b/src/js/controllers/preferences.js index bed1da88f..8b1a8dde0 100644 --- a/src/js/controllers/preferences.js +++ b/src/js/controllers/preferences.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesController', - function($scope, $rootScope, $timeout, $log, $stateParams, $ionicHistory, gettextCatalog, configService, profileService, fingerprintService, walletService) { + function($scope, $rootScope, $timeout, $log, $stateParams, $ionicHistory, configService, profileService, fingerprintService, walletService) { var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.credentials.walletId; $scope.wallet = wallet; @@ -10,6 +10,16 @@ angular.module('copayApp.controllers').controller('preferencesController', value: walletService.isEncrypted(wallet) }; + $scope.hiddenBalanceChange = function() { + var opts = { + balance: { + enabled: $scope.hiddenBalance.value + } + }; + profileService.toggleHideBalanceFlag(walletId, function(err) { + if (err) $log.error(err); + }); + }; $scope.encryptChange = function() { if (!wallet) return; @@ -75,7 +85,9 @@ angular.module('copayApp.controllers').controller('preferencesController', var config = configService.getSync(); - + $scope.hiddenBalance = { + value: $scope.wallet.balanceHidden + }; if (wallet.isPrivKeyExternal) $scope.externalSource = wallet.getPrivKeyExternalSourceName() == 'ledger' ? 'Ledger' : 'Trezor'; diff --git a/src/js/controllers/preferencesAbout.js b/src/js/controllers/preferencesAbout.js index e8369abd7..4b71e5c7e 100644 --- a/src/js/controllers/preferencesAbout.js +++ b/src/js/controllers/preferencesAbout.js @@ -6,9 +6,14 @@ angular.module('copayApp.controllers').controller('preferencesAbout', $scope.title = gettextCatalog.getString('About') + ' ' + $window.appConfig.nameCase; $scope.version = $window.version; $scope.commitHash = $window.commitHash; - $scope.name = $window.appConfig.gitHubRepoName; - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { + $scope.openExternalLink = function() { + var url = 'https://github.com/bitpay/' + $window.appConfig.gitHubRepoName + '/tree/' + $window.commitHash + ''; + var optIn = true; + var title = gettextCatalog.getString('Open GitHub Project'); + var message = gettextCatalog.getString('You can see the latest developments and contribute to this open source app by visiting our project on GitHub.'); + var okText = gettextCatalog.getString('Open GitHub'); + var cancelText = gettextCatalog.getString('Go Back'); externalLinkService.open(url, optIn, title, message, okText, cancelText); }; }); diff --git a/src/js/controllers/preferencesAlias.js b/src/js/controllers/preferencesAlias.js index 5060335c1..8cb9f2670 100644 --- a/src/js/controllers/preferencesAlias.js +++ b/src/js/controllers/preferencesAlias.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesAliasController', - function($scope, $timeout, $stateParams, $ionicHistory, gettextCatalog, configService, profileService, walletService) { + function($scope, $timeout, $stateParams, $ionicHistory, configService, profileService, walletService) { var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.credentials.walletId; var config = configService.getSync(); diff --git a/src/js/controllers/preferencesAltCurrency.js b/src/js/controllers/preferencesAltCurrency.js index f542c205a..6e45f40bc 100644 --- a/src/js/controllers/preferencesAltCurrency.js +++ b/src/js/controllers/preferencesAltCurrency.js @@ -1,22 +1,35 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesAltCurrencyController', - function($scope, $log, $timeout, $ionicHistory, gettextCatalog, configService, rateService, lodash, profileService, walletService) { + function($scope, $log, $timeout, $ionicHistory, configService, rateService, lodash, profileService, walletService, storageService) { var next = 10; var completeAlternativeList; - var config = configService.getSync(); - $scope.currentCurrency = config.wallet.settings.alternativeIsoCode; - $scope.listComplete = false; + function init() { + var unusedCurrencyList = [{ + isoCode: 'LTL' + }, { + isoCode: 'BTC' + }]; + rateService.whenAvailable(function() { - rateService.whenAvailable(function() { - completeAlternativeList = rateService.listAlternatives(); - lodash.remove(completeAlternativeList, function(c) { - return c.isoCode == 'BTC'; + $scope.listComplete = false; + + var idx = lodash.indexBy(unusedCurrencyList, 'isoCode'); + var idx2 = lodash.indexBy($scope.lastUsedAltCurrencyList, 'isoCode'); + + completeAlternativeList = lodash.reject(rateService.listAlternatives(true), function(c) { + return idx[c.isoCode] || idx2[c.isoCode]; + }); + + $scope.altCurrencyList = completeAlternativeList.slice(0, 10); + + $timeout(function() { + $scope.$apply(); + }); }); - $scope.altCurrencyList = completeAlternativeList.slice(0, next); - }); + } $scope.loadMore = function() { $timeout(function() { @@ -27,6 +40,17 @@ angular.module('copayApp.controllers').controller('preferencesAltCurrencyControl }, 100); }; + $scope.findCurrency = function(search) { + if (!search) init(); + $scope.altCurrencyList = lodash.filter(completeAlternativeList, function(item) { + var val = item.name; + return lodash.includes(val.toLowerCase(), search.toLowerCase()); + }); + $timeout(function() { + $scope.$apply(); + }); + }; + $scope.save = function(newAltCurrency) { var opts = { wallet: { @@ -41,9 +65,27 @@ angular.module('copayApp.controllers').controller('preferencesAltCurrencyControl if (err) $log.warn(err); $ionicHistory.goBack(); + saveLastUsed(newAltCurrency); walletService.updateRemotePreferences(profileService.getWallets(), {}, function() { $log.debug('Remote preferences saved'); }); }); }; + + function saveLastUsed(newAltCurrency) { + $scope.lastUsedAltCurrencyList.unshift(newAltCurrency); + $scope.lastUsedAltCurrencyList = lodash.uniq($scope.lastUsedAltCurrencyList, 'isoCode'); + $scope.lastUsedAltCurrencyList = $scope.lastUsedAltCurrencyList.slice(0, 3); + storageService.setLastCurrencyUsed(JSON.stringify($scope.lastUsedAltCurrencyList), function() {}); + }; + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + var config = configService.getSync(); + $scope.currentCurrency = config.wallet.settings.alternativeIsoCode; + + storageService.getLastCurrencyUsed(function(err, lastUsedAltCurrency) { + $scope.lastUsedAltCurrencyList = lastUsedAltCurrency ? JSON.parse(lastUsedAltCurrency) : []; + init(); + }); + }); }); diff --git a/src/js/controllers/preferencesBitpayCard.js b/src/js/controllers/preferencesBitpayCard.js index a23e7b995..6b43b62b6 100644 --- a/src/js/controllers/preferencesBitpayCard.js +++ b/src/js/controllers/preferencesBitpayCard.js @@ -13,8 +13,11 @@ angular.module('copayApp.controllers').controller('preferencesBitpayCardControll }; var remove = function(card) { - bitpayCardService.remove(card, function() { - $ionicHistory.removeBackView(); + bitpayCardService.remove(card, function(err) { + if (err) { + return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not remove card')); + } + $ionicHistory.clearHistory(); $timeout(function() { $state.go('tabs.home'); }, 100); diff --git a/src/js/controllers/preferencesBwsUrl.js b/src/js/controllers/preferencesBwsUrl.js index 6885b000c..638219ae4 100644 --- a/src/js/controllers/preferencesBwsUrl.js +++ b/src/js/controllers/preferencesBwsUrl.js @@ -1,14 +1,14 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesBwsUrlController', - function($scope, $log, $stateParams, configService, applicationService, profileService, storageService) { + function($scope, $log, $stateParams, configService, applicationService, profileService, storageService, $window) { $scope.success = null; var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.credentials.walletId; var defaults = configService.getDefaults(); var config = configService.getSync(); - + $scope.appName = $window.appConfig.nameCase; $scope.bwsurl = { value: (config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url }; diff --git a/src/js/controllers/preferencesColor.js b/src/js/controllers/preferencesColor.js index da4552c00..cf1518e2d 100644 --- a/src/js/controllers/preferencesColor.js +++ b/src/js/controllers/preferencesColor.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesColorController', function($scope, $timeout, $log, $stateParams, $ionicHistory, gettextCatalog, configService, profileService) { +angular.module('copayApp.controllers').controller('preferencesColorController', function($scope, $timeout, $log, $stateParams, $ionicHistory, configService, profileService) { var wallet = profileService.getWallet($stateParams.walletId); $scope.wallet = wallet; var walletId = wallet.credentials.walletId; diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index f1a041438..d01f25262 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -1,10 +1,14 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, gettextCatalog, configService, feeService, ongoingProcess) { +angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, gettextCatalog, configService, feeService, ongoingProcess, popupService) { ongoingProcess.set('gettingFeeLevels', true); - feeService.getFeeLevels(function(levels) { + feeService.getFeeLevels(function(err, levels) { ongoingProcess.set('gettingFeeLevels', false); + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } $scope.feeLevels = levels; $scope.$apply(); }); diff --git a/src/js/controllers/preferencesGlidera.js b/src/js/controllers/preferencesGlidera.js index ce1945b02..8d18005a2 100644 --- a/src/js/controllers/preferencesGlidera.js +++ b/src/js/controllers/preferencesGlidera.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesGlideraController', - function($scope, $log, $timeout, $state, ongoingProcess, glideraService, popupService, gettextCatalog) { + function($scope, $log, $timeout, $state, $ionicHistory, ongoingProcess, glideraService, popupService, gettextCatalog) { $scope.update = function(opts) { if (!$scope.token || !$scope.permissions) return; @@ -41,8 +41,9 @@ angular.module('copayApp.controllers').controller('preferencesGlideraController' popupService.showConfirm('Glidera', 'Are you sure you would like to log out of your Glidera account?', null, null, function(res) { if (res) { glideraService.removeToken(function() { + $ionicHistory.clearHistory(); $timeout(function() { - $state.go('tabs.buyandsell.glidera'); + $state.go('tabs.home'); }, 100); }); } @@ -52,14 +53,6 @@ angular.module('copayApp.controllers').controller('preferencesGlideraController' $scope.$on("$ionicView.enter", function(event, data){ $scope.network = glideraService.getEnvironment(); - $scope.token = null; - $scope.permissions = null; - $scope.email = null; - $scope.personalInfo = null; - $scope.txs = null; - $scope.status = null; - $scope.limits = null; - ongoingProcess.set('connectingGlidera', true); glideraService.init($scope.token, function(err, glidera) { ongoingProcess.set('connectingGlidera'); diff --git a/src/js/controllers/preferencesHistory.js b/src/js/controllers/preferencesHistory.js index 68366fd15..06167fb4f 100644 --- a/src/js/controllers/preferencesHistory.js +++ b/src/js/controllers/preferencesHistory.js @@ -1,10 +1,11 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesHistory', - function($scope, $log, $stateParams, $timeout, $state, $ionicHistory, gettextCatalog, storageService, platformInfo, profileService, lodash) { + function($scope, $log, $stateParams, $timeout, $state, $ionicHistory, storageService, platformInfo, profileService, lodash, $window) { $scope.wallet = profileService.getWallet($stateParams.walletId); $scope.csvReady = false; $scope.isCordova = platformInfo.isCordova; + $scope.appName = $window.appConfig.nameCase; $scope.csvHistory = function(cb) { var allTxs = []; @@ -31,8 +32,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory', if (err) { $log.warn('Failed to generate CSV:', err); $scope.err = err; - } - else { + } else { $log.warn('Failed to generate CSV: no transactions'); $scope.err = 'no transactions'; } @@ -45,7 +45,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory', var data = txs; var satToBtc = 1 / 100000000; $scope.csvContent = []; - $scope.csvFilename = 'Copay-' + $scope.wallet.name + '.csv'; + $scope.csvFilename = $scope.appName + '-' + $scope.wallet.name + '.csv'; $scope.csvHeader = ['Date', 'Destination', 'Description', 'Amount', 'Currency', 'Txid', 'Creator', 'Copayers', 'Comment']; var _amount, _note, _copayers, _creator, _comment; diff --git a/src/js/controllers/preferencesInformation.js b/src/js/controllers/preferencesInformation.js index 2f2da8b00..983b9cef8 100644 --- a/src/js/controllers/preferencesInformation.js +++ b/src/js/controllers/preferencesInformation.js @@ -1,62 +1,15 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesInformation', - function($scope, $log, $timeout, $ionicHistory, $ionicScrollDelegate, platformInfo, gettextCatalog, lodash, profileService, configService, $stateParams, walletService, $state) { - var base = 'xpub'; + function($scope, $log, $ionicHistory, platformInfo, lodash, profileService, configService, $stateParams, $state) { var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.id; - var config = configService.getSync(); - var b = 1; + var colorCounter = 1; + var BLACK_WALLET_COLOR = '#202020'; $scope.isCordova = platformInfo.isCordova; config.colorFor = config.colorFor || {}; - $scope.sendAddrs = function() { - function formatDate(ts) { - var dateObj = new Date(ts * 1000); - if (!dateObj) { - $log.debug('Error formating a date'); - return 'DateError'; - } - if (!dateObj.toJSON()) { - return ''; - } - return dateObj.toJSON(); - }; - - $timeout(function() { - wallet.getMainAddresses({ - doNotVerify: true - }, function(err, addrs) { - if (err) { - $log.warn(err); - return; - }; - - var body = 'Copay Wallet "' + $scope.walletName + '" Addresses\n Only Main Addresses are shown.\n\n'; - body += "\n"; - body += addrs.map(function(v) { - return ('* ' + v.address + ' ' + base + v.path.substring(1) + ' ' + formatDate(v.createdOn)); - }).join("\n"); - - window.plugins.socialsharing.shareViaEmail( - body, - 'Copay Addresses', - null, // TO: must be null or an array - null, // CC: must be null or an array - null, // BCC: must be null or an array - null, // FILES: can be null, a string, or an array - function() {}, - function() {} - ); - - $timeout(function() { - $scope.$apply(); - }, 1000); - }); - }, 100); - }; - $scope.saveBlack = function() { function save(color) { var opts = { @@ -71,14 +24,8 @@ angular.module('copayApp.controllers').controller('preferencesInformation', }); }; - if (b != 5) return b++; - save('#202020'); - }; - - $scope.scan = function() { - walletService.startScan(wallet); - $ionicHistory.removeBackView(); - $state.go('tabs.home'); + if (colorCounter != 5) return colorCounter++; + save(BLACK_WALLET_COLOR); }; $scope.$on("$ionicView.enter", function(event, data) { @@ -95,29 +42,5 @@ angular.module('copayApp.controllers').controller('preferencesInformation', $scope.M = c.m; $scope.N = c.n; $scope.pubKeys = lodash.pluck(c.publicKeyRing, 'xPubKey'); - $scope.addrs = null; - - wallet.getMainAddresses({ - doNotVerify: true - }, function(err, addrs) { - if (err) { - $log.warn(err); - return; - }; - var last10 = [], - i = 0, - e = addrs.pop(); - while (i++ < 10 && e) { - e.path = base + e.path.substring(1); - last10.push(e); - e = addrs.pop(); - } - $scope.addrs = last10; - $timeout(function() { - $ionicScrollDelegate.resize(); - $scope.$apply(); - }, 10); - }); }); - }); diff --git a/src/js/controllers/preferencesLanguage.js b/src/js/controllers/preferencesLanguage.js index 4a4ca07f7..204f47add 100644 --- a/src/js/controllers/preferencesLanguage.js +++ b/src/js/controllers/preferencesLanguage.js @@ -1,12 +1,18 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesLanguageController', - function($scope, $log, $ionicHistory, gettextCatalog, configService, profileService, uxLanguage, walletService, externalLinkService) { + function($scope, $log, $ionicHistory, configService, profileService, uxLanguage, walletService, externalLinkService, gettextCatalog) { $scope.availableLanguages = uxLanguage.getLanguages(); - $scope.openExternalLink = function(url, target) { - externalLinkService.open(url, target); + $scope.openExternalLink = function() { + var url = 'https://crowdin.com/project/copay'; + var optIn = true; + var title = gettextCatalog.getString('Open Translation Community'); + var message = gettextCatalog.getString('You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!'); + var okText = gettextCatalog.getString('Open Crowdin'); + var cancelText = gettextCatalog.getString('Go Back'); + externalLinkService.open(url, optIn, title, message, okText, cancelText); }; $scope.save = function(newLang) { @@ -18,19 +24,18 @@ angular.module('copayApp.controllers').controller('preferencesLanguageController } }; + uxLanguage._set(newLang); configService.set(opts, function(err) { if (err) $log.warn(err); - - $ionicHistory.goBack(); - uxLanguage.init(function() { - walletService.updateRemotePreferences(profileService.getWallets(), {}, function() { - $log.debug('Remote preferences saved'); - }); + walletService.updateRemotePreferences(profileService.getWallets(), {}, function() { + $log.debug('Remote preferences saved'); }); }); + + $ionicHistory.goBack(); }; - $scope.$on("$ionicView.enter", function(event, data){ + $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.currentLanguage = uxLanguage.getCurrentLanguage(); }); }); diff --git a/src/js/controllers/preferencesLogs.js b/src/js/controllers/preferencesLogs.js index 43d5d42cb..94b82e100 100644 --- a/src/js/controllers/preferencesLogs.js +++ b/src/js/controllers/preferencesLogs.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesLogs', - function($scope, historicLog, gettextCatalog) { + function($scope, historicLog) { $scope.$on("$ionicView.enter", function(event, data) { $scope.logs = historicLog.get(); diff --git a/src/js/controllers/proposals.js b/src/js/controllers/proposals.js index 2fa6193a0..1e0e65030 100644 --- a/src/js/controllers/proposals.js +++ b/src/js/controllers/proposals.js @@ -1,24 +1,34 @@ - 'use strict'; angular.module('copayApp.controllers').controller('proposalsController', - function($timeout, $scope, profileService, $log, txpModalService) { + function($timeout, $scope, profileService, $log, txpModalService, addressbookService) { $scope.fetchingProposals = true; - $scope.$on("$ionicView.enter", function(event, data){ - profileService.getTxps(50, function(err, txps) { - $scope.fetchingProposals = false; - if (err) { - $log.error(err); - return; - } - $scope.txps = txps; - $timeout(function() { - $scope.$apply(); - }, 1); + $scope.$on("$ionicView.enter", function(event, data) { + addressbookService.list(function(err, ab) { + if (err) $log.error(err); + $scope.addressbook = ab || {}; + + profileService.getTxps(50, function(err, txps) { + $scope.fetchingProposals = false; + if (err) { + $log.error(err); + return; + } + $scope.txps = txps; + $timeout(function() { + $scope.$apply(); + }); + }); }); }); $scope.openTxpModal = txpModalService.open; + + $scope.createdWithinPastDay = function(time) { + var now = new Date(); + var date = new Date(time * 1000); + return (now.getTime() - date.getTime()) < (1000 * 60 * 60 * 24); + }; }); diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js deleted file mode 100644 index be19a4298..000000000 --- a/src/js/controllers/sellGlidera.js +++ /dev/null @@ -1,219 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('sellGlideraController', - function($scope, $timeout, $log, profileService, glideraService, bwcError, lodash, walletService, configService, ongoingProcess, popupService, gettextCatalog) { - - var self = this; - this.data = {}; - this.show2faCodeInput = null; - this.success = null; - var wallet; - $scope.network = glideraService.getEnvironment(); - - $scope.$on('Wallet/Changed', function(event, w) { - if (lodash.isEmpty(w)) { - $log.debug('No wallet provided'); - return; - } - wallet = w; - $log.debug('Wallet changed: ' + w.name); - }); - - $scope.update = function(opts) { - if (!$scope.token || !$scope.permissions) return; - $log.debug('Updating Glidera Account...'); - var accessToken = $scope.token; - var permissions = $scope.permissions; - - opts = opts || {}; - - glideraService.getStatus(accessToken, function(err, data) { - $scope.status = data; - }); - - glideraService.getLimits(accessToken, function(err, limits) { - $scope.limits = limits; - }); - - if (permissions.transaction_history) { - glideraService.getTransactions(accessToken, function(err, data) { - $scope.txs = data; - }); - } - - if (permissions.view_email_address && opts.fullUpdate) { - glideraService.getEmail(accessToken, function(err, data) { - $scope.email = data.email; - }); - } - if (permissions.personal_info && opts.fullUpdate) { - glideraService.getPersonalInfo(accessToken, function(err, data) { - $scope.personalInfo = data; - }); - } - }; - - this.getSellPrice = function(token, price) { - var self = this; - if (!price || (price && !price.qty && !price.fiat)) { - self.sellPrice = null; - return; - } - self.gettingSellPrice = true; - glideraService.sellPrice(token, price, function(err, sellPrice) { - self.gettingSellPrice = false; - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get exchange information. Please, try again')); - return; - } - self.sellPrice = sellPrice; - }); - }; - - this.get2faCode = function(token) { - var self = this; - ongoingProcess.set('Sending 2FA code...', true); - $timeout(function() { - glideraService.get2faCode(token, function(err, sent) { - ongoingProcess.set('Sending 2FA code...', false); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not send confirmation code to your phone')); - } else { - self.show2faCodeInput = sent; - } - }); - }, 100); - }; - - this.createTx = function(token, permissions, twoFaCode) { - var self = this; - var outputs = []; - var config = configService.getSync(); - var configWallet = config.wallet; - var walletSettings = configWallet.settings; - - if (!wallet) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('No wallet selected')); - return; - } - - ongoingProcess.set('creatingTx', true); - walletService.getAddress(wallet, null, function(err, refundAddress) { - if (!refundAddress) { - ongoingProcess.clear(); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err, 'Could not create address')); - return; - } - glideraService.getSellAddress(token, function(err, sellAddress) { - if (!sellAddress || err) { - ongoingProcess.clear(); - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not get the destination bitcoin address')); - return; - } - var amount = parseInt((self.sellPrice.qty * 100000000).toFixed(0)); - var comment = 'Glidera transaction'; - - outputs.push({ - 'toAddress': sellAddress, - 'amount': amount, - 'message': comment - }); - - var txp = { - toAddress: sellAddress, - amount: amount, - outputs: outputs, - message: comment, - payProUrl: null, - excludeUnconfirmedUtxos: configWallet.spendUnconfirmed ? false : true, - feeLevel: walletSettings.feeLevel || 'normal', - customData: { - 'glideraToken': token - } - }; - - walletService.createTx(wallet, txp, function(err, createdTxp) { - ongoingProcess.clear(); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); - return; - } - walletService.prepare(wallet, function(err, password) { - if (err) { - ongoingProcess.clear(); - popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); - return; - } - ongoingProcess.set('signingTx', true); - walletService.publishTx(wallet, createdTxp, function(err, publishedTxp) { - if (err) { - ongoingProcess.clear(); - popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); - return; - } - - walletService.signTx(wallet, publishedTxp, password, function(err, signedTxp) { - if (err) { - ongoingProcess.clear(); - popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); - walletService.removeTx(wallet, signedTxp, function(err) { - if (err) $log.debug(err); - }); - return; - } - var rawTx = signedTxp.raw; - var data = { - refundAddress: refundAddress, - signedTransaction: rawTx, - priceUuid: self.sellPrice.priceUuid, - useCurrentPrice: self.sellPrice.priceUuid ? false : true, - ip: null - }; - ongoingProcess.set('Selling Bitcoin', true); - glideraService.sell(token, twoFaCode, data, function(err, data) { - ongoingProcess.clear(); - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), err.message || bwcError.msg(err)); - return; - } - self.success = data; - $timeout(function() { - $scope.$digest(); - }); - }); - }); - }); - }); - }); - }); - }); - }; - - $scope.$on("$ionicView.enter", function(event, data){ - $scope.token = null; - $scope.permissions = null; - $scope.email = null; - $scope.personalInfo = null; - $scope.txs = null; - $scope.status = null; - $scope.limits = null; - - ongoingProcess.set('connectingGlidera', true); - glideraService.init($scope.token, function(err, glidera) { - ongoingProcess.set('connectingGlidera'); - if (err || !glidera) { - if (err) popupService.showAlert(gettextCatalog.getString('Error'), err); - return; - } - $scope.token = glidera.token; - $scope.permissions = glidera.permissions; - $scope.update({fullUpdate: true}); - }); - - $scope.wallets = profileService.getWallets({ - network: $scope.network, - n: 1, - onlyComplete: true - }); - }); - }); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 27f6b94cf..5a13ca031 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('tabHomeController', - function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, $window, bitpayCardService, startupService, addressbookService) { + function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, $window, bitpayCardService, startupService, addressbookService, feedbackService) { var wallet; var listeners = []; var notifications = []; @@ -13,29 +13,132 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.isCordova = platformInfo.isCordova; $scope.isAndroid = platformInfo.isAndroid; $scope.isNW = platformInfo.isNW; + $scope.showRateCard = {}; $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); }); - if (!$scope.homeTip) { - storageService.getHomeTipAccepted(function(error, value) { - $scope.homeTip = (value == 'accepted') ? false : true; - }); - } + $scope.$on("$ionicView.beforeEnter", function(event, data) { + if (!$scope.homeTip) { + storageService.getHomeTipAccepted(function(error, value) { + $scope.homeTip = (value == 'accepted') ? false : true; + }); + } - if ($scope.isNW) { - latestReleaseService.checkLatestRelease(function(err, newRelease) { - if (err) { - $log.warn(err); - return; + if ($scope.isNW) { + latestReleaseService.checkLatestRelease(function(err, newRelease) { + if (err) { + $log.warn(err); + return; + } + + if (newRelease) $scope.newRelease = true; + }); + } + + storageService.getFeedbackInfo(function(error, info) { + if (!info) { + initFeedBackInfo(); + } else { + var feedbackInfo = JSON.parse(info); + //Check if current version is greater than saved version + var currentVersion = window.version; + var savedVersion = feedbackInfo.version; + var isVersionUpdated = feedbackService.isVersionUpdated(currentVersion, savedVersion); + if (!isVersionUpdated) { + initFeedBackInfo(); + return; + } + var now = moment().unix(); + var timeExceeded = (now - feedbackInfo.time) >= 24 * 7 * 60 * 60; + $scope.showRateCard.value = timeExceeded && !feedbackInfo.sent; + $timeout(function() { + $scope.$apply(); + }); } - - if (newRelease) $scope.newRelease = true; }); - } - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { + function initFeedBackInfo() { + var feedbackInfo = {}; + feedbackInfo.time = moment().unix(); + feedbackInfo.version = window.version; + feedbackInfo.sent = false; + storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() { + $scope.showRateCard.value = false; + }); + }; + }); + + $scope.$on("$ionicView.enter", function(event, data) { + updateAllWallets(); + + addressbookService.list(function(err, ab) { + if (err) $log.error(err); + $scope.addressbook = ab || {}; + }); + + listeners = [ + $rootScope.$on('bwsEvent', function(e, walletId, type, n) { + var wallet = profileService.getWallet(walletId); + updateWallet(wallet); + if ($scope.recentTransactionsEnabled) getNotifications(); + }), + $rootScope.$on('Local/TxAction', function(e, walletId) { + $log.debug('Got action for wallet ' + walletId); + var wallet = profileService.getWallet(walletId); + updateWallet(wallet); + if ($scope.recentTransactionsEnabled) getNotifications(); + }) + ]; + + configService.whenAvailable(function() { + nextStep(function() { + var config = configService.getSync(); + var isWindowsPhoneApp = platformInfo.isWP && platformInfo.isCordova; + + $scope.glideraEnabled = config.glidera.enabled && !isWindowsPhoneApp; + $scope.coinbaseEnabled = config.coinbase.enabled && !isWindowsPhoneApp; + $scope.amazonEnabled = config.amazon.enabled; + $scope.bitpayCardEnabled = config.bitpayCard.enabled; + + var buyAndSellEnabled = !$scope.externalServices.BuyAndSell && ($scope.glideraEnabled || $scope.coinbaseEnabled); + var amazonEnabled = !$scope.externalServices.AmazonGiftCards && $scope.amazonEnabled; + var bitpayCardEnabled = !$scope.externalServices.BitpayCard && $scope.bitpayCardEnabled; + + $scope.nextStepEnabled = buyAndSellEnabled || amazonEnabled || bitpayCardEnabled; + $scope.recentTransactionsEnabled = config.recentTransactions.enabled; + + if ($scope.recentTransactionsEnabled) getNotifications(); + + if ($scope.bitpayCardEnabled) bitpayCardCache(); + $timeout(function() { + $ionicScrollDelegate.resize(); + $scope.$apply(); + }, 10); + }); + }); + }); + + $scope.$on("$ionicView.leave", function(event, data) { + lodash.each(listeners, function(x) { + x(); + }); + }); + + $scope.createdWithinPastDay = function(time) { + var now = new Date(); + var date = new Date(time * 1000); + return (now.getTime() - date.getTime()) < (1000 * 60 * 60 * 24); + }; + + $scope.openExternalLink = function() { + var url = 'https://github.com/bitpay/copay/releases/latest'; + var optIn = true; + var title = gettextCatalog.getString('Update Available'); + var message = gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.'); + var okText = gettextCatalog.getString('View Update'); + var cancelText = gettextCatalog.getString('Go Back'); externalLinkService.open(url, optIn, title, message, okText, cancelText); }; @@ -43,7 +146,10 @@ angular.module('copayApp.controllers').controller('tabHomeController', wallet = profileService.getWallet(n.walletId); if (n.txid) { - openTxModal(n); + $state.transitionTo('tabs.wallet.tx-details', { + txid: n.txid, + walletId: n.walletId + }); } else { var txp = lodash.find($scope.txps, { id: n.txpId @@ -65,37 +171,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', } }; - var openTxModal = function(n) { - wallet = profileService.getWallet(n.walletId); - - ongoingProcess.set('loadingTxInfo', true); - walletService.getTx(wallet, n.txid, function(err, tx) { - ongoingProcess.set('loadingTxInfo', false); - - if (err) { - $log.error(err); - return popupService.showAlert(gettextCatalog.getString('Error'), err); - } - - if (!tx) { - $log.warn('No tx found'); - return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Transaction not found')); - } - - $scope.wallet = wallet; - $scope.btx = lodash.cloneDeep(tx); - $state.transitionTo('tabs.wallet.tx-details', { - txid: $scope.btx.txid, - walletId: $scope.walletId - }); - - walletService.getTxNote(wallet, n.txid, function(err, note) { - if (err) $log.warn('Could not fetch transaction note: ' + err); - $scope.btx.note = note; - }); - }); - }; - $scope.openWallet = function(wallet) { if (!wallet.isComplete()) { return $state.go('tabs.copayers', { @@ -117,7 +192,8 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.txpsN = n; $timeout(function() { $ionicScrollDelegate.resize(); - }, 100); + $scope.$apply(); + }, 10); }) }; @@ -132,8 +208,11 @@ angular.module('copayApp.controllers').controller('tabHomeController', lodash.each($scope.wallets, function(wallet) { walletService.getStatus(wallet, {}, function(err, status) { if (err) { + if (err === 'WALLET_NOT_REGISTERED') wallet.error = gettextCatalog.getString('Wallet not registered'); + else wallet.error = gettextCatalog.getString('Could not update');; $log.error(err); } else { + wallet.error = null; wallet.status = status; } if (++j == i) { @@ -141,25 +220,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', } }); }); - - if (!$scope.recentTransactionsEnabled) return; - $scope.fetchingNotifications = true; - profileService.getNotifications({ - limit: 3 - }, function(err, n) { - if (err) { - $log.error(err); - return; - } - $scope.fetchingNotifications = false; - $scope.notifications = n; - - $timeout(function() { - $ionicScrollDelegate.resize(); - $scope.$apply(); - }, 100); - - }) }; var updateWallet = function(wallet) { @@ -171,20 +231,22 @@ angular.module('copayApp.controllers').controller('tabHomeController', } wallet.status = status; updateTxps(); + }); + }; - if (!$scope.recentTransactionsEnabled) return; - - $scope.fetchingNotifications = true; - profileService.getNotifications({ - limit: 3 - }, function(err, notifications) { - $scope.fetchingNotifications = false; - if (err) { - $log.error(err); - return; - } - $scope.notifications = notifications; - }); + var getNotifications = function() { + profileService.getNotifications({ + limit: 3 + }, function(err, n) { + if (err) { + $log.error(err); + return; + } + $scope.notifications = n; + $timeout(function() { + $ionicScrollDelegate.resize(); + $scope.$apply(); + }, 10); }); }; @@ -202,7 +264,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', var services = ['AmazonGiftCards', 'BitpayCard', 'BuyAndSell']; lodash.each(services, function(service) { storageService.getNextStep(service, function(err, value) { - $scope.externalServices[service] = value ? true : false; + $scope.externalServices[service] = value == 'true' ? true : false; if (++i == services.length) return cb(); }); }); @@ -213,7 +275,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', $timeout(function() { $ionicScrollDelegate.resize(); $scope.$apply(); - }, 100); + }, 10); }; var bitpayCardCache = function() { @@ -241,57 +303,4 @@ angular.module('copayApp.controllers').controller('tabHomeController', }, 300); updateAllWallets(); }; - - $scope.$on("$ionicView.enter", function(event, data) { - updateAllWallets(); - - addressbookService.list(function(err, ab) { - if (err) $log.error(err); - $scope.addressbook = ab || {}; - }); - - listeners = [ - $rootScope.$on('bwsEvent', function(e, walletId, type, n) { - var wallet = profileService.getWallet(walletId); - updateWallet(wallet); - }), - $rootScope.$on('Local/TxAction', function(e, walletId) { - $log.debug('Got action for wallet ' + walletId); - var wallet = profileService.getWallet(walletId); - updateWallet(wallet); - }) - ]; - - configService.whenAvailable(function() { - nextStep(function() { - var config = configService.getSync(); - var isWindowsPhoneApp = platformInfo.isWP && platformInfo.isCordova; - - $scope.glideraEnabled = config.glidera.enabled && !isWindowsPhoneApp; - $scope.coinbaseEnabled = config.coinbase.enabled && !isWindowsPhoneApp; - $scope.amazonEnabled = config.amazon.enabled; - $scope.bitpayCardEnabled = config.bitpayCard.enabled; - - var buyAndSellEnabled = !$scope.externalServices.BuyAndSell && ($scope.glideraEnabled || $scope.coinbaseEnabled); - var amazonEnabled = !$scope.externalServices.AmazonGiftCards && $scope.amazonEnabled; - var bitpayCardEnabled = !$scope.externalServices.BitpayCard && $scope.bitpayCardEnabled; - - $scope.nextStepEnabled = buyAndSellEnabled || amazonEnabled || bitpayCardEnabled; - $scope.recentTransactionsEnabled = config.recentTransactions.enabled; - - if ($scope.bitpayCardEnabled) bitpayCardCache(); - $timeout(function() { - $ionicScrollDelegate.resize(); - $scope.$apply(); - }, 10); - }); - }); - }); - - $scope.$on("$ionicView.leave", function(event, data) { - lodash.each(listeners, function(x) { - x(); - }); - }); - }); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 11095db14..3aeb9d577 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -1,9 +1,12 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabReceiveController', function($scope, $timeout, $log, $ionicModal, $state, $ionicHistory, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService) { +angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError) { + var listeners = []; + var MENU_ITEM_HEIGHT = 55; $scope.isCordova = platformInfo.isCordova; $scope.isNW = platformInfo.isNW; + $scope.walletAddrs = {}; $scope.shareAddress = function(addr) { if ($scope.generatingAddress) return; @@ -18,14 +21,21 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $scope.generatingAddress = true; walletService.getAddress($scope.wallet, forceNew, function(err, addr) { $scope.generatingAddress = false; - if (err) popupService.showAlert(gettextCatalog.getString('Error'), err); + if (err) popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err)); $scope.addr = addr; + if ($scope.walletAddrs[$scope.wallet.id]) $scope.walletAddrs[$scope.wallet.id] = addr; $timeout(function() { $scope.$apply(); }, 10); }); }; + $scope.loadAddresses = function(wallet, index) { + walletService.getAddress(wallet, false, function(err, addr) { + $scope.walletAddrs[wallet.id] = addr; + }); + } + $scope.goCopayers = function() { $ionicHistory.removeBackView(); $ionicHistory.nextViewOptions({ @@ -39,6 +49,12 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }, 100); }; + $scope.showAddresses = function() { + $state.transitionTo('tabs.receive.addresses', { + walletId: $scope.wallet.credentials.walletId + }); + }; + $scope.openBackupNeededModal = function() { $ionicModal.fromTemplateUrl('views/includes/backupNeededPopup.html', { scope: $scope, @@ -67,6 +83,24 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi }); }; + $scope.setWallet = function(index) { + $scope.wallet = $scope.wallets[index]; + $scope.walletIndex = index; + if ($scope.walletAddrs[$scope.wallet.id].addr) $scope.addr = $scope.walletAddrs[$scope.walletIndex].addr; + else $scope.setAddress(false); + } + + $scope.isActive = function(index) { + return $scope.wallets[index] == $scope.wallet; + } + + $scope.walletPosition = function(index) { + if (index == $scope.walletIndex) return 'current'; + if (index < $scope.walletIndex) return 'prev'; + if (index > $scope.walletIndex) return 'next'; + } + + $scope.$on('Wallet/Changed', function(event, wallet) { if (!wallet) { $log.debug('No wallet provided'); @@ -77,14 +111,82 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi return; } $scope.wallet = wallet; - $scope.generatingAddress = false; $log.debug('Wallet changed: ' + wallet.name); + + $scope.walletIndex = lodash.findIndex($scope.wallets, function(wallet) { + return wallet.id == $scope.wallet.id; + }); + + if (!$scope.walletAddrs[wallet.id]) $scope.setAddress(false); + else $scope.addr = $scope.walletAddrs[wallet.id]; + $timeout(function() { - $scope.setAddress(false); + $scope.$apply(); }, 100); + }); + $scope.updateCurrentWallet = function() { + walletService.getStatus($scope.wallet, {}, function(err, status) { + if (err) { + $log.error(err); + } + $timeout(function() { + $scope.wallet = profileService.getWallet($scope.wallet.id); + $scope.wallet.status = status; + $scope.setAddress(); + $scope.$apply(); + }, 200); + }); + }; + + var goRequestAmount = function() { + $scope.menu.hide(); + $state.go('tabs.receive.amount', { + customAmount: true, + toAddress: $scope.addr + }); + } + + $scope.showMenu = function(allAddresses, $event) { + var requestAmountObj = { + text: gettextCatalog.getString('Request Specific amount'), + action: goRequestAmount, + }; + + $scope.items = [requestAmountObj]; + $scope.height = $scope.items.length * MENU_ITEM_HEIGHT; + + $ionicPopover.fromTemplateUrl('views/includes/menu-popover.html', { + scope: $scope + }).then(function(popover) { + $scope.menu = popover; + $scope.menu.show($event); + }); + }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.wallets = profileService.getWallets(); + + lodash.each($scope.wallets, function(wallet, index) { + $scope.loadAddresses(wallet); + }); + + + listeners = [ + $rootScope.$on('bwsEvent', function(e, walletId, type, n) { + // Update current address + if ($scope.wallet && walletId == $scope.wallet.id) $scope.updateCurrentWallet(); + }) + ]; + + // Update current wallet + if ($scope.wallet) $scope.updateCurrentWallet(); + }); + + $scope.$on("$ionicView.leave", function(event, data) { + lodash.each(listeners, function(x) { + x(); + }); }); }); diff --git a/src/js/controllers/tab-send.js b/src/js/controllers/tab-send.js index 9506d6b4d..7c1ac8fc9 100644 --- a/src/js/controllers/tab-send.js +++ b/src/js/controllers/tab-send.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSendController', function($scope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, $rootScope) { +angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService) { var originalList; var CONTACTS_SHOW_LIMIT; @@ -55,7 +55,7 @@ angular.module('copayApp.controllers').controller('tabSendController', function( $timeout(function() { $ionicScrollDelegate.resize(); $scope.$apply(); - }); + }, 10); }); }; @@ -128,10 +128,12 @@ angular.module('copayApp.controllers').controller('tabSendController', function( }); } + $scope.checkingBalance = true; var index = 0; lodash.each(wallets, function(w) { walletService.getStatus(w, {}, function(err, status) { ++index; + if (index == wallets.length) $scope.checkingBalance = false; if (err || !status) { $log.error(err); return; @@ -143,15 +145,15 @@ angular.module('copayApp.controllers').controller('tabSendController', function( } if (index == wallets.length) { + if ($scope.hasFunds != true) { + $ionicScrollDelegate.freezeScroll(true); + } $timeout(function() { $scope.$apply(); }); } }); }); - if ($scope.hasFunds != true) { - $ionicScrollDelegate.freezeScroll(true); - } }; $scope.$on("$ionicView.beforeEnter", function(event, data) { diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 773a6a5f3..e59dc12d9 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -1,30 +1,58 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSettingsController', function($scope, $window, uxLanguage, platformInfo, profileService, feeService, configService, externalLinkService) { +angular.module('copayApp.controllers').controller('tabSettingsController', function($scope, $window, $ionicModal, $log, lodash, uxLanguage, platformInfo, profileService, feeService, configService, externalLinkService, bitpayCardService, storageService, glideraService, gettextCatalog) { var updateConfig = function() { - - var config = configService.getSync(); var isCordova = platformInfo.isCordova; var isWP = platformInfo.isWP; + var isWindowsPhoneApp = platformInfo.isWP && isCordova; $scope.usePushNotifications = isCordova && !isWP; + $scope.isCordova = isCordova; $scope.appName = $window.appConfig.nameCase; - - $scope.unitName = config.wallet.settings.unitName; $scope.currentLanguageName = uxLanguage.getCurrentLanguageName(); - $scope.selectedAlternative = { - name: config.wallet.settings.alternativeName, - isoCode: config.wallet.settings.alternativeIsoCode - }; $scope.feeOpts = feeService.feeOpts; $scope.currentFeeLevel = feeService.getCurrentFeeLevel(); - + $scope.wallets = profileService.getWallets(); + + configService.whenAvailable(function(config) { + $scope.unitName = config.wallet.settings.unitName; + $scope.selectedAlternative = { + name: config.wallet.settings.alternativeName, + isoCode: config.wallet.settings.alternativeIsoCode + }; + + $scope.bitpayCardEnabled = config.bitpayCard.enabled; + $scope.glideraEnabled = config.glidera.enabled && !isWindowsPhoneApp; + + if ($scope.bitpayCardEnabled) { + bitpayCardService.getBitpayDebitCards(function(err, data) { + if (err) $log.error(err); + if (!lodash.isEmpty(data)) { + $scope.bitpayCards = true; + } + }); + } + + if ($scope.glideraEnabled) { + storageService.getGlideraToken(glideraService.getEnvironment(), function(err, token) { + if (err) $log.error(err); + $scope.glideraToken = token; + }); + } + + }); }; - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { + $scope.openExternalLink = function() { + var url = 'https://help.bitpay.com/bitpay-app'; + var optIn = true; + var title = gettextCatalog.getString('BitPay Help Center'); + var message = gettextCatalog.getString('Help and support information is available at the BitPay Help Center website. Would you like to go there now?'); + var okText = gettextCatalog.getString('Open Help Center'); + var cancelText = gettextCatalog.getString('Go Back'); externalLinkService.open(url, optIn, title, message, okText, cancelText); }; diff --git a/src/js/controllers/tabsController.js b/src/js/controllers/tabsController.js index 1b07555d5..42899e13e 100644 --- a/src/js/controllers/tabsController.js +++ b/src/js/controllers/tabsController.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, incomingData, lodash, popupService) { +angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, incomingData, lodash, popupService, gettextCatalog) { $scope.onScan = function(data) { if (!incomingData.redir(data)) { diff --git a/src/js/controllers/termOfUse.js b/src/js/controllers/termOfUse.js index 46d91160f..6bbc2bdf4 100644 --- a/src/js/controllers/termOfUse.js +++ b/src/js/controllers/termOfUse.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('termOfUseController', - function($scope, $window, uxLanguage, gettextCatalog, externalLinkService) { + function($scope, $window, uxLanguage, externalLinkService) { $scope.lang = uxLanguage.currentLanguage; $scope.disclaimerUrl = $window.appConfig.disclaimerUrl; diff --git a/src/js/controllers/translators.js b/src/js/controllers/translators.js index 7f09f58d5..000688a6a 100644 --- a/src/js/controllers/translators.js +++ b/src/js/controllers/translators.js @@ -1,8 +1,14 @@ 'use strict'; angular.module('copayApp.controllers').controller('translatorsController', - function($scope, externalLinkService) { - $scope.openExternalLink = function(url, target) { - externalLinkService.open(url, target); + function($scope, externalLinkService, gettextCatalog) { + $scope.openExternalLink = function() { + var url = 'https://crowdin.com/project/copay'; + var optIn = true; + var title = gettextCatalog.getString('Open Translation Community'); + var message = gettextCatalog.getString('You can make contributions by signing up on our Crowdin community translation website. We’re looking forward to hearing from you!'); + var okText = gettextCatalog.getString('Open Crowdin'); + var cancelText = gettextCatalog.getString('Go Back'); + externalLinkService.open(url, optIn, title, message, okText, cancelText); }; }); diff --git a/src/js/controllers/modals/txDetails.js b/src/js/controllers/tx-details.js similarity index 58% rename from src/js/controllers/modals/txDetails.js rename to src/js/controllers/tx-details.js index ea2cb431a..f3ba54f00 100644 --- a/src/js/controllers/modals/txDetails.js +++ b/src/js/controllers/tx-details.js @@ -1,27 +1,23 @@ 'use strict'; -angular.module('copayApp.controllers').controller('txDetailsController', function($log, $timeout, $ionicHistory, $scope, $filter, $stateParams, ongoingProcess, walletService, lodash, gettextCatalog, profileService, configService, txFormatService, externalLinkService, popupService) { - var config = configService.getSync(); - var configWallet = config.wallet; - var walletSettings = configWallet.settings; - var wallet = profileService.getWallet($stateParams.walletId); +angular.module('copayApp.controllers').controller('txDetailsController', function($log, $ionicHistory, $scope, $timeout, walletService, lodash, gettextCatalog, profileService, configService, externalLinkService, popupService, ongoingProcess) { - $scope.wallet = wallet; - $scope.title = gettextCatalog.getString('Transaction'); + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.title = gettextCatalog.getString('Transaction'); + $scope.wallet = profileService.getWallet(data.stateParams.walletId); + $scope.color = $scope.wallet.color; + $scope.copayerId = $scope.wallet.credentials.copayerId; + $scope.isShared = $scope.wallet.credentials.n > 1; - $scope.init = function() { - $scope.alternativeIsoCode = walletSettings.alternativeIsoCode; - $scope.color = wallet.color; - $scope.copayerId = wallet.credentials.copayerId; - $scope.isShared = wallet.credentials.n > 1; - walletService.getTx(wallet, $stateParams.txid, function(err, tx) { + ongoingProcess.set('loadingTxInfo', true); + walletService.getTx($scope.wallet, data.stateParams.txid, function(err, tx) { + ongoingProcess.set('loadingTxInfo', false); if (err) { $log.warn('Could not get tx'); $ionicHistory.goBack(); - return; + return popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Transaction not found')); } $scope.btx = tx; - $scope.btx.feeLevel = walletSettings.feeLevel; if ($scope.btx.action != 'invalid') { if ($scope.btx.action == 'sent') $scope.title = gettextCatalog.getString('Sent Funds'); if ($scope.btx.action == 'received') $scope.title = gettextCatalog.getString('Received Funds'); @@ -33,8 +29,11 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio updateMemo(); initActionList(); + $timeout(function() { + $scope.$apply(); + }); }); - }; + }); function getDisplayAmount(amountStr) { return amountStr.split(' ')[0]; @@ -45,7 +44,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio } function updateMemo() { - walletService.getTxNote(wallet, $scope.btx.txid, function(err, note) { + walletService.getTxNote($scope.wallet, $scope.btx.txid, function(err, note) { if (err) { $log.warn('Could not fetch transaction note: ' + err); return; @@ -53,18 +52,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio if (!note) return; $scope.btx.note = note; - - walletService.getTx(wallet, $scope.btx.txid, function(err, tx) { - if (err) { - $log.error(err); - return; - } - - tx.note = note; - $timeout(function() { - $scope.$apply(); - }); - }); + $scope.$apply(); }); } @@ -109,9 +97,12 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio } if ($scope.btx.note && $scope.btx.note.body) opts.defaultText = $scope.btx.note.body; - popupService.showPrompt(wallet.name, gettextCatalog.getString('Memo'), opts, function(text) { + popupService.showPrompt($scope.wallet.name, gettextCatalog.getString('Memo'), opts, function(text) { if (typeof text == "undefined") return; + $scope.btx.note = { + body: text + }; $log.debug('Saving memo'); var args = { @@ -119,17 +110,10 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio body: text }; - walletService.editTxNote(wallet, args, function(err, res) { + walletService.editTxNote($scope.wallet, args, function(err, res) { if (err) { $log.debug('Could not save tx comment ' + err); - return; } - // This is only to refresh the current screen data - updateMemo(); - $scope.btx.searcheableString = null; - $timeout(function() { - $scope.$apply(); - }); }); }); }; @@ -137,23 +121,42 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio $scope.viewOnBlockchain = function() { var btx = $scope.btx; var url = 'https://' + ($scope.getShortNetworkName() == 'test' ? 'test-' : '') + 'insight.bitpay.com/tx/' + btx.txid; - var title = 'View Transaction on Insight'; - var message = 'Would you like to view this transaction on the Insight blockchain explorer?'; - $scope.openExternalLink(url, true, title, message, 'Open Insight', 'Go back'); - }; - - $scope.openExternalLink = function(url, optIn, title, message, okText, cancelText) { + var optIn = true; + var title = gettextCatalog.getString('View Transaction on Insight'); + var message = gettextCatalog.getString('Would you like to view this transaction on the Insight blockchain explorer?'); + var okText = gettextCatalog.getString('Open Insight'); + var cancelText = gettextCatalog.getString('Go Back'); externalLinkService.open(url, optIn, title, message, okText, cancelText); }; $scope.getShortNetworkName = function() { - var n = wallet.credentials.network; + var n = $scope.wallet.credentials.network; return n.substring(0, 4); }; + $scope.getFiatRate = function() { + if ($scope.rateDate) return; + var alternativeIsoCode = $scope.wallet.status.alternativeIsoCode; + $scope.loadingRate = true; + $scope.wallet.getFiatRate({ + code: alternativeIsoCode, + ts: $scope.btx.time * 1000 + }, function(err, res) { + $scope.loadingRate = false; + if (err) { + $log.debug('Could not get historic rate'); + return; + } + if (res && res.rate) { + $scope.rateDate = res.fetchedOn; + $scope.rateStr = res.rate + ' ' + alternativeIsoCode; + $scope.$apply(); + } + }); + }; + $scope.cancel = function() { $scope.txDetailsModal.hide(); }; - $scope.init(); }); diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index 6fd7a8b30..ed3f1d2bb 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, profileService, lodash, configService, gettextCatalog, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService) { +angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $state, $stateParams, $ionicHistory, profileService, lodash, configService, platformInfo, walletService, txpModalService, externalLinkService, popupService, addressbookService, storageService, $ionicScrollDelegate, $window, bwcError, gettextCatalog) { var HISTORY_SHOW_LIMIT = 10; var currentTxHistoryPage = 0; @@ -10,6 +10,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun $scope.openTxpModal = txpModalService.open; $scope.isCordova = platformInfo.isCordova; $scope.isAndroid = platformInfo.isAndroid; + $scope.isIOS = platformInfo.isIOS; + + $scope.amountIsCollapsible = !$scope.isAndroid; $scope.openExternalLink = function(url, target) { externalLinkService.open(url, target); @@ -46,7 +49,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun var updateStatus = function(force) { $scope.updatingStatus = true; - $scope.updateStatusError = false; + $scope.updateStatusError = null; $scope.walletNotRegistered = false; walletService.getStatus($scope.wallet, { @@ -57,18 +60,17 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun if (err === 'WALLET_NOT_REGISTERED') { $scope.walletNotRegistered = true; } else { - $scope.updateStatusError = true; + $scope.updateStatusError = bwcError.msg(err, gettextCatalog.getString('BWS Error')); } $scope.status = null; - return; + } else { + setPendingTxps(status.pendingTxps); + $scope.status = status; } - - setPendingTxps(status.pendingTxps); - - $scope.status = status; + refreshAmountSection(); $timeout(function() { $scope.$apply(); - }, 1); + }); }); }; @@ -87,6 +89,14 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun $scope.close = function() { $scope.searchModal.hide(); }; + + $scope.openTx = function(tx) { + $ionicHistory.nextViewOptions({ + disableAnimate: true + }); + $scope.searchModal.hide(); + $scope.openTxModal(tx); + }; }; $scope.openTxModal = function(btx) { @@ -98,11 +108,25 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }); }; + $scope.openBalanceModal = function() { + $ionicModal.fromTemplateUrl('views/modals/wallet-balance.html', { + scope: $scope + }).then(function(modal) { + $scope.walletBalanceModal = modal; + $scope.walletBalanceModal.show(); + }); + + $scope.close = function() { + $scope.walletBalanceModal.hide(); + }; + }; + $scope.recreate = function() { walletService.recreate($scope.wallet, function(err) { if (err) return; $timeout(function() { walletService.startScan($scope.wallet, function() { + $scope.updateAll(); $scope.$apply(); }); }); @@ -151,6 +175,52 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun } }; + $scope.getDate = function(txCreated) { + var date = new Date(txCreated * 1000); + return date; + }; + + $scope.isFirstInGroup = function(index) { + if (index === 0) { + return true; + } + var curTx = $scope.txHistory[index]; + var prevTx = $scope.txHistory[index - 1]; + return !createdDuringSameMonth(curTx, prevTx); + }; + + $scope.isLastInGroup = function(index) { + if (index === $scope.txHistory.length - 1) { + return true; + } + return $scope.isFirstInGroup(index + 1); + }; + + function createdDuringSameMonth(tx1, tx2) { + var date1 = new Date(tx1.time * 1000); + var date2 = new Date(tx2.time * 1000); + return getMonthYear(date1) === getMonthYear(date2); + } + + $scope.createdWithinPastDay = function(time) { + var now = new Date(); + var date = new Date(time * 1000); + return (now.getTime() - date.getTime()) < (1000 * 60 * 60 * 24); + }; + + $scope.isDateInCurrentMonth = function(date) { + var now = new Date(); + return getMonthYear(now) === getMonthYear(date); + }; + + function getMonthYear(date) { + return date.getMonth() + date.getFullYear(); + } + + $scope.isUnconfirmed = function(tx) { + return !tx.confirmations || tx.confirmations === 0; + }; + $scope.showMore = function() { $timeout(function() { currentTxHistoryPage++; @@ -177,9 +247,99 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }); }; - $scope.$on("$ionicView.beforeEnter", function(event, data) { + var prevPos; - $scope.wallet = profileService.getWallet(data.stateParams.walletId); + function getScrollPosition() { + var scrollPosition = $ionicScrollDelegate.getScrollPosition(); + if (!scrollPosition) { + $window.requestAnimationFrame(function() { + getScrollPosition(); + }); + return; + } + var pos = scrollPosition.top; + if (pos === prevPos) { + $window.requestAnimationFrame(function() { + getScrollPosition(); + }); + return; + } + prevPos = pos; + refreshAmountSection(pos); + }; + + function refreshAmountSection(scrollPos) { + $scope.showBalanceButton = false; + if ($scope.wallet.status) { + $scope.showBalanceButton = ($scope.wallet.status.totalBalanceSat != $scope.wallet.status.spendableAmount); + } + if (!$scope.amountIsCollapsible) { + var t = ($scope.showBalanceButton ? 15 : 45); + $scope.amountScale = 'translateY(' + t + 'px)'; + return; + } + + scrollPos = scrollPos || 0; + var amountHeight = 210 - scrollPos; + if (amountHeight < 80) { + amountHeight = 80; + } + var contentMargin = amountHeight; + if (contentMargin > 210) { + contentMargin = 210; + } + + var amountScale = (amountHeight / 210); + if (amountScale < 0.5) { + amountScale = 0.5; + } + if (amountScale > 1.1) { + amountScale = 1.1; + } + + var s = amountScale; + + // Make space for the balance button when it needs to display. + var TOP_NO_BALANCE_BUTTON = 115; + var TOP_BALANCE_BUTTON = 30; + var top = TOP_NO_BALANCE_BUTTON; + if ($scope.showBalanceButton) { + top = TOP_BALANCE_BUTTON; + } + + var amountTop = ((amountScale - 0.7) / 0.7) * top; + if (amountTop < -10) { + amountTop = -10; + } + if (amountTop > top) { + amountTop = top; + } + + var t = amountTop; + + $scope.altAmountOpacity = (amountHeight - 100) / 80; + $window.requestAnimationFrame(function() { + $scope.amountHeight = amountHeight + 'px'; + $scope.contentMargin = contentMargin + 'px'; + $scope.amountScale = 'scale3d(' + s + ',' + s + ',' + s + ') translateY(' + t + 'px)'; + $scope.$digest(); + getScrollPosition(); + }); + } + + var scrollWatcherInitialized; + + $scope.$on("$ionicView.enter", function(event, data) { + if ($scope.isCordova && $scope.isAndroid) setAndroidStatusBarColor(); + if (scrollWatcherInitialized || !$scope.amountIsCollapsible) { + return; + } + scrollWatcherInitialized = true; + }); + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.walletId = data.stateParams.walletId; + $scope.wallet = profileService.getWallet($scope.walletId); $scope.requiresMultipleSignatures = $scope.wallet.credentials.m > 1; addressbookService.list(function(err, ab) { @@ -188,6 +348,7 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun }); $scope.updateAll(); + refreshAmountSection(); listeners = [ $rootScope.$on('bwsEvent', function(e, walletId) { @@ -201,9 +362,55 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun ]; }); + $scope.$on("$ionicView.beforeLeave", function(event, data) { + if ($window.StatusBar) { + $window.StatusBar.backgroundColorByHexString('#1e3186'); + } + }); + $scope.$on("$ionicView.leave", function(event, data) { lodash.each(listeners, function(x) { x(); }); }); + + function setAndroidStatusBarColor() { + var SUBTRACT_AMOUNT = 15; + var rgb = hexToRgb($scope.wallet.color); + var keys = Object.keys(rgb); + keys.forEach(function(k) { + if (rgb[k] - SUBTRACT_AMOUNT < 0) { + rgb[k] = 0; + } else { + rgb[k] -= SUBTRACT_AMOUNT; + } + }); + var statusBarColorHexString = rgbToHex(rgb.r, rgb.g, rgb.b); + if ($window.StatusBar) + $window.StatusBar.backgroundColorByHexString(statusBarColorHexString); + } + + function hexToRgb(hex) { + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; + } + + function componentToHex(c) { + var hex = c.toString(16); + return hex.length == 1 ? "0" + hex : hex; + } + + function rgbToHex(r, g, b) { + return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); + } }); diff --git a/src/js/directives/clickToAccept.js b/src/js/directives/clickToAccept.js index 36cfbaeb5..63257e235 100644 --- a/src/js/directives/clickToAccept.js +++ b/src/js/directives/clickToAccept.js @@ -8,10 +8,11 @@ angular.module('copayApp.directives') transclude: true, scope: { sendStatus: '=clickSendStatus', + wallet: '=hasWalletChosen' }, link: function(scope, element, attrs) { scope.$watch('sendStatus', function() { - if(scope.sendStatus !== 'success') { + if (scope.sendStatus !== 'success') { scope.displaySendStatus = scope.sendStatus; } }); diff --git a/src/js/directives/gravatar.js b/src/js/directives/gravatar.js index c76817b5e..2f85fe0eb 100644 --- a/src/js/directives/gravatar.js +++ b/src/js/directives/gravatar.js @@ -16,6 +16,6 @@ angular.module('copayApp.directives') scope.emailHash = md5.createHash(scope.email.toLowerCase() || ''); } }, - template: '{{ name }}' - } + template: '{{ name }}' + }; }); diff --git a/src/js/directives/incomingDataMenu.js b/src/js/directives/incomingDataMenu.js index a43351438..629ee2562 100644 --- a/src/js/directives/incomingDataMenu.js +++ b/src/js/directives/incomingDataMenu.js @@ -13,8 +13,8 @@ angular.module('copayApp.directives') scope.showMenu = true; scope.https = false; - if(scope.type === 'url') { - if(scope.data.indexOf('https://') === 0) { + if (scope.type === 'url') { + if (scope.data.indexOf('https://') === 0) { scope.https = true; } } @@ -24,14 +24,16 @@ angular.module('copayApp.directives') scope.showMenu = false; $rootScope.$broadcast('incomingDataMenu.menuHidden'); }; - scope.goToUrl = function(url){ + scope.goToUrl = function(url) { externalLinkService.open(url); }; scope.sendPaymentToAddress = function(bitcoinAddress) { scope.showMenu = false; $state.go('tabs.send').then(function() { $timeout(function() { - $state.transitionTo('tabs.send.amount', {toAddress: bitcoinAddress}); + $state.transitionTo('tabs.send.amount', { + toAddress: bitcoinAddress + }); }, 50); }); }; @@ -40,11 +42,23 @@ angular.module('copayApp.directives') $timeout(function() { $state.go('tabs.send').then(function() { $timeout(function() { - $state.transitionTo('tabs.send.addressbook', {addressbookEntry: bitcoinAddress}); + $state.transitionTo('tabs.send.addressbook', { + addressbookEntry: bitcoinAddress + }); }); }); }, 100); }; + scope.scanPaperWallet = function(privateKey) { + scope.showMenu = false; + $state.go('tabs.home').then(function() { + $timeout(function() { + $state.transitionTo('tabs.home.paperWallet', { + privateKey: privateKey + }); + }, 50); + }); + }; } }; }); diff --git a/src/js/directives/slideToAccept.js b/src/js/directives/slideToAccept.js index a396e2b0d..e57aaecff 100644 --- a/src/js/directives/slideToAccept.js +++ b/src/js/directives/slideToAccept.js @@ -8,7 +8,8 @@ angular.module('copayApp.directives') transclude: true, scope: { sendStatus: '=slideSendStatus', - onConfirm: '&slideOnConfirm' + onConfirm: '&slideOnConfirm', + wallet: '=hasWalletChosen' }, link: function(scope, element, attrs) { @@ -33,9 +34,9 @@ angular.module('copayApp.directives') scope.displaySendStatus = ''; scope.$watch('sendStatus', function() { - if(!scope.sendStatus) { + if (!scope.sendStatus) { reset(); - } else if(scope.sendStatus === 'success') { + } else if (scope.sendStatus === 'success') { scope.displaySendStatus = ''; $timeout(function() { reset(); @@ -51,19 +52,20 @@ angular.module('copayApp.directives') var startTime = currentEaseStartTime; var initialPct = fromPct; var distance = pct - fromPct; + function ease() { - if(startTime !== currentEaseStartTime) { + if (startTime !== currentEaseStartTime) { return; } $window.requestAnimationFrame(function() { var now = Date.now(); var elapsed = now - startTime; - var normalizedElapsedTime = elapsed/duration; + var normalizedElapsedTime = elapsed / duration; var newVal = easeFx(normalizedElapsedTime); - var newPct = newVal*distance + initialPct; + var newPct = newVal * distance + initialPct; animateFx(newPct); scope.$digest(); - if(elapsed < duration) { + if (elapsed < duration) { ease(); } else { deferred.resolve(); @@ -93,31 +95,33 @@ angular.module('copayApp.directives') function setNewSliderStyle(pct) { var knobWidthPct = getKnobWidthPercentage(); var translatePct = pct - knobWidthPct; - if(isSliding) { - translatePct += 0.35*pct; + if (isSliding) { + translatePct += 0.35 * pct; } scope.sliderStyle = getTransformStyle(translatePct); curSliderPct = pct; } function setNewBitcoinStyle(pct) { - var translatePct = -2.25*pct; + var translatePct = -2.25 * pct; scope.bitcoinStyle = getTransformStyle(translatePct); curBitcoinPct = pct; } function setNewTextStyle(pct) { - var translatePct = -0.1*pct; + var translatePct = -0.1 * pct; scope.textStyle = getTransformStyle(translatePct); curTextPct = pct; } function getTransformStyle(translatePct) { - return {'transform': 'translateX(' + translatePct + '%)'}; + return { + 'transform': 'translateX(' + translatePct + '%)' + }; } - function getKnobWidthPercentage() { - var knobWidthPct = (KNOB_WIDTH/elm.clientWidth)*100; + function getKnobWidthPercentage() { + var knobWidthPct = (KNOB_WIDTH / elm.clientWidth) * 100; return knobWidthPct; } @@ -175,8 +179,8 @@ angular.module('copayApp.directives') function getTouchXPosition($event) { var x; - if($event.touches || $event.changedTouches) { - if($event.touches.length) { + if ($event.touches || $event.changedTouches) { + if ($event.touches.length) { x = $event.touches[0].clientX; } else { x = $event.changedTouches[0].clientX; @@ -190,18 +194,18 @@ angular.module('copayApp.directives') function getSlidPercentage($event) { var x = getTouchXPosition($event); var width = elm.clientWidth; - var pct = (x/width)*100; - if(x >= width) { + var pct = (x / width) * 100; + if (x >= width) { pct = 100; } return pct; } scope.onTouchstart = function($event) { - if(scope.isSlidFully) { + if (scope.isSlidFully) { return; } - if(!isSliding) { + if (!isSliding) { var pct = getSlidPercentage($event); if (pct > MAX_SLIDE_START_PERCENTAGE) { jiggleSlider(); @@ -209,7 +213,7 @@ angular.module('copayApp.directives') } else { isSliding = true; var knobWidthPct = getKnobWidthPercentage(); - if(pct < knobWidthPct) { + if (pct < knobWidthPct) { pct = knobWidthPct; } pct += PERCENTAGE_BUMP; @@ -219,12 +223,12 @@ angular.module('copayApp.directives') }; scope.onTouchmove = function($event) { - if(!isSliding || scope.isSlidFully) { + if (!isSliding || scope.isSlidFully) { return; } var pct = getSlidPercentage($event); var knobWidthPct = getKnobWidthPercentage(); - if(pct < knobWidthPct) { + if (pct < knobWidthPct) { pct = knobWidthPct; } pct += PERCENTAGE_BUMP; @@ -233,11 +237,11 @@ angular.module('copayApp.directives') }; scope.onTouchend = function($event) { - if(scope.isSlidFully) { + if (scope.isSlidFully) { return; } var pct = getSlidPercentage($event); - if(isSliding && pct > FULLY_SLID_PERCENTAGE) { + if (isSliding && pct > FULLY_SLID_PERCENTAGE) { pct = 100; setSliderPosition(pct); alertSlidFully(); diff --git a/src/js/directives/walletSelector.js b/src/js/directives/walletSelector.js index 97149d528..c5dfff59a 100644 --- a/src/js/directives/walletSelector.js +++ b/src/js/directives/walletSelector.js @@ -7,6 +7,7 @@ angular.module('copayApp.directives') templateUrl: 'views/includes/walletSelector.html', transclude: true, scope: { + title: '=walletSelectorTitle', show: '=walletSelectorShow', wallets: '=walletSelectorWallets', selectedWallet: '=walletSelectorSelectedWallet', diff --git a/src/js/routes.js b/src/js/routes.js index 7c81ba150..278d24646 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -151,7 +151,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr */ .state('tabs.wallet', { - url: '/wallet/{walletId}/{fromOnboarding}', + url: '/wallet/:walletId/:fromOnboarding', views: { 'tab-home@tabs': { controller: 'walletDetailsController', @@ -182,7 +182,24 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr views: { 'tab-home@tabs': { controller: 'txDetailsController', - templateUrl: 'views/modals/tx-details.html' + templateUrl: 'views/tx-details.html' + } + } + }) + .state('tabs.wallet.backupWarning', { + url: '/backupWarning/:from/:walletId', + views: { + 'tab-home@tabs': { + templateUrl: 'views/backupWarning.html' + } + } + }) + .state('tabs.wallet.backup', { + url: '/backup/:walletId', + views: { + 'tab-home@tabs': { + templateUrl: 'views/backup.html', + controller: 'backupController' } } }) @@ -269,7 +286,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('tabs.send.confirm', { - url: '/confirm/:isWallet/:toAddress/:toName/:toAmount/:toEmail/:description', + url: '/confirm/:isWallet/:toAddress/:toName/:toAmount/:toEmail/:description/:useSendMax', views: { 'tab-send@tabs': { controller: 'confirmController', @@ -538,15 +555,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.preferences.paperWallet', { - url: '/paperWallet', - views: { - 'tab-settings@tabs': { - controller: 'paperWalletController', - templateUrl: 'views/paperWallet.html' - } - } - }) /* * @@ -601,7 +609,57 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr /* * - * Back flow from receive + * Addresses + * + */ + + .state('tabs.receive.addresses', { + url: '/addresses/:walletId', + views: { + 'tab-receive@tabs': { + controller: 'addressesController', + templateUrl: 'views/addresses.html' + } + } + }) + .state('tabs.receive.allAddresses', { + url: '/allAddresses/:walletId', + views: { + 'tab-receive@tabs': { + controller: 'addressesController', + templateUrl: 'views/allAddresses.html' + } + } + }) + + /* + * + * Request Specific amount + * + */ + + .state('tabs.receive.amount', { + url: '/amount/:customAmount/:toAddress', + views: { + 'tab-receive@tabs': { + controller: 'amountController', + templateUrl: 'views/amount.html' + } + } + }) + .state('tabs.receive.customAmount', { + url: '/customAmount/:toAmount/:toAddress', + views: { + 'tab-receive@tabs': { + controller: 'customAmountController', + templateUrl: 'views/customAmount.html' + } + } + }) + + /* + * + * Init backup flow * */ @@ -625,10 +683,25 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr /* * - * Onboarding + * Paper Wallet * */ + .state('tabs.home.paperWallet', { + url: '/paperWallet/:privateKey', + views: { + 'tab-home@tabs': { + controller: 'paperWalletController', + templateUrl: 'views/paperWallet.html' + } + } + }) + /* + * + * Onboarding + * + */ + .state('onboarding', { url: '/onboarding', abstract: true, @@ -695,7 +768,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr url: '/disclaimer/:walletId/:backedUp/:resume', views: { 'onboarding': { - templateUrl: 'views/onboarding/disclaimer.html' + templateUrl: 'views/onboarding/disclaimer.html', + controller: 'disclaimerController' } } }) @@ -720,6 +794,67 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, }) + /* + * + * Feedback + * + */ + + .state('tabs.feedback', { + url: '/feedback', + views: { + 'tab-settings@tabs': { + templateUrl: 'views/feedback/send.html', + controller: 'sendController' + } + } + }) + .state('tabs.shareApp', { + url: '/shareApp/:score/:skipped/:fromSettings', + views: { + 'tab-settings@tabs': { + controller: 'completeController', + templateUrl: 'views/feedback/complete.html' + } + } + }) + .state('tabs.rate', { + url: '/rate', + abstract: true + }) + .state('tabs.rate.send', { + url: '/send/:score', + views: { + 'tab-home@tabs': { + templateUrl: 'views/feedback/send.html', + controller: 'sendController' + } + } + }) + .state('tabs.rate.complete', { + url: '/complete/:score/:skipped', + views: { + 'tab-home@tabs': { + controller: 'completeController', + templateUrl: 'views/feedback/complete.html' + } + }, + customConfig: { + hideStatusBar: true + } + }) + .state('tabs.rate.rateApp', { + url: '/rateApp/:score', + views: { + 'tab-home@tabs': { + controller: 'rateAppController', + templateUrl: 'views/feedback/rateApp.html' + } + }, + customConfig: { + hideStatusBar: true + } + }) /* * @@ -753,30 +888,28 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.buyandsell.glidera.buy', { - url: '/buy', + .state('tabs.buyandsell.glidera.amount', { + url: '/amount/:isGlidera/:glideraAccessToken', views: { 'tab-home@tabs': { - controller: 'buyGlideraController', - controllerAs: 'buy', - templateUrl: 'views/buyGlidera.html' + controller: 'amountController', + templateUrl: 'views/amount.html' } } }) - .state('tabs.buyandsell.glidera.sell', { - url: '/sell', + .state('tabs.buyandsell.glidera.confirm', { + url: '/confirm/:toAmount/:isGlidera/:glideraAccessToken', views: { 'tab-home@tabs': { - controller: 'sellGlideraController', - controllerAs: 'sell', - templateUrl: 'views/sellGlidera.html' + controller: 'confirmController', + templateUrl: 'views/confirm.html' } } }) - .state('tabs.buyandsell.glidera.preferences', { - url: '/preferences', + .state('tabs.preferences.glidera', { + url: '/glidera', views: { - 'tab-home@tabs': { + 'tab-settings@tabs': { controller: 'preferencesGlideraController', templateUrl: 'views/preferencesGlidera.html' } @@ -830,16 +963,36 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr controller: 'amazonController', templateUrl: 'views/amazon.html' } + }, + params: { + cardClaimCode: null } }) - .state('tabs.giftcards.amazon.buy', { - url: '/buy', + .state('tabs.giftcards.amazon.amount', { + url: '/amount', views: { 'tab-home@tabs': { - controller: 'buyAmazonController', - controllerAs: 'buy', - templateUrl: 'views/buyAmazon.html' + controller: 'amountController', + templateUrl: 'views/amount.html' } + }, + params: { + isGiftCard: true, + toName: 'Amazon.com Gift Card' + } + }) + .state('tabs.giftcards.amazon.confirm', { + url: '/confirm/:toAmount/:toAddress/:description/:giftCardAmountUSD/:giftCardAccessKey/:giftCardInvoiceTime/:giftCardUUID', + views: { + 'tab-home@tabs': { + controller: 'confirmController', + templateUrl: 'views/confirm.html' + } + }, + params: { + isGiftCard: true, + toName: 'Amazon.com Gift Card', + paypro: null } }) @@ -889,10 +1042,10 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr paypro: null } }) - .state('tabs.bitpayCard.preferences', { - url: '/preferences', + .state('tabs.preferences.bitpayCard', { + url: '/bitpay-card', views: { - 'tab-home@tabs': { + 'tab-settings@tabs': { controller: 'preferencesBitpayCardController', templateUrl: 'views/preferencesBitpayCard.html' } @@ -1030,4 +1183,14 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr $log.debug(' toParams:' + JSON.stringify(toParams || {})); $log.debug(' fromParams:' + JSON.stringify(fromParams || {})); }); + + $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { + if ($window.StatusBar) { + if (toState.customConfig && toState.customConfig.hideStatusBar) { + $window.StatusBar.hide(); + } else { + $window.StatusBar.show(); + } + } + }); }); diff --git a/src/js/services/amazonService.js b/src/js/services/amazonService.js index 6a39d7812..4d82bc337 100644 --- a/src/js/services/amazonService.js +++ b/src/js/services/amazonService.js @@ -70,7 +70,7 @@ angular.module('copayApp.services').factory('amazonService', function($http, $lo }); // Show pending task from the UI - storageService.setNextStep('AmazonGiftCards', true, function(err) {}); + storageService.setNextStep('AmazonGiftCards', 'true', function(err) {}); }; root.getPendingGiftCards = function(cb) { diff --git a/src/js/services/backupService.js b/src/js/services/backupService.js index b39834627..165aa4a2e 100644 --- a/src/js/services/backupService.js +++ b/src/js/services/backupService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('backupService', function backupServiceFactory($log, $timeout, $stateParams, profileService, sjcl) { + .factory('backupService', function backupServiceFactory($log, $timeout, $stateParams, profileService, sjcl, $window) { var root = {}; @@ -80,7 +80,7 @@ angular.module('copayApp.services') var walletName = (wallet.alias || '') + (wallet.alias ? '-' : '') + wallet.credentials.walletName; if (opts.noSign) walletName = walletName + '-noSign' - var filename = walletName + '-Copaybackup.aes.json'; + var filename = walletName + '-' + $window.appConfig.nameCase + 'backup.aes.json'; _download(ew, filename, cb) }; return root; diff --git a/src/js/services/bitpayCardService.js b/src/js/services/bitpayCardService.js index 4ae042f6c..bf57b805a 100644 --- a/src/js/services/bitpayCardService.js +++ b/src/js/services/bitpayCardService.js @@ -7,7 +7,7 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http, var _setError = function(msg, e) { $log.error(msg); - var error = e.data ? e.data.error : msg; + var error = (e && e.data && e.data.error) ? e.data.error : msg; return error; }; @@ -104,7 +104,7 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http, }; root.bitAuthPair = function(obj, cb) { - var deviceName = 'Unknow device'; + var deviceName = 'Unknown device'; if (platformInfo.isNW) { deviceName = require('os').platform(); } else if (platformInfo.isCordova) { @@ -143,7 +143,7 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http, root.getBitpayDebitCards(function(err, data) { if (err) return cb(err); var card = lodash.find(data, {id : cardId}); - if (!card) return cb(_setError('Not card found')); + if (!card) return cb(_setError('Card not found')); // Get invoices $http(_post('/api/v2/' + card.token, json, appIdentity)).then(function(data) { $log.info('BitPay Get Invoices: SUCCESS'); @@ -180,7 +180,7 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http, root.getBitpayDebitCards(function(err, data) { if (err) return cb(err); var card = lodash.find(data, {id : cardId}); - if (!card) return cb(_setError('Not card found')); + if (!card) return cb(_setError('Card not found')); $http(_post('/api/v2/' + card.token, json, appIdentity)).then(function(data) { $log.info('BitPay TopUp: SUCCESS'); if(data.data.error) { @@ -258,13 +258,30 @@ angular.module('copayApp.services').factory('bitpayCardService', function($http, root.remove = function(card, cb) { storageService.removeBitpayDebitCard(BITPAY_CARD_NETWORK, card, function(err) { + if (err) { + $log.error('Error removing BitPay debit card: ' + err); + // Continue, try to remove/cleanup card history + } storageService.removeBitpayDebitCardHistory(BITPAY_CARD_NETWORK, card, function(err) { - $log.info('BitPay Debit Card(s) Removed: SUCCESS'); + if (err) { + $log.error('Error removing BitPay debit card transaction history: ' + err); + return cb(err); + } + $log.info('Successfully removed BitPay debit card'); return cb(); }); }); }; + root.getRates = function(currency, cb) { + $http(_get('/rates/' + currency)).then(function(data) { + $log.info('BitPay Get Rates: SUCCESS'); + return cb(data.data.error, data.data.data); + }, function(data) { + return cb(_setError('BitPay Error: Get Rates', data)); + }); + }; + /* * CONSTANTS */ diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 618118e35..5bd6c3cc6 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -15,6 +15,16 @@ angular.module('copayApp.services').factory('configService', function(storageSer url: 'https://bws.bitpay.com/bws/api', }, + download: { + url: 'https://bitpay.com/wallet', + }, + + rateApp: { + ios: 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=1149581638&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8', + android: 'https://play.google.com/store/apps/details?id=com.bitpay.wallet', + wp: '' + }, + // wallet default config wallet: { requiredCopayers: 2, diff --git a/src/js/services/externalLinkService.js b/src/js/services/externalLinkService.js index a9818d9df..b47dd7857 100644 --- a/src/js/services/externalLinkService.js +++ b/src/js/services/externalLinkService.js @@ -21,14 +21,10 @@ angular.module('copayApp.services').service('externalLinkService', function(plat _restoreHandleOpenURL(old); } else { if (optIn) { - var message = gettextCatalog.getString(message), - title = gettextCatalog.getString(title), - okText = gettextCatalog.getString(okText), - cancelText = gettextCatalog.getString(cancelText), - openBrowser = function(res) { - if (res) window.open(url, '_system'); - _restoreHandleOpenURL(old); - }; + var openBrowser = function(res) { + if (res) window.open(url, '_system'); + _restoreHandleOpenURL(old); + }; popupService.showConfirm(title, message, okText, cancelText, openBrowser); } else { window.open(url, '_system'); diff --git a/src/js/services/feeService.js b/src/js/services/feeService.js index de1caa722..6a9691ebc 100644 --- a/src/js/services/feeService.js +++ b/src/js/services/feeService.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('feeService', function($log, $stateParams, bwcService, walletService, configService, gettext, lodash, txFormatService) { +angular.module('copayApp.services').factory('feeService', function($log, $stateParams, bwcService, walletService, configService, gettext, lodash, txFormatService, gettextCatalog) { var root = {}; // Constant fee options to translate @@ -15,48 +15,48 @@ angular.module('copayApp.services').factory('feeService', function($log, $stateP return configService.getSync().wallet.settings.feeLevel || 'normal'; }; - root.getCurrentFeeValue = function(cb) { - console.log('[feeService.js.18:getCurrentFeeValue:] TODO TODO TODO'); //TODO - // TODO TODO TODO - var wallet = profileService.getWallet($stateParams.walletId); + root.getCurrentFeeValue = function(network, cb) { + network = network || 'livenet'; var feeLevel = root.getCurrentFeeLevel(); - wallet.getFeeLevels(wallet.credentials.network, function(err, levels) { - if (err) - return cb({ - message: 'Could not get dynamic fee' - }); + root.getFeeLevels(function(err, levels) { + if (err) return cb(err); - var feeLevelValue = lodash.find(levels, { + var feeLevelValue = lodash.find(levels[network], { level: feeLevel }); - if (!feeLevelValue || !feeLevelValue.feePerKB) + + if (!feeLevelValue || !feeLevelValue.feePerKB) { return cb({ - message: 'Could not get dynamic fee for level: ' + feeLevel + message: gettextCatalog.getString("Could not get dynamic fee for level: {{feeLevel}}", { + feeLevel: feeLevel + }) }); + } var fee = feeLevelValue.feePerKB; $log.debug('Dynamic fee: ' + feeLevel + ' ' + fee + ' SAT'); + return cb(null, fee); }); }; root.getFeeLevels = function(cb) { var walletClient = bwcService.getClient(); - var unitName = configService.getSync().wallet.settings.unitName; walletClient.getFeeLevels('livenet', function(errLivenet, levelsLivenet) { walletClient.getFeeLevels('testnet', function(errTestnet, levelsTestnet) { - if (errLivenet || errTestnet) $log.debug('Could not get dynamic fee'); - else { + if (errLivenet || errTestnet) { + return cb(gettextCatalog.getString('Could not get dynamic fee')); + } else { for (var i = 0; i < 4; i++) { levelsLivenet[i]['feePerKBUnit'] = txFormatService.formatAmount(levelsLivenet[i].feePerKB) + ' ' + unitName; levelsTestnet[i]['feePerKBUnit'] = txFormatService.formatAmount(levelsTestnet[i].feePerKB) + ' ' + unitName; } } - return cb({ + return cb(null, { 'livenet': levelsLivenet, 'testnet': levelsTestnet }); diff --git a/src/js/services/feedbackService.js b/src/js/services/feedbackService.js new file mode 100644 index 000000000..b35c4c323 --- /dev/null +++ b/src/js/services/feedbackService.js @@ -0,0 +1,58 @@ +'use strict'; +angular.module('copayApp.services').factory('feedbackService', function($http, $log, $httpParamSerializer, configService) { + var root = {}; + var URL = "https://script.google.com/macros/s/AKfycbybtvNSQKUfgzgXcj3jYLlvCKrcBoktjiJ1V8_cwd2yVkpUBGe3/exec"; + + root.send = function(dataSrc, cb) { + $http(_post(dataSrc)).then(function() { + $log.info("SUCCESS: Feedback sent"); + return cb(); + }, function(err) { + $log.info("ERROR: Feedback sent anyway."); + return cb(err); + }); + }; + + var _post = function(dataSrc) { + return { + method: 'POST', + url: URL, + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8' + }, + data: $httpParamSerializer(dataSrc) + }; + }; + + root.isVersionUpdated = function(currentVersion, savedVersion) { + + if (!verifyTagFormat(currentVersion)) + return 'Cannot verify the format of version tag: ' + currentVersion; + if (!verifyTagFormat(savedVersion)) + return 'Cannot verify the format of the saved version tag: ' + savedVersion; + + var current = formatTagNumber(currentVersion); + var saved = formatTagNumber(savedVersion); + if (saved.major > current.major || (saved.major == current.major && saved.minor > current.minor)) + return false; + + return true; + + function verifyTagFormat(tag) { + var regex = /^v?\d+\.\d+\.\d+$/i; + return regex.exec(tag); + }; + + function formatTagNumber(tag) { + var formattedNumber = tag.replace(/^v/i, '').split('.'); + return { + major: +formattedNumber[0], + minor: +formattedNumber[1], + patch: +formattedNumber[2] + }; + }; + + }; + + return root; +}); diff --git a/src/js/services/glideraService.js b/src/js/services/glideraService.js index 5d0f687b3..06e30cf14 100644 --- a/src/js/services/glideraService.js +++ b/src/js/services/glideraService.js @@ -81,7 +81,7 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l $http(req).then(function(data) { $log.info('Glidera Authorization Access Token: SUCCESS'); // Show pending task from the UI - storageService.setNextStep('BuyAndSell', true, function(err) {}); + storageService.setNextStep('BuyAndSell', 'true', function(err) {}); return cb(null, data.data); }, function(data) { $log.error('Glidera Authorization Access Token: ERROR ' + data.statusText); @@ -192,8 +192,13 @@ angular.module('copayApp.services').factory('glideraService', function($http, $l }; root.get2faCode = function(token, cb) { - if (!token) return cb('Invalid Token'); + if (!token) { + $log.error('Glidera Sent 2FA code by SMS: ERROR Invalid Token'); + return cb('Invalid Token'); + } + $http(_get('/authentication/get2faCode', token)).then(function(data) { + $log.info('Glidera Sent 2FA code by SMS: SUCCESS'); return cb(null, data.status == 200 ? true : false); }, function(data) { diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 2db4832a7..7600dcb79 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -31,17 +31,31 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat if (!url) return; name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), - results = regex.exec(url); + results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); } + function checkPrivateKey(privateKey) { + try { + new bitcore.PrivateKey(privateKey, 'livenet'); + } catch (err) { + return false; + } + return true; + } + // data extensions for Payment Protocol with non-backwards-compatible request if ((/^bitcoin:\?r=[\w+]/).exec(data)) { data = decodeURIComponent(data.replace('bitcoin:?r=', '')); - $state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true}).then(function() { - $state.transitionTo('tabs.send.confirm', {paypro: data}); + $state.go('tabs.send', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.send' ? false : true + }).then(function() { + $state.transitionTo('tabs.send.confirm', { + paypro: data + }); }); return true; } @@ -55,31 +69,43 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat var addr = parsed.address ? parsed.address.toString() : ''; var message = parsed.message; - var amount = parsed.amount ? parsed.amount : ''; + var amount = parsed.amount ? parsed.amount : ''; if (parsed.r) { payproService.getPayProDetails(parsed.r, function(err, details) { handlePayPro(details); }); } else { - $state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true}); + $state.go('tabs.send', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.send' ? false : true + }); // Timeout is required to enable the "Back" button $timeout(function() { if (amount) { - $state.transitionTo('tabs.send.confirm', {toAmount: amount, toAddress: addr, description:message}); + $state.transitionTo('tabs.send.confirm', { + toAmount: amount, + toAddress: addr, + description: message + }); } else { - $state.transitionTo('tabs.send.amount', {toAddress: addr}); + $state.transitionTo('tabs.send.amount', { + toAddress: addr + }); } }, 100); } return true; - // Plain URL + // Plain URL } else if (/^https?:\/\//.test(data)) { payproService.getPayProDetails(data, function(err, details) { - if(err) { - root.showMenu({data: data, type: 'url'}); + if (err) { + root.showMenu({ + data: data, + type: 'url' + }); return; } handlePayPro(details); @@ -87,47 +113,75 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat }); // Plain Address } else if (bitcore.Address.isValid(data, 'livenet') || bitcore.Address.isValid(data, 'testnet')) { - if($state.includes('tabs.scan')) { - root.showMenu({data: data, type: 'bitcoinAddress'}); + if ($state.includes('tabs.scan')) { + root.showMenu({ + data: data, + type: 'bitcoinAddress' + }); } else { goToAmountPage(data); } } else if (data && data.indexOf($window.appConfig.name + '://glidera') === 0) { - return $state.go('uriglidera', {url: data}); + return $state.go('uriglidera', { + url: data + }); } else if (data && data.indexOf($window.appConfig.name + '://coinbase') === 0) { - return $state.go('uricoinbase', {url: data}); + return $state.go('uricoinbase', { + url: data + }); // BitPayCard Authentication } else if (data && data.indexOf($window.appConfig.name + '://') === 0) { - var secret = getParameterByName('secret', data); - var email = getParameterByName('email', data); - var otp = getParameterByName('otp', data); - $state.go('tabs.home', {}, {'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true}).then(function() { - $state.transitionTo('tabs.bitpayCardIntro', { - secret: secret, - email: email, - otp: otp - }); + var secret = getParameterByName('secret', data); + var email = getParameterByName('email', data); + var otp = getParameterByName('otp', data); + $state.go('tabs.home', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.home' ? false : true + }).then(function() { + $state.transitionTo('tabs.bitpayCardIntro', { + secret: secret, + email: email, + otp: otp }); - return true; + }); + return true; - // Join + // Join } else if (data && data.match(/^copay:[0-9A-HJ-NP-Za-km-z]{70,80}$/)) { - $state.go('tabs.home', {}, {'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true}).then(function() { - $state.transitionTo('tabs.add.join', {url: data}); + $state.go('tabs.home', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.home' ? false : true + }).then(function() { + $state.transitionTo('tabs.add.join', { + url: data + }); }); return true; - // Old join + // Old join } else if (data && data.match(/^[0-9A-HJ-NP-Za-km-z]{70,80}$/)) { - $state.go('tabs.home', {}, {'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true}).then(function() { - $state.transitionTo('tabs.add.join', {url: data}); + $state.go('tabs.home', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.home' ? false : true + }).then(function() { + $state.transitionTo('tabs.add.join', { + url: data + }); }); return true; + } else if (data && (data.substring(0, 2) == '6P' || checkPrivateKey(data))) { + root.showMenu({ + data: data, + type: 'privateKey' + }); } else { - if($state.includes('tabs.scan')) { - root.showMenu({data: data, type: 'text'}); + if ($state.includes('tabs.scan')) { + root.showMenu({ + data: data, + type: 'text' + }); } } @@ -136,13 +190,18 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat }; function goToAmountPage(toAddress) { - $state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true}); + $state.go('tabs.send', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.send' ? false : true + }); $timeout(function() { - $state.transitionTo('tabs.send.amount', {toAddress: toAddress}); + $state.transitionTo('tabs.send.amount', { + toAddress: toAddress + }); }, 100); } - function handlePayPro(payProDetails){ + function handlePayPro(payProDetails) { var stateParams = { toAmount: payProDetails.amount, toAddress: payProDetails.toAddress, @@ -150,7 +209,10 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat paypro: payProDetails }; scannerService.pausePreview(); - $state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true}).then(function() { + $state.go('tabs.send', {}, { + 'reload': true, + 'notify': $state.current.name == 'tabs.send' ? false : true + }).then(function() { $timeout(function() { $state.transitionTo('tabs.send.confirm', stateParams); }); diff --git a/src/js/services/localStorage.js b/src/js/services/localStorage.js index 8a0cc1610..e6327e300 100644 --- a/src/js/services/localStorage.js +++ b/src/js/services/localStorage.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.services') - .factory('localStorageService', function(platformInfo, $timeout, $log) { + .factory('localStorageService', function(platformInfo, $timeout, $log, lodash) { var isNW = platformInfo.isNW; var isChromeApp = platformInfo.isChromeApp; var root = {}; @@ -45,6 +45,14 @@ angular.module('copayApp.services') root.set = function(k, v, cb) { if (isChromeApp || isNW) { var obj = {}; + + if (lodash.isObject(v)) { + v = JSON.stringify(v); + } + if (!lodash.isString(v)) { + v = v.toString(); + } + obj[k] = v; chrome.storage.local.set(obj, cb); diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index d1bcf2fe0..b543430ab 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -25,7 +25,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'recreating': gettext('Recreating Wallet...'), 'rejectTx': gettext('Rejecting payment proposal'), 'removeTx': gettext('Deleting payment proposal'), - 'retrivingInputs': gettext('Retrieving inputs information'), + 'retrievingInputs': gettext('Retrieving inputs information'), 'scanning': gettext('Scanning Wallet funds...'), 'sendingTx': gettext('Sending transaction'), 'signingTx': gettext('Signing transaction'), @@ -33,6 +33,13 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'validatingWallet': gettext('Validating wallet integrity...'), 'validatingWords': gettext('Validating recovery phrase...'), 'loadingTxInfo': gettext('Loading transaction info...'), + 'sendingFeedback': gettext('Sending feedback...'), + 'generatingNewAddress': gettext('Generating new address...'), + 'gettingAddresses': gettext('Getting addresses...'), + 'sendingByEmail': gettext('Preparing addresses...'), + 'sending2faCode': gettext('Sending 2FA code...'), + 'buyingBitcoin': gettext('Buying Bitcoin...'), + 'sellingBitcoin': gettext('Selling Bitcoin...') }; root.clear = function() { @@ -64,7 +71,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti var showName = $filter('translate')(processNames[name] || name); - if(customHandler) { + if (customHandler) { customHandler(processName, showName, isOn); } else if (root.onGoingProcessName) { if (isCordova) { diff --git a/src/js/services/popupService.js b/src/js/services/popupService.js index 8a78b6035..7810771b8 100644 --- a/src/js/services/popupService.js +++ b/src/js/services/popupService.js @@ -34,7 +34,8 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni $ionicPopup.prompt({ title: title, subTitle: message, - inputType: opts.inputType, + cssClass: opts.class, + template: '', inputPlaceholder: opts.inputPlaceholder, defaultText: opts.defaultText }).then(function(res) { @@ -51,12 +52,12 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni var _cordovaConfirm = function(title, message, okText, cancelText, cb) { var onConfirm = function(buttonIndex) { - if (buttonIndex == 1) return cb(true); + if (buttonIndex == 2) return cb(true); else return cb(false); } okText = okText || gettextCatalog.getString('OK'); cancelText = cancelText || gettextCatalog.getString('Cancel'); - navigator.notification.confirm(message, onConfirm, title, [okText, cancelText]); + navigator.notification.confirm(message, onConfirm, title, [cancelText, okText]); }; var _cordovaPrompt = function(title, message, opts, cb) { @@ -118,7 +119,7 @@ angular.module('copayApp.services').service('popupService', function($log, $ioni this.showPrompt = function(title, message, opts, cb) { $log.warn(title ? (title + ': ' + message) : message); - opts = opts || {}; + opts = opts ||  {}; if (isCordova && !opts.forceHTMLPrompt) _cordovaPrompt(title, message, opts, cb); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 4c65a3f48..e4bef4483 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('profileService', function profileServiceFactory($rootScope, $timeout, $filter, $log, sjcl, lodash, storageService, bwcService, configService, pushNotificationsService, gettext, gettextCatalog, bwcError, uxLanguage, platformInfo, txFormatService, $state) { + .factory('profileService', function profileServiceFactory($rootScope, $timeout, $filter, $log, sjcl, lodash, storageService, bwcService, configService, pushNotificationsService, gettextCatalog, bwcError, uxLanguage, platformInfo, txFormatService, $state) { var isChromeApp = platformInfo.isChromeApp; @@ -361,14 +361,14 @@ angular.module('copayApp.services') } catch (ex) { $log.info(ex); - return cb(gettext('Could not create: Invalid wallet recovery phrase')); + return cb(gettextCatalog.getString('Could not create: Invalid wallet recovery phrase')); } } else if (opts.extendedPrivateKey) { try { walletClient.seedFromExtendedPrivateKey(opts.extendedPrivateKey); } catch (ex) { $log.warn(ex); - return cb(gettext('Could not create using the specified extended private key')); + return cb(gettextCatalog.getString('Could not create using the specified extended private key')); } } else if (opts.extendedPublicKey) { try { @@ -378,7 +378,7 @@ angular.module('copayApp.services') }); } catch (ex) { $log.warn("Creating wallet from Extended Public Key Arg:", ex, opts); - return cb(gettext('Could not create using the specified extended public key')); + return cb(gettextCatalog.getString('Could not create using the specified extended public key')); } } else { var lang = uxLanguage.getCurrentLanguage(); @@ -421,7 +421,7 @@ angular.module('copayApp.services') singleAddress: opts.singleAddress, walletPrivKey: opts.walletPrivKey, }, function(err, secret) { - if (err) return bwcError.cb(err, gettext('Error creating wallet'), cb); + if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb); return cb(null, walletClient, secret); }); }); @@ -451,11 +451,11 @@ angular.module('copayApp.services') if (lodash.find(root.profile.credentials, { 'walletId': walletData.walletId })) { - return cb(gettext('Cannot join the same wallet more that once')); + return cb(gettextCatalog.getString('Cannot join the same wallet more that once')); } } catch (ex) { $log.debug(ex); - return cb(gettext('Bad wallet invitation')); + return cb(gettextCatalog.getString('Bad wallet invitation')); } opts.networkName = walletData.network; $log.debug('Joining Wallet:', opts); @@ -464,7 +464,7 @@ angular.module('copayApp.services') if (err) return cb(err); walletClient.joinWallet(opts.secret, opts.myName || 'me', {}, function(err) { - if (err) return bwcError.cb(err, gettext('Could not join wallet'), cb); + if (err) return bwcError.cb(err, gettextCatalog.getString('Could not join wallet'), cb); addAndBindWalletClient(walletClient, { bwsurl: opts.bwsurl }, cb); @@ -521,12 +521,12 @@ angular.module('copayApp.services') // Adds and bind a new client to the profile var addAndBindWalletClient = function(client, opts, cb) { if (!client || !client.credentials) - return cb(gettext('Could not access wallet')); + return cb(gettextCatalog.getString('Could not access wallet')); var walletId = client.credentials.walletId if (!root.profile.addWallet(JSON.parse(client.export()))) - return cb(gettext('Wallet already in Copay')); + return cb(gettextCatalog.getString('Wallet already in Copay')); var skipKeyValidation = root.profile.isChecked(platformInfo.ua, walletId); @@ -595,15 +595,7 @@ angular.module('copayApp.services') password: opts.password }); } catch (err) { - return cb(gettext('Could not import. Check input file and spending password')); - } - - if (walletClient.hasPrivKeyEncrypted()) { - try { - walletClient.disablePrivateKeyEncryption(); - } catch (e) { - $log.warn(e); - } + return cb(gettextCatalog.getString('Could not import. Check input file and spending password')); } str = JSON.parse(str); @@ -634,7 +626,7 @@ angular.module('copayApp.services') if (err instanceof errors.NOT_AUTHORIZED) return cb(err); - return bwcError.cb(err, gettext('Could not import'), cb); + return bwcError.cb(err, gettextCatalog.getString('Could not import'), cb); } addAndBindWalletClient(walletClient, { @@ -665,7 +657,7 @@ angular.module('copayApp.services') if (err instanceof errors.NOT_AUTHORIZED) return cb(err); - return bwcError.cb(err, gettext('Could not import'), cb); + return bwcError.cb(err, gettextCatalog.getString('Could not import'), cb); } addAndBindWalletClient(walletClient, { @@ -688,7 +680,7 @@ angular.module('copayApp.services') if (err instanceof errors.NOT_AUTHORIZED) err.name = 'WALLET_DOES_NOT_EXIST'; - return bwcError.cb(err, gettext('Could not import'), cb); + return bwcError.cb(err, gettextCatalog.getString('Could not import'), cb); } addAndBindWalletClient(walletClient, { @@ -773,6 +765,12 @@ angular.module('copayApp.services') }); } + if (opts.m) { + ret = lodash.filter(ret, function(w) { + return (w.credentials.m == opts.m); + }); + } + if (opts.onlyComplete) { ret = lodash.filter(ret, function(w) { return w.isComplete(); @@ -795,7 +793,7 @@ angular.module('copayApp.services') root.getNotifications = function(opts, cb) { opts = opts || {}; - var TIME_STAMP = 60 * 60 * 24 * 7; + var TIME_STAMP = 60 * 60 * 6; var MAX = 100; var typeFilter = { @@ -861,26 +859,25 @@ angular.module('copayApp.services') var finale = shown; // GROUPING DISABLED! - // var finale = [], - // prev; - // - // - // // Item grouping... DISABLED. - // - // // REMOVE (if we want 1-to-1 notification) ???? - // lodash.each(shown, function(x) { - // if (prev && prev.walletId === x.walletId && prev.txpId && prev.txpId === x.txpId && prev.creatorId && prev.creatorId === x.creatorId) { - // prev.types.push(x.type); - // prev.data = lodash.assign(prev.data, x.data); - // prev.txid = prev.txid || x.txid; - // prev.amountStr = prev.amountStr || x.amountStr; - // prev.creatorName = prev.creatorName || x.creatorName; - // } else { - // finale.push(x); - // prev = x; - // } - // }); - // + var finale = [], + prev; + + + // Item grouping... DISABLED. + + // REMOVE (if we want 1-to-1 notification) ???? + lodash.each(shown, function(x) { + if (prev && prev.walletId === x.walletId && prev.txpId && prev.txpId === x.txpId && prev.creatorId && prev.creatorId === x.creatorId) { + prev.types.push(x.type); + prev.data = lodash.assign(prev.data, x.data); + prev.txid = prev.txid || x.txid; + prev.amountStr = prev.amountStr || x.amountStr; + prev.creatorName = prev.creatorName || x.creatorName; + } else { + finale.push(x); + prev = x; + } + }); var u = bwcService.getUtils(); lodash.each(finale, function(x) { diff --git a/src/js/services/rateService.js b/src/js/services/rateService.js index 394c556b4..9cbfe2821 100644 --- a/src/js/services/rateService.js +++ b/src/js/services/rateService.js @@ -111,18 +111,24 @@ RateService.prototype.fromFiat = function(amount, code) { return amount / this.getRate(code) * this.BTC_TO_SAT; }; -RateService.prototype.listAlternatives = function() { +RateService.prototype.listAlternatives = function(sort) { var self = this; if (!this.isAvailable()) { return []; } - return self.lodash.map(this.getAlternatives(), function(item) { + var alternatives = self.lodash.map(this.getAlternatives(), function(item) { return { name: item.name, isoCode: item.isoCode } }); + if (sort) { + alternatives.sort(function(a, b) { + return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1; + }); + } + return self.lodash.uniq(alternatives, 'isoCode'); }; angular.module('copayApp.services').factory('rateService', function($http, lodash) { diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 340b25eb5..bd1d41fd8 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -77,23 +77,23 @@ angular.module('copayApp.services') //////////////////////////////////////////////////////////////////////////// // // UPGRADING STORAGE - // + // // 1. Write a function to upgrade the desired storage key(s). The function should have the protocol: - // + // // _upgrade_x(key, network, cb), where: - // + // // `x` is the name of the storage key - // `key` is the name of the storage key being upgraded + // `key` is the name of the storage key being upgraded // `network` is one of 'livenet', 'testnet' // // 2. Add the storage key to `_upgraders` object using the name of the key as the `_upgrader` object key // with the value being the name of the upgrade function (e.g., _upgrade_x). In order to avoid conflicts // when a storage key is involved in multiple upgraders as well as predicte the order in which upgrades - // occur the `_upgrader` object key should be prefixed with '##_' (e.g., '01_') to create a unique and + // occur the `_upgrader` object key should be prefixed with '##_' (e.g., '01_') to create a unique and // sortable name. This format is interpreted by the _upgrade() function. - // + // // Upgraders are executed in numerical order per the '##_' object key prefix. - // + // var _upgraders = { '00_bitpayDebitCards' : _upgrade_bitpayDebitCards, // 2016-11: Upgrade bitpayDebitCards-x to bitpayAccounts-x '01_bitpayCardCredentials' : _upgrade_bitpayCardCredentials // 2016-11: Upgrade bitpayCardCredentials-x to appIdentity-x @@ -244,6 +244,14 @@ angular.module('copayApp.services') storage.remove('profile', cb); }; + root.setFeedbackInfo = function(feedbackValues, cb) { + storage.set('feedback', feedbackValues, cb); + }; + + root.getFeedbackInfo = function(cb) { + storage.get('feedback', cb); + }; + root.storeFocusedWalletId = function(id, cb) { storage.set('focusedWalletId', id || '', cb); }; @@ -390,6 +398,14 @@ angular.module('copayApp.services') storage.remove('nextStep-' + service, cb); }; + root.setLastCurrencyUsed = function(lastCurrencyUsed, cb) { + storage.set('lastCurrencyUsed', lastCurrencyUsed, cb) + }; + + root.getLastCurrencyUsed = function(cb) { + storage.get('lastCurrencyUsed', cb) + }; + root.checkQuota = function() { var block = ''; // 50MB @@ -459,7 +475,10 @@ angular.module('copayApp.services') if (lodash.isEmpty(data) || !data.email) return cb('No card(s) to set'); storage.get('bitpayAccounts-' + network, function(err, bitpayAccounts) { if (err) return cb(err); - bitpayAccounts = JSON.parse(bitpayAccounts) || {}; + if (lodash.isString(bitpayAccounts)) { + bitpayAccounts = JSON.parse(bitpayAccounts); + } + bitpayAccounts = bitpayAccounts || {}; bitpayAccounts[data.email] = bitpayAccounts[data.email] || {}; bitpayAccounts[data.email]['bitpayDebitCards-' + network] = data; storage.set('bitpayAccounts-' + network, JSON.stringify(bitpayAccounts), cb); @@ -468,7 +487,10 @@ angular.module('copayApp.services') root.getBitpayDebitCards = function(network, cb) { storage.get('bitpayAccounts-' + network, function(err, bitpayAccounts) { - bitpayAccounts = JSON.parse(bitpayAccounts) || {}; + if (lodash.isString(bitpayAccounts)) { + bitpayAccounts = JSON.parse(bitpayAccounts); + } + bitpayAccounts = bitpayAccounts || {}; var cards = []; Object.keys(bitpayAccounts).forEach(function(email) { // For the UI, add the account email to the card object. @@ -490,15 +512,20 @@ angular.module('copayApp.services') if (lodash.isEmpty(card) || !card.eid) return cb('No card to remove'); storage.get('bitpayAccounts-' + network, function(err, bitpayAccounts) { if (err) cb(err); - bitpayAccounts = JSON.parse(bitpayAccounts) || {}; + if (lodash.isString(bitpayAccounts)) { + bitpayAccounts = JSON.parse(bitpayAccounts); + } + bitpayAccounts = bitpayAccounts || {}; Object.keys(bitpayAccounts).forEach(function(userId) { var data = bitpayAccounts[userId]['bitpayDebitCards-' + network]; - var newCards = lodash.reject(data.cards, {'eid': card.eid}); + var newCards = lodash.reject(data.cards, { + 'eid': card.eid + }); data.cards = newCards; root.setBitpayDebitCards(network, data, function(err) { if (err) cb(err); // If there are no more cards in storage then re-enable the next step entry. - root.getBitpayDebitCards(network, function(err, cards){ + root.getBitpayDebitCards(network, function(err, cards) { if (err) cb(err); if (cards.length == 0) { root.removeNextStep('BitpayCard', cb); diff --git a/src/js/services/trezor.js b/src/js/services/trezor.js index 199709886..f0a40c9dd 100644 --- a/src/js/services/trezor.js +++ b/src/js/services/trezor.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.services') - .factory('trezor', function($log, $timeout, gettext, lodash, bitcore, hwWallet) { + .factory('trezor', function($log, $timeout, lodash, bitcore, hwWallet) { var root = {}; var SETTLE_TIME = 3000; @@ -82,7 +82,7 @@ angular.module('copayApp.services') if (txp.outputs.length > 1) return callback('Only single output TXPs are supported in TREZOR'); } else { - return callback('Unknown TXP at TREZOR'); + return callback('Unknown TXP at TREZOR'); } if (txp.outputs) { diff --git a/src/js/services/uxLanguage.js b/src/js/services/uxLanguage.js index 2f9e76043..9a5621825 100644 --- a/src/js/services/uxLanguage.js +++ b/src/js/services/uxLanguage.js @@ -8,42 +8,39 @@ angular.module('copayApp.services') root.availableLanguages = [{ name: 'English', isoCode: 'en', - }, { - name: 'Český', - isoCode: 'cs', - }, { - name: 'Français', - isoCode: 'fr', - }, { - name: 'Italiano', - isoCode: 'it', - }, { - name: 'Deutsch', - isoCode: 'de', }, { name: 'Español', isoCode: 'es', }, { - name: '日本語', - isoCode: 'ja', - useIdeograms: true, - }, { - name: '中文(简体)', - isoCode: 'zh', - useIdeograms: true, - }, { - name: 'Polski', - isoCode: 'pl', - }, { - name: 'Pусский', - isoCode: 'ru', + name: 'Français', + isoCode: 'fr', + // }, { + // name: 'Český', + // isoCode: 'cs', + // }, { + // name: 'Italiano', + // isoCode: 'it', + // }, { + // name: 'Deutsch', + // isoCode: 'de', + // }, { + // name: '日本語', + // isoCode: 'ja', + // useIdeograms: true, + // }, { + // name: '中文(简体)', + // isoCode: 'zh', + // useIdeograms: true, + // }, { + // name: 'Polski', + // isoCode: 'pl', + // }, { + // name: 'Pусский', + // isoCode: 'ru', }]; root._detect = function(cb) { - - return cb('en'); //disable auto detection for release; - var userLang, androidLang; if (navigator && navigator.globalization) { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index a2dea86dc..4546dc4af 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -29,16 +29,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; - // // RECEIVE - // // Check address - // root.isUsed(wallet.walletId, balance.byAddress, function(err, used) { - // if (used) { - // $log.debug('Address used. Creating new'); - // $rootScope.$emit('Local/AddressIsUsed'); - // } - // }); - // - var _signWithLedger = function(wallet, txp, cb) { $log.info('Requesting Ledger Chrome app to sign the transaction'); @@ -67,32 +57,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; - // TODO - // This handles errors from BWS/index which normally - // trigger from async events (like updates). - // Debounce function avoids multiple popups - var _handleError = function(err) { - $log.warn('wallet ERROR: ', err); - - $log.warn('TODO'); - return; // TODO!!! - if (err instanceof errors.NOT_AUTHORIZED) { - - console.log('[walletService.js.93] TODO NOT AUTH'); //TODO - // TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO - wallet.notAuthorized = true; - $state.go('tabs.home'); - } else if (err instanceof errors.NOT_FOUND) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not access Wallet Service: Not found')); - } else { - var msg = "" - $rootScope.$emit('Local/ClientError', (err.error ? err.error : err)); - popupService.showAlert(gettextCatalog.getString('Error'), bwcError.msg(err, gettextCatalog.getString('Error at Wallet Service'))); - } - }; - root.handleError = lodash.debounce(_handleError, 1000); - - root.invalidateCache = function(wallet) { if (wallet.cachedStatus) wallet.cachedStatus.isValid = false; @@ -180,8 +144,9 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (err instanceof errors.NOT_AUTHORIZED) { return cb('WALLET_NOT_REGISTERED'); } - return cb(bwcError.msg(err, gettext('Could not update Wallet'))); + return cb(err); } + return cb(null, ret); }); }; @@ -196,19 +161,22 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim // Address with Balance cache.balanceByAddress = balance.byAddress; + // Total wallet balance is same regardless of 'spend unconfirmed funds' setting. + cache.totalBalanceSat = balance.totalAmount; + // Spend unconfirmed funds if (config.spendUnconfirmed) { - cache.totalBalanceSat = balance.totalAmount; cache.lockedBalanceSat = balance.lockedAmount; cache.availableBalanceSat = balance.availableAmount; cache.totalBytesToSendMax = balance.totalBytesToSendMax; - cache.pendingAmount = null; + cache.pendingAmount = 0; + cache.spendableAmount = balance.totalAmount - balance.lockedAmount; } else { - cache.totalBalanceSat = balance.totalConfirmedAmount; cache.lockedBalanceSat = balance.lockedConfirmedAmount; cache.availableBalanceSat = balance.availableConfirmedAmount; cache.totalBytesToSendMax = balance.totalBytesToSendConfirmedMax; cache.pendingAmount = balance.totalAmount - balance.totalConfirmedAmount; + cache.spendableAmount = balance.totalConfirmedAmount - balance.lockedAmount; } // Selected unit @@ -220,25 +188,35 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + cache.unitName; cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + cache.unitName; cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + cache.unitName; - cache.pendingBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat + (cache.pendingAmount === null? 0 : cache.pendingAmount)) + ' ' + cache.unitName; - - if (cache.pendingAmount !== null && cache.pendingAmount !== 0) { - cache.pendingAmountStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + cache.unitName; - } else { - cache.pendingAmountStr = null; - } + cache.spendableBalanceStr = txFormatService.formatAmount(cache.spendableAmount) + ' ' + cache.unitName; + cache.pendingBalanceStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + cache.unitName; cache.alternativeName = config.settings.alternativeName; cache.alternativeIsoCode = config.settings.alternativeIsoCode; + // Check address + root.isAddressUsed(wallet, balance.byAddress, function(err, used) { + if (used) { + $log.debug('Address used. Creating new'); + // Force new address + root.getAddress(wallet, true, function(err, addr) { + $log.debug('New address: ', addr); + }); + } + }); + rateService.whenAvailable(function() { var totalBalanceAlternative = rateService.toFiat(cache.totalBalanceSat, cache.alternativeIsoCode); + var pendingBalanceAlternative = rateService.toFiat(cache.pendingAmount, cache.alternativeIsoCode); var lockedBalanceAlternative = rateService.toFiat(cache.lockedBalanceSat, cache.alternativeIsoCode); + var spendableBalanceAlternative = rateService.toFiat(cache.spendableAmount, cache.alternativeIsoCode); var alternativeConversionRate = rateService.toFiat(100000000, cache.alternativeIsoCode); cache.totalBalanceAlternative = $filter('formatFiatAmount')(totalBalanceAlternative); + cache.pendingBalanceAlternative = $filter('formatFiatAmount')(pendingBalanceAlternative); cache.lockedBalanceAlternative = $filter('formatFiatAmount')(lockedBalanceAlternative); + cache.spendableBalanceAlternative = $filter('formatFiatAmount')(spendableBalanceAlternative); cache.alternativeConversionRate = $filter('formatFiatAmount')(alternativeConversionRate); cache.alternativeBalanceAvailable = true; @@ -337,7 +315,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim return tx.txid != endingTxid; }); - return cb(null, res, res.length == limit); + return cb(null, res, res.length >= limit); }); }; @@ -428,7 +406,16 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim function getNewTxs(newTxs, skip, cb) { getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res, shouldContinue) { - if (err) return cb(err); + if (err) { + $log.warn(bwcError.msg(err, 'BWS Error')); //TODO + if (err instanceof errors.CONNECTION_ERROR || (err.message && err.message.match(/5../))) { + log.info('Retrying history download in 5 secs...'); + return $timeout(function() { + return getNewTxs(newTxs, skip, cb); + }, 5000); + }; + return cb(err); + } newTxs = newTxs.concat(processNewTxs(wallet, lodash.compact(res))); @@ -587,20 +574,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (lodash.isEmpty(txp) || lodash.isEmpty(wallet)) return cb('MISSING_PARAMETER'); - if (txp.sendMax) { - wallet.createTxProposal(txp, function(err, createdTxp) { - if (err) return cb(err); - else return cb(null, createdTxp); - }); - } else { - wallet.createTxProposal(txp, function(err, createdTxp) { - if (err) return cb(err); - else { - $log.debug('Transaction created'); - return cb(null, createdTxp); - } - }); - } + wallet.createTxProposal(txp, function(err, createdTxp) { + if (err) return cb(err); + else { + $log.debug('Transaction created'); + return cb(null, createdTxp); + } + }); }; root.publishTx = function(wallet, txp, cb) { @@ -760,12 +740,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; - root.isUsed = function(wallet, byAddress, cb) { + // Check address + root.isAddressUsed = function(wallet, byAddress, cb) { storageService.getLastAddress(wallet.id, function(err, addr) { var used = lodash.find(byAddress, { address: addr }); - return cb(null, used); + return cb(err, used); }); }; @@ -797,13 +778,30 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; - root.getAddress = function(wallet, forceNew, cb) { + root.getMainAddresses = function(wallet, opts, cb) { + opts = opts || {}; + opts.reverse = true; + wallet.getMainAddresses(opts, function(err, addresses) { + return cb(err, addresses); + }); + }; + root.getBalance = function(wallet, opts, cb) { + opts = opts || {}; + wallet.getBalance(opts, function(err, resp) { + return cb(err, resp); + }); + }; + + root.getAddress = function(wallet, forceNew, cb) { storageService.getLastAddress(wallet.id, function(err, addr) { if (err) return cb(err); if (!forceNew && addr) return cb(null, addr); + if (!wallet.isComplete()) + return cb('WALLET_NOT_COMPLETE'); + createAddress(wallet, function(err, _addr) { if (err) return cb(err, addr); storageService.storeLastAddress(wallet.id, _addr, function() { @@ -829,7 +827,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var askPassword = function(name, title, cb) { var opts = { inputType: 'password', - forceHTMLPrompt: true + forceHTMLPrompt: true, + class: 'text-warn' }; popupService.showPrompt(title, name, opts, function(res) { if (!res) return cb(); @@ -839,9 +838,12 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.encrypt = function(wallet, cb) { - askPassword(wallet.name, gettext('Enter new spending password'), function(password) { + var title = gettextCatalog.getString('Enter new spending password'); + var warnMsg = gettextCatalog.getString('Your wallet key will be encrypted. The Spending Password cannot be recovered. Be sure to write it down.'); + askPassword(warnMsg, title, function(password) { if (!password) return cb('no password'); - askPassword(wallet.name, gettext('Confirm you new spending password'), function(password2) { + title = gettextCatalog.getString('Confirm you new spending password'); + askPassword(warnMsg, gettextCatalog.getString('Confirm you new spending password'), function(password2) { if (!password2 || password != password2) return cb('password mismatch'); @@ -854,7 +856,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.decrypt = function(wallet, cb) { $log.debug('Disabling private key encryption for' + wallet.name); - askPassword(wallet.name, gettext('Enter Spending Password'), function(password) { + askPassword(null, gettextCatalog.getString('Enter Spending Password'), function(password) { if (!password) return cb('no password'); try { @@ -869,7 +871,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.handleEncryptedWallet = function(wallet, cb) { if (!root.isEncrypted(wallet)) return cb(); - askPassword(wallet.name, gettext('Enter Spending Password'), function(password) { + askPassword(wallet.name, gettextCatalog.getString('Enter Spending Password'), function(password) { if (!password) return cb('No password'); if (!wallet.checkPassword(password)) return cb('Wrong password'); @@ -892,20 +894,14 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }; - root.onlyPublish = function(wallet, txp, cb) { - ongoingProcess.set('sendingTx', true); + root.onlyPublish = function(wallet, txp, cb, customStatusHandler) { + ongoingProcess.set('sendingTx', true, customStatusHandler); root.publishTx(wallet, txp, function(err, publishedTxp) { root.invalidateCache(wallet); - - ongoingProcess.set('sendingTx', false); - if (err) return cb(err); - - var type = root.getViewStatus(wallet, createdTxp); - root.openStatusModal(type, createdTxp, function() { - $rootScope.$emit('Local/TxAction', wallet.id); - return; - }); - return cb(null, publishedTxp); + ongoingProcess.set('sendingTx', false, customStatusHandler); + if (err) return cb(bwcError.msg(err)); + $rootScope.$emit('Local/TxAction', wallet.id); + return cb(); }); }; @@ -934,13 +930,13 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim } root.prepare(wallet, function(err, password) { - if (err) return cb('Prepare error: ' + err); + if (err) return cb(bwcError.msg(err)); ongoingProcess.set('sendingTx', true, customStatusHandler); publishFn(wallet, txp, function(err, publishedTxp) { ongoingProcess.set('sendingTx', false, customStatusHandler); - if (err) return cb('Send Error: ' + err); + if (err) return cb(bwcError.msg(err)); ongoingProcess.set('signingTx', true, customStatusHandler); root.signTx(wallet, publishedTxp, password, function(err, signedTxp) { @@ -950,10 +946,9 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (err) { $log.warn('sign error:' + err); - // TODO? - var msg = err.message ? + var msg = err && err.message ? err.message : - gettext('The payment was created but could not be completed. Please try again from home screen'); + gettextCatalog.getString('The payment was created but could not be completed. Please try again from home screen'); $rootScope.$emit('Local/TxAction', wallet.id); return cb(msg); @@ -963,7 +958,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim ongoingProcess.set('broadcastingTx', true, customStatusHandler); root.broadcastTx(wallet, signedTxp, function(err, broadcastedTxp) { ongoingProcess.set('broadcastingTx', false, customStatusHandler); - if (err) return cb('sign error' + err); + if (err) return cb(bwcError.msg(err)); $rootScope.$emit('Local/TxAction', wallet.id); var type = root.getViewStatus(wallet, broadcastedTxp); @@ -1090,6 +1085,12 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim return type; }; + root.getSendMaxInfo = function(wallet, opts, cb) { + opts = opts || {}; + wallet.getSendMaxInfo(opts, function(err, res) { + return cb(err, res); + }); + }; return root; }); diff --git a/src/sass/buttons.scss b/src/sass/buttons.scss index 7f35657e2..dd750d28f 100644 --- a/src/sass/buttons.scss +++ b/src/sass/buttons.scss @@ -19,8 +19,7 @@ $button-secondary-border: transparent; $button-secondary-active-bg: darken($subtle-gray, 5%); $button-secondary-active-border: transparent; -%button-standard, -click-to-accept { +%button-standard { width: 85%; max-width: 300px; margin-left: auto; diff --git a/src/sass/ionic.scss b/src/sass/ionic.scss index 1c2fc0a87..7a5597fb7 100644 --- a/src/sass/ionic.scss +++ b/src/sass/ionic.scss @@ -6,9 +6,6 @@ /* Ionic Overrides and Workarounds */ // Please include a description of the problem solved by the workaround. -// class to dynamically hide the ion-nav-bar for v1 Amazon flow -ion-nav-bar.hide { display: block !important; } - // the ion tabs element never needs it's own background (backgrounds are // rendered by the tabs), and the default background would cover the scanner ion-tabs.ion-tabs-transparent { @@ -40,3 +37,20 @@ $placeholder-icon-padding: 10px; .card { margin: ($content-padding * 2) 14px; } + +// A somewhat dirty solution to the nav-bar "flashing" during page transitions. +// Since the old nav-bar is hidden before the new one is shown, this pseudo +// element fills the space with the proper background color. +ion-view.deflash-blue:before { + content: " "; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + height: $bar-height; + background-color: $royal; +} +.platform-ios.platform-cordova:not(.fullscreen) ion-view.deflash-blue:before { + height: $bar-height + $ios-statusbar-height; +} diff --git a/src/sass/shame.scss b/src/sass/shame.scss index 3e5e16f68..4100069e0 100644 --- a/src/sass/shame.scss +++ b/src/sass/shame.scss @@ -30,6 +30,17 @@ } } +.text-warn { + .popup-sub-title { + margin-top: 15px; + color: #e42112 !important; + } +} + +.item-toggle, .item { + white-space: normal; +} + .input-label { max-width: none; width: inherit; @@ -437,3 +448,7 @@ input[type=file] { .keyboard-open .has-tabs { bottom: 0; } + +.white-space-initial { + white-space: initial; +} diff --git a/src/sass/views/address-book.scss b/src/sass/views/address-book.scss index 7d2695296..96fefb608 100644 --- a/src/sass/views/address-book.scss +++ b/src/sass/views/address-book.scss @@ -20,6 +20,7 @@ } } #view-address-book { + @extend .deflash-blue; .scroll { height:100%; } diff --git a/src/sass/views/addresses.scss b/src/sass/views/addresses.scss new file mode 100644 index 000000000..5401945f7 --- /dev/null +++ b/src/sass/views/addresses.scss @@ -0,0 +1,89 @@ +#addresses { + .addr { + &-explanation, &-button-group { + padding: 0 1rem; + margin: 1rem 0; + } + &-description { + text-align: center; + font-size: 15px; + color: $mid-gray; + margin: 1rem 0; + a { + font-weight: bold; + cursor: pointer; + cursor: hand; + } + } + &-balance { + margin-top: 4px; + color: #5DD263; + } + &-path { + margin-top: 4px; + color: #B8B8B8; + } + } + + .banner-icon { + margin-top: 25px; + i { + box-shadow: $hovering-box-shadow; + } + } + + .addr-list { + .item { + color: $dark-gray; + padding-top: 1.3rem; + padding-bottom: 1.3rem; + &.has-addr-value { + padding-top: .65rem; + padding-bottom: .65rem; + } + &.item-divider { + color: $mid-gray; + padding-bottom: .5rem; + font-size: .9rem; + } + &.view-all { + margin: 20px 0px 20px 0px; + cursor: pointer; + cursor: hand; + i { + font-size: 35px; + margin-right: 5px; + color: #647ce8; + } + span { + color: #647ce8; + font-weight: bold; + } + } + i { + font-size: 35px; + margin-right: 2px; + } + } + .box-error { + padding: 25px; + background-color: #E65555; + color: #F4F4F4; + h5 { + margin: 5px; + color: #F4F4F4; + text-align: center; + font-weight: bold; + } + a { + font-weight: bold; + color: #F4F4F4; + cursor: pointer; + cursor: hand; + } + } + .item-note { + color: $light-gray; + } + } +} diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss index eec888643..cc4bf24e3 100644 --- a/src/sass/views/amount.scss +++ b/src/sass/views/amount.scss @@ -1,4 +1,5 @@ #view-amount { + @extend .deflash-blue; .recipient-label { font-size: 14px; padding-bottom: 0; @@ -10,6 +11,9 @@ .icon-bitpay-card { background-image: url("../img/icon-bitpay.svg"); } + .icon-amazon { + background-image: url("../img/icon-amazon.svg"); + } @media(max-width: 480px) { .bitcoin-address { .icon { @@ -33,7 +37,7 @@ position: absolute; top: 10px; } - .amount-pane { + .amount-pane-recipient { position: absolute; top: 95px; bottom: 0; @@ -64,6 +68,42 @@ } } } + .amount-pane-no-recipient { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + background-color: #fff; + padding: 0 16px; + + .amount-bar { + padding: 24px 0; + font-size: 18px; + .title { + float: left; + padding-top: 10px; + color: $dark-gray; + font-weight: bold; + .limits { + margin-top: 10px; + color: $light-gray; + font-size: 12px; + } + } + } + .amount { + display: flex; + flex-direction: column; + justify-content: center; + flex-grow: 1; + position: absolute; + bottom: 254px; + top: 66px; + .light { + color: $light-gray; + } + } + } .amount { &__editable { margin-bottom: 1rem; diff --git a/src/sass/views/bitpayCard.scss b/src/sass/views/bitpayCard.scss index 70bd2d762..fb796869c 100644 --- a/src/sass/views/bitpayCard.scss +++ b/src/sass/views/bitpayCard.scss @@ -1,4 +1,5 @@ #bitpayCard { + background: white; .bar-header { border: 0; background: #1e3186; @@ -9,15 +10,35 @@ background-color: transparent; } } + .amount-wrapper { + position: relative; + overflow: visible; + + .amount-bg { + content: ''; + top: -1000px; + left: 0; + position: absolute; + height: 1000px; + width: 100%; + background-color: #1e3186; + } + } .amount { width: 100%; text-align: center; padding: 2rem 1rem 1.5rem 1rem; - height: 140px; + height: 160px; border-color: #172565; background-color: #1e3186; background-image: linear-gradient(0deg, #172565, #172565 0%, transparent 0%); color: #fff; + + &__balance { + margin-bottom: 25px; + font-weight: 600; + font-size: 34px; + } } .wallet-details-wallet-info { bottom: 5px; @@ -37,4 +58,26 @@ .item-select select { color: #667; } + + .get-started { + + margin-top: 20px; + + &__arrow { + font-size: 56px; + opacity: .2; + } + + h1 { + font-size: 28px; + color: #4A4A4A; + } + + &__text { + font-weight: 300; + color: #8e8e8e; + max-width: 300px; + margin: 0 auto; + } + } } diff --git a/src/sass/views/bitpayCardPreferences.scss b/src/sass/views/bitpayCardPreferences.scss index 670e8752e..7488f9964 100644 --- a/src/sass/views/bitpayCardPreferences.scss +++ b/src/sass/views/bitpayCardPreferences.scss @@ -11,5 +11,12 @@ color: $light-gray; font-size: 14px; } + &.item-icon-right { + .icon-hotspot { + right: 0px; + padding-left: 11px; + padding-right: 11px; + } + } } } diff --git a/src/sass/views/confirm.scss b/src/sass/views/confirm.scss index 172f82173..2372290ce 100644 --- a/src/sass/views/confirm.scss +++ b/src/sass/views/confirm.scss @@ -1,3 +1,9 @@ #view-confirm { - + @extend .deflash-blue; + .icon-amazon { + background-image: url("../img/icon-amazon.svg"); + } + .tx-details-content > .scroll { + padding-bottom: .25rem; + } } diff --git a/src/sass/views/custom-amount.scss b/src/sass/views/custom-amount.scss new file mode 100644 index 000000000..11d529355 --- /dev/null +++ b/src/sass/views/custom-amount.scss @@ -0,0 +1,16 @@ +#custom-amount { + .share { + justify-content: center; + } + .info { + .single-line { + display: flex; + align-items: center; + padding-top: 17px; + padding-bottom: 17px; + .item-note { + margin-left: 10px; + } + } + } +} diff --git a/src/sass/views/feedback/complete.scss b/src/sass/views/feedback/complete.scss new file mode 100644 index 000000000..fc6413e7a --- /dev/null +++ b/src/sass/views/feedback/complete.scss @@ -0,0 +1,94 @@ +#complete { + background-color: #fff; + .close-button { + color: $dark-gray; + position: absolute; + top: 5px; + right: 10px; + padding: 15px; + font-size: 36px; + } + .complete-layout { + display: flex; + flex-direction: column; + height: 100%; + &__expand { + display: flex; + flex-direction: column; + flex-grow: 1; + align-items: center; + justify-content: center; + text-align: center; + opacity: 0; + transition: opacity .3s; + &.fade-in { + opacity: 1; + } + } + } + .share-the-love-illustration { + width: 5rem; + margin: 1rem; + } + .send-feedback-illustration { + height: 16rem; + margin: 1rem; + } + .feedback-title { + font-size: 20px; + font-weight: bold; + color: $dark-gray; + margin: 20px 10px; + text-align: center; + } + .subtitle { + padding: 10px 30px 20px; + text-align: center; + color: $mid-gray; + } + .icon-svg > img { + height: 16rem; + width: 16rem; + margin: 10px; + } + .socialsharing-icon { + display: inline-block; + width: 60px; + } + .addressbook-icon-svg { + display: inline-block; + width: 50px; + height: 50px; + } + .share-buttons { + padding: 50px 10px 30px; + background-color: $subtle-gray; + text-align: center; + transform: translateY(100%); + opacity: 0; + animation-name: slideUpFadeIn; + animation-duration: .3s; + animation-fill-mode: forwards; + animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1); + animation-delay: .2s; + } + .share-buttons__action { + display: inline-block; + color: #667; + font-size: .9rem; + width: 90px; + height: 90px; + margin-bottom: 20px; + } +} + +@keyframes slideUpFadeIn { + from { + transform: translateY(100%); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} diff --git a/src/sass/views/feedback/rateApp.scss b/src/sass/views/feedback/rateApp.scss new file mode 100644 index 000000000..c484ccc19 --- /dev/null +++ b/src/sass/views/feedback/rateApp.scss @@ -0,0 +1,38 @@ +#rate-app { + background-color: #ffffff; + text-align: center; + .skip-rating { + color: $dark-gray; + position: absolute; + top: 5px; + right: 10px; + padding: 15px; + } + .icon-svg > img { + width: 80px; + height: 80px; + margin-top: 15px; + } + .feedback-title { + font-size: 20px; + font-weight: bold; + color: $dark-gray; + margin: 80px 50px 10px; + text-align: center; + } + .share-the-love-illustration { + width: 5rem; + margin: 1rem; + } + .subtitle { + padding: 10px 30px 20px 40px; + color: #667; + } + .rate-buttons { + bottom: 0; + width: 100%; + position: absolute; + background-color: $subtle-gray; + padding: 30px 0 15px; + } +} diff --git a/src/sass/views/feedback/rateCard.scss b/src/sass/views/feedback/rateCard.scss new file mode 100644 index 000000000..9d57643d6 --- /dev/null +++ b/src/sass/views/feedback/rateCard.scss @@ -0,0 +1,18 @@ +#rate-card { + .item-heading { + font-weight: 700; + } + .row { + border: none; + } + .item-icon-right { + margin: 0; + } + .feedback-flow-button { + margin-bottom: 20px; + } + .icon-svg > img { + height: 1.8rem; + margin-bottom: 5px; + } +} diff --git a/src/sass/views/feedback/send.scss b/src/sass/views/feedback/send.scss new file mode 100644 index 000000000..b9fafa8b1 --- /dev/null +++ b/src/sass/views/feedback/send.scss @@ -0,0 +1,54 @@ +#send-feedback { + @extend .deflash-blue; + background-color: #ffffff; + .row { + border: none; + } + .skip { + color: rgba(255, 255, 255, 0.3); + } + .feedback-heading { + padding-top: 20px + } + .feedback-title { + padding-left: 10px; + font-size: 20px; + font-weight: bold; + color: $dark-gray; + } + .rating { + text-align: right; + padding-right: 15px; + } + .comment { + padding: 0 20px 20px; + font-size: 1rem; + line-height: 1.5em; + font-weight: 300; + color: $dark-gray; + } + .user-feedback { + border-top: 1px solid $subtle-gray; + border-bottom: 1px solid $subtle-gray; + padding: 20px; + width: 100%; + margin-bottom: 20px; + -webkit-appearance: none; + } + .send-feedback-star { + height: 1rem; + margin-left: 5px; + } + .form-fade-in { + opacity: 0; + animation-name: fadeIn; + animation-duration: .5s; + animation-fill-mode: forwards; + animation-timing-function: ease-in; + } +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} diff --git a/src/sass/views/includes/clickToAccept.scss b/src/sass/views/includes/clickToAccept.scss index 9eb8098e0..3d8b96ada 100644 --- a/src/sass/views/includes/clickToAccept.scss +++ b/src/sass/views/includes/clickToAccept.scss @@ -1,7 +1,18 @@ click-to-accept { + position: fixed; + bottom: 0; + height: 92px; + width: 100%; + .click-to-accept { + &__button.button.button-primary.button-standard { + height: 100%; + max-width: 9999px; + width: 100%; + } + &__button.disable { pointer-events: none; } @@ -18,6 +29,9 @@ click-to-accept { transform: translateY(2rem); opacity: 0; pointer-events: none; + display: flex; + align-items: center; + justify-content: center; &.enter { transition: transform 250ms ease, opacity 250ms ease; diff --git a/src/sass/views/includes/menu-popover.scss b/src/sass/views/includes/menu-popover.scss new file mode 100644 index 000000000..93139b42d --- /dev/null +++ b/src/sass/views/includes/menu-popover.scss @@ -0,0 +1,12 @@ +#menu-popover { + border-radius: 5px; + .list { + .item { + cursor: pointer; + cursor: hand; + &:hover { + background-color: #E4E2E2; + } + } + } +} diff --git a/src/sass/views/includes/txp-details.scss b/src/sass/views/includes/txp-details.scss index 8c5e7c723..5d1d0f9ea 100644 --- a/src/sass/views/includes/txp-details.scss +++ b/src/sass/views/includes/txp-details.scss @@ -8,7 +8,7 @@ .list { background: #f5f5f5; } - .slide-to-pay { + .add-bottom-for-cta { bottom: 92px; } .head { @@ -23,6 +23,8 @@ img { margin-right: 1rem; + height: 35px; + width: 35px; } span { @@ -243,4 +245,21 @@ color: rgba(58, 58, 58, .6); margin-bottom: 1.5rem; } + .glidera-success { + padding: 20px; + margin-top: 15px; + span { + font-size: 15px; + display: block; + } + } + .glidera-explanation { + padding: 0 1rem; + white-space: normal; + } + .glidera-description { + text-align: center; + font-size: 12px; + color: $mid-gray; + } } diff --git a/src/sass/views/includes/wallets.scss b/src/sass/views/includes/wallets.scss index a3e1a4320..5c73d70c7 100644 --- a/src/sass/views/includes/wallets.scss +++ b/src/sass/views/includes/wallets.scss @@ -9,6 +9,7 @@ box-shadow:$subtle-box-shadow; padding:0; border-radius: 6px; + margin: 0 auto; @media (min-width: 500px) { & { width: 350px; @@ -17,22 +18,24 @@ } } .item{ - padding: calc(100vh - 99vh) calc(100vw - 93vw) calc(100vh - 97vh) calc(100vw - 95vw); - i{left:auto;} + padding: 3vh 3vw 3vh 3vw; span{ clear:both; width: 100%; display: inline-block; &.wallet-name{ - margin-top:10px; - margin-bottom:5px; - font-size:13px; + font-size:16px; + width: 70%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + font-weight: 600; } &.wallet-number{ visibility: hidden; } &.visible{ - visibility: visible !important; + visibility: visible !important; } } .big-icon-svg{ @@ -64,10 +67,10 @@ transform: scale(.8); } &.swiper-slide-prev { - left: 10vw; + left: 5vw; } &.swiper-slide-next { - left: -10vw; + left: -5vw; } } } diff --git a/src/sass/views/onboarding/onboard-disclaimer.scss b/src/sass/views/onboarding/onboard-disclaimer.scss index a4e409531..70ceca8e3 100644 --- a/src/sass/views/onboarding/onboard-disclaimer.scss +++ b/src/sass/views/onboarding/onboard-disclaimer.scss @@ -1,6 +1,10 @@ #onboarding-disclaimer { color: #fff; height: 100%; + transition: transform 2.5s ease; + &.shrink{ + transform: scale(.8); + } &-container { max-width: 450px; display: flex; @@ -78,57 +82,94 @@ top:30%; left:0; } - #agree-to-terms { +} +#terms-of-use{ + position: absolute; + top: 100%; + left: 0; + z-index: 10; + transition: top 1s ease; + transition-delay: .25s; + width: 100%; + overflow: scroll; + background: #fff; + height: 100%; + ion-nav-bar{ + position: fixed; background: #fff; - padding:1rem; - position: absolute; - bottom: 0; width: 100%; - &.header-present{ - bottom: 38px; - } - &-content{ - max-width: 600px; - @include center-block(); - } - .item{ - color:rgb(58,58,58); - padding-bottom: 2.5rem; - float: left; - .item-content{ - white-space: normal; - } - } - p{ - color:rgb(58,58,58); - text-align: left; - } - @media (min-width:450px){ - p{ - position: relative; - top: .6rem; - } - } - .checkbox input:before, - .checkbox .checkbox-icon:before{ - border-color:$soft-blue; - } - .checkbox input:checked:before, - .checkbox input:checked + .checkbox-icon:before { - border-color: rgb(19, 229, 182); - } - button{ - margin-top:1.5rem; + z-index: 15; + } + .has-header{ + width:100%; + background:#fff; + overflow-y:scroll; + position:relative; + #terms{ + max-width:400px; + padding-top:.5rem; position: relative; + margin: 0 auto; + padding-bottom: 165px; + width:90%; } } + &.slideUp{ + top:0; + } +} +#agree-to-terms { + background: #fff; + padding:1rem; + position: absolute; + bottom: 0; + width: 100%; + z-index: 10; + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.25); + &-content{ + max-width: 450px; + @include center-block(); + } + .item{ + color:rgb(58,58,58); + padding-bottom: 2.5rem; + float: left; + border:none; + .item-content{ + white-space: normal; + } + } + p{ + color:rgb(58,58,58); + text-align: left; + } + @media (min-width:450px){ + p{ + position: relative; + top: .6rem; + } + } + .checkbox input:before, + .checkbox .checkbox-icon:before{ + border-color:$soft-blue; + background:#fff; + } + .checkbox input:after, + .checkbox .checkbox-icon:after{ + border-color:#13e5b6; + } + .checkbox input:checked:before, + .checkbox input:checked + .checkbox-icon:before { + border-color: rgb(19, 229, 182); + } + button{ + margin-top:1.5rem; + position: relative; + } } - @media (max-height:460px){ - #onboarding-disclaimer{ #agree-to-terms{ position: relative; float:left; } - } } diff --git a/src/sass/views/onboarding/onboarding.scss b/src/sass/views/onboarding/onboarding.scss index 550f8de32..6e480b67c 100644 --- a/src/sass/views/onboarding/onboarding.scss +++ b/src/sass/views/onboarding/onboarding.scss @@ -49,9 +49,14 @@ %cta-buttons { position: absolute; bottom: 0; + left: 0; width: 100%; } +.pane-onboarding{ + background: #0B1E4F; +} + @import "terms-of-use"; @import "onboard-welcome"; @import "onboard-tour"; diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss index 2d5368a8d..692224cf2 100644 --- a/src/sass/views/tab-home.scss +++ b/src/sass/views/tab-home.scss @@ -1,4 +1,5 @@ #tab-home { + @extend .deflash-blue; .icon-create-wallet { background-color: #4A90E2; // default wallet color } @@ -52,6 +53,15 @@ } } } + .wallet-details__item.item { + padding-top: 0; + padding-bottom: 0; + + .wallet-details__tx-icon { + background: #fff; + border-radius: 50px; + } + } .next-step.item { padding-top: 27px; padding-bottom: 27px; @@ -101,6 +111,13 @@ font-weight: 300; color: $light-gray; } + &__status-icon { + font-size: 18px; + margin-left: 5px; + position: relative; + top: 1px; + color: $light-gray; + } } } .release { @@ -116,6 +133,6 @@ font-size: 20px; margin-left: 10px; position: absolute; - } + } } } diff --git a/src/sass/views/tab-receive.scss b/src/sass/views/tab-receive.scss index 1b18083c0..084baed3b 100644 --- a/src/sass/views/tab-receive.scss +++ b/src/sass/views/tab-receive.scss @@ -1,36 +1,54 @@ #tab-receive { - ion-header-bar{ - button{ - i{ + @extend .deflash-blue; + ion-header-bar { + button { + i { color:#fff; font-size: 1.1rem; } } } - .border-top{ + .border-top { border-top:1px solid rgb(228,228,228); } - .scroll{height:100%;} + .scroll { + height:100%; + } #address { background: #fff; - height: calc(100vh - 33vh); + height: 66vh; display: flex; align-items: center; justify-content: center; position: relative; flex-flow: column; - @media(max-height: 600px){ - height: calc(100vh - 36vh); + @media(max-height: 600px) { + height: 68vh; } - article{ + @media(max-height: 600px) and (-webkit-device-pixel-ratio: 2) { + height: 64vh; + } + &-info { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + } + article { flex:1; width: 100%; } - #bit-address{ - position: absolute; - bottom:0; - width:100%; - #next-address{ + #bit-address { + width: 100%; + align-self: flex-end; + margin-top: auto; + justify-content: center; + align-content: center; + position: relative; + min-height: 40px; + #next-address { color:$light-gray; } } @@ -52,35 +70,111 @@ .item { border: none; font-size: .8rem; + z-index: 0; i { font-size: 1.3rem; } } + #qr-options { + .item { + font-size:.7rem; + @media(min-width:350px) { + font-size:.9rem; + } + @media(min-width:450px) { + font-size:1rem; + } + } + } .bit-address { font-size: .8rem; + // left:10%; + cursor: pointer; + cursor: hand; + position: absolute; + transition: all .15s ease; + width:100%; + height: 100%; + z-index: 0; + position: absolute; + top:50%; + &, &.next { + left:100%; + transform: translate(100%, -40%); + } + &.next, &.prev { + z-index:2; + } + &.current, + &.prev { + left:50%; + } + &.current { + transform: translate(-50%, -40%); + z-index: 3; + } + &.prev { + transform: translate(-150%, -40%); + } .item { padding-top: 5px; padding-bottom: 5px; - display: inline-block; font-size: .7rem; + @media(min-width:350px) { + font-size:.9rem; + } + @media(min-width:450px) { + font-size:1rem; + } + color:$light-gray; } } .qr { - padding: calc(100vh - 85vh) 0 calc(100vh - 96vh); - @media(max-height: 700px){ - padding: calc(100vh - 90vh) 0 calc(100vh - 96vh); + padding: 15vh 0 4vh; + align-self: center; + margin-top: auto; + height: 220px; + position: relative; + justify-content: center; + flex: 1; + z-index: 1; + div { + transition: all .4s ease; + &.current, + &.prev, + &.next { + position: absolute; + top:50%; + } + &.current, + &.prev { + left:50%; + } + &.current { + transform: translate(-50%, -40%); + } + &.prev { + transform: translate(-150%, -40%); + } + &.next { + left:100%; + transform: translate(100%, -40%); + } } - div{ + @media(max-height: 700px) { + padding: 10vh 0 4vh; + } + div { display: flex; justify-content: center; align-items: center; + position: relative; + min-height: 220px; } } - #qr-options{ - display: flex; - flex-direction: row; + #qr-options { justify-content: center; - align-content: center; + align-self: flex-end; .item{ i{left:25px;} } @@ -90,20 +184,24 @@ color: #fff; position: absolute; top: 0; + left:0; + z-index: 2; i { padding: 10px; } } - @media (max-height: 600px){ - &{ - .qr{ + @media (max-height: 600px) { + & { + .qr { padding:6vh 0 0; - div{ + div { -webkit-transform: scale(.7); transform: scale(.7); } } - #bit-address{position: realtive;} + #bit-address { + position: relative; + } } } } @@ -122,7 +220,7 @@ left: 50%; -webkit-transform: translateX(-50%); transform: translateX(-50%); - z-index: 2; + z-index: 4; } } #first-time-tip { @@ -165,18 +263,57 @@ border-right: 1px solid rgb(228, 228, 228); padding-right: 10px; } - .wallets{ + #wallets { + #sidebar-wallet{ + display: none; + } + } + .wallets { position: relative; - height: calc(100vh - 83vh); + height: calc(27vh - 62px); + z-index: 5; .slides { - .swiper-container{ + .swiper-container { position: absolute; left: 50%; top: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); - @media (max-height: 600px){ - &{ + max-width: 450px; + .swiper-wrapper { + height: auto; + top: 10%; + position:relative; + @media(max-height: 600px) { + padding-top:.2rem + } + @media(min-height: 900px) { + top:30%; + } + } + .swiper-slide { + text-align: center; + .card{ + margin-top: 1vh; + display: inline-block; + width:80%; + @media(min-height: 1000px) and (max-width: 699px) { + .item { + padding: 2vh 3vw 2vh 3vw; + } + } + } + @media(max-width: 500px) { + &-next { + left:-25%; + } + &-prev { + left:25%; + } + } + } + @media (max-height: 600px) { + & { -webkit-transform: translate(-50%, -58%); transform: translate(-50%, -58%); } @@ -184,25 +321,154 @@ } } } - // @media(min-width: 700px) and (min-height: 700px){ - // .wallets{display: none;} - // #address{ - // height:90vh; - // width:75%; - // .qr{ - // height: 70%; - // div{ - // transform: scale(1.5); - // } - // } - // #bit-address{ - // height: 10%; - // padding: calc(100vh - 99vh); - // } - // } - // } + @media(min-width: 700px) and (min-height: 700px) { + .wallets { + display: none; + } + #address { + float:left; + height:100%; + width:calc(100% - 410px); + @media(max-width: 1000px){ + width:65%; + } + &-info { + height: 100%; + } + #qr-options { + .item{ + font-size:1rem; + } + } + .qr { + height: 70%; + div { + opacity: 0; + transition: none; + &.current { + opacity: 1; + } + } + } + .bit-address { + opacity: 0; + transition: none; + &.current { + opacity: 1; + } + } + .backup, + #bit-address { + left:0; + } + #bit-address { + height: 10%; + padding: 1vh; + .bit-address { + .item{ + top: 40%; + transform: translateY(-40%); + font-size:1rem; + } + } + } + } + #wallets { + float:left; + width:35%; + height: 100%; + display: flex; + flex-direction: column; + overflow: visible; + max-width: 410px; + @media(max-height: 600px) { + padding-top:.55rem; + } + @media(max-width: 1000px) { + max-width: none; + } + #sidebar-wallet { + display: block; + } + .list { + height: 100%;overflow: visible; + } + #wallet-list { + position: absolute; + width: 110%; + overflow-y: auto; + height: 100%; + left: -6%; + } + .wallet { + &.current { + position: relative; + .card { + opacity: 1; + transform: scale(1); + } + &:before { + right: 93%; + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-right-color: #f2f2f2; + border-width: 20px; + margin-top: -20px; + } + } + } + .card { + max-width: 350px; + box-shadow: 0 1px 36px rgba(0, 0, 0, 0.07); + padding:0; + border-radius: 6px; + padding:2px; + width: 80%; + position: relative; + margin: 1.5rem auto 0; + position: relative; + opacity: .5; + transform:scale(.85); + transition:transform .2s ease; + .item { + padding: 6% 10% 6% 8%; + span { + clear: both; + width: 100%; + display: inline-block; + &.wallet-name { + font-size:16px; + width: 79%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + font-weight: 600; + } + &.wallet-number { + visibility: hidden; + } + &.visible { + visibility: visible !important; + } + } + .big-icon-svg { + padding: 0; + & > .bg { + padding:.3rem; + width: 40px; + height:40px; + } + } + } + } + } + } } - @keyframes fadeIn { 0% { opacity: 0; diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss index 8308bd90c..1bbb72cb2 100644 --- a/src/sass/views/tab-send.scss +++ b/src/sass/views/tab-send.scss @@ -1,19 +1,36 @@ #tab-send { - .qr-scan-icon a { - z-index: 10; - display: block; - position: absolute; - top: 55px; - right: 0; - padding: 0 10px; - font-size: 24px; + @extend .deflash-blue; + .input { + input { + width: 100%; + height: auto; + } + &.item { + height: 55px; + } + i { + &.left { + padding-left: 15px; + } + &.qr { + cursor: pointer; + cursor: hand; + padding-right: 5px; + } + } + } + .qr-scan-icon { cursor: pointer; + cursor: hand; + border-left: 1px solid rgb(228, 228, 228); + padding-left: 10px; } .qr-icon { - line-height: 45px; + line-height: 20px; } .zero-state-cta { padding-bottom: 3vh; + left: 0; } .send-heading { font-size: 14px; diff --git a/src/sass/views/tab-settings.scss b/src/sass/views/tab-settings.scss index d82a890b1..7ecc5abc7 100644 --- a/src/sass/views/tab-settings.scss +++ b/src/sass/views/tab-settings.scss @@ -1,8 +1,21 @@ .settings { + @extend .deflash-blue; + .icon-bitpay-card { + background-image: url("../img/icon-card.svg"); + background-color: #1e3186; + } .item { color: $dark-gray; border-color: rgba(221, 221, 221, 0.3); } + .has-comment { + border-bottom: 0 none; + } + .comment { + padding: 15px; + background-color: #fff; + color: $mid-gray; + } &-explanation, &-button-group { padding: 0 1rem; margin: 1rem 0; @@ -63,6 +76,13 @@ .item-note { color: $light-gray; } + .item-toggle .toggle, + .item-button-right > .button { + top: 16px; + } + .item-button-right > .button { + font-size: 16px; + } } } @@ -126,7 +146,6 @@ } .fee-policies { border-color: #fff; - border-width: 2px 0; border-style: solid; } } diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index a14abf8f0..8e241aba7 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -9,19 +9,26 @@ @import "tab-scan"; @import "tab-send"; @import "tab-settings"; +@import "walletBalance"; @import "walletDetails"; @import "advancedSettings"; @import "bitpayCard"; @import "bitpayCardIntro"; @import "bitpayCardPreferences"; @import "address-book"; +@import "addresses"; @import "wallet-backup-phrase"; @import "zero-state"; @import "onboarding/onboarding"; +@import "feedback/rateCard"; +@import "feedback/send"; +@import "feedback/complete"; +@import "feedback/rateApp"; @import "includes/actionSheet"; @import "export"; @import "import"; @import "join"; +@import "includes/menu-popover"; @import "includes/walletActivity"; @import "includes/wallets"; @import "includes/modals/modals"; @@ -35,3 +42,4 @@ @import "includes/walletSelector"; @import "integrations/coinbase"; @import "integrations/glidera"; +@import "custom-amount"; diff --git a/src/sass/views/wallet-backup-phrase.scss b/src/sass/views/wallet-backup-phrase.scss index 10a9f3f15..68e55f414 100644 --- a/src/sass/views/wallet-backup-phrase.scss +++ b/src/sass/views/wallet-backup-phrase.scss @@ -1,4 +1,31 @@ #wallet-backup-phrase { + h3 { + padding: 15px; + } + .button-confirm { + margin-top: 1rem; + } + .password-required { + padding: 1rem; + } + .password-prompt { + background-color: $subtle-gray; + padding: 2rem; + .explanation { + padding: 0 1rem; + margin: 1rem 0; + } + .description { + text-align: center; + font-size: 15px; + color: #000; + margin: 1rem 0; + } + input { + width: 100%; + padding: 1rem; + } + } .bar.bar-royal .title { font-size: 1rem; } diff --git a/src/sass/views/walletBalance.scss b/src/sass/views/walletBalance.scss new file mode 100644 index 000000000..84ec41109 --- /dev/null +++ b/src/sass/views/walletBalance.scss @@ -0,0 +1,113 @@ +.wallet-balance { + + &__amount { + + font-size: 16px; + + &--total { + color: $mid-gray; + } + + &--available { + color: #09C286;; + } + + &--confirming { + color: #FF9900; + } + + &--locked { + color: #FF9900; + } + + &--alternative { + color: $light-gray; + font-size: 14px; + } + + } + + &__title { + flex-grow: 1; + color: $dark-gray; + overflow: hidden; + } + + &__icon { + float: left; + margin-right: 1rem; + color: $light-gray; + font-size: 24px; + } + + &__list { + background: #f5f5f5; + } + + .item { + display: flex; + align-items: center; + background: #fff; + padding-left: 1rem; + } + + &__item { + display: flex; + align-items: center; + background: #fff; + padding: 0; + margin: 0; + border: 0; + padding-left: 1rem; + } + + &__content { + display: flex; + align-items: center; + flex-grow: 1; + padding: 0.6rem 0; + padding-right: 1rem; + border-bottom: 1px solid rgb(245, 245, 245); + overflow: hidden; + + &.no-border { + border: 0; + } + } + + &__amount { + white-space: nowrap; + } + + &__heading { + font-size: 17px; + color: #445; + margin: 1rem 1rem 1rem 1rem; + } + + &__description { + font-size: 12.5px; + color: #667; + margin: 0.7rem; + line-height: 16px; + } + +} + +#wallet-balance { + .bar-header { + border: 0; + background: none; + .title, .button { + color: #fff; + } + .button { + background-color: transparent; + } + } + + ion-content { + background: #F5F5F5; + } + +} diff --git a/src/sass/views/walletDetails.scss b/src/sass/views/walletDetails.scss index 37438bc1d..52dd836bc 100644 --- a/src/sass/views/walletDetails.scss +++ b/src/sass/views/walletDetails.scss @@ -6,7 +6,7 @@ font-weight: bold; } &--received { - color: #30af6c; + color: #09C286; } &--sent { color: $dark-gray; @@ -14,18 +14,106 @@ } &__tx-time { color: $light-gray; + font-size: 12.5px; } &__tx-title { - padding-top: 10px; + flex-grow: 1; color: $dark-gray; + overflow: hidden; } &__tx-icon { float: left; - margin-right: 10px; + margin-right: 25px; + } + &__tx-message { + margin-right: 1rem; + } + + &__list { + + } + + .item { + display: flex; + align-items: center; + background: #fff; + padding-left: 1rem; + } + + &__item { + display: flex; + align-items: center; + background: #fff; + padding: 0; + margin: 0; + border: 0; + padding-left: 1rem; + + &.proposal { + position: relative; + } + + &__marker { + position: absolute; + height: 100%; + width: 3px; + background: #F5A623; + left: 0; + } + } + + &__tx-content { + display: flex; + align-items: center; + flex-grow: 1; + padding: 1rem 0; + padding-right: 1rem; + border-bottom: 1px solid rgb(245, 245, 245); + overflow: hidden; + + &.no-border { + border: 0; + } + } + + &__tx-amount { + white-space: nowrap; + } + + &__group-label { + font-size: 14px; + font-weight: 300; + color: #727272; + padding: 2px 1rem; + background: #f8f8f9; } } #walletDetails { + background: #F8F8F9; + + .scroll-refresher { + z-index: 1; + margin-top: 3.5rem; + } + + .ionic-refresher-content { + color: white !important; + + .spinner svg { + stroke: white; + fill: white; + } + } + + .bp-content { + position: relative; + height: 100%; + + &.status-bar { + margin-top: 20px; + } + } .bar-header { border: 0; background: none; @@ -39,21 +127,75 @@ .nav-bar-block, .bar { background-color: inherit !important; } + ion-content { + + &.collapsible { + margin-top: 210px; + } + + padding-top: 0; + top: 0; + .scroll { + background: rgb(248, 248, 249); + min-height: 300px; + } + } + .amount-wrapper { + position: relative; + overflow: visible; + + .amount-bg { + content: ''; + top: 0; + left: 0; + position: absolute; + width: 100%; + height: 500px; + transform: translateY(-499px); + + &.collapsible { + top: initial; + bottom: 0; + left: 0; + position: absolute; + width: 100%; + height: 200px; + transform: translateY(100px); + } + } + } .amount { width: 100%; text-align: center; - padding: 2rem 1rem 1.5rem 1rem; color: #fff; - height: 140px; - margin-bottom: 10px; + height: 210px; + padding-top: 40px; + display: block; + align-items: center; + justify-content: center; + + &.collapsible { + margin-bottom: 10px; + } + + &__balance { + transform: scale3d(1, 1, 1) translateY(45px); + } + + &__updating { + z-index: 999; + margin-top: -2.1rem; + } &-alternative { line-height: 36px; } - strong { - line-height: 100%; + &__button-balance { + background-color: transparent; + border: 1px solid rgba(255,255,255,0.25); } + } .item.item-footer { font-weight: lighter; @@ -73,7 +215,22 @@ position: absolute; top: inherit; left: 10px; - bottom: 15px; + bottom: 5px; font-size: 20px; color: #fff; } + +.wallet-not-backed-up-warning { + background: orange; + text-align: center; + color: white; + font-size: 14px; + display: block; + text-decoration: none; + z-index: 9999; + position: relative; +} + +a.item { + cursor: pointer; +} diff --git a/www/img/contact-placeholder.svg b/www/img/contact-placeholder.svg new file mode 100644 index 000000000..f730da86b --- /dev/null +++ b/www/img/contact-placeholder.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/www/img/ico-positive-feedback.svg b/www/img/ico-positive-feedback.svg new file mode 100644 index 000000000..508cc7ded --- /dev/null +++ b/www/img/ico-positive-feedback.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/www/img/ico-star-filled.svg b/www/img/ico-star-filled.svg new file mode 100644 index 000000000..a475c9e2c --- /dev/null +++ b/www/img/ico-star-filled.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/www/img/ico-star.svg b/www/img/ico-star.svg new file mode 100644 index 000000000..864f2b2ba --- /dev/null +++ b/www/img/ico-star.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/www/img/icon-confirming-clear.svg b/www/img/icon-confirming-clear.svg new file mode 100644 index 000000000..e7cf58529 --- /dev/null +++ b/www/img/icon-confirming-clear.svg @@ -0,0 +1,18 @@ + + + + +Group 2 +Created with Sketch. + + + + + + + + + diff --git a/www/img/icon-confirming.svg b/www/img/icon-confirming.svg new file mode 100644 index 000000000..989af61aa --- /dev/null +++ b/www/img/icon-confirming.svg @@ -0,0 +1,22 @@ + + + + Group 2 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/img/icon-import.svg b/www/img/icon-import.svg new file mode 100644 index 000000000..1cfba9a50 --- /dev/null +++ b/www/img/icon-import.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/www/img/icon-important.svg b/www/img/icon-important.svg new file mode 100644 index 000000000..4f113aaf2 --- /dev/null +++ b/www/img/icon-important.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/www/img/icon-language.svg b/www/img/icon-language.svg index 15adeb549..83c23aaa9 100644 --- a/www/img/icon-language.svg +++ b/www/img/icon-language.svg @@ -5,7 +5,7 @@ Created with sketchtool. - + @@ -13,4 +13,4 @@ - \ No newline at end of file + diff --git a/www/img/icon-notifications.svg b/www/img/icon-notifications.svg index 2da739440..b09e32fed 100644 --- a/www/img/icon-notifications.svg +++ b/www/img/icon-notifications.svg @@ -5,7 +5,7 @@ Created with sketchtool. - + @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/www/img/icon-proposal-pending.svg b/www/img/icon-proposal-pending.svg new file mode 100644 index 000000000..6314b99ff --- /dev/null +++ b/www/img/icon-proposal-pending.svg @@ -0,0 +1,23 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/img/icon-send-feedback.svg b/www/img/icon-send-feedback.svg index 1fc621c07..dc920f28a 100644 --- a/www/img/icon-send-feedback.svg +++ b/www/img/icon-send-feedback.svg @@ -5,7 +5,7 @@ Created with sketchtool. - + @@ -20,4 +20,4 @@ - \ No newline at end of file + diff --git a/www/img/icon-sigma.svg b/www/img/icon-sigma.svg new file mode 100644 index 000000000..0baf24a13 --- /dev/null +++ b/www/img/icon-sigma.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/www/img/icon-tx-moved-outline.svg b/www/img/icon-tx-moved-outline.svg new file mode 100644 index 000000000..1f15f2d7e --- /dev/null +++ b/www/img/icon-tx-moved-outline.svg @@ -0,0 +1,21 @@ + + + + Group 2 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/img/icon-tx-received-outline.svg b/www/img/icon-tx-received-outline.svg new file mode 100644 index 000000000..fe902fab0 --- /dev/null +++ b/www/img/icon-tx-received-outline.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/www/img/icon-tx-sent-outline.svg b/www/img/icon-tx-sent-outline.svg new file mode 100644 index 000000000..790099585 --- /dev/null +++ b/www/img/icon-tx-sent-outline.svg @@ -0,0 +1,21 @@ + + + + Group 2 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/img/illustration-send-feedback.png b/www/img/illustration-send-feedback.png new file mode 100644 index 000000000..6718b4325 Binary files /dev/null and b/www/img/illustration-send-feedback.png differ diff --git a/www/img/scan-ico.svg b/www/img/scan-ico.svg new file mode 100644 index 000000000..5d13c91fe --- /dev/null +++ b/www/img/scan-ico.svg @@ -0,0 +1,24 @@ + + + + scan-ico + Created with Sketch. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/img/social-icons/ico-social-email.svg b/www/img/social-icons/ico-social-email.svg new file mode 100644 index 000000000..bd88c0374 --- /dev/null +++ b/www/img/social-icons/ico-social-email.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/www/img/social-icons/ico-social-facebook.svg b/www/img/social-icons/ico-social-facebook.svg new file mode 100644 index 000000000..c74f94971 --- /dev/null +++ b/www/img/social-icons/ico-social-facebook.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/www/img/social-icons/ico-social-googleplus.svg b/www/img/social-icons/ico-social-googleplus.svg new file mode 100644 index 000000000..282bd61b6 --- /dev/null +++ b/www/img/social-icons/ico-social-googleplus.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/www/img/social-icons/ico-social-message.svg b/www/img/social-icons/ico-social-message.svg new file mode 100644 index 000000000..0bc23d2de --- /dev/null +++ b/www/img/social-icons/ico-social-message.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/www/img/social-icons/ico-social-twitter.svg b/www/img/social-icons/ico-social-twitter.svg new file mode 100644 index 000000000..1dd16e791 --- /dev/null +++ b/www/img/social-icons/ico-social-twitter.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/www/img/social-icons/ico-social-whatsapp.svg b/www/img/social-icons/ico-social-whatsapp.svg new file mode 100644 index 000000000..9c19f2e68 --- /dev/null +++ b/www/img/social-icons/ico-social-whatsapp.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/www/views/activity.html b/www/views/activity.html index fb84142dc..8586e97e9 100644 --- a/www/views/activity.html +++ b/www/views/activity.html @@ -1,7 +1,7 @@ - {{'Recent Activity'|translate}} + {{'Recent Transactions'|translate}} @@ -11,7 +11,7 @@
-
Updating activity. Please stand by
+
Updating... Please stand by
@@ -22,7 +22,7 @@
- No recent activity + No recent transactions
diff --git a/www/views/add.html b/www/views/add.html index 999adf042..6721477bd 100644 --- a/www/views/add.html +++ b/www/views/add.html @@ -11,7 +11,7 @@ - New personal wallet + New personal wallet @@ -19,7 +19,7 @@ - Create shared wallet + Create shared wallet @@ -27,7 +27,7 @@ - Join shared wallet + Join shared wallet @@ -35,7 +35,7 @@ - Import wallet + Import wallet diff --git a/www/views/addressbook.add.html b/www/views/addressbook.add.html index 7a79f858b..088fbf47d 100644 --- a/www/views/addressbook.add.html +++ b/www/views/addressbook.add.html @@ -29,7 +29,7 @@ Email diff --git a/www/views/addressbook.html b/www/views/addressbook.html index 3e8c78454..0442c5ea6 100644 --- a/www/views/addressbook.html +++ b/www/views/addressbook.html @@ -6,8 +6,8 @@ Address Book -
diff --git a/www/views/addresses.html b/www/views/addresses.html new file mode 100644 index 000000000..b7c9a4c90 --- /dev/null +++ b/www/views/addresses.html @@ -0,0 +1,72 @@ + + + {{'Wallet Addresses' | translate}} + + + + + + + + + + +
+
+
+ Each bitcoin wallet can generate billions of addresses from your 12-word backup. A new address is automatically generated and shown each time you receive a payment. Why? +
+
+ +
+
+ It's a good idea to avoid reusing addresses-this both protects your privacy and keeps your bitcoins secure against hypothetical attacks by quantum computers. Hide +
+
+ +
+
+ Unused Addresses + +
+ +
+
+
Unused Addresses Limit
+

The maximum number of consecutive unused addresses (20) has been reached. When one of your unused addresses receives a payment, a new address will be generated and shown in your Receive tab. Read more

+

The restore process will stop when 20 addresses are generated in a row which contain no funds. To safely generate more addresses, make a payment to one of the unused addresses which has already been generated. Read less

+
+ +
+ {{u.address}} +
+ {{u.path}} {{u.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} +
+
+
+ +
+
+ Addresses With Balance +
+ +
+ {{w.address}} +
{{w.balanceStr}}
+
+
+ +
+ View All Addresses + +
+
+
+
+
diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 11a90fd4b..bf16c767f 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -10,7 +10,7 @@
Enabled Integrations
- Enable Bitpay Card Integration + Enable BitPay Card Integration @@ -33,8 +33,8 @@ Use Unconfirmed Funds -
- If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays. +
+ If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays.
Experimental Features
@@ -47,8 +47,15 @@ Recent Transaction Card -
- If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab. +
+ If enabled, the Recent Transactions card - a list of transactions occuring across all wallets - will appear in the Home tab. +
+ + + Development Utilities + +
+ These features make it easier to test complex functionality on all devices. They may be unstable.
@@ -60,6 +67,31 @@ If enabled, the Frequently Used card - a list of the most commonly chosen recipients - will appear in the Send tab.
--> +
+
Development Utilities
+
+
+ These utilities may be unstable. Proceed at your own risk. +
+
+ +
+ Feedback Card + + + +
+
+ The feedback card is displayed on the Home tab at certain times. You can activate it immediately here. +
+
+
diff --git a/www/views/allAddresses.html b/www/views/allAddresses.html new file mode 100644 index 000000000..8ece9164d --- /dev/null +++ b/www/views/allAddresses.html @@ -0,0 +1,28 @@ + + + {{'All Addresses' | translate}} + + + + + + + + +
+
+ +
+ {{a.address}} +
+ {{a.path}} {{a.createdOn * 1000 | amDateFormat:'MMMM Do YYYY, hh:mm a'}} +
+
{{a.balanceStr}}
+
+ +
+
+
+
diff --git a/www/views/amazon.html b/www/views/amazon.html index 8e17d5559..34faec3d7 100644 --- a/www/views/amazon.html +++ b/www/views/amazon.html @@ -18,7 +18,7 @@
- @@ -29,14 +29,27 @@
-
- + +
+ * Amazon.com is not a sponsor of this promotion. + Except as required by law, Amazon.com + Gift Cards ("GCs") cannot be transferred for value or redeemed for cash. GCs may be used only for purchases of + eligible goods at Amazon.com or certain of its + affiliated websites. For complete terms and conditions, see + www.amazon.com/gc-legal. + GCs are issued by ACI Gift Cards, Inc., a Washington corporation. All Amazon ®, ™ & © are IP + of Amazon.com, Inc. or its affiliates. + No expiration date or service fees. +
+
Your cards diff --git a/www/views/amount.html b/www/views/amount.html index bafed47af..0af2b12e5 100644 --- a/www/views/amount.html +++ b/www/views/amount.html @@ -1,35 +1,69 @@ - {{'Enter Amount'|translate}} + {{'Enter Amount' | translate}} + + + -
+
Recipient
- - + +
+ + +
+
+
{{toName || toAddress}}
-
+
-
-
Amount
+
+
+ Amount +
Purchase Amount is limited to USD 1000 per day
+
{{exchangeRate}}
+
+
+ Daily buy limit: + {{limits.dailyBuy|currency:'':2}} {{limits.currency}} + (remaining {{limits.dailyBuyRemaining|currency:'':2}} {{limits.currency}}) +
+ Monthly buy limit: + {{limits.monthlyBuy|currency:'':2}} {{limits.currency}} + (remaining {{limits.monthlyBuyRemaining|currency:'':2}} {{limits.currency}}) +
+
+ Daily sell limit: + {{limits.dailySell|currency:'':2}} {{limits.currency}} + (remaining {{limits.dailySellRemaining|currency:'':2}} {{limits.currency}}) +
+ Monthly sell limit: + {{limits.monthlySell|currency:'':2}} {{limits.currency}} + (remaining {{limits.monthlySellRemaining|currency:'':2}} {{limits.currency}}) +
+
+
@@ -49,6 +83,7 @@
+
Wallet recovery phrase not available.
You can still export it from Advanced > Export.
- -
-
Please carefully write down this phrase.
-
-
- {{word}}  + +
+
Please carefully write down this phrase.
+
+
+ {{word}}  +
+
+
+ This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed. +
+
+
We'll confirm on the next screen.
+
-
- This recovery phrase was created with a password. To recover this wallet both the recovery phrase and password are needed. -
-
-
We'll confirm on the next screen.
- -
-
@@ -50,22 +50,26 @@ ng-disabled="shuffledWord.selected">{{shuffledWord.word}} - - + + +
-
-
Enter your password - - +

Enter your password

+
+
+
In order to verify your wallet backup, please type your password.
+
+ +
+
+
+
+
diff --git a/www/views/backupWarning.html b/www/views/backupWarning.html index f824c67d6..0f426c151 100644 --- a/www/views/backupWarning.html +++ b/www/views/backupWarning.html @@ -7,11 +7,11 @@ -
Are you being watched?
-
Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?
+
Are you being watched?
+
Now is a perfect time to assess your surroundings. Nearby windows? Hidden cameras? Shoulder-spies?
-
Anyone with your backup phrase can access or spend your bitcoin.
+
Anyone with your backup phrase can access or spend your bitcoin.
diff --git a/www/views/bitpayCard.html b/www/views/bitpayCard.html index bf36da1fd..d2a590ebb 100644 --- a/www/views/bitpayCard.html +++ b/www/views/bitpayCard.html @@ -3,11 +3,6 @@ BitPay Visa® Card ({{card.lastFourDigits}}) - - - @@ -16,10 +11,11 @@ Sandbox version. Only for testing purpose
-
+
+
-
${{bitpayCard.bitpayCardCurrentBalance}}
+
${{bitpayCard.bitpayCardCurrentBalance}}
@@ -41,11 +37,13 @@
- +

Get started

-

Your BitPay Card is ready. Add funds to your card to start using your card at stores and ATMs worldwide.

+
+ Your BitPay Card is ready. Add funds to your card to start using your card at stores and ATMs worldwide. +
diff --git a/www/views/bitpayCardIntro.html b/www/views/bitpayCardIntro.html index 9ab7319b9..3a972c86c 100644 --- a/www/views/bitpayCardIntro.html +++ b/www/views/bitpayCardIntro.html @@ -21,7 +21,7 @@

- Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply. + Get local cash anywhere you go, from any Visa® compatible ATM. ATM bank fees may apply.

diff --git a/www/views/buyAmazon.html b/www/views/buyAmazon.html deleted file mode 100644 index 69ac4b790..000000000 --- a/www/views/buyAmazon.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - Buy - - - - -
- - - -
- Amazon.com Gift Card -
- Use your Amazon.com Gift Card* to shop from a huge selection of books, electronics, music, movies, software, apparel, toys, and more. -
-
- -
- -
- -
- - - -
- -
- Purchase Amount is limited to USD 500 per day -
-
-
-
- -
-
-

Gift card could not be created

-
- There was an error when trying to create the Amazon.com Gift Card. Status: {{buy.giftCard.status}} -
-
- - This is a temporary/recoverable system failure that can be - resolved retrying the request from your list of cards - - - This failure could not be recoverable. Request your refund from your list of cards - - -
-
-
-
- Thank you for participating in the BitPay offer. It is our pleasure to send - you this Amazon.com Gift Card* that can be redeemed towards millions of items at - www.amazon.com. - You may want to print this screen for easy reference later you will need the gift card claim code below. -
- -
- Amazon.com Gift Cards -
- Gift Card Amount: - - {{buy.giftCard.amount | currency : '$ ' : 2 }} - -
-
- Claim code: {{buy.giftCard.claimCode}} -
-
- -
- -
-
- To redeem your gift card, follow these steps: - -
    -
  1. 1. Visit www.amazon.com/gc -
  2. 2. Click Apply to Account and enter the Claim Code when prompted. -
  3. 3. Gift card funds will be applied automatically to eligible orders during the checkout process. -
  4. 4. You must pay for any remaining balance on your order with another payment method. -
- -

- Your gift card claim code may also be entered when prompted during checkout. To redeem your gift card using - the Amazon.com 1-Click® service, first add the gift card funds to Your Account. -

- -

- If you have questions about redeeming your gift card, please visit - www.amazon.com/gc-redeem. - If you have questions regarding the BitPay Introductory offer, please contact BitPay. -

- -
-
-
- -
- * Amazon.com is not a sponsor of this promotion. - Except as required by law, Amazon.com - Gift Cards ("GCs") cannot be transferred for value or redeemed for cash. GCs may be used only for purchases of - eligible goods at Amazon.com or certain of its - affiliated websites. For complete terms and conditions, see - www.amazon.com/gc-legal. - GCs are issued by ACI Gift Cards, Inc., a Washington corporation. All Amazon ®, ™ & © are IP - of Amazon.com, Inc. or its affiliates. - No expiration date or service fees. -
- - - diff --git a/www/views/buyGlidera.html b/www/views/buyGlidera.html deleted file mode 100644 index 60bdcbbd0..000000000 --- a/www/views/buyGlidera.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - Buy - - - - -
- Testnet wallets only work with Glidera Sandbox Accounts -
- -
- Daily buy limit: - {{limits.dailyBuy|currency:'':2}} {{limits.currency}} - (remaining {{limits.dailyBuyRemaining|currency:'':2}} {{limits.currency}}) -
- Monthly buy limit: - {{limits.monthlyBuy|currency:'':2}} {{limits.currency}} - (remaining {{limits.monthlyBuyRemaining|currency:'':2}} {{limits.currency}}) -
- -
- - This operation was disabled because you have a pending first transaction - -
- -
- -
- -
- -
- - - -
- Buy - {{buy.buyPrice.subtotal|currency:'':2}} {{buy.buyPrice.currency}} in Bitcoin - {{buy.buyPrice.qty}} BTC - at {{buy.buyPrice.price}} {{buy.buyPrice.currency}}/BTC -
-
- (Enter the amount to get the exchange rate) -
- -
- ... -
- - -
-
-
-
-{{buy.buyPrice.subtotal|currency:'':2}} {{buy.buyPrice.currency}} → {{buy.buyPrice.qty}} BTC -

- A SMS containing a confirmation code was sent to your phone.
- Please, enter the code below -

-
-
- -
- -
-

- Fiat will be immediately withdrawn from your bank account. The bitcoins will be purchased and deposited to your wallet in 2-4 business days. -

-
-
-
-

Purchase initiated

-

- A transfer has been initiated from your bank account. Your bitcoins should arrive to your wallet in 2-4 business days. -

- - -
-
-
diff --git a/www/views/confirm.html b/www/views/confirm.html index 6c8dd10ac..a3cef657d 100644 --- a/www/views/confirm.html +++ b/www/views/confirm.html @@ -7,16 +7,20 @@ - +
- - Sending + + Sending + Sending maximum amount + Buying + Selling
-
{{displayAmount}} {{displayUnit}}
-
{{alternativeAmountStr}}
+
{{displayAmount || '...'}} {{displayUnit}}
+
{{exchangeRate}}
+
{{alternativeAmountStr || '...'}}
@@ -26,10 +30,16 @@ Expired
- To + To + From + To - + + +
+
+
@@ -46,14 +56,10 @@ Multiple recipients -->
-
- No wallets available -
-
- Insufficient funds -
- - From + + From + To + From
@@ -62,43 +68,86 @@
- + Add Memo {{description}} -
- Fee: {{feeLevel}} +
+ {{'Fee' | translate}}: {{feeLevel | translate}} {{fee || '...'}}
+
+ Information +
+
+ Buy {{buyPrice.subtotal|currency:'':2}} {{buyPrice.currency}} in Bitcoin at {{buyPrice.price}} {{buyPrice.currency}}/BTC +
+
+ Fiat will be immediately withdrawn from your bank account. +
+
+ The bitcoins will be purchased and deposited to "{{wallet.name || '...' }}" wallet in 2-4 business days. +
+
+
+
+ Information +
+
+ Sell {{sellPrice.subtotal|currency:'':2}} {{sellPrice.currency}} in Bitcoin at {{sellPrice.price|currency:'':2}} {{sellPrice.currency}}/BTC +
+
+ Fiat will be deposited in your bank account in 4-6 business days. +
+
+ Bitcoins will be immediately sent from your "{{wallet.name || '...' }}" wallet to Glidera. +
+
+
+
+ No wallets available +
+
+ Insufficient funds +
- - Click to pay - + + {{'Accept' | translate}} + - Slide to pay + slide-send-status="sendStatus" + has-wallet-chosen="wallet"> + {{'Accept' | translate}} - Payment Sent - Proposal Created + Payment Sent + Proposal Created + Transaction created +
+ A transfer has been initiated from your bank account. Your bitcoins should arrive to your wallet in 2-4 business day + A transfer has been initiated to your bank account. Should arrive in 4-6 business days +
+ + + {{'Custom Amount' | translate}} + + + + + + + + +
+ + +
+
+
+ Address + + {{address}} + +
+
+ Amount + + {{amountStr}} - {{altAmountStr}} + +
+
+
+ diff --git a/www/views/feedback/complete.html b/www/views/feedback/complete.html new file mode 100644 index 000000000..bf7ceee5c --- /dev/null +++ b/www/views/feedback/complete.html @@ -0,0 +1,65 @@ + + + + + {{'Share BitPay' | translate}} + + + +
+
+
+ +
Share the love by inviting your friends.
+
+
+ +
A member of the team will review your feedback as soon as possible.
+
+
If you have additional feedback, please let us know by tapping the "Send feedback" option in the Settings tab.
+ +
+
Share the love by inviting your friends.
+
+
+ +
+
+
diff --git a/www/views/feedback/rateApp.html b/www/views/feedback/rateApp.html new file mode 100644 index 000000000..e0d2774e8 --- /dev/null +++ b/www/views/feedback/rateApp.html @@ -0,0 +1,21 @@ + + + Not now + + +
+ 5-star ratings help us get BitPay into more hands, and more users means more resources can be committed to the app! +
+
+ Would you be willing to rate BitPay in the app store? +
+
+ + +
+
+
diff --git a/www/views/feedback/rateCard.html b/www/views/feedback/rateCard.html new file mode 100644 index 000000000..533689849 --- /dev/null +++ b/www/views/feedback/rateCard.html @@ -0,0 +1,43 @@ +
+
+ How do you like BitPay? + +
+
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ +
diff --git a/www/views/feedback/send.html b/www/views/feedback/send.html new file mode 100644 index 000000000..4f6f4e409 --- /dev/null +++ b/www/views/feedback/send.html @@ -0,0 +1,48 @@ + + + {{'Send Feedback' | translate}} + + + + + + + + + + +
+ {{comment}} +
+
+ + +
+
+
diff --git a/www/views/glidera.html b/www/views/glidera.html index f77e3a5f4..645a6df1e 100644 --- a/www/views/glidera.html +++ b/www/views/glidera.html @@ -3,14 +3,9 @@ Glidera - - - - +
Glidera is disabled for this application @@ -32,21 +27,21 @@

Connect your Glidera account to get started.

-

Glidera Inc. (Glidera) is providing the service of buying or selling bitcoin to BitPay users. To enable this service, Glidera has registered with US Treasury Department’s FinCEN as a Money Service Business (#31000042625755). Users of BitPay must agree to the service agreement presented by Glidera prior to obtaining Glidera’s service of buying or selling bitcoin.

-

Service is available in the U.S. and Canada. In the U.S. – AZ, CA, CO, DE, GA, IL, KS, MA, MD, ME, MN, MO, MT, NJ, NV, PA, SC, TN, TX, UT, WI. In Canada – AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, SK, YT.

+

Glidera Inc. (Glidera) is providing the service of buying or selling bitcoin to BitPay users. To enable this service, Glidera has registered with US Treasury Department’s FinCEN as a Money Service Business (#31000042625755). Users of BitPay must agree to the service agreement presented by Glidera prior to obtaining Glidera’s service of buying or selling bitcoin.

+

Service is available in the U.S. and Canada.

diff --git a/www/views/includes/backupLaterPopup.html b/www/views/includes/backupLaterPopup.html index 5e6304755..31fd8f14b 100644 --- a/www/views/includes/backupLaterPopup.html +++ b/www/views/includes/backupLaterPopup.html @@ -1,6 +1,6 @@

Without a backup, you could lose money

- If something happens to this device, this app is deleted, or your password forgotten, neither you nor Bitpay can revoer your funds. + If something happens to this device, this app is deleted, or your password forgotten, neither you nor Bitpay can recover your funds. diff --git a/www/views/includes/clickToAccept.html b/www/views/includes/clickToAccept.html index cf555153b..ab24cfbd5 100644 --- a/www/views/includes/clickToAccept.html +++ b/www/views/includes/clickToAccept.html @@ -1,4 +1,4 @@ -
diff --git a/www/views/includes/incomingDataMenu.html b/www/views/includes/incomingDataMenu.html index 0478e88ff..fbc134b57 100644 --- a/www/views/includes/incomingDataMenu.html +++ b/www/views/includes/incomingDataMenu.html @@ -75,4 +75,28 @@
+ + diff --git a/www/views/includes/menu-popover.html b/www/views/includes/menu-popover.html new file mode 100644 index 000000000..f5acfe6ab --- /dev/null +++ b/www/views/includes/menu-popover.html @@ -0,0 +1,9 @@ + + +
+
+ {{i.text}} +
+
+
+
diff --git a/www/views/includes/slideToAcceptSuccess.html b/www/views/includes/slideToAcceptSuccess.html index ca2e4ed8a..37f0381f1 100644 --- a/www/views/includes/slideToAcceptSuccess.html +++ b/www/views/includes/slideToAcceptSuccess.html @@ -3,7 +3,7 @@ ng-class="{'fill-screen': fillScreen}">
-
+
Payment Sent diff --git a/www/views/includes/terms.html b/www/views/includes/terms.html index b9920cf85..6ce3f0325 100644 --- a/www/views/includes/terms.html +++ b/www/views/includes/terms.html @@ -1,56 +1,56 @@
-

+

This is a binding Agreement between BitPay, Inc. (“BitPay” or “We”) and the person, persons, or entity (“You” or “Your”) using the service, Software, or application (“Software”).

-

+

RIGHTS AND OBLIGATIONS

-

+

BitPay provides the Software solely on the terms and conditions set forth in this Agreement and on the condition that You accept and comply with them. By using the Software You (a) accept this Agreement and agree that You are legally bound by its terms; and (b) represent and warrant that: (i) You are of legal age to enter into a binding agreement; and (ii) if You are a corporation, governmental organization or other legal entity, You have the right, power and authority to enter into this Agreement on behalf of the corporation, governmental organization or other legal entity and bind them to these terms.

-

+

This Software functions as a free, open source, and multi-signature digital wallet. The Software does not constitute an account where We or other third parties serve as financial intermediaries or custodians of Your bitcoin(s).

-

+

While the Software has undergone beta testing and continues to be improved by feedback from the open-source user and developer community, We cannot guarantee there will not be bugs in the Software. You acknowledge that Your use of this Software is at Your own discretion and in compliance with all applicable laws. You are responsible for safekeeping Your passwords, private key pairs, PINs, and any other codes You use to access the Software.

-

+

IF YOU LOSE ACCESS TO YOUR BITCOIN WALLET OR YOUR ENCRYPTED PRIVATE KEYS AND YOU HAVE NOT SEPARATELY STORED A BACKUP OF YOUR WALLET AND CORRESPONDING PASSWORD, YOU ACKNOWLEDGE AND AGREE THAT ANY BITCOIN YOU HAVE ASSOCIATED WITH THAT WALLET WILL BECOME INACCESSIBLE. All transaction requests are irreversible. The authors of the Software, employees and affiliates of BitPay, copyright holders, and BitPay, Inc. cannot retrieve Your private keys or passwords if You lose or forget them and cannot guarantee transaction confirmation as they do not have control over the bitcoin network.

-

+

DISCLAIMER

-

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OF THE SOFTWARE, EMPLOYEES AND AFFILIATES OF BITPAY, COPYRIGHT HOLDERS, OR BITPAY, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-

+

IN NO EVENT WILL BITPAY OR ITS AFFILIATES, OR ANY OF ITS OR THEIR RESPECTIVE SERVICE PROVIDERS, BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY USE, INTERRUPTION, DELAY OR INABILITY TO USE THE SOFTWARE, LOST REVENUES OR PROFITS, DELAYS, INTERRUPTION OR LOSS OF SERVICES, BUSINESS OR GOODWILL, LOSS OR CORRUPTION OF DATA, LOSS RESULTING FROM SYSTEM OR SYSTEM SERVICE FAILURE, MALFUNCTION OR SHUTDOWN, FAILURE TO ACCURATELY TRANSFER, READ OR TRANSMIT INFORMATION, FAILURE TO UPDATE OR PROVIDE CORRECT INFORMATION, SYSTEM INCOMPATIBILITY OR PROVISION OF INCORRECT COMPATIBILITY INFORMATION OR BREACHES IN SYSTEM SECURITY, OR FOR ANY CONSEQUENTIAL, INCIDENTAL, INDIRECT, EXEMPLARY, SPECIAL OR PUNITIVE DAMAGES, WHETHER ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR OTHERWISE, REGARDLESS OF WHETHER SUCH DAMAGES WERE FORESEEABLE AND WHETHER OR NOT WE WERE ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

-

+

INTELLECTUAL PROPERTY

-

+

We retain all right, title, and interest in and to the Content and all of BitPay’s brands, logos, and trademarks, including, but not limited to, BitPay, Inc., BitPay, BitPay – Secure Bitcoin Wallet, BitPay Wallet, BitPay App, Copay, BitPay Prepaid Card, and variations of the wording of the aforementioned brands, logos, and trademarks.

-

+

CHOICE OF LAW

-

+

This Agreement, and its application and interpretation, shall be governed exclusively by the laws of the State of Georgia, without regard to its conflict of law rules. You consent to the exclusive jurisdiction of the federal and state courts located in or near Atlanta, Georgia for any dispute arising under this Agreement.

-

+

SEVERABILITY

-

+

In the event any court shall declare any section or sections of this Agreement invalid or void, such declaration shall not invalidate the entire Agreement and all other paragraphs of the Agreement shall remain in full force and effect.

-

+

BINDING AGREEMENT

-

+

The terms and provisions of this Agreement are binding upon Your heirs, successors, assigns, and other representatives. This Agreement may be executed in counterparts, each of which shall be considered to be an original, but both of which constitute the same Agreement.

-

+

You assume any and all risks associated with the use of the Software. We reserve the right to modify this Agreement from time to time.

diff --git a/www/views/includes/txp.html b/www/views/includes/txp.html index 107c0046c..779869454 100644 --- a/www/views/includes/txp.html +++ b/www/views/includes/txp.html @@ -1,27 +1,39 @@ +
+ -
-
- {{tx.amountStr}} +
+ +
+ + + {{addressbook[tx.toAddress].name || addressbook[tx.toAddress]}} + + + {{tx.message}} + + + Sending + + + + {{tx.merchant.domain}} + {{tx.merchant.domain}} +
- - - {{addressbook[tx.toAddress].name || addressbook[tx.toAddress]}} - - - {{tx.message}} - - - Sending - - - - {{tx.merchant.domain}} - {{tx.merchant.domain}} - -

- - {{tx.wallet.name}} - -

+ + + + + (possible double spend) + + + – {{tx.amountStr}} + + +
+ + +
+
diff --git a/www/views/includes/walletSelector.html b/www/views/includes/walletSelector.html index 42ec0d772..5227c0b15 100644 --- a/www/views/includes/walletSelector.html +++ b/www/views/includes/walletSelector.html @@ -1,6 +1,6 @@ -
Send from
+
{{title}}
{{wallet.name || wallet.id}} - + {{wallet.status.availableBalanceStr}} + [Balance Hidden]
diff --git a/www/views/join.html b/www/views/join.html index a8a7a812c..a62496124 100644 --- a/www/views/join.html +++ b/www/views/join.html @@ -82,30 +82,32 @@ ng-model="privateKey"> - - Encrypt with a Password + + Add a password +
+ Add an optional password to secure the recovery phrase + The recovery phrase could require a password to be imported +
- +
+ - +
- This password cannot be recovered. If the password is lost, funds can only be recovered with a valid backup. + This password cannot be recovered. If the password is lost, there is no way you could recover your funds.
diff --git a/www/views/modals/customAmount.html b/www/views/modals/customAmount.html deleted file mode 100644 index 2f33a3158..000000000 --- a/www/views/modals/customAmount.html +++ /dev/null @@ -1,88 +0,0 @@ - - -
-

Request a specific amount

- - - -
-
-

QR Code

-
    -
  • - -
    - - - Share address - -
    -
  • -
- -

Details

-
    -
  • - Address: - - {{addr}} - -
  • -
  • - Amount: - - {{customizedAmountUnit}} - {{customizedAlternativeUnit}} - -
  • -
-
- -
-
- -
- - - Not valid - - - - -
-
- -
- - - {{unitName}} -
-
-
- - -
- - - -
-
-
-
- diff --git a/www/views/modals/search.html b/www/views/modals/search.html index ec2f0cd82..804e17f4a 100644 --- a/www/views/modals/search.html +++ b/www/views/modals/search.html @@ -18,7 +18,7 @@
-
+
@@ -40,9 +40,9 @@

- sync - sync - sync + sync + sync + sync

@@ -72,7 +72,7 @@
- {{filteredTxHistory.length - txHistorySearchResults.length}} more + {{filteredTxHistory.length - txHistorySearchResults.length}} more  
diff --git a/www/views/modals/terms.html b/www/views/modals/terms.html index f823870b0..e1b216308 100644 --- a/www/views/modals/terms.html +++ b/www/views/modals/terms.html @@ -12,7 +12,7 @@
diff --git a/www/views/modals/txp-details.html b/www/views/modals/txp-details.html index 769985946..1496acc64 100644 --- a/www/views/modals/txp-details.html +++ b/www/views/modals/txp-details.html @@ -11,11 +11,11 @@ - +
- + Sending
@@ -27,7 +27,7 @@ The payment was removed by creator
-
+
Payment accepted, but not yet broadcasted
@@ -86,7 +86,7 @@
- {{'Memo'|translate}} + Memo {{tx.message}} @@ -150,12 +150,6 @@
- - Click to accept -
* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created. @@ -167,16 +161,24 @@
+ + {{'Accept'| translate}} + - Slide to accept + slide-send-status="sendStatus" + has-wallet-chosen="true"> + {{'Accept'| translate}} - Payment Sent + {{'Payment Sent' | translate}} diff --git a/www/views/modals/wallet-balance.html b/www/views/modals/wallet-balance.html new file mode 100644 index 000000000..d68109fa3 --- /dev/null +++ b/www/views/modals/wallet-balance.html @@ -0,0 +1,96 @@ + + + +
+ {{wallet.name}} +
+
+ + + +
+
+ +
All of your bitcoin wallet balance may not be available for immediate spending.
+
+
+ +
+
Total
+ + + {{status.totalBalanceStr}} + +
+ + {{status.totalBalanceAlternative}} {{status.alternativeIsoCode}} + +
+
+
+
+
The total amount of bitcoin stored in this wallet.
+
+
+
+ +
+
Available
+ + + {{status.spendableBalanceStr}} + +
+ + {{status.spendableBalanceAlternative}} {{status.alternativeIsoCode}} + +
+
+
+
+
The amount of bitcoin immediately spendable from this wallet.
+
+
+
+ +
+
Confirming
+ + + {{status.pendingBalanceStr}} + +
+ + {{status.pendingBalanceAlternative}} {{status.alternativeIsoCode}} + +
+
+
+
+
The amount of bitcoin stored in this wallet with less than 1 blockchain confirmation.
+
+
+
+ +
+
Locked
+ + + {{status.lockedBalanceStr}} + +
+ + {{status.lockedBalanceAlternative}} {{status.alternativeIsoCode}} + +
+
+
+
+
The amount of bitcoin stored in this wallet that is allocated as inputs to your pending transaction proposals. The amount is determined using unspent transaction outputs associated with this wallet and may be more than the actual amounts associated with your pending transaction proposals.
+
+
+
diff --git a/www/views/onboarding/disclaimer.html b/www/views/onboarding/disclaimer.html index 96a75f909..f728ccd9e 100644 --- a/www/views/onboarding/disclaimer.html +++ b/www/views/onboarding/disclaimer.html @@ -1,32 +1,48 @@ - - - - - - - - -
-
Quick review!
-
Almost done! Let's review.
-
Bitcoin is different – it cannot be safely held with a bank or web service.
- - - I understand that my funds are held securely on this device, not by a company. - - - I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase. - - -
-
-
- -

I have read, understood, and agree to the Terms of Use.

- + + + + + + + + + +
+
Quick review!
+
Almost done! Let's review.
+
Bitcoin is different – it cannot be safely held with a bank or web service.
+ + + I understand that my funds are held securely on this device, not by a company. + + + I understand that if this app is moved to another device or deleted, my bitcoin can only be recovered with the backup phrase. + +
+
+
+
+ + {{'Terms of Use' | translate}} + + + + +
+
- - +
+
+
+
+ +

I have read, understood, and agree to the Terms of Use.

+ +
+
+ diff --git a/www/views/onboarding/tour.html b/www/views/onboarding/tour.html index de836e0c9..371842f81 100644 --- a/www/views/onboarding/tour.html +++ b/www/views/onboarding/tour.html @@ -15,7 +15,7 @@
Just scan the code to pay.
-
@@ -30,7 +30,7 @@
The exchange rate changes with the market.
-
@@ -38,12 +38,12 @@ -
You control your bitcoin.
-
This app stores your bitcoin with cutting-edge security.
+
You control your bitcoin.
+
This app stores your bitcoin with cutting-edge security.
Not even BitPay can access it.
-
diff --git a/www/views/paperWallet.html b/www/views/paperWallet.html index 548bc5308..139645165 100644 --- a/www/views/paperWallet.html +++ b/www/views/paperWallet.html @@ -1,91 +1,37 @@ - + {{'Sweep paper wallet' | translate}} + + + - - -
-
-
Backup Needed
-
- Before receiving funds, you must backup your wallet. If this device is lost, it is impossible to access your funds without a backup. -
- Backup Now -
-
- -
-

-
- {{error|translate}} -
- -
-
-
-
- -
-
- -
-
-
-
- -

- Decrypting a paper wallet could take around 5 minutes on this device. please be patient and keep the app open. -

-
-
-
- - -
- + +
-
-

Funds found

-
{{balance}}
-
- - - - +

Funds found:

+
{{balance}}
+
...
- +
Funds will be transferred to: - {{walletAlias || walletName}} + {{wallet.walletAlias || wallet.name}}
+
+ No wallets available to receive funds +
+ + Founds transferred +
diff --git a/www/views/preferences.html b/www/views/preferences.html index 35b787557..b16b93b4d 100644 --- a/www/views/preferences.html +++ b/www/views/preferences.html @@ -29,6 +29,11 @@ + + + Hide Balance + +
Security
diff --git a/www/views/preferencesAbout.html b/www/views/preferencesAbout.html index 3f26d93b6..42c47284c 100644 --- a/www/views/preferencesAbout.html +++ b/www/views/preferencesAbout.html @@ -16,7 +16,7 @@ v{{version}}
-
+
Commit hash @@ -30,11 +30,11 @@ Terms of Use - + Session log diff --git a/www/views/preferencesAdvanced.html b/www/views/preferencesAdvanced.html index ee1c3b859..3cba1623d 100644 --- a/www/views/preferencesAdvanced.html +++ b/www/views/preferencesAdvanced.html @@ -12,10 +12,6 @@ Wallet Information - - Sweep paper wallet - - Export Wallet diff --git a/www/views/preferencesAltCurrency.html b/www/views/preferencesAltCurrency.html index 0954fa8b5..dc9be4286 100644 --- a/www/views/preferencesAltCurrency.html +++ b/www/views/preferencesAltCurrency.html @@ -7,13 +7,27 @@ - {{altCurrency.name}} - +
+ +
+
+ {{lastUsedAltCurrency.name}} + +
+
+ {{altCurrency.name}} + +
- + ng-if="!listComplete" + on-infinite="loadMore()" + distance="50%"> +
diff --git a/www/views/preferencesBitpayCard.html b/www/views/preferencesBitpayCard.html index 756a0dca2..138327698 100644 --- a/www/views/preferencesBitpayCard.html +++ b/www/views/preferencesBitpayCard.html @@ -10,14 +10,14 @@
Cards
-
+
xxxx-xxxx-xxxx-{{card.lastFourDigits}} {{card.email}} - +
diff --git a/www/views/preferencesBwsUrl.html b/www/views/preferencesBwsUrl.html index d03d415bc..397472245 100644 --- a/www/views/preferencesBwsUrl.html +++ b/www/views/preferencesBwsUrl.html @@ -1,4 +1,4 @@ - + Wallet Service URL @@ -6,8 +6,8 @@ -
- +
+
+ {{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. + The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance). +
+
diff --git a/www/views/preferencesDeleteWallet.html b/www/views/preferencesDeleteWallet.html index de664a46b..258632186 100644 --- a/www/views/preferencesDeleteWallet.html +++ b/www/views/preferencesDeleteWallet.html @@ -6,7 +6,7 @@
-

Warning!

+

Warning!

Permanently delete this wallet. diff --git a/www/views/preferencesGlidera.html b/www/views/preferencesGlidera.html index c4e5ee79c..a93bd1f80 100644 --- a/www/views/preferencesGlidera.html +++ b/www/views/preferencesGlidera.html @@ -265,6 +265,8 @@

  • Log out
  • + +
    diff --git a/www/views/preferencesHistory.html b/www/views/preferencesHistory.html index 25d08b2d3..272ab99ac 100644 --- a/www/views/preferencesHistory.html +++ b/www/views/preferencesHistory.html @@ -6,7 +6,7 @@
    - + Export to file diff --git a/www/views/preferencesInformation.html b/www/views/preferencesInformation.html index 5871585c5..5795790a2 100644 --- a/www/views/preferencesInformation.html +++ b/www/views/preferencesInformation.html @@ -80,38 +80,11 @@
    Copayer {{$index}} - Copayer {{$index}} {{pk}} ({{basePath}})
    -
    -
    - Latest Wallet Addresses -
    -
    -
    - Only “main” addresses are shown below. This excludes “change” address. -
    -
    -
    - {{a.address}} - {{a.path}} · {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }} -
    -
    -
    - Please note: due to resource constraints, this list of addresses is not verified locally. A compromised BWS node could return addresses which are not controlled by this wallet. -
    -
    - - -
    -
    Balance By Address diff --git a/www/views/preferencesLanguage.html b/www/views/preferencesLanguage.html index 2c01d7d61..0605e17be 100644 --- a/www/views/preferencesLanguage.html +++ b/www/views/preferencesLanguage.html @@ -12,14 +12,18 @@ ng-click="save(lang.isoCode)">{{lang.name}}
    -
    - We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. - - - Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. - +
    +
    + We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. +
    +
    +
    + Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. +
    +
    +
    + Contribute Translations +
    diff --git a/www/views/proposals.html b/www/views/proposals.html index abeb2ea15..0494e67d3 100644 --- a/www/views/proposals.html +++ b/www/views/proposals.html @@ -16,10 +16,8 @@
    -
    - - - +
    +
    diff --git a/www/views/sellGlidera.html b/www/views/sellGlidera.html deleted file mode 100644 index fc7b6b30c..000000000 --- a/www/views/sellGlidera.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - Sell - - - - -
    - Testnet wallets only work with Glidera Sandbox Accounts -
    - -
    - Daily sell limit: - {{limits.dailySell|currency:'':2}} {{limits.currency}} - (remaining {{limits.dailySellRemaining|currency:'':2}} {{limits.currency}}) -
    - Monthly sell limit: - {{limits.monthlySell|currency:'':2}} {{limits.currency}} - (remaining {{limits.monthlySellRemaining|currency:'':2}} {{limits.currency}}) -
    - -
    - - This operation was disabled because you have a pending first transaction - -
    - -
    -
    - -
    - -
    - - - -
    - Sell - {{sell.sellPrice.subtotal|currency:'':2}} {{sell.sellPrice.currency}} in Bitcoin - {{sell.sellPrice.qty}} BTC - at {{sell.sellPrice.price|currency:'':2}} {{sell.sellPrice.currency}}/BTC - -
    -
    - (Enter the amount to get the exchange rate) -
    - -
    - ... -
    - - -
    -
    -
    -
    -{{sell.sellPrice.qty}} BTC → {{sell.sellPrice.subtotal|currency:'':2}} {{sell.sellPrice.currency}} -

    - A SMS containing a confirmation code was sent to your phone.
    - Please, enter the code below -

    -
    -
    - -
    - -
    -

    - Bitcoins will be immediately sent from your wallet to Glidera. Fiat will be deposited in your bank account in 4-6 business days. -

    -
    -
    -
    -

    Sale initiated

    -

    - A transfer has been initiated to your bank account and should arrive in 4-6 business days. -

    - - -
    -
    -
    diff --git a/www/views/tab-create-personal.html b/www/views/tab-create-personal.html index e094b1ce6..2bc8bcaf6 100644 --- a/www/views/tab-create-personal.html +++ b/www/views/tab-create-personal.html @@ -51,28 +51,30 @@ ng-model="formData.privateKey"> - - Encrypt with a Password + + Add a password +
    + Add an optional password to secure the recovery phrase + The recovery phrase could require a password to be imported +
    - +
    + - + +
    - This password cannot be recovered. If the password is lost, funds can only be recovered with a valid backup. + This password cannot be recovered. If the password is lost, there is no way you could recover your funds.
    diff --git a/www/views/tab-create-shared.html b/www/views/tab-create-shared.html index 619689353..ebc5aff4d 100644 --- a/www/views/tab-create-shared.html +++ b/www/views/tab-create-shared.html @@ -21,7 +21,7 @@ - - Encrypt with a Password + + Add a password +
    + Add an optional password to secure the recovery phrase + The recovery phrase could require a password to be imported +
    - +
    + - + +
    - This password cannot be recovered. If the password is lost, funds can only be recovered with a valid backup. + This password cannot be recovered. If the password is lost, there is no way you could recover your funds.
    diff --git a/www/views/tab-home.html b/www/views/tab-home.html index a9506616b..2cb7387dd 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -10,9 +10,10 @@ spinner="ios-small" on-refresh="onRefresh()"> -
    +
    An update to this app is available
    +
    @@ -37,9 +38,9 @@ {{txpsN}} - - - +
    + +
    @@ -47,10 +48,6 @@ Recent Transactions - - -
    Updating activity...
    -
    @@ -83,11 +80,13 @@ Incomplete - {{wallet.status.pendingBalanceStr}} + {{wallet.status.totalBalanceStr}} [Balance Hidden] {{wallet.m}}-of-{{wallet.n}} + + {{wallet.error}}  

    @@ -116,8 +115,8 @@
    -
    - Buy & Sell Bitcoin +
    + Buy & Sell Bitcoin
    @@ -137,15 +136,15 @@
    - Amazon.com Gift Cards + Amazon.com Gift Cards
    -
    - Next steps +
    + Next steps
    diff --git a/www/views/tab-import-phrase.html b/www/views/tab-import-phrase.html index 6854ad9b3..d98ef6269 100644 --- a/www/views/tab-import-phrase.html +++ b/www/views/tab-import-phrase.html @@ -34,7 +34,7 @@
    +
    Wallet not backed up
    -
    - -
    +
    + +
    ...
    @@ -64,28 +69,38 @@ Share
    -
    -
    - - Next Address -
    -
    -
    -
    +
    +
    ... - {{addr}} + {{walletAddrs[wallet.id]}} +
    - -
    -
    -
    -
    +
    + + +
    diff --git a/www/views/tab-scan.html b/www/views/tab-scan.html index 21f5282bd..a50e3ff09 100644 --- a/www/views/tab-scan.html +++ b/www/views/tab-scan.html @@ -18,9 +18,9 @@
    Enable the camera to get started.
    Enable camera access in your device settings to get started.
    Please connect a camera to get started.
    - - - + + +
    diff --git a/www/views/tab-send.html b/www/views/tab-send.html index b33e828e3..31e304468 100644 --- a/www/views/tab-send.html +++ b/www/views/tab-send.html @@ -2,7 +2,7 @@ {{'Send' | translate}} - +
    @@ -18,19 +18,15 @@
    -
    +
    Recipient
    -
    - -
    - - - -
    + +
    + + +
    +
    Contacts @@ -41,7 +37,7 @@
    - + Add a Contact diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index 075ff0a81..92a0c0eae 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -10,59 +10,64 @@ - Bitcoin Exchanges + {{'Bitcoin Exchanges' | translate}} - Address Book + {{'Address Book' | translate}} - + - Help & Support + {{'Help & Support' | translate }} - + - Send Feedback + {{'Send Feedback' | translate}} + + + + + + + {{'Share'|translate}} {{appName}} -
    Preferences
    +
    {{'Preferences' | translate}}
    - Notifications + {{'Notifications' | translate}} - - - - - - - - - - - - + + + + + {{'Language' | translate}} + + {{currentLanguageName|translate}} + + + - Bitcoin Unit + {{'Bitcoin Unit' | translate}} {{unitName}} @@ -73,7 +78,7 @@ - Alternative Currency + {{'Alternative Currency' | translate}} {{selectedAlternative.name}} @@ -84,14 +89,14 @@ - Bitcoin Network Fee Policy + {{'Bitcoin Network Fee Policy' | translate}} {{feeOpts[currentFeeLevel]|translate}} -
    Wallets & Integrations
    +
    {{'Wallets & Integrations' | translate}}
    - - Incomplete + + {{'Incomplete' | translate}} + + +
    +
    + BitPay Visa® Card + +
    + + + + + +
    - - - - - Tell a friend - - - -
    - - Advanced + {{'Advanced' | translate}} - About {{appName}} + {{'About' | translate}} {{appName}}
    diff --git a/www/views/tabs.html b/www/views/tabs.html index cd8dafcbd..6673b416a 100644 --- a/www/views/tabs.html +++ b/www/views/tabs.html @@ -1,22 +1,22 @@ - + - + - + - + - + diff --git a/www/views/termsOfUse.html b/www/views/termsOfUse.html index 9421f7fda..ee09018f5 100644 --- a/www/views/termsOfUse.html +++ b/www/views/termsOfUse.html @@ -11,7 +11,7 @@
    diff --git a/www/views/translators.html b/www/views/translators.html index e2a97d9cb..5a732584c 100644 --- a/www/views/translators.html +++ b/www/views/translators.html @@ -9,26 +9,28 @@
    Translation Credits
    -
    kinoshitajonaJapanese
    +
    KirvxFrench
    -
    saschadGerman
    +
    cmgustavo83Spanish
    -
    RussianNeuroMancerRussian
    + +
    +
    +
    + We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. +
    +
    +
    +
    + Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. +
    -

    - We’re always looking for translation contributions! You can make corrections or help to make this app available in your native language by joining our community on Crowdin. - -

    - - Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. - + Contribute Translations
    diff --git a/www/views/modals/tx-details.html b/www/views/tx-details.html similarity index 70% rename from www/views/modals/tx-details.html rename to www/views/tx-details.html index 6297683d2..2016c75ad 100644 --- a/www/views/modals/tx-details.html +++ b/www/views/tx-details.html @@ -7,16 +7,31 @@ - +
    -
    - - {{btx.action | translate}} +
    + + + + {{'Sent' | translate}} + {{'Received' | translate}} + {{'Moved' | translate}} +
    +
    + + Sending + Receiving
    {{displayAmount}} {{displayUnit}}
    -
    {{btx.alternativeAmountStr}}
    +
    + {{btx.alternativeAmountStr}} + + {{rateStr}} ({{rateDate | amDateFormat:'MM/DD/YYYY HH:mm a'}}) + ... + +
    @@ -47,14 +62,14 @@ {{btx.creatorName}}
    - + Memo - +
    {{btx.note.body || btx.message}} - +
    -
    +
    Fee {{btx.feeStr}} @@ -63,7 +78,7 @@
    Confirmations - + Unconfirmed diff --git a/www/views/walletDetails.html b/www/views/walletDetails.html index d9ee9e4ae..2a1b22670 100644 --- a/www/views/walletDetails.html +++ b/www/views/walletDetails.html @@ -1,4 +1,5 @@ + {{wallet.name}} @@ -10,42 +11,136 @@ - +
    + +
    +
    +
    +
    + +
    + {{updateStatusError}} + Tap to retry +
    + +
    + This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information. + Recreate +
    + +
    + Scan status finished with error +
    Tap to retry +
    + +
    + {{status.totalBalanceStr}} +
    + {{status.totalBalanceAlternative}} {{status.alternativeIsoCode}} +
    +
    + +
    + [Balance Hidden] +
    + Tap and hold to show +
    +
    + +
    + +
    + +
    +
    +
    + ... +
    +
    +
    +
    + +
    +
    + + -
    -
    -
    + +
    +
    +
    +
    - Tap to retry + {{updateStatusError}} + Tap to retry
    - This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information. + This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information. Recreate
    -
    - Scan status finished with error -
    Tap to retry +
    + {{status.totalBalanceStr}} +
    {{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}
    - -
    - {{status.totalBalanceStr}} -
    {{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}
    -
    -
    Available: {{status.totalBalanceStr}}
    -
    Confirming: {{status.pendingAmountStr}}
    -
    +
    +
    -
    +
    [Balance Hidden]
    Tap and hold to show @@ -64,7 +159,11 @@
    -
    + + Wallet not backed up + + +
    @@ -73,34 +172,19 @@
    -
    -
    - - - WARNING: Wallet not registered - -
    -
    - This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information. -
    -
    - - Recreate - -
    -
    - -
    -
    + +
    + Proposals + Unsent transactions
    -
    - +
    +
    - -
    -
    - - - - - (possible double spend) - - - {{btx.amountStr}} - +
    +
    +
    + + Recent + + + {{getDate(btx.time) | amDateFormat:'MMMM'}} -

    - - - Unconfirmed - -

    - - - - - -
    -
    -
    {{btx.note.body}}
    -
    Received
    -
    - -
    -
    {{btx.message}}
    -
    {{btx.note.body}}
    -
    - {{addressbook[btx.addressTo].name || addressbook[btx.addressTo]}} -
    -
    Sent
    -
    - -
    -
    {{btx.note.body}}
    -
    Moved
    -
    - Invalid
    + + + + + + + + + +
    + +
    +
    +
    {{btx.note.body}}
    +
    Received
    +
    + +
    +
    {{btx.message}}
    +
    {{btx.note.body}}
    +
    + {{addressbook[btx.addressTo].name || addressbook[btx.addressTo]}} +
    +
    Sent
    +
    + +
    +
    {{btx.note.body}}
    +
    Moved
    +
    + Invalid +
    + +
    +
    + Sending + Receiving +
    +
    + + + + + + (possible double spend) + + + {{btx.amountStr}} + + +
    + + +
    +
    +
    +
    +
    +
    +