Files
TREK/client/src/i18n/translations/es.ts
jubnl 0c99eb1d07 chore: merge dev branch, resolve conflicts for migrations and translations
- migrations.ts: keep dev's migrations 69 (place_regions) + 70 (visited_regions), renumber our notification_channel_preferences migration to 71 and drop-old-table to 72
- translations: use dev values for existing keys, add notification system keys unique to this branch

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 03:46:53 +02:00

1685 lines
84 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.cancel': 'Cancelar',
'common.delete': 'Eliminar',
'common.edit': 'Editar',
'common.add': 'Añadir',
'common.loading': 'Cargando...',
'common.import': 'Importar',
'common.error': 'Error',
'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',
'trips.reminder': 'Recordatorio',
'trips.reminderNone': 'Ninguno',
'trips.reminderDay': 'día',
'trips.reminderDays': 'días',
'trips.reminderCustom': 'Personalizado',
'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.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.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.events': 'Eventos de notificación',
'admin.notifications.eventsHint': 'Elige qué eventos activan notificaciones para todos los usuarios.',
'admin.notifications.configureFirst': 'Configura primero los ajustes SMTP o webhook a continuación, luego activa los eventos.',
'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.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.account': 'Cuenta',
'settings.about': 'Acerca de',
'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.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': 'Registro de 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.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.bagTracking.title': 'Seguimiento de equipaje',
'admin.bagTracking.subtitle': 'Activar peso y asignación de equipaje para artículos de la lista',
'admin.tabs.config': 'Configuración',
'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': 'Tokens MCP',
'admin.mcpTokens.title': 'Tokens MCP',
'admin.mcpTokens.subtitle': 'Gestionar tokens de API de todos los usuarios',
'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',
// 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.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',
'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': 'Lists',
'trip.tabs.listsShort': 'Lists',
'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.importGpx': 'GPX',
'places.gpxImported': '{count} lugares importados desde GPX',
'places.gpxError': 'Error al importar GPX',
'places.importGoogleList': 'Lista Google',
'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.viewDetails': 'Ver detalles',
'places.urlResolved': 'Lugar importado desde URL',
'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.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.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.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 de alquiler',
'reservations.type.cruise': 'Crucero',
'reservations.type.event': 'Evento',
'reservations.type.tour': 'Tour',
'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': 'Price',
'reservations.budgetCategory': 'Budget category',
'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation',
'reservations.budgetCategoryAuto': 'Auto (from booking type)',
'reservations.budgetHint': 'A budget entry will be created automatically when saving.',
'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.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.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.assignUser': 'Asignar usuario',
'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.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)',
'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': 'Lists',
'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips',
'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.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': 'Check-in',
'day.checkOut': 'Check-out',
'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.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.immichUrl': 'URL del servidor Immich',
'memories.immichApiKey': 'Clave API',
'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 Immich guardada',
'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.noAlbums': 'No se encontraron álbumes',
'memories.syncAlbum': 'Sincronizar álbum',
'memories.unlinkAlbum': 'Desvincular',
'memories.photos': 'fotos',
'memories.selectPhotos': 'Seleccionar fotos de Immich',
'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.meta.trainNumber': 'N° de tren',
'reservations.meta.platform': 'Andén',
'reservations.meta.seat': 'Asiento',
'reservations.meta.checkIn': 'Check-in',
'reservations.meta.checkOut': 'Check-out',
'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.',
// 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.importGoogleList': 'Importación de Google 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',
'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': 'Packing List',
'todo.subtab.todo': 'To-Do',
'todo.completed': 'completed',
'todo.filter.all': 'All',
'todo.filter.open': 'Open',
'todo.filter.done': 'Done',
'todo.uncategorized': 'Uncategorized',
'todo.namePlaceholder': 'Task name',
'todo.descriptionPlaceholder': 'Description (optional)',
'todo.unassigned': 'Unassigned',
'todo.noCategory': 'No category',
'todo.hasDescription': 'Has description',
'todo.addItem': 'Add new task...',
'todo.newCategory': 'Category name',
'todo.addCategory': 'Add category',
'todo.newItem': 'New task',
'todo.empty': 'No tasks yet. Add a task to get started!',
'todo.filter.my': 'My Tasks',
'todo.filter.overdue': 'Overdue',
'todo.sidebar.tasks': 'Tasks',
'todo.sidebar.categories': 'Categories',
'todo.detail.title': 'Task',
'todo.detail.description': 'Description',
'todo.detail.category': 'Category',
'todo.detail.dueDate': 'Due date',
'todo.detail.assignedTo': 'Assigned to',
'todo.detail.delete': 'Delete',
'todo.detail.save': 'Save changes',
'todo.detail.create': 'Create task',
'todo.detail.priority': 'Priority',
'todo.detail.noPriority': 'None',
'todo.sortByPrio': 'Priority',
// Notification system (added from feat/notification-system)
'settings.notifyVersionAvailable': 'New version available',
'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.',
'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.save': 'Guardar',
'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.notificationPreferences.inapp': 'In-App',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.',
'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.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.tabs.notifications': 'Notifications',
'admin.tabs.notificationChannels': 'Canales de notificación',
'admin.tabs.adminNotifications': 'Notificaciones de admin',
'notifications.versionAvailable.title': 'Update Available',
'notifications.versionAvailable.text': 'TREK {version} is now available.',
'notifications.versionAvailable.button': 'View Details',
'notif.test.title': '[Test] Notification',
'notif.test.simple.text': 'This is a simple test notification.',
'notif.test.boolean.text': 'Do you accept this test notification?',
'notif.test.navigate.text': 'Click below to navigate to the dashboard.',
// 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] Unknown Event',
'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG',
}
}
export default es