diff --git a/__tests__/missingTranslationKeys.js b/__tests__/missingTranslationKeys.js new file mode 100644 index 00000000..e41bb382 --- /dev/null +++ b/__tests__/missingTranslationKeys.js @@ -0,0 +1,18 @@ +const { exec } = require('child_process'); +console.log('TYPESCRIPT ERROR CHECK'); +console.log('=' + '='.repeat(50)); + +exec('tsc --noEmit', (error, stdout) => { + if (error) { + const output = stdout; + const filteredErrors = output.split('\n').filter(line => line.includes('TxKeyPath')); + if (filteredErrors.length > 0) { + console.log('❌ TypeScript errors containing TxKeyPath found:'); + console.log(filteredErrors.join('\n')); + } else { + console.log('✅ No TypeScript errors containing TxKeyPath found.'); + } + } else { + console.log('✅ No TypeScript errors found.'); + } +}); \ No newline at end of file diff --git a/__tests__/missingTranslations.js b/__tests__/missingTranslations.js index bcbf6c8c..6334de86 100644 --- a/__tests__/missingTranslations.js +++ b/__tests__/missingTranslations.js @@ -1,4 +1,3 @@ -const { exec } = require('child_process'); const fs = require('fs'); const path = require('path'); @@ -7,91 +6,83 @@ console.log('=' + '='.repeat(50)); // First, run the translation analysis try { - // Read settings.json to get language configuration - const settingsPath = path.join(__dirname, '..', 'minibits.inlang', 'settings.json'); - const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); + // Read settings.json to get language configuration + const settingsPath = path.join(__dirname, '..', 'minibits.inlang', 'settings.json'); + const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); + const defaultLanguage = settings.sourceLanguageTag; + const allLanguages = settings.languageTags; - const defaultLanguage = settings.sourceLanguageTag; - const allLanguages = settings.languageTags; + console.log(`Default language: ${defaultLanguage}`); + console.log(`All languages: ${allLanguages.join(', ')}`); + console.log('=' + '='.repeat(50)); - console.log(`Default language: ${defaultLanguage}`); - console.log(`All languages: ${allLanguages.join(', ')}`); - console.log('=' + '='.repeat(50)); + // Load all translation files + const translations = {}; + const i18nMessagesPath = path.join(__dirname, '..', 'src', 'i18n_messages'); - // Load all translation files - const translations = {}; - const i18nMessagesPath = path.join(__dirname, '..', 'src', 'i18n_messages'); + allLanguages.forEach(lang => { + const filePath = path.join(i18nMessagesPath, `${lang}.json`); + if (fs.existsSync(filePath)) { + try { + translations[lang] = JSON.parse(fs.readFileSync(filePath, 'utf8')); + } catch (error) { + console.error(`Error reading ${lang}.json:`, error.message); + translations[lang] = {}; + } + } else { + console.warn(`Translation file not found: ${lang}.json`); + translations[lang] = {}; + } + }); - allLanguages.forEach(lang => { - const filePath = path.join(i18nMessagesPath, `${lang}.json`); - if (fs.existsSync(filePath)) { - try { - translations[lang] = JSON.parse(fs.readFileSync(filePath, 'utf8')); - } catch (error) { - console.error(`Error reading ${lang}.json:`, error.message); - translations[lang] = {}; - } - } else { - console.warn(`Translation file not found: ${lang}.json`); - translations[lang] = {}; - } - }); + // Get keys from default language + const defaultKeys = Object.keys(translations[defaultLanguage] || {}); + const totalKeys = defaultKeys.length; - // Get keys from default language - const defaultKeys = Object.keys(translations[defaultLanguage] || {}); - const totalKeys = defaultKeys.length; + console.log(`Total keys in default language (${defaultLanguage}): ${totalKeys}`); + console.log('=' + '='.repeat(50)); - console.log(`Total keys in default language (${defaultLanguage}): ${totalKeys}`); - console.log('=' + '='.repeat(50)); + // Check each language + for (const lang of allLanguages) { + if (lang === defaultLanguage) { + console.log(`\n${lang.toUpperCase()} (default language)`); + console.log(`✅ 100% translated (${totalKeys}/${totalKeys} keys)`); + continue; + } - // Check each language - allLanguages.forEach(lang => { - if (lang === defaultLanguage) { - console.log(`\n${lang.toUpperCase()} (default language)`); - console.log(`✅ 100% translated (${totalKeys}/${totalKeys} keys)`); - return; - } + const currentKeys = Object.keys(translations[lang] || {}); + const currentTotal = currentKeys.length; + const missingKeys = defaultKeys.filter(key => !translations[lang].hasOwnProperty(key)); + const percentcageTranslated = totalKeys > 0 ? Math.round((currentTotal / totalKeys) * 100) : 0; + + console.log(`\n${lang.toUpperCase()}`); + console.log(`📊 ${percentcageTranslated}% translated (${currentTotal}/${totalKeys} keys)`); + + if (missingKeys.length === 0) { + console.log('✅ No missing keys!'); + } else { + console.log(`❌ Missing ${missingKeys.length} keys:`); + const maxToShow = 25; - const currentKeys = Object.keys(translations[lang] || {}); - const currentTotal = currentKeys.length; - const missingKeys = defaultKeys.filter(key => !translations[lang].hasOwnProperty(key)); - const percentageTranslated = totalKeys > 0 ? Math.round((currentTotal / totalKeys) * 100) : 0; - - console.log(`\n${lang.toUpperCase()}`); - console.log(`📊 ${percentageTranslated}% translated (${currentTotal}/${totalKeys} keys)`); - - if (missingKeys.length > 0) { - console.log(`❌ Missing ${missingKeys.length} keys:`); - missingKeys.forEach(key => { - console.log(` - ${key}`); - }); - } else { - console.log(`✅ No missing keys!`); - } - }); + for (const [i, key] of missingKeys.entries()) { + if (i >= maxToShow) break; + console.log(` - ${key}`); + } - console.log('\n' + '=' + '='.repeat(50)); - console.log('✅ Translation analysis complete!'); + if (missingKeys.length > maxToShow) { + console.log(` ...and ${missingKeys.length - maxToShow} more. (fix these first)`); + } + + } + } + + console.log('\n' + '=' + '='.repeat(50)); + console.log('✅ Translation analysis complete!'); } catch (translationError) { - console.error('❌ Error during translation analysis:', translationError.message); + console.error('❌ Error during translation analysis:', translationError.message); } console.log('\n' + '=' + '='.repeat(50)); -console.log('TYPESCRIPT ERROR CHECK'); -console.log('=' + '='.repeat(50)); - -// Now run the TypeScript error checking -exec('tsc --noEmit', (error, stdout) => { - if (error) { - const output = stdout; - const filteredErrors = output.split('\n').filter(line => line.includes('TxKeyPath')); - if (filteredErrors.length > 0) { - console.log('❌ TypeScript errors containing TxKeyPath found:'); - console.log(filteredErrors.join('\n')); - } else { - console.log('✅ No TypeScript errors containing TxKeyPath found.'); - } - } else { - console.log('✅ No TypeScript errors found.'); - } -}); + // Read settings.json to get language configuration + const settingsPath = path.join(__dirname, '..', 'minibits.inlang', 'settings.json'); + const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); diff --git a/minibits.inlang/settings.json b/minibits.inlang/settings.json index b57eb50b..be05b3d7 100644 --- a/minibits.inlang/settings.json +++ b/minibits.inlang/settings.json @@ -3,7 +3,8 @@ "sourceLanguageTag": "en", "languageTags": [ "en", - "sk" + "sk", + "es" ], "modules": [ "https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@latest/dist/index.js", diff --git a/package.json b/package.json index 2513a75b..b8e036f0 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "lint": "eslint .", "start": "react-native start", "test": "jest", - "test:i18n": "node __tests__/missingTranslations.js && node __tests__/incorrectTranslationPlaceholders.js", + "test:i18n": "node __tests__/missingTranslations.js && node __tests__/incorrectTranslationPlaceholders.js && node __tests__/missingTranslationKeys.js", "adb": "adb devices && adb reverse tcp:9090 tcp:9090 && adb reverse tcp:3000 tcp:3000 && adb reverse tcp:9001 tcp:9001 && adb reverse tcp:8081 tcp:8081", "adb:unreverse": "adb devices && adb reverse --remove-all", "adb:inspect": "adb shell input keyevent 82", diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts index 22c2211a..56053380 100644 --- a/src/i18n/i18n.ts +++ b/src/i18n/i18n.ts @@ -6,6 +6,7 @@ import { getLocales } from "react-native-localize" // if English isn't your default language, move Translations to the appropriate language file. import en from "../i18n_messages/en.json" import sk from "../i18n_messages/sk.json" +import es from "../i18n_messages/es.json" type Translations = typeof en; export const i18n = new I18n() @@ -17,7 +18,8 @@ export const i18n = new I18n() */ i18n.translations = { en, "en-US": en, - sk + sk, "sk-SK": sk, + es, "es-ES": es, "es-MX": es } // important! diff --git a/src/i18n_messages/es.json b/src/i18n_messages/es.json new file mode 100644 index 00000000..6faabdbb --- /dev/null +++ b/src/i18n_messages/es.json @@ -0,0 +1,707 @@ +{ + "addMints": "Agregar mints", + "amountRequested": "Cantidad solicitada", + "amountSend": "Cantidad a enviar", + "amountTopup": "Cantidad de recarga", + "amountWithdraw": "Cantidad a retirar", + "attention": "¡Atención!", + "backupDeletedSuccess": "Tu copia de seguridad de tokens minibits ha sido eliminada. Los nuevos tokens NO se respaldarán.", + "backupInvalidMnemonicError": "Frase semilla corrupta o inválida. Por favor, mueve los fondos y reinstala esta billetera.", + "backupLocalBackup": "Copia de seguridad local", + "backupLocalBackupDescription": "La copia de seguridad local almacena una copia de todo tu ecash en la base de datos local. El ecash nunca se elimina a menos que desactives la copia de seguridad. Ten en cuenta que esta copia de seguridad no está cifrada.", + "backupMissingMnemonicError": "Falta la frase semilla.", + "backupMissingMnemonicOrSeedError": "Falta la frase semilla o la semilla.", + "backupMnemonicDescription": "Esta secuencia de 12 palabras representa tu semilla y te permite recuperar tu saldo de ecash en caso de pérdida del dispositivo. Guárdalas en un lugar seguro.", + "backupMnemonicTitle": "Tu frase semilla", + "backupOptionsTitle": "Copia de seguridad", + "backupRecoveryTool": "Exportar ecash", + "backupRecoveryToolDescription": "Filtra y exporta todo el ecash de la base de datos local agrupado por keysets de casa de moneda.", + "backupRemoteBackup": "Copia de seguridad de semilla", + "backupRemoteBackupDescription": "La frase semilla codifica tu semilla y te permite recuperar tu saldo de ecash en caso de pérdida del dispositivo.", + "backupRemoveSpentCoins": "Eliminar ecash gastado", + "backupRemoveSpentCoinsDescription": "Esta herramienta elimina el ecash gastado del saldo.", + "backupResult": "Las pruebas de ecash gastadas fueron eliminadas de la billetera.", + "backupSeedBackup": "Copia de seguridad de semilla", + "backupSuccess": "Tus tokens minibits fueron respaldados en la base de datos local. Los nuevos tokens se respaldarán automáticamente.", + "backupWalletBackupDescription": "Exporta la copia de seguridad de la billetera para que puedas importarla en un nuevo dispositivo.", + "backupWalletBackupTitle": "Copia de seguridad de la billetera", + "backupWillOverwriteBalanceWarning": "Tu billetera tiene saldo distinto de cero. Si continúas, el ecash existente será eliminado y reemplazado por la copia de seguridad.", + "buttonAdd": "Agregar", + "buttonCheck": "Verificar", + "cashuPaymentRequest_create": "Crear solicitud", + "cashuPaymentRequest_to": "Recibir en", + "cashuPaymentRequestQRTitle": "Solicitud de pago Cashu", + "cashuPaymentRequestTitle": "Casa de moneda para recibir", + "checkAndSync": "Verificar y sincronizar", + "checkAndSyncDesc": "Verifica que el nombre del contacto siga vinculado a la misma clave pública y actualiza la imagen si ha cambiado.", + "commonAdd": "Agregar", + "commonBack": "Atrás", + "commonCancel": "Cancelar", + "commonChange": "Cambiar", + "commonClose": "Cerrar", + "commonComplete": "Completar", + "commonCompleted": "Completado", + "commonConfirm": "Confirmar", + "commonConfirmAlertTitle": "Confirmación", + "commonConfirmCreateInvoice": "Crear factura", + "commonConnectedParam": "%{param} relés conectados", + "commonCopy": "Copiar", + "commonCopyFailParam": "No se pudo copiar %{param}", + "commonCopySuccessParam": "Copiado %{param}", + "commonCreate": "Crear", + "commonCreateCashuPaymentRequest": "Crear solicitud de pago", + "commonDisabled": "Deshabilitado", + "commonEdit": "Editar", + "commonEnabled": "Habilitado", + "commonHide": "Ocultar", + "commonHideMore": "Colapsar", + "commonImport": "Importar", + "commonNoDescPlaceholder": "Sin descripción", + "commonNotCreated": "Aún no creado", + "commonOff": "apagado", + "commonOffline": "Desconectado", + "commonOfflinePretty": "Tu dispositivo está actualmente desconectado", + "commonOk": "OK", + "commonOn": "encendido", + "commonPaste": "Pegar", + "commonPasteEcash": "Pegar ecash", + "commonPasteEcashToken": "Pegar token de ecash", + "commonQr": "Código QR", + "commonReconnect": "Reconectar", + "commonReset": "Restablecer", + "commonResetDefault": "Restablecer a predeterminado", + "commonSats": "sats", + "commonSave": "Guardar", + "commonSaveFailParam": "Error al guardar %{param}", + "commonScan": "Escanear", + "commonSend": "Enviar", + "commonSendAsEcash": "Enviar como ecash", + "commonShare": "Compartir", + "commonShow": "Mostrar", + "commonShowMore": "Mostrar más", + "commonSuccess": "¡Éxito!", + "commonTryAgain": "Intentar de nuevo", + "commonUpdate": "Actualizar", + "confirmBackupRecovery": "¿Realmente quieres recuperar ecash desde la copia de seguridad?", + "confirmMintRemoval": "¿Realmente quieres eliminar %{hostname} - %{shortname} de la billetera?", + "contactHasNoLightningAddrUseEcash": "Este contacto no tiene una dirección Lightning, envía ecash en su lugar.", + "contacts": "Contactos", + "contactsScreen_getInvoice": "Obtener factura", + "contactsScreen_new": "Nuevo", + "contactsScreen_newTitle": "Agregar nuevo contacto", + "contactsScreen_ownName_available": "%{name} está disponible!", + "contactsScreen_ownName_betaWarning": "Tenga en cuenta que esta es una versión beta preliminar del software. Sus datos aún podrían perderse debido a un error o una pérdida inesperada.", + "contactsScreen_ownName_chooseOwnName": "Elige tu propio nombre", + "contactsScreen_ownName_chooseOwnNameFooter": "Utilice letras minúsculas, números y .-_", + "contactsScreen_ownName_ctaPay": "Pagar desde la billetera", + "contactsScreen_ownName_donationSubtext": "Le solicita amablemente una pequeña donación para su nueva dirección de billetera.", + "contactsScreen_ownName_donationSuccess": "¡Gracias! La donación para %{receiver} se ha realizado correctamente.", + "contactsScreen_ownName_illegalChar": "No utilice caracteres . o - al principio o al final del nombre.", + "contactsScreen_ownName_insufficient": "El saldo de tu billetera no es suficiente para pagar este monto de factura, pero aún puedes pagarlo desde otra billetera.", + "contactsScreen_ownName_lightningInvoiceToPayQR": "Factura Lightning a pagar", + "contactsScreen_ownName_payToGetOwnName": "Pague la siguiente factura de Lightning y obtenga el nombre de su billetera %{name} .", + "contactsScreen_ownName_profileExists": "Este nombre de billetera ya está en uso, elija otro.", + "contactsScreen_ownName_tooShort": "Utilice al menos 2 caracteres para su nombre.", + "contactsScreen_privateContacts_bottomModal": "Los contactos privados son identificadores únicos de otras billeteras Minibits. Puedes usarlos para enviar o solicitar ecash y compartir los tuyos de forma segura con otros.", + "contactsScreen_privateContacts_domainExternal": "Utilice otro dominio", + "contactsScreen_privateContacts_domainMinibits": "Utilice el dominio minibits.cash", + "contactsScreen_privateContacts_explainerSubText": "Añade a otros usuarios de Minibits como tus contactos privados. Cada usuario recibe una dirección de billetera @minibits.cash para compartir. Puedes pagar de forma privada a tus contactos en cualquier momento, incluso si no están conectados.", + "contactsScreen_privateContacts_explainerText": "Contactos privados", + "contactsScreen_privateContacts_profileNotFound": "No se encontró el nombre de perfil %{name} . Asegúrese de que el nombre sea correcto.", + "contactsScreen_privateContacts_saveNewFormat": "Ingrese una dirección de billetera en formato nombre@dominio.xyz", + "contactsScreen_privateContacts_selectSendLnURL": "Seleccione el contacto al que desea enviar el pago Lightning.", + "contactsScreen_privateContacts_selectSendPaymentRequest": "Seleccione el contacto al que enviar su solicitud de pago.", + "contactsScreen_privateContacts_selectSendToken": "Seleccione el contacto al que desea enviar su ecash.", + "contactsScreen_privateContacts_switchName": "¿Cambiar el nombre y la imagen de tu billetera?", + "contactsScreen_privateContacts_switchNameSubText": "Consigue un nombre o foto de perfil más atractivo para tu billetera. Elige entre una selección de nombres e imágenes aleatorios o elige tu propio nombre de billetera @minibits.cash.", + "contactsScreen_publicContacts_addNpub": "Añade tu clave npub", + "contactsScreen_publicContacts_npubPasteError": "Copie su clave NPUB antes de pegar", + "contactsScreen_publicContacts_pasteDemoKey": "Pegar clave de demostración", + "contactsScreen_publicContacts_setOwnRelay": "Establece tu propio relé", + "contactsScreen_randomName_selectOneOfUsernames": "Seleccione uno de los nombres de usuario", + "contactsScreen_scan": "Escanear", + "copyAsEncodedTokens": "Copiar como tokens enviables", + "copyContactPublicKey": "Copiar la clave pública del contacto", + "copyMnemonicBackupWorkaround": "Para aplicar una copia de seguridad a sus fondos existentes, envíese todo el saldo a usted mismo. De lo contrario, solo se podrán restaurar los fondos a partir de ese momento.", + "copyProofs": "Pruebas de copia", + "decodedMissingCurrencyUnit": "Falta la unidad monetaria en el token recibido. La billetera asumirá que el monto del token está en bitcoin $ %{unit} . No continúe si no está seguro de que sea correcto.", + "deleteContact": "Eliminar contacto", + "deleteContactDesc": "Elimina este contacto de tu billetera.", + "derivingSeedStatus": "Derivar la semilla, esto lleva un tiempo...", + "developerScreen_devOptions": "Opciones de desarrollador", + "developerScreen_forceDeletePending": "Forzar eliminación pendiente", + "developerScreen_forceDeletePendingDescription": "Elimina el ecash del estado pendiente y elimina todas las transacciones pendientes.", + "developerScreen_forceMovePending": "Movimiento forzado pendiente", + "developerScreen_forceMovePendingDescription": "Mueva el efectivo pendiente nuevamente al saldo gastable.", + "developerScreen_go": "¡Vamos!", + "developerScreen_info": "Acerca de la billetera Minibits", + "developerScreen_logLevel": "Nivel de registro", + "developerScreen_reset": "Restablecimiento de fábrica", + "developerScreen_resetDescription": "Esto eliminará todos los datos locales del almacenamiento y de la base de datos local. Úselo solo durante el desarrollo o las pruebas.", + "developerScreen_resyncTransactions": "Resincronizar transacciones", + "developerScreen_resyncTransactionsDescription": "Actualizar el historial de transacciones recientes de la base de datos.", + "developerScreen_title": "Opciones de desarrollador", + "developerScreen_transactions": "Sincronizar transacciones recientes", + "developerScreen_transactionsDescription": "Hay %{count} transacciones recientes almacenadas en caché en el almacenamiento rápido de la aplicación. Al restablecerlas, se recargarán desde la base de datos de la aplicación. Úselo solo durante el desarrollo o las pruebas.", + "emptyStateComponent": { + "generic": { + "button": "Intentar otra vez", + "content": "No hay nada que mostrar en este momento.", + "heading": "No hay datos disponibles" + } + }, + "errorScreen_friendlySubtitle": "Lamentablemente, la aplicación Minibits detectó un error inesperado. Contáctanos en support@minibits.cash o informa sobre el problema en Github.", + "errorScreen_reset": "REINICIAR APLICACIÓN", + "errorScreen_title": "¡Algo salió mal!", + "exportBackup": "Exportar copia de seguridad", + "exportBackupCopyBackup": "Copia de seguridad", + "exportBackupCopyOrphanedProofs": "Copiar pruebas huérfanas", + "exportBackupEcashProofs": "Comprobantes de efectivo electrónico", + "exportBackupMints": "mints", + "exportBackupWalletTitle": "Copia de seguridad de la billetera", + "factoryResetSuccess": "Restablecimiento de fábrica completado, reinicie inmediatamente.", + "factoryResetUserConfirmDesc": "Se eliminarán todos los datos de la aplicación. ¿Seguro que quieres restablecer la configuración de fábrica?", + "importBackupInsertWalletBackup": "Insertar copia de seguridad de la billetera", + "importBackupWalletProfileNotFound": "No se encontró el perfil de billetera vinculado a la semilla proporcionada; se creará uno nuevo para usted.", + "importBackupWalletRecovery": "Recuperación de billetera", + "increaseRecoveryIndexes": "Aumentar los índices de recuperación", + "increaseRecoveryIndexesDesc": "En caso de que encuentre el error \"salidas ya firmadas\", utilice esta herramienta para resolver el problema.", + "invalidRelayUrl": "URL de retransmisión no válida.", + "lightningAddress": "Dirección de Lightning", + "lightningInvoiceSharedWaiting": "Se ha compartido una factura Lightning y está a la espera de ser pagada por el receptor.", + "lightningPayScreen_onPasteEmptyClipboard": "Primero, copia la factura Lightning, la dirección o el código de pago. Luego, pégalo.", + "lightningPayScreen_payHeading": "Pagar", + "loadingPublicInfo": "Cargando información pública", + "localBackupDisabled": "La copia de seguridad local está desactivada", + "localBackupEnabled": "La copia de seguridad local está activada", + "loglevelDebugDesc": "Detalles del registro, configúrelos solo si se realizan pruebas o si lo solicita el soporte.", + "loglevelErrorDesc": "Registra únicamente errores y fallos, sin datos privados.", + "loglevelInfoDesc": "Registra el uso anónimo, sin datos privados.", + "manageMints": "Administrar mints", + "mintInfo_contactsHeading": "Contactos", + "mintInfo_depositMint": "Depósito (Casa de moneda)", + "mintInfo_descriptionHeading": "Descripción", + "mintInfo_emptyValueParam": "No se proporcionó %{param} .", + "mintInfo_keyValueInfoCardHeading": "Más información", + "mintInfo_loadingNamePlaceholder": "Cargando nombre...", + "mintInfo_loadingUnitsPlaceholder": "Cargando unidades...", + "mintInfo_mintMeltHeading": "Límites", + "mintInfo_mintUrlHeading": "URL de casa de moneda", + "mintInfo_motd": "Aviso importante", + "mintInfo_nutsHeading": "NUT compatibles", + "mintInfo_withdrawMelt": "Retirar (Fundir)", + "mintInfoHeading": "Información de la casa de moneda", + "mintSettingsUpdated": "Configuración de casa de moneda actualizada", + "mintsScreen_addMint": "Añadir casa de moneda", + "mintsScreen_addMintMinibits": "Añadir casa de moneda Minibits", + "mintsScreen_addMintUrl": "Agregar URL de casa de moneda", + "mintsScreen_blockMint": "Bloque de recepción de esta casa de moneda", + "mintsScreen_copy": "Copiar URL de casa de moneda", + "mintsScreen_invalidUrl": "Esta no es una URL válida.", + "mintsScreen_keepAtLeastOneMint": "Es necesario conservar al menos 1 casa de moneda.", + "mintsScreen_mintAdded": "Se ha añadido la casa de moneda.", + "mintsScreen_mintBlocked": "La casa de moneda ha sido bloqueada. La billetera no recibirá ecash de esta casa de moneda.", + "mintsScreen_mintExists": "Esta casa de moneda ya existe", + "mintsScreen_mintInfo": "Página de información de la Casa de la Moneda", + "mintsScreen_mintRemoved": "La casa de moneda ha sido eliminada", + "mintsScreen_mintUnblocked": "La casa de moneda ha sido desbloqueada. Ya puedes recibir ecash de esta casa de moneda.", + "mintsScreen_mintUrl": "URL de casa de moneda", + "mintsScreen_mintUrlHint": "Proporcione la URL de una casa de moneda confiable.", + "mintsScreen_refreshMintSettings": "Actualizar la configuración de casa de moneda", + "mintsScreen_removeMint": "Quitar la casa de moneda", + "mintsScreen_rename": "Cambiar el nombre de casa de moneda", + "mintsScreen_setColor": "Cambiar el color del icono de la casa de moneda", + "mintsScreen_share": "Compartir URL de casa de moneda", + "mintsScreen_unblockMint": "Desbloquear la recepción de esta casa de moneda", + "mintsScreen_updateMintUrl": "Actualizar la URL de casa de moneda", + "missingEcashTokenToReceiveError": "Falta el token ecash para recibir.", + "missingLNURLParamsError": "Parámetros LNURL faltantes.", + "missingMintsForProofsUserMessage": "Agregue todas las mints pertenecientes a sus pruebas a la billetera y vuelva a intentarlo.", + "missingMintUnitRouteParamsError": "Falta unidad de menta en los parámetros de ruta.", + "mnemonicPhrasePlaceholder": "Frase semilla...", + "newMint": "Nueva casa de moneda", + "nextInterval": "Próximo intervalo", + "noEcashRecovered": "No se recuperó ecash", + "noSpentEcashFound": "No se encontró ecash gastado en su billetera.", + "nostr_copyPubKey": "Copiar la clave pública de Nostr", + "nostr_enterAddress": "Ingrese su dirección Nostr", + "nostr_enterAddressDesc": "Minibits utiliza la dirección Nostr (nip05) como contacto compartible para enviar y recibir ecash.", + "nostr_invalidAddressFormat": "Dirección NOSTR no válida, verifique que siga el formato nombre@dominio.com", + "nostr_lastStandDialog_cancel": "Cancelar", + "nostr_lastStandDialog_complete": "El cambio de perfil se ha completado.", + "nostr_lastStandDialog_confirm": "Aplicar cambio", + "nostr_lastStandDialog_desc": "El uso de su propia dirección Nostr deshabilitará las funciones de dirección Lightning exclusivas de la dirección minibits.cash.", + "nostr_lastStandDialog_readyDesc": "Es necesario reiniciar la billetera para aplicar este cambio.", + "nostr_lastStandDialog_readyTitle": "El cambio de perfil está listo.", + "nostr_lastStandDialog_title": "Considere antes de cambiar", + "nostr_minibitsNameKeyReuseError": "Los nombres y claves %{domain} no se pueden usar con múltiples billeteras.", + "nostr_missingRelaysError": "Relés Nostr faltantes.", + "nostr_pasteError": "Primero copie su dirección NOSTR y luego péguela.", + "nostr_profileRelayMismatchedIdentifierError": "El perfil del relé no coincide con el identificador nip05 proporcionado", + "nostr_relaysTitle": "Relés Nostr", + "nostr_removePub": "Eliminar su clave pública", + "nostr_removePubSubText": "Elimina tu clave npub y deja de cargar contactos públicos.", + "nostr_setPublicKey": "Establezca su clave pública", + "nostr_setPublicKeySubText": "Agregue o cambie su clave pública de red social NOSTR (npub).", + "nostr_setRelay": "Establecer relé", + "nostr_setRelaySubText": "Agregue o cambie su propio relé si su perfil y sus seguidores no están alojados en los relés predeterminados.", + "nostr_tip": "Dale propina a las personas que sigues", + "nostr_tipSubText": "Agrega tu clave pública de red social Nostr (npub) y da propinas o donas a tus personas y proyectos favoritos directamente desde la billetera minibits.", + "nostr_useOwnProfile_desc": "Importa tu propia dirección y claves Nostr. Tu billetera dejará de comunicarse con los servidores de direcciones Nostr y LNURL de minibits.cash, lo que desactivará las funciones de direcciones Lightning para recibir zaps y pagos. ¡Solo para usuarios de e-cash expertos!", + "nostr_useOwnProfile_title": "Utilice su propio perfil de Nostr", + "nsecEnterPrivateKey": "Ingrese su clave privada", + "nsecEnterPrivateKeyDesc": "Minibits necesita tu clave privada en formato nsec para descifrar los mensajes con pagos entrantes. Tu clave se almacenará en la bóveda de claves segura de tu dispositivo.", + "nsecMissingProfileError": "Falta perfil para actualizar", + "nsecPasteError": "Primero copie su clave nsec y luego péguela.", + "nsecPrivatePublicKeyMismatchError": "La clave privada proporcionada no coincide con su nueva clave pública de perfil.", + "numberOfBackedupProofs": "Número de pruebas almacenadas", + "nwcScreen_addConnection": "Agregar conexión", + "nwcScreen_appNamePlaceholder": "Mi solicitud de NWC", + "nwcScreen_connectionExists": "La conexión con este nombre ya existe.", + "nwcScreen_createNwcConnection": "Crear una conexión NWC", + "nwcScreen_dailyLimit": "Límite diario %{limit} %{currency}", + "nwcScreen_dailyLimitHint": "Establecer un límite diario máximo de gasto", + "nwcScreen_dailyLimitPlaceholder": "Introduzca el límite diario en sats", + "nwcScreen_limitMustBePositive": "El límite diario debe ser superior a cero", + "nwcScreen_missingNameOrLimit": "Insertar nombre o límite diario", + "nwcScreen_nameConnectionHint": "Nombra tu conexión según la aplicación con la que la usarás", + "nwcScreen_nwcDescription": "NWC te permite controlar tu billetera desde otra aplicación, como tu app favorita de Nostr. Permite el acceso solo a las apps de confianza. Tu dispositivo debe tener activadas las notificaciones push y estar conectado.", + "nwcScreen_nwcSummary": "NWC te permite controlar tu billetera desde otra aplicación, como tu aplicación Nostr favorita.", + "nwcScreen_pushNotificationWarning": "Su dispositivo no puede recibir mensajes push en segundo plano. Esto es esencial para recibir comandos NWC. Como alternativa, Minibits se suscribió a los relés Nostr para recibir los comandos. Sin embargo, esto dejará de funcionar cuando la aplicación esté en segundo plano o desactivada.", + "nwcScreen_remainingLimit": "Restante %{remaining} %{currency}", + "nwcScreen_removeConnection": "Eliminar conexión", + "nwcScreen_satCurrency": "sats", + "nwcScreen_shareDescription": "Escanea o copia esta cadena de conexión a otra aplicación para que se conecte a tu billetera. Úsala solo con aplicaciones de confianza.", + "nwcScreen_shareNwcConnection": "Compartir la conexión NWC", + "onDeviceInfo": "Información en el dispositivo", + "pasteEcashTokenDesc": "Token Ecash que deseas recibir.", + "payCommon_amountToPayLabel": "Cantidad a pagar", + "payCommon_amountZeroOrNegative": "La cantidad debe ser un número positivo.", + "payCommon_completed": "Pago completado", + "payCommon_failed": "Pago fallido", + "payCommon_insufficientFunds": "No hay fondos suficientes para enviar esta cantidad.", + "payCommon_isPending": "El pago está pendiente", + "payCommon_maximumPay": "El monto máximo a pagar es %{amount} %{currency} .", + "payCommon_minimumPay": "El monto mínimo de pago es %{amount} %{currency} .", + "payCommon_minimumWithdraw": "El monto mínimo de retiro es %{amount} %{currency} .", + "payCommon_pay": "Pagar", + "payCommon_payFrom": "Pagar desde", + "payCommon_payFromWallet": "Pagar desde la billetera", + "payCommon_payMe": "Pagame", + "payCommon_payNow": "Pagar ahora", + "payCommon_payToAddress": "Pagar a esta dirección", + "payCommon_payWithLightning": "Pagar con Lightning", + "payCommon_receive": "Recibir", + "payCommon_receiveEcash": "Recibir ecash", + "payCommon_receiveInPerson": "Recibir en persona", + "payCommon_receiveOffline": "Recibir sin conexión", + "payCommon_requestPayment": "Solicitar pago", + "payCommon_send": "Enviar", + "payCommon_withdraw": "Retirar", + "payerMemo": "Memo para el pagador", + "payWithLightningDesc": "Ingrese o pegue la dirección Lightning, la factura o el código de pago LNURL al que desea pagar.", + "pictureRetrieveFail": "No se pudieron recuperar las imágenes del servidor, inténtelo nuevamente más tarde.", + "placeholderNpub": "npub...", + "placeholderRelay": "wss://...", + "privacyScreen_logger": "Habilitar el registro", + "privacyScreen_loggerDescription": "Registra información de errores anónima para identificar y corregir errores de la billetera durante las pruebas beta. Desactívelo para mayor privacidad.", + "privacyScreen_title": "Privacidad", + "privacyScreen_torDaemon": "Utilice la red Tor", + "privacyScreen_torDaemonDescription": "Permitir conexiones con mints a través de direcciones .onion de Tor.", + "privacyScreen_torStatus": "Estado de Tor", + "privateKey": "Clave privada", + "privateNotePlaceholder": "Tu nota privada", + "profileMissingAddressError": "Dirección faltante", + "profileMissingNostrAddress": "Este perfil no tiene una dirección Nostr.", + "profileOnboarding_desc": "Tu dirección de billetera minibits.cash te permite recibir ecash cifrado a través de Nostr. Además, funciona como tu dirección Lightning, lo que te permite recibir pagos desde cualquier billetera Lightning o zaps en la red social Nostr.", + "profileOnboarding_minibitsDesc": "Comparte la dirección de tu billetera para recibir ecash cifrado a través de Nostr. Esta también funciona como tu dirección Lightning, lo que te permite recibir pagos desde cualquier billetera Lightning o zaps en la red social Nostr.", + "profileOnboarding_minibitsTitle": "La dirección de tu billetera Minibits", + "profileOnboarding_ownAddrDesc": "Estás usando tu propia dirección de Nostr para enviar y recibir ecash. Ten en cuenta que esta configuración no te permite recibir zaps de Nostr ni pagos Lightning en esta dirección.", + "profileOnboarding_ownAddrTitle": "Tu propia dirección de billetera", + "profileOnboarding_title": "Crear una dirección de billetera", + "profilePublicKeyMismatchError": "El perfil de la clave pública de los relés es diferente al de tu billetera. Restablece este perfil en la configuración de privacidad e impórtalo de nuevo con las nuevas claves.", + "profileScreen_batchReceive": "Recepción por lotes", + "profileScreen_batchReceiveDesc": "Recomendado para quienes acumulan zaps con frecuencia. Si recibes más pagos o zaps en tu dirección Lightning, agrúpalos en uno solo.", + "profileScreen_changeAvatar": "Cambiar imagen", + "profileScreen_changeAvatarSubtext": "Seleccione una de las imágenes generadas aleatoriamente.", + "profileScreen_changeWalletaddress": "Cambiar la dirección de la billetera", + "profileScreen_changeWalletaddressSubtext": "Cambia la dirección única de tu billetera. Selecciona una generada aleatoriamente o elige la tuya.", + "profileToRecoverDesc": "Esta es la dirección de la billetera vinculada a tu semilla. Si continúas, tu perfil de billetera se restablecerá a la semilla y dirección mencionadas anteriormente.", + "pushNotifications": "Notificaciones push", + "qr_fail": "No se pudo mostrar el código QR, use la opción para copiar o enviar el token a la dirección de billetera del beneficiario.", + "qrCodeAnimateButton": "Animar", + "qrCodeNewFormatButton": "Nuevo", + "qrCodeOldFormatButton": "Viejo", + "qrCodeStaticButton": "Estático", + "readyToDonateMore": "¿Listo para donar más?", + "receiverMemo": "Memo para el receptor", + "receiveScreen_lockedToUnknownPK": "No se puede desbloquear", + "receiveScreen_lockedToWalletPK": "Bloqueado con tus llaves", + "receiveScreen_memoFromSender": "Nota del remitente", + "receiveScreen_newMintsAdded_one": "Se ha añadido %{count} casa de moneda a tu billetera.", + "receiveScreen_newMintsAdded_other": "Se han añadido %{count} mints a tu billetera", + "receiveScreen_pasteoReceiveDescription": "Pegue el token ecash para recibirlo en su billetera.", + "receiveScreen_pasteToReceive": "Pasta", + "receiveScreen_received": "Cantidad recibida", + "receiveScreen_scanToReceive": "Escanee o pegue para recibir", + "receiveScreen_scanToReceiveDescription": "Escanee o pegue el token ecash o el enlace de retiro LNURL para recibirlo en su billetera.", + "receiveScreen_scanWithdrawalLink": "Enlace de retiro de escaneo", + "receiveScreen_sharePaymentRequest": "Enviar solicitud de pago", + "receiveScreen_sharePaymentRequestDescription": "Envía una solicitud de pago a uno de tus contactos, para que el pagador pueda abonarte el importe exacto.", + "receiveScreen_showOrShareInvoice": "Compartir factura de rayos", + "receiveScreen_showOrShareInvoiceDescription": "Presentar o compartir factura relámpago por el monto que desees recibir.", + "receiveScreen_status": "Estado", + "receiveScreen_title": "Recibir", + "receiveScreen_toReceive": "Cantidad a recibir", + "recoverToWallet": "Recuperar a la billetera", + "recovery_addressLinkedToSeed": "Esta es la dirección de billetera vinculada a la semilla proporcionada.", + "recovery_completeCTA": "Recuperación completa", + "recovery_completed": "Recuperación completada", + "recovery_completing": "Completando la recuperación...", + "recovery_doNotLoseEcashDesc": "Tu frase semilla actual de billetera no se modificará. ¡Guárdala en un lugar seguro!", + "recovery_doNotLoseEcashTitle": "¡No pierdas tu dinero!", + "recovery_failed": "Recuperación fallida", + "recovery_findAddressCTA": "Encuentra la dirección de la billetera", + "recovery_foundAddrParam": "Se encontró %{addr}", + "recovery_foundPendingProofsAmount": "Se encontraron %{amount} pruebas pendientes...", + "recovery_foundProofsAmount": "Se encontraron %{amount} pruebas...", + "recovery_intervalParam": "Intervalo de recuperación %{startIndex} - %{endIndex} · ", + "recovery_keysetID": "ID del conjunto de claves %{id} ( %{unit} )", + "recovery_missingMnemonicSeedProfileError": "Falta frase semilla o semilla o perfil a recuperar.", + "recovery_mnemonicCollision": "La frase semilla existe", + "recovery_mnemonicCollisionDesc": "Tu billetera ya tiene otra frase semilla en su almacenamiento seguro. El proceso de recuperación solo funciona con billeteras recién instaladas para evitar la pérdida de tus fondos.", + "recovery_noKeysetSelected": "Seleccione el conjunto de claves.", + "recovery_noMintSelected": "Por favor seleccione la casa de moneda.", + "recovery_noWalletForSeedError": "No se pudo encontrar la dirección de billetera vinculada a su semilla en el servidor.", + "recovery_ownKeysImportAgain": "Usaste la dirección de billetera %{addr} con tus propias claves, impórtala nuevamente.", + "recovery_recoverAddress": "Recuperar dirección", + "recovery_recoveredResult": "%{formattedCurrency} %{code} se recuperaron en su billetera.", + "recovery_recoveringAddress": "Recuperando dirección de billetera...", + "recovery_restoringFromParam": "Restaurando desde %{hostname} ...", + "recovery_resultErrors": "La recuperación terminó con errores.", + "recovery_resultExpired": "No se ha encontrado nada en este intervalo de recuperación.", + "recovery_resultSpent": "La buena noticia es que se encontró el Ecash ya gastado. Continúe con el siguiente intervalo de recuperación.", + "recovery_seedFromCurrentDeviceError": "No se pueden utilizar semillas de este dispositivo.", + "recovery_selectAnotherKeyset": " · Seleccione otro", + "recovery_selectKeyset": "Seleccione el conjunto de claves que se utilizará para la recuperación", + "recovery_selectMintFrom": "Seleccione casa de moneda para recuperarse.", + "recovery_setManually": "Configurar manualmente", + "recovery_spentProofsAmount": "%{amount} pruebas ya se gastaron...", + "recovery_startIndexDesc": "Úselo para aumentar el índice inicial del intervalo de recuperación, por ejemplo, en caso de recuperación repetida. Debe saber en qué índice completó su recuperación anterior o perderá tiempo para recuperarse.", + "recovery_starting": "Comenzando la recuperación...", + "recovery_success": "¡Éxito de recuperación!", + "recoveryConfirmButton": "Confirmar", + "recoveryEnterMeltQuote": "Introduzca la cotización de fusión", + "recoveryEnterMintQuote": "Ingrese la cotización de casa de moneda", + "recoveryExperimentalTools": "Herramientas experimentales", + "recoveryFromMints": "Recuperación de las mints", + "recoveryFromMintsDesc": "Identifique las mints para recuperar su ecash y agréguelas a la lista.", + "recoveryIncreaseButton": "Aumentar", + "recoveryIndexesIncSuccess": "Los índices de recuperación aumentaron en %{indCount}", + "recoveryInsertMnemonic": "Insertar frase semilla", + "recoveryInsertMnemonicDesc": "Pega o reescribe una frase de 12 palabras para recuperar el saldo de tu cuenta de eCash y la dirección de tu billetera en este dispositivo. Separa las palabras con espacios en blanco.", + "recoveryInsertMnemonicDescAddrOnly": "Pega o reescribe una frase de 12 palabras para recuperar la dirección de tu billetera en este dispositivo. Separa las palabras con espacios en blanco.", + "recoveryInsertMnemonicDescImportBackup": "Pega o reescribe una frase de 12 palabras para recuperar la dirección de tu billetera en este dispositivo. Separa las palabras con espacios en blanco.", + "recoveryInvalidMeltQuote": "Cotización de fusión no válida", + "recoveryInvalidMintQuote": "Cotización de casa de moneda no válida", + "recoveryInvalidMnemonicError": "Frase inicial no válida. Proporcione una secuencia de 12 palabras separadas por espacios.", + "recoveryMeltQuoteDesc": "Intente nuevamente recibir el ecash no gastado de un pago Lightning completado.", + "recoveryMeltQuoteTitle": "Recuperar el cambio de cotización de fusión", + "recoveryMeltSuccessMessage": "Se recuperó exitosamente %{amount} sats de la cotización de fusión proporcionada.", + "recoveryMintEcashButton": "Crear ecash", + "recoveryMintQuoteDesc": "Intente nuevamente generar ecash a partir de una cotización de casa de moneda ya pagada.", + "recoveryMintQuoteTitle": "Recuperar cotización de casa de moneda", + "recoveryMintSuccessMessage": "Se acuñaron exitosamente %{amount} sats a partir de la cotización de acuñación proporcionada.", + "recoveryOpenSettingsButton": "Abrir configuración", + "recoveryOptionsFromBackup": "Recuperarse de la copia de seguridad", + "recoveryOptionsFromBackupDescription": "Importa la copia de seguridad exportada desde otra billetera Minibits. Una opción sencilla si cambias de dispositivo.", + "recoveryOptionsFromSeed": "Recuperarse de la semilla", + "recoveryOptionsFromSeedDescription": "Usa una frase inicial de 12 palabras para recrear tu dinero electrónico perdido con la ayuda de mentas. Úsala en caso de pérdida del dispositivo.", + "recoveryOptionsTitle": "Opciones de recuperación", + "recoveryPermissionNeededDesc": "Minibits necesita un permiso para mostrar notificaciones mientras se ejecuta esta tarea.", + "recoveryPermissionNeededTitle": "Se necesita permiso", + "recoveryRecoverChangeButton": "Recuperar el cambio", + "recoveryRemoveButton": "Eliminar", + "recoveryScreen_confirm": "Confirmar", + "recoveryScreen_experimentalTools": "Herramientas experimentales", + "recoveryScreen_increase": "Aumentar", + "recoveryScreen_recoverMeltQuoteChange": "Recuperar el cambio de cotización de fusión", + "recoveryScreen_recoverMeltQuoteChangeDesc": "Intente nuevamente recibir el ecash no gastado de un pago Lightning completado.", + "recoveryScreen_recoverMintQuote": "Recuperar cotización de casa de moneda", + "recoveryScreen_recoverMintQuoteDesc": "Intente nuevamente generar ecash a partir de una cotización de casa de moneda ya pagada.", + "recoveryScreen_remove": "Eliminar", + "recoveryScreen_selectMintToRecoverFrom": "Seleccione menta para recuperarse", + "recoveryScreen_start": "Comenzar", + "recoverySelectMintTitle": "Seleccione menta para recuperarse", + "recoveryStartButton": "Comenzar", + "recoverySuccessTitle": "¡Éxito!", + "relayExists": "El relé ya existe", + "relays": "Relés", + "relaysSetYourRelay": "Establece tu propio relé", + "relayurlPasteError": "Copie su clave URL de retransmisión antes de pegarla", + "removeRelay": "Quitar relé", + "removingMintLostBalanceWarning": "Tu billetera tiene saldo distinto de cero con esta moneda. Si la eliminas, perderás tu ecash.", + "resetAborted": "Reinicio abortado, no hay transacciones en la base de datos local.", + "resetCompletedDetail": "Restablecimiento completado. Se cargaron %{transCount} transacciones recientes desde la base de datos.", + "resetOwnProfile": "Restablecer mi propio perfil", + "resetOwnProfileDesc": "Deje de usar su propia dirección NOSTR y vuelva a crear el perfil de billetera Minibits.", + "saveContactPrivate": "Guardar como contacto privado", + "saveContactPrivateDesc": "Guarda %{nip05} en tus contactos privados para que puedas pagar más rápido", + "scanReceiveExtractFail": "No se pudo extraer el token ecash ni el enlace de retiro de LNURL para recibirlo.", + "scanScreen_onPasteEmptyClipboard": "Primero, copia el token de ecash, la factura, el enlace LNURL o la dirección Lightning. Luego, pégalo.", + "securityScreen_biometricAuth": "Autenticación biométrica", + "securityScreen_biometricAuthDescription": "Requerir autenticación biométrica para que Minibits comience.", + "securityScreen_biometry": "Autenticación biométrica", + "securityScreen_biometryAvailable": "Ahora se requiere autenticación biométrica para iniciar Minibits.", + "securityScreen_biometryNone": "No ha configurado la autenticación biométrica o su dispositivo no la admite.", + "securityScreenTitle": "Seguridad", + "seedRecoveryMints": "Mentas", + "seedRecoveryScreenTitle": "Recuperación de billetera", + "seedRecoveryStep2": "2", + "sendCreateToken": "Crear token", + "sendLock": "Cerrar", + "sendLockEcash": "Bloquear efectivo", + "sendLockEcashDesc": "Bloquea el token de ecash con uno de tus contactos o con una clave pública. Solo el receptor podrá desbloquearlo.", + "sendLocked": "Bloqueado", + "sendLockFor": "Bloquear para", + "sendOfflineExactDenoms": "Solo puedes enviar denominaciones exactas de efectivo mientras estás desconectado.", + "sendScreen_memo": "Memo para el destinatario", + "sendScreen_pasteToSend": "Pasta", + "sendScreen_pasteToSendDescription": "Pegue la factura de Lightning desde el portapapeles para pagarla desde su billetera.", + "sendScreen_scanToPay": "Escanear para pagar", + "sendScreen_scanToPayDescription": "Escanee la factura Lightning, el código de pago LNURL o la dirección Lightning para pagar.", + "sendScreen_sendToContact": "Enviar a contacto", + "sendScreen_sendToContactDescription": "Envía tu ecash a uno de tus contactos almacenados en tu lista de contactos.", + "sendScreen_showOrShareToken": "Compartir ecash", + "sendScreen_showOrShareTokenDescription": "Presenta o comparte un token ecash por el monto que desees enviar.", + "sendScreen_title": "Enviar", + "sendSelectEcashToSend": "Seleccione el ecash que desea enviar", + "sendToContact": "Enviar a contacto", + "setStartIndex": "Establecer índice de inicio", + "settingsScreen_backup": "Respaldo", + "settingsScreen_backupRecovery": "Copia de seguridad y recuperación", + "settingsScreen_currencyNone": "Ninguno", + "settingsScreen_devOptions": "Opciones de desarrollador", + "settingsScreen_doNotLoadRates": "No cargar tipos de cambio", + "settingsScreen_exchangeCurrency": "Conversión de saldo", + "settingsScreen_go": "¡Vamos!", + "settingsScreen_mintsCount": { + "one": "%{count} mint", + "other": "%{count} mentas" + }, + "settingsScreen_nwcSubtext": { + "one": "%{count} aplicación permitida", + "other": "%{count} aplicaciones permitidas" + }, + "settingsScreen_nwcTitle": "Conexión de billetera Nostr", + "settingsScreen_preferredUnit": "Unidad preferida", + "settingsScreen_privacy": "Privacidad", + "settingsScreen_recovery": "Recuperación", + "settingsScreen_relaysCount": { + "one": "Relé %{count}", + "other": "%{count} relés" + }, + "settingsScreen_restartTheme": "Reinicie la billetera para aplicar el nuevo tema.", + "settingsScreen_security": "Seguridad", + "settingsScreen_theme": "Tema", + "settingsScreen_title": "Ajustes", + "settingsScreen_update": "Administrador de actualizaciones", + "settingsScreen_updateAvailable": "1 actualización", + "share_cancelled": "Compartir cancelado", + "share_contactAddress": "Compartir dirección de contacto", + "shareWalletAddress": "Compartir dirección de billetera", + "shareWalletNpub": "Clave pública de billetera compartida (NPUB)", + "shareWalletPubkey": "Compartir clave pública de billetera (HEX)", + "showErrors": "Mostrar errores", + "showOnboarding": "Mostrar la incorporación nuevamente", + "showOnboardingDesc": "Revise las pantallas de incorporación nuevamente la próxima vez que reinicie Minibits.", + "startRecovery": "Iniciar recuperación", + "syncCompleted": "Sincronización completada.", + "syncOwnProfile": "Sincronizar su propio perfil", + "syncOwnProfileDesc": "Sincroniza tu nombre y foto de perfil con información actualizada de los relés Nostr.", + "tabNavigator_contactsLabel": "Contactos", + "tabNavigator_settingsLabel": "Ajustes", + "tabNavigator_transactionsLabel": "Actas", + "tabNavigator_walletLabel": "Billetera", + "tokenReceiveScreen_onPasteEmptyClipboard": "Primero copie el token ecash y luego péguelo.", + "tokenReceiveScreen_scan": "Escanear", + "tokenReceiveScreen_topupWithLightning": "Recarga con Lightning", + "topup_failed": "Recarga fallida", + "topup_invoiceCreatedDescParam": "El saldo de casa de moneda seleccionado para recargar es %{mintUrl}", + "topup_invoiceCreatedParam": "Factura para %{amount} %{code} creada", + "topup_mint": "Recarga de menta", + "topup_missingMintAddFirst": "Por favor, añade la menta primero.", + "topup_missingMintAddFirstDesc": "No hay ninguna moneda conectada a su billetera que sea elegible para recibir ecash.", + "topup_nostrDMreceived": "nostr: %{npub} te envió una factura Lightning por %{amount} %{currency} desde la billetera Minibits!", + "topup_relayMissingSentEvent": "Relay no pudo confirmar que el mensaje haya sido publicado.", + "topup_sendRequest": "Enviar solicitud", + "topup_sendToContact": "Enviar a contacto", + "topup_sendToNip": "Enviar a %{sendTonip05}", + "topup_to": "Recarga a", + "topup_withdraw": "Retirar", + "topup_withdrawalAvailable": "El retiro está disponible", + "topup_withdrawAvailableDesc": "Hasta %{amount} %{code} están disponibles para retirar", + "topup_withLightning": "Recarga con Lightning", + "topupScreen_done": "Hecho", + "topupScreen_invoiceToPay": "Factura a pagar", + "tranDetailScreen_addTags": "Agregar etiquetas", + "tranDetailScreen_addYourNote": "Añade tu nota", + "tranDetailScreen_amount": "Cantidad", + "tranDetailScreen_auditTrail": "Registro de auditoría", + "tranDetailScreen_auditTrailDesc": "Registro detallado de su transacción", + "tranDetailScreen_backedUpEcash": "Copia de seguridad de efectivo", + "tranDetailScreen_balanceAfter": "Saldo después de esta transacción", + "tranDetailScreen_claim": "Afirmar", + "tranDetailScreen_createdAt": "Creado en", + "tranDetailScreen_eventUrl": "Nota zapeada", + "tranDetailScreen_expiresAt": "Caduca a las", + "tranDetailScreen_fee": "Tarifa", + "tranDetailScreen_id": "ID de transacción", + "tranDetailScreen_inputs": "Entradas", + "tranDetailScreen_invoice": "Factura relámpago a pagar", + "tranDetailScreen_invoiceExpired": "Factura vencida", + "tranDetailScreen_invoiceNotPaid": "Factura no pagada", + "tranDetailScreen_invoiceToPay": "Factura a pagar", + "tranDetailScreen_isOffline": "Canjear en línea", + "tranDetailScreen_lightningFee": "Tarifa de la red Lightning", + "tranDetailScreen_memoFromInvoice": "Nota de factura", + "tranDetailScreen_memoFromSender": "Nota del remitente", + "tranDetailScreen_modalSuccess": "¡Éxito!", + "tranDetailScreen_outputs": "Salidas", + "tranDetailScreen_paymentId": "ID de pago", + "tranDetailScreen_pendingToken": "Token pendiente", + "tranDetailScreen_proof": "Comprobante de pago", + "tranDetailScreen_receiveOfflineComplete": "Canjear en la billetera", + "tranDetailScreen_retryToComplete": "Intente completar nuevamente", + "tranDetailScreen_retryToReceive": "Intente recibir nuevamente", + "tranDetailScreen_revert": "Revertir", + "tranDetailScreen_sentFrom": "Enviado desde", + "tranDetailScreen_sentTo": "Enviado a", + "tranDetailScreen_status": "Estado", + "tranDetailScreen_successRetrieveEcashAfterRetry": "El eCash se recibió correctamente tras reintentarlo. Se creó una nueva transacción.", + "tranDetailScreen_tokenTracking": "Seguimiento de tokens", + "tranDetailScreen_tokenTrackingDesc": "Tokens de ecash registrados para fines de depuración", + "tranDetailScreen_topupError": "Error de recarga", + "tranDetailScreen_topupTo": "Recarga a", + "tranDetailScreen_trasferredTo": "Pagado a", + "tranDetailScreen_type": "Tipo", + "tranHistory_deleteErrored": "Eliminar transacciones con errores", + "tranHistory_deleteErroredDesc": "Esto eliminará %{count} transacciones con errores", + "tranHistory_deleteExpired": "Eliminar caducado", + "tranHistory_deleteExpiredDesc": "Esto eliminará %{count} transacciones vencidas", + "tranHistory_deleteReverted": "Eliminación revertida", + "tranHistory_deleteRevertedDesc": "Esto eliminará %{count} transacciones revertidas", + "tranHistory_listIsComplete": "La lista está completa", + "tranHistory_noTransToShow": "No hay transacciones para mostrar.", + "tranHistory_pendingParam": "%{param} transacciones pendientes", + "tranHistory_showingPaginationPending": "Mostrando %{amount} de %{total} pendientes", + "tranHistory_showingPaginationTotal": "Mostrando %{amount} de %{total} total", + "tranHistory_viewMore": "Ver más", + "tranHistoryScreen_title": "Historia", + "transactionCommon_fee": "Tarifa", + "transactionCommon_feePaid": "Tarifa pagada", + "transactionCommon_from": "De %{sender}", + "transactionCommon_paidFrom": "Pagado desde", + "transactionCommon_paidTo": "Pagado a %{receiver}", + "transactionCommon_payNow": "Pagar ahora", + "transactionCommon_payTo": "Pagar a %{receiver}", + "transactionCommon_receivedFrom": "Recibido de %{sender}", + "transactionCommon_receivedTo": "Recibido a", + "transactionCommon_receiveFailed": "Recepción fallida", + "transactionCommon_redeemOnline": "Canjear en línea", + "transactionCommon_reverted": "Transacción revertida", + "transactionCommon_sentTo": "Enviado a %{receiver}", + "transactionCommon_status_blocked": "Obstruido", + "transactionCommon_status_completed": "Terminado", + "transactionCommon_status_completedFee": "Completado %{fee}", + "transactionCommon_status_draft": "Borrador", + "transactionCommon_status_error": "Error", + "transactionCommon_status_expired": "Venció", + "transactionCommon_status_pending": "Pendiente", + "transactionCommon_status_prepared": "Preparado", + "transactionCommon_status_recovered": "Recuperado", + "transactionCommon_status_reverted": "Revertido", + "transactionCommon_status_spent": "Gastado", + "transactionCommon_status_unspent": "No gastado", + "transactionCommon_tapToRedeem": "Toca para canjear", + "transactionCommon_unknown": "Transacción desconocida", + "transactionCommon_youPaid": "Tú pagaste", + "transactionCommon_youReceived": "Usted recibió", + "transactionCommon_youSent": "Tú enviaste", + "transferScreen_donationSuccessMessage": "La donación para %{donationForName} se ha realizado correctamente y la dirección de tu billetera se ha actualizado. ¡Gracias!", + "transferScreen_insufficientFunds": "No hay suficiente saldo en %{currency} para pagar el importe de la factura y las tarifas previstas: %{amount} %{currency}", + "transferScreen_LUD18unsupported": "Minibits aún no admite la introducción de datos de identidad del pagador (LUD18).", + "transferScreen_noMintWithBalance": "No existe ninguna casa de moneda con saldo %{unit} desde el cual se pueda realizar el pago.", + "transferScreen_requestInvoice": "Continuar", + "transferScreen_selectMintFrom": "Seleccione el saldo de menta desde el que desea transferir", + "unspentOnlyRecoverable": "Sólo se pueden recuperar las pruebas no utilizadas.", + "updateModal_desc": "Las actualizaciones ofrecen nuevas funcionalidades y correcciones de errores importantes. Consulta los detalles en el Administrador de actualizaciones.", + "updateModal_title": "Ya está disponible la nueva versión de Minibits", + "updateScreen_apkOnGithub": "APK en Github", + "updateScreen_couldNotRetrieveUpdate": "No se pudo recuperar la información de actualización", + "updateScreen_defaultUpdateDesc": "Mejoras de UX y rendimiento", + "updateScreen_downloading": "Descargando actualización...", + "updateScreen_gotoPlayStore": "Visita Play Store", + "updateScreen_installing": "Instalando actualización...", + "updateScreen_nativeUpdateAvailableDesc": "Hay una nueva versión nativa de Minibits Wallet en Google Play Store.", + "updateScreen_updateAvailable": "La actualización está disponible", + "updateScreen_updateAvailableDesc": "Hay una nueva actualización inalámbrica de Minibits Wallet lista para descargar e instalar.", + "updateScreen_updateInProgress": "La actualización está en progreso...", + "updateScreen_updateManagerTitle": "Administrador de actualizaciones", + "updateScreen_updateNew": "¿Qué hay de nuevo?", + "updateScreen_updateNotAvailable": "Nada que actualizar", + "updateScreen_updateNotAvailableDesc": "Bueno, estás ejecutando la última versión de la aplicación.", + "updateScreen_updateNow": "Actualizar y reiniciar", + "updateScreen_updateSize": "Tamaño de descarga", + "userErrorMissingLightningData": "Falta factura de Lightning, código de pago o dirección.", + "wallerScreen_mintButton": "Menta", + "walletAddressRecovery": "Recuperación de la dirección de la billetera", + "walletAddressRecoveryDesc": "Usa tu frase inicial de otro dispositivo para obtener la dirección de tu billetera original en este. Esto no recuperará saldos.", + "walletNameScreen_ownNameTab": "Nombre propio", + "walletNameScreen_randomNameTab": "Nombre aleatorio", + "walletScreen_addFirstMint": "Añade tu primera menta", + "walletScreen_andOtherMints": "y %{count} otros", + "walletScreen_andOtherMints_plural": "y %{count} otros", + "walletScreen_feeBadge_final": "+ tarifa final %{fee} %{code}", + "walletScreen_feeBadge_upto": "+ tarifa hasta %{fee} %{code}", + "walletScreen_mintExists": "Esta menta ya existe", + "walletScreen_pay": "Pagar", + "walletScreen_paymentSentSuccess": "La solicitud de pago ha sido enviada exitosamente.", + "walletScreen_payWithLightning": "Pagar con Lightning", + "walletScreen_payWithLightningDesc": "Pagar factura o a una dirección Lightning", + "walletScreen_receiveEcash": "Recibir Ecash", + "walletScreen_receiveEcashDesc": "Pegar o escanear el token de ecash", + "walletScreen_sendEcash": "Enviar dinero electrónico", + "walletScreen_sendEcashDesc": "Comparte ecash o envíaselo a uno de tus contactos", + "walletScreen_spentToday": "Pasé hoy", + "walletScreen_startByFunding": "Comience por financiar su billetera", + "walletScreen_topup": "Recarga", + "walletScreen_topupWithLightning": "Recarga con Lightning", + "walletScreen_topupWithLightningDesc": "Crea una factura Lightning para recargar tu saldo", + "warning": "Advertencia", + "welcomeScreen_creatingKeys": "Creando claves de billetera...", + "welcomeScreen_creatingProfile": "Creando perfil de billetera...", + "welcomeScreen_generatingWalletSeedStatusMessage": "Creando la semilla de la billetera, esto lleva un tiempo...", + "welcomeScreen_lastPageConfirmButton": "Entendido, llévame a la billetera.", + "welcomeScreen_lastPageRecoverLostWalletButton": "Recuperar billetera perdida", + "welcomeScreen_offlineWarning": "Asegúrese de estar en línea para configurar la nueva billetera.", + "welcomeScreen_page1_bullet1": "Minibits sigue el protocolo Cashu, donde las monedas respaldan el efectivo con Bitcoin.", + "welcomeScreen_page1_bullet2": "Ecash se emite o se convierte nuevamente a Bitcoin instantáneamente a través de pagos Lightning.", + "welcomeScreen_page1_bullet3": "Los tokens de Ecash se almacenan en el dispositivo; las mints no mantienen registros ni saldos de billetera.", + "welcomeScreen_page1_final": "Sin Watson, no hay blockchain.", + "welcomeScreen_page1_heading": "Bienvenido", + "welcomeScreen_page1_intro": "Minibits es una billetera de ecash y Lightning centrada en la facilidad de uso y la seguridad. Ecash es un token firmado digitalmente emitido por custodios conocidos como mints.", + "welcomeScreen_page2_bullet1": "Minibits proporciona una dirección Lightning gratuita que también permite transferencias de dinero en efectivo instantáneas a través de Nostr.", + "welcomeScreen_page2_bullet2": "Soporte de primera clase para enviar y recibir zaps en Nostr, incluido Nostr Wallet Connect.", + "welcomeScreen_page2_bullet3": "Notificaciones push encriptadas en tiempo real y soporte para efectivo emitido en monedas distintas a Bitcoin.", + "welcomeScreen_page2_final": "Minibits es un software gratuito de código abierto. Encuéntranos en GitHub para consultar nuestra hoja de ruta y nuestras contribuciones.", + "welcomeScreen_page2_heading": "¿Por qué Minibits?", + "welcomeScreen_page2_intro": "Minibits tiene como objetivo explorar cómo el ecash puede ayudar a las personas a usar Bitcoin al ofrecer una incorporación sin fricciones, tarifas bajas, facilidad de uso y una sólida privacidad.", + "welcomeScreen_page3_bullet1": "Las mints son de custodia por diseño. Administre las suyas o úselas solo para investigación y pruebas.", + "welcomeScreen_page3_bullet2": "El ecash se almacena en tu dispositivo. Si lo pierdes, se perderá a menos que hagas una copia de seguridad de tu frase inicial.", + "welcomeScreen_page3_bullet3": "Minibits ofrece su propia menta para realizar pruebas con pequeñas cantidades. Opera con el máximo esfuerzo, sin garantías.", + "welcomeScreen_page3_final": "¡Ahora, movamos algo de dinero!", + "welcomeScreen_page3_go": "¡Vamos!", + "welcomeScreen_page3_heading": "No lo olvides", + "welcomeScreen_page3_intro": "Tanto el protocolo Cashu como la billetera Minibits son experimentales. Al usarlos, acepta riesgos conocidos y desconocidos." +} \ No newline at end of file