1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
|
/**
* 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.',
'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.',
'captcha.required': 'Por favor, complete el captcha.',
'captcha.failed': 'Verificación del captcha fallida — inténtelo de nuevo.',
// 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.invite_only': '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',
'video.read_more': 'Leer más',
'video.read_less': 'Mostrar menos',
// 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.n_sources': { one: '{n} fuente', other: '{n} fuentes' },
'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.autostart_label': 'Iniciar automáticamente al iniciar sesión',
'node.autostart_updating': 'Actualizando…',
'node.service_mode_hint': 'Se ejecuta como servicio en segundo plano — se inicia al arrancar, antes de iniciar sesión.',
'node.service_mode_label': 'Ejecutar como servicio en segundo plano (se inicia al arrancar, antes de iniciar sesión)',
'node.service_mode_updating': 'Cambiando de modo — compruebe si aparece un aviso de administrador…',
'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 <nombre>).',
'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. Ahora invite a miembros desde la pestaña Ajustes.',
'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.',
'node.overview': 'Overview',
'node.overview_version': 'Version',
'node.overview_node_id': 'Node ID',
'node.overview_quic_port': 'QUIC port',
'node.overview_hub': 'Hub',
'node.node_roster': 'Node roster',
'node.node_roster_hint': 'Every identity this node recognises, across all groups.',
'node.roster_scope': 'Scope',
'node.roster_scope_node': 'node-wide',
'node.peers_title': 'Connected peers',
'node.peers_empty': 'No peers connected.',
'node.peers_user': 'User',
'node.peers_ip': 'IP',
'node.peers_group': 'Group',
'node.peers_state': 'State',
'node.audit_title': 'Audit log',
'node.audit_all_events': 'All events',
'node.audit_empty': 'No audit entries.',
'node.audit_time': 'Time',
'node.audit_event': 'Event',
'node.audit_user': 'User',
'node.audit_ip': 'IP',
'node.audit_group': 'Group',
'node.audit_detail': 'Detail',
'node.maintenance': 'Maintenance',
'node.maintenance_cache': 'Index cache: {n} path(s) remembered.',
'node.maintenance_prune': 'Prune stale entries',
'node.maintenance_pruned': 'Pruned {n} stale cache entries.',
'node.loading': 'Loading…',
'node.audit_export': 'Export CSV',
'node.audit_exporting': 'Exporting…',
'node.audit_prev': 'Previous',
'node.audit_next': 'Next',
'node.audit_page': 'Page {n}',
'node.audit_exported': 'Exported {n} entries.',
'node.unlink_title': 'Unlink from hub',
'node.unlink_hint': 'Stops the hub from brokering connections to this node and listing it for group members. Your groups, keys, roster and files are untouched — the node keeps serving anyone who reaches it directly. Re-link any time from the group wizard or your profile.',
'node.unlink_button': 'Unlink this node',
'node.unlink_confirm': 'Unlink this node from the hub? The hub will stop routing members to it. Group data on disk is not affected.',
'node.unlink_done': 'Node unlinked from the hub. It may take a moment for the hub connection to drop.',
'node.tab_overview': 'Overview',
'node.tab_groups': 'Groups',
'node.tab_roster': 'Roster',
'node.tab_peers': 'Peers',
'node.tab_audit': 'Audit',
'node.tab_settings': 'Settings',
};
|