summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js
blob: a1a1352f3587179bd1223efed4296d37d1a5959f (plain) (blame)
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
/**
 * Brazilian Portuguese — translated from locales/en.js.
 *
 * Register: formal. In Brazilian Portuguese that is "você" with polite phrasing,
 * not "o senhor / a senhora" — the latter reads as stiff in software and is
 * reserved for addressing someone markedly senior.
 * `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': 'Exibir o menu',
  'nav.light_mode': 'Tema claro',
  'nav.dark_mode': 'Tema escuro',
  'nav.logout': 'Sair',
  'nav.login': 'Entrar',

  // Sidebar
  'sidebar.my_groups': 'Meus grupos',
  'sidebar.no_groups': 'Nenhum grupo ainda',
  'sidebar.discover': 'Descobrir',
  'sidebar.public_groups': 'Grupos públicos',

  // Login
  'login.title': 'Entrar',
  'login.username': 'Nome de usuário',
  'login.password': 'Senha',
  'login.submit': 'Entrar',
  'login.loading': 'Entrando...',
  'login.no_account': 'Ainda não tem conta?',
  'login.register_link': 'Criar uma conta',
  'login.forgot': 'Esqueceu sua frase secreta?',
  'reset.title': 'Redefinir a frase secreta',
  'reset.request_intro': 'Digite seu nome de usuário e o e-mail da conta. Se coincidirem, um código de redefinição é enviado para esse endereço.',
  'reset.send_code': 'Enviar código',
  'reset.form_intro': 'Digite o código do seu e-mail e escolha uma nova frase secreta. Se você tem sua chave de recuperação, adicione-a para também restaurar o acesso aos seus grupos.',
  'reset.code': 'Código de redefinição',
  'reset.recovery_key': 'Chave de recuperação (opcional)',
  'reset.recovery_key_hint': 'Deixe em branco se não a tiver. Sem ela, seu acesso é restaurado, mas é preciso reingressar em cada grupo.',
  'reset.new_pass': 'Nova frase secreta',
  'reset.new_pass_repeat': 'Repetir a nova frase secreta',
  'reset.submit': 'Redefinir a frase secreta',
  'reset.working': 'Restaurando suas identidades de grupo…',
  'reset.signin_restored': 'Seu acesso foi restaurado.',
  'reset.groups_restored': 'Suas identidades de grupo foram restauradas em todos os nós alcançáveis.',
  'reset.no_recovery': 'Suas identidades de grupo não foram restauradas. Para cada grupo, peça ao operador dele para remover sua fixação e enviar um novo código de convite, e então reingresse.',
  'reset.needs_operator': 'Estes grupos ainda precisam de ação — peça a cada operador para remover sua fixação e enviar um novo código:',
  'reset.go_app': 'Ir para o aplicativo',
  'reset.back_to_login': 'Voltar para o login',
  'reset.err_unsupported': 'A redefinição da frase secreta precisa do módulo de criptografia do navegador, que não está disponível aqui.',

  // Register
  'register.title': 'Criar uma conta',
  'register.username': 'Nome de usuário',
  'register.email': 'E-mail',
  'register.password': 'Frase secreta (mínimo de 12 caracteres)',
  'register.confirm': 'Confirmar a senha',
  'register.submit': 'Criar a conta',
  'register.loading': 'Criando a conta...',
  'register.has_account': 'Já tem uma conta?',
  'register.login_link': 'Entrar',
  'register.recovery_title': 'Guarde sua chave de recuperação',
  'register.recovery_intro': 'Esta chave restaura suas identidades de grupo caso você esqueça sua frase secreta. Guarde-a em um gerenciador de senhas ou em local seguro.',
  'register.recovery_copy': 'Copiar',
  'register.recovery_copied': 'Copiado',
  'register.recovery_warning': 'Se você perder tanto a frase secreta quanto esta chave, seus arquivos permanecem em seus nós, mas você reingressa em cada grupo com uma nova identidade.',
  'register.recovery_saved': 'Guardei minha chave de recuperação em um local seguro.',
  'register.recovery_continue': 'Continuar',
  'register.recovery_email_opt': 'Enviar também esta chave de recuperação para o meu e-mail como backup',
  'register.recovery_emailed': 'Uma cópia também foi enviada para o seu e-mail, na mesma mensagem que o seu código de verificação.',
  'register.recovery_not_emailed': 'Isto não foi enviado por e-mail. Guarde agora — esta é a única vez que é mostrada.',
  'register.success_title': 'Verifique seu e-mail',
  'register.success_msg': 'Um código de verificação foi enviado para o seu e-mail. Digite-o abaixo para ativar sua conta.',
  'register.go_login': 'Ir para o login',
  'register.code_placeholder': 'Código de verificação',
  'register.verify_btn': 'Verificar',
  'register.verifying': 'Verificando…',
  'register.verified_title': 'E-mail verificado',
  'register.verified_msg': 'Sua conta está ativa. Agora você pode entrar.',
  'register.resend': 'Reenviar código',
  'register.resend_sent': 'Um novo código foi enviado.',
  'login.pending_verification': 'Seu e-mail ainda não foi verificado. Verifique sua caixa de entrada.',
  'login.verify_link': 'Verificar e-mail',
  'register.err_mismatch': 'As senhas não coincidem',
  'register.err_min_len': {
    one: 'Use pelo menos {n} caractere',
    other: 'Use pelo menos {n} caracteres',
  },
  'register.err_too_weak': 'Fácil demais de adivinhar. Sua frase secreta é o que '
    + 'protege suas chaves onde elas ficam guardadas — algumas palavras sem relação '
    + 'entre si funcionam muito bem.',
  'register.strength': 'Robustez: cerca de {bits} bits. Ela protege a cópia das suas '
    + 'chaves mantida nos nodes dos quais você participa, então vale a pena caprichar.',
  'captcha.required': 'Por favor, complete o captcha.',
  'captcha.failed': 'Verificação do captcha falhou — tente novamente.',

  // Home
  'home.welcome': 'Bem-vindo ao MeshBay',
  'home.no_groups': 'Você ainda não participa de nenhum grupo.',
  'home.browse_prefix': 'Explore os ',
  'home.browse_link': 'grupos públicos',
  'home.browse_suffix': ' ou peça a um administrador de grupo que o convide.',
  'home.my_groups': 'Meus grupos',

  // Explore
  'explore.title': 'Grupos públicos',
  'explore.search': 'Pesquisar grupos...',
  'explore.loading': 'Carregando...',
  'explore.empty': 'Nenhum grupo público disponível.',
  'explore.create_group': 'Criar um grupo',
  'explore.join': 'Participar',
  'explore.member': 'Participando',
  'explore.disabled': "This hub does not have public groups.",

  // Group page
  'group.default_name': 'Grupo',
  'group.tab_files': 'Arquivos',
  'group.tab_chat': 'Conversa',
  'group.tab_video': 'Vídeos',
  'group.tab_music': 'Música',
  'group.tab_photos': 'Fotos',
  'group.tab_members': 'Membros',
  'group.tab_settings': "Configurações",
  'members.danger_leave_hint': "Você perderá o acesso aos arquivos e ao chat deste grupo.",
  'members.uploads_title': "Envios",
  'members.uploads_on': "Os membros podem adicionar arquivos",
  'members.uploads_off': "Somente você pode adicionar arquivos",
  'members.uploads_disable': "Desativar",
  'members.uploads_enable': "Ativar",
  'members.uploads_hint': "Vale para todos menos você. O nó recusa o envio por conta própria: não se trata de esconder um botão.",
  'members.apps_title': "Aplicativos",
  'members.apps_hint': "Quais partes deste grupo os membros veem. Pelo menos um deve permanecer ativado.",
  'members.apps_need_one': "Pelo menos um aplicativo deve permanecer ativado.",
  'members.danger_delete_hint': "O grupo desaparece para todos os membros. Não há como desfazer.",
  'group.filter': 'Filtrar arquivos...',
  'group.refresh_index': 'Atualizar a lista',
  'group.col_name': 'Nome',
  'group.col_size': 'Tamanho',
  'group.col_type': 'Tipo',
  'group.col_date': 'Data',
  'group.empty_filter': 'Nenhum arquivo corresponde ao filtro',
  'group.empty_dir': 'Esta pasta está vazia',
  'group.download': 'Baixar',
  'group.play': 'Reproduzir',
  'group.offline_title': 'Nenhum node está on-line para este grupo no momento.',
  'group.offline_hint': 'Os arquivos aparecerão quando um node que hospeda este grupo '
    + 'se conectar.',
  'group.upload': 'Enviar',
  'group.mkdir': 'Nova pasta',
  'group.mkdir_prompt': 'Nome da nova pasta:',
  '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': '(indisponível — a unidade está desconectada)',
  'group.view': 'Visualizar',
  'group.delete': 'Excluir',
  'group.delete_confirm': 'Excluir {name}?',
  'group.delete_group': 'Excluir o grupo',
  'group.delete_group_confirm': 'Excluir "{name}" definitivamente e remover todos os '
    + 'membros? Os arquivos que estão no node são preservados.',
  'group.err_transport': 'Módulo de transporte não carregado',

  // Status
  'status.idle': 'Ocioso',
  'status.discovering': 'Procurando nodes...',
  'status.connecting': 'Conectando via WebRTC...',
  'status.connecting_short': 'Conectando…',
  'status.fetching': 'Obtendo o índice...',
  'status.files': {
    one: '{n} arquivo',
    other: '{n} arquivos',
  },
  'status.offline': 'Nenhum node on-line',
  'status.error': 'Falha na conexão',

  // Chat
  'chat.empty': 'Ainda não há mensagens. Comece a conversa!',
  'chat.placeholder': 'Escreva uma mensagem...',
  'chat.send': 'Enviar',
  'chat.attach': 'Anexar arquivo',

  // Video player
  'video.loading': 'Carregando {name}...',
  'video.buffering': 'Armazenando em buffer...',
  'video.resumed_at': "Retomado em {time}",
  'video.from_start': "Começar do início",
  'video.close': 'Fechar (Esc)',
  'preview.pdf_fallback': 'Este navegador não exibirá o PDF na própria página. Baixe '
    + 'o arquivo — de todo modo ele foi descriptografado aqui.',
  'group.upload_indexing': 'indexando…',
  'video.err_transport': 'Transporte não conectado',
  'video.err_mse': 'Codec sem suporte para transmissão: {codec}',
  'video.mode_poster': 'Pôsteres',
  'video.mode_flat': 'Lista simples',
  'video.filter_all': 'All',
  'video.filter_movies': 'Movies',
  'video.filter_series': 'Series',
  'video.empty': 'Nenhum vídeo encontrado.',
  'video.no_root_configured': 'Ainda não há uma pasta raiz de Vídeos definida para este grupo — um operador pode escolher uma em Configurações.',
  'music.no_root_configured': 'Ainda não há uma pasta raiz de Música definida para este grupo — um operador pode escolher uma em Configurações.',
  'video.director': 'Diretor',
  'video.specials': 'Especiais',
  'video.season_n': 'Temporada {n}',
  'video.episode_n': 'Episódio {n}',
  'video.n_episodes': {
    one: '{n} episódio',
    other: '{n} episódios',
  },
  'video.fix_match': 'Corrigir correspondência…',
  'video.search_title': 'Corrigir a correspondência do TMDB',
  'video.search_placeholder': 'Pesquisar no TMDB…',
  'video.search_button': 'Pesquisar',
  'video.search_no_results': 'Nenhuma correspondência encontrada.',
  'video.search_apply_hint': 'Aplica-se a todos os arquivos atualmente agrupados sob este título.',
  'video.search_apply_hint_movie': 'Aplica-se somente a este arquivo.',
  'video.source_file': 'Arquivo: {name}',
  'video.no_match': 'Sem correspondência confiável no TMDB — exibindo o nome do arquivo.',
  'video.rematch_one': 'Combinar de novo',

  // Música
  'music.mode_grid': 'Álbuns',
  'music.mode_flat': 'Lista simples',
  'music.empty': 'Nenhuma música encontrada.',
  'music.unknown_album': 'Álbum desconhecido',
  'music.various': 'Diversos',
  'music.play_all': 'Reproduzir tudo',
  'music.n_tracks': {
    one: '{n} faixa',
    other: '{n} faixas',
  },
  'music.err_transport': 'Transporte não conectado',
  'music.err_playback': 'Erro de reprodução',
  'music.err_transcode': 'Falha na conversão de formato',
  'music.player_play': 'Reproduzir',
  'music.player_pause': 'Pausar',
  'music.player_prev': 'Anterior',
  'music.player_next': 'Próxima',
  'music.player_shuffle': 'Aleatório',
  'music.player_repeat_off': 'Repetição desativada',
  'music.player_repeat_all': 'Repetir tudo',
  'music.player_repeat_one': 'Repetir faixa',
  'music.player_volume': 'Volume',
  'music.player_close': 'Fechar player',
  'music.player_queue': 'Fila atual',
  'music.queue_title': 'Tocando agora',

  // Photos
  'photo.empty': 'Nenhuma foto encontrada.',
  'photo.no_roots_configured': 'Ainda não há pastas raiz de Fotos definidas para este grupo — um operador pode escolher algumas em Configurações.',
  'photo.root_album': '(nível superior)',
  'photo.n_photos': {
    one: '{n} foto',
    other: '{n} fotos',
  },
  'photo.back': 'Voltar',
  'photo.prev': 'Anterior (←)',
  'photo.next': 'Próxima (→)',
  'photo.zip_album': 'Baixar álbum como zip',
  'photo.zoom_in': 'Aumentar zoom',
  'photo.zoom_out': 'Diminuir zoom',
  'photo.zoom_fit_title': 'Ajustar à janela',
  'photo.zoom_fit_label': 'Ajustar',
  'photo.zoom_100': 'Tamanho real (100%)',

  // LAN cast
  'cast.start': 'Transmitir para dispositivo',
  'cast.stop': 'Parar transmissão',
  'cast.copy_url': 'Copiar URL do stream',
  'cast.copied': 'URL copiada',
  'cast.scanning': 'Procurando dispositivos…',
  'cast.no_devices': 'Nenhum dispositivo encontrado',

  // Settings
  'settings.title': 'Configurações',
  'settings.coming_soon': 'Em breve.',
  'settings.downloads': 'Downloads',
  'settings.dl_auto': 'Salvar automaticamente',
  'settings.dl_auto_hint': 'Os arquivos vão direto para a pasta escolhida abaixo, sem '
    + 'nenhuma caixa de diálogo. Baixar vinte arquivos coloca vinte arquivos lá.',
  'settings.dl_ask': 'Perguntar sempre',
  'settings.dl_ask_hint': 'Uma caixa "Salvar como" por arquivo — uma para cada '
    + 'arquivo, inclusive quando você baixa uma seleção.',
  'settings.dl_folder': 'Pasta: {name}',
  'settings.dl_no_folder': 'Nenhuma pasta escolhida — os downloads vão para onde o '
    + 'seu navegador os colocar',
  'settings.dl_choose': 'Escolher pasta',
  'settings.dl_change': 'Alterar',
  'settings.dl_forget': 'Esquecer',

  'settings.profile': 'Perfil',
  'settings.username': 'Nome de usuário',
  'settings.email': 'Email',
  'settings.email_save': 'Salvar',
  'settings.email_saved': 'E-mail atualizado',
  'settings.email_code_sent': 'Um código de verificação foi enviado para o seu novo endereço de e-mail.',
  'settings.email_code_placeholder': 'Código de verificação',
  'settings.email_verify_btn': 'Verificar',
  'settings.email_verifying': 'Verificando…',
  'settings.email_verified': 'Endereço de e-mail alterado com sucesso.',
  'settings.notif_global_disable': 'Desativar todas as notificações',
  'settings.notif_global_hint': 'Quando ativado, nenhuma notificação é criada para nenhum grupo.',
  'settings.defaults': 'Padrões',
  '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 dos nodes',
  'settings.node_pins_hint': 'A chave de identidade de cada node é memorizada na '
    + 'primeira conexão. Se ela mudar, a conexão é recusada — o que só é esperado '
    + 'quando um operador reinstala um node. Confirme com ele antes de limpar.',
  'settings.node_pins_count': {
    one: '{n} fixada',
    other: '{n} fixadas',
  },
  'settings.node_pins_clear': 'Limpar as identidades fixadas',
  'settings.passphrase': 'Frase secreta',
  'settings.passphrase_hint': 'Altera a frase secreta desta conta. Suas chaves de identidade são recriptografadas em cada grupo cujo nó esteja on-line; um grupo cujo nó esteja off-line terá de ser reingressado depois.',
  'settings.passphrase_change': 'Alterar a frase secreta',
  'settings.passphrase_current': 'Frase secreta atual',
  'settings.passphrase_new': 'Nova frase secreta',
  'settings.passphrase_new_repeat': 'Repetir a nova frase secreta',
  'settings.continue': 'Continuar',
  'settings.done': 'Concluído',
  'settings.passphrase_confirm_intro': 'Suas chaves de identidade serão recriptografadas agora em cada grupo cujo nó possa ser alcançado:',
  'settings.passphrase_reachable': 'Atualizado agora',
  'settings.passphrase_unreachable': 'Não pode ser alcançado',
  'settings.passphrase_fallback_note': 'Para um grupo que não pode ser alcançado, peça ao operador dele para remover sua fixação e enviar um novo código de convite, e então reingresse. Seus arquivos e mensagens não são perdidos.',
  'settings.passphrase_confirm_btn': 'Alterar',
  'settings.passphrase_working': 'Recriptografando suas chaves…',
  'settings.passphrase_done': 'Frase secreta alterada.',
  'settings.passphrase_needs_operator': 'Estes grupos ainda precisam de ação — peça a cada operador para remover sua fixação e enviar um novo código:',
  'settings.pw_too_short': 'A nova frase secreta deve ter pelo menos 12 caracteres.',
  'settings.pw_mismatch': 'As duas novas frases secretas não coincidem.',
  'settings.pw_same': 'A nova frase secreta deve ser diferente da atual.',
  'settings.pw_wrong_current': 'A frase secreta atual não está correta. Nada foi alterado.',
  'settings.recovery': 'Chave de recuperação',
  'settings.recovery_hint': 'Adiciona a cada grupo uma cópia da sua identidade criptografada com a sua chave de recuperação. Faça isso uma vez em cada navegador que usar; sem ela, uma frase secreta perdida obriga a reingressar em cada grupo manualmente.',
  'settings.recovery_loaded': 'Carregada neste navegador — grupos novos ficam cobertos automaticamente.',
  'settings.recovery_open': 'Inserir a chave de recuperação',
  'settings.recovery_input_ph': 'Cole a sua chave de recuperação',
  'settings.recovery_submit': 'Adicionar cópias de backup',
  'settings.recovery_working': 'Atualizando os seus grupos…',
  'settings.recovery_done': 'Os seus grupos agora têm uma cópia de recuperação.',
  'settings.recovery_partial': 'Não foi possível alcançar estes grupos. Abra-os mais tarde, ou execute isto de novo:',
  'settings.recovery_need_relogin': 'Saia e entre novamente, depois tente de novo.',
  'settings.danger': 'Excluir a conta',
  'settings.delete_hint': 'Remove sua conta, suas participações em grupos e suas '
    + 'notificações do hub, e libera seu nome de usuário. Não alcança o que está nos '
    + 'nodes: os arquivos que você enviou permanecem onde o operador deles os guarda, e '
    + 'cada node mantém a identidade que fixou para você até que o operador a remova. '
    + 'Os registros de conexão são guardados por um ano, como a lei exige.',
  'settings.delete_account': 'Excluir minha conta',
  'settings.delete_confirm': 'Digite sua frase secreta para confirmar. Esta ação não '
    + 'pode ser desfeita.',
  'settings.delete_confirm_btn': 'Excluir definitivamente',
  'settings.cancel': 'Cancelar',
  'settings.appearance': 'Aparência',
  'settings.theme': 'Tema',
  'settings.theme_light': 'Claro',
  'settings.theme_dark': 'Escuro',
  'settings.theme_system': 'Sistema',
  'settings.language': 'Idioma',
  'settings.about': 'Sobre',
  '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': 'Versão',
  'settings.protocol': 'Protocolo',
  'settings.role': 'Função',
  'settings.groups': 'Notificações de grupo',
  'settings.notifications': 'Notificações',
  'settings.node_key': 'Vincular um node',
  'settings.node_key_desc': 'Se você opera um node MeshBay, cole aqui a chave pública '
    + 'Ed25519 dele para vinculá-lo à sua conta. Essa chave está no painel de '
    + 'administração do seu node.',
  'settings.node_key_placeholder': 'Cole a chave pública Ed25519 do node (base64)',
  'settings.node_key_submit': 'Vincular o node',
  'settings.node_key_success': 'Node vinculado com sucesso',
  'settings.node_key_current': 'Chave do node vinculado',

  // Sidebar
  'sidebar.create_group': 'Criar um grupo',
  'sidebar.settings': 'Configurações',
  'sidebar.admin': 'Administração',

  // User menu
  'usermenu.language': 'Idioma',
  'usermenu.settings': 'Configurações',
  'usermenu.theme_light': 'Tema claro',
  'usermenu.theme_dark': 'Tema escuro',
  'usermenu.logout': 'Sair',

  // Admin panel
  'admin.title': 'Administração',
  'admin.tab_stats': 'Estatísticas',
  'admin.tab_users': 'Usuários',
  'admin.tab_groups': 'Grupos',
  'admin.tab_nodes': 'Nodes',
  'admin.tab_logs': 'Registros',
  'admin.col_observed_ip': 'Visto de',
  'admin.col_hint': 'Endereço anunciado',
  'admin.col_last_seen': 'Último anúncio',
  'admin.node_online': 'on-line',
  'admin.node_offline': 'off-line',
  'admin.no_nodes': 'Nenhum node registrado',
  'admin.nodes_hint': '"Visto de" é o endereço de onde o anúncio chegou, em uma '
    + 'requisição assinada com a chave do node — é esse que serve para responder a uma '
    + 'requisição judicial. O endereço anunciado é o que o node acredita ser o seu, '
    + 'aprendido de um servidor STUN e enviado a nós; serve para alcançar o node e não '
    + 'prova coisa alguma.',
  'admin.tab_blocklist': 'Lista de bloqueio',
  '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': 'Usuários',
  'admin.stat_groups': 'Grupos',
  'admin.stat_nodes': 'Nodes',
  'admin.stat_online': 'Nodes on-line',

  // Admin users
  'admin.users_search': 'Pesquisar usuários...',
  'admin.col_username': 'Nome de usuário',
  'admin.col_role': 'Função',
  'admin.col_status': 'Status',
  'admin.col_created': 'Criação',
  'admin.col_actions': 'Ações',
  'admin.col_email': 'E-mail',
  'admin.col_groups': 'Grupos',
  'admin.no_users': 'Nenhum usuário encontrado',
  'admin.btn_suspend': 'Suspender',
  'admin.btn_unsuspend': 'Reativar',
  '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': 'Detalhes',
  'admin.btn_delete': 'Excluir',
  'admin.delete_confirm': 'Excluir a conta "{user}"? Esta ação não pode ser desfeita. '
    + 'Os arquivos que essa pessoa enviou permanecem nos nodes que os hospedam, e cada '
    + 'node mantém a identidade que fixou até que o operador dele a remova. Suspender é '
    + 'a opção reversível.',
  'admin.user_detail': 'Detalhes do usuário',
  'admin.btn_close': 'Fechar',
  'admin.self_note': '(você)',

  // Admin groups
  'admin.col_name': 'Nome',
  'admin.col_visibility': 'Visibilidade',
  'admin.col_members': 'Membros',
  'admin.no_groups': 'Nenhum grupo encontrado',

  // Admin logs
  'admin.col_time': 'Horário',
  'admin.col_event': 'Evento',
  'admin.col_user': 'Usuário',
  'admin.col_ip': 'IP',
  'admin.col_detail': 'Detalhe',
  'admin.filter_all': 'Todos os eventos',
  'admin.no_logs': 'Nenhum registro encontrado',
  'admin.btn_load_more': 'Carregar mais',

  // Admin blocklist
  'admin.col_hash': 'Hash',
  'admin.col_reason': 'Motivo',
  'admin.col_date': 'Data',
  'admin.col_added_by': 'Adicionado por',
  'admin.no_blocked': 'Nenhum hash bloqueado',
  'admin.add_hash': 'Adicionar um hash à lista de bloqueio',
  'admin.hash_placeholder': 'hash blake3 (64 caracteres hexadecimais)',
  'admin.reason_placeholder': 'Motivo',
  'admin.btn_block': 'Bloquear',
  'admin.btn_unblock': 'Desbloquear',

  // Notifications
  // Create group
  'create_group.title': 'Criar um grupo',
  'create_group.name': 'Nome do grupo',
  'create_group.name_placeholder': 'ex.: Fotos da família, Arquivos do projeto...',
  'create_group.join_policy': 'Política de entrada',
  'create_group.invite': 'Somente por convite',
  'create_group.invite_desc': "Os membros precisam ser convidados por um administrador. O grupo não aparece na lista pública.",
  'create_group.open': 'Aberto (qualquer pessoa pode entrar)',
  'create_group.open_desc': "Aparece nos grupos públicos — qualquer pessoa pode encontrá-lo e entrar sem aprovação.",
  'create_group.description': 'Descrição',
  'create_group.description_hint': 'Sobre o que é este grupo? (opcional)',
  'create_group.submit': 'Criar',
  'create_group.hint': 'Um grupo precisa de um node para hospedar os arquivos. Você '
    + 'pode criar o grupo agora e conectar um node depois.',
  'create_group.creating': 'Criando...',

  // Members
  'members.col_role': 'Função',
  'members.group_role': 'Função no grupo',
  'members.admin': 'Administrador',
  'members.group_admin': 'Administrador do grupo',
  'members.owner': 'Proprietário',
  'members.member': 'Membro',
  'members.invite_title': 'Convidar um membro',
  'members.username_placeholder': 'Nome de usuário',
  'members.invite_btn': 'Convidar',
  'members.invite_needs_pairing': 'Os convites são assinados com a chave que este node '
    + 'fixou para o seu navegador, então faça o pareamento abaixo antes de convidar '
    + 'alguém.',
  'members.invite_ask_operator': 'Só o operador do node que hospeda este grupo pode '
    + 'convidar, a partir de um navegador pareado com ele.',
  'members.remove': 'Remover',
  'members.remove_confirm': 'Remover {user} deste grupo? A conta dessa pessoa, os '
    + 'outros grupos dela e os arquivos que ela enviou não são afetados.',
  'members.remove_hint': 'Remover alguém retira a participação dessa pessoa e faz o '
    + 'node parar de entregar a ela a chave do grupo. Não exclui a conta dela, e não '
    + 'recupera a chave que ela já tem em mãos — rotacione a chave no node '
    + '(meshbay-node gek-init) se isso importar.',
  'members.pair_title': 'Parear este navegador com o seu node',
  'members.pair_hint': 'O seu node só aceita ações de operador — convites, exclusão de '
    + 'arquivos — de um navegador com o qual foi pareado. Execute '
    + '`meshbay-node operator pair` no node e digite o código aqui. O código nunca '
    + 'passa pelo hub.',
  'members.pair_btn': 'Parear',
  'members.pair_success': 'Este navegador agora está pareado com o node.',
  'members.invite_code_ready': 'Código de convite para {user}:',
  'members.invite_email_sent': 'Um e-mail com o código foi enviado a este membro.',
  'members.invite_email_failed': 'Não foi possível enviar o e-mail — compartilhe o código manualmente.',
  'members.invite_code_hint': 'Você também pode compartilhar este código por outro canal (ex: SMS). '
    + 'O código funciona uma única vez e nunca passa pelo hub.',
  'transfers.title': 'Transferências',
  'transfers.clear': 'Limpar as concluídas',
  'transfers.cancel': 'Cancelar',
  'transfers.open': 'Abrir',
  'transfers.done': 'Concluída',
  'transfers.cancelled': 'Cancelada',
  'transfers.failed': 'Falhou',
  'group.select': 'Selecionar',
  'group.select_done': 'Concluir',
  'group.actions': 'Ações ({n})',
  'group.download_n': 'Baixar ({n})',
  'group.download_zip_n': 'Baixar as pastas em zip ({n})',
  'group.delete_n': 'Excluir ({n})',
  'group.delete_n_confirm': {
    one: 'Excluir {n} item? {names}',
    other: 'Excluir {n} itens? {names}',
  },
  'group.download_zip': {
    one: 'Baixar em zip ({n} arquivo)',
    other: 'Baixar em zip ({n} arquivos)',
  },
  'group.zip_empty': 'Essa pasta não tem nada para baixar.',
  'group.zip_no_stream': 'Este navegador não consegue escrever um download direto no '
    + 'disco, então {name} ({size}) precisa ser montado antes na memória. Em um arquivo '
    + 'grande isso pode falhar. Continuar?',
  'group.rmdir': 'Excluir a pasta',
  'group.rmdir_confirm': 'Excluir a pasta "{name}"? Ela precisa estar vazia.',
  'group.rmdir_not_empty': 'Essa pasta não está vazia. Exclua antes o que está dentro '
    + 'dela — nada aqui apaga arquivos que você não vê.',
  'group.desc_edit': 'Editar a descrição',
  'group.desc_add': 'Adicionar uma descrição',
  'group.desc_save': 'Salvar',
  'group.desc_cancel': 'Cancelar',
  'group.desc_placeholder': 'Para que serve este grupo — os membros veem isto na '
    + 'página inicial deles.',
  'group.join_code_title': 'Este node precisa reconhecer você',
  'group.join_code_hint': 'Peça o código de uso único a quem convidou você e digite-o '
    + 'aqui. Depois disso este navegador fica reconhecido e a pergunta não se repete.',
  'group.join_code_btn': 'Participar',
  'group.pass_title': 'Digite a sua frase secreta',
  'group.pass_hint': 'Este navegador ainda não desbloqueou as suas chaves. Digite a sua frase secreta uma vez para abrir os seus grupos aqui.',
  'group.pass_btn': 'Desbloquear',

  'notif.purge': 'Limpar tudo',
  'notif.title': 'Notificações',
  'notif.empty': 'Nenhuma notificação',
  'notif.mark_all_read': 'Marcar tudo como lido',

  // Sidebar
  'sidebar.search': 'Pesquisar arquivos',

  // Status

  // Search
  'search.placeholder': 'Pesquisar em todos os grupos...',
  'search.no_results': 'Nenhum arquivo corresponde à sua pesquisa.',
  'search.col_group': 'Grupo',
  'search.result_count': {
    one: '{n} arquivo encontrado',
    other: '{n} arquivos encontrados',
  },
  'search.hint': 'Digite um termo para pesquisar em todos os seus grupos.',
  'search.indexing': 'Indexando {done} / {total} grupos…',
  'search.unreachable': { one: '{n} grupo inacessível', other: '{n} grupos inacessíveis' },
  'search.view_files': 'Arquivos',
  'search.view_videos': 'Vídeos',
  'search.view_music': 'Música',
  'search.view_photos': 'Fotos',
  'search.connecting': 'Conectando aos grupos…',

  // Presence, chat paging, leaving a group, the profile page
  'presence.online': 'Um node que hospeda este grupo está on-line',
  'presence.offline': 'Nenhum node acessível para este grupo',
  'presence.unknown': 'Ainda não verificado',
  'presence.indexing': 'Indexando — {pct}%',
  'chat.load_older': 'Carregar {n} mensagens anteriores',
  'chat.start_of_history': 'Início da conversa',
  'chat.today': 'Hoje',
  'chat.yesterday': 'Ontem',
  'chat.unread': 'Mensagens novas',
  'chat.jump_latest': 'Ir para a mais recente',
  'chat.jump_new': 'Mensagens novas',
  'group.leave': 'Sair do grupo',
  'group.leave_confirm': 'Sair de “{name}”? Você perderá o acesso aos arquivos e à conversa. Os arquivos que você enviou permanecem no node, e ele mantém a identidade que fixou para você até que o operador dele a remova.',
  'group.mute': 'Mute notifications',
  'group.unmute': 'Unmute notifications',
  'profile.title': 'Perfil',
  'usermenu.profile': 'Perfil',

  // First-run setup wizard
  'setup.welcome_title': 'Bem-vindo ao MeshBay',
  'setup.welcome_message': 'Seu node hospeda seus arquivos — criptografados, na sua máquina. Vamos iniciá-lo e criar seu primeiro grupo.',
  'setup.node_detected': 'Node local detectado e em execução.',
  'setup.node_not_running': 'Seu node está instalado mas não está em execução.',
  'setup.node_start': 'Iniciar node',
  'setup.node_starting': 'Iniciando node…',
  'setup.node_started': 'Node iniciado.',
  'setup.node_not_installed': 'meshbay-node não está instalado nesta máquina.',
  'setup.node_install_hint': 'Instale-o com seu gerenciador de pacotes e volte aqui.',
  'setup.skip': 'Pular — criar um grupo sem node local',
  'setup.create_group': 'Criar seu primeiro grupo',
  'setup.dismiss': 'Pular configuração',

  // Group misc
  'group.retry': 'Tentar novamente',

  // Sidebar
  'sidebar.node': 'Node',

  // Node admin
  'node.title': 'Node',
  'node.service_checking': 'Verificando o serviço do nó…',
  'node.service_not_installed': 'Não instalado como serviço',
  'node.service_state_active': 'Em execução',
  'node.service_state_inactive': 'Parado',
  'node.service_state_failed': 'Falhou',
  'node.service_state_activating': 'Iniciando…',
  'node.service_state_deactivating': 'Parando…',
  'node.service_state_unknown': 'Desconhecido',
  'node.service_start': 'Iniciar',
  'node.service_starting': 'Iniciando…',
  'node.service_stop': 'Parar',
  'node.service_stopping': 'Parando…',
  'node.service_restart': 'Reiniciar',
  'node.service_restarting': 'Reiniciando…',
  'node.not_operator': 'Não foi possível alcançar seu node. Verifique se ele está em execução.',
  'node.offline': 'Node está off-line',
  'node.retry': 'Tentar novamente',
  'node.pair_needed': 'Nenhum operador pareado. Insira um código de pareamento para habilitar operações administrativas (convites, exclusão de arquivos).',
  'node.pair_code_placeholder': 'Código de pareamento',
  'node.pair_button': 'Parear este navegador',
  'node.pair_success': 'Pareamento realizado com sucesso.',
  'node.reload': 'Recarregar configuração',
  'node.reloaded': 'Configuração recarregada. Alterações de diretórios em grupos existentes estão ativas.',
  'node.restart_needed': 'Após adicionar: inicialize a chave do grupo (meshbay-node gek-init --group <nome>).',
  'node.no_groups': 'Nenhum grupo configurado neste node.',
  'node.stale': 'fora do 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': 'indisponível',
  'node.files': { one: '1 arquivo', other: '{n} arquivos' },
  'node.peers': { one: '1 par', other: '{n} pares' },
  'node.roots': 'Diretórios',
  'node.add_root': 'Adicionar diretório',
  'node.remove_root': 'Remover',
  'node.root_added': 'Diretório adicionado.',
  'node.root_remove_confirm': 'Remover "{name}" deste grupo?',
  'node.root_removed': 'Diretório removido. Reinicialização recomendada para atualizar o índice.',
  'node.upload_root': 'uploads',
  'node.attach_group': 'Adicionar grupo',
  'node.attach_pick': 'Grupo a hospedar',
  'node.attach_dir': 'Diretório compartilhado',
  'node.attach_upload_dir': 'Diretório de upload',
  'node.attach_upload_label': 'Diretório de upload (para envio de arquivos e anexos do chat)',
  'node.attached': 'Grupo adicionado e carregado. Execute meshbay-node gek-init --group {name} se ainda não o fez.',
  'node.detach_group': 'Remover grupo',
  'node.detach_confirm': 'Remover "{name}" deste node?',
  'node.detached': 'Grupo removido.',
  'node.gek': 'Chave do grupo',
  'node.no_gek': 'Sem chave de grupo',
  'node.gek_init_hint': 'Ainda não há chave de grupo. Execute GEK init na CLI para configurá-la.',
  'node.gek_public_hint': 'A rotação de chave não está disponível para grupos públicos.',
  'node.gek_rotate': 'Rotacionar chave do grupo',
  'node.gek_rotate_confirm': 'Rotacionar a chave do grupo? Os membros conectados receberão a nova chave automaticamente. O conteúdo já baixado não é afetado.',
  'node.gek_rotated': 'Chave do grupo rotacionada.',
  'node.roster': 'Cadastro',
  'node.roster_load': 'Carregar cadastro',
  'node.roster_empty': 'Nenhum membro fixado ainda.',
  'node.roster_user': 'Usuário',
  'node.roster_role': 'Função',
  'node.roster_status': 'Status',
  'node.roster_via': 'Fixado via',
  'node.roster_invites': { one: '1 convite pendente', other: '{n} convites pendentes' },
  'node.unpin': 'Desfixar',
  'node.unpin_confirm': 'Desfixar "{name}"? A pessoa precisará parear novamente.',
  'node.unpin_done': 'Identidade desfixada.',
  'node.denylist': 'Lista de bloqueio',
  'node.denylist_load': 'Carregar lista de bloqueio',
  'node.denylist_empty': 'A lista de bloqueio está vazia.',
  'node.denylist_count': { one: '1 entrada', other: '{n} entradas' },
  'node.denylist_remove': 'Remover',
  'node.denylist_clear_all': 'Limpar tudo',
  'node.denylist_clear_confirm': 'Remover "{subject}" da lista de bloqueio?',
  'node.denylist_cleared': 'Entrada removida da lista de bloqueio.',

  // Settings — node
  'settings_node.detach_failed_continue': 'Não foi possível desanexar o grupo do node. Excluir do hub mesmo assim?',
  'settings_node.roots': 'Diretórios compartilhados',
  'settings_node.scan_title': 'Varredura',
  'settings_node.scan_hint': 'Com que frequência o node reverifica seus diretórios em busca de mudanças que possa ter perdido, e quanto tempo espera após uma mudança antes de indexar um arquivo.',
  'settings_node.scan_reconcile_label': 'Intervalo de reverificação (minutos)',
  'settings_node.scan_debounce_label': 'Espera após uma mudança (segundos)',
  'settings_node.scan_save': 'Salvar',
  'settings_node.scan_saving': 'Salvando…',
  'settings_node.scan_saved': 'Salvo.',
  'settings_node.tmdb_title': 'Metadados do TMDB',
  'settings_node.tmdb_hint': 'Permite que o app de Vídeos mostre pôsteres, sinopses e elenco do TMDB. Desativado significa navegação apenas com miniaturas, sem nenhuma solicitação a terceiros.',
  'settings_node.tmdb_enabled': 'Ativado',
  'settings_node.tmdb_disabled': 'Desativado',
  'settings_node.tmdb_token_label': 'Token de API personalizado (opcional)',
  'settings_node.tmdb_token_placeholder': 'Deixe em branco para usar o token padrão',
  'settings_node.tmdb_token_customized': 'Um token personalizado está definido.',
  'settings_node.tmdb_token_default': 'Usando o token padrão.',
  'settings_node.tmdb_save': 'Salvar',
  'settings_node.tmdb_language_label': 'Idioma',
  'settings_node.tmdb_language_hint': 'Aplica-se a todos — um cache compartilhado, não uma solicitação por espectador.',
  'settings_node.video_root_title': 'Pasta raiz de Vídeos',
  'settings_node.video_root_hint': 'Qual pasta (ou subpasta) o app Vídeos trata como ponto de entrada para este grupo. Nada é exibido em Vídeos, e nenhuma busca no TMDB é feita, até que uma seja escolhida.',
  'settings_node.video_root_none': '— nenhuma escolhida —',
  'settings_node.musicbrainz_title': 'Metadados do MusicBrainz',
  'settings_node.musicbrainz_hint': 'Permite que o app Música mostre capas e nomes canônicos do MusicBrainz quando uma faixa não tem uma capa incorporada utilizável. Desativado significa navegação apenas por tags/nome de arquivo, sem solicitação a terceiros.',
  'settings_node.musicbrainz_enabled': 'Ativado',
  'settings_node.musicbrainz_disabled': 'Desativado',
  'settings_node.video_root_save': 'Salvar',
  'settings_node.video_root_change_confirm': 'Alterar a raiz de Vídeos substitui o que cada membro vê na aba Vídeos. Continuar?',

  'settings_node.audio_root_title': 'Pasta raiz de Música',
  'settings_node.audio_root_hint': 'Qual pasta (ou subpasta) o app Música trata como ponto de entrada para este grupo. Nada é exibido em Música, e nenhuma leitura de tags/capas é feita, até que uma seja escolhida.',
  'settings_node.audio_root_none': '— nenhuma escolhida —',
  'settings_node.audio_root_save': 'Salvar',
  'settings_node.audio_root_change_confirm': 'Alterar a raiz de Música substitui o que cada membro vê na aba Música. Continuar?',
  'settings_node.photo_roots_title': 'Pastas raiz de Fotos',
  'settings_node.photo_roots_hint': 'Quais pastas o app Fotos trata como pontos de entrada para este grupo — uma biblioteca de fotos costuma estar espalhada em várias pastas, então mais de uma pode ser escolhida. Nada é exibido em Fotos até que ao menos uma seja adicionada.',
  'settings_node.photo_roots_none': '— nenhuma escolhida —',
  'settings_node.photo_roots_add_placeholder': 'Adicionar uma pasta…',
  'settings_node.photo_roots_add': 'Adicionar',
  'settings_node.photo_roots_remove': 'Remover',
  'settings_node.photo_roots_save': 'Salvar',
  'settings_node.directories_title': 'Diretórios',
  'settings_node.directories_hint': 'Pastas compartilhadas, e qual delas os apps Vídeos, Música e Fotos tratam como seu(s) próprio(s) ponto(s) de entrada.',

  // Create group wizard
  'wizard.title': 'Criar grupo',
  'wizard.detecting': 'Detectando node local…',
  'wizard.node_not_found': 'Nenhum node local detectado. Verifique se o meshbay-node está em execução.',
  'wizard.node_offline_warning': 'O node não está em execução. O grupo será criado apenas no hub. Você pode conectar o node posteriormente pela página Node.',
  'wizard.retry': 'Tentar novamente',
  'wizard.wrong_account': 'O node está em execução, mas o nome de usuário configurado não corresponde à sua conta. Verifique hub.username em node.toml.',
  'wizard.skip_node': 'Continuar sem node',
  'wizard.directories': 'Diretórios compartilhados',
  'wizard.directories_hint': 'Escolha os diretórios que este grupo compartilhará. Pelo menos um é obrigatório.',
  'wizard.add_directory': 'Adicionar diretório',
  'wizard.remove': 'Remover',
  'wizard.set_upload': 'Definir como destino de upload',
  'wizard.upload_target': 'destino de upload',
  'wizard.create_and_setup': 'Criar e configurar',
  'wizard.create_hub_only': 'Criar apenas no hub',
  'wizard.setting_up': 'Configurando seu grupo…',
  'wizard.step_create_hub': 'Criando grupo no hub',
  'wizard.step_attach': 'Anexando ao node',
  'wizard.step_apps': 'Escolhendo aplicativos',
  'wizard.step_add_roots': 'Adicionando diretórios',
  'wizard.step_gek': 'Inicializando chave de criptografia',
  'wizard.step_pair': 'Configurando pareamento',
  'wizard.step_index': 'Indexando arquivos',
  'wizard.indexing_progress': 'Indexando… {pct}%',
  'wizard.indexing_current_dir': 'Analisando: {dir}',
  'wizard.done_title': 'Grupo criado',
  'wizard.done_message': 'Seu grupo está pronto. Seu node o está hospedando e a criptografia está configurada.',
  'wizard.go_to_group': 'Ir para o grupo',
  'wizard.finish_later': 'Finalizar configuração depois',
  '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',
};