@object-ui/i18n 17.2.0 → 17.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +1817 -1
  2. package/README.md +26 -13
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +14 -1
  5. package/dist/locales/ar.d.ts +550 -107
  6. package/dist/locales/ar.js +646 -156
  7. package/dist/locales/de.d.ts +550 -107
  8. package/dist/locales/de.js +661 -178
  9. package/dist/locales/en.d.ts +586 -143
  10. package/dist/locales/en.js +851 -143
  11. package/dist/locales/es.d.ts +550 -107
  12. package/dist/locales/es.js +647 -160
  13. package/dist/locales/fr.d.ts +550 -107
  14. package/dist/locales/fr.js +640 -155
  15. package/dist/locales/index.d.ts +5587 -1157
  16. package/dist/locales/ja.d.ts +550 -107
  17. package/dist/locales/ja.js +632 -149
  18. package/dist/locales/ko.d.ts +550 -107
  19. package/dist/locales/ko.js +638 -156
  20. package/dist/locales/pt.d.ts +550 -107
  21. package/dist/locales/pt.js +639 -157
  22. package/dist/locales/ru.d.ts +550 -107
  23. package/dist/locales/ru.js +650 -156
  24. package/dist/locales/zh.d.ts +588 -145
  25. package/dist/locales/zh.js +629 -145
  26. package/dist/pickLocalized.d.ts +21 -0
  27. package/dist/pickLocalized.js +40 -7
  28. package/dist/provider.d.ts +125 -1
  29. package/dist/provider.js +380 -4
  30. package/dist/useDisplayLocale.d.ts +49 -0
  31. package/dist/useDisplayLocale.js +55 -0
  32. package/dist/useObjectLabel.d.ts +8 -2
  33. package/dist/useObjectLabel.js +28 -8
  34. package/dist/useSafeTranslation.js +67 -3
  35. package/dist/utils/index.d.ts +1 -0
  36. package/dist/utils/index.js +1 -0
  37. package/dist/utils/number-display.d.ts +32 -0
  38. package/dist/utils/number-display.js +32 -0
  39. package/dist/utils/spec-formatters.d.ts +39 -13
  40. package/dist/utils/spec-formatters.js +3 -3
  41. package/package.json +5 -4
