Files
TREK/client/src/i18n/translations/es.ts
T
Maurice 189b257254 Merge remote-tracking branch 'origin/dev' into dev-maurice
# Conflicts:
#	client/src/components/Todo/TodoListPanel.tsx
#	server/src/db/migrations.ts
2026-04-17 23:44:53 +02:00

2270 lines
123 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const es: Record<string, string> = {
// Common
'common.save': 'Guardar',
'common.showMore': 'Ver más',
'common.showLess': 'Ver menos',
'common.cancel': 'Cancelar',
'common.clear': 'Borrar',
'common.delete': 'Eliminar',
'common.edit': 'Editar',
'common.add': 'Añadir',
'common.loading': 'Cargando...',
'common.import': 'Importar',
'common.error': 'Error',
'common.unknownError': 'Error desconocido',
'common.tooManyAttempts': 'Demasiados intentos. Inténtelo de nuevo más tarde.',
'common.back': 'Atrás',
'common.all': 'Todo',
'common.close': 'Cerrar',
'common.open': 'Abrir',
'common.upload': 'Subir',
'common.search': 'Buscar',
'common.confirm': 'Confirmar',
'common.ok': 'Aceptar',
'common.yes': 'Sí',
'common.no': 'No',
'common.or': 'o',
'common.none': 'Ninguno',
'common.date': 'Fecha',
'common.rename': 'Renombrar',
'common.name': 'Nombre',
'common.email': 'Correo',
'common.password': 'Contraseña',
'common.saving': 'Guardando...',
'common.saved': 'Guardado',
'common.expand': 'Expandir',
'common.collapse': 'Contraer',
'trips.reminder': 'Recordatorio',
'trips.reminderNone': 'Ninguno',
'trips.reminderDay': 'día',
'trips.reminderDays': 'días',
'trips.reminderCustom': 'Personalizado',
'trips.memberRemoved': '{username} eliminado',
'trips.memberRemoveError': 'Error al eliminar',
'trips.memberAdded': '{username} añadido',
'trips.memberAddError': 'Error al añadir',
'trips.reminderDaysBefore': 'días antes de la salida',
'trips.reminderDisabledHint': 'Los recordatorios de viaje están desactivados. Actívalos en Admin > Configuración > Notificaciones.',
'common.update': 'Actualizar',
'common.change': 'Cambiar',
'common.uploading': 'Subiendo…',
'common.backToPlanning': 'Volver a la planificación',
'common.reset': 'Restablecer',
// Navbar
'nav.trip': 'Viaje',
'nav.share': 'Compartir',
'nav.settings': 'Ajustes',
'nav.admin': 'Administración',
'nav.logout': 'Cerrar sesión',
'nav.lightMode': 'Modo claro',
'nav.darkMode': 'Modo oscuro',
'nav.autoMode': 'Modo automático',
'nav.administrator': 'Administrador',
'nav.myTrips': 'Mis viajes',
// Dashboard
'dashboard.title': 'Mis viajes',
'dashboard.subtitle.loading': 'Cargando viajes...',
'dashboard.subtitle.trips': '{count} viajes ({archived} archivados)',
'dashboard.subtitle.empty': 'Empieza tu primer viaje',
'dashboard.subtitle.activeOne': '{count} viaje activo',
'dashboard.subtitle.activeMany': '{count} viajes activos',
'dashboard.subtitle.archivedSuffix': ' · {count} archivados',
'dashboard.newTrip': 'Nuevo viaje',
'dashboard.gridView': 'Vista de cuadrícula',
'dashboard.listView': 'Vista de lista',
'dashboard.currency': 'Divisa',
'dashboard.timezone': 'Zonas horarias',
'dashboard.localTime': 'Hora local',
'dashboard.timezoneCustomTitle': 'Zona horaria personalizada',
'dashboard.timezoneCustomLabelPlaceholder': 'Nombre (opcional)',
'dashboard.timezoneCustomTzPlaceholder': 'ej. America/New_York',
'dashboard.timezoneCustomAdd': 'Añadir',
'dashboard.timezoneCustomErrorEmpty': 'Introduce una zona horaria',
'dashboard.timezoneCustomErrorInvalid': 'Zona horaria no válida. Usa formato como Europe/Madrid',
'dashboard.timezoneCustomErrorDuplicate': 'Ya añadida',
'dashboard.emptyTitle': 'Aún no hay viajes',
'dashboard.emptyText': 'Crea tu primer viaje y empieza a planificar',
'dashboard.emptyButton': 'Crear primer viaje',
'dashboard.nextTrip': 'Próximo viaje',
'dashboard.shared': 'Compartido',
'dashboard.sharedBy': 'Compartido por {name}',
'dashboard.days': 'Días',
'dashboard.places': 'Lugares',
'dashboard.members': 'Compañeros de viaje',
'dashboard.archive': 'Archivar',
'dashboard.copyTrip': 'Copiar',
'dashboard.copySuffix': 'copia',
'dashboard.restore': 'Restaurar',
'dashboard.archived': 'Archivado',
'dashboard.status.ongoing': 'En curso',
'dashboard.status.today': 'Hoy',
'dashboard.status.tomorrow': 'Mañana',
'dashboard.status.past': 'Pasado',
'dashboard.status.daysLeft': 'Quedan {count} días',
'dashboard.toast.loadError': 'No se pudieron cargar los viajes',
'dashboard.toast.created': '¡Viaje creado correctamente!',
'dashboard.toast.createError': 'No se pudo crear el viaje',
'dashboard.toast.updated': '¡Viaje actualizado!',
'dashboard.toast.updateError': 'No se pudo actualizar el viaje',
'dashboard.toast.deleted': 'Viaje eliminado',
'dashboard.toast.deleteError': 'No se pudo eliminar el viaje',
'dashboard.toast.archived': 'Viaje archivado',
'dashboard.toast.archiveError': 'No se pudo archivar el viaje',
'dashboard.toast.restored': 'Viaje restaurado',
'dashboard.toast.restoreError': 'No se pudo restaurar el viaje',
'dashboard.toast.copied': '¡Viaje copiado!',
'dashboard.toast.copyError': 'No se pudo copiar el viaje',
'dashboard.confirm.delete': '¿Eliminar el viaje "{title}"? Todos los lugares y planes se borrarán permanentemente.',
'dashboard.editTrip': 'Editar viaje',
'dashboard.createTrip': 'Crear nuevo viaje',
'dashboard.tripTitle': 'Título',
'dashboard.tripTitlePlaceholder': 'p. ej. Verano en Japón',
'dashboard.tripDescription': 'Descripción',
'dashboard.tripDescriptionPlaceholder': '¿De qué trata este viaje?',
'dashboard.startDate': 'Fecha de inicio',
'dashboard.endDate': 'Fecha de fin',
'dashboard.dayCount': 'Número de días',
'dashboard.dayCountHint': 'Cuántos días planificar cuando no se han establecido fechas de viaje.',
'dashboard.noDateHint': 'Sin fecha definida: se crearán 7 días por defecto. Puedes cambiarlo cuando quieras.',
'dashboard.coverImage': 'Imagen de portada',
'dashboard.addCoverImage': 'Añadir imagen de portada',
'dashboard.addMembers': 'Compañeros de viaje',
'dashboard.addMember': 'Añadir miembro',
'dashboard.coverSaved': 'Imagen de portada guardada',
'dashboard.coverUploadError': 'Error al subir la imagen',
'dashboard.coverRemoveError': 'Error al eliminar la imagen',
'dashboard.titleRequired': 'El título es obligatorio',
'dashboard.endDateError': 'La fecha de fin debe ser posterior a la de inicio',
// Settings
'settings.title': 'Ajustes',
'settings.subtitle': 'Configura tus ajustes personales',
'settings.tabs.display': 'Pantalla',
'settings.tabs.map': 'Mapa',
'settings.tabs.notifications': 'Notificaciones',
'settings.tabs.integrations': 'Integraciones',
'settings.tabs.account': 'Cuenta',
'settings.tabs.offline': 'Offline',
'settings.tabs.about': 'Acerca de',
'settings.map': 'Mapa',
'settings.mapTemplate': 'Plantilla del mapa',
'settings.mapTemplatePlaceholder.select': 'Seleccionar plantilla...',
'settings.mapDefaultHint': 'Déjalo vacío para OpenStreetMap (por defecto)',
'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
'settings.mapHint': 'Plantilla de URL para los mosaicos del mapa',
'settings.latitude': 'Latitud',
'settings.longitude': 'Longitud',
'settings.saveMap': 'Guardar mapa',
'settings.apiKeys': 'Claves API',
'settings.mapsKey': 'Clave API de Google Maps',
'settings.mapsKeyHint': 'Necesaria para buscar lugares. Consíguela en console.cloud.google.com',
'settings.weatherKey': 'Clave API de OpenWeatherMap',
'settings.weatherKeyHint': 'Para datos meteorológicos. Gratis en openweathermap.org/api',
'settings.keyPlaceholder': 'Introduce la clave...',
'settings.configured': 'Configurado',
'settings.saveKeys': 'Guardar claves',
'settings.display': 'Visualización',
'settings.colorMode': 'Modo de color',
'settings.light': 'Claro',
'settings.dark': 'Oscuro',
'settings.auto': 'Automático',
'settings.language': 'Idioma',
'settings.temperature': 'Unidad de temperatura',
'settings.timeFormat': 'Formato de hora',
'settings.routeCalculation': 'Cálculo de ruta',
'settings.blurBookingCodes': 'Difuminar códigos de reserva',
'settings.notifications': 'Notificaciones',
'settings.notifyTripInvite': 'Invitaciones de viaje',
'settings.notifyBookingChange': 'Cambios en reservas',
'settings.notifyTripReminder': 'Recordatorios de viaje',
'settings.notifyVacayInvite': 'Invitaciones de fusión Vacay',
'settings.notifyPhotosShared': 'Fotos compartidas (Immich)',
'settings.notifyCollabMessage': 'Mensajes de chat (Collab)',
'settings.notifyPackingTagged': 'Lista de equipaje: asignaciones',
'settings.notifyWebhook': 'Notificaciones webhook',
'settings.notificationsDisabled': 'Las notificaciones no están configuradas. Pida a un administrador que active las notificaciones por correo o webhook.',
'settings.notificationsActive': 'Canal activo',
'settings.notificationsManagedByAdmin': 'Los eventos de notificación son configurados por el administrador.',
'admin.notifications.title': 'Notificaciones',
'admin.notifications.hint': 'Elija un canal de notificación. Solo uno puede estar activo a la vez.',
'admin.notifications.none': 'Desactivado',
'admin.notifications.email': 'Correo (SMTP)',
'admin.notifications.webhook': 'Webhook',
'admin.notifications.save': 'Guardar configuración de notificaciones',
'admin.notifications.saved': 'Configuración de notificaciones guardada',
'admin.notifications.testWebhook': 'Enviar webhook de prueba',
'admin.notifications.testWebhookSuccess': 'Webhook de prueba enviado correctamente',
'admin.notifications.testWebhookFailed': 'Error al enviar webhook de prueba',
'admin.smtp.title': 'Correo y notificaciones',
'admin.smtp.hint': 'Configuración SMTP para el envío de notificaciones por correo.',
'admin.smtp.testButton': 'Enviar correo de prueba',
'admin.webhook.hint': 'Enviar notificaciones a un webhook externo (Discord, Slack, etc.).',
'admin.smtp.testSuccess': 'Correo de prueba enviado correctamente',
'admin.smtp.testFailed': 'Error al enviar correo de prueba',
'dayplan.icsTooltip': 'Exportar calendario (ICS)',
'share.linkTitle': 'Enlace público',
'share.linkHint': 'Crea un enlace que cualquiera puede usar para ver este viaje sin iniciar sesión. Solo lectura — no se puede editar.',
'share.createLink': 'Crear enlace',
'share.deleteLink': 'Eliminar enlace',
'share.createError': 'No se pudo crear el enlace',
'common.copy': 'Copiar',
'common.copied': 'Copiado',
'share.permMap': 'Mapa y plan',
'share.permBookings': 'Reservas',
'share.permPacking': 'Equipaje',
'shared.expired': 'Enlace expirado o inválido',
'shared.expiredHint': 'Este enlace de viaje compartido ya no está activo.',
'shared.readOnly': 'Vista de solo lectura',
'shared.tabPlan': 'Plan',
'shared.tabBookings': 'Reservas',
'shared.tabPacking': 'Equipaje',
'shared.tabBudget': 'Presupuesto',
'shared.tabChat': 'Chat',
'shared.days': 'días',
'shared.places': 'lugares',
'shared.other': 'Otro',
'shared.totalBudget': 'Presupuesto total',
'shared.messages': 'mensajes',
'shared.sharedVia': 'Compartido vía',
'shared.confirmed': 'Confirmado',
'shared.pending': 'Pendiente',
'share.permBudget': 'Presupuesto',
'share.permCollab': 'Chat',
'settings.on': 'Activado',
'settings.off': 'Desactivado',
'settings.mcp.title': 'Configuración MCP',
'settings.mcp.endpoint': 'Endpoint MCP',
'settings.mcp.clientConfig': 'Configuración del cliente',
'settings.mcp.clientConfigHint': 'Reemplaza <your_token> con un token de la lista de abajo. Es posible que debas ajustar la ruta de npx según tu sistema (p. ej. C:\\PROGRA~1\\nodejs\\npx.cmd en Windows).',
'settings.mcp.clientConfigHintOAuth': 'Reemplaza <your_client_id> y <your_client_secret> con las credenciales del cliente OAuth 2.1 que creaste arriba. mcp-remote abrirá el navegador para completar la autorización la primera vez que te conectes. Es posible que debas ajustar la ruta de npx según tu sistema (p. ej. C:\\PROGRA~1\\nodejs\\npx.cmd en Windows).',
'settings.mcp.copy': 'Copiar',
'settings.mcp.copied': '¡Copiado!',
'settings.mcp.apiTokens': 'Tokens de API',
'settings.mcp.createToken': 'Crear nuevo token',
'settings.mcp.noTokens': 'Sin tokens aún. Crea uno para conectar clientes MCP.',
'settings.mcp.tokenCreatedAt': 'Creado',
'settings.mcp.tokenUsedAt': 'Usado',
'settings.mcp.deleteTokenTitle': 'Eliminar token',
'settings.mcp.deleteTokenMessage': 'Este token dejará de funcionar de inmediato. Cualquier cliente MCP que lo use perderá el acceso.',
'settings.mcp.modal.createTitle': 'Crear token de API',
'settings.mcp.modal.tokenName': 'Nombre del token',
'settings.mcp.modal.tokenNamePlaceholder': 'p. ej. Claude Desktop, Portátil de trabajo',
'settings.mcp.modal.creating': 'Creando…',
'settings.mcp.modal.create': 'Crear token',
'settings.mcp.modal.createdTitle': 'Token creado',
'settings.mcp.modal.createdWarning': 'Este token solo se mostrará una vez. Cópialo y guárdalo ahora — no se podrá recuperar.',
'settings.mcp.modal.done': 'Listo',
'settings.mcp.toast.created': 'Token creado',
'settings.mcp.toast.createError': 'Error al crear el token',
'settings.mcp.toast.deleted': 'Token eliminado',
'settings.mcp.toast.deleteError': 'Error al eliminar el token',
'settings.mcp.apiTokensDeprecated': 'Los tokens de API están obsoletos y se eliminarán en una versión futura. Utilice los clientes OAuth 2.1 en su lugar.',
'settings.oauth.clients': 'Clientes OAuth 2.1',
'settings.oauth.clientsHint': 'Registre clientes OAuth 2.1 para que las aplicaciones MCP de terceros (Claude Web, Cursor, etc.) puedan conectarse sin tokens estáticos.',
'settings.oauth.createClient': 'Nuevo cliente',
'settings.oauth.noClients': 'No hay clientes OAuth registrados.',
'settings.oauth.clientId': 'ID de cliente',
'settings.oauth.clientSecret': 'Secreto de cliente',
'settings.oauth.deleteClient': 'Eliminar cliente',
'settings.oauth.deleteClientMessage': 'Este cliente y todas las sesiones activas se eliminarán permanentemente. Cualquier aplicación que lo use perderá el acceso inmediatamente.',
'settings.oauth.rotateSecret': 'Renovar secreto',
'settings.oauth.rotateSecretMessage': 'Se generará un nuevo secreto de cliente y todas las sesiones existentes se invalidarán de inmediato. Actualice su aplicación antes de cerrar este diálogo.',
'settings.oauth.rotateSecretConfirm': 'Renovar',
'settings.oauth.rotateSecretConfirming': 'Renovando…',
'settings.oauth.rotateSecretDoneTitle': 'Nuevo secreto generado',
'settings.oauth.rotateSecretDoneWarning': 'Este secreto solo se muestra una vez. Cópielo ahora y actualice su aplicación — todas las sesiones anteriores han sido invalidadas.',
'settings.oauth.activeSessions': 'Sesiones OAuth activas',
'settings.oauth.sessionScopes': 'Ámbitos',
'settings.oauth.sessionExpires': 'Expira',
'settings.oauth.revoke': 'Revocar',
'settings.oauth.revokeSession': 'Revocar sesión',
'settings.oauth.revokeSessionMessage': 'Esto revocará inmediatamente el acceso de esta sesión OAuth.',
'settings.oauth.modal.createTitle': 'Registrar cliente OAuth',
'settings.oauth.modal.presets': 'Ajustes rápidos',
'settings.oauth.modal.clientName': 'Nombre de la aplicación',
'settings.oauth.modal.clientNamePlaceholder': 'ej. Claude Web, Mi app MCP',
'settings.oauth.modal.redirectUris': 'URIs de redirección',
'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth',
'settings.oauth.modal.redirectUrisHint': 'Un URI por línea. HTTPS obligatorio (localhost exento). Coincidencia exacta.',
'settings.oauth.modal.scopes': 'Ámbitos permitidos',
'settings.oauth.modal.scopesHint': 'list_trips y get_trip_summary siempre están disponibles — sin ámbito requerido. Permiten a la IA descubrir los IDs de viaje necesarios.',
'settings.oauth.modal.selectAll': 'Seleccionar todo',
'settings.oauth.modal.deselectAll': 'Deseleccionar todo',
'settings.oauth.modal.creating': 'Registrando…',
'settings.oauth.modal.create': 'Registrar cliente',
'settings.oauth.modal.createdTitle': 'Cliente registrado',
'settings.oauth.modal.createdWarning': 'El secreto del cliente solo se muestra una vez. Cópielo ahora — no se puede recuperar.',
'settings.oauth.toast.createError': 'Error al registrar el cliente OAuth',
'settings.oauth.toast.deleted': 'Cliente OAuth eliminado',
'settings.oauth.toast.deleteError': 'Error al eliminar el cliente OAuth',
'settings.oauth.toast.revoked': 'Sesión revocada',
'settings.oauth.toast.revokeError': 'Error al revocar la sesión',
'settings.oauth.toast.rotateError': 'Error al renovar el secreto del cliente',
'settings.account': 'Cuenta',
'settings.about': 'Acerca de',
'settings.about.reportBug': 'Reportar un error',
'settings.about.reportBugHint': 'Encontraste un problema? Avísanos',
'settings.about.featureRequest': 'Solicitar función',
'settings.about.featureRequestHint': 'Sugiere una nueva función',
'settings.about.wikiHint': 'Documentación y guías',
'settings.about.description': 'TREK es un planificador de viajes autoalojado que te ayuda a organizar tus viajes desde la primera idea hasta el último recuerdo. Planificación diaria, presupuesto, listas de equipaje, fotos y mucho más — todo en un solo lugar, en tu propio servidor.',
'settings.about.madeWith': 'Hecho con',
'settings.about.madeBy': 'por Maurice y una creciente comunidad de código abierto.',
'settings.username': 'Usuario',
'settings.email': 'Correo',
'settings.role': 'Rol',
'settings.roleAdmin': 'Administrador',
'settings.oidcLinked': 'Vinculado con',
'settings.changePassword': 'Cambiar contraseña',
'settings.mustChangePassword': 'Debe cambiar su contraseña antes de continuar. Establezca una nueva contraseña a continuación.',
'settings.currentPassword': 'Contraseña actual',
'settings.newPassword': 'Nueva contraseña',
'settings.confirmPassword': 'Confirmar nueva contraseña',
'settings.updatePassword': 'Actualizar contraseña',
'settings.passwordRequired': 'Introduce la contraseña actual y la nueva',
'settings.passwordTooShort': 'La contraseña debe tener al menos 8 caracteres',
'settings.passwordMismatch': 'Las contraseñas no coinciden',
'settings.passwordChanged': 'Contraseña cambiada correctamente',
'settings.deleteAccount': 'Eliminar cuenta',
'settings.deleteAccountTitle': '¿Eliminar tu cuenta?',
'settings.deleteAccountWarning': 'Tu cuenta y todos tus viajes, lugares y archivos se eliminarán permanentemente. Esta acción no se puede deshacer.',
'settings.deleteAccountConfirm': 'Eliminar permanentemente',
'settings.deleteBlockedTitle': 'No es posible eliminarla',
'settings.deleteBlockedMessage': 'Eres el único administrador. Asciende a otro usuario a administrador antes de eliminar tu cuenta.',
'settings.roleUser': 'Usuario',
'settings.saveProfile': 'Guardar perfil',
'settings.mfa.title': 'Autenticación de dos factores (2FA)',
'settings.mfa.description': 'Añade un segundo paso al iniciar sesión. Usa una app de autenticación (Google Authenticator, Authy, etc.).',
'settings.mfa.requiredByPolicy': 'Tu administrador exige autenticación en dos factores. Configura una app de autenticación abajo antes de continuar.',
'settings.mfa.backupTitle': 'Códigos de respaldo',
'settings.mfa.backupDescription': 'Usa estos códigos de un solo uso si pierdes acceso a tu app autenticadora.',
'settings.mfa.backupWarning': 'Guárdalos ahora. Cada código solo se puede usar una vez.',
'settings.mfa.backupCopy': 'Copiar códigos',
'settings.mfa.backupDownload': 'Descargar TXT',
'settings.mfa.backupPrint': 'Imprimir / PDF',
'settings.mfa.backupCopied': 'Códigos de respaldo copiados',
'settings.mfa.enabled': '2FA está activado en tu cuenta.',
'settings.mfa.disabled': '2FA no está activado.',
'settings.mfa.setup': 'Configurar autenticador',
'settings.mfa.scanQr': 'Escanea este código QR con tu app o introduce la clave manualmente.',
'settings.mfa.secretLabel': 'Clave secreta (entrada manual)',
'settings.mfa.codePlaceholder': 'Código de 6 dígitos',
'settings.mfa.enable': 'Activar 2FA',
'settings.mfa.cancelSetup': 'Cancelar',
'settings.mfa.disableTitle': 'Desactivar 2FA',
'settings.mfa.disableHint': 'Introduce tu contraseña y un código actual de tu autenticador.',
'settings.mfa.disable': 'Desactivar 2FA',
'settings.mfa.toastEnabled': 'Autenticación de dos factores activada',
'settings.mfa.toastDisabled': 'Autenticación de dos factores desactivada',
'settings.mfa.demoBlocked': 'No disponible en modo demo',
'settings.toast.mapSaved': 'Ajustes del mapa guardados',
'settings.toast.keysSaved': 'Claves API guardadas',
'settings.toast.displaySaved': 'Ajustes de visualización guardados',
'settings.toast.profileSaved': 'Perfil guardado',
'settings.uploadAvatar': 'Subir foto de perfil',
'settings.removeAvatar': 'Eliminar foto de perfil',
'settings.avatarUploaded': 'Foto de perfil actualizada',
'settings.avatarRemoved': 'Foto de perfil eliminada',
'settings.avatarError': 'Falló la subida',
// Login
'login.error': 'Inicio de sesión fallido. Revisa tus credenciales.',
'login.tagline': 'Tus viajes.\nTu plan.',
'login.description': 'Planifica viajes en colaboración con mapas interactivos, presupuestos y sincronización en tiempo real.',
'login.features.maps': 'Mapas interactivos',
'login.features.mapsDesc': 'Google Places, rutas y agrupación',
'login.features.realtime': 'Sincronización en tiempo real',
'login.features.realtimeDesc': 'Planificad juntos mediante WebSocket',
'login.features.budget': 'Control de presupuesto',
'login.features.budgetDesc': 'Categorías, gráficos y costes por persona',
'login.features.collab': 'Colaboración',
'login.features.collabDesc': 'Multiusuario con viajes compartidos',
'login.features.packing': 'Listas de equipaje',
'login.features.packingDesc': 'Categorías, progreso y sugerencias',
'login.features.bookings': 'Reservas',
'login.features.bookingsDesc': 'Vuelos, hoteles, restaurantes y más',
'login.features.files': 'Documentos',
'login.features.filesDesc': 'Sube y gestiona documentos',
'login.features.routes': 'Rutas inteligentes',
'login.features.routesDesc': 'Optimización automática y exportación a Google Maps',
'login.selfHosted': 'Autoalojado · Código abierto · Tus datos siguen siendo tuyos',
'login.title': 'Iniciar sesión',
'login.subtitle': 'Bienvenido de nuevo',
'login.signingIn': 'Iniciando sesión…',
'login.signIn': 'Entrar',
'login.createAdmin': 'Crear cuenta de administrador',
'login.createAdminHint': 'Configura la primera cuenta administradora de TREK.',
'login.setNewPassword': 'Establecer nueva contraseña',
'login.setNewPasswordHint': 'Debe cambiar su contraseña antes de continuar.',
'login.createAccount': 'Crear cuenta',
'login.createAccountHint': 'Crea una cuenta nueva.',
'login.creating': 'Creando…',
'login.noAccount': '¿No tienes cuenta?',
'login.hasAccount': '¿Ya tienes cuenta?',
'login.register': 'Registrarse',
'login.emailPlaceholder': 'tu@correo.com',
'login.username': 'Usuario',
'login.oidc.registrationDisabled': 'El registro está desactivado. Contacta con tu administrador.',
'login.oidc.noEmail': 'No se recibió ningún correo del proveedor.',
'login.mfaTitle': 'Autenticación de dos factores',
'login.mfaSubtitle': 'Introduce el código de 6 dígitos de tu app de autenticación.',
'login.mfaCodeLabel': 'Código de verificación',
'login.mfaCodeRequired': 'Introduce el código de tu app de autenticación.',
'login.mfaHint': 'Abre Google Authenticator, Authy u otra app TOTP.',
'login.mfaBack': '← Volver al inicio de sesión',
'login.mfaVerify': 'Verificar',
'login.invalidInviteLink': 'Enlace de invitación inválido o expirado',
'login.oidcFailed': 'Error de inicio de sesión OIDC',
'login.usernameRequired': 'El nombre de usuario es obligatorio',
'login.passwordMinLength': 'La contraseña debe tener al menos 8 caracteres',
'login.oidc.tokenFailed': 'La autenticación falló.',
'login.oidc.invalidState': 'Sesión no válida. Inténtalo de nuevo.',
'login.demoFailed': 'Falló el acceso a la demo',
'login.oidcSignIn': 'Entrar con {name}',
'login.demoHint': 'Prueba la demo: no necesitas registrarte',
// Register
'register.passwordMismatch': 'Las contraseñas no coinciden',
'register.passwordTooShort': 'La contraseña debe tener al menos 8 caracteres',
'register.failed': 'Falló el registro',
'register.getStarted': 'Empezar',
'register.subtitle': 'Crea una cuenta y empieza a planificar tus viajes.',
'register.feature1': 'Planes de viaje ilimitados',
'register.feature2': 'Vista de mapa interactiva',
'register.feature3': 'Gestiona lugares y categorías',
'register.feature4': 'Haz seguimiento de las reservas',
'register.feature5': 'Crea listas de equipaje',
'register.feature6': 'Guarda fotos y archivos',
'register.createAccount': 'Crear cuenta',
'register.startPlanning': 'Empieza a planificar tu viaje',
'register.minChars': 'Mín. 6 caracteres',
'register.confirmPassword': 'Confirmar contraseña',
'register.repeatPassword': 'Repetir contraseña',
'register.registering': 'Registrando...',
'register.register': 'Registrarse',
'register.hasAccount': '¿Ya tienes cuenta?',
'register.signIn': 'Iniciar sesión',
// Admin
'admin.title': 'Administración',
'admin.subtitle': 'Gestión de usuarios y ajustes del sistema',
'admin.tabs.users': 'Usuarios',
'admin.tabs.categories': 'Categorías',
'admin.tabs.backup': 'Copia de seguridad',
'admin.tabs.audit': 'Auditoría',
'admin.stats.users': 'Usuarios',
'admin.stats.trips': 'Viajes',
'admin.stats.places': 'Lugares',
'admin.stats.photos': 'Fotos',
'admin.stats.files': 'Archivos',
'admin.table.user': 'Usuario',
'admin.table.email': 'Correo',
'admin.table.role': 'Rol',
'admin.table.created': 'Creado',
'admin.table.lastLogin': 'Último acceso',
'admin.table.actions': 'Acciones',
'admin.you': '(Tú)',
'admin.editUser': 'Editar usuario',
'admin.newPassword': 'Nueva contraseña',
'admin.newPasswordHint': 'Déjalo vacío para mantener la contraseña actual',
'admin.deleteUser': '¿Eliminar al usuario "{name}"? Todos sus viajes se borrarán permanentemente.',
'admin.deleteUserTitle': 'Eliminar usuario',
'admin.newPasswordPlaceholder': 'Introduce una nueva contraseña…',
'admin.toast.loadError': 'No se pudieron cargar los datos de administración',
'admin.toast.userUpdated': 'Usuario actualizado',
'admin.toast.updateError': 'No se pudo actualizar',
'admin.toast.userDeleted': 'Usuario eliminado',
'admin.toast.deleteError': 'No se pudo eliminar',
'admin.toast.cannotDeleteSelf': 'No puedes eliminar tu propia cuenta',
'admin.toast.userCreated': 'Usuario creado',
'admin.toast.createError': 'No se pudo crear el usuario',
'admin.toast.fieldsRequired': 'Usuario, correo y contraseña son obligatorios',
'admin.createUser': 'Crear usuario',
'admin.invite.title': 'Enlaces de invitación',
'admin.invite.subtitle': 'Crear enlaces de registro de un solo uso',
'admin.invite.create': 'Crear enlace',
'admin.invite.createAndCopy': 'Crear y copiar',
'admin.invite.empty': 'No se han creado enlaces de invitación',
'admin.invite.maxUses': 'Usos máx.',
'admin.invite.expiry': 'Expira después de',
'admin.invite.uses': 'usado(s)',
'admin.invite.expiresAt': 'expira el',
'admin.invite.createdBy': 'por',
'admin.invite.active': 'Activo',
'admin.invite.expired': 'Expirado',
'admin.invite.usedUp': 'Agotado',
'admin.invite.copied': 'Enlace de invitación copiado',
'admin.invite.copyLink': 'Copiar enlace',
'admin.invite.deleted': 'Enlace de invitación eliminado',
'admin.invite.createError': 'Error al crear el enlace',
'admin.invite.deleteError': 'Error al eliminar el enlace',
'admin.tabs.settings': 'Ajustes',
'admin.allowRegistration': 'Permitir el registro',
'admin.allowRegistrationHint': 'Los nuevos usuarios pueden registrarse por sí mismos',
'admin.authMethods': 'Authentication Methods',
'admin.passwordLogin': 'Password Login',
'admin.passwordLoginHint': 'Allow users to sign in with email and password',
'admin.passwordRegistration': 'Password Registration',
'admin.passwordRegistrationHint': 'Allow new users to register with email and password',
'admin.oidcLogin': 'SSO Login',
'admin.oidcLoginHint': 'Allow users to sign in with SSO',
'admin.oidcRegistration': 'SSO Auto-Provisioning',
'admin.oidcRegistrationHint': 'Automatically create accounts for new SSO users',
'admin.envOverrideHint': 'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.',
'admin.lockoutWarning': 'At least one login method must remain enabled',
'admin.requireMfa': 'Exigir autenticación en dos factores (2FA)',
'admin.requireMfaHint': 'Los usuarios sin 2FA deben completar la configuración en Ajustes antes de usar la aplicación.',
'admin.apiKeys': 'Claves API',
'admin.apiKeysHint': 'Opcional. Activa datos ampliados de lugares, como fotos y previsión del tiempo.',
'admin.mapsKey': 'Clave API de Google Maps',
'admin.mapsKeyHint': 'Obligatoria para buscar lugares. Consíguela en console.cloud.google.com',
'admin.mapsKeyHintLong': 'Sin una clave API, la búsqueda de lugares usa OpenStreetMap. Con una clave de Google también se pueden cargar fotos, valoraciones y horarios de apertura. Consíguela en console.cloud.google.com.',
'admin.recommended': 'Recomendado',
'admin.weatherKey': 'Clave API de OpenWeatherMap',
'admin.weatherKeyHint': 'Para datos meteorológicos. Gratis en openweathermap.org',
'admin.validateKey': 'Probar',
'admin.keyValid': 'Conectado',
'admin.keyInvalid': 'No válida',
'admin.keySaved': 'Claves API guardadas',
'admin.oidcTitle': 'Inicio de sesión único (OIDC)',
'admin.oidcSubtitle': 'Permite iniciar sesión mediante proveedores externos como Google, Apple, Authentik o Keycloak.',
'admin.oidcDisplayName': 'Nombre visible',
'admin.oidcIssuer': 'URL del emisor',
'admin.oidcIssuerHint': 'La URL Issuer de OpenID Connect del proveedor. Ej.: https://accounts.google.com',
'admin.oidcSaved': 'Configuración OIDC guardada',
// File Types
'admin.fileTypes': 'Tipos de archivo permitidos',
'admin.fileTypesHint': 'Configura qué tipos de archivo pueden subir los usuarios.',
'admin.fileTypesFormat': 'Extensiones separadas por comas (p. ej. jpg,png,pdf,doc). Usa * para permitir todos los tipos.',
'admin.fileTypesSaved': 'Ajustes de tipos de archivo guardados',
'admin.placesPhotos.title': 'Fotos de Lugares',
'admin.placesPhotos.subtitle': 'Obtiene fotos de la Google Places API. Desactiva para ahorrar cuota de API. Las fotos de Wikimedia no se ven afectadas.',
'admin.placesAutocomplete.title': 'Autocompletado de Lugares',
'admin.placesAutocomplete.subtitle': 'Usa la Google Places API para sugerencias de búsqueda. Desactiva para ahorrar cuota de API.',
'admin.placesDetails.title': 'Detalles del Lugar',
'admin.placesDetails.subtitle': 'Obtiene información detallada del lugar (horarios, valoración, web) de la Google Places API. Desactiva para ahorrar cuota de API.',
'admin.bagTracking.title': 'Seguimiento de equipaje',
'admin.bagTracking.subtitle': 'Activar peso y asignación de equipaje para artículos de la lista',
'admin.collab.chat.title': 'Chat',
'admin.collab.chat.subtitle': 'Mensajería en tiempo real para la colaboración',
'admin.collab.notes.title': 'Notas',
'admin.collab.notes.subtitle': 'Notas y documentos compartidos',
'admin.collab.polls.title': 'Encuestas',
'admin.collab.polls.subtitle': 'Encuestas y votaciones grupales',
'admin.collab.whatsnext.title': 'Qué sigue',
'admin.collab.whatsnext.subtitle': 'Sugerencias de actividades y próximos pasos',
'admin.tabs.config': 'Personalización',
'admin.tabs.defaults': 'Valores predeterminados',
'admin.defaultSettings.title': 'Configuración predeterminada de usuarios',
'admin.defaultSettings.description': 'Establece valores predeterminados para toda la instancia. Los usuarios que no hayan cambiado una opción verán estos valores. Sus propios cambios siempre tienen prioridad.',
'admin.defaultSettings.saved': 'Predeterminado guardado',
'admin.defaultSettings.reset': 'Restaurar al valor predeterminado integrado',
'admin.defaultSettings.resetToBuiltIn': 'restaurar',
'admin.tabs.templates': 'Plantillas de equipaje',
'admin.packingTemplates.title': 'Plantillas de equipaje',
'admin.packingTemplates.subtitle': 'Crear listas de equipaje reutilizables para tus viajes',
'admin.packingTemplates.create': 'Nueva plantilla',
'admin.packingTemplates.namePlaceholder': 'Nombre de la plantilla (ej. Vacaciones en la playa)',
'admin.packingTemplates.empty': 'No se han creado plantillas aún',
'admin.packingTemplates.items': 'artículos',
'admin.packingTemplates.categories': 'categorías',
'admin.packingTemplates.itemName': 'Nombre del artículo',
'admin.packingTemplates.itemCategory': 'Categoría',
'admin.packingTemplates.categoryName': 'Nombre de categoría (ej. Ropa)',
'admin.packingTemplates.addCategory': 'Añadir categoría',
'admin.packingTemplates.created': 'Plantilla creada',
'admin.packingTemplates.deleted': 'Plantilla eliminada',
'admin.packingTemplates.loadError': 'Error al cargar plantillas',
'admin.packingTemplates.createError': 'Error al crear plantilla',
'admin.packingTemplates.deleteError': 'Error al eliminar plantilla',
'admin.packingTemplates.saveError': 'Error al guardar',
// Addons
'admin.tabs.addons': 'Complementos',
'admin.addons.title': 'Complementos',
'admin.addons.subtitle': 'Activa o desactiva funciones para personalizar tu experiencia en TREK.',
'admin.addons.subtitleBefore': 'Activa o desactiva funciones para personalizar tu experiencia en ',
'admin.addons.subtitleAfter': '.',
'admin.addons.enabled': 'Activo',
'admin.addons.disabled': 'Desactivado',
'admin.addons.type.trip': 'Viaje',
'admin.addons.type.global': 'Global',
'admin.addons.type.integration': 'Integración',
'admin.addons.tripHint': 'Disponible como pestaña dentro de cada viaje',
'admin.addons.globalHint': 'Disponible como sección independiente en la navegación principal',
'admin.addons.integrationHint': 'Servicios backend e integraciones de API sin página dedicada',
'admin.addons.toast.updated': 'Complemento actualizado',
'admin.addons.toast.error': 'No se pudo actualizar el complemento',
'admin.addons.noAddons': 'No hay complementos disponibles',
'admin.weather.title': 'Datos meteorológicos',
'admin.weather.badge': 'Desde el 24 de marzo de 2026',
'admin.weather.description': 'TREK utiliza Open-Meteo como fuente de datos meteorológicos. Open-Meteo es un servicio meteorológico gratuito y de código abierto: no requiere clave API.',
'admin.weather.forecast': 'Pronóstico de 16 días',
'admin.weather.forecastDesc': 'Antes eran 5 días (OpenWeatherMap)',
'admin.weather.climate': 'Datos climáticos históricos',
'admin.weather.climateDesc': 'Promedios de los últimos 85 años para fechas posteriores al pronóstico de 16 días',
'admin.weather.requests': '10.000 solicitudes / día',
'admin.weather.requestsDesc': 'Gratis, sin necesidad de clave API',
'admin.weather.locationHint': 'El tiempo se basa en el primer lugar con coordenadas de cada día. Si no hay ningún lugar asignado a un día, se usa como referencia cualquier lugar de la lista.',
// MCP Tokens
'admin.tabs.mcpTokens': 'Acceso MCP',
'admin.mcpTokens.title': 'Acceso MCP',
'admin.mcpTokens.subtitle': 'Gestionar sesiones OAuth y tokens de API de todos los usuarios',
'admin.mcpTokens.sectionTitle': 'Tokens de API',
'admin.mcpTokens.owner': 'Propietario',
'admin.mcpTokens.tokenName': 'Nombre del token',
'admin.mcpTokens.created': 'Creado',
'admin.mcpTokens.lastUsed': 'Último uso',
'admin.mcpTokens.never': 'Nunca',
'admin.mcpTokens.empty': 'Aún no se han creado tokens MCP',
'admin.mcpTokens.deleteTitle': 'Eliminar token',
'admin.mcpTokens.deleteMessage': 'Este token se revocará inmediatamente. El usuario perderá el acceso MCP a través de este token.',
'admin.mcpTokens.deleteSuccess': 'Token eliminado',
'admin.mcpTokens.deleteError': 'No se pudo eliminar el token',
'admin.mcpTokens.loadError': 'No se pudieron cargar los tokens',
'admin.oauthSessions.sectionTitle': 'Sesiones OAuth',
'admin.oauthSessions.clientName': 'Cliente',
'admin.oauthSessions.owner': 'Propietario',
'admin.oauthSessions.scopes': 'Permisos',
'admin.oauthSessions.created': 'Creado',
'admin.oauthSessions.empty': 'No hay sesiones OAuth activas',
'admin.oauthSessions.revokeTitle': 'Revocar sesión',
'admin.oauthSessions.revokeMessage': 'Esto revocará la sesión OAuth inmediatamente. El cliente perderá el acceso MCP.',
'admin.oauthSessions.revokeSuccess': 'Sesión revocada',
'admin.oauthSessions.revokeError': 'No se pudo revocar la sesión',
'admin.oauthSessions.loadError': 'No se pudieron cargar las sesiones OAuth',
// GitHub
'admin.tabs.github': 'GitHub',
'admin.audit.subtitle': 'Eventos sensibles de seguridad y administración (copias de seguridad, usuarios, MFA, ajustes).',
'admin.audit.empty': 'Aún no hay entradas de auditoría.',
'admin.audit.refresh': 'Actualizar',
'admin.audit.loadMore': 'Cargar más',
'admin.audit.showing': '{count} cargados · {total} en total',
'admin.audit.col.time': 'Fecha y hora',
'admin.audit.col.user': 'Usuario',
'admin.audit.col.action': 'Acción',
'admin.audit.col.resource': 'Recurso',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': 'Detalles',
'admin.github.title': 'Historial de versiones',
'admin.github.subtitle': 'Últimas novedades de {repo}',
'admin.github.latest': 'Última',
'admin.github.prerelease': 'Prelanzamiento',
'admin.github.showDetails': 'Mostrar detalles',
'admin.github.hideDetails': 'Ocultar detalles',
'admin.github.loadMore': 'Cargar más',
'admin.github.loading': 'Cargando...',
'admin.github.support': 'Ayuda a seguir desarrollando TREK',
'admin.github.error': 'No se pudieron cargar las versiones',
'admin.github.by': 'por',
'admin.update.available': 'Actualización disponible',
'admin.update.text': 'TREK {version} está disponible. Estás usando {current}.',
'admin.update.button': 'Ver en GitHub',
'admin.update.install': 'Instalar actualización',
'admin.update.confirmTitle': '¿Instalar actualización?',
'admin.update.confirmText': 'TREK se actualizará de {current} a {version}. Después, el servidor se reiniciará automáticamente.',
'admin.update.dataInfo': 'Todos tus datos (viajes, usuarios, claves API, subidas, Vacay, Atlas, presupuestos) se conservarán.',
'admin.update.warning': 'La app estará brevemente no disponible durante el reinicio.',
'admin.update.confirm': 'Actualizar ahora',
'admin.update.installing': 'Actualizando…',
'admin.update.success': '¡Actualización instalada! El servidor se está reiniciando…',
'admin.update.failed': 'La actualización falló',
'admin.update.backupHint': 'Recomendamos crear una copia de seguridad antes de actualizar.',
'admin.update.backupLink': 'Ir a Copia de seguridad',
'admin.update.howTo': 'Cómo actualizar',
'admin.update.dockerText': 'Tu instancia de TREK se ejecuta en Docker. Para actualizar a {version}, ejecuta los siguientes comandos en tu servidor:',
'admin.update.reloadHint': 'Recarga la página en unos segundos.',
// Vacay addon
'vacay.subtitle': 'Planifica y gestiona días de vacaciones',
'vacay.settings': 'Ajustes',
'vacay.year': 'Año',
'vacay.addYear': 'Añadir año siguiente',
'vacay.addPrevYear': 'Añadir año anterior',
'vacay.removeYear': 'Eliminar año',
'vacay.removeYearConfirm': '¿Eliminar {year}?',
'vacay.removeYearHint': 'Todas las vacaciones y festivos de empresa de este año se borrarán permanentemente.',
'vacay.remove': 'Eliminar',
'vacay.persons': 'Personas',
'vacay.noPersons': 'No se han añadido personas',
'vacay.addPerson': 'Añadir persona',
'vacay.editPerson': 'Editar persona',
'vacay.removePerson': 'Eliminar persona',
'vacay.removePersonConfirm': '¿Eliminar a {name}?',
'vacay.removePersonHint': 'Todas las vacaciones de esta persona se borrarán permanentemente.',
'vacay.personName': 'Nombre',
'vacay.personNamePlaceholder': 'Introduce un nombre',
'vacay.color': 'Color',
'vacay.add': 'Añadir',
'vacay.legend': 'Leyenda',
'vacay.publicHoliday': 'Festivo',
'vacay.companyHoliday': 'Festivo de empresa',
'vacay.weekend': 'Fin de semana',
'vacay.modeVacation': 'Vacaciones',
'vacay.modeCompany': 'Festivo de empresa',
'vacay.entitlement': 'Derecho',
'vacay.entitlementDays': 'Días',
'vacay.used': 'Usados',
'vacay.remaining': 'Restantes',
'vacay.carriedOver': 'de {year}',
'vacay.blockWeekends': 'Bloquear fines de semana',
'vacay.blockWeekendsHint': 'Impide marcar vacaciones en sábados y domingos',
'vacay.weekendDays': 'Días de fin de semana',
'vacay.mon': 'Lun',
'vacay.tue': 'Mar',
'vacay.wed': 'Mié',
'vacay.thu': 'Jue',
'vacay.fri': 'Vie',
'vacay.sat': 'Sáb',
'vacay.sun': 'Dom',
'vacay.publicHolidays': 'Festivos',
'vacay.publicHolidaysHint': 'Marcar festivos en el calendario',
'vacay.selectCountry': 'Seleccionar país',
'vacay.selectRegion': 'Seleccionar región (opcional)',
'vacay.companyHolidays': 'Festivos de empresa',
'vacay.companyHolidaysHint': 'Permitir marcar días festivos comunes de la empresa',
'vacay.companyHolidaysNoDeduct': 'Los festivos de empresa no descuentan días de vacaciones.',
'vacay.weekStart': 'La semana comienza el',
'vacay.weekStartHint': 'Elige si la semana comienza el lunes o el domingo',
'vacay.carryOver': 'Arrastrar saldo',
'vacay.carryOverHint': 'Trasladar automáticamente los días restantes al año siguiente',
'vacay.sharing': 'Compartir',
'vacay.sharingHint': 'Comparte tu calendario de vacaciones con otros usuarios de TREK',
'vacay.owner': 'Propietario',
'vacay.shareEmailPlaceholder': 'Correo electrónico del usuario de TREK',
'vacay.shareSuccess': 'Plan compartido correctamente',
'vacay.shareError': 'No se pudo compartir el plan',
'vacay.dissolve': 'Deshacer fusión',
'vacay.dissolveHint': 'Separar de nuevo los calendarios. Tus entradas se conservarán.',
'vacay.dissolveAction': 'Disolver',
'vacay.dissolved': 'Calendario separado',
'vacay.fusedWith': 'Fusionado con',
'vacay.you': 'tú',
'vacay.noData': 'Sin datos',
'vacay.changeColor': 'Cambiar color',
'vacay.inviteUser': 'Invitar usuario',
'vacay.inviteHint': 'Invita a otro usuario de TREK a compartir un calendario combinado de vacaciones.',
'vacay.selectUser': 'Seleccionar usuario',
'vacay.sendInvite': 'Enviar invitación',
'vacay.inviteSent': 'Invitación enviada',
'vacay.inviteError': 'No se pudo enviar la invitación',
'vacay.pending': 'pendiente',
'vacay.noUsersAvailable': 'No hay usuarios disponibles',
'vacay.accept': 'Aceptar',
'vacay.decline': 'Rechazar',
'vacay.acceptFusion': 'Aceptar y fusionar',
'vacay.inviteTitle': 'Solicitud de fusión',
'vacay.inviteWantsToFuse': 'quiere compartir un calendario de vacaciones contigo.',
'vacay.fuseInfo1': 'Ambos veréis todas las entradas de vacaciones en un único calendario compartido.',
'vacay.fuseInfo2': 'Ambas partes pueden crear y editar entradas mutuamente.',
'vacay.fuseInfo3': 'Ambas partes pueden borrar entradas y cambiar el número de días de vacaciones disponibles.',
'vacay.fuseInfo4': 'Ajustes como festivos y festivos de empresa se comparten.',
'vacay.fuseInfo5': 'La fusión puede disolverse en cualquier momento por cualquiera de las partes. Tus entradas se conservarán.',
'vacay.addCalendar': 'Añadir calendario',
'vacay.calendarColor': 'Color del calendario',
'vacay.calendarLabel': 'Etiqueta',
'vacay.noCalendars': 'Sin calendarios',
// Atlas addon
'atlas.subtitle': 'Tu huella viajera por el mundo',
'atlas.countries': 'Países',
'atlas.trips': 'Viajes',
'atlas.places': 'Lugares',
'atlas.days': 'Días',
'atlas.visitedCountries': 'Países visitados',
'atlas.cities': 'Ciudades',
'atlas.noData': 'Aún no hay datos de viaje',
'atlas.noDataHint': 'Crea un viaje y añade lugares para ver tu mapa del mundo',
'atlas.lastTrip': 'Último viaje',
'atlas.nextTrip': 'Próximo viaje',
'atlas.daysLeft': 'días restantes',
'atlas.streak': 'Racha',
'atlas.year': 'año',
'atlas.years': 'años',
'atlas.yearInRow': 'año seguido',
'atlas.yearsInRow': 'años seguidos',
'atlas.tripIn': 'viaje en',
'atlas.tripsIn': 'viajes en',
'atlas.since': 'desde',
'atlas.europe': 'Europa',
'atlas.asia': 'Asia',
'atlas.northAmerica': 'América del Norte',
'atlas.southAmerica': 'América del Sur',
'atlas.africa': 'África',
'atlas.oceania': 'Oceanía',
'atlas.other': 'Otros',
'atlas.firstVisit': 'Primer viaje',
'atlas.lastVisitLabel': 'Último viaje',
'atlas.tripSingular': 'Viaje',
'atlas.tripPlural': 'Viajes',
'atlas.placeVisited': 'Lugar visitado',
'atlas.placesVisited': 'Lugares visitados',
'atlas.statsTab': 'Estadísticas',
'atlas.bucketTab': 'Lista de deseos',
'atlas.addBucket': 'Añadir a lista de deseos',
'atlas.bucketNamePlaceholder': 'Lugar o destino...',
'atlas.bucketNotesPlaceholder': 'Notas (opcional)',
'atlas.bucketEmpty': 'Tu lista de deseos está vacía',
'atlas.bucketEmptyHint': 'Añade lugares que sueñas con visitar',
'atlas.unmark': 'Eliminar',
'atlas.confirmMark': '¿Marcar este país como visitado?',
'atlas.confirmUnmark': '¿Eliminar este país de tu lista de visitados?',
'atlas.confirmUnmarkRegion': '¿Eliminar esta región de tu lista de visitados?',
'atlas.markVisited': 'Marcar como visitado',
'atlas.markVisitedHint': 'Añadir este país a tu lista de visitados',
'atlas.markRegionVisitedHint': 'Añadir esta región a tu lista de visitados',
'atlas.addToBucket': 'Añadir a lista de deseos',
'atlas.addPoi': 'Añadir lugar',
'atlas.searchCountry': 'Buscar un país...',
'atlas.month': 'Mes',
'atlas.addToBucketHint': 'Guardar como lugar que quieres visitar',
'atlas.bucketWhen': '¿Cuándo planeas visitarlo?',
// Trip Planner
'trip.tabs.plan': 'Plan',
'trip.tabs.reservations': 'Reservas',
'trip.tabs.reservationsShort': 'Reservas',
'trip.tabs.packing': 'Lista de equipaje',
'trip.tabs.packingShort': 'Equipaje',
'trip.tabs.lists': 'Listas',
'trip.tabs.listsShort': 'Listas',
'trip.tabs.budget': 'Presupuesto',
'trip.tabs.files': 'Archivos',
'trip.loading': 'Cargando viaje...',
'trip.loadingPhotos': 'Cargando fotos de los lugares...',
'trip.mobilePlan': 'Plan',
'trip.mobilePlaces': 'Lugares',
'trip.toast.placeUpdated': 'Lugar actualizado',
'trip.toast.placeAdded': 'Lugar añadido',
'trip.toast.placeDeleted': 'Lugar eliminado',
'trip.toast.selectDay': 'Selecciona primero un día',
'trip.toast.assignedToDay': 'Lugar asignado al día',
'trip.toast.reorderError': 'No se pudo reordenar',
'trip.toast.reservationUpdated': 'Reserva actualizada',
'trip.toast.reservationAdded': 'Reserva añadida',
'trip.toast.deleted': 'Eliminado',
'trip.confirm.deletePlace': '¿Seguro que quieres eliminar este lugar?',
// Day Plan Sidebar
'dayplan.emptyDay': 'No hay lugares planificados para este día',
'dayplan.addNote': 'Añadir nota',
'dayplan.editNote': 'Editar nota',
'dayplan.noteAdd': 'Añadir nota',
'dayplan.noteEdit': 'Editar nota',
'dayplan.noteTitle': 'Nota',
'dayplan.noteSubtitle': 'Nota diaria',
'dayplan.totalCost': 'Coste total',
'dayplan.days': 'Días',
'dayplan.dayN': 'Día {n}',
'dayplan.calculating': 'Calculando...',
'dayplan.route': 'Ruta',
'dayplan.optimize': 'Optimizar',
'dayplan.optimized': 'Ruta optimizada',
'dayplan.routeError': 'No se pudo calcular la ruta',
'dayplan.toast.needTwoPlaces': 'Se necesitan al menos dos lugares para optimizar la ruta',
'dayplan.toast.routeOptimized': 'Ruta optimizada',
'dayplan.toast.noGeoPlaces': 'No se encontraron lugares con coordenadas para calcular la ruta',
'dayplan.confirmed': 'Confirmado',
'dayplan.pendingRes': 'Pendiente',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportar plan diario como PDF',
'dayplan.pdfError': 'No se pudo exportar el PDF',
'dayplan.cannotReorderTransport': 'Las reservas con hora fija no se pueden reordenar',
'dayplan.confirmRemoveTimeTitle': '¿Eliminar hora?',
'dayplan.confirmRemoveTimeBody': 'Este lugar tiene una hora fija ({time}). Al moverlo se eliminará la hora y se permitirá el orden libre.',
'dayplan.confirmRemoveTimeAction': 'Eliminar hora y mover',
'dayplan.cannotDropOnTimed': 'No se pueden colocar elementos entre entradas con hora fija',
'dayplan.cannotBreakChronology': 'Esto rompería el orden cronológico de los elementos y reservas programados',
// Places Sidebar
'places.addPlace': 'Añadir lugar/actividad',
'places.importFile': 'Importar archivo',
'places.sidebarDrop': 'Soltar para importar',
'places.importFileHint': 'Importa archivos .gpx, .kml o .kmz de herramientas como Google My Maps, Google Earth o un rastreador GPS.',
'places.importFileDropHere': 'Haz clic para seleccionar un archivo o arrástralo aquí',
'places.importFileDropActive': 'Suelta el archivo para seleccionarlo',
'places.importFileUnsupported': 'Tipo de archivo no compatible. Usa .gpx, .kml o .kmz.',
'places.importFileTooLarge': 'El archivo es demasiado grande. El tamaño máximo de carga es {maxMb} MB.',
'places.importFileError': 'Importación fallida',
'places.importAllSkipped': 'Todos los lugares ya estaban en el viaje.',
'places.gpxImported': '{count} lugares importados desde GPX',
'places.kmlKmzImported': '{count} lugares importados desde KMZ/KML',
'places.urlResolved': 'Lugar importado desde URL',
'places.importList': 'Importar lista',
'places.kmlKmzSummaryValues': 'Placemarks: {total} • Importados: {created} • Omitidos: {skipped}',
'places.importGoogleList': 'Lista Google',
'places.importNaverList': 'Lista Naver',
'places.googleListHint': 'Pega un enlace compartido de una lista de Google Maps para importar todos los lugares.',
'places.googleListImported': '{count} lugares importados de "{list}"',
'places.googleListError': 'Error al importar la lista de Google Maps',
'places.naverListHint': 'Pega un enlace compartido de una lista de Naver Maps para importar todos los lugares.',
'places.naverListImported': '{count} lugares importados de "{list}"',
'places.naverListError': 'Error al importar la lista de Naver Maps',
'places.viewDetails': 'Ver detalles',
'places.assignToDay': '¿A qué día añadirlo?',
'places.all': 'Todo',
'places.unplanned': 'Sin planificar',
'places.search': 'Buscar lugares...',
'places.allCategories': 'Todas las categorías',
'places.categoriesSelected': 'categorías',
'places.clearFilter': 'Borrar filtro',
'places.count': '{count} lugares',
'places.countSingular': '1 lugar',
'places.allPlanned': 'Todos los lugares están planificados',
'places.noneFound': 'No se encontraron lugares',
'places.editPlace': 'Editar lugar',
'places.formName': 'Nombre',
'places.formNamePlaceholder': 'p. ej. Torre Eiffel',
'places.formDescription': 'Descripción',
'places.formDescriptionPlaceholder': 'Descripción breve...',
'places.formAddress': 'Dirección',
'places.formAddressPlaceholder': 'Calle, ciudad, país',
'places.formLat': 'Latitud (p. ej. 48.8566)',
'places.formLng': 'Longitud (p. ej. 2.3522)',
'places.formCategory': 'Categoría',
'places.noCategory': 'Sin categoría',
'places.categoryNamePlaceholder': 'Nombre de la categoría',
'places.formTime': 'Hora',
'places.startTime': 'Inicio',
'places.endTime': 'Fin',
'places.endTimeBeforeStart': 'La hora de fin es anterior a la de inicio',
'places.timeCollision': 'Solapamiento horario con:',
'places.formWebsite': 'Página web',
'places.formNotes': 'Notas',
'places.formNotesPlaceholder': 'Notas personales...',
'places.formReservation': 'Reserva',
'places.reservationNotesPlaceholder': 'Notas de reserva, número de confirmación...',
'places.mapsSearchPlaceholder': 'Buscar lugares...',
'places.mapsSearchError': 'La búsqueda de lugares falló.',
'places.loadingDetails': 'Cargando detalles del lugar…',
'places.osmHint': 'Usando búsqueda con OpenStreetMap (sin fotos, horarios ni valoraciones). Añade una clave API de Google en Ajustes para obtener todos los detalles.',
'places.osmActive': 'Búsqueda mediante OpenStreetMap (sin fotos, valoraciones ni horarios). Añade una clave API de Google en Ajustes para datos ampliados.',
'places.categoryCreateError': 'No se pudo crear la categoría',
'places.nameRequired': 'Introduce un nombre',
'places.saveError': 'No se pudo guardar',
// Place Inspector
'inspector.opened': 'Abierto',
'inspector.closed': 'Cerrado',
'inspector.openingHours': 'Horario de apertura',
'inspector.showHours': 'Mostrar horario',
'inspector.files': 'Archivos',
'inspector.filesCount': '{count} archivos',
'inspector.removeFromDay': 'Quitar del día',
'inspector.remove': 'Eliminar',
'inspector.addToDay': 'Añadir al día',
'inspector.confirmedRes': 'Reserva confirmada',
'inspector.pendingRes': 'Reserva pendiente',
'inspector.google': 'Abrir en Google Maps',
'inspector.website': 'Abrir la web',
'inspector.addRes': 'Reserva',
'inspector.editRes': 'Editar reserva',
'inspector.participants': 'Participantes',
'inspector.trackStats': 'Datos de la ruta',
// Reservations
'reservations.title': 'Reservas',
'reservations.empty': 'Aún no hay reservas',
'reservations.emptyHint': 'Añade reservas de vuelos, hoteles y más',
'reservations.add': 'Añadir reserva',
'reservations.addManual': 'Reserva manual',
'reservations.placeHint': 'Consejo: es mejor crear las reservas directamente desde un lugar para vincularlas con el plan del día.',
'reservations.confirmed': 'Confirmada',
'reservations.pending': 'Pendiente',
'reservations.summary': '{confirmed} confirmadas, {pending} pendientes',
'reservations.fromPlan': 'Del plan',
'reservations.showFiles': 'Mostrar archivos',
'reservations.editTitle': 'Editar reserva',
'reservations.status': 'Estado',
'reservations.datetime': 'Fecha y hora',
'reservations.startTime': 'Hora de inicio',
'reservations.endTime': 'Hora de fin',
'reservations.date': 'Fecha',
'reservations.time': 'Hora',
'reservations.timeAlt': 'Hora (alternativa, p. ej. 19:30)',
'reservations.notes': 'Notas',
'reservations.notesPlaceholder': 'Notas adicionales...',
'reservations.type.flight': 'Vuelo',
'reservations.type.hotel': 'Alojamiento',
'reservations.type.restaurant': 'Restaurante',
'reservations.type.train': 'Tren',
'reservations.type.car': 'Coche',
'reservations.type.cruise': 'Crucero',
'reservations.type.event': 'Evento',
'reservations.type.tour': 'Excursión',
'reservations.type.other': 'Otro',
'reservations.confirm.delete': '¿Seguro que quieres eliminar la reserva "{name}"?',
'reservations.confirm.deleteTitle': '¿Eliminar reserva?',
'reservations.confirm.deleteBody': '« {name} » se eliminará permanentemente.',
'reservations.toast.updated': 'Reserva actualizada',
'reservations.toast.removed': 'Reserva eliminada',
'reservations.toast.fileUploaded': 'Archivo subido',
'reservations.toast.uploadError': 'No se pudo subir',
'reservations.newTitle': 'Nueva reserva',
'reservations.bookingType': 'Tipo de reserva',
'reservations.titleLabel': 'Título',
'reservations.titlePlaceholder': 'p. ej. Lufthansa LH123, Hotel Adlon, ...',
'reservations.locationAddress': 'Ubicación / dirección',
'reservations.locationPlaceholder': 'Dirección, aeropuerto, hotel...',
'reservations.confirmationCode': 'Código de reserva',
'reservations.confirmationPlaceholder': 'p. ej. ABC12345',
'reservations.day': 'Día',
'reservations.noDay': 'Sin día',
'reservations.place': 'Lugar',
'reservations.noPlace': 'Sin lugar',
'reservations.pendingSave': 'se guardará…',
'reservations.uploading': 'Subiendo...',
'reservations.attachFile': 'Adjuntar archivo',
'reservations.linkExisting': 'Vincular archivo existente',
'reservations.toast.saveError': 'No se pudo guardar',
'reservations.toast.updateError': 'No se pudo actualizar',
'reservations.toast.deleteError': 'No se pudo eliminar',
'reservations.confirm.remove': '¿Eliminar la reserva de "{name}"?',
'reservations.linkAssignment': 'Vincular a una asignación del día',
'reservations.pickAssignment': 'Selecciona una asignación de tu plan...',
'reservations.noAssignment': 'Sin vínculo (independiente)',
'reservations.price': 'Precio',
'reservations.budgetCategory': 'Categoría de presupuesto',
'reservations.budgetCategoryPlaceholder': 'ej. Transporte, Alojamiento',
'reservations.budgetCategoryAuto': 'Automático (según tipo de reserva)',
'reservations.budgetHint': 'Se creará automáticamente una entrada presupuestaria al guardar.',
'reservations.departureDate': 'Salida',
'reservations.arrivalDate': 'Llegada',
'reservations.departureTime': 'Hora salida',
'reservations.arrivalTime': 'Hora llegada',
'reservations.pickupDate': 'Recogida',
'reservations.returnDate': 'Devolución',
'reservations.pickupTime': 'Hora recogida',
'reservations.returnTime': 'Hora devolución',
'reservations.endDate': 'Fecha fin',
'reservations.meta.departureTimezone': 'TZ salida',
'reservations.meta.arrivalTimezone': 'TZ llegada',
'reservations.span.departure': 'Salida',
'reservations.span.arrival': 'Llegada',
'reservations.span.inTransit': 'En tránsito',
'reservations.span.pickup': 'Recogida',
'reservations.span.return': 'Devolución',
'reservations.span.active': 'Activo',
'reservations.span.start': 'Inicio',
'reservations.span.end': 'Fin',
'reservations.span.ongoing': 'En curso',
'reservations.validation.endBeforeStart': 'La fecha/hora de fin debe ser posterior a la de inicio',
// Budget
'budget.title': 'Presupuesto',
'budget.exportCsv': 'Exportar CSV',
'budget.emptyTitle': 'Aún no se ha creado ningún presupuesto',
'budget.emptyText': 'Crea categorías y entradas para planificar el presupuesto de tu viaje',
'budget.emptyPlaceholder': 'Introduce el nombre de la categoría...',
'budget.createCategory': 'Crear categoría',
'budget.category': 'Categoría',
'budget.categoryName': 'Nombre de la categoría',
'budget.table.name': 'Nombre',
'budget.table.total': 'Total',
'budget.table.persons': 'Personas',
'budget.table.days': 'Días',
'budget.table.perPerson': 'Por persona',
'budget.table.perDay': 'Por día',
'budget.table.perPersonDay': 'Por pers. / día',
'budget.table.note': 'Nota',
'budget.table.date': 'Fecha',
'budget.newEntry': 'Nueva entrada',
'budget.defaultEntry': 'Nueva entrada',
'budget.defaultCategory': 'Nueva categoría',
'budget.total': 'Total',
'budget.totalBudget': 'Presupuesto total',
'budget.byCategory': 'Por categoría',
'budget.editTooltip': 'Haz clic para editar',
'budget.linkedToReservation': 'Vinculado a una reserva — edite el nombre allí',
'budget.confirm.deleteCategory': '¿Seguro que quieres eliminar la categoría "{name}" con {count} entradas?',
'budget.deleteCategory': 'Eliminar categoría',
'budget.perPerson': 'Por persona',
'budget.paid': 'Pagado',
'budget.open': 'Abrir',
'budget.noMembers': 'No hay miembros asignados',
'budget.settlement': 'Liquidación',
'budget.settlementInfo': 'Haz clic en el avatar de un miembro en una partida del presupuesto para marcarlo en verde — esto significa que ha pagado. La liquidación muestra quién debe cuánto a quién.',
'budget.netBalances': 'Saldos netos',
// Files
'files.title': 'Archivos',
'files.pageTitle': 'Archivos y documentos',
'files.subtitle': '{count} archivos para {trip}',
'files.downloadPdf': 'Descargar PDF',
'files.count': '{count} archivos',
'files.countSingular': '1 archivo',
'files.uploaded': '{count} archivos subidos',
'files.uploadError': 'La subida falló',
'files.dropzone': 'Arrastra aquí los archivos',
'files.dropzoneHint': 'o haz clic para explorar',
'files.allowedTypes': 'Imágenes, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Máx. 50 MB',
'files.uploading': 'Subiendo...',
'files.filterAll': 'Todo',
'files.filterPdf': 'PDF',
'files.filterImages': 'Imágenes',
'files.filterDocs': 'Documentos',
'files.filterCollab': 'Notas de colaboración',
'files.sourceCollab': 'Desde notas de colaboración',
'files.empty': 'Aún no hay archivos',
'files.emptyHint': 'Sube archivos para adjuntarlos a tu viaje',
'files.openTab': 'Abrir en una pestaña nueva',
'files.confirm.delete': '¿Seguro que quieres eliminar este archivo?',
'files.toast.deleted': 'Archivo eliminado',
'files.toast.deleteError': 'No se pudo eliminar el archivo',
'files.sourcePlan': 'Plan diario',
'files.sourceBooking': 'Reserva',
'files.attach': 'Adjuntar',
'files.pasteHint': 'También puedes pegar imágenes desde el portapapeles (Ctrl+V)',
// Packing
'packing.title': 'Lista de equipaje',
'packing.empty': 'La lista de equipaje está vacía',
'packing.import': 'Importar',
'packing.importTitle': 'Importar lista de equipaje',
'packing.importHint': 'Un elemento por línea. Categoría y cantidad opcionales separadas por coma, punto y coma o tabulación: Nombre, Categoría, Cantidad',
'packing.importPlaceholder': 'Cepillo de dientes\nProtector solar, Higiene\nCamisetas, Ropa, 5\nPasaporte, Documentos',
'packing.importCsv': 'Cargar CSV/TXT',
'packing.importAction': 'Importar {count}',
'packing.importSuccess': '{count} elementos importados',
'packing.importError': 'Error al importar',
'packing.importEmpty': 'Sin elementos para importar',
'packing.progress': '{packed} de {total} preparados ({percent}%)',
'packing.clearChecked': 'Eliminar {count} marcados',
'packing.clearCheckedShort': 'Eliminar {count}',
'packing.suggestions': 'Sugerencias',
'packing.suggestionsTitle': 'Añadir sugerencias',
'packing.allSuggested': 'Todas las sugerencias añadidas',
'packing.allPacked': '¡Todo preparado!',
'packing.addPlaceholder': 'Añadir nuevo elemento...',
'packing.categoryPlaceholder': 'Categoría...',
'packing.filterAll': 'Todo',
'packing.filterOpen': 'Pendientes',
'packing.filterDone': 'Hecho',
'packing.emptyTitle': 'La lista de equipaje está vacía',
'packing.emptyHint': 'Añade elementos o usa las sugerencias',
'packing.emptyFiltered': 'Ningún elemento coincide con este filtro',
'packing.menuRename': 'Renombrar',
'packing.menuCheckAll': 'Marcar todo',
'packing.menuUncheckAll': 'Desmarcar todo',
'packing.menuDeleteCat': 'Eliminar categoría',
'packing.addItem': 'Añadir artículo',
'packing.addItemPlaceholder': 'Nombre del artículo...',
'packing.addCategory': 'Añadir categoría',
'packing.newCategoryPlaceholder': 'Nombre de categoría (ej. Ropa)',
'packing.applyTemplate': 'Aplicar plantilla',
'packing.template': 'Plantilla',
'packing.templateApplied': '{count} artículos añadidos desde plantilla',
'packing.templateError': 'Error al aplicar plantilla',
'packing.saveAsTemplate': 'Guardar como plantilla',
'packing.templateName': 'Nombre de la plantilla',
'packing.templateSaved': 'Lista de equipaje guardada como plantilla',
'packing.noMembers': 'Sin miembros',
'packing.bags': 'Equipaje',
'packing.noBag': 'Sin asignar',
'packing.totalWeight': 'Peso total',
'packing.bagName': 'Nombre...',
'packing.addBag': 'Añadir equipaje',
'packing.changeCategory': 'Cambiar categoría',
'packing.confirm.clearChecked': '¿Seguro que quieres eliminar {count} elementos marcados?',
'packing.confirm.deleteCat': '¿Seguro que quieres eliminar la categoría "{name}" con {count} elementos?',
'packing.defaultCategory': 'Otros',
'packing.toast.saveError': 'No se pudo guardar',
'packing.toast.deleteError': 'No se pudo eliminar',
'packing.toast.renameError': 'No se pudo renombrar',
'packing.toast.addError': 'No se pudo añadir',
// Packing suggestions
'packing.suggestions.items': [
{ name: 'Pasaporte', category: 'Documentos' },
{ name: 'Documento de identidad', category: 'Documentos' },
{ name: 'Seguro de viaje', category: 'Documentos' },
{ name: 'Billetes de vuelo', category: 'Documentos' },
{ name: 'Tarjeta de crédito', category: 'Finanzas' },
{ name: 'Efectivo', category: 'Finanzas' },
{ name: 'Visado', category: 'Documentos' },
{ name: 'Camisetas', category: 'Ropa' },
{ name: 'Pantalones', category: 'Ropa' },
{ name: 'Ropa interior', category: 'Ropa' },
{ name: 'Calcetines', category: 'Ropa' },
{ name: 'Chaqueta', category: 'Ropa' },
{ name: 'Pijama', category: 'Ropa' },
{ name: 'Ropa de baño', category: 'Ropa' },
{ name: 'Impermeable', category: 'Ropa' },
{ name: 'Zapatos cómodos', category: 'Ropa' },
{ name: 'Cepillo de dientes', category: 'Aseo' },
{ name: 'Pasta de dientes', category: 'Aseo' },
{ name: 'Champú', category: 'Aseo' },
{ name: 'Desodorante', category: 'Aseo' },
{ name: 'Protector solar', category: 'Aseo' },
{ name: 'Maquinilla de afeitar', category: 'Aseo' },
{ name: 'Cargador', category: 'Electrónica' },
{ name: 'Batería externa', category: 'Electrónica' },
{ name: 'Auriculares', category: 'Electrónica' },
{ name: 'Adaptador de viaje', category: 'Electrónica' },
{ name: 'Cámara', category: 'Electrónica' },
{ name: 'Analgésicos', category: 'Salud' },
{ name: 'Tiritas', category: 'Salud' },
{ name: 'Desinfectante', category: 'Salud' },
],
// Members / Sharing
'members.shareTrip': 'Compartir viaje',
'members.inviteUser': 'Invitar usuario',
'members.selectUser': 'Seleccionar usuario…',
'members.invite': 'Invitar',
'members.allHaveAccess': 'Todos los usuarios ya tienen acceso.',
'members.access': 'Acceso',
'members.person': 'persona',
'members.persons': 'personas',
'members.you': 'tú',
'members.owner': 'Propietario',
'members.leaveTrip': 'Abandonar viaje',
'members.removeAccess': 'Quitar acceso',
'members.confirmLeave': '¿Abandonar el viaje? Perderás el acceso.',
'members.confirmRemove': '¿Quitar el acceso de este usuario?',
'members.loadError': 'No se pudieron cargar los miembros',
'members.added': 'añadido',
'members.addError': 'No se pudo añadir',
'members.removed': 'Miembro eliminado',
'members.removeError': 'No se pudo eliminar',
// Categories (Admin)
'categories.title': 'Categorías',
'categories.subtitle': 'Gestiona categorías para lugares',
'categories.new': 'Nueva categoría',
'categories.empty': 'Aún no hay categorías',
'categories.namePlaceholder': 'Nombre de la categoría',
'categories.icon': 'Icono',
'categories.color': 'Color',
'categories.customColor': 'Elegir color personalizado',
'categories.preview': 'Vista previa',
'categories.defaultName': 'Categoría',
'categories.update': 'Actualizar',
'categories.create': 'Crear',
'categories.confirm.delete': '¿Eliminar la categoría? Los lugares de esta categoría no se eliminarán.',
'categories.toast.loadError': 'No se pudieron cargar las categorías',
'categories.toast.nameRequired': 'Introduce un nombre',
'categories.toast.updated': 'Categoría actualizada',
'categories.toast.created': 'Categoría creada',
'categories.toast.saveError': 'No se pudo guardar',
'categories.toast.deleted': 'Categoría eliminada',
'categories.toast.deleteError': 'No se pudo eliminar',
// Backup (Admin)
'backup.title': 'Copia de seguridad de datos',
'backup.subtitle': 'Base de datos y todos los archivos subidos',
'backup.refresh': 'Actualizar',
'backup.upload': 'Subir copia de seguridad',
'backup.uploading': 'Subiendo…',
'backup.create': 'Crear copia',
'backup.creating': 'Creando…',
'backup.empty': 'Aún no hay copias',
'backup.createFirst': 'Crear la primera copia',
'backup.download': 'Descargar',
'backup.restore': 'Restaurar',
'backup.confirm.restore': '¿Restaurar la copia "{name}"?\n\nTodos los datos actuales serán reemplazados por la copia.',
'backup.confirm.uploadRestore': '¿Subir y restaurar el archivo de copia "{name}"?\n\nTodos los datos actuales se sobrescribirán.',
'backup.confirm.delete': '¿Eliminar la copia "{name}"?',
'backup.toast.loadError': 'No se pudieron cargar las copias',
'backup.toast.created': 'Copia de seguridad creada correctamente',
'backup.toast.createError': 'No se pudo crear la copia',
'backup.toast.restored': 'Copia restaurada. La página se recargará…',
'backup.toast.restoreError': 'No se pudo restaurar',
'backup.toast.uploadError': 'No se pudo subir',
'backup.toast.deleted': 'Copia eliminada',
'backup.toast.deleteError': 'No se pudo eliminar',
'backup.toast.downloadError': 'La descarga falló',
'backup.toast.settingsSaved': 'Ajustes de copia automática guardados',
'backup.toast.settingsError': 'No se pudieron guardar los ajustes',
'backup.auto.title': 'Copia automática',
'backup.auto.subtitle': 'Copia de seguridad automática según una programación',
'backup.auto.enable': 'Activar copia automática',
'backup.auto.enableHint': 'Se crearán copias automáticamente según la frecuencia elegida',
'backup.auto.interval': 'Intervalo',
'backup.auto.hour': 'Ejecutar a la hora',
'backup.auto.hourHint': 'Hora local del servidor (formato {format})',
'backup.auto.dayOfWeek': 'Día de la semana',
'backup.auto.dayOfMonth': 'Día del mes',
'backup.auto.dayOfMonthHint': 'Limitado a 128 para compatibilidad con todos los meses',
'backup.auto.scheduleSummary': 'Programación',
'backup.auto.summaryDaily': 'Todos los días a las {hour}:00',
'backup.auto.summaryWeekly': 'Cada {day} a las {hour}:00',
'backup.auto.summaryMonthly': 'El día {day} de cada mes a las {hour}:00',
'backup.auto.envLocked': 'Docker',
'backup.auto.envLockedHint': 'La copia automática está configurada mediante variables de entorno Docker. Para cambiar estos ajustes, actualiza tu docker-compose.yml y reinicia el contenedor.',
'backup.auto.copyEnv': 'Copiar variables de entorno Docker',
'backup.auto.envCopied': 'Variables de entorno Docker copiadas al portapapeles',
'backup.auto.keepLabel': 'Eliminar copias antiguas después de',
'backup.dow.sunday': 'Dom',
'backup.dow.monday': 'Lun',
'backup.dow.tuesday': 'Mar',
'backup.dow.wednesday': 'Mié',
'backup.dow.thursday': 'Jue',
'backup.dow.friday': 'Vie',
'backup.dow.saturday': 'Sáb',
'backup.interval.hourly': 'Cada hora',
'backup.interval.daily': 'Diaria',
'backup.interval.weekly': 'Semanal',
'backup.interval.monthly': 'Mensual',
'backup.keep.1day': '1 día',
'backup.keep.3days': '3 días',
'backup.keep.7days': '7 días',
'backup.keep.14days': '14 días',
'backup.keep.30days': '30 días',
'backup.keep.forever': 'Conservar para siempre',
// Photos
'photos.title': 'Fotos',
'photos.subtitle': '{count} fotos para {trip}',
'photos.dropHere': 'Suelta fotos aquí...',
'photos.dropHereActive': 'Suelta fotos aquí',
'photos.captionForAll': 'Leyenda (para todos)',
'photos.captionPlaceholder': 'Leyenda opcional...',
'photos.addCaption': 'Añadir leyenda...',
'photos.allDays': 'Todos los días',
'photos.noPhotos': 'Aún no hay fotos',
'photos.uploadHint': 'Sube y organiza las fotos compartidas de este viaje',
'photos.clickToSelect': 'o haz clic para seleccionar',
'photos.linkPlace': 'Vincular lugar',
'photos.noPlace': 'Sin lugar',
'photos.uploadN': 'Subida de {n} foto(s)',
'photos.linkDay': 'Vincular día',
'photos.noDay': 'Ningún día',
'photos.dayLabel': 'Día {number}',
'photos.photoSelected': 'Foto seleccionada',
'photos.photosSelected': 'Fotos seleccionadas',
'photos.fileTypeHint': 'JPG, PNG, WebP · máx. 10 MB · hasta 30 fotos',
'admin.addons.catalog.memories.name': 'Fotos (Immich)',
'admin.addons.catalog.memories.description': 'Comparte fotos de viaje a través de tu instancia de Immich',
'admin.addons.catalog.mcp.name': 'MCP',
'admin.addons.catalog.mcp.description': 'Protocolo de contexto de modelo para integración con asistentes de IA',
'admin.addons.catalog.packing.name': 'Listas',
'admin.addons.catalog.packing.description': 'Listas de equipaje y tareas pendientes para tus viajes',
'admin.addons.catalog.budget.name': 'Presupuesto',
'admin.addons.catalog.budget.description': 'Controla los gastos y planifica el presupuesto del viaje',
'admin.addons.catalog.documents.name': 'Documentos',
'admin.addons.catalog.documents.description': 'Guarda y gestiona la documentación del viaje',
'admin.addons.catalog.vacay.name': 'Vacaciones',
'admin.addons.catalog.vacay.description': 'Planificador personal de vacaciones con vista de calendario',
'admin.addons.catalog.atlas.name': 'Atlas',
'admin.addons.catalog.atlas.description': 'Mapa del mundo con los países visitados y estadísticas de viaje',
'admin.addons.catalog.collab.name': 'Colaboración',
'admin.addons.catalog.collab.description': 'Notas, encuestas y chat en tiempo real para organizar el viaje',
// Backup restore modal
'backup.restoreConfirmTitle': '¿Restaurar copia?',
'backup.restoreWarning': 'Todos los datos actuales (viajes, lugares, usuarios, subidas) serán reemplazados permanentemente por la copia. Esta acción no se puede deshacer.',
'backup.restoreTip': 'Consejo: crea una copia del estado actual antes de restaurar.',
'backup.restoreConfirm': 'Sí, restaurar',
// PDF
'pdf.travelPlan': 'Plan de viaje',
'pdf.planned': 'Planificado',
'pdf.costLabel': 'Coste EUR',
'pdf.preview': 'Vista previa PDF',
'pdf.saveAsPdf': 'Guardar como PDF',
// Planner
'planner.places': 'Lugares',
'planner.bookings': 'Reservas',
'planner.packingList': 'Lista de equipaje',
'planner.documents': 'Documentos',
'planner.dayPlan': 'Plan por días',
'planner.reservations': 'Reservas',
'planner.minTwoPlaces': 'Se necesitan al menos 2 lugares con coordenadas',
'planner.noGeoPlaces': 'No hay lugares con coordenadas disponibles',
'planner.routeCalculated': 'Ruta calculada',
'planner.routeCalcFailed': 'No se pudo calcular la ruta',
'planner.routeError': 'Error al calcular la ruta',
'planner.icsExportFailed': 'Error al exportar ICS',
'planner.routeOptimized': 'Ruta optimizada',
'planner.reservationUpdated': 'Reserva actualizada',
'planner.reservationAdded': 'Reserva añadida',
'planner.confirmDeleteReservation': '¿Eliminar reserva?',
'planner.reservationDeleted': 'Reserva eliminada',
'planner.days': 'Días',
'planner.allPlaces': 'Todos los lugares',
'planner.totalPlaces': '{n} lugares en total',
'planner.noDaysPlanned': 'Aún no hay días planificados',
'planner.editTrip': 'Editar viaje →',
'planner.placeOne': '1 lugar',
'planner.placeN': '{n} lugares',
'planner.addNote': 'Añadir nota',
'planner.noEntries': 'No hay entradas para este día',
'planner.addPlace': 'Añadir lugar/actividad',
'planner.addPlaceShort': '+ Añadir lugar/actividad',
'planner.resPending': 'Reserva pendiente · ',
'planner.resConfirmed': 'Reserva confirmada · ',
'planner.notePlaceholder': 'Nota…',
'planner.noteTimePlaceholder': 'Hora (opcional)',
'planner.noteExamplePlaceholder': 'p. ej. S3 a las 14:30 desde la estación central, ferry desde el muelle 7, pausa para comer…',
'planner.totalCost': 'Coste total',
'planner.searchPlaces': 'Buscar lugares…',
'planner.allCategories': 'Todas las categorías',
'planner.noPlacesFound': 'No se encontraron lugares',
'planner.addFirstPlace': 'Añadir el primer lugar',
'planner.noReservations': 'Sin reservas',
'planner.addFirstReservation': 'Añadir la primera reserva',
'planner.new': 'Nuevo',
'planner.addToDay': '+ Día',
'planner.calculating': 'Calculando…',
'planner.route': 'Ruta',
'planner.optimize': 'Optimizar',
'planner.openGoogleMaps': 'Abrir en Google Maps',
'planner.selectDayHint': 'Selecciona un día de la lista izquierda para ver su plan',
'planner.noPlacesForDay': 'Aún no hay lugares para este día',
'planner.addPlacesLink': 'Añadir lugares →',
'planner.minTotal': 'min en total',
'planner.noReservation': 'Sin reserva',
'planner.removeFromDay': 'Quitar del día',
'planner.addToThisDay': 'Añadir al día',
'planner.overview': 'Vista general',
'planner.noDays': 'No hay días todavía',
'planner.editTripToAddDays': 'Edita el viaje para añadir días',
'planner.dayCount': '{n} días',
'planner.clickToUnlock': 'Haz clic para desbloquear',
'planner.keepPosition': 'Mantener posición durante la optimización de ruta',
'planner.dayDetails': 'Detalles del día',
'planner.dayN': 'Día {n}',
// Dashboard Stats
'stats.countries': 'Países',
'stats.cities': 'Ciudades',
'stats.trips': 'Viajes',
'stats.places': 'Lugares',
'stats.worldProgress': 'Progreso mundial',
'stats.visited': 'visitados',
'stats.remaining': 'restantes',
'stats.visitedCountries': 'Países visitados',
// Day Detail Panel
'day.precipProb': 'Probabilidad de lluvia',
'day.precipitation': 'Precipitación',
'day.wind': 'Viento',
'day.sunrise': 'Amanecer',
'day.sunset': 'Atardecer',
'day.hourlyForecast': 'Pronóstico por horas',
'day.climateHint': 'Promedios históricos: el pronóstico real está disponible dentro de los 16 días previos a la fecha.',
'day.noWeather': 'No hay datos meteorológicos disponibles. Añade un lugar con coordenadas.',
'day.overview': 'Resumen diario',
'day.accommodation': 'Alojamiento',
'day.addAccommodation': 'Añadir alojamiento',
'day.hotelDayRange': 'Aplicar a los días',
'day.noPlacesForHotel': 'Añade primero lugares al viaje',
'day.allDays': 'Todos',
'day.checkIn': 'Registro de entrada',
'day.checkInUntil': 'Hasta',
'day.checkOut': 'Registro de salida',
'day.confirmation': 'Confirmación',
'day.editAccommodation': 'Editar alojamiento',
'day.reservations': 'Reservas',
// Memories / Immich
'memories.title': 'Fotos',
'memories.notConnected': 'Immich no conectado',
'memories.notConnectedHint': 'Conecta tu instancia de Immich en Ajustes para ver tus fotos de viaje aquí.',
'memories.notConnectedMultipleHint': 'Conecta alguno de estos proveedores de fotos: {provider_names} en Configuración para poder añadir fotos a este viaje.',
'memories.noDates': 'Añade fechas a tu viaje para cargar fotos.',
'memories.noPhotos': 'No se encontraron fotos',
'memories.noPhotosHint': 'No se encontraron fotos en Immich para el rango de fechas de este viaje.',
'memories.photosFound': 'fotos',
'memories.fromOthers': 'de otros',
'memories.sharePhotos': 'Compartir fotos',
'memories.sharing': 'Compartiendo',
'memories.reviewTitle': 'Revisar tus fotos',
'memories.reviewHint': 'Haz clic en las fotos para excluirlas de compartir.',
'memories.shareCount': 'Compartir {count} fotos',
'memories.providerUrl': 'URL del servidor',
'memories.providerApiKey': 'Clave API',
'memories.providerUsername': 'Nombre de usuario',
'memories.providerPassword': 'Contraseña',
'memories.providerOTP': 'Código MFA (si está habilitado)',
'memories.skipSSLVerification': 'Omitir verificación del certificado SSL',
'memories.providerUrlHintSynology': 'Incluye la ruta de la aplicación Photos en la URL, p.ej. https://nas:5001/photo',
'memories.testConnection': 'Probar conexión',
'memories.testFirst': 'Probar conexión primero',
'memories.connected': 'Conectado',
'memories.disconnected': 'No conectado',
'memories.connectionSuccess': 'Conectado a Immich',
'memories.connectionError': 'No se pudo conectar a Immich',
'memories.saved': 'Configuración de {provider_name} guardada',
'memories.providerDisconnectedBanner': 'Se perdió la conexión con {provider_name}. Vuelve a conectar en Configuración para ver las fotos.',
'memories.saveError': 'No se pudieron guardar los ajustes de {provider_name}',
'memories.saveRouteNotConfigured': 'La ruta de guardado no está configurada para este proveedor',
'memories.testRouteNotConfigured': 'La ruta de prueba no está configurada para este proveedor',
'memories.fillRequiredFields': 'Por favor complete todos los campos requeridos',
'memories.oldest': 'Más antiguas',
'memories.newest': 'Más recientes',
'memories.allLocations': 'Todas las ubicaciones',
'memories.addPhotos': 'Añadir fotos',
'memories.linkAlbum': 'Vincular álbum',
'memories.selectAlbum': 'Seleccionar álbum de Immich',
'memories.selectAlbumMultiple': 'Seleccionar álbum',
'memories.noAlbums': 'No se encontraron álbumes',
'memories.syncAlbum': 'Sincronizar álbum',
'memories.unlinkAlbum': 'Desvincular',
'memories.photos': 'fotos',
'memories.selectPhotos': 'Seleccionar fotos de Immich',
'memories.selectPhotosMultiple': 'Seleccionar fotos',
'memories.selectHint': 'Toca las fotos para seleccionarlas.',
'memories.selected': 'seleccionado(s)',
'memories.addSelected': 'Añadir {count} fotos',
'memories.alreadyAdded': 'Añadido',
'memories.private': 'Privado',
'memories.stopSharing': 'Dejar de compartir',
'memories.tripDates': 'Fechas del viaje',
'memories.allPhotos': 'Todas las fotos',
'memories.confirmShareTitle': '¿Compartir con los miembros del viaje?',
'memories.confirmShareHint': '{count} fotos serán visibles para todos los miembros de este viaje. Puedes hacer fotos individuales privadas más tarde.',
'memories.confirmShareButton': 'Compartir fotos',
// Collab Addon
'collab.tabs.chat': 'Mensajes',
'collab.tabs.notes': 'Notas',
'collab.tabs.polls': 'Encuestas',
'collab.whatsNext.title': 'Qué viene ahora',
'collab.whatsNext.today': 'Hoy',
'collab.whatsNext.tomorrow': 'Mañana',
'collab.whatsNext.empty': 'No hay actividades próximas',
'collab.whatsNext.until': 'hasta',
'collab.whatsNext.emptyHint': 'Las actividades con hora aparecerán aquí',
'collab.chat.send': 'Enviar',
'collab.chat.placeholder': 'Escribe un mensaje...',
'collab.chat.empty': 'Empieza la conversación',
'collab.chat.emptyHint': 'Los mensajes se comparten con todos los miembros del viaje',
'collab.chat.emptyDesc': 'Comparte ideas, planes y novedades con tu grupo de viaje',
'collab.chat.today': 'Hoy',
'collab.chat.yesterday': 'Ayer',
'collab.chat.deletedMessage': 'eliminó un mensaje',
'collab.chat.reply': 'Responder',
'collab.chat.loadMore': 'Cargar mensajes anteriores',
'collab.chat.justNow': 'justo ahora',
'collab.chat.minutesAgo': 'hace {n} min',
'collab.chat.hoursAgo': 'hace {n} h',
'collab.notes.title': 'Notas',
'collab.notes.new': 'Nueva nota',
'collab.notes.empty': 'Aún no hay notas',
'collab.notes.emptyHint': 'Empieza a capturar ideas y planes',
'collab.notes.all': 'Todas',
'collab.notes.titlePlaceholder': 'Título de la nota',
'collab.notes.contentPlaceholder': 'Escribe algo...',
'collab.notes.categoryPlaceholder': 'Categoría',
'collab.notes.newCategory': 'Nueva categoría...',
'collab.notes.category': 'Categoría',
'collab.notes.noCategory': 'Sin categoría',
'collab.notes.color': 'Color',
'collab.notes.save': 'Guardar',
'collab.notes.cancel': 'Cancelar',
'collab.notes.edit': 'Editar',
'collab.notes.delete': 'Eliminar',
'collab.notes.pin': 'Fijar',
'collab.notes.unpin': 'Desfijar',
'collab.notes.daysAgo': 'hace {n} d',
'collab.notes.categorySettings': 'Gestionar categorías',
'collab.notes.create': 'Crear',
'collab.notes.website': 'Sitio web',
'collab.notes.websitePlaceholder': 'https://...',
'collab.notes.attachFiles': 'Adjuntar archivos',
'collab.notes.noCategoriesYet': 'Aún no hay categorías',
'collab.notes.emptyDesc': 'Crea una nota para empezar',
'collab.polls.title': 'Encuestas',
'collab.polls.new': 'Nueva encuesta',
'collab.polls.empty': 'Aún no hay encuestas',
'collab.polls.emptyHint': 'Pregunta al grupo y votad juntos',
'collab.polls.question': 'Pregunta',
'collab.polls.questionPlaceholder': '¿Qué deberíamos hacer?',
'collab.polls.addOption': '+ Añadir opción',
'collab.polls.optionPlaceholder': 'Opción {n}',
'collab.polls.create': 'Crear encuesta',
'collab.polls.close': 'Cerrar',
'collab.polls.closed': 'Cerrada',
'collab.polls.votes': '{n} votos',
'collab.polls.vote': '{n} voto',
'collab.polls.multipleChoice': 'Selección múltiple',
'collab.polls.multiChoice': 'Selección múltiple',
'collab.polls.deadline': 'Fecha límite',
'collab.polls.option': 'Opción',
'collab.polls.options': 'Opciones',
'collab.polls.delete': 'Eliminar',
'collab.polls.closedSection': 'Cerradas',
// Files management (2.6.2)
'files.trash': 'Papelera',
'files.trashEmpty': 'La papelera está vacía',
'files.emptyTrash': 'Vaciar papelera',
'files.restore': 'Restaurar',
'files.star': 'Destacar',
'files.unstar': 'Quitar destacado',
'files.assign': 'Asignar',
'files.assignTitle': 'Asignar archivo',
'files.assignPlace': 'Lugar',
'files.assignBooking': 'Reserva',
'files.unassigned': 'Sin asignar',
'files.unlink': 'Eliminar vínculo',
'files.noteLabel': 'Nota',
'files.notePlaceholder': 'Añadir una nota...',
'files.toast.trashed': 'Movido a la papelera',
'files.toast.restored': 'Archivo restaurado',
'files.toast.trashEmptied': 'Papelera vaciada',
'files.toast.assigned': 'Archivo asignado',
'files.toast.assignError': 'Error al asignar',
'files.toast.restoreError': 'Error al restaurar',
'files.confirm.permanentDelete': 'Eliminar este archivo permanentemente? No se puede deshacer.',
'files.confirm.emptyTrash': 'Eliminar todos los archivos de la papelera? No se puede deshacer.',
// Reservation metadata (2.6.2)
'reservations.meta.airline': 'Aerolínea',
'reservations.meta.flightNumber': 'N° de vuelo',
'reservations.meta.from': 'Desde',
'reservations.meta.to': 'Hasta',
'reservations.needsReview': 'Revisar',
'reservations.needsReviewHint': 'No se pudo identificar el aeropuerto automáticamente — por favor confirma la ubicación.',
'reservations.searchLocation': 'Buscar estación, puerto, dirección...',
'airport.searchPlaceholder': 'Código o ciudad del aeropuerto (ej. FRA)',
'map.connections': 'Conexiones',
'map.showConnections': 'Mostrar rutas de reservas',
'map.hideConnections': 'Ocultar rutas de reservas',
'settings.bookingLabels': 'Etiquetas de rutas de reservas',
'settings.bookingLabelsHint': 'Muestra nombres de estaciones / aeropuertos en el mapa. Desactivado, solo se muestra el icono.',
'reservations.meta.trainNumber': 'N° de tren',
'reservations.meta.platform': 'Andén',
'reservations.meta.seat': 'Asiento',
'reservations.meta.checkIn': 'Registro de entrada',
'reservations.meta.checkInUntil': 'Check-in hasta',
'reservations.meta.checkOut': 'Registro de salida',
'reservations.meta.linkAccommodation': 'Alojamiento',
'reservations.meta.pickAccommodation': 'Vincular con alojamiento',
'reservations.meta.noAccommodation': 'Ninguno',
'reservations.meta.hotelPlace': 'Alojamiento',
'reservations.meta.pickHotel': 'Seleccionar alojamiento',
'reservations.meta.fromDay': 'Desde',
'reservations.meta.toDay': 'Hasta',
'reservations.meta.selectDay': 'Seleccionar día',
// OIDC-only mode (2.6.2)
'admin.oidcOnlyMode': 'Desactivar autenticación por contraseña',
'admin.oidcOnlyModeHint': 'Si está activado, solo se permite el inicio de sesión con SSO. El inicio de sesión y registro con contraseña se bloquean.',
'login.oidcOnly': 'La autenticación por contraseña está desactivada. Por favor, inicia sesión con tu proveedor SSO.',
'login.oidcLoggedOut': 'Has cerrado sesión. Vuelve a iniciar sesión con tu proveedor SSO.',
// Settings (2.6.2)
'settings.currentPasswordRequired': 'La contraseña actual es obligatoria',
'settings.passwordWeak': 'La contraseña debe contener mayúsculas, minúsculas, números y un carácter especial',
// Permissions
'admin.tabs.permissions': 'Permisos',
'perm.title': 'Configuración de permisos',
'perm.subtitle': 'Controla quién puede realizar acciones en la aplicación',
'perm.saved': 'Configuración de permisos guardada',
'perm.resetDefaults': 'Restablecer valores predeterminados',
'perm.customized': 'personalizado',
'perm.level.admin': 'Solo administrador',
'perm.level.tripOwner': 'Propietario del viaje',
'perm.level.tripMember': 'Miembros del viaje',
'perm.level.everybody': 'Todos',
'perm.cat.trip': 'Gestión de viajes',
'perm.cat.members': 'Gestión de miembros',
'perm.cat.files': 'Archivos',
'perm.cat.content': 'Contenido y horario',
'perm.cat.extras': 'Presupuesto, equipaje y colaboración',
'perm.action.trip_create': 'Crear viajes',
'perm.action.trip_edit': 'Editar detalles del viaje',
'perm.action.trip_delete': 'Eliminar viajes',
'perm.action.trip_archive': 'Archivar / desarchivar viajes',
'perm.action.trip_cover_upload': 'Subir imagen de portada',
'perm.action.member_manage': 'Añadir / eliminar miembros',
'perm.action.file_upload': 'Subir archivos',
'perm.action.file_edit': 'Editar metadatos del archivo',
'perm.action.file_delete': 'Eliminar archivos',
'perm.action.place_edit': 'Añadir / editar / eliminar lugares',
'perm.action.day_edit': 'Editar días, notas y asignaciones',
'perm.action.reservation_edit': 'Gestionar reservas',
'perm.action.budget_edit': 'Gestionar presupuesto',
'perm.action.packing_edit': 'Gestionar listas de equipaje',
'perm.action.collab_edit': 'Colaboración (notas, encuestas, chat)',
'perm.action.share_manage': 'Gestionar enlaces compartidos',
'perm.actionHint.trip_create': 'Quién puede crear nuevos viajes',
'perm.actionHint.trip_edit': 'Quién puede cambiar el nombre, fechas, descripción y moneda del viaje',
'perm.actionHint.trip_delete': 'Quién puede eliminar permanentemente un viaje',
'perm.actionHint.trip_archive': 'Quién puede archivar o desarchivar un viaje',
'perm.actionHint.trip_cover_upload': 'Quién puede subir o cambiar la imagen de portada',
'perm.actionHint.member_manage': 'Quién puede invitar o eliminar miembros del viaje',
'perm.actionHint.file_upload': 'Quién puede subir archivos a un viaje',
'perm.actionHint.file_edit': 'Quién puede editar descripciones y enlaces de archivos',
'perm.actionHint.file_delete': 'Quién puede mover archivos a la papelera o eliminarlos permanentemente',
'perm.actionHint.place_edit': 'Quién puede añadir, editar o eliminar lugares',
'perm.actionHint.day_edit': 'Quién puede editar días, notas de días y asignaciones de lugares',
'perm.actionHint.reservation_edit': 'Quién puede crear, editar o eliminar reservas',
'perm.actionHint.budget_edit': 'Quién puede crear, editar o eliminar partidas del presupuesto',
'perm.actionHint.packing_edit': 'Quién puede gestionar artículos de equipaje y bolsas',
'perm.actionHint.collab_edit': 'Quién puede crear notas, encuestas y enviar mensajes',
'perm.actionHint.share_manage': 'Quién puede crear o eliminar enlaces compartidos públicos',
// Undo
'undo.button': 'Deshacer',
'undo.tooltip': 'Deshacer: {action}',
'undo.assignPlace': 'Lugar asignado al día',
'undo.removeAssignment': 'Lugar eliminado del día',
'undo.reorder': 'Lugares reordenados',
'undo.optimize': 'Ruta optimizada',
'undo.deletePlace': 'Lugar eliminado',
'undo.moveDay': 'Lugar movido a otro día',
'undo.lock': 'Bloqueo de lugar activado/desactivado',
'undo.importGpx': 'Importación GPX',
'undo.importKeyholeMarkup': 'Importación KMZ/KML',
'undo.importGoogleList': 'Importación de Google Maps',
'undo.importNaverList': 'Importación de Naver Maps',
// Notifications
'notifications.title': 'Notificaciones',
'notifications.markAllRead': 'Marcar todo como leído',
'notifications.deleteAll': 'Eliminar todo',
'notifications.showAll': 'Ver todas las notificaciones',
'notifications.empty': 'Sin notificaciones',
'notifications.emptyDescription': '¡Estás al día!',
'notifications.all': 'Todas',
'notifications.unreadOnly': 'No leídas',
'notifications.markRead': 'Marcar como leída',
'notifications.markUnread': 'Marcar como no leída',
'notifications.delete': 'Eliminar',
'notifications.system': 'Sistema',
'notifications.synologySessionCleared.title': 'Synology Photos desconectado',
'notifications.synologySessionCleared.text': 'Tu servidor o cuenta ha cambiado — ve a Configuración para probar la conexión de nuevo.',
'memories.error.loadAlbums': 'Error al cargar los álbumes',
'memories.error.linkAlbum': 'Error al vincular el álbum',
'memories.error.unlinkAlbum': 'Error al desvincular el álbum',
'memories.error.syncAlbum': 'Error al sincronizar el álbum',
'memories.error.loadPhotos': 'Error al cargar las fotos',
'memories.error.addPhotos': 'Error al agregar las fotos',
'memories.error.removePhoto': 'Error al eliminar la foto',
'memories.error.toggleSharing': 'Error al actualizar el uso compartido',
'undo.addPlace': 'Lugar agregado',
'undo.done': 'Deshecho: {action}',
'notifications.test.title': 'Notificación de prueba de {actor}',
'notifications.test.text': 'Esta es una notificación de prueba simple.',
'notifications.test.booleanTitle': '{actor} solicita tu aprobación',
'notifications.test.booleanText': 'Notificación de prueba booleana.',
'notifications.test.accept': 'Aprobar',
'notifications.test.decline': 'Rechazar',
'notifications.test.navigateTitle': 'Mira esto',
'notifications.test.navigateText': 'Notificación de prueba de navegación.',
'notifications.test.goThere': 'Ir allí',
'notifications.test.adminTitle': 'Difusión de administrador',
'notifications.test.adminText': '{actor} envió una notificación de prueba a todos los administradores.',
'notifications.test.tripTitle': '{actor} publicó en tu viaje',
'notifications.test.tripText': 'Notificación de prueba para el viaje "{trip}".',
// Todo
'todo.subtab.packing': 'Lista de equipaje',
'todo.subtab.todo': 'Por hacer',
'todo.completed': 'completado(s)',
'todo.filter.all': 'Todo',
'todo.filter.open': 'Abierto',
'todo.filter.done': 'Hecho',
'todo.uncategorized': 'Sin categoría',
'todo.namePlaceholder': 'Nombre de la tarea',
'todo.descriptionPlaceholder': 'Descripción (opcional)',
'todo.unassigned': 'Sin asignar',
'todo.noCategory': 'Sin categoría',
'todo.hasDescription': 'Con descripción',
'todo.addItem': 'Nueva tarea',
'todo.sidebar.sortBy': 'Ordenar por',
'todo.priority': 'Prioridad',
'todo.newCategoryLabel': 'nueva',
'budget.categoriesLabel': 'categorías',
'todo.newCategory': 'Nombre de la categoría',
'todo.addCategory': 'Añadir categoría',
'todo.newItem': 'Nueva tarea',
'todo.empty': 'Aún no hay tareas. ¡Añade una tarea para empezar!',
'todo.filter.my': 'Mis tareas',
'todo.filter.overdue': 'Vencida',
'todo.sidebar.tasks': 'Tareas',
'todo.sidebar.categories': 'Categorías',
'todo.detail.title': 'Tarea',
'todo.detail.description': 'Descripción',
'todo.detail.category': 'Categoría',
'todo.detail.dueDate': 'Fecha límite',
'todo.detail.assignedTo': 'Asignado a',
'todo.detail.delete': 'Eliminar',
'todo.detail.save': 'Guardar cambios',
'todo.detail.create': 'Crear tarea',
'todo.detail.priority': 'Prioridad',
'todo.detail.noPriority': 'Ninguna',
'todo.sortByPrio': 'Prioridad',
// Notification system (added from feat/notification-system)
'settings.notifyVersionAvailable': 'Nueva versión disponible',
'settings.notificationPreferences.noChannels': 'No hay canales de notificación configurados. Pide a un administrador que configure notificaciones por correo o webhook.',
'settings.webhookUrl.label': 'URL del webhook',
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
'settings.webhookUrl.hint': 'Introduce tu URL de webhook de Discord, Slack o personalizada para recibir notificaciones.',
'settings.webhookUrl.saved': 'URL del webhook guardada',
'settings.webhookUrl.test': 'Probar',
'settings.webhookUrl.testSuccess': 'Webhook de prueba enviado correctamente',
'settings.webhookUrl.testFailed': 'Error al enviar el webhook de prueba',
'settings.ntfyUrl.topicLabel': 'Tema de Ntfy',
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
'settings.ntfyUrl.serverLabel': 'URL del servidor Ntfy (opcional)',
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
'settings.ntfyUrl.hint': 'Introduce tu tema de Ntfy para recibir notificaciones push. Deja el servidor en blanco para usar el predeterminado configurado por tu administrador.',
'settings.ntfyUrl.tokenLabel': 'Token de acceso (opcional)',
'settings.ntfyUrl.tokenHint': 'Requerido para temas protegidos con contraseña.',
'settings.ntfyUrl.saved': 'Configuración de Ntfy guardada',
'settings.ntfyUrl.test': 'Probar',
'settings.ntfyUrl.testSuccess': 'Notificación de prueba de Ntfy enviada correctamente',
'settings.ntfyUrl.testFailed': 'Error en la notificación de prueba de Ntfy',
'settings.ntfyUrl.tokenCleared': 'Token de acceso eliminado',
'settings.notificationPreferences.inapp': 'In-App',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'Las notificaciones in-app siempre están activas y no se pueden desactivar globalmente.',
'admin.notifications.adminWebhookPanel.title': 'Webhook de admin',
'admin.notifications.adminWebhookPanel.hint': 'Este webhook se usa exclusivamente para notificaciones de admin (ej. alertas de versión). Es independiente de los webhooks de usuario y se activa automáticamente si hay una URL configurada.',
'admin.notifications.adminWebhookPanel.saved': 'URL del webhook de admin guardada',
'admin.notifications.adminWebhookPanel.testSuccess': 'Webhook de prueba enviado correctamente',
'admin.notifications.adminWebhookPanel.testFailed': 'Error al enviar el webhook de prueba',
'admin.notifications.adminWebhookPanel.alwaysOnHint': 'El webhook de admin se activa automáticamente si hay una URL configurada',
'admin.notifications.ntfy': 'Ntfy',
'admin.ntfy.hint': 'Permite a los usuarios configurar sus propios temas ntfy para notificaciones push. Establece el servidor predeterminado a continuación para rellenar automáticamente los ajustes del usuario.',
'admin.notifications.testNtfy': 'Enviar Ntfy de prueba',
'admin.notifications.testNtfySuccess': 'Ntfy de prueba enviado correctamente',
'admin.notifications.testNtfyFailed': 'Error al enviar el Ntfy de prueba',
'admin.notifications.adminNtfyPanel.title': 'Ntfy de admin',
'admin.notifications.adminNtfyPanel.hint': 'Este tema Ntfy se usa exclusivamente para notificaciones de admin (ej. alertas de versión). Es independiente de los temas por usuario y siempre se activa cuando está configurado.',
'admin.notifications.adminNtfyPanel.serverLabel': 'URL del servidor Ntfy',
'admin.notifications.adminNtfyPanel.serverHint': 'También se usa como servidor predeterminado para las notificaciones ntfy de los usuarios. Déjalo en blanco para usar ntfy.sh. Los usuarios pueden cambiarlo en sus propios ajustes.',
'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh',
'admin.notifications.adminNtfyPanel.topicLabel': 'Tema de admin',
'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts',
'admin.notifications.adminNtfyPanel.tokenLabel': 'Token de acceso (opcional)',
'admin.notifications.adminNtfyPanel.tokenCleared': 'Token de acceso de admin eliminado',
'admin.notifications.adminNtfyPanel.saved': 'Configuración de Ntfy de admin guardada',
'admin.notifications.adminNtfyPanel.test': 'Enviar Ntfy de prueba',
'admin.notifications.adminNtfyPanel.testSuccess': 'Ntfy de prueba enviado correctamente',
'admin.notifications.adminNtfyPanel.testFailed': 'Error al enviar el Ntfy de prueba',
'admin.notifications.adminNtfyPanel.alwaysOnHint': 'El Ntfy de admin siempre se activa cuando hay un tema configurado',
'admin.notifications.adminNotificationsHint': 'Configura qué canales entregan notificaciones de admin (ej. alertas de versión). El webhook se activa automáticamente si hay una URL de webhook de admin configurada.',
'admin.notifications.tripReminders.title': 'Recordatorios de viaje',
'admin.notifications.tripReminders.hint': 'Envía una notificación de recordatorio antes de que comience un viaje (requiere días de recordatorio configurados en el viaje).',
'admin.notifications.tripReminders.enabled': 'Recordatorios de viaje activados',
'admin.notifications.tripReminders.disabled': 'Recordatorios de viaje desactivados',
'admin.tabs.notifications': 'Notificaciones',
'notifications.versionAvailable.title': 'Actualización disponible',
'notifications.versionAvailable.text': 'TREK {version} ya está disponible.',
'notifications.versionAvailable.button': 'Ver detalles',
'notif.test.title': '[Test] Notificación',
'notif.test.simple.text': 'Esta es una notificación de prueba simple.',
'notif.test.boolean.text': '¿Aceptas esta notificación de prueba?',
'notif.test.navigate.text': 'Haz clic abajo para ir al panel de control.',
// Notifications
'notif.trip_invite.title': 'Invitación al viaje',
'notif.trip_invite.text': '{actor} te invitó a {trip}',
'notif.booking_change.title': 'Reserva actualizada',
'notif.booking_change.text': '{actor} actualizó una reserva en {trip}',
'notif.trip_reminder.title': 'Recordatorio de viaje',
'notif.trip_reminder.text': '¡Tu viaje {trip} se acerca!',
'notif.vacay_invite.title': 'Invitación Vacay Fusion',
'notif.vacay_invite.text': '{actor} te invitó a fusionar planes de vacaciones',
'notif.photos_shared.title': 'Fotos compartidas',
'notif.photos_shared.text': '{actor} compartió {count} foto(s) en {trip}',
'notif.collab_message.title': 'Nuevo mensaje',
'notif.collab_message.text': '{actor} envió un mensaje en {trip}',
'notif.packing_tagged.title': 'Asignación de equipaje',
'notif.packing_tagged.text': '{actor} te asignó a {category} en {trip}',
'notif.version_available.title': 'Nueva versión disponible',
'notif.version_available.text': 'TREK {version} ya está disponible',
'notif.action.view_trip': 'Ver viaje',
'notif.action.view_collab': 'Ver mensajes',
'notif.action.view_packing': 'Ver equipaje',
'notif.action.view_photos': 'Ver fotos',
'notif.action.view_vacay': 'Ver Vacay',
'notif.action.view_admin': 'Ir al admin',
'notif.action.view': 'Ver',
'notif.action.accept': 'Aceptar',
'notif.action.decline': 'Rechazar',
'notif.generic.title': 'Notificación',
'notif.generic.text': 'Tienes una nueva notificación',
'notif.dev.unknown_event.title': '[DEV] Evento desconocido',
'notif.dev.unknown_event.text': 'El tipo de evento "{event}" no está registrado en EVENT_NOTIFICATION_CONFIG',
// Journey, Dashboard, Nav, DayPlan
'common.justNow': 'justo ahora',
'common.hoursAgo': 'hace {count}h',
'common.daysAgo': 'hace {count}d',
'journey.search.placeholder': 'Buscar viajes…',
'journey.search.noResults': 'Ningún viaje coincide con "{query}"',
'journey.title': 'Travesía',
'journey.subtitle': 'Registra tus viajes en tiempo real',
'journey.new': 'Nueva travesía',
'journey.create': 'Crear',
'journey.titlePlaceholder': '¿A dónde vas?',
'journey.empty': 'Aún no hay travesías',
'journey.emptyHint': 'Empieza a documentar tu próximo viaje',
'journey.deleted': 'Travesía eliminada',
'journey.createError': 'No se pudo crear la travesía',
'journey.deleteError': 'No se pudo eliminar la travesía',
'journey.deleteConfirmTitle': 'Eliminar',
'journey.deleteConfirmMessage': '¿Eliminar "{title}"? Esta acción no se puede deshacer.',
'journey.deleteConfirmGeneric': '¿Estás seguro de que quieres eliminar esto?',
'journey.notFound': 'Travesía no encontrada',
'journey.photos': 'Fotos',
'journey.timelineEmpty': 'Aún no hay paradas',
'journey.timelineEmptyHint': 'Añade un registro de ubicación o escribe una entrada de diario para empezar',
'journey.status.draft': 'Borrador',
'journey.status.active': 'Activa',
'journey.status.completed': 'Completada',
'journey.status.upcoming': 'Próxima',
'journey.status.archived': 'Archivado',
'journey.checkin.add': 'Registrar ubicación',
'journey.checkin.namePlaceholder': 'Nombre del lugar',
'journey.checkin.notesPlaceholder': 'Notas (opcional)',
'journey.checkin.save': 'Guardar',
'journey.checkin.error': 'No se pudo guardar el registro',
'journey.entry.add': 'Diario',
'journey.entry.edit': 'Editar entrada',
'journey.entry.titlePlaceholder': 'Título (opcional)',
'journey.entry.bodyPlaceholder': '¿Qué pasó hoy?',
'journey.entry.save': 'Guardar',
'journey.entry.error': 'No se pudo guardar la entrada',
'journey.photo.add': 'Foto',
'journey.photo.uploadError': 'Error al subir',
'journey.share.share': 'Compartir',
'journey.share.public': 'Público',
'journey.share.linkCopied': 'Enlace público copiado',
'journey.share.disabled': 'Compartir público desactivado',
'journey.editor.titlePlaceholder': 'Dale un nombre a este momento...',
'journey.editor.bodyPlaceholder': 'Cuenta la historia de este día...',
'journey.editor.placePlaceholder': 'Ubicación (opcional)',
'journey.editor.tagsPlaceholder': 'Etiquetas: joya oculta, mejor comida, hay que volver...',
'journey.visibility.private': 'Privado',
'journey.visibility.shared': 'Compartido',
'journey.visibility.public': 'Público',
'journey.emptyState.title': 'Tu historia empieza aquí',
'journey.emptyState.subtitle': 'Registra una ubicación o escribe tu primera entrada de diario',
'journey.frontpage.subtitle': 'Convierte tus viajes en historias que nunca olvidarás',
'journey.frontpage.createJourney': 'Crear travesía',
'journey.frontpage.activeJourney': 'Travesía activa',
'journey.frontpage.allJourneys': 'Todas las travesías',
'journey.frontpage.journeys': 'travesías',
'journey.frontpage.createNew': 'Crear una nueva travesía',
'journey.frontpage.createNewSub': 'Elige viajes, escribe historias, comparte tus aventuras',
'journey.frontpage.live': 'En vivo',
'journey.frontpage.synced': 'Sincronizado',
'journey.frontpage.continueWriting': 'Seguir escribiendo',
'journey.frontpage.updated': 'Actualizado {time}',
'journey.frontpage.suggestionLabel': 'El viaje acaba de terminar',
'journey.frontpage.suggestionText': 'Convierte <strong>{title}</strong> en una travesía',
'journey.frontpage.dismiss': 'Descartar',
'journey.frontpage.journeyName': 'Nombre de la travesía',
'journey.frontpage.namePlaceholder': 'p. ej. Sudeste Asiático 2026',
'journey.frontpage.selectTrips': 'Seleccionar viajes',
'journey.frontpage.tripsSelected': 'viajes seleccionados',
'journey.frontpage.trips': 'viajes',
'journey.frontpage.placesImported': 'lugares serán importados',
'journey.frontpage.places': 'lugares',
'journey.detail.backToJourney': 'Volver a la travesía',
'journey.detail.syncedWithTrips': 'Sincronizado con viajes',
'journey.detail.addEntry': 'Añadir entrada',
'journey.detail.newEntry': 'Nueva entrada',
'journey.detail.editEntry': 'Editar entrada',
'journey.detail.noEntries': 'Aún no hay entradas',
'journey.detail.noEntriesHint': 'Añade un viaje para empezar con entradas preliminares',
'journey.detail.noPhotos': 'Aún no hay fotos',
'journey.detail.noPhotosHint': 'Sube fotos a las entradas o explora tu biblioteca de Immich/Synology',
'journey.detail.journeyStats': 'Estadísticas de la travesía',
'journey.detail.syncedTrips': 'Viajes sincronizados',
'journey.detail.noTripsLinked': 'Aún no hay viajes vinculados',
'journey.detail.contributors': 'Colaboradores',
'journey.detail.readMore': 'Leer más',
'journey.detail.prosCons': 'Pros y contras',
'journey.detail.photos': 'fotos',
'journey.detail.day': 'Día {number}',
'journey.detail.places': 'lugares',
'journey.stats.days': 'Días',
'journey.stats.cities': 'Ciudades',
'journey.stats.entries': 'Entradas',
'journey.stats.photos': 'Fotos',
'journey.stats.places': 'Lugares',
'journey.skeletons.show': 'Mostrar sugerencias',
'journey.skeletons.hide': 'Ocultar sugerencias',
'journey.verdict.lovedIt': 'Me encantó',
'journey.verdict.couldBeBetter': 'Podría mejorar',
'journey.synced.places': 'lugares',
'journey.synced.synced': 'sincronizado',
'journey.editor.uploadPhotos': 'Subir fotos',
'journey.editor.uploading': 'Subiendo...',
'journey.editor.fromGallery': 'Desde galería',
'journey.editor.allPhotosAdded': 'Todas las fotos ya fueron añadidas',
'journey.editor.writeStory': 'Escribe tu historia...',
'journey.editor.prosCons': 'Pros y contras',
'journey.editor.pros': 'Pros',
'journey.editor.cons': 'Contras',
'journey.editor.proPlaceholder': 'Algo genial...',
'journey.editor.conPlaceholder': 'No tan genial...',
'journey.editor.addAnother': 'Añadir otro',
'journey.editor.date': 'Fecha',
'journey.editor.location': 'Ubicación',
'journey.editor.searchLocation': 'Buscar ubicación...',
'journey.editor.mood': 'Estado de ánimo',
'journey.editor.weather': 'Clima',
'journey.editor.photoFirst': '1º',
'journey.editor.makeFirst': 'Hacer 1º',
'journey.editor.searching': 'Buscando...',
'journey.mood.amazing': 'Increíble',
'journey.mood.good': 'Bien',
'journey.mood.neutral': 'Neutral',
'journey.mood.rough': 'Difícil',
'journey.weather.sunny': 'Soleado',
'journey.weather.partly': 'Parcialmente nublado',
'journey.weather.cloudy': 'Nublado',
'journey.weather.rainy': 'Lluvioso',
'journey.weather.stormy': 'Tormentoso',
'journey.weather.cold': 'Nevado',
'journey.trips.linkTrip': 'Vincular viaje',
'journey.trips.searchTrip': 'Buscar viaje',
'journey.trips.searchPlaceholder': 'Nombre del viaje o destino...',
'journey.trips.noTripsAvailable': 'No hay viajes disponibles',
'journey.trips.link': 'Vincular',
'journey.trips.tripLinked': 'Viaje vinculado',
'journey.trips.linkFailed': 'No se pudo vincular el viaje',
'journey.trips.addTrip': 'Añadir viaje',
'journey.trips.unlinkTrip': 'Desvincular viaje',
'journey.trips.unlinkMessage': '¿Desvincular "{title}"? Todas las entradas y fotos sincronizadas de este viaje se eliminarán permanentemente. Esta acción no se puede deshacer.',
'journey.trips.unlink': 'Desvincular',
'journey.trips.tripUnlinked': 'Viaje desvinculado',
'journey.trips.unlinkFailed': 'No se pudo desvincular el viaje',
'journey.trips.noTripsLinkedSettings': 'No hay viajes vinculados',
'journey.contributors.invite': 'Invitar colaborador',
'journey.contributors.searchUser': 'Buscar usuario',
'journey.contributors.searchPlaceholder': 'Nombre de usuario o correo...',
'journey.contributors.noUsers': 'No se encontraron usuarios',
'journey.contributors.role': 'Rol',
'journey.contributors.added': 'Colaborador añadido',
'journey.contributors.addFailed': 'No se pudo añadir al colaborador',
'journey.share.publicShare': 'Compartir público',
'journey.share.createLink': 'Crear enlace para compartir',
'journey.share.linkCreated': 'Enlace para compartir creado',
'journey.share.createFailed': 'No se pudo crear el enlace',
'journey.share.copy': 'Copiar',
'journey.share.copied': '¡Copiado!',
'journey.share.timeline': 'Cronología',
'journey.share.gallery': 'Galería',
'journey.share.map': 'Mapa',
'journey.share.removeLink': 'Eliminar enlace para compartir',
'journey.share.linkDeleted': 'Enlace para compartir eliminado',
'journey.share.deleteFailed': 'No se pudo eliminar',
'journey.share.updateFailed': 'No se pudo actualizar',
// Journey — Invite
'journey.invite.role': 'Rol',
'journey.invite.viewer': 'Lector',
'journey.invite.editor': 'Editor',
'journey.invite.invite': 'Invitar',
'journey.invite.inviting': 'Invitando...',
'journey.settings.title': 'Ajustes de la travesía',
'journey.settings.coverImage': 'Imagen de portada',
'journey.settings.changeCover': 'Cambiar portada',
'journey.settings.addCover': 'Añadir imagen de portada',
'journey.settings.name': 'Nombre',
'journey.settings.subtitle': 'Subtítulo',
'journey.settings.subtitlePlaceholder': 'p. ej. Tailandia, Vietnam y Camboya',
'journey.settings.endJourney': 'Archivar viaje',
'journey.settings.reopenJourney': 'Restaurar viaje',
'journey.settings.archived': 'Viaje archivado',
'journey.settings.reopened': 'Viaje reabierto',
'journey.settings.endDescription': 'Oculta la insignia En Vivo. Puedes reabrirlo en cualquier momento.',
'journey.settings.delete': 'Eliminar',
'journey.settings.deleteJourney': 'Eliminar travesía',
'journey.settings.deleteMessage': '¿Eliminar "{title}"? Todas las entradas y fotos se perderán.',
'journey.settings.saved': 'Ajustes guardados',
'journey.settings.saveFailed': 'No se pudo guardar',
'journey.settings.coverUpdated': 'Portada actualizada',
'journey.settings.coverFailed': 'Error al subir',
'journey.settings.failedToDelete': 'Error al eliminar',
'journey.entries.deleteTitle': 'Eliminar entrada',
'journey.photosUploaded': '{count} fotos subidas',
'journey.photosAdded': '{count} fotos añadidas',
'journey.public.notFound': 'No encontrado',
'journey.public.notFoundMessage': 'Esta travesía no existe o el enlace ha expirado.',
'journey.public.readOnly': 'Solo lectura · Travesía pública',
'journey.public.tagline': 'Kit de recursos y exploración de viajes',
'journey.public.sharedVia': 'Compartido mediante',
'journey.public.madeWith': 'Hecho con',
'journey.pdf.journeyBook': 'Libro de travesía',
'journey.pdf.madeWith': 'Hecho con TREK',
'journey.pdf.day': 'Día',
'journey.pdf.theEnd': 'Fin',
'journey.pdf.saveAsPdf': 'Guardar como PDF',
'journey.pdf.pages': 'páginas',
'journey.picker.tripPeriod': 'Período del viaje',
'journey.picker.dateRange': 'Rango de fechas',
'journey.picker.allPhotos': 'Todas las fotos',
'journey.picker.albums': 'Álbumes',
'journey.picker.selected': 'seleccionados',
'journey.picker.addTo': 'Añadir a',
'journey.picker.newGallery': 'Nueva galería',
'journey.picker.selectAll': 'Seleccionar todo',
'journey.picker.deselectAll': 'Deseleccionar todo',
'journey.picker.noAlbums': 'No se encontraron álbumes',
'journey.picker.selectDate': 'Seleccionar fecha',
'journey.picker.search': 'Buscar',
'dashboard.greeting.morning': 'Buenos días,',
'dashboard.greeting.afternoon': 'Buenas tardes,',
'dashboard.greeting.evening': 'Buenas noches,',
'dashboard.mobile.liveNow': 'En vivo ahora',
'dashboard.mobile.tripProgress': 'Progreso del viaje',
'dashboard.mobile.daysLeft': '{count} días restantes',
'dashboard.mobile.places': 'Lugares',
'dashboard.mobile.buddies': 'Compañeros',
'dashboard.mobile.newTrip': 'Nuevo viaje',
'dashboard.mobile.currency': 'Moneda',
'dashboard.mobile.timezone': 'Zona horaria',
'dashboard.mobile.upcomingTrips': 'Próximos viajes',
'dashboard.mobile.yourTrips': 'Tus viajes',
'dashboard.mobile.trips': 'viajes',
'dashboard.mobile.starts': 'Comienza',
'dashboard.mobile.duration': 'Duración',
'dashboard.mobile.day': 'día',
'dashboard.mobile.days': 'días',
'dashboard.mobile.ongoing': 'En curso',
'dashboard.mobile.startsToday': 'Comienza hoy',
'dashboard.mobile.tomorrow': 'Mañana',
'dashboard.mobile.inDays': 'En {count} días',
'dashboard.mobile.inMonths': 'En {count} meses',
'dashboard.mobile.completed': 'Completado',
'dashboard.mobile.currencyConverter': 'Conversor de monedas',
'nav.profile': 'Perfil',
'nav.bottomSettings': 'Ajustes',
'nav.bottomAdmin': 'Administración',
'nav.bottomLogout': 'Cerrar sesión',
'nav.bottomAdminBadge': 'Admin',
'dayplan.mobile.addPlace': 'Añadir lugar',
'dayplan.mobile.searchPlaces': 'Buscar lugares...',
'dayplan.mobile.allAssigned': 'Todos los lugares asignados',
'dayplan.mobile.noMatch': 'Sin coincidencias',
'dayplan.mobile.createNew': 'Crear nuevo lugar',
'admin.addons.catalog.journey.name': 'Travesía',
'admin.addons.catalog.journey.description': 'Seguimiento de viajes y diario de viajero con registros de ubicación, fotos e historias diarias',
// OAuth scope groups
'oauth.scope.group.trips': 'Viajes',
'oauth.scope.group.places': 'Lugares',
'oauth.scope.group.atlas': 'Atlas',
'oauth.scope.group.packing': 'Equipaje',
'oauth.scope.group.todos': 'Tareas',
'oauth.scope.group.budget': 'Presupuesto',
'oauth.scope.group.reservations': 'Reservas',
'oauth.scope.group.collab': 'Colaboración',
'oauth.scope.group.notifications': 'Notificaciones',
'oauth.scope.group.vacay': 'Vacaciones',
'oauth.scope.group.geo': 'Geo',
'oauth.scope.group.weather': 'Clima',
// OAuth scope labels & descriptions
'oauth.scope.trips:read.label': 'Ver viajes e itinerarios',
'oauth.scope.trips:read.description': 'Leer viajes, días, notas y miembros',
'oauth.scope.trips:write.label': 'Editar viajes e itinerarios',
'oauth.scope.trips:write.description': 'Crear y actualizar viajes, días, notas y gestionar miembros',
'oauth.scope.trips:delete.label': 'Eliminar viajes',
'oauth.scope.trips:delete.description': 'Eliminar viajes permanentemente — esta acción es irreversible',
'oauth.scope.trips:share.label': 'Gestionar enlaces de compartir',
'oauth.scope.trips:share.description': 'Crear, actualizar y revocar enlaces públicos de viaje',
'oauth.scope.places:read.label': 'Ver lugares y datos del mapa',
'oauth.scope.places:read.description': 'Leer lugares, asignaciones de días, etiquetas y categorías',
'oauth.scope.places:write.label': 'Gestionar lugares',
'oauth.scope.places:write.description': 'Crear, actualizar y eliminar lugares, asignaciones y etiquetas',
'oauth.scope.atlas:read.label': 'Ver Atlas',
'oauth.scope.atlas:read.description': 'Leer países visitados, regiones y lista de deseos',
'oauth.scope.atlas:write.label': 'Gestionar Atlas',
'oauth.scope.atlas:write.description': 'Marcar países y regiones como visitados, gestionar lista de deseos',
'oauth.scope.packing:read.label': 'Ver listas de equipaje',
'oauth.scope.packing:read.description': 'Leer artículos, maletas y responsables de categoría',
'oauth.scope.packing:write.label': 'Gestionar listas de equipaje',
'oauth.scope.packing:write.description': 'Agregar, actualizar, eliminar, marcar y reordenar artículos y maletas',
'oauth.scope.todos:read.label': 'Ver listas de tareas',
'oauth.scope.todos:read.description': 'Leer tareas del viaje y responsables de categoría',
'oauth.scope.todos:write.label': 'Gestionar listas de tareas',
'oauth.scope.todos:write.description': 'Crear, actualizar, marcar, eliminar y reordenar tareas',
'oauth.scope.budget:read.label': 'Ver presupuesto',
'oauth.scope.budget:read.description': 'Leer partidas de presupuesto y desglose de gastos',
'oauth.scope.budget:write.label': 'Gestionar presupuesto',
'oauth.scope.budget:write.description': 'Crear, actualizar y eliminar partidas de presupuesto',
'oauth.scope.reservations:read.label': 'Ver reservas',
'oauth.scope.reservations:read.description': 'Leer reservas y detalles de alojamiento',
'oauth.scope.reservations:write.label': 'Gestionar reservas',
'oauth.scope.reservations:write.description': 'Crear, actualizar, eliminar y reordenar reservas',
'oauth.scope.collab:read.label': 'Ver colaboración',
'oauth.scope.collab:read.description': 'Leer notas colaborativas, encuestas y mensajes',
'oauth.scope.collab:write.label': 'Gestionar colaboración',
'oauth.scope.collab:write.description': 'Crear, actualizar y eliminar notas, encuestas y mensajes',
'oauth.scope.notifications:read.label': 'Ver notificaciones',
'oauth.scope.notifications:read.description': 'Leer notificaciones y conteos no leídos',
'oauth.scope.notifications:write.label': 'Gestionar notificaciones',
'oauth.scope.notifications:write.description': 'Marcar notificaciones como leídas y responderlas',
'oauth.scope.vacay:read.label': 'Ver planes de vacaciones',
'oauth.scope.vacay:read.description': 'Leer datos de planificación, entradas y estadísticas de vacaciones',
'oauth.scope.vacay:write.label': 'Gestionar planes de vacaciones',
'oauth.scope.vacay:write.description': 'Crear y gestionar entradas de vacaciones, festivos y planes de equipo',
'oauth.scope.geo:read.label': 'Mapas y geocodificación',
'oauth.scope.geo:read.description': 'Buscar lugares, resolver URLs de mapa y geocodificar coordenadas',
'oauth.scope.weather:read.label': 'Previsiones meteorológicas',
'oauth.scope.weather:read.description': 'Obtener previsiones meteorológicas para lugares y fechas del viaje',
// System notices
'system_notice.welcome_v1.title': 'Bienvenido a TREK',
'system_notice.welcome_v1.body': 'Tu planificador de viajes todo en uno. Crea itinerarios, comparte viajes con amigos y mantente organizado, online o sin conexión.',
'system_notice.welcome_v1.cta_label': 'Planificar un viaje',
'system_notice.welcome_v1.hero_alt': 'Destino de viaje pintoresco con la interfaz de TREK',
'system_notice.welcome_v1.highlight_plan': 'Itinerarios día a día para cualquier viaje',
'system_notice.welcome_v1.highlight_share': 'Colabora con tus compañeros de viaje',
'system_notice.welcome_v1.highlight_offline': 'Funciona sin conexión en móvil',
'system_notice.dev_test_modal.title': '[Dev] Test notice',
'system_notice.dev_test_modal.body': 'This is a dev-only test notice.',
'system_notice.pager.prev': 'Aviso anterior',
'system_notice.pager.next': 'Siguiente aviso',
'system_notice.pager.counter': '{current} / {total}',
'system_notice.pager.goto': 'Ir al aviso {n}',
'system_notice.pager.position': 'Aviso {current} de {total}',
// System notices — 3.0.0 upgrade
'system_notice.v3_photos.title': 'Las fotos se han movido en 3.0',
'system_notice.v3_photos.body': '**Fotos** en el Planificador de Viajes han sido eliminadas. Tus fotos están a salvo — TREK nunca modificó tu biblioteca de Immich o Synology.\n\nLas fotos ahora viven en el addon **Journey**. Journey es opcional — si aún no está disponible, pide a tu admin que lo active en Admin → Complementos.',
'system_notice.v3_journey.title': 'Conoce Journey — diario de viaje',
'system_notice.v3_journey.body': 'Documenta tus viajes como historias enriquecidas con cronologías, galerías de fotos y mapas interactivos.',
'system_notice.v3_journey.cta_label': 'Abrir Journey',
'system_notice.v3_journey.highlight_timeline': 'Cronología y galería por día',
'system_notice.v3_journey.highlight_photos': 'Importar desde Immich o Synology',
'system_notice.v3_journey.highlight_share': 'Compartir públicamente — sin inicio de sesión',
'system_notice.v3_journey.highlight_export': 'Exportar como libro de fotos PDF',
'system_notice.v3_features.title': 'Más novedades en 3.0',
'system_notice.v3_features.body': 'Otras cosas que vale la pena conocer de esta versión.',
'system_notice.v3_features.highlight_dashboard': 'Rediseño del panel mobile-first',
'system_notice.v3_features.highlight_offline': 'Modo sin conexión completo como PWA',
'system_notice.v3_features.highlight_search': 'Autocompletado de lugares en tiempo real',
'system_notice.v3_features.highlight_import': 'Importar lugares desde archivos KMZ/KML',
// System notices — MCP OAuth 2.1 upgrade
'system_notice.v3_mcp.title': 'MCP: actualización OAuth 2.1',
'system_notice.v3_mcp.body': 'La integración MCP ha sido completamente renovada. OAuth 2.1 es ahora el método de autenticación recomendado. Los tokens estáticos (trek_…) están obsoletos y se eliminarán en una versión futura.',
'system_notice.v3_mcp.highlight_oauth': 'OAuth 2.1 recomendado (mcp-remote)',
'system_notice.v3_mcp.highlight_scopes': '24 ámbitos de permisos granulares',
'system_notice.v3_mcp.highlight_deprecated': 'Tokens estáticos trek_ obsoletos',
'system_notice.v3_mcp.highlight_tools': 'Herramientas y prompts ampliados',
// System notices — personal thank you
'system_notice.v3_thankyou.title': 'Una nota personal de mi parte',
'system_notice.v3_thankyou.body': 'Antes de seguir — quiero tomarme un momento.\n\nTREK empezó como un proyecto personal que construí para mis propios viajes. Nunca imaginé que crecería hasta convertirse en algo en lo que 4.000 de vosotros confían para planificar sus aventuras. Cada estrella, cada issue, cada solicitud de funcionalidad — los leo todos, y son lo que me mantiene en pie durante las noches largas entre un trabajo a jornada completa y la universidad.\n\nQuiero que sepáis: TREK siempre será open source, siempre self-hosted, siempre vuestro. Sin rastreo, sin suscripciones, sin letra pequeña. Solo una herramienta hecha por alguien que ama viajar tanto como vosotros.\n\nUn agradecimiento especial a [jubnl](https://github.com/jubnl) — te has convertido en un colaborador increíble. Mucho de lo que hace grande la versión 3.0 lleva tu huella. Gracias por creer en este proyecto cuando todavía era un borrador.\n\nY a cada uno de vosotros que reportó un bug, tradujo un texto, compartió TREK con un amigo o simplemente lo usó para planificar un viaje — **gracias**. Vosotros sois la razón de que esto exista.\n\nPor muchas más aventuras juntos.\n\n— Maurice\n\n---\n\n[Únete a la comunidad en Discord](https://discord.gg/7Q6M6jDwzf)\n\nSi TREK mejora tus viajes, un [pequeño café](https://ko-fi.com/mauriceboe) siempre mantiene las luces encendidas.',
}
export default es