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
|
/**
* 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',
// 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.success_title': 'Conta criada',
'register.success_msg': 'Agora você pode entrar com suas credenciais.',
'register.go_login': 'Ir para o login',
'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.',
// 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.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.',
// 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': 'Save',
'settings.email_saved': 'Email updated',
'settings.notif_global_disable': 'Disable all notifications',
'settings.notif_global_hint': 'When enabled, no notifications are created for any group.',
'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. Off by default — most people want their phone to lock normally while listening, like Spotify or Deezer.',
'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.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. A hub on your own machine is usually http, not https.',
'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} — envie a ele pelo meio '
+ 'que vocês costumam usar. Funciona uma única vez e nunca passa pelo hub.',
'members.invite_code_hint': 'A pessoa digita o código na primeira vez que abrir este '
+ 'grupo. Você não precisa estar on-line nesse momento.',
'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',
'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.title': 'Pesquisar arquivos',
'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.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',
};
|