diff options
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/locales/es.js')
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/static/locales/es.js | 402 |
1 files changed, 402 insertions, 0 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js b/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js new file mode 100644 index 0000000..c09175b --- /dev/null +++ b/packages/meshbay-hub/src/meshbay_hub/static/locales/es.js @@ -0,0 +1,402 @@ +/** + * 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', + + // 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.success_title': 'Cuenta creada', + 'register.success_msg': 'Ya puede iniciar sesión con sus credenciales.', + 'register.go_login': 'Ir al inicio de sesión', + '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', + + // Group page + 'group.default_name': 'Grupo', + 'group.tab_files': 'Archivos', + 'group.tab_chat': 'Chat', + 'group.tab_members': 'Miembros', + 'group.filter': 'Filtrar archivos...', + '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:', + '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.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.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}', + + // 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.dl_path_note': 'A una página web no se le puede indicar una ruta, así que ' + + 'aquí no hay nada que escribir: su navegador concede acceso a la carpeta que ' + + 'usted señale, y MeshBay solo escribe dentro de ella. Es posible que se le pida ' + + 'confirmación una vez por sesión.', + 'settings.dl_unsupported': 'Este navegador no puede escribir en una carpeta de su ' + + 'elección (no tiene File System Access API), de modo que las descargas van a su ' + + 'propia carpeta de descargas. Chrome y Edge sí permiten elegir una.', + 'settings.profile': 'Perfil', + 'settings.username': 'Nombre de usuario', + '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.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', + '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 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_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.visibility': 'Visibilidad', + 'create_group.private': 'Privado', + 'create_group.private_desc': 'Solo los miembros invitados ven los archivos y acceden a ellos', + 'create_group.public': 'Público', + 'create_group.public_desc': 'Cualquiera puede descubrir y explorar este grupo', + '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', + 'create_group.open': 'Abierto (cualquiera puede unirse)', + 'create_group.open_desc': 'Cualquiera puede 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} — envíeselo por el ' + + 'medio que usen habitualmente. Funciona una sola vez y nunca pasa por el hub.', + 'members.invite_code_hint': 'Lo introduce la primera vez que abre este grupo. No ' + + 'necesita que usted esté en línea en ese momento.', + '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', + + '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.title': 'Buscar archivos', + 'search.placeholder': 'Buscar en todos los grupos...', + 'search.no_results': 'Ningún archivo coincide con su búsqueda.', + 'search.synced': 'sincronizado {ago}', + 'search.cache_note': 'La búsqueda usa el estado que tenía cada grupo la última vez ' + + 'que lo abrió. Abra un grupo para poner sus archivos al día aquí.', + 'search.col_group': 'Grupo', + 'search.result_count': { + one: '{n} archivo encontrado', + other: '{n} archivos encontrados', + }, + 'search.hint': 'Busca nombres de archivo en todos los índices de grupo en caché.', +}; |