@@ -1,4 +1,18 @@
1
1
  const pt = {
2
+ // objectui#4467 — the impersonation banner (app-shell ImpersonationBanner).
3
+ // Raised by `session.impersonatedBy`, so it survives SPA reboots; it names
4
+ // BOTH parties because the audit trail attributes the work to the impersonated
5
+ // user, and the exit states its own failure rather than appearing to succeed.
6
+ impersonation: {
7
+ banner: {
8
+ message: 'Você está personificando {{user}} — todas as ações são registradas em nome dele.',
9
+ startedBy: 'Iniciado pelo administrador {{admin}}.',
10
+ stop: 'Parar personificação',
11
+ stopping: 'Encerrando…',
12
+ stopFailed: 'Não foi possível parar a personificação: {{reason}}',
13
+ notRestored: 'O servidor aceitou a solicitação, mas não restaurou sua sessão de administrador — você ainda está personificando {{user}}. Saia e entre novamente para encerrar.',
14
+ },
15
+ },
2
16
  // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
3
17
  capability: {
4
18
  label: {
@@ -16,6 +30,25 @@ const pt = {
16
30
  other: 'Outro',
17
31
  },
18
32
  },
33
+ // objectui#3546 slice six — o resumo somente leitura das facetas de
34
+ // autorização de PermissionFacetLink. "aba" como em list.tabs.
35
+ perm: {
36
+ facet: {
37
+ none: "Nenhum",
38
+ more: "+{{count}} mais",
39
+ objects: "{{count}} objetos",
40
+ objects_one: "{{count}} objeto",
41
+ fields: "{{count}} regras de campo",
42
+ fields_one: "{{count}} regra de campo",
43
+ rls: "{{count}} políticas RLS",
44
+ rls_one: "{{count}} política RLS",
45
+ tabs: "{{count}} regras de aba",
46
+ tabs_one: "{{count}} regra de aba",
47
+ adminScope: "Administração delegada configurada",
48
+ designInStudio: "Projetar no Studio →",
49
+ designInStudioHint: "Projetar no Studio",
50
+ },
51
+ },
19
52
  lookup: {
20
53
  recentlyUsed: 'Usados recentemente',
21
54
  allResults: 'Todos os resultados',
@@ -46,13 +79,12 @@ const pt = {
46
79
  common: {
47
80
  addToFavorites: "Adicionar aos favoritos",
48
81
  removeFromFavorites: "Remover dos favoritos",
49
- loading: "Carregando...",
82
+ loading: "Carregando…",
50
83
  save: "Salvar",
51
84
  cancel: "Cancelar",
52
85
  delete: "Excluir",
53
86
  edit: "Editar",
54
87
  create: "Criar",
55
- search: "Pesquisar",
56
88
  filter: "Filtrar",
57
89
  reset: "Redefinir",
58
90
  confirm: "Confirmar",
@@ -76,11 +108,20 @@ const pt = {
76
108
  required: "Obrigatório",
77
109
  optional: "Opcional",
78
110
  selectOption: "Selecionar uma opção",
79
- select: "Selecionar...",
111
+ select: "Selecionar…",
80
112
  openChat: "Abrir chat",
81
113
  closeChat: "Fechar chat",
114
+ closePanel: "Fechar painel",
115
+ resizeDrawer: "Redimensionar painel",
116
+ itemCount: "{{count}} itens",
117
+ itemCountOne: "{{count}} item",
82
118
  toggleSidebar: "Alternar barra lateral",
83
119
  package: "Pacote",
120
+ done: "Concluído",
121
+ editInStudio: "Editar no Studio",
122
+ record: "Registro",
123
+ retry: "Tentar novamente",
124
+ printDialogHint: "Abre a caixa de diálogo de impressão do navegador (não é uma exportação para PDF)",
84
125
  },
85
126
  actions: {
86
127
  decisionOutput: {
@@ -103,6 +144,7 @@ const pt = {
103
144
  url: "Por favor, insira uma URL válida",
104
145
  pattern: "O formato de {{field}} é inválido",
105
146
  formInvalid: "Verifique os campos destacados: {{fields}}",
147
+ formInvalidJoiner: ", ",
106
148
  unique: "{{field}} deve ser único",
107
149
  type: "{{field}} deve ser um {{type}} válido",
108
150
  },
@@ -111,6 +153,9 @@ const pt = {
111
153
  submitFailed: "Não foi possível salvar. Tente novamente.",
112
154
  discardTitle: "Descartar as alterações?",
113
155
  discardMessage: "Você tem alterações não salvas. Se fechar este formulário agora, suas edições serão perdidas.",
156
+ // objectui#4024 — the create/edit dialog's `sr-only` accessible
157
+ // description, used when the form declares no `description` of its own.
158
+ dialogDescriptionFallback: "Preencha os campos do formulário e depois envie ou cancele.",
114
159
  keepEditing: "Continuar editando",
115
160
  discard: "Descartar",
116
161
  conflictTitle: "Conflito ao salvar",
@@ -127,12 +172,21 @@ const pt = {
127
172
  stepOf: "Etapa {{current}} de {{total}}",
128
173
  createTitle: "Criar {{object}}",
129
174
  editTitle: "Editar {{object}}",
175
+ viewTitle: "Ver {{object}}",
176
+ createTargetOrg: "Criação em {{org}}",
130
177
  saveRecord: "Salvar registro",
131
178
  create: "Criar",
132
179
  update: "Atualizar",
133
180
  createSuccess: "{{object}} criado",
134
181
  updateSuccess: "{{object}} atualizado",
135
182
  deleteSuccess: "{{object}} excluído",
183
+ fullscreen: {
184
+ title: "Editar texto",
185
+ description: "Edite o valor de texto completo e depois salve ou cancele as alterações.",
186
+ done: "Concluído",
187
+ toggle: "Editar {{label}} em tela cheia",
188
+ textFallback: "texto",
189
+ },
136
190
  },
137
191
  fields: {
138
192
  image: {
@@ -170,7 +224,11 @@ const pt = {
170
224
  richText: {
171
225
  format: "Formato: {{format}}",
172
226
  basicEditorHint: "Editor de texto rico (básico)",
173
- placeholder: "Digite algo...",
227
+ placeholder: "Digite algo…",
228
+ },
229
+ options: {
230
+ empty: "Nenhuma opção disponível",
231
+ selectFirst: "Selecione primeiro {{fields}}",
174
232
  },
175
233
  objectRef: {
176
234
  loading: "Carregando objetos…",
@@ -199,6 +257,13 @@ const pt = {
199
257
  editAsJson: "Editar como JSON",
200
258
  useVisualBuilder: "Usar o construtor visual",
201
259
  },
260
+ tags: {
261
+ placeholder: "Digite e pressione Enter para adicionar…",
262
+ },
263
+ textarea: {
264
+ characterCount: "Contagem de caracteres: {{count}} de {{max}}",
265
+ charactersRemaining: "Caracteres restantes: {{count}}",
266
+ },
202
267
  },
203
268
  table: {
204
269
  rowsPerPage: "Linhas por página",
@@ -225,7 +290,7 @@ const pt = {
225
290
  saveAll: "Salvar tudo ({{count}})",
226
291
  addRecord: "Adicionar registro",
227
292
  open: "Abrir",
228
- search: "Pesquisar...",
293
+ search: "Pesquisar…",
229
294
  modified: "{{count}} linha(s) modificada(s)",
230
295
  saveFailed: 'Falha ao salvar',
231
296
  selected: "{{count}} selecionado(s)",
@@ -269,7 +334,7 @@ const pt = {
269
334
  delete: "Excluir",
270
335
  export: "Exportar",
271
336
  exportAs: "Exportar como {{format}}",
272
- loading: "Carregando grade...",
337
+ loading: "Carregando grade…",
273
338
  errorLoading: "Erro ao carregar grade",
274
339
  pullToRefresh: "Puxe para atualizar",
275
340
  refreshing: "Atualizando…",
@@ -280,6 +345,22 @@ const pt = {
280
345
  yes: "Sim",
281
346
  no: "Não",
282
347
  systemFields: "Sistema",
348
+ // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
349
+ // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
350
+ // pack controls its own separator and word order.
351
+ summary: {
352
+ pattern: "{{label}}: {{value}}",
353
+ count: "Contagem",
354
+ countEmpty: "Vazios",
355
+ countFilled: "Preenchidos",
356
+ countUnique: "Únicos",
357
+ percentEmpty: "Vazios",
358
+ percentFilled: "Preenchidos",
359
+ sum: "Soma",
360
+ avg: "Média",
361
+ min: "Mín.",
362
+ max: "Máx.",
363
+ },
283
364
  toolbar: {
284
365
  densityMode: "Densidade",
285
366
  densityCompact: "Compacto",
@@ -393,12 +474,12 @@ const pt = {
393
474
  templateName: "Nome do modelo",
394
475
  save: "Salvar",
395
476
  deleteTemplate: "Excluir modelo",
396
- savedMapping: 'Saved mapping:',
397
- chooseSavedMapping: 'Choose a saved mapping…',
398
- manualMapping: '— Map columns manually —',
399
- transform: 'Transform',
400
- savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
401
- savedMappingPreviewNote: 'The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.',
477
+ savedMapping: 'Mapeamento salvo:',
478
+ chooseSavedMapping: 'Escolher um mapeamento salvo…',
479
+ manualMapping: '— Mapear colunas manualmente —',
480
+ transform: 'Transformação',
481
+ savedMappingHint: 'O mapeamento "{{name}}" aplica renomeação + transformações + conversão de tipos no servidor. O mapeamento de colunas é somente leitura.',
482
+ savedMappingPreviewNote: 'A pré-visualização mostra suas colunas de origem; na importação, o mapeamento "{{name}}" aplica renomeação, transformações e conversão de tipos no servidor.',
402
483
  csvColumn: "Coluna",
403
484
  mapsTo: "Mapeia para",
404
485
  typeMismatch: "Parece {{type}}",
@@ -458,6 +539,8 @@ const pt = {
458
539
  loadErrorUnauthorizedMessage: "Sua sessão expirou ou você saiu. Entre novamente para ver estes registros.",
459
540
  loadErrorRejectedTitle: "A consulta desta visualização foi rejeitada",
460
541
  loadErrorRejectedMessage: "O servidor não conseguiu processar o filtro ou as opções de consulta desta visualização. Limpar os filtros costuma resolver; se a visualização estiver salva assim, um administrador precisa corrigi-la.",
542
+ loadErrorApiDisabledTitle: "Este objeto não está disponível pela API",
543
+ loadErrorApiDisabledMessage: "Esta página não consegue carregar seus registros porque o objeto não está exposto pela API. Isso é uma configuração do próprio objeto, não uma permissão — um administrador precisa habilitar o acesso via API para que esta página funcione.",
461
544
  retry: "Tentar novamente",
462
545
  managedBy: {
463
546
  system: {
@@ -482,7 +565,7 @@ const pt = {
482
565
  },
483
566
  },
484
567
  refresh: "Atualizar",
485
- loading: 'Loading records...',
568
+ loading: "Carregando registros…",
486
569
  recordCount: "{{count}} registros",
487
570
  recordCountOne: "{{count}} registro",
488
571
  addRecord: "Adicionar registro",
@@ -494,7 +577,8 @@ const pt = {
494
577
  sort: "Ordenar",
495
578
  sortRecords: "Ordenar registros",
496
579
  sortByIdSuffix: "(por ID)",
497
- sortRelationalHint: "As colunas que apontam para outro registro não são listadas: elas só podem ser ordenadas pelo ID armazenado, não pelo nome exibido na célula. Para ordenar por esse nome, adicione um campo de fórmula que o contenha.",
580
+ sortRelationalHint: "As colunas que apontam para outro registro não são listadas: elas só podem ser ordenadas pelo ID armazenado, não pelo nome exibido na célula. Para ordenar por esse nome, desnormalize-o neste objeto como um campo armazenado, gravado quando a origem muda, e ordene por ele. Não um campo de fórmula: ele é virtual, nenhuma coluna é armazenada para ele e o servidor recusa ordenar por ele.",
581
+ resetSortToDefault: "Restaurar o padrão da exibição",
498
582
  group: "Agrupar",
499
583
  groupBy: "Agrupar por",
500
584
  export: "Exportar",
@@ -552,13 +636,16 @@ const pt = {
552
636
  },
553
637
  kanban: {
554
638
  uncategorized: "Sem categoria",
639
+ columns: "colunas",
555
640
  addCard: "Adicionar cartão",
556
641
  addColumn: "Adicionar coluna",
557
642
  moveCard: "Mover cartão",
558
643
  deleteCard: "Excluir cartão",
559
644
  deleteColumn: "Excluir coluna",
560
645
  noCards: "Sem cartões",
561
- cardTitlePlaceholder: "Digite o título do cartão...",
646
+ cardTitlePlaceholder: "Digite o título do cartão…",
647
+ requiredFieldsTitle: "Preencha os campos obrigatórios",
648
+ requiredFieldsDescription: "Esta movimentação torna os campos abaixo obrigatórios. Preencha-os para continuar.",
562
649
  },
563
650
  timeline: {
564
651
  bucket: {
@@ -571,6 +658,13 @@ const pt = {
571
658
  noDate: "Sem data",
572
659
  unassigned: "Não atribuído",
573
660
  },
661
+ scale: {
662
+ week: "Semana {{n}}",
663
+ quarter: "T{{quarter}} {{year}}",
664
+ },
665
+ gantt: {
666
+ rowLabel: "Itens",
667
+ },
574
668
  },
575
669
  gantt: {
576
670
  viewMode: {
@@ -617,6 +711,18 @@ const pt = {
617
711
  ff: "Término → Término",
618
712
  sf: "Início → Término",
619
713
  },
714
+ linkEnd: {
715
+ start: "Início",
716
+ end: "Fim",
717
+ },
718
+ link: {
719
+ rejected: {
720
+ self: "Uma tarefa não pode depender de si mesma.",
721
+ locked: "Esta linha está bloqueada e não pode receber uma nova dependência.",
722
+ group: "Uma linha de resumo não pode receber dependências: vincule uma das suas tarefas.",
723
+ cycle: "Esse vínculo criaria uma dependência circular.",
724
+ },
725
+ },
620
726
  conflict: {
621
727
  title: "Conflito de agendamento",
622
728
  body: "Esta movimentação conflita com as restrições de dependência. Reagendar automaticamente {{count}} tarefa(s) afetada(s)?",
@@ -625,8 +731,8 @@ const pt = {
625
731
  },
626
732
  autoScheduleDlg: {
627
733
  title: "Agendamento automático",
628
- body: "Adiar {count} tarefa(s) para atender aos vínculos de dependência?",
629
- skipped: "{count} tarefa(s) bloqueada(s) também violam os vínculos e foram ignoradas.",
734
+ body: "Adiar {{count}} tarefa(s) para atender aos vínculos de dependência?",
735
+ skipped: "{{count}} tarefa(s) bloqueada(s) também violam os vínculos e foram ignoradas.",
630
736
  confirm: "Aplicar",
631
737
  cancel: "Cancelar",
632
738
  none: "Todas as dependências foram atendidas — nada a reagendar.",
@@ -637,6 +743,12 @@ const pt = {
637
743
  over: "sobrecarregado",
638
744
  empty: "Nenhuma tarefa para alocar.",
639
745
  },
746
+ quickFilter: {
747
+ all: "Todos",
748
+ clear: "Limpar filtros",
749
+ empty: "Sem opções",
750
+ resultSummary: "Exibindo {shown} / {total} tarefas",
751
+ },
640
752
  readOnly: "Somente leitura",
641
753
  readOnlyHint: "A edição está desativada nesta visão.",
642
754
  lockedHint: "Sem permissão de edição",
@@ -657,6 +769,7 @@ const pt = {
657
769
  exportPng: "Exportar como PNG",
658
770
  exportPdf: "Exportar PDF",
659
771
  saveLayout: "Salvar o layout",
772
+ refresh: "Atualizar",
660
773
  undo: "Desfazer",
661
774
  redo: "Refazer",
662
775
  prevPeriod: "Período anterior",
@@ -697,11 +810,11 @@ const pt = {
697
810
  defaultBadge: "padrão",
698
811
  tabActionsFor: "Ações de exibição para {{name}}",
699
812
  readonlyAriaLabel: "Exibição somente leitura",
700
- readonlyTooltip: "Exibição do sistema — duplique para personalizar.",
813
+ readonlyTooltip: "Exibição do sistema — definida no código, somente leitura.",
701
814
  },
702
815
  designer: {
703
- undo: 'Undo',
704
- redo: 'Redo',
816
+ undo: "Desfazer",
817
+ redo: "Refazer",
705
818
  },
706
819
  detail: {
707
820
  editInlineHint: "Clique duas vezes para editar",
@@ -721,6 +834,15 @@ const pt = {
721
834
  viewHistory: "Ver histórico",
722
835
  delete: "Excluir",
723
836
  moreActions: "Mais ações",
837
+ addReaction: "Adicionar reação",
838
+ pageHeaderActions: "Ações do cabeçalho da página",
839
+ emojiPicker: "Seletor de emojis",
840
+ reactionCount: "{{emoji}} {{count}} reações",
841
+ reactionCountOne: "{{emoji}} {{count}} reação",
842
+ recordDetail: "Detalhe do registro",
843
+ recordDetailWithLabel: "Detalhe de {{label}}",
844
+ openAsFullPage: "Abrir como página inteira",
845
+ recordDetailOverlay: "Sobreposição de detalhe do registro para {{title}}.",
724
846
  addToFavorites: "Adicionar aos favoritos",
725
847
  removeFromFavorites: "Remover dos favoritos",
726
848
  previousRecord: "Registro anterior",
@@ -734,13 +856,15 @@ const pt = {
734
856
  relatedRecords: "{{count}} registros",
735
857
  relatedRecordOne: "{{count}} registro",
736
858
  noRelatedRecords: "Nenhum registro relacionado encontrado",
737
- loading: "Carregando...",
859
+ loading: "Carregando…",
738
860
  copyToClipboard: "Copiar para área de transferência",
739
861
  copied: "Copiado!",
740
862
  deleteConfirmation: "Tem certeza de que deseja excluir este registro?",
863
+ deleted: "Registro excluído",
741
864
  editRecord: "Editar registro",
742
865
  viewAll: "Ver tudo",
743
866
  new: "Novo",
867
+ add: "Adicionar",
744
868
  emptyValue: "—",
745
869
  comments: "Comentários",
746
870
  searchComments: "Pesquisar comentários…",
@@ -805,6 +929,7 @@ const pt = {
805
929
  loadMore: "Carregar mais",
806
930
  edited: "(editado)",
807
931
  via: "via {{source}}",
932
+ viewSource: "Ver origem",
808
933
  replyCount: "{{count}} resposta",
809
934
  replyCountPlural: "{{count}} respostas",
810
935
  replyPlaceholder: "Responder…",
@@ -817,14 +942,15 @@ const pt = {
817
942
  saving: "Salvando…",
818
943
  lockedByApproval: "Bloqueado para aprovação",
819
944
  lockedTooltip: "Este registro tem uma solicitação de aprovação pendente; a edição está bloqueada",
820
- writeStrippedTitle: "Alguns campos não foram salvos",
821
- writeStrippedReadonly: "Somente leitura, portanto não foi salvo: {{fields}}",
822
- writeStrippedByState: "Não editável no estado atual deste registro, portanto não foi salvo: {{fields}}",
945
+ writeStrippedTitle: "Salvo, mas alguns campos não foram aplicados",
946
+ writeStrippedReadonly: "Somente leitura, portanto não foi aplicado: {{fields}}",
947
+ writeStrippedByState: "Não editável no estado atual deste registro, portanto não foi aplicado: {{fields}}",
823
948
  approvalPendingEditable: "Em aprovação · editável",
824
949
  approvalPendingTooltip: "Este registro tem uma solicitação de aprovação pendente; esta etapa ainda permite a edição",
825
950
  approvalProgress: "Aprovações — {{got}} de {{need}}",
826
951
  approvalProgressGroups: "Assinaturas — {{got}} de {{need}} grupos",
827
952
  approvalProgressLabel: "Progresso da aprovação",
953
+ approvalsPanelTitle: "Aprovações",
828
954
  cancelApproval: "Cancelar aprovação",
829
955
  cancelApprovalInFlight: "Cancelando…",
830
956
  cancelApprovalTooltip: "Cancelar a solicitação de aprovação pendente para desbloquear o registro",
@@ -837,7 +963,7 @@ const pt = {
837
963
  cancelEdit: "Descartar alterações",
838
964
  sectionMoreDetails: "Mais detalhes",
839
965
  concurrentUpdateTitle: "Este registro foi modificado por outra pessoa",
840
- concurrentUpdateDescription: "Outro usuário salvou uma versão mais recente de {{field}} durante sua edição. Escolha como resolver o conflito.",
966
+ concurrentUpdateDescription: "Outro usuário salvou, durante sua edição, uma versão mais recente que afeta {{field}}. Escolha como resolver o conflito.",
841
967
  concurrentUpdateYourEdit: "Sua edição",
842
968
  concurrentUpdateCurrentValue: "Valor atual",
843
969
  concurrentUpdateUpdatedBy: "Atualizado por {{name}}",
@@ -845,9 +971,11 @@ const pt = {
845
971
  concurrentUpdateReload: "Carregar versão atual",
846
972
  concurrentUpdateOverwrite: "Sobrescrever mesmo assim",
847
973
  concurrentUpdateCancel: "Cancelar",
974
+ concurrentUpdateRecordLabel: "este registro",
848
975
  openInNewTab: "Abrir em nova aba",
849
976
  activity: "Atividade",
850
977
  history: "Histórico",
978
+ historyEmpty: "Nenhum histórico ainda",
851
979
  editRow: "Editar",
852
980
  deleteRow: "Excluir",
853
981
  deleteRowConfirmation: "Excluir este registro?",
@@ -857,10 +985,13 @@ const pt = {
857
985
  nextPage: "Próximo",
858
986
  pageOf: "Página {{current}} de {{total}}",
859
987
  sortBy: "Ordenar por",
860
- filterPlaceholder: "Filtrar...",
988
+ filterPlaceholder: "Filtrar…",
861
989
  highlightFields: "Campos principais",
862
990
  createdBy: "Criado por",
863
991
  updatedBy: "Atualizado por",
992
+ // objectui#3863 — base key. pt's third category `many` starts at a million, where
993
+ // the plural form is correct, so the base repeats `_other`.
994
+ showEmptyRelated: "+ {{count}} vazios",
864
995
  showEmptyRelated_one: "+ {{count}} vazio",
865
996
  showEmptyRelated_other: "+ {{count}} vazios",
866
997
  copyEmail: "Copiar e-mail",
@@ -872,7 +1003,8 @@ const pt = {
872
1003
  },
873
1004
  chart: {
874
1005
  noData: "Nenhum dado de gráfico disponível",
875
- loading: "Carregando gráfico...",
1006
+ loading: "Carregando gráfico…",
1007
+ nullCategory: "(Não especificado)",
876
1008
  },
877
1009
  map: {
878
1010
  searchLocations: "Pesquisar locais…",
@@ -894,8 +1026,8 @@ const pt = {
894
1026
  properties: "Propriedades",
895
1027
  connections: "Conexões",
896
1028
  quickConnect: "Conexão rápida",
897
- fromPlaceholder: "De...",
898
- toPlaceholder: "Para...",
1029
+ fromPlaceholder: "De…",
1030
+ toPlaceholder: "Para…",
899
1031
  connect: "Conectar",
900
1032
  label: "Rótulo",
901
1033
  type: "Tipo",
@@ -943,6 +1075,7 @@ const pt = {
943
1075
  },
944
1076
  dashboard: {
945
1077
  noRows: "Sem linhas",
1078
+ loading: "Carregando…",
946
1079
  pickMeasures: "Escolha medidas (valores) para este widget de dataset.",
947
1080
  datasetUnsupported: "Esta fonte de dados não oferece suporte a consultas de dataset.",
948
1081
  details: "Detalhes",
@@ -1036,7 +1169,7 @@ const pt = {
1036
1169
  faviconUrl: "Favicon URL",
1037
1170
  preview: "Pré-visualização",
1038
1171
  complete: "Concluir",
1039
- snakeCaseHint: "Must be snake_case (e.g. my_app)",
1172
+ snakeCaseHint: "Deve ser snake_case (ex. my_app)",
1040
1173
  modeEdit: "Editar",
1041
1174
  modePreview: "Pré-visualizar",
1042
1175
  modeCode: "Código",
@@ -1200,6 +1333,7 @@ const pt = {
1200
1333
  },
1201
1334
  },
1202
1335
  console: {
1336
+ saveAdvisoryTitle: "Salvo — a verificação de criação gerou {{count}} recomendação(ões)",
1203
1337
  settingsHub: {
1204
1338
  title: "Configurações",
1205
1339
  subtitle: "Configure seu workspace, integrações e sinalizadores de recursos.",
@@ -1266,7 +1400,7 @@ const pt = {
1266
1400
  shareTitle: "Compartilhar esta conversa",
1267
1401
  shareDisabledTitle: "Comece a conversar para habilitar o compartilhamento",
1268
1402
  newChat: "Nova",
1269
- searchChats: "Pesquisar conversas...",
1403
+ searchChats: "Pesquisar conversas…",
1270
1404
  noChatsYet: "Ainda não há conversas",
1271
1405
  noChatsDescription: "Inicie uma nova conversa para vê-la aqui.",
1272
1406
  noMatchingChats: "Nenhuma conversa correspondente.",
@@ -1275,18 +1409,18 @@ const pt = {
1275
1409
  deleteConversation: "Excluir conversa",
1276
1410
  saveRename: "Salvar novo nome",
1277
1411
  cancelRename: "Cancelar renomeação",
1278
- loadingHistory: "Carregando o histórico da conversa...",
1412
+ loadingHistory: "Carregando o histórico da conversa…",
1279
1413
  conversationReady: "Conversa pronta",
1280
1414
  preparingConversation: "Preparando uma nova conversa",
1281
1415
  offlineDemoMode: "Modo de demonstração off-line — lista de agentes indisponível",
1282
1416
  sendFailedRateLimited: "Você está enviando mensagens rápido demais. Sua mensagem foi mantida abaixo — aguarde um momento e tente novamente.",
1283
1417
  sendFailedGeneric: "Não foi possível enviar sua mensagem. Ela foi mantida abaixo — tente novamente.",
1284
- askAgent: "Pergunte a {{agent}}...",
1418
+ askAgent: "Pergunte a {{agent}}…",
1285
1419
  assistant: "Assistente",
1286
1420
  liveCanvas: "Pré-visualização ao vivo — {{app}} (rascunho)",
1287
1421
  liveCanvasUnlisted: "Aplicativo ao vivo — {{app}} (não listado até ser publicado)",
1288
- loadingAgents: "Carregando agentes...",
1289
- askAnything: "Pergunte qualquer coisa...",
1422
+ loadingAgents: "Carregando agentes…",
1423
+ askAnything: "Pergunte qualquer coisa…",
1290
1424
  emptyTitle: "Iniciar uma conversa",
1291
1425
  emptyDescription: "Pergunte qualquer coisa — o assistente tem acesso ao contexto do seu aplicativo atual.",
1292
1426
  switchAssistant: "Trocar de assistente",
@@ -1389,9 +1523,60 @@ const pt = {
1389
1523
  createSeed: "Gerar dados de exemplo",
1390
1524
  createPackage: "Criar pacote de aplicativo",
1391
1525
  },
1526
+ // objectui#3546 slice four — the AI console surfaces: the /ai chat page's app switcher,
1527
+ // connection banner and plan/publish cards, the ChatDock chrome, and the
1528
+ // conversation-list date buckets. `group.*` is the template-key family
1529
+ // `console.ai.group.${key}` (ConversationsSidebar), enumerated from the
1530
+ // ConversationGroupKey union — all five members, no wildcard.
1531
+ collapseToDock: "Recolher para o painel lateral",
1532
+ switchApp: "Trocar de aplicativo",
1533
+ switchAppLabel: "Conversas de criação por aplicativo",
1534
+ newApp: "Novo aplicativo",
1535
+ connectionWaiting: "Aguardando o servidor…",
1536
+ connectionStalled: "Ainda processando…",
1537
+ connectionOffline: "Conexão perdida — reconectando…",
1538
+ designingPlan: "Projetando seu aplicativo…",
1539
+ designingPlanHint: {
1540
+ data: "Mapeando os dados que você vai acompanhar…",
1541
+ objects: "Modelando os objetos e seus campos…",
1542
+ relations: "Conectando os registros relacionados…",
1543
+ lookups: "Configurando as relações e os campos de busca…",
1544
+ views: "Planejando as telas e as visualizações…",
1545
+ forms: "Organizando os formulários e as listas…",
1546
+ defaults: "Adicionando valores padrão e validações sensatas…",
1547
+ dashboard: "Esboçando um painel para acompanhar…",
1548
+ review: "Verificando se a estrutura faz sentido…",
1549
+ finalize: "Reunindo o plano…",
1550
+ },
1551
+ planBuilding: "Criando…",
1552
+ planBuilt: "Criado",
1553
+ planDeferred: "Ainda não criado",
1554
+ planReady: "O plano está pronto. Crie agora ou diga o que ajustar.",
1555
+ published: "Publicado",
1556
+ publishFailed: "Falha ao publicar",
1557
+ unavailableTitle: "Assistente de IA indisponível",
1558
+ unavailableDescription: "Esta implantação não tem um assistente de IA habilitado. Todo o resto funciona normalmente.",
1559
+ unavailableError: "Não foi possível acessar o serviço de IA. Ele pode estar temporariamente off-line — tente novamente ou volte ao início.",
1560
+ unavailableRetry: "Tentar novamente",
1561
+ unavailableHome: "Voltar ao início",
1562
+ dock: {
1563
+ title: "Assistente",
1564
+ description: "Conversa com o assistente de IA",
1565
+ resize: "Redimensionar a conversa",
1566
+ collapse: "Recolher a conversa",
1567
+ maximize: "Abrir como página inteira",
1568
+ open: "Abrir o assistente",
1569
+ },
1570
+ group: {
1571
+ today: "Hoje",
1572
+ yesterday: "Ontem",
1573
+ previous7Days: "7 dias anteriores",
1574
+ previous30Days: "30 dias anteriores",
1575
+ older: "Mais antigas",
1576
+ },
1392
1577
  },
1393
1578
  title: "Console ObjectStack",
1394
- initializing: "Inicializando aplicação...",
1579
+ initializing: "Inicializando aplicação…",
1395
1580
  loadingHint: "Configurar um novo ambiente pode levar alguns instantes.",
1396
1581
  breadcrumb: {
1397
1582
  dashboards: "Painéis",
@@ -1399,6 +1584,31 @@ const pt = {
1399
1584
  reports: "Relatórios",
1400
1585
  system: "Sistema",
1401
1586
  },
1587
+ // objectui#4024 — the single-namespace settings screen. Its sibling
1588
+ // `settingsHub` above already resolved through this pack; the view was the
1589
+ // one file still carrying English literals.
1590
+ settingsView: {
1591
+ backToHub: "Todas as configurações",
1592
+ back: "Voltar",
1593
+ noNamespace: "Nenhum namespace selecionado.",
1594
+ loadError: "Falha ao carregar as configurações",
1595
+ saved: "Configurações salvas",
1596
+ saveFailed: "Falha ao salvar",
1597
+ lockedByEnv: "Bloqueado pelo ambiente: {{key}}",
1598
+ lockedByEnvNoKey: "Bloqueado pelo ambiente",
1599
+ actionSucceeded: "A ação foi concluída",
1600
+ actionFailed: "A ação falhou",
1601
+ discard: "Descartar",
1602
+ saveChanges: "Salvar alterações",
1603
+ unsavedCount: "{{count}} alterações não salvas",
1604
+ unsavedCount_one: "{{count}} alteração não salva",
1605
+ unsavedCount_other: "{{count}} alterações não salvas",
1606
+ cryptoRefusalTitle: "Esta implantação não consegue criptografar segredos",
1607
+ cryptoRefusalSubjectSuffix: "está declarado como criptografado, portanto nada foi gravado.",
1608
+ cryptoRefusalNoSubject: "O valor declarado como criptografado foi recusado, portanto nada foi gravado.",
1609
+ cryptoRefusalToast: "Não é possível criptografar segredos: {{subject}}",
1610
+ cryptoRefusalToastNoSubject: "Não é possível criptografar segredos",
1611
+ },
1402
1612
  loadingSteps: {
1403
1613
  connecting: "Conectando à fonte de dados",
1404
1614
  loadingConfig: "Carregando configuração",
@@ -1414,6 +1624,13 @@ const pt = {
1414
1624
  retry: "Tentar novamente",
1415
1625
  retrying: "Tentando novamente…",
1416
1626
  },
1627
+ serverAction: {
1628
+ openingTitle: "Abrindo…",
1629
+ openingBody: "Abrindo… isso pode levar um momento.",
1630
+ popupBlockedTitle: "Pop-up bloqueado",
1631
+ popupBlockedDescription: "O navegador bloqueou a abertura da nova aba.",
1632
+ popupBlockedAction: "Abrir em nova aba",
1633
+ },
1417
1634
  shortcuts: {
1418
1635
  title: "Atalhos de teclado",
1419
1636
  description: "Referência rápida de todos os atalhos de teclado disponíveis.",
@@ -1421,6 +1638,7 @@ const pt = {
1421
1638
  general: "Geral",
1422
1639
  navigation: "Navegação",
1423
1640
  dataViews: "Visualizações de dados",
1641
+ aiChat: "Assistente de IA",
1424
1642
  preferences: "Preferências",
1425
1643
  },
1426
1644
  openCommandPalette: "Abrir paleta de comandos",
@@ -1431,11 +1649,13 @@ const pt = {
1431
1649
  createRecord: "Criar novo registro",
1432
1650
  refreshData: "Atualizar dados",
1433
1651
  editRecord: "Editar registro selecionado",
1652
+ newChat: "Nova conversa",
1653
+ toggleChatsList: "Alternar lista de conversas",
1434
1654
  toggleDarkMode: "Alternar modo escuro",
1435
1655
  },
1436
1656
  commandPalette: {
1437
1657
  title: "Paleta de comandos",
1438
- placeholder: "Digite um comando ou pesquise...",
1658
+ placeholder: "Digite um comando ou pesquise…",
1439
1659
  noResults: "Nenhum resultado encontrado.",
1440
1660
  objects: "Objetos",
1441
1661
  dashboards: "Painéis",
@@ -1461,6 +1681,12 @@ const pt = {
1461
1681
  goHome: "Ir para início",
1462
1682
  errorDetails: "Detalhes do erro (somente desenvolvimento)",
1463
1683
  },
1684
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1685
+ notFound: {
1686
+ title: "Página não encontrada",
1687
+ description: "A URL que você acessou não corresponde a nenhuma visualização deste aplicativo.",
1688
+ back: "Voltar",
1689
+ },
1464
1690
  theme: {
1465
1691
  toggle: "Alternar tema",
1466
1692
  light: "Claro",
@@ -1476,11 +1702,15 @@ const pt = {
1476
1702
  viewNameHelp: "Chave técnica (snake_case). Preenchida automaticamente a partir do título — edite se quiser.",
1477
1703
  viewNameRequired: "Informe uma chave (letras minúsculas, números, sublinhado). Não é preenchida automaticamente para títulos não latinos.",
1478
1704
  viewNameInvalid: "Use letras minúsculas, números e sublinhados; comece com uma letra ou sublinhado.",
1479
- systemViewReadonly: 'System view defined in code - duplicate to customize.',
1480
- expandToPage: 'Open as full page',
1705
+ systemViewReadonly: "Exibição do sistema definida no código — somente leitura.",
1706
+ cannotEditMetaView: "Esta exibição é integrada e definida no código — não é possível alterá-la.",
1707
+ cannotDeleteMetaView: "Esta exibição é integrada e definida no código — não é possível excluí-la.",
1708
+ expandToPage: "Abrir como página inteira",
1481
1709
  objectNotFound: "Objeto não encontrado",
1482
1710
  objectNotFoundDescription: "O objeto \"{{objectName}}\" não existe na configuração atual.",
1483
1711
  objectNotFoundHint: "Verifique as configurações de navegação do seu aplicativo ou selecione um objeto diferente na barra lateral.",
1712
+ filterOrNotSavable: "Este filtro une as condições com OU, algo que uma visão salva ainda não consegue armazenar. Ele continua aplicado a esta lista — remova o agrupamento OU para salvá-lo na visão.",
1713
+ filterNestedNotSavable: "Este filtro usa grupos de condições aninhados, que uma visão salva não consegue armazenar. Transforme-o em uma única lista de condições para salvá-lo na visão.",
1484
1714
  allRecords: "Todos os registros",
1485
1715
  exitDesignMode: "Sair do modo de design",
1486
1716
  enterDesignMode: "Entrar no modo de design",
@@ -1507,7 +1737,7 @@ const pt = {
1507
1737
  exportPrintHint: "Formatos de exportação, impressão e exibição da contagem de registros",
1508
1738
  showAllFields: "Mostrar tudo",
1509
1739
  hideAllFields: "Ocultar tudo",
1510
- searchFields: "Pesquisar campos...",
1740
+ searchFields: "Pesquisar campos…",
1511
1741
  title: "Título",
1512
1742
  description: "Descrição",
1513
1743
  data: "Dados",
@@ -1546,7 +1776,7 @@ const pt = {
1546
1776
  longitudeField: "Campo de longitude",
1547
1777
  imageField: "Campo de imagem",
1548
1778
  dateField: "Campo de data",
1549
- selectField: "Selecionar campo...",
1779
+ selectField: "Selecionar campo…",
1550
1780
  gridOptionsHint: "A visualização de grade usa as colunas configuradas acima.",
1551
1781
  groupBy: "Agrupar por",
1552
1782
  prefixField: "Campo de prefixo",
@@ -1609,7 +1839,7 @@ const pt = {
1609
1839
  latitudeFieldHelp: "Campo contendo a latitude (apenas campos geográficos).",
1610
1840
  longitudeFieldHelp: "Campo contendo a longitude (apenas campos geográficos).",
1611
1841
  imageFieldHelp: "A capa da galeria vem deste campo de imagem ou anexo.",
1612
- selectOption: "Selecionar...",
1842
+ selectOption: "Selecionar…",
1613
1843
  noEligibleFieldForType: "Nenhum campo elegível desse tipo. Adicione um ao objeto primeiro.",
1614
1844
  viewTypeUnavailable: "Este objeto não tem um campo que sirva como \"{{field}}\".",
1615
1845
  viewTypeUnavailableShort: "Não suportado por este objeto.",
@@ -1659,7 +1889,7 @@ const pt = {
1659
1889
  ufDropdown: "Lista suspensa",
1660
1890
  ufTabs: "Abas",
1661
1891
  ufToggle: "Alternar",
1662
- ufAddField: "+ Adicionar campo de filtro...",
1892
+ ufAddField: "+ Adicionar campo de filtro…",
1663
1893
  ufNoFields: "Sem campos disponíveis",
1664
1894
  ufAddTab: "+ Adicionar aba",
1665
1895
  ufTabLabel: "Rótulo",
@@ -1719,7 +1949,7 @@ const pt = {
1719
1949
  passwordPlaceholder: "Digite sua senha",
1720
1950
  forgotPasswordText: "Esqueceu a senha?",
1721
1951
  submitButton: "Entrar",
1722
- submittingButton: "Entrando...",
1952
+ submittingButton: "Entrando…",
1723
1953
  noAccountText: "Não tem uma conta?",
1724
1954
  signUpText: "Cadastre-se",
1725
1955
  errors: {
@@ -1727,6 +1957,18 @@ const pt = {
1727
1957
  invalidCredentials: "E-mail ou senha inválidos. Por favor, tente novamente.",
1728
1958
  emailNotVerified: "Por favor, verifique seu e-mail antes de fazer login.",
1729
1959
  },
1960
+ // objectui#3546 slice three — phone/OTP sign-in. `{seconds}` is LoginForm's own
1961
+ // literal `.replace()` hole, not i18next interpolation: keep the single braces.
1962
+ emailOrPhoneLabel: "E-mail ou número de telefone",
1963
+ emailOrPhonePlaceholder: "name@example.com ou +1 555 000 0000",
1964
+ phoneLabel: "Número de telefone",
1965
+ phonePlaceholder: "+1 555 000 0000",
1966
+ otpCodeLabel: "Código de verificação",
1967
+ otpCodePlaceholder: "Código de 6 dígitos",
1968
+ sendOtpButton: "Obter código",
1969
+ resendOtpCountdownText: "Reenviar em {seconds} s",
1970
+ usePhoneOtpText: "Entrar com código de verificação",
1971
+ usePasswordSignInText: "Entrar com senha em vez disso",
1730
1972
  },
1731
1973
  register: {
1732
1974
  title: "Criar uma conta",
@@ -1742,7 +1984,7 @@ const pt = {
1742
1984
  passwordMismatchError: "As senhas não coincidem",
1743
1985
  passwordTooShortError: "A senha deve ter pelo menos 8 caracteres",
1744
1986
  submitButton: "Criar conta",
1745
- submittingButton: "Criando conta...",
1987
+ submittingButton: "Criando conta…",
1746
1988
  hasAccountText: "Já tem uma conta?",
1747
1989
  signInText: "Entrar",
1748
1990
  errors: {
@@ -1763,12 +2005,26 @@ const pt = {
1763
2005
  emailLabel: "E-mail",
1764
2006
  emailPlaceholder: "name@example.com",
1765
2007
  submitButton: "Enviar link de redefinição",
1766
- submittingButton: "Enviando...",
2008
+ submittingButton: "Enviando…",
1767
2009
  successTitle: "Verifique seu e-mail",
1768
2010
  successDescription: "Enviamos um link para redefinição de senha para {{email}}. Por favor verifique sua caixa de entrada.",
1769
2011
  backToSignInText: "Voltar para o login",
1770
2012
  rememberPasswordText: "Lembra da sua senha?",
1771
2013
  signInText: "Entrar",
2014
+ // objectui#3546 slice three — the SMS reset branch of the same form.
2015
+ phoneLabel: "Número de telefone",
2016
+ phonePlaceholder: "+1 555 000 0000",
2017
+ otpCodeLabel: "Código de verificação",
2018
+ otpCodePlaceholder: "Código de 6 dígitos",
2019
+ sendOtpButton: "Obter código",
2020
+ resendOtpCountdownText: "Reenviar em {seconds} s",
2021
+ newPasswordLabel: "Nova senha",
2022
+ newPasswordPlaceholder: "Digite uma nova senha",
2023
+ resetButton: "Redefinir senha",
2024
+ usePhoneResetText: "Redefinir com código por SMS",
2025
+ useEmailResetText: "Redefinir por e-mail em vez disso",
2026
+ phoneSuccessTitle: "Senha redefinida",
2027
+ phoneSuccessDescription: "Sua senha foi redefinida. Agora você pode entrar com a nova senha.",
1772
2028
  },
1773
2029
  resetPassword: {
1774
2030
  title: "Definir nova senha",
@@ -1807,6 +2063,8 @@ const pt = {
1807
2063
  backToLogin: "Voltar ao login",
1808
2064
  checkSpam: "Não recebeu o e-mail? Verifique sua pasta de spam ou entre em contato com o suporte.",
1809
2065
  or: "Ou",
2066
+ // objectui#3546 slice three.
2067
+ resendUnavailable: "O envio de e-mails pode não estar configurado neste ambiente. Entre em contato com o suporte se o problema persistir.",
1810
2068
  },
1811
2069
  setup: {
1812
2070
  welcomeTitle: "Bem-vindo ao ObjectStack",
@@ -1845,6 +2103,9 @@ const pt = {
1845
2103
  invalidDescription: "Nenhum código de dispositivo foi fornecido na URL.",
1846
2104
  loading: "Carregando…",
1847
2105
  cancel: "Cancelar",
2106
+ // objectui#3546 slice three — device-authorization plugin switched off.
2107
+ disabledTitle: "Autorização de dispositivo não habilitada",
2108
+ disabledDescription: "Esta implantação não tem a autorização de dispositivo habilitada, por isso este dispositivo não pode ser aprovado aqui.",
1848
2109
  },
1849
2110
  shell: {
1850
2111
  tenantHostHint: "Você está fazendo login neste espaço de trabalho",
@@ -1884,6 +2145,29 @@ const pt = {
1884
2145
  },
1885
2146
  },
1886
2147
  },
2148
+ // objectui#3546 slice three — the /oauth/consent screen.
2149
+ oauth: {
2150
+ consent: {
2151
+ title: "{{appName}} quer acessar sua conta",
2152
+ request: "{{appName}} está solicitando permissão{{suffix}}.",
2153
+ unknownApp: "um aplicativo",
2154
+ willAllow: "Este aplicativo poderá:",
2155
+ scope: {
2156
+ openid: "Confirmar sua identidade",
2157
+ profile: "Ler seu perfil básico (nome, foto)",
2158
+ email: "Ler seu endereço de e-mail",
2159
+ offlineAccess: "Manter a sessão ativa (renovar o acesso)",
2160
+ },
2161
+ deny: "Negar",
2162
+ authorize: "Autorizar",
2163
+ submitting: "Autorizando…",
2164
+ granted: "Acesso concedido",
2165
+ denied: "Acesso negado",
2166
+ noRedirect: "O servidor não retornou nenhuma URL de redirecionamento.",
2167
+ failed: "Falha no consentimento",
2168
+ footer: "Você pode revogar o acesso a qualquer momento nas configurações da sua conta.",
2169
+ },
2170
+ },
1887
2171
  profile: {
1888
2172
  title: "Perfil",
1889
2173
  subtitle: "Gerencie as configurações da sua conta",
@@ -1945,6 +2229,8 @@ const pt = {
1945
2229
  invite: "Convidar membro",
1946
2230
  members: "Membros",
1947
2231
  settings: "Configurações do espaço de trabalho",
2232
+ multiOrgDisabled: "A criação de novas organizações está desativada nesta instância.",
2233
+ createFailed: 'Falha ao criar o espaço de trabalho',
1948
2234
  },
1949
2235
  help: {
1950
2236
  onThisPage: "Nesta página",
@@ -1955,7 +2241,7 @@ const pt = {
1955
2241
  },
1956
2242
  sidebar: {
1957
2243
  packageManagement: "Gerenciamento de pacotes",
1958
- searchNavigation: "Pesquisar na navegação...",
2244
+ searchNavigation: "Pesquisar na navegação…",
1959
2245
  settings: "Configurações",
1960
2246
  help: "Ajuda",
1961
2247
  helpTooltip: "Ajuda e documentação",
@@ -1979,8 +2265,8 @@ const pt = {
1979
2265
  switchObject: "Trocar de objeto",
1980
2266
  connection: {
1981
2267
  connected: "Conectado",
1982
- connecting: "Conectando...",
1983
- reconnecting: "Reconectando...",
2268
+ connecting: "Conectando…",
2269
+ reconnecting: "Reconectando…",
1984
2270
  disconnected: "Desconectado",
1985
2271
  error: "Erro de conexão",
1986
2272
  },
@@ -2019,6 +2305,14 @@ const pt = {
2019
2305
  publishing: "Publicando…",
2020
2306
  published: "Publicado! Suas alterações estão ativas.",
2021
2307
  publishFailed: "Falha ao publicar",
2308
+ // objectui#3546 slice six — seedWarn reaproveita a tradução de
2309
+ // console.ai.seedWarn (mesma frase em inglês). Marcador "(s)" como em
2310
+ // home.pendingDrafts.message, da mesma família.
2311
+ nothing: "Nada para publicar.",
2312
+ probeWarn: "Publicado, mas a verificação encontrou problemas.",
2313
+ seedWarn: "Publicado, mas alguns dados de exemplo não puderam ser carregados.",
2314
+ publishedVerified: "Publicado e verificado — {{count}} linha(s) de exemplo ativa(s).",
2315
+ capabilityWarn: "Verificação de autoria: {{count}} referência(s) de capacidade não apontam para nada.",
2022
2316
  },
2023
2317
  title: "Início",
2024
2318
  subtitle: "Painel do seu espaço de trabalho",
@@ -2032,7 +2326,7 @@ const pt = {
2032
2326
  title: "Requer a sua atenção",
2033
2327
  empty: "Está tudo em dia",
2034
2328
  },
2035
- loading: "Carregando espaço de trabalho...",
2329
+ loading: "Carregando espaço de trabalho…",
2036
2330
  recent: "Recentes",
2037
2331
  starred: "Favoritos",
2038
2332
  welcome: "Bem-vindo ao ObjectUI",
@@ -2093,6 +2387,9 @@ const pt = {
2093
2387
  roles: "Perfis",
2094
2388
  configuration: "Configuração",
2095
2389
  createApp: "Criar aplicativo",
2390
+ administration: "Administração",
2391
+ datasources: "Fontes de dados",
2392
+ documentation: "Documentação",
2096
2393
  },
2097
2394
  appSwitcher: {
2098
2395
  switchApplication: "Trocar de aplicativo",
@@ -2132,7 +2429,7 @@ const pt = {
2132
2429
  search: {
2133
2430
  title: "Pesquisar",
2134
2431
  back: "Voltar",
2135
- placeholder: "Pesquisar objetos, painéis, páginas, relatórios...",
2432
+ placeholder: "Pesquisar objetos, painéis, páginas, relatórios…",
2136
2433
  inputAriaLabel: "Pesquisar objetos, painéis, páginas, relatórios",
2137
2434
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2138
2435
  resultsCountPlural: "{{count}} resultados para \"{{query}}\"",
@@ -2151,6 +2448,7 @@ const pt = {
2151
2448
  empty: {
2152
2449
  objectNotFound: "Objeto não encontrado",
2153
2450
  objectNotFoundDescription: "A definição do objeto \"{{name}}\" está ausente. Verifique sua configuração ou navegue de volta.",
2451
+ interfacePageSourceMissing: "Esta página de interface faz referência a \"{{name}}\", que não está disponível.",
2154
2452
  pageNotFound: "Página não encontrada",
2155
2453
  pageNotFoundDescription: "A página \"{{name}}\" não foi encontrada. Ela pode ter sido removida ou renomeada.",
2156
2454
  dashboardNotFound: "Painel não encontrado",
@@ -2159,6 +2457,11 @@ const pt = {
2159
2457
  reportNotFoundDescription: "O relatório \"{{name}}\" não foi encontrado. Ele pode ter sido removido ou renomeado.",
2160
2458
  noAppsConfigured: "Nenhum aplicativo configurado",
2161
2459
  noAppsConfiguredDescription: "Nenhum aplicativo está registrado. Crie seu primeiro aplicativo ou visite as configurações do sistema.",
2460
+ appNotAvailable: "Aplicativo indisponível",
2461
+ appNotAvailableDescription: "Este aplicativo ainda não está disponível — a publicação pode estar em andamento. Tente novamente em instantes.",
2462
+ appAccessDenied: "Você não tem acesso a este aplicativo",
2463
+ appAccessDeniedDescription: "Este aplicativo existe, mas sua conta não tem autorização para abri-lo. Peça acesso a um administrador.",
2464
+ appAccessDeniedHome: "Voltar ao início",
2162
2465
  createFirstApp: "Criar primeiro aplicativo",
2163
2466
  systemSettings: "Configurações do sistema",
2164
2467
  back: "Voltar",
@@ -2230,7 +2533,7 @@ const pt = {
2230
2533
  deleteFailed: "Não foi possível excluir a exibição",
2231
2534
  },
2232
2535
  dashboardActions: {
2233
- pdfPreparing: "Preparando exportação PDF…",
2536
+ printDialogOpening: "Abrindo a caixa de diálogo de impressão do navegador (não é uma exportação para PDF)",
2234
2537
  exportFailed: "Falha na exportação: {{message}}",
2235
2538
  forecastSoon: "A exibição de previsão está chegando em breve",
2236
2539
  },
@@ -2274,111 +2577,7 @@ const pt = {
2274
2577
  first: "Primeiro",
2275
2578
  },
2276
2579
  editor: {
2277
- breadcrumb: "Configuração",
2278
- basic: "Geral",
2279
- title: "Título",
2280
- titlePlaceholder: "ex.: Pipeline por trimestre",
2281
- description: "Descrição",
2282
- descriptionPlaceholder: "O que este relatório mostra?",
2283
- type: "Tipo de relatório",
2284
- typeTabular: "Tabular — lista plana",
2285
- typeSummary: "Resumo — agrupado com totais",
2286
- typeMatrix: "Matriz — pivô linhas × colunas",
2287
- typeJoined: "Combinado — vários blocos",
2288
- typeHelp: "Escolha o layout que corresponde ao que deseja ver.",
2289
- data: "Dados",
2290
- objectName: "Fonte de dados",
2291
- objectNamePlaceholder: "ex.: opportunity",
2292
- objectNameHelp: "Qual objeto este relatório deve consultar?",
2293
- limit: "Limite de linhas",
2294
- limitPlaceholder: "ex.: 100",
2295
- columns: "Colunas",
2296
- columnsHint: "Escolha quais campos aparecem como colunas. Adicione uma agregação (Soma, Contagem…) em relatórios de Resumo ou Matriz.",
2297
- filters: "Filtros",
2298
- filtersHint: "Restrinja as linhas incluídas neste relatório.",
2299
- filtersComplex: "Este relatório usa um filtro avançado que não pode ser editado aqui. Ao salvar será mantido inalterado.",
2300
- groupBy: "Agrupar por",
2301
- groupByHint: "Agrupe os dados e calcule subtotais.",
2302
- rows: "Linhas",
2303
- rowsHint: "Agrupe linhas por estes campos.",
2304
- columnsAxis: "Colunas",
2305
- columnsAxisHint: "Pivote estes campos no topo.",
2306
- values: "Valores",
2307
- valuesHint: "Números exibidos em cada célula. Escolha um ou mais campos e adicione uma agregação (Soma, Contagem…).",
2308
- grouping: "Agrupamento",
2309
- addGrouping: "Adicionar agrupamento",
2310
- dateGranularity: "Granularidade de data",
2311
- dateGranularityNone: "(usar valor bruto)",
2312
- day: "Dia",
2313
- week: "Semana",
2314
- month: "Mês",
2315
- quarter: "Trimestre",
2316
- year: "Ano",
2317
- sortAsc: "Crescente",
2318
- sortDesc: "Decrescente",
2319
- chart: "Gráfico",
2320
- chartHint: "Visualização opcional ao lado da tabela.",
2321
- chartType: "Tipo de gráfico",
2322
- chartTitle: "Título do gráfico",
2323
- chartTitlePlaceholder: "Padrão: título do relatório",
2324
- chartXAxis: "Eixo X (categoria)",
2325
- chartYAxis: "Eixo Y (valor)",
2326
- chartShowLegend: "Mostrar legenda",
2327
- chartShowDataLabels: "Mostrar rótulos de dados",
2328
- chartNone: "(sem gráfico)",
2329
- chartBar: "Barras",
2330
- chartLine: "Linhas",
2331
- chartArea: "Áreas",
2332
- chartPie: "Pizza",
2333
- chartDonut: "Rosca",
2334
- chartFunnel: "Funil",
2335
- validationNeedsObject: "Escolha uma fonte de dados antes de adicionar colunas.",
2336
- validationMatrixNeedsRowsCols: "Relatórios de matriz precisam de pelo menos uma Linha e uma Coluna.",
2337
- validationSummaryNeedsRows: "Relatórios de resumo precisam de pelo menos um campo de agrupamento.",
2338
- blocks: "Blocos",
2339
- blocksHint: "Cada bloco é sua própria tabela ou gráfico. Filtros de bloco são combinados (E) com o filtro do relatório.",
2340
- addBlock: "Adicionar bloco",
2341
- removeBlock: "Remover bloco",
2342
- blockName: "Nome do bloco",
2343
- blockNamePlaceholder: "nome_unico_do_bloco",
2344
- blockLabel: "Rótulo de exibição",
2345
- blockLabelPlaceholder: "Exibido acima do bloco",
2346
- blockDescription: "Descrição",
2347
- blockDescriptionPlaceholder: "Contexto opcional para este bloco",
2348
- validationJoinedNeedsBlocks: "Relatórios combinados precisam de pelo menos um bloco.",
2349
- validationBlockNameRequired: "Cada bloco precisa de um nome não vazio.",
2350
- validationBlockNameDuplicate: "Os nomes dos blocos devem ser únicos no relatório.",
2351
- validationBlockNeedsColumns: "Cada bloco precisa de pelo menos uma coluna.",
2352
- noneOption: "(nenhum)",
2353
- addCondition: "Adicionar condição",
2354
- combineLogic: "Combinar com",
2355
- opContains: "contém",
2356
- opIsEmpty: "está vazio",
2357
- opIsNotEmpty: "não está vazio",
2358
- formatAuto: "Automático",
2359
- formatCurrency: "Moeda",
2360
- formatPercent: "Porcentagem",
2361
- formatInteger: "Inteiro",
2362
- formatDate: "Data",
2363
- formatDatetime: "Data e hora",
2364
- columnLabelPlaceholder: "Substituir rótulo",
2365
- aggregateColumn: "Agregação",
2366
- formatColumn: "Formato",
2367
- addColumns: "Adicionar colunas",
2368
- searchFields: "Pesquisar campos…",
2369
- noMatchingFields: "Nenhum campo corresponde à sua pesquisa.",
2370
- noFieldsAvailable: "Nenhum campo disponível.",
2371
- columnsCount: "{n} coluna(s) selecionada(s)",
2372
- columnsEmpty: "Nenhuma coluna selecionada ainda.",
2373
- fieldPickerTitle: "Selecionar campos",
2374
- fieldPickerDescription: "Escolha um ou mais campos para adicionar. Use o campo de pesquisa para filtrar a lista.",
2375
- fieldPickerChangeTitle: "Alterar campo",
2376
- fieldPickerAddGroupingTitle: "Adicionar agrupamento",
2377
- fieldPickerEmpty: "(Selecionar campo)",
2378
- fieldPickerSelected: "{n} selecionado(s)",
2379
- fieldPickerClear: "Limpar seleção",
2380
- fieldPickerAdd: "Adicionar",
2381
- fieldPickerAddN: "Adicionar {n}",
2580
+ panelTitle: "Editar relatório",
2382
2581
  },
2383
2582
  },
2384
2583
  organizations: {
@@ -2395,6 +2594,140 @@ const pt = {
2395
2594
  emptyDescription: "Crie sua primeira organização para começar.",
2396
2595
  noMatches: "Nenhuma organização corresponde à sua pesquisa.",
2397
2596
  },
2597
+ organization: {
2598
+ roles: {
2599
+ owner: 'Proprietário',
2600
+ admin: 'Administrador',
2601
+ delegatedAdmin: 'Administrador delegado',
2602
+ member: 'Membro',
2603
+ },
2604
+ errors: {
2605
+ notAllowedToInvite: 'Você não tem permissão para convidar usuários para esta organização.',
2606
+ notAllowedToInviteWithRole: 'Você não tem permissão para convidar um usuário com esta função.',
2607
+ alreadyInvited: 'Este usuário já foi convidado para esta organização.',
2608
+ organizationExists: 'Essa organização já existe.',
2609
+ slugTaken: 'Esse slug já está em uso.',
2610
+ notAllowedToCreate: 'Você não tem permissão para criar uma nova organização.',
2611
+ notTheRecipient: 'Você não é o destinatário deste convite.',
2612
+ invitationNotFound: 'Este convite não existe mais ou expirou.',
2613
+ unknown: 'Algo deu errado. Tente novamente.',
2614
+ },
2615
+ backToList: "Voltar para as organizações",
2616
+ notFound: "Organização não encontrada",
2617
+ notFoundDescription: "Esta organização não existe ou você não tem acesso.",
2618
+ tabs: {
2619
+ members: "Membros",
2620
+ invitations: "Convites",
2621
+ settings: "Configurações",
2622
+ },
2623
+ members: {
2624
+ title: "Membros",
2625
+ inviteMember: "Convidar membro",
2626
+ inviteRestrictedNote: "Apenas administradores da organização podem convidar membros.",
2627
+ removeMember: "Remover membro",
2628
+ removeConfirmTitle: "Remover membro?",
2629
+ removeConfirmDescription: "Isso removerá {{name}} da organização. O acesso será perdido imediatamente.",
2630
+ removeConfirmAction: "Remover",
2631
+ memberRemoved: "Membro removido",
2632
+ removeFailed: "Falha ao remover o membro",
2633
+ roleUpdated: "Função atualizada",
2634
+ roleUpdateFailed: "Falha ao atualizar a função",
2635
+ memberActions: 'Ações do membro',
2636
+ loadFailed: 'Falha ao carregar os membros',
2637
+ },
2638
+ invitations: {
2639
+ title: "Convites",
2640
+ empty: "Nenhum convite encontrado.",
2641
+ expiresAt: "Expira em",
2642
+ linkCopied: "Link do convite copiado",
2643
+ copyFailed: "Falha ao copiar o link",
2644
+ canceled: "Convite cancelado",
2645
+ cancelFailed: "Falha ao cancelar o convite",
2646
+ cancelTitle: "Cancelar convite?",
2647
+ cancelDescription: "O convite de {{email}} será revogado.",
2648
+ cancelAction: "Cancelar convite",
2649
+ inviteTitle: "Convidar um membro",
2650
+ inviteDescription: "A pessoa receberá um convite para entrar nesta organização.",
2651
+ emailLabel: "E-mail",
2652
+ roleLabel: "Função",
2653
+ placementLabel: "Alocação (opcional)",
2654
+ placementDescription: "Aplicada quando o convite for aceito. Somente as unidades e os cargos que você pode delegar são listados.",
2655
+ businessUnitLabel: "Unidade de negócio",
2656
+ businessUnitPlaceholder: "Sem alocação",
2657
+ positionsLabel: "Cargos",
2658
+ sendInvite: "Enviar convite",
2659
+ sentTitle: "Convite criado",
2660
+ sentDescription: "Compartilhe o link abaixo com a pessoa convidada. Ela precisará entrar para aceitar.",
2661
+ linkLabel: "Link de aceitação",
2662
+ invitedAs: "{{email}} convidado como {{role}}",
2663
+ copyLinkLabel: 'Copiar link do convite',
2664
+ loadFailed: 'Falha ao carregar os convites',
2665
+ inviteFailed: 'Falha ao convidar o membro',
2666
+ status: {
2667
+ all: "Todos",
2668
+ pending: "Pendente",
2669
+ accepted: "Aceito",
2670
+ rejected: "Recusado",
2671
+ canceled: "Cancelado",
2672
+ },
2673
+ },
2674
+ settings: {
2675
+ generalTitle: "Geral",
2676
+ generalDescription: "Atualize as informações da sua organização.",
2677
+ readOnlyNote: "Somente proprietários podem alterar as configurações.",
2678
+ nameLabel: "Nome da organização",
2679
+ slugLabel: "Slug",
2680
+ logoLabel: "Logo",
2681
+ logoUpload: "Enviar",
2682
+ logoReplace: "Substituir",
2683
+ logoClear: "Remover",
2684
+ logoUploaded: "Logo enviado — salve para aplicar",
2685
+ logoUploadFailed: "Falha ao enviar o logo",
2686
+ save: "Salvar alterações",
2687
+ saved: "Configurações salvas",
2688
+ saveFailed: "Falha ao salvar as configurações",
2689
+ leaveTitle: "Sair da organização",
2690
+ leaveDescription: "Você perderá o acesso a esta organização.",
2691
+ leaveAction: "Sair",
2692
+ leaveConfirmTitle: "Sair da organização?",
2693
+ leaveConfirmDescription: "Tem certeza de que deseja sair de {{name}}? Você perderá o acesso imediatamente.",
2694
+ leaveConfirmAction: "Sair",
2695
+ leftOrg: "Você saiu da organização",
2696
+ leaveFailed: "Falha ao sair da organização",
2697
+ dangerZone: "Zona de perigo",
2698
+ deleteTitle: "Excluir organização",
2699
+ deleteDescription: "Exclua permanentemente esta organização e todos os seus dados.",
2700
+ deleteAction: "Excluir",
2701
+ deleteConfirmTitle: "Excluir organização?",
2702
+ deleteConfirmDescription: "Esta ação é irreversível. Todos os dados serão excluídos permanentemente. Digite o slug da organização para confirmar.",
2703
+ deleteConfirmSlugLabel: "Digite \"{{slug}}\" para confirmar",
2704
+ deleteConfirmAction: "Excluir organização",
2705
+ deleted: "Organização excluída",
2706
+ deleteFailed: "Falha ao excluir a organização",
2707
+ },
2708
+ accept: {
2709
+ title: "Você foi convidado",
2710
+ description: "Você foi convidado para entrar em {{orgName}} como {{role}}.",
2711
+ errorTitle: "Convite indisponível",
2712
+ goToOrgs: "Ir para as organizações",
2713
+ loading: "Carregando o convite…",
2714
+ organization: "Organização",
2715
+ role: "Função",
2716
+ expiresAt: "Expira em",
2717
+ accept: "Aceitar convite",
2718
+ accepted: "Convite aceito",
2719
+ acceptFailed: "Falha ao aceitar o convite",
2720
+ decline: "Recusar",
2721
+ declined: "Convite recusado",
2722
+ declineFailed: "Falha ao recusar o convite",
2723
+ },
2724
+ switcher: {
2725
+ label: "Trocar de organização",
2726
+ groupLabel: "Organização de trabalho",
2727
+ groupHint: "Novos registros são criados aqui. As exibições mostram dados de todas as suas organizações.",
2728
+ manageMembers: "Gerenciar membros",
2729
+ },
2730
+ },
2398
2731
  notifications: {
2399
2732
  regionLabel: "Notificações",
2400
2733
  groupCount: "{{count}} notificações",
@@ -2408,6 +2741,9 @@ const pt = {
2408
2741
  viewApprovals: "Ver aprovações",
2409
2742
  noPendingApprovals: "Sem aprovações pendentes",
2410
2743
  openApprovalsInbox: "Abrir caixa de aprovações",
2744
+ badgeTotal: "{{total}} no total",
2745
+ badgeNotifications: "{{unread}} notificações",
2746
+ badgeApprovals: "{{approvals}} aprovações pendentes",
2411
2747
  emptyUnread: "Tudo lido",
2412
2748
  filterUnread: "Não lidos",
2413
2749
  filterAll: "Todos",
@@ -2694,6 +3030,7 @@ const pt = {
2694
3030
  dismiss: "Fechar",
2695
3031
  openOnCloud: "Abrir na nuvem",
2696
3032
  backHome: "Voltar ao início",
3033
+ updateTo: "Atualizar",
2697
3034
  },
2698
3035
  install: {
2699
3036
  dialogTitle: "Instalar {{name}}",
@@ -2710,6 +3047,37 @@ const pt = {
2710
3047
  localManifestConflict: "{{message}}\nNota: Um aplicativo local já possui este manifest_id. Remova-o primeiro de objectstack.config.ts.",
2711
3048
  localUnauthorized: "Faça login neste runtime primeiro.",
2712
3049
  localMarketplaceUnavailable: "Este runtime não tem OS_CLOUD_URL configurado.",
3050
+ updateTo: "Atualizar → v{{version}}",
3051
+ installedVersion: "Instalado v{{version}}",
3052
+ },
3053
+ // objectui#3546 — the MarketplacePage "Your organization" strip.
3054
+ org: {
3055
+ heading: "Sua organização",
3056
+ install: "Instalar",
3057
+ installed: "{{name}} instalado",
3058
+ installedBadge: "Instalado",
3059
+ installing: "Instalando…",
3060
+ },
3061
+ // ADR-0025 PD4 §3.5/§3.11 — the pre-install consent panel
3062
+ // (PluginDisclosure.tsx). `runtime` is a CLOSED enum: spec
3063
+ // PluginRuntimeSchema = z.enum(['node', 'sandbox', 'worker']).
3064
+ disclosure: {
3065
+ containsCode: "Este pacote contém código",
3066
+ reviewed: "Revisado e aprovado",
3067
+ unreviewed: "Ainda não revisado",
3068
+ signed: "Assinado",
3069
+ grantsIntro: "Na instalação, este pacote receberá:",
3070
+ services: "Serviços da plataforma",
3071
+ hooks: "Hooks de ciclo de vida",
3072
+ network: "Acesso à rede",
3073
+ fs: "Acesso ao sistema de arquivos",
3074
+ noPermissions: "Não solicita permissões especiais.",
3075
+ acknowledge: "Entendo que este pacote executa código e recebe as permissões acima.",
3076
+ runtime: {
3077
+ node: "No processo · confiança total",
3078
+ sandbox: "Em sandbox",
3079
+ worker: "Fora do processo",
3080
+ },
2713
3081
  },
2714
3082
  uninstall: {
2715
3083
  confirm: "Desinstalar {{manifestId}} v{{version}} deste runtime?\n\nO manifesto em cache será removido.",
@@ -2959,6 +3327,34 @@ const pt = {
2959
3327
  confirmNote: 'Publicar libera atomicamente todos os {{count}} rascunhos pendentes deste pacote.',
2960
3328
  publishConfirm: 'Publicar tudo',
2961
3329
  },
3330
+ // ADR-0045 — the materialized-but-unlisted app banner
3331
+ // (UnpublishedAppBar.tsx), sibling of draftBar above.
3332
+ unpublishedBar: {
3333
+ message: 'App não publicado — totalmente funcional, mas somente os criadores o veem. Publique-o para que seus usuários o vejam.',
3334
+ publish: 'Publicar',
3335
+ publishing: 'Publicando…',
3336
+ published: 'Publicado! O app já está visível para seus usuários.',
3337
+ publishFailed: 'Falha ao publicar',
3338
+ },
3339
+ // ADR-0067 — the append-only build/revert timeline (CommitTimeline.tsx);
3340
+ // `button` is the banner's entry point into it.
3341
+ history: {
3342
+ button: 'Histórico',
3343
+ title: 'Histórico de compilações',
3344
+ description: 'Todas as alterações deste app, as mais recentes primeiro. Desfaça qualquer etapa para revertê-la — não é necessário confirmar a publicação.',
3345
+ loadFailed: 'Não foi possível carregar o histórico:',
3346
+ loadFailedUnavailable: 'Armazenamento de commits temporariamente inacessível — esta leitura não aconteceu, portanto nenhum histórico é exibido. Tente novamente em instantes.',
3347
+ loading: 'Carregando histórico…',
3348
+ empty: 'Ainda não há histórico para este app.',
3349
+ revertLabel: 'Uma alteração foi desfeita',
3350
+ applyLabel: 'Alteração de compilação',
3351
+ revert: 'desfazer',
3352
+ items: 'itens',
3353
+ revertAction: 'Desfazer',
3354
+ reverted: 'Desfeito — a alteração foi revertida.',
3355
+ revertFailed: 'Falha ao desfazer',
3356
+ revertUnavailable: 'Armazenamento de commits temporariamente inacessível — a reversão pode não ter sido aplicada. Reabra este histórico para verificar antes de tentar novamente.',
3357
+ },
2962
3358
  },
2963
3359
  filterBuilder: {
2964
3360
  where: "Onde",
@@ -3003,5 +3399,91 @@ const pt = {
3003
3399
  addSort: "Adicionar ordenação",
3004
3400
  removeSort: "Remover ordenação",
3005
3401
  },
3402
+ collaboration: {
3403
+ commentCount: "{{count}} comentários",
3404
+ commentCountOne: "{{count}} comentário",
3405
+ resolvedSuffix: " · Resolvido",
3406
+ sortComments: "Ordenar comentários",
3407
+ sortOldest: "Mais antigos",
3408
+ sortNewest: "Mais recentes",
3409
+ resolve: "Resolver",
3410
+ reopen: "Reabrir",
3411
+ justNow: "agora mesmo",
3412
+ minutesAgo: "há {{count}} min",
3413
+ hoursAgo: "há {{count}} h",
3414
+ daysAgo: "há {{count}} d",
3415
+ edited: "(editado)",
3416
+ reactionCount: "{{count}} reações",
3417
+ reactionCountOne: "{{count}} reação",
3418
+ addThumbsUp: "Adicionar curtida",
3419
+ reply: "Responder",
3420
+ reactThumbsUp: "Reagir com curtida",
3421
+ reactHeart: "Reagir com coração",
3422
+ cancelReply: "Cancelar resposta",
3423
+ replyingTo: "Respondendo a {{name}}…",
3424
+ replyingToComment: "Respondendo ao comentário…",
3425
+ commentPlaceholder: "Adicionar um comentário… (use @ para mencionar)",
3426
+ send: "Enviar",
3427
+ presentUserCount: "{{count}} usuários presentes",
3428
+ presentUserCountOne: "{{count}} usuário presente",
3429
+ moreUserCount: "mais {{count}} usuários",
3430
+ moreUserCountOne: "mais {{count}} usuário",
3431
+ userStatusTitle: "{{name}} ({{status}})",
3432
+ statusActive: "ativo",
3433
+ statusIdle: "inativo",
3434
+ statusAway: "ausente",
3435
+ },
3436
+ wizard: {
3437
+ missingRequired: "Preencha os campos obrigatórios: {{fields}}",
3438
+ },
3439
+ appManagement: {
3440
+ title: "Aplicativos",
3441
+ subtitle: "Gerencie todos os aplicativos configurados",
3442
+ newApp: "Novo aplicativo",
3443
+ searchLabel: "Pesquisar aplicativos",
3444
+ searchPlaceholder: "Pesquisar aplicativos…",
3445
+ selectedCount: "{{n}} selecionados",
3446
+ bulkEnable: "Habilitar",
3447
+ bulkDisable: "Desabilitar",
3448
+ selectAll: "Selecionar tudo ({{n}})",
3449
+ empty: "Nenhum aplicativo encontrado.",
3450
+ defaultBadge: "Padrão",
3451
+ active: "Ativo",
3452
+ inactive: "Inativo",
3453
+ selectApp: "Selecionar {{name}}",
3454
+ openApp: "Abrir aplicativo",
3455
+ openAppNamed: "Abrir {{name}}",
3456
+ editApp: "Editar aplicativo",
3457
+ editAppNamed: "Editar {{name}}",
3458
+ editWithAi: "Editar com IA",
3459
+ editWithAiNamed: "Editar {{name}} com IA",
3460
+ enableApp: "Habilitar aplicativo",
3461
+ disableApp: "Desabilitar aplicativo",
3462
+ enableAppNamed: "Habilitar {{name}}",
3463
+ disableAppNamed: "Desabilitar {{name}}",
3464
+ setDefault: "Definir como padrão",
3465
+ setDefaultNamed: "Definir {{name}} como padrão",
3466
+ deleteApp: "Excluir aplicativo",
3467
+ deleteAppNamed: "Excluir {{name}}",
3468
+ confirmDelete: "Clique novamente para confirmar a exclusão",
3469
+ confirmDeleteNamed: "Confirmar a exclusão de {{name}}",
3470
+ toast: {
3471
+ noClient: "Não é possível acessar o serviço de metadados",
3472
+ unknownError: "erro desconhecido",
3473
+ appEnabled: "{{name}} habilitado",
3474
+ appDisabled: "{{name}} desabilitado",
3475
+ toggleFailed: "Falha ao alterar o status do aplicativo: {{reason}}",
3476
+ setDefaultDone: "{{name}} definido como padrão",
3477
+ setDefaultFailed: "Falha ao definir o aplicativo padrão: {{reason}}",
3478
+ appDeleted: "{{name}} excluído",
3479
+ deleteFailed: "Falha ao excluir o aplicativo: {{reason}}",
3480
+ bulkEnabled: "{{n}} aplicativos habilitados",
3481
+ bulkDisabled: "{{n}} aplicativos desabilitados",
3482
+ bulkFailed: "Falha em {{n}}: {{details}}",
3483
+ bulkFailureEntry: "{{name}} ({{reason}})",
3484
+ bulkFailureJoiner: "; ",
3485
+ bulkOperationFailed: "Falha na operação em massa: {{reason}}",
3486
+ },
3487
+ },
3006
3488
  };
3007
3489
  export default pt;