summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/locales/pt-BR.js
blob: d6563abcbd04e780eba871b14a978e4066c7b4e0 (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
/**
 * 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',

  // Group page
  'group.default_name': 'Grupo',
  'group.tab_files': 'Arquivos',
  'group.tab_chat': 'Conversa',
  'group.tab_members': 'Membros',
  '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.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}',

  // 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.dl_path_note': 'Não é possível informar um caminho a uma página web, '
    + 'portanto não há nada a digitar aqui: o seu navegador concede acesso à pasta que '
    + 'você indicar, e o MeshBay só escreve dentro dela. Talvez seja pedida uma '
    + 'confirmação uma vez por sessão.',
  'settings.dl_unsupported': 'Este navegador não consegue escrever em uma pasta de sua '
    + 'escolha (não tem a File System Access API), então os downloads vão para a pasta '
    + 'de downloads dele. Chrome e Edge permitem escolher uma.',
  'settings.profile': 'Perfil',
  'settings.username': 'Nome de usuário',
  '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.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.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 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_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.visibility': 'Visibilidade',
  'create_group.private': 'Privado',
  'create_group.private_desc': 'Só os membros convidados veem os arquivos e acessam a eles',
  'create_group.public': 'Público',
  'create_group.public_desc': 'Qualquer pessoa pode descobrir e explorar este grupo',
  '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',
  'create_group.open': 'Aberto (qualquer pessoa pode entrar)',
  'create_group.open_desc': 'Qualquer pessoa pode 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.synced': 'sincronizado {ago}',
  'search.cache_note': 'A pesquisa usa o estado de cada grupo na última vez que você o '
    + 'abriu. Abra um grupo para atualizar os arquivos dele aqui.',
  'search.col_group': 'Grupo',
  'search.result_count': {
    one: '{n} arquivo encontrado',
    other: '{n} arquivos encontrados',
  },
  'search.hint': 'Pesquisa nomes de arquivo em todos os índices de grupo em cache.',

  // 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',
  '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.',
  'profile.title': 'Perfil',
  'usermenu.profile': 'Perfil',
  'create_group.public_is_open': 'Qualquer pessoa pode encontrar um grupo público e entrar nele. Para escolher quem entra, crie-o como privado.',
};