diff --git a/client/src/i18n/translations/es.js b/client/src/i18n/translations/es.js deleted file mode 100644 index 2146dfb..0000000 --- a/client/src/i18n/translations/es.js +++ /dev/null @@ -1,1061 +0,0 @@ -const es = { - // 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.currency': 'Divisa', - 'dashboard.timezone': 'Zonas horarias', - 'dashboard.localTime': 'Hora local', - '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.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.on': 'Activado', - 'settings.off': 'Desactivado', - '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.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.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.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.tabs.settings': 'Ajustes', - 'admin.allowRegistration': 'Permitir el registro', - 'admin.allowRegistrationHint': 'Los nuevos usuarios pueden registrarse por sí mismos', - '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', - - // 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.tripHint': 'Disponible como pestaña dentro de cada viaje', - 'admin.addons.globalHint': 'Disponible como sección independiente en la navegación principal', - '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.', - - // GitHub - 'admin.tabs.github': 'GitHub', - '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.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.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.', - - // 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', - - // 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.memories': 'Recuerdos', - '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', - - // Places Sidebar - 'places.addPlace': 'Añadir lugar/actividad', - '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.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': 'Hotel', - '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.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.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', - - // 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.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.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.keepLabel': 'Eliminar copias antiguas después de', - '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.title': 'Recuerdos', - '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.dropHere': 'Suelta aquí las fotos...', - 'photos.dropTitle': 'Suelta aquí las fotos', - 'photos.fileHint': 'JPG, PNG, GIF, WebP · máx. 10 MB · hasta 30 fotos', - 'photos.selectedCount': '{count} foto(s) seleccionada(s)', - 'photos.sharedAlbum': '{count} recuerdos en este álbum compartido', - 'photos.sharedAlbumFor': '{count} recuerdos en {trip}', - 'photos.allPlaces': 'Todos los lugares', - 'photos.view.grid': 'Cuadrícula', - 'photos.view.day': 'Por día', - 'photos.view.place': 'Por lugar', - 'photos.stats.total': 'Fotos', - 'photos.stats.days': 'Días', - 'photos.stats.places': 'Lugares', - 'photos.stats.latest': 'Última subida', - 'photos.sectionCount': '{count} foto(s)', - 'photos.ungrouped': 'Sin clasificar', - 'photos.featured': 'Recuerdo destacado', - 'photos.coverFallback': 'Portada del álbum compartido', - 'photos.coverHint': 'Una imagen destacada para este álbum de viaje', - 'photos.mapTitle': 'Mapa de recuerdos', - 'photos.mapHint': 'Explora los lugares vinculados en el mismo mapa que usamos en el plan', - 'photos.mapEmpty': 'Vincula tus fotos a lugares para verlas ubicadas en el mapa.', - 'photos.linkDay': 'Vincular día', - 'photos.noDay': 'Sin día', - 'photos.linkPlace': 'Vincular lugar', - 'photos.noPlace': 'Sin lugar', - 'photos.captionLabel': 'Pie de foto (para todas)', - 'photos.captionPlaceholder': 'Pie de foto opcional...', - 'photos.addCaption': 'Añadir un pie de foto...', - 'photos.uploadN': 'Subida de {n} foto(s)', - 'admin.addons.catalog.memories.name': 'Recuerdos', - 'admin.addons.catalog.memories.description': 'Álbumes de fotos compartidos para cada viaje', - '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}', - 'planner.notes': 'Notas', - 'planner.addDayNote': 'Añadir notas para este día...', - - // 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', - - // 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', -} - -export default es diff --git a/client/src/i18n/translations/es.ts b/client/src/i18n/translations/es.ts index 9e11b4e..132ac0b 100644 --- a/client/src/i18n/translations/es.ts +++ b/client/src/i18n/translations/es.ts @@ -1 +1,1113 @@ -export { default } from './es.js' +const es: Record = { + // 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.currency': 'Divisa', + 'dashboard.timezone': 'Zonas horarias', + 'dashboard.localTime': 'Hora local', + '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.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.on': 'Activado', + 'settings.off': 'Desactivado', + '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.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.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.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.tabs.settings': 'Ajustes', + 'admin.allowRegistration': 'Permitir el registro', + 'admin.allowRegistrationHint': 'Los nuevos usuarios pueden registrarse por sí mismos', + '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', + + // 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.tripHint': 'Disponible como pestaña dentro de cada viaje', + 'admin.addons.globalHint': 'Disponible como sección independiente en la navegación principal', + '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.', + + // GitHub + 'admin.tabs.github': 'GitHub', + '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.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.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.', + + // 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', + + // 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.memories': 'Recuerdos', + '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', + + // Places Sidebar + 'places.addPlace': 'Añadir lugar/actividad', + '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.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': 'Hotel', + '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.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.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', + + // 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.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.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.keepLabel': 'Eliminar copias antiguas después de', + '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.title': 'Recuerdos', + '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.dropHere': 'Suelta aquí las fotos...', + 'photos.dropTitle': 'Suelta aquí las fotos', + 'photos.fileHint': 'JPG, PNG, GIF, WebP · máx. 10 MB · hasta 30 fotos', + 'photos.selectedCount': '{count} foto(s) seleccionada(s)', + 'photos.sharedAlbum': '{count} recuerdos en este álbum compartido', + 'photos.sharedAlbumFor': '{count} recuerdos en {trip}', + 'photos.allPlaces': 'Todos los lugares', + 'photos.view.grid': 'Cuadrícula', + 'photos.view.day': 'Por día', + 'photos.view.place': 'Por lugar', + 'photos.stats.total': 'Fotos', + 'photos.stats.days': 'Días', + 'photos.stats.places': 'Lugares', + 'photos.stats.latest': 'Última subida', + 'photos.sectionCount': '{count} foto(s)', + 'photos.ungrouped': 'Sin clasificar', + 'photos.featured': 'Recuerdo destacado', + 'photos.coverFallback': 'Portada del álbum compartido', + 'photos.coverHint': 'Una imagen destacada para este álbum de viaje', + 'photos.mapTitle': 'Mapa de recuerdos', + 'photos.mapHint': 'Explora los lugares vinculados en el mismo mapa que usamos en el plan', + 'photos.mapEmpty': 'Vincula tus fotos a lugares para verlas ubicadas en el mapa.', + 'photos.linkDay': 'Vincular día', + 'photos.noDay': 'Sin día', + 'photos.linkPlace': 'Vincular lugar', + 'photos.noPlace': 'Sin lugar', + 'photos.captionLabel': 'Pie de foto (para todas)', + 'photos.captionPlaceholder': 'Pie de foto opcional...', + 'photos.addCaption': 'Añadir un pie de foto...', + 'photos.uploadN': 'Subida de {n} foto(s)', + 'admin.addons.catalog.memories.name': 'Recuerdos', + 'admin.addons.catalog.memories.description': 'Álbumes de fotos compartidos para cada viaje', + '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}', + 'planner.notes': 'Notas', + 'planner.addDayNote': 'Añadir notas para este día...', + + // 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', + + // 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': 'Hotel', + 'reservations.meta.pickHotel': 'Seleccionar hotel', + '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