/** * Spanish — translated from locales/en.js. * * Register: formal (usted). * `hub`, `node` and `GEK` are left in English: they name the CLI * (`meshbay-node`), node.toml and the docs, which are English throughout. */ export default { // Nav 'nav.toggle_menu': 'Mostrar el menú', 'nav.light_mode': 'Tema claro', 'nav.dark_mode': 'Tema oscuro', 'nav.logout': 'Cerrar sesión', 'nav.login': 'Iniciar sesión', // Sidebar 'sidebar.my_groups': 'Mis grupos', 'sidebar.no_groups': 'Aún no hay grupos', 'sidebar.discover': 'Descubrir', 'sidebar.public_groups': 'Grupos públicos', // Login 'login.title': 'Iniciar sesión', 'login.username': 'Nombre de usuario', 'login.password': 'Contraseña', 'login.submit': 'Iniciar sesión', 'login.loading': 'Iniciando sesión...', 'login.no_account': '¿No tiene cuenta?', 'login.register_link': 'Crear una cuenta', 'login.forgot': '¿Olvidó su frase de contraseña?', 'reset.title': 'Restablecer la frase de contraseña', 'reset.request_intro': 'Introduzca su nombre de usuario y el correo de la cuenta. Si coinciden, se envía un código de restablecimiento a esa dirección.', 'reset.send_code': 'Enviar código', 'reset.form_intro': 'Introduzca el código de su correo y elija una nueva frase de contraseña. Si tiene su clave de recuperación, añádala para restaurar también el acceso a sus grupos.', 'reset.code': 'Código de restablecimiento', 'reset.recovery_key': 'Clave de recuperación (opcional)', 'reset.recovery_key_hint': 'Déjelo en blanco si no la tiene. Sin ella, su inicio de sesión se restaura, pero hay que volver a unirse a cada grupo.', 'reset.new_pass': 'Nueva frase de contraseña', 'reset.new_pass_repeat': 'Repetir la nueva frase de contraseña', 'reset.submit': 'Restablecer la frase de contraseña', 'reset.working': 'Restaurando sus identidades de grupo…', 'reset.signin_restored': 'Su inicio de sesión se ha restaurado.', 'reset.groups_restored': 'Sus identidades de grupo se restauraron en todos los nodos alcanzables.', 'reset.no_recovery': 'Sus identidades de grupo no se restauraron. Para cada grupo, pida a su operador que le quite la fijación y le envíe un nuevo código de invitación, y vuelva a unirse.', 'reset.needs_operator': 'Estos grupos aún requieren acción: pida a cada operador que le quite la fijación y le envíe un nuevo código:', 'reset.go_app': 'Ir a la aplicación', 'reset.back_to_login': 'Volver al inicio de sesión', 'reset.err_unsupported': 'El restablecimiento de la frase de contraseña necesita el módulo de cifrado del navegador, que no está disponible aquí.', // Register 'register.title': 'Crear una cuenta', 'register.username': 'Nombre de usuario', 'register.email': 'Correo electrónico', 'register.password': 'Frase de contraseña (mínimo 12 caracteres)', 'register.confirm': 'Confirmar contraseña', 'register.submit': 'Crear la cuenta', 'register.loading': 'Creando la cuenta...', 'register.has_account': '¿Ya tiene una cuenta?', 'register.login_link': 'Iniciar sesión', 'register.recovery_title': 'Guarde su clave de recuperación', 'register.recovery_intro': 'Esta clave restaura sus identidades de grupo si alguna vez olvida su frase de contraseña. Guárdela en un gestor de contraseñas o en un lugar seguro: solo se muestra una vez y el hub nunca la ve.', 'register.recovery_copy': 'Copiar', 'register.recovery_copied': 'Copiado', 'register.recovery_warning': 'Si pierde tanto su frase de contraseña como esta clave, sus archivos permanecen en sus nodos pero se vuelve a unir a cada grupo con una nueva identidad.', 'register.recovery_saved': 'He guardado mi clave de recuperación en un lugar seguro.', 'register.recovery_continue': 'Continuar', 'register.recovery_email_opt': 'Enviarme también esta clave de recuperación por correo como copia de seguridad', 'register.recovery_emailed': 'También se ha enviado una copia a su correo electrónico, en el mismo mensaje que su código de verificación.', 'register.recovery_not_emailed': 'Esto no se envió por correo. Guárdela ahora: es la única vez que se muestra.', 'register.success_title': 'Verifique su correo', 'register.success_msg': 'Se ha enviado un código de verificación a su dirección de correo electrónico. Introdúzcalo a continuación para activar su cuenta.', 'register.go_login': 'Ir al inicio de sesión', 'register.code_placeholder': 'Código de verificación', 'register.verify_btn': 'Verificar', 'register.verifying': 'Verificando…', 'register.verified_title': 'Correo verificado', 'register.verified_msg': 'Su cuenta está activa. Ya puede iniciar sesión.', 'register.resend': 'Reenviar código', 'register.resend_sent': 'Se ha enviado un nuevo código.', 'login.pending_verification': 'Su correo electrónico aún no ha sido verificado. Revise su bandeja de entrada para obtener el código de verificación.', 'login.verify_link': 'Verificar correo', 'register.err_mismatch': 'Las contraseñas no coinciden', 'register.err_min_len': { one: 'Use al menos {n} carácter', other: 'Use al menos {n} caracteres', }, 'register.err_too_weak': 'Demasiado fácil de adivinar. Su frase de contraseña es lo ' + 'que protege sus claves allí donde están almacenadas — unas cuantas palabras sin ' + 'relación entre sí funcionan muy bien.', 'register.strength': 'Solidez: unos {bits} bits. Protege la copia de sus claves que ' + 'se guarda en los nodes a los que se une, así que conviene acertar.', // Home 'home.welcome': 'Bienvenido a MeshBay', 'home.no_groups': 'Todavía no es miembro de ningún grupo.', 'home.browse_prefix': 'Explore los ', 'home.browse_link': 'grupos públicos', 'home.browse_suffix': ' o pida a un administrador de grupo que le invite.', 'home.my_groups': 'Mis grupos', // Explore 'explore.title': 'Grupos públicos', 'explore.search': 'Buscar grupos...', 'explore.loading': 'Cargando...', 'explore.empty': 'No hay grupos públicos disponibles.', 'explore.create_group': 'Crear un grupo', 'explore.join': 'Unirse', 'explore.member': 'Miembro', 'explore.disabled': "This hub does not have public groups.", // Group page 'group.default_name': 'Grupo', 'group.tab_files': 'Archivos', 'group.tab_chat': 'Chat', 'group.tab_video': 'Vídeos', 'group.tab_music': 'Música', 'group.tab_photos': 'Fotos', 'group.tab_members': 'Miembros', 'group.tab_settings': "Ajustes", 'members.danger_leave_hint': "Perderá el acceso a los archivos y al chat de este grupo.", 'members.uploads_title': "Subidas", 'members.uploads_on': "Los miembros pueden añadir archivos", 'members.uploads_off': "Solo usted puede añadir archivos", 'members.uploads_disable': "Desactivar", 'members.uploads_enable': "Activar", 'members.uploads_hint': "Se aplica a todos menos a usted. El nodo rechaza la subida por sí mismo: no se trata de ocultar un botón.", 'members.apps_title': "Aplicaciones", 'members.apps_hint': "Qué partes de este grupo ven los miembros. Al menos una debe permanecer activada.", 'members.apps_need_one': "Al menos una aplicación debe permanecer activada.", 'members.danger_delete_hint': "El grupo desaparece para todos sus miembros. No se puede deshacer.", 'group.filter': 'Filtrar archivos...', 'group.refresh_index': 'Actualizar la lista', 'group.col_name': 'Nombre', 'group.col_size': 'Tamaño', 'group.col_type': 'Tipo', 'group.col_date': 'Fecha', 'group.empty_filter': 'Ningún archivo coincide con el filtro', 'group.empty_dir': 'Esta carpeta está vacía', 'group.download': 'Descargar', 'group.play': 'Reproducir', 'group.offline_title': 'Ningún node está en línea para este grupo en este momento.', 'group.offline_hint': 'Los archivos aparecerán cuando se conecte un node que aloje ' + 'este grupo.', 'group.upload': 'Subir', 'group.mkdir': 'Nueva carpeta', 'group.mkdir_prompt': 'Nombre de la nueva carpeta:', 'device.add_title': 'This browser is not linked to this node yet', 'device.add_hint': 'Your account is known here, but this browser holds a different key. Approve it from a device already linked — no operator needed.', 'device.add_btn': 'Get a linking code', 'device.add_show': 'Type this code into a device already linked to this node, within the hour:', 'device.mine_title': 'Your devices on this node', 'device.mine_hint': 'Each browser or client you use here holds its own key. They are separate from your devices on other nodes.', 'device.mine_empty': 'No device is linked here yet.', 'device.this_one': 'this one', 'device.revoke': 'Remove', 'device.revoke_confirm': 'Remove this device? It will lose access to this node until it is linked again.', 'device.approve_hint': 'Linking a new device? Enter the code it is showing.', 'device.approve_btn': 'Approve', 'device.approved': 'Device linked.', 'group.root_unavailable': '(no disponible — la unidad está desconectada)', 'group.view': 'Ver', 'group.delete': 'Eliminar', 'group.delete_confirm': '¿Eliminar {name}?', 'group.delete_group': 'Eliminar el grupo', 'group.delete_group_confirm': '¿Eliminar «{name}» de forma permanente y expulsar a ' + 'todos los miembros? Los archivos que están en el node se conservan.', 'group.err_transport': 'Módulo de transporte no cargado', // Status 'status.idle': 'Inactivo', 'status.discovering': 'Buscando nodes...', 'status.connecting': 'Conectando por WebRTC...', 'status.connecting_short': 'Conectando…', 'status.fetching': 'Obteniendo el índice...', 'status.files': { one: '{n} archivo', other: '{n} archivos', }, 'status.offline': 'Ningún node en línea', 'status.error': 'Error de conexión', // Chat 'chat.empty': 'Todavía no hay mensajes. ¡Empiece la conversación!', 'chat.placeholder': 'Escriba un mensaje...', 'chat.send': 'Enviar', 'chat.attach': 'Adjuntar archivo', // Video player 'video.loading': 'Cargando {name}...', 'video.buffering': 'Almacenando en búfer...', 'video.resumed_at': "Reanudado en {time}", 'video.from_start': "Empezar desde el principio", 'video.close': 'Cerrar (Esc)', 'preview.pdf_fallback': 'Este navegador no mostrará el PDF integrado. Descárguelo ' + 'en su lugar — en cualquier caso se descifró aquí.', 'group.upload_indexing': 'indexando…', 'video.err_transport': 'Transporte no conectado', 'video.err_mse': 'Códec no compatible con la reproducción en continuo: {codec}', 'video.mode_poster': 'Pósteres', 'video.mode_flat': 'Lista plana', 'video.filter_all': 'All', 'video.filter_movies': 'Movies', 'video.filter_series': 'Series', 'video.empty': 'No se encontraron vídeos.', 'video.no_root_configured': 'Aún no se ha definido una carpeta raíz de Vídeos para este grupo — un operador puede elegir una en Configuración.', 'music.no_root_configured': 'Aún no se ha definido una carpeta raíz de Música para este grupo — un operador puede elegir una en Configuración.', 'video.director': 'Director', 'video.specials': 'Especiales', 'video.season_n': 'Temporada {n}', 'video.episode_n': 'Episodio {n}', 'video.n_episodes': { one: '{n} episodio', other: '{n} episodios', }, 'video.fix_match': 'Corregir coincidencia…', 'video.search_title': 'Corregir la coincidencia de TMDB', 'video.search_placeholder': 'Buscar en TMDB…', 'video.search_button': 'Buscar', 'video.search_no_results': 'No se encontraron coincidencias.', 'video.search_apply_hint': 'Se aplica a todos los archivos agrupados actualmente bajo este título.', 'video.search_apply_hint_movie': 'Se aplica solo a este archivo.', 'video.source_file': 'Archivo: {name}', 'video.no_match': 'Sin coincidencia fiable en TMDB — se muestra el nombre del archivo.', 'video.rematch_one': 'Volver a asociar', // Música 'music.mode_grid': 'Álbumes', 'music.mode_flat': 'Lista plana', 'music.empty': 'No se encontró música.', 'music.unknown_album': 'Álbum desconocido', 'music.various': 'Varios', 'music.play_all': 'Reproducir todo', 'music.n_tracks': { one: '{n} pista', other: '{n} pistas', }, 'music.err_transport': 'Transporte no conectado', 'music.err_playback': 'Error de reproducción', 'music.err_transcode': 'Error al convertir el formato', 'music.player_play': 'Reproducir', 'music.player_pause': 'Pausa', 'music.player_prev': 'Anterior', 'music.player_next': 'Siguiente', 'music.player_shuffle': 'Aleatorio', 'music.player_repeat_off': 'Repetición desactivada', 'music.player_repeat_all': 'Repetir todo', 'music.player_repeat_one': 'Repetir una', 'music.player_volume': 'Volumen', 'music.player_close': 'Cerrar reproductor', 'music.player_queue': 'Cola actual', 'music.queue_title': 'Reproduciendo ahora', // Photos 'photo.empty': 'No se encontraron fotos.', 'photo.no_roots_configured': 'Aún no se han definido carpetas raíz de Fotos para este grupo — un operador puede elegir algunas en Configuración.', 'photo.root_album': '(nivel superior)', 'photo.n_photos': { one: '{n} foto', other: '{n} fotos', }, 'photo.back': 'Atrás', 'photo.prev': 'Anterior (←)', 'photo.next': 'Siguiente (→)', 'photo.zip_album': 'Descargar álbum como zip', 'photo.zoom_in': 'Acercar', 'photo.zoom_out': 'Alejar', 'photo.zoom_fit_title': 'Ajustar a la ventana', 'photo.zoom_fit_label': 'Ajustar', 'photo.zoom_100': 'Tamaño real (100%)', // LAN cast 'cast.start': 'Enviar a dispositivo', 'cast.stop': 'Detener envío', 'cast.copy_url': 'Copiar URL del stream', 'cast.copied': 'URL copiada', 'cast.scanning': 'Buscando dispositivos…', 'cast.no_devices': 'No se encontraron dispositivos', // Settings 'settings.title': 'Ajustes', 'settings.coming_soon': 'Próximamente.', 'settings.downloads': 'Descargas', 'settings.dl_auto': 'Guardar automáticamente', 'settings.dl_auto_hint': 'Los archivos van directamente a la carpeta que elija más ' + 'abajo, sin ningún diálogo. Descargar veinte archivos deja allí veinte archivos.', 'settings.dl_ask': 'Preguntar cada vez', 'settings.dl_ask_hint': 'Un diálogo «Guardar como» por archivo — uno por archivo, ' + 'también cuando descarga una selección.', 'settings.dl_folder': 'Carpeta: {name}', 'settings.dl_no_folder': 'Ninguna carpeta elegida — las descargas van adonde las ' + 'ponga su navegador', 'settings.dl_choose': 'Elegir carpeta', 'settings.dl_change': 'Cambiar', 'settings.dl_forget': 'Olvidar', 'settings.profile': 'Perfil', 'settings.username': 'Nombre de usuario', 'settings.email': 'Email', 'settings.email_save': 'Save', 'settings.email_saved': 'Correo actualizado', 'settings.email_code_sent': 'Se ha enviado un código de verificación a su nueva dirección de correo.', 'settings.email_code_placeholder': 'Código de verificación', 'settings.email_verify_btn': 'Verificar', 'settings.email_verifying': 'Verificando…', 'settings.email_verified': 'Dirección de correo cambiada con éxito.', 'settings.notif_global_disable': 'Disable all notifications', 'settings.notif_global_hint': 'When enabled, no notifications are created for any group.', 'settings.defaults': 'Valores predeterminados', 'settings.default_tab': 'Default tab', 'settings.default_tab_hint': 'Which tab opens first when you enter a group.', 'settings.music_keep_screen_on': 'Keep screen on during music playback', 'settings.music_keep_screen_on_hint': 'Prevents the phone from locking on its own while a track is playing.', 'settings.node_pins': 'Identidades de los nodes', 'settings.node_pins_hint': 'La clave de identidad de cada node se memoriza la ' + 'primera vez que se conecta. Si cambia, la conexión se rechaza — algo esperable ' + 'solo cuando un operador reinstala un node. Confírmelo con él antes de borrarla.', 'settings.node_pins_count': { one: '{n} fijada', other: '{n} fijadas', }, 'settings.node_pins_clear': 'Borrar las identidades fijadas', 'settings.passphrase': 'Frase de contraseña', 'settings.passphrase_hint': 'Cambia la frase de contraseña de esta cuenta. Sus claves de identidad se vuelven a cifrar en cada grupo cuyo nodo esté en línea; un grupo cuyo nodo esté fuera de línea tendrá que volver a unirse después.', 'settings.passphrase_change': 'Cambiar la frase de contraseña', 'settings.passphrase_current': 'Frase de contraseña actual', 'settings.passphrase_new': 'Nueva frase de contraseña', 'settings.passphrase_new_repeat': 'Repetir la nueva frase de contraseña', 'settings.continue': 'Continuar', 'settings.done': 'Listo', 'settings.passphrase_confirm_intro': 'Sus claves de identidad se volverán a cifrar ahora en cada grupo cuyo nodo se pueda alcanzar:', 'settings.passphrase_reachable': 'Actualizado ahora', 'settings.passphrase_unreachable': 'No se puede alcanzar', 'settings.passphrase_fallback_note': 'Para un grupo que no se pueda alcanzar, pida a su operador que le quite la fijación y le envíe un nuevo código de invitación, y vuelva a unirse. Sus archivos y mensajes no se pierden.', 'settings.passphrase_confirm_btn': 'Cambiarla', 'settings.passphrase_working': 'Volviendo a cifrar sus claves…', 'settings.passphrase_done': 'Frase de contraseña cambiada.', 'settings.passphrase_needs_operator': 'Estos grupos aún requieren acción: pida a cada operador que le quite la fijación y le envíe un nuevo código:', 'settings.pw_too_short': 'La nueva frase de contraseña debe tener al menos 12 caracteres.', 'settings.pw_mismatch': 'Las dos nuevas frases de contraseña no coinciden.', 'settings.pw_same': 'La nueva frase de contraseña debe ser distinta de la actual.', 'settings.pw_wrong_current': 'La frase de contraseña actual no es correcta. No se cambió nada.', 'settings.recovery': 'Clave de recuperación', 'settings.recovery_hint': 'Añade a cada grupo una copia de su identidad cifrada con su clave de recuperación. Hágalo una vez en cada navegador que use; sin ella, una frase de contraseña perdida obliga a volver a unirse a cada grupo a mano.', 'settings.recovery_loaded': 'Cargada en este navegador: los grupos nuevos quedan cubiertos automáticamente.', 'settings.recovery_open': 'Introducir la clave de recuperación', 'settings.recovery_input_ph': 'Pegue su clave de recuperación', 'settings.recovery_submit': 'Añadir copias de seguridad', 'settings.recovery_working': 'Actualizando sus grupos…', 'settings.recovery_done': 'Sus grupos ya tienen una copia de recuperación.', 'settings.recovery_partial': 'No se pudo contactar con estos grupos. Ábralos más tarde o vuelva a ejecutar esto:', 'settings.recovery_need_relogin': 'Cierre sesión y vuelva a entrar, luego inténtelo de nuevo.', 'settings.danger': 'Eliminar la cuenta', 'settings.delete_hint': 'Elimina su cuenta, sus pertenencias a grupos y sus ' + 'notificaciones del hub, y libera su nombre de usuario. No alcanza lo que vive ' + 'en los nodes: los archivos que subió se quedan donde los guarda su operador, y ' + 'cada node conserva la identidad que fijó para usted hasta que su operador la ' + 'retire. Los registros de conexión se guardan un año, como exige la ley.', 'settings.delete_account': 'Eliminar mi cuenta', 'settings.delete_confirm': 'Escriba su frase de contraseña para confirmar. ' + 'Esta acción no se puede deshacer.', 'settings.delete_confirm_btn': 'Eliminar definitivamente', 'settings.cancel': 'Cancelar', 'settings.appearance': 'Apariencia', 'settings.theme': 'Tema', 'settings.theme_light': 'Claro', 'settings.theme_dark': 'Oscuro', 'settings.theme_system': 'Sistema', 'settings.language': 'Idioma', 'settings.about': 'Acerca de', 'firstrun.title': 'Which hub?', 'firstrun.hint': 'A hub holds your account and introduces you to nodes. It never sees your files, your messages or your keys.', 'firstrun.btn': 'Continue', 'firstrun.checking': 'Checking…', 'firstrun.note': 'There is no default on purpose: this application only trusts a hub for its API, never for the interface, which ships with the application itself.', 'device.this_device': 'This device', 'settings.keys_heading': 'Keys on this device', 'settings.hub_heading': 'Hub', 'settings.hub_current': 'Currently', 'settings.hub_hint': 'Changing this signs you out and restarts the window.', 'settings.hub_change': 'Change', 'settings.keys_where': 'Protected by', 'settings.keys_unprotected': 'No system keyring is running, so your keys are encrypted with a key that is not a secret. Anyone who can read this machine’s files can read them. Start a keyring, or treat this device as untrusted.', 'settings.keys_unavailable': 'This system offers no key storage at all, so this device cannot be remembered — you will be asked for your passphrase each time. That is the safe outcome: nothing was stored unprotected.', 'settings.version': 'Versión', 'settings.protocol': 'Protocolo', 'settings.role': 'Rol', 'settings.groups': 'Notificaciones de grupo', 'settings.notifications': 'Notificaciones', 'settings.node_key': 'Vincular un node', 'settings.node_key_desc': 'Si administra un node MeshBay, pegue aquí su clave ' + 'pública Ed25519 para vincularlo a su cuenta. Encontrará esa clave en el panel ' + 'de administración de su node.', 'settings.node_key_placeholder': 'Pegue la clave pública Ed25519 del node (base64)', 'settings.node_key_submit': 'Vincular el node', 'settings.node_key_success': 'Node vinculado correctamente', 'settings.node_key_current': 'Clave del node vinculado', // Sidebar 'sidebar.create_group': 'Crear un grupo', 'sidebar.settings': 'Ajustes', 'sidebar.admin': 'Administración', // User menu 'usermenu.language': 'Idioma', 'usermenu.settings': 'Ajustes', 'usermenu.theme_light': 'Tema claro', 'usermenu.theme_dark': 'Tema oscuro', 'usermenu.logout': 'Cerrar sesión', // Admin panel 'admin.title': 'Administración', 'admin.tab_stats': 'Estadísticas', 'admin.tab_users': 'Usuarios', 'admin.tab_groups': 'Grupos', 'admin.tab_nodes': 'Nodes', 'admin.tab_logs': 'Registros', 'admin.col_observed_ip': 'Visto desde', 'admin.col_hint': 'Dirección anunciada', 'admin.col_last_seen': 'Último anuncio', 'admin.node_online': 'en línea', 'admin.node_offline': 'desconectado', 'admin.no_nodes': 'Ningún node registrado', 'admin.nodes_hint': '«Visto desde» es la dirección desde la que llegó el anuncio, ' + 'en una petición firmada con la clave del node — esa es la que sirve para ' + 'responder a un requerimiento. La dirección anunciada es la que el node cree que ' + 'es la suya, aprendida de un servidor STUN y enviada aquí; sirve para alcanzar el ' + 'node y no prueba nada.', 'admin.tab_blocklist': 'Lista de bloqueo', 'admin.tab_general': "General", 'admin.general_groups_heading': "Groups", 'admin.allow_public_groups_label': "Allow members to create public groups", 'admin.allow_public_groups_hint': "When off, new groups can only be private and invite-only. Existing public groups are left as they are — suspend them one by one from the Groups tab.", 'admin.settings_readonly': "Only an admin can change these settings.", // Admin stats 'admin.stat_users': 'Usuarios', 'admin.stat_groups': 'Grupos', 'admin.stat_nodes': 'Nodes', 'admin.stat_online': 'Nodes en línea', // Admin users 'admin.users_search': 'Buscar usuarios...', 'admin.col_username': 'Nombre de usuario', 'admin.col_role': 'Rol', 'admin.col_status': 'Estado', 'admin.col_created': 'Creación', 'admin.col_actions': 'Acciones', 'admin.col_email': 'Correo electrónico', 'admin.col_groups': 'Grupos', 'admin.no_users': 'No se ha encontrado ningún usuario', 'admin.btn_suspend': 'Suspender', 'admin.btn_unsuspend': 'Reactivar', 'admin.btn_revoke': "Revoke", 'admin.revoke_group_confirm': "Revoke the group \"{group}\"? This pushes a signed revocation to every node hosting it and cannot be undone from here. Suspend it instead if you only need to pause it.", 'admin.btn_details': 'Detalles', 'admin.btn_delete': 'Eliminar', 'admin.delete_confirm': '¿Eliminar la cuenta «{user}»? Esta acción no se puede ' + 'deshacer. Los archivos que subió permanecen en los nodes que los alojan, y cada ' + 'node conserva la identidad que fijó hasta que su operador la retire. La ' + 'suspensión es la opción reversible.', 'admin.user_detail': 'Detalles del usuario', 'admin.btn_close': 'Cerrar', 'admin.self_note': '(usted)', // Admin groups 'admin.col_name': 'Nombre', 'admin.col_visibility': 'Visibilidad', 'admin.col_members': 'Miembros', 'admin.no_groups': 'No se ha encontrado ningún grupo', // Admin logs 'admin.col_time': 'Hora', 'admin.col_event': 'Evento', 'admin.col_user': 'Usuario', 'admin.col_ip': 'IP', 'admin.col_detail': 'Detalle', 'admin.filter_all': 'Todos los eventos', 'admin.no_logs': 'No se ha encontrado ningún registro', 'admin.btn_load_more': 'Cargar más', // Admin blocklist 'admin.col_hash': 'Huella', 'admin.col_reason': 'Motivo', 'admin.col_date': 'Fecha', 'admin.col_added_by': 'Añadida por', 'admin.no_blocked': 'Ninguna huella bloqueada', 'admin.add_hash': 'Añadir una huella a la lista de bloqueo', 'admin.hash_placeholder': 'huella blake3 (64 caracteres hexadecimales)', 'admin.reason_placeholder': 'Motivo', 'admin.btn_block': 'Bloquear', 'admin.btn_unblock': 'Desbloquear', // Notifications // Create group 'create_group.title': 'Crear un grupo', 'create_group.name': 'Nombre del grupo', 'create_group.name_placeholder': 'p. ej. Fotos de familia, Archivos del proyecto...', 'create_group.join_policy': 'Política de acceso', 'create_group.invite': 'Solo por invitación', 'create_group.invite_desc': "Los miembros deben ser invitados por un administrador. El grupo no aparece en la lista pública.", 'create_group.open': 'Abierto (cualquiera puede unirse)', 'create_group.open_desc': "Aparece en los grupos públicos: cualquiera puede encontrarlo y unirse sin aprobación.", 'create_group.description': 'Descripción', 'create_group.description_hint': '¿De qué trata este grupo? (opcional)', 'create_group.submit': 'Crear', 'create_group.hint': 'Un grupo necesita un node para alojar los archivos. Puede ' + 'crear el grupo ahora y conectar un node más adelante.', 'create_group.creating': 'Creando...', // Members 'members.col_role': 'Rol', 'members.group_role': 'Rol en el grupo', 'members.admin': 'Administrador', 'members.group_admin': 'Administrador del grupo', 'members.owner': 'Propietario', 'members.member': 'Miembro', 'members.invite_title': 'Invitar a un miembro', 'members.username_placeholder': 'Nombre de usuario', 'members.invite_btn': 'Invitar', 'members.invite_needs_pairing': 'Las invitaciones se firman con la clave que este ' + 'node fijó para su navegador, así que empareje el navegador abajo antes de ' + 'invitar a nadie.', 'members.invite_ask_operator': 'Solo el operador del node que aloja este grupo puede ' + 'invitar, desde un navegador emparejado con él.', 'members.remove': 'Expulsar', 'members.remove_confirm': '¿Expulsar a {user} de este grupo? Su cuenta, sus otros ' + 'grupos y los archivos que subió no se ven afectados.', 'members.remove_hint': 'Expulsar a alguien le quita la pertenencia al grupo e impide ' + 'que el node le entregue la clave del grupo. No elimina su cuenta, y no recupera ' + 'la clave que ya tiene en su poder — rótela en el node (meshbay-node gek-init) si ' + 'eso importa.', 'members.pair_title': 'Emparejar este navegador con su node', 'members.pair_hint': 'Su node solo acepta acciones de operador — invitaciones, ' + 'eliminación de archivos — desde un navegador con el que se haya emparejado. ' + 'Ejecute `meshbay-node operator pair` en el node y escriba aquí el código. El ' + 'código nunca pasa por el hub.', 'members.pair_btn': 'Emparejar', 'members.pair_success': 'Este navegador ya está emparejado con el node.', 'members.invite_code_ready': 'Código de invitación para {user}:', 'members.invite_email_sent': 'Se ha enviado un correo con el código a este miembro.', 'members.invite_email_failed': 'No se pudo enviar el correo — comparta el código manualmente.', 'members.invite_code_hint': 'También puede compartir este código por otro canal (ej. SMS). ' + 'Lo introduce la primera vez que abre este grupo.', 'transfers.title': 'Transferencias', 'transfers.clear': 'Borrar las terminadas', 'transfers.cancel': 'Cancelar', 'transfers.open': 'Abrir', 'transfers.done': 'Terminada', 'transfers.cancelled': 'Cancelada', 'transfers.failed': 'Fallida', 'group.select': 'Seleccionar', 'group.select_done': 'Listo', 'group.actions': 'Acciones ({n})', 'group.download_n': 'Descargar ({n})', 'group.download_zip_n': 'Descargar las carpetas en zip ({n})', 'group.delete_n': 'Eliminar ({n})', 'group.delete_n_confirm': { one: '¿Eliminar {n} elemento? {names}', other: '¿Eliminar {n} elementos? {names}', }, 'group.download_zip': { one: 'Descargar en zip ({n} archivo)', other: 'Descargar en zip ({n} archivos)', }, 'group.zip_empty': 'Esa carpeta no contiene nada que descargar.', 'group.zip_no_stream': 'Este navegador no puede escribir una descarga directamente ' + 'en el disco, así que {name} ({size}) tiene que construirse antes en memoria. Con ' + 'un archivo comprimido grande eso puede fallar. ¿Continuar?', 'group.rmdir': 'Eliminar la carpeta', 'group.rmdir_confirm': '¿Eliminar la carpeta «{name}»? Debe estar vacía.', 'group.rmdir_not_empty': 'Esa carpeta no está vacía. Elimine antes lo que contiene — ' + 'aquí nada borra archivos que usted no ve.', 'group.desc_edit': 'Editar la descripción', 'group.desc_add': 'Añadir una descripción', 'group.desc_save': 'Guardar', 'group.desc_cancel': 'Cancelar', 'group.desc_placeholder': 'Para qué sirve este grupo — los miembros lo ven en su ' + 'página de inicio.', 'group.join_code_title': 'Este node necesita reconocerle', 'group.join_code_hint': 'Pida el código de un solo uso a quien le invitó e ' + 'introdúzcalo aquí. Después, este navegador queda reconocido y no se le volverá a ' + 'preguntar.', 'group.join_code_btn': 'Unirse', 'group.pass_title': 'Introduzca su frase de contraseña', 'group.pass_hint': 'Este navegador aún no ha desbloqueado sus claves. Introduzca su frase de contraseña una vez para abrir sus grupos aquí.', 'group.pass_btn': 'Desbloquear', 'notif.purge': 'Borrar todo', 'notif.title': 'Notificaciones', 'notif.empty': 'Ninguna notificación', 'notif.mark_all_read': 'Marcar todo como leído', // Sidebar 'sidebar.search': 'Buscar archivos', // Status // Search 'search.placeholder': 'Buscar en todos los grupos...', 'search.no_results': 'Ningún archivo coincide con su búsqueda.', 'search.col_group': 'Grupo', 'search.result_count': { one: '{n} archivo encontrado', other: '{n} archivos encontrados', }, 'search.hint': 'Escriba un término para buscar en todos sus grupos.', 'search.indexing': 'Indexando {done} / {total} grupos…', 'search.unreachable': { one: '{n} grupo inalcanzable', other: '{n} grupos inalcanzables' }, 'search.view_files': 'Archivos', 'search.view_videos': 'Vídeos', 'search.view_music': 'Música', 'search.view_photos': 'Fotos', 'search.connecting': 'Conectando a los grupos…', // Presence, chat paging, leaving a group, the profile page 'presence.online': 'Un node que sirve este grupo está en línea', 'presence.offline': 'Ningún node accesible para este grupo', 'presence.unknown': 'Aún sin comprobar', 'presence.indexing': 'Indexando — {pct}%', 'chat.load_older': 'Cargar {n} mensajes anteriores', 'chat.start_of_history': 'Inicio de la conversación', 'chat.today': 'Hoy', 'chat.yesterday': 'Ayer', 'chat.unread': 'Mensajes nuevos', 'chat.jump_latest': 'Ir a lo más reciente', 'chat.jump_new': 'Mensajes nuevos', 'group.leave': 'Salir del grupo', 'group.leave_confirm': '¿Salir de «{name}»? Perderá el acceso a sus archivos y a su chat. Los archivos que subió permanecen en el node, y este conserva la identidad que fijó para usted hasta que su operador la retire.', 'group.mute': 'Mute notifications', 'group.unmute': 'Unmute notifications', 'profile.title': 'Perfil', 'usermenu.profile': 'Perfil', // First-run setup wizard 'setup.welcome_title': 'Bienvenido a MeshBay', 'setup.welcome_message': 'Su node aloja sus archivos — cifrados, en su máquina. Vamos a ponerlo en marcha y crear su primer grupo.', 'setup.node_detected': 'Node local detectado y en funcionamiento.', 'setup.node_not_running': 'Su node está instalado pero no se está ejecutando.', 'setup.node_start': 'Iniciar node', 'setup.node_starting': 'Iniciando node…', 'setup.node_started': 'Node iniciado.', 'setup.node_not_installed': 'meshbay-node no está instalado en esta máquina.', 'setup.node_install_hint': 'Instálelo con su gestor de paquetes y vuelva aquí.', 'setup.skip': 'Omitir — crear un grupo sin node local', 'setup.create_group': 'Crear su primer grupo', 'setup.dismiss': 'Omitir configuración', // Group 'group.retry': 'Reintentar', // Sidebar 'sidebar.node': 'Node', // Node admin 'node.title': 'Node', 'node.service_checking': 'Comprobando el servicio del nodo…', 'node.service_not_installed': 'No instalado como servicio', 'node.service_state_active': 'En ejecución', 'node.service_state_inactive': 'Detenido', 'node.service_state_failed': 'Fallido', 'node.service_state_activating': 'Iniciando…', 'node.service_state_deactivating': 'Deteniendo…', 'node.service_state_unknown': 'Desconocido', 'node.service_start': 'Iniciar', 'node.service_starting': 'Iniciando…', 'node.service_stop': 'Detener', 'node.service_stopping': 'Deteniendo…', 'node.service_restart': 'Reiniciar', 'node.service_restarting': 'Reiniciando…', 'node.not_operator': 'No se pudo contactar con su node. Asegúrese de que esté en ejecución.', 'node.offline': 'Node sin conexión', 'node.retry': 'Reintentar', 'node.pair_needed': 'Ningún operador emparejado. Introduzca un código de emparejamiento para habilitar las operaciones de administración (invitaciones, eliminación de archivos).', 'node.pair_code_placeholder': 'Código de emparejamiento', 'node.pair_button': 'Emparejar este navegador', 'node.pair_success': 'Emparejamiento exitoso.', 'node.reload': 'Recargar configuración', 'node.reloaded': 'Configuración recargada. Los cambios de directorios en los grupos existentes ya están activos.', 'node.restart_needed': 'Después de añadir: inicialice la clave de grupo (meshbay-node gek-init --group ).', 'node.no_groups': 'No hay grupos configurados en este node.', 'node.stale': 'no está en el hub', 'node.settings': 'Node settings', 'node.settings_edit_hint': 'Changes are applied immediately and saved to node.toml.', 'node.settings_save': 'Save', 'node.settings_saving': 'Saving…', 'node.settings_saved': 'Settings saved.', 'node.setting_invite_ttl': 'Invitation TTL', 'node.setting_pair_ttl': 'Pairing code TTL', 'node.setting_device_ttl': 'Device request TTL', 'node.setting_max_streams': 'Max concurrent streams', 'node.setting_transcode': 'Transcode incompatible video', 'node.setting_unit_hours': 'hours', 'node.setting_unit_minutes': 'min', 'node.setting_on': 'On', 'node.setting_off': 'Off', 'node.unavailable': 'no disponible', 'node.files': { one: '1 archivo', other: '{n} archivos' }, 'node.peers': { one: '1 par', other: '{n} pares' }, 'node.roots': 'Directorios', 'node.add_root': 'Añadir directorio', 'node.remove_root': 'Eliminar', 'node.root_added': 'Directorio añadido.', 'node.root_remove_confirm': '¿Eliminar «{name}» de este grupo?', 'node.root_removed': 'Directorio eliminado. Se recomienda reiniciar para actualizar el índice.', 'node.upload_root': 'subidas', 'node.attach_group': 'Añadir grupo', 'node.attach_pick': 'Grupo a alojar', 'node.attach_dir': 'Directorio compartido', 'node.attach_upload_dir': 'Directorio de subida', 'node.attach_upload_label': 'Directorio de subida (para archivos y adjuntos del chat)', 'node.attached': 'Grupo añadido y cargado. Ejecute meshbay-node gek-init --group {name} si aún no lo ha hecho.', 'node.detach_group': 'Retirar grupo', 'node.detach_confirm': '¿Retirar «{name}» de este node?', 'node.detached': 'Grupo retirado.', 'node.gek': 'Clave de grupo', 'node.no_gek': 'Sin clave de grupo', 'node.gek_init_hint': 'Aún no hay clave de grupo. Ejecute GEK init desde la línea de comandos para configurarla.', 'node.gek_public_hint': 'La rotación de clave no está disponible para los grupos públicos.', 'node.gek_rotate': 'Rotar clave de grupo', 'node.gek_rotate_confirm': '¿Rotar la clave de grupo? Los miembros conectados recibirán la nueva clave automáticamente. El contenido ya descargado no se ve afectado.', 'node.gek_rotated': 'Clave de grupo rotada.', 'node.roster': 'Registro', 'node.roster_load': 'Cargar registro', 'node.roster_empty': 'Aún no hay miembros fijados.', 'node.roster_user': 'Usuario', 'node.roster_role': 'Rol', 'node.roster_status': 'Estado', 'node.roster_via': 'Fijado mediante', 'node.roster_invites': { one: '1 invitación pendiente', other: '{n} invitaciones pendientes' }, 'node.unpin': 'Desvincular', 'node.unpin_confirm': '¿Desvincular a «{name}»? Deberá emparejarse de nuevo.', 'node.unpin_done': 'Identidad desvinculada.', 'node.denylist': 'Lista de bloqueo', 'node.denylist_load': 'Cargar lista de bloqueo', 'node.denylist_empty': 'La lista de bloqueo está vacía.', 'node.denylist_count': { one: '1 entrada', other: '{n} entradas' }, 'node.denylist_remove': 'Eliminar', 'node.denylist_clear_all': 'Eliminar todas', 'node.denylist_clear_confirm': '¿Eliminar «{subject}» de la lista de bloqueo?', 'node.denylist_cleared': 'Entrada de la lista de bloqueo eliminada.', // Node settings 'settings_node.detach_failed_continue': 'No se pudo desconectar el grupo del node. ¿Eliminar del hub de todos modos?', 'settings_node.roots': 'Directorios compartidos', 'settings_node.scan_title': 'Escaneo', 'settings_node.scan_hint': 'Con qué frecuencia el node vuelve a comprobar sus directorios en busca de cambios que pudo haber pasado por alto, y cuánto tiempo espera tras un cambio antes de indexar un archivo.', 'settings_node.scan_reconcile_label': 'Intervalo de comprobación (minutos)', 'settings_node.scan_debounce_label': 'Espera tras un cambio (segundos)', 'settings_node.scan_save': 'Guardar', 'settings_node.scan_saving': 'Guardando…', 'settings_node.scan_saved': 'Guardado.', 'settings_node.tmdb_title': 'Metadatos de TMDB', 'settings_node.tmdb_hint': 'Permite que la aplicación de Vídeos muestre pósteres, sinopsis y reparto desde TMDB. Desactivado significa solo miniaturas, sin ninguna solicitud a un tercero.', 'settings_node.tmdb_enabled': 'Activado', 'settings_node.tmdb_disabled': 'Desactivado', 'settings_node.tmdb_token_label': 'Token de API personalizado (opcional)', 'settings_node.tmdb_token_placeholder': 'Déjelo en blanco para usar el token predeterminado', 'settings_node.tmdb_token_customized': 'Hay un token personalizado configurado.', 'settings_node.tmdb_token_default': 'Usando el token predeterminado.', 'settings_node.tmdb_save': 'Guardar', 'settings_node.tmdb_language_label': 'Idioma', 'settings_node.tmdb_language_hint': 'Se aplica a todos — una caché compartida, no una solicitud por espectador.', 'settings_node.video_root_title': 'Carpeta raíz de Vídeos', 'settings_node.video_root_hint': 'Qué carpeta (o subcarpeta) trata la app Vídeos como su punto de entrada para este grupo. No se muestra nada en Vídeos, ni se realizan búsquedas en TMDB, hasta que se elija una.', 'settings_node.video_root_none': '— ninguna elegida —', 'settings_node.musicbrainz_title': 'Metadatos de MusicBrainz', 'settings_node.musicbrainz_hint': 'Permite que la app de Música muestre carátulas y nombres canónicos de MusicBrainz cuando una pista no tiene una carátula incrustada utilizable. Desactivado significa navegación solo por etiquetas/nombre de archivo, sin solicitudes a terceros.', 'settings_node.musicbrainz_enabled': 'Activado', 'settings_node.musicbrainz_disabled': 'Desactivado', 'settings_node.video_root_save': 'Guardar', 'settings_node.video_root_change_confirm': 'Cambiar la raíz de Vídeos reemplaza lo que ve cada miembro en la pestaña Vídeos. ¿Continuar?', 'settings_node.audio_root_title': 'Carpeta raíz de Música', 'settings_node.audio_root_hint': 'Qué carpeta (o subcarpeta) trata la app Música como su punto de entrada para este grupo. No se muestra nada en Música, ni se leen etiquetas o carátulas, hasta que se elija una.', 'settings_node.audio_root_none': '— ninguna elegida —', 'settings_node.audio_root_save': 'Guardar', 'settings_node.audio_root_change_confirm': 'Cambiar la raíz de Música reemplaza lo que ve cada miembro en la pestaña Música. ¿Continuar?', 'settings_node.photo_roots_title': 'Carpetas raíz de Fotos', 'settings_node.photo_roots_hint': 'Qué carpeta(s) trata la app Fotos como puntos de entrada para este grupo — una fototeca suele estar repartida en varias carpetas, así que se pueden elegir varias. No se muestra nada en Fotos hasta que se añada al menos una.', 'settings_node.photo_roots_none': '— ninguna elegida —', 'settings_node.photo_roots_add_placeholder': 'Añadir una carpeta…', 'settings_node.photo_roots_add': 'Añadir', 'settings_node.photo_roots_remove': 'Quitar', 'settings_node.photo_roots_save': 'Guardar', 'settings_node.directories_title': 'Directorios', 'settings_node.directories_hint': 'Carpetas compartidas, y cuál de ellas usan las apps de Vídeos, Música y Fotos como su(s) propio(s) punto(s) de entrada.', // Create group wizard 'wizard.title': 'Crear grupo', 'wizard.detecting': 'Detectando node local…', 'wizard.node_not_found': 'No se detectó un node local. Asegúrese de que meshbay-node esté en ejecución.', 'wizard.node_offline_warning': 'El node no está en ejecución. El grupo se creará solo en el hub. Podrá conectar el node más tarde desde la página Node.', 'wizard.retry': 'Reintentar', 'wizard.wrong_account': 'El node está en ejecución, pero el nombre de usuario configurado no coincide con su cuenta. Compruebe hub.username en node.toml.', 'wizard.skip_node': 'Continuar sin node', 'wizard.directories': 'Directorios compartidos', 'wizard.directories_hint': 'Elija los directorios que este grupo compartirá. Se requiere al menos uno.', 'wizard.add_directory': 'Añadir directorio', 'wizard.remove': 'Eliminar', 'wizard.set_upload': 'Establecer como destino de subida', 'wizard.upload_target': 'destino de subida', 'wizard.create_and_setup': 'Crear y configurar', 'wizard.create_hub_only': 'Crear solo en el hub', 'wizard.setting_up': 'Configurando su grupo…', 'wizard.step_create_hub': 'Creando grupo en el hub', 'wizard.step_attach': 'Conectando al node', 'wizard.step_apps': 'Eligiendo aplicaciones', 'wizard.step_add_roots': 'Añadiendo directorios', 'wizard.step_gek': 'Inicializando clave de cifrado', 'wizard.step_pair': 'Configurando emparejamiento', 'wizard.step_index': 'Indexando archivos', 'wizard.indexing_progress': 'Indexando… {pct}%', 'wizard.indexing_current_dir': 'Analizando: {dir}', 'wizard.done_title': 'Grupo creado', 'wizard.done_message': 'Su grupo está listo. Su node lo aloja y el cifrado está configurado.', 'wizard.go_to_group': 'Ir al grupo', 'wizard.finish_later': 'Finalizar configuración más tarde', 'node.stun_servers': 'STUN Servers', 'node.stun_hint': 'Servers used for WebRTC NAT traversal (ICE candidate gathering).', 'node.stun_add': 'Add', 'node.stun_add_placeholder': 'stun:host:port', 'node.stun_remove': 'Remove', 'node.stun_move_up': 'Move up', 'node.stun_move_down': 'Move down', 'node.stun_save': 'Save', 'node.stun_saving': 'Saving…', 'node.stun_saved': 'STUN servers saved.', 'node.stun_reset': 'Reset to defaults', 'node.stun_empty': 'No STUN servers configured. NAT traversal will not work.', 'node.stun_duplicate': 'This server is already in the list.', 'node.stun_invalid': 'STUN URL must start with stun:', 'node.ice_interfaces': 'ICE Interfaces', 'node.ice_auto_hint': 'Auto mode — virtual and VPN interfaces (Tailscale, Docker, libvirt, etc.) are excluded automatically.', 'node.ice_manual_hint': 'Manual mode — only the listed interfaces are used for ICE candidate gathering.', 'node.ice_add': 'Add', 'node.ice_add_placeholder': 'e.g. eth0, wlp0s20f3', 'node.ice_remove': 'Remove', 'node.ice_save': 'Save', 'node.ice_saving': 'Saving…', 'node.ice_saved': 'ICE interfaces saved.', 'node.ice_reset_auto': 'Switch to auto', 'node.ice_duplicate': 'This interface is already in the list.', };