1395 lines
68 KiB
TypeScript
1395 lines
68 KiB
TypeScript
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.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.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.archive': 'Archivar',
|
||
'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.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',
|
||
'admin.smtp.title': 'Correo y notificaciones',
|
||
'admin.smtp.hint': 'Configuración SMTP para notificaciones por correo. Opcional: URL webhook para Discord, Slack, etc.',
|
||
'admin.smtp.testButton': 'Enviar correo de prueba',
|
||
'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.username': 'Usuario',
|
||
'settings.email': 'Correo',
|
||
'settings.role': 'Rol',
|
||
'settings.roleAdmin': 'Administrador',
|
||
'settings.oidcLinked': 'Vinculado con',
|
||
'settings.changePassword': 'Cambiar contraseña',
|
||
'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.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 NOMAD.',
|
||
'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 6 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 NOMAD.',
|
||
'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': 'NOMAD 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': 'NOMAD {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': 'NOMAD 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 NOMAD 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',
|
||
'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 NOMAD',
|
||
'vacay.owner': 'Propietario',
|
||
'vacay.shareEmailPlaceholder': 'Correo electrónico del usuario de NOMAD',
|
||
'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 NOMAD 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.markVisited': 'Marcar como visitado',
|
||
'atlas.markVisitedHint': 'Añadir este país a tu lista de visitados',
|
||
'atlas.addToBucket': 'Añadir a lista de deseos',
|
||
'atlas.addPoi': 'Añadir lugar',
|
||
'atlas.bucketNamePlaceholder': 'Nombre (país, ciudad, lugar…)',
|
||
'atlas.month': 'Mes',
|
||
'atlas.year': 'Año',
|
||
'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.budget': 'Presupuesto',
|
||
'trip.tabs.files': 'Archivos',
|
||
'trip.loading': 'Cargando viaje...',
|
||
'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': 'Importar GPX',
|
||
'places.gpxImported': '{count} lugares importados desde GPX',
|
||
'places.gpxError': 'Error al importar GPX',
|
||
'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',
|
||
|
||
// 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)',
|
||
|
||
// Budget
|
||
'budget.title': 'Presupuesto',
|
||
'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.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 1–28 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': 'Equipaje',
|
||
'admin.addons.catalog.packing.description': 'Prepara tu equipaje con listas de comprobación para cada viaje',
|
||
'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.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.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.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 y números',
|
||
}
|
||
|
||
export default es
|