@object-ui/i18n 17.3.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 +1295 -1
  2. package/README.md +0 -13
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +11 -1
  5. package/dist/locales/ar.d.ts +466 -107
  6. package/dist/locales/ar.js +559 -153
  7. package/dist/locales/de.d.ts +466 -107
  8. package/dist/locales/de.js +574 -175
  9. package/dist/locales/en.d.ts +502 -143
  10. package/dist/locales/en.js +678 -145
  11. package/dist/locales/es.d.ts +466 -107
  12. package/dist/locales/es.js +553 -155
  13. package/dist/locales/fr.d.ts +466 -107
  14. package/dist/locales/fr.js +553 -152
  15. package/dist/locales/index.d.ts +4734 -1144
  16. package/dist/locales/ja.d.ts +466 -107
  17. package/dist/locales/ja.js +545 -146
  18. package/dist/locales/ko.d.ts +466 -107
  19. package/dist/locales/ko.js +551 -153
  20. package/dist/locales/pt.d.ts +466 -107
  21. package/dist/locales/pt.js +552 -154
  22. package/dist/locales/ru.d.ts +466 -107
  23. package/dist/locales/ru.js +563 -153
  24. package/dist/locales/zh.d.ts +501 -142
  25. package/dist/locales/zh.js +542 -142
  26. package/dist/pickLocalized.d.ts +21 -0
  27. package/dist/pickLocalized.js +40 -7
  28. package/dist/provider.d.ts +83 -1
  29. package/dist/provider.js +303 -29
  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 +50 -2
  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 +4 -3
@@ -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,7 +108,7 @@ 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",
82
114
  closePanel: "Fechar painel",
@@ -85,6 +117,11 @@ const pt = {
85
117
  itemCountOne: "{{count}} item",
86
118
  toggleSidebar: "Alternar barra lateral",
87
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)",
88
125
  },
89
126
  actions: {
90
127
  decisionOutput: {
@@ -116,6 +153,9 @@ const pt = {
116
153
  submitFailed: "Não foi possível salvar. Tente novamente.",
117
154
  discardTitle: "Descartar as alterações?",
118
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.",
119
159
  keepEditing: "Continuar editando",
120
160
  discard: "Descartar",
121
161
  conflictTitle: "Conflito ao salvar",
@@ -184,7 +224,7 @@ const pt = {
184
224
  richText: {
185
225
  format: "Formato: {{format}}",
186
226
  basicEditorHint: "Editor de texto rico (básico)",
187
- placeholder: "Digite algo...",
227
+ placeholder: "Digite algo…",
188
228
  },
189
229
  options: {
190
230
  empty: "Nenhuma opção disponível",
@@ -250,7 +290,7 @@ const pt = {
250
290
  saveAll: "Salvar tudo ({{count}})",
251
291
  addRecord: "Adicionar registro",
252
292
  open: "Abrir",
253
- search: "Pesquisar...",
293
+ search: "Pesquisar…",
254
294
  modified: "{{count}} linha(s) modificada(s)",
255
295
  saveFailed: 'Falha ao salvar',
256
296
  selected: "{{count}} selecionado(s)",
@@ -294,7 +334,7 @@ const pt = {
294
334
  delete: "Excluir",
295
335
  export: "Exportar",
296
336
  exportAs: "Exportar como {{format}}",
297
- loading: "Carregando grade...",
337
+ loading: "Carregando grade…",
298
338
  errorLoading: "Erro ao carregar grade",
299
339
  pullToRefresh: "Puxe para atualizar",
300
340
  refreshing: "Atualizando…",
@@ -305,6 +345,22 @@ const pt = {
305
345
  yes: "Sim",
306
346
  no: "Não",
307
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
+ },
308
364
  toolbar: {
309
365
  densityMode: "Densidade",
310
366
  densityCompact: "Compacto",
@@ -418,12 +474,12 @@ const pt = {
418
474
  templateName: "Nome do modelo",
419
475
  save: "Salvar",
420
476
  deleteTemplate: "Excluir modelo",
421
- savedMapping: 'Saved mapping:',
422
- chooseSavedMapping: 'Choose a saved mapping…',
423
- manualMapping: '— Map columns manually —',
424
- transform: 'Transform',
425
- savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
426
- 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.',
427
483
  csvColumn: "Coluna",
428
484
  mapsTo: "Mapeia para",
429
485
  typeMismatch: "Parece {{type}}",
@@ -483,6 +539,8 @@ const pt = {
483
539
  loadErrorUnauthorizedMessage: "Sua sessão expirou ou você saiu. Entre novamente para ver estes registros.",
484
540
  loadErrorRejectedTitle: "A consulta desta visualização foi rejeitada",
485
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.",
486
544
  retry: "Tentar novamente",
487
545
  managedBy: {
488
546
  system: {
@@ -507,7 +565,7 @@ const pt = {
507
565
  },
508
566
  },
509
567
  refresh: "Atualizar",
510
- loading: 'Loading records...',
568
+ loading: "Carregando registros…",
511
569
  recordCount: "{{count}} registros",
512
570
  recordCountOne: "{{count}} registro",
513
571
  addRecord: "Adicionar registro",
@@ -519,7 +577,8 @@ const pt = {
519
577
  sort: "Ordenar",
520
578
  sortRecords: "Ordenar registros",
521
579
  sortByIdSuffix: "(por ID)",
522
- 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",
523
582
  group: "Agrupar",
524
583
  groupBy: "Agrupar por",
525
584
  export: "Exportar",
@@ -577,13 +636,16 @@ const pt = {
577
636
  },
578
637
  kanban: {
579
638
  uncategorized: "Sem categoria",
639
+ columns: "colunas",
580
640
  addCard: "Adicionar cartão",
581
641
  addColumn: "Adicionar coluna",
582
642
  moveCard: "Mover cartão",
583
643
  deleteCard: "Excluir cartão",
584
644
  deleteColumn: "Excluir coluna",
585
645
  noCards: "Sem cartões",
586
- 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.",
587
649
  },
588
650
  timeline: {
589
651
  bucket: {
@@ -596,6 +658,13 @@ const pt = {
596
658
  noDate: "Sem data",
597
659
  unassigned: "Não atribuído",
598
660
  },
661
+ scale: {
662
+ week: "Semana {{n}}",
663
+ quarter: "T{{quarter}} {{year}}",
664
+ },
665
+ gantt: {
666
+ rowLabel: "Itens",
667
+ },
599
668
  },
600
669
  gantt: {
601
670
  viewMode: {
@@ -642,6 +711,18 @@ const pt = {
642
711
  ff: "Término → Término",
643
712
  sf: "Início → Término",
644
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
+ },
645
726
  conflict: {
646
727
  title: "Conflito de agendamento",
647
728
  body: "Esta movimentação conflita com as restrições de dependência. Reagendar automaticamente {{count}} tarefa(s) afetada(s)?",
@@ -650,8 +731,8 @@ const pt = {
650
731
  },
651
732
  autoScheduleDlg: {
652
733
  title: "Agendamento automático",
653
- body: "Adiar {count} tarefa(s) para atender aos vínculos de dependência?",
654
- 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.",
655
736
  confirm: "Aplicar",
656
737
  cancel: "Cancelar",
657
738
  none: "Todas as dependências foram atendidas — nada a reagendar.",
@@ -688,6 +769,7 @@ const pt = {
688
769
  exportPng: "Exportar como PNG",
689
770
  exportPdf: "Exportar PDF",
690
771
  saveLayout: "Salvar o layout",
772
+ refresh: "Atualizar",
691
773
  undo: "Desfazer",
692
774
  redo: "Refazer",
693
775
  prevPeriod: "Período anterior",
@@ -728,11 +810,11 @@ const pt = {
728
810
  defaultBadge: "padrão",
729
811
  tabActionsFor: "Ações de exibição para {{name}}",
730
812
  readonlyAriaLabel: "Exibição somente leitura",
731
- readonlyTooltip: "Exibição do sistema — duplique para personalizar.",
813
+ readonlyTooltip: "Exibição do sistema — definida no código, somente leitura.",
732
814
  },
733
815
  designer: {
734
- undo: 'Undo',
735
- redo: 'Redo',
816
+ undo: "Desfazer",
817
+ redo: "Refazer",
736
818
  },
737
819
  detail: {
738
820
  editInlineHint: "Clique duas vezes para editar",
@@ -774,13 +856,15 @@ const pt = {
774
856
  relatedRecords: "{{count}} registros",
775
857
  relatedRecordOne: "{{count}} registro",
776
858
  noRelatedRecords: "Nenhum registro relacionado encontrado",
777
- loading: "Carregando...",
859
+ loading: "Carregando…",
778
860
  copyToClipboard: "Copiar para área de transferência",
779
861
  copied: "Copiado!",
780
862
  deleteConfirmation: "Tem certeza de que deseja excluir este registro?",
863
+ deleted: "Registro excluído",
781
864
  editRecord: "Editar registro",
782
865
  viewAll: "Ver tudo",
783
866
  new: "Novo",
867
+ add: "Adicionar",
784
868
  emptyValue: "—",
785
869
  comments: "Comentários",
786
870
  searchComments: "Pesquisar comentários…",
@@ -845,6 +929,7 @@ const pt = {
845
929
  loadMore: "Carregar mais",
846
930
  edited: "(editado)",
847
931
  via: "via {{source}}",
932
+ viewSource: "Ver origem",
848
933
  replyCount: "{{count}} resposta",
849
934
  replyCountPlural: "{{count}} respostas",
850
935
  replyPlaceholder: "Responder…",
@@ -878,7 +963,7 @@ const pt = {
878
963
  cancelEdit: "Descartar alterações",
879
964
  sectionMoreDetails: "Mais detalhes",
880
965
  concurrentUpdateTitle: "Este registro foi modificado por outra pessoa",
881
- 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.",
882
967
  concurrentUpdateYourEdit: "Sua edição",
883
968
  concurrentUpdateCurrentValue: "Valor atual",
884
969
  concurrentUpdateUpdatedBy: "Atualizado por {{name}}",
@@ -886,9 +971,11 @@ const pt = {
886
971
  concurrentUpdateReload: "Carregar versão atual",
887
972
  concurrentUpdateOverwrite: "Sobrescrever mesmo assim",
888
973
  concurrentUpdateCancel: "Cancelar",
974
+ concurrentUpdateRecordLabel: "este registro",
889
975
  openInNewTab: "Abrir em nova aba",
890
976
  activity: "Atividade",
891
977
  history: "Histórico",
978
+ historyEmpty: "Nenhum histórico ainda",
892
979
  editRow: "Editar",
893
980
  deleteRow: "Excluir",
894
981
  deleteRowConfirmation: "Excluir este registro?",
@@ -898,10 +985,13 @@ const pt = {
898
985
  nextPage: "Próximo",
899
986
  pageOf: "Página {{current}} de {{total}}",
900
987
  sortBy: "Ordenar por",
901
- filterPlaceholder: "Filtrar...",
988
+ filterPlaceholder: "Filtrar…",
902
989
  highlightFields: "Campos principais",
903
990
  createdBy: "Criado por",
904
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",
905
995
  showEmptyRelated_one: "+ {{count}} vazio",
906
996
  showEmptyRelated_other: "+ {{count}} vazios",
907
997
  copyEmail: "Copiar e-mail",
@@ -913,7 +1003,8 @@ const pt = {
913
1003
  },
914
1004
  chart: {
915
1005
  noData: "Nenhum dado de gráfico disponível",
916
- loading: "Carregando gráfico...",
1006
+ loading: "Carregando gráfico…",
1007
+ nullCategory: "(Não especificado)",
917
1008
  },
918
1009
  map: {
919
1010
  searchLocations: "Pesquisar locais…",
@@ -935,8 +1026,8 @@ const pt = {
935
1026
  properties: "Propriedades",
936
1027
  connections: "Conexões",
937
1028
  quickConnect: "Conexão rápida",
938
- fromPlaceholder: "De...",
939
- toPlaceholder: "Para...",
1029
+ fromPlaceholder: "De…",
1030
+ toPlaceholder: "Para…",
940
1031
  connect: "Conectar",
941
1032
  label: "Rótulo",
942
1033
  type: "Tipo",
@@ -984,6 +1075,7 @@ const pt = {
984
1075
  },
985
1076
  dashboard: {
986
1077
  noRows: "Sem linhas",
1078
+ loading: "Carregando…",
987
1079
  pickMeasures: "Escolha medidas (valores) para este widget de dataset.",
988
1080
  datasetUnsupported: "Esta fonte de dados não oferece suporte a consultas de dataset.",
989
1081
  details: "Detalhes",
@@ -1077,7 +1169,7 @@ const pt = {
1077
1169
  faviconUrl: "Favicon URL",
1078
1170
  preview: "Pré-visualização",
1079
1171
  complete: "Concluir",
1080
- snakeCaseHint: "Must be snake_case (e.g. my_app)",
1172
+ snakeCaseHint: "Deve ser snake_case (ex. my_app)",
1081
1173
  modeEdit: "Editar",
1082
1174
  modePreview: "Pré-visualizar",
1083
1175
  modeCode: "Código",
@@ -1241,6 +1333,7 @@ const pt = {
1241
1333
  },
1242
1334
  },
1243
1335
  console: {
1336
+ saveAdvisoryTitle: "Salvo — a verificação de criação gerou {{count}} recomendação(ões)",
1244
1337
  settingsHub: {
1245
1338
  title: "Configurações",
1246
1339
  subtitle: "Configure seu workspace, integrações e sinalizadores de recursos.",
@@ -1307,7 +1400,7 @@ const pt = {
1307
1400
  shareTitle: "Compartilhar esta conversa",
1308
1401
  shareDisabledTitle: "Comece a conversar para habilitar o compartilhamento",
1309
1402
  newChat: "Nova",
1310
- searchChats: "Pesquisar conversas...",
1403
+ searchChats: "Pesquisar conversas…",
1311
1404
  noChatsYet: "Ainda não há conversas",
1312
1405
  noChatsDescription: "Inicie uma nova conversa para vê-la aqui.",
1313
1406
  noMatchingChats: "Nenhuma conversa correspondente.",
@@ -1316,18 +1409,18 @@ const pt = {
1316
1409
  deleteConversation: "Excluir conversa",
1317
1410
  saveRename: "Salvar novo nome",
1318
1411
  cancelRename: "Cancelar renomeação",
1319
- loadingHistory: "Carregando o histórico da conversa...",
1412
+ loadingHistory: "Carregando o histórico da conversa…",
1320
1413
  conversationReady: "Conversa pronta",
1321
1414
  preparingConversation: "Preparando uma nova conversa",
1322
1415
  offlineDemoMode: "Modo de demonstração off-line — lista de agentes indisponível",
1323
1416
  sendFailedRateLimited: "Você está enviando mensagens rápido demais. Sua mensagem foi mantida abaixo — aguarde um momento e tente novamente.",
1324
1417
  sendFailedGeneric: "Não foi possível enviar sua mensagem. Ela foi mantida abaixo — tente novamente.",
1325
- askAgent: "Pergunte a {{agent}}...",
1418
+ askAgent: "Pergunte a {{agent}}…",
1326
1419
  assistant: "Assistente",
1327
1420
  liveCanvas: "Pré-visualização ao vivo — {{app}} (rascunho)",
1328
1421
  liveCanvasUnlisted: "Aplicativo ao vivo — {{app}} (não listado até ser publicado)",
1329
- loadingAgents: "Carregando agentes...",
1330
- askAnything: "Pergunte qualquer coisa...",
1422
+ loadingAgents: "Carregando agentes…",
1423
+ askAnything: "Pergunte qualquer coisa…",
1331
1424
  emptyTitle: "Iniciar uma conversa",
1332
1425
  emptyDescription: "Pergunte qualquer coisa — o assistente tem acesso ao contexto do seu aplicativo atual.",
1333
1426
  switchAssistant: "Trocar de assistente",
@@ -1430,9 +1523,60 @@ const pt = {
1430
1523
  createSeed: "Gerar dados de exemplo",
1431
1524
  createPackage: "Criar pacote de aplicativo",
1432
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
+ },
1433
1577
  },
1434
1578
  title: "Console ObjectStack",
1435
- initializing: "Inicializando aplicação...",
1579
+ initializing: "Inicializando aplicação…",
1436
1580
  loadingHint: "Configurar um novo ambiente pode levar alguns instantes.",
1437
1581
  breadcrumb: {
1438
1582
  dashboards: "Painéis",
@@ -1440,6 +1584,31 @@ const pt = {
1440
1584
  reports: "Relatórios",
1441
1585
  system: "Sistema",
1442
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
+ },
1443
1612
  loadingSteps: {
1444
1613
  connecting: "Conectando à fonte de dados",
1445
1614
  loadingConfig: "Carregando configuração",
@@ -1469,6 +1638,7 @@ const pt = {
1469
1638
  general: "Geral",
1470
1639
  navigation: "Navegação",
1471
1640
  dataViews: "Visualizações de dados",
1641
+ aiChat: "Assistente de IA",
1472
1642
  preferences: "Preferências",
1473
1643
  },
1474
1644
  openCommandPalette: "Abrir paleta de comandos",
@@ -1479,11 +1649,13 @@ const pt = {
1479
1649
  createRecord: "Criar novo registro",
1480
1650
  refreshData: "Atualizar dados",
1481
1651
  editRecord: "Editar registro selecionado",
1652
+ newChat: "Nova conversa",
1653
+ toggleChatsList: "Alternar lista de conversas",
1482
1654
  toggleDarkMode: "Alternar modo escuro",
1483
1655
  },
1484
1656
  commandPalette: {
1485
1657
  title: "Paleta de comandos",
1486
- placeholder: "Digite um comando ou pesquise...",
1658
+ placeholder: "Digite um comando ou pesquise…",
1487
1659
  noResults: "Nenhum resultado encontrado.",
1488
1660
  objects: "Objetos",
1489
1661
  dashboards: "Painéis",
@@ -1509,6 +1681,12 @@ const pt = {
1509
1681
  goHome: "Ir para início",
1510
1682
  errorDetails: "Detalhes do erro (somente desenvolvimento)",
1511
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
+ },
1512
1690
  theme: {
1513
1691
  toggle: "Alternar tema",
1514
1692
  light: "Claro",
@@ -1524,8 +1702,10 @@ const pt = {
1524
1702
  viewNameHelp: "Chave técnica (snake_case). Preenchida automaticamente a partir do título — edite se quiser.",
1525
1703
  viewNameRequired: "Informe uma chave (letras minúsculas, números, sublinhado). Não é preenchida automaticamente para títulos não latinos.",
1526
1704
  viewNameInvalid: "Use letras minúsculas, números e sublinhados; comece com uma letra ou sublinhado.",
1527
- systemViewReadonly: 'System view defined in code - duplicate to customize.',
1528
- 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",
1529
1709
  objectNotFound: "Objeto não encontrado",
1530
1710
  objectNotFoundDescription: "O objeto \"{{objectName}}\" não existe na configuração atual.",
1531
1711
  objectNotFoundHint: "Verifique as configurações de navegação do seu aplicativo ou selecione um objeto diferente na barra lateral.",
@@ -1557,7 +1737,7 @@ const pt = {
1557
1737
  exportPrintHint: "Formatos de exportação, impressão e exibição da contagem de registros",
1558
1738
  showAllFields: "Mostrar tudo",
1559
1739
  hideAllFields: "Ocultar tudo",
1560
- searchFields: "Pesquisar campos...",
1740
+ searchFields: "Pesquisar campos…",
1561
1741
  title: "Título",
1562
1742
  description: "Descrição",
1563
1743
  data: "Dados",
@@ -1596,7 +1776,7 @@ const pt = {
1596
1776
  longitudeField: "Campo de longitude",
1597
1777
  imageField: "Campo de imagem",
1598
1778
  dateField: "Campo de data",
1599
- selectField: "Selecionar campo...",
1779
+ selectField: "Selecionar campo…",
1600
1780
  gridOptionsHint: "A visualização de grade usa as colunas configuradas acima.",
1601
1781
  groupBy: "Agrupar por",
1602
1782
  prefixField: "Campo de prefixo",
@@ -1659,7 +1839,7 @@ const pt = {
1659
1839
  latitudeFieldHelp: "Campo contendo a latitude (apenas campos geográficos).",
1660
1840
  longitudeFieldHelp: "Campo contendo a longitude (apenas campos geográficos).",
1661
1841
  imageFieldHelp: "A capa da galeria vem deste campo de imagem ou anexo.",
1662
- selectOption: "Selecionar...",
1842
+ selectOption: "Selecionar…",
1663
1843
  noEligibleFieldForType: "Nenhum campo elegível desse tipo. Adicione um ao objeto primeiro.",
1664
1844
  viewTypeUnavailable: "Este objeto não tem um campo que sirva como \"{{field}}\".",
1665
1845
  viewTypeUnavailableShort: "Não suportado por este objeto.",
@@ -1709,7 +1889,7 @@ const pt = {
1709
1889
  ufDropdown: "Lista suspensa",
1710
1890
  ufTabs: "Abas",
1711
1891
  ufToggle: "Alternar",
1712
- ufAddField: "+ Adicionar campo de filtro...",
1892
+ ufAddField: "+ Adicionar campo de filtro…",
1713
1893
  ufNoFields: "Sem campos disponíveis",
1714
1894
  ufAddTab: "+ Adicionar aba",
1715
1895
  ufTabLabel: "Rótulo",
@@ -1769,7 +1949,7 @@ const pt = {
1769
1949
  passwordPlaceholder: "Digite sua senha",
1770
1950
  forgotPasswordText: "Esqueceu a senha?",
1771
1951
  submitButton: "Entrar",
1772
- submittingButton: "Entrando...",
1952
+ submittingButton: "Entrando…",
1773
1953
  noAccountText: "Não tem uma conta?",
1774
1954
  signUpText: "Cadastre-se",
1775
1955
  errors: {
@@ -1777,6 +1957,18 @@ const pt = {
1777
1957
  invalidCredentials: "E-mail ou senha inválidos. Por favor, tente novamente.",
1778
1958
  emailNotVerified: "Por favor, verifique seu e-mail antes de fazer login.",
1779
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",
1780
1972
  },
1781
1973
  register: {
1782
1974
  title: "Criar uma conta",
@@ -1792,7 +1984,7 @@ const pt = {
1792
1984
  passwordMismatchError: "As senhas não coincidem",
1793
1985
  passwordTooShortError: "A senha deve ter pelo menos 8 caracteres",
1794
1986
  submitButton: "Criar conta",
1795
- submittingButton: "Criando conta...",
1987
+ submittingButton: "Criando conta…",
1796
1988
  hasAccountText: "Já tem uma conta?",
1797
1989
  signInText: "Entrar",
1798
1990
  errors: {
@@ -1813,12 +2005,26 @@ const pt = {
1813
2005
  emailLabel: "E-mail",
1814
2006
  emailPlaceholder: "name@example.com",
1815
2007
  submitButton: "Enviar link de redefinição",
1816
- submittingButton: "Enviando...",
2008
+ submittingButton: "Enviando…",
1817
2009
  successTitle: "Verifique seu e-mail",
1818
2010
  successDescription: "Enviamos um link para redefinição de senha para {{email}}. Por favor verifique sua caixa de entrada.",
1819
2011
  backToSignInText: "Voltar para o login",
1820
2012
  rememberPasswordText: "Lembra da sua senha?",
1821
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.",
1822
2028
  },
1823
2029
  resetPassword: {
1824
2030
  title: "Definir nova senha",
@@ -1857,6 +2063,8 @@ const pt = {
1857
2063
  backToLogin: "Voltar ao login",
1858
2064
  checkSpam: "Não recebeu o e-mail? Verifique sua pasta de spam ou entre em contato com o suporte.",
1859
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.",
1860
2068
  },
1861
2069
  setup: {
1862
2070
  welcomeTitle: "Bem-vindo ao ObjectStack",
@@ -1895,6 +2103,9 @@ const pt = {
1895
2103
  invalidDescription: "Nenhum código de dispositivo foi fornecido na URL.",
1896
2104
  loading: "Carregando…",
1897
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.",
1898
2109
  },
1899
2110
  shell: {
1900
2111
  tenantHostHint: "Você está fazendo login neste espaço de trabalho",
@@ -1934,6 +2145,29 @@ const pt = {
1934
2145
  },
1935
2146
  },
1936
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
+ },
1937
2171
  profile: {
1938
2172
  title: "Perfil",
1939
2173
  subtitle: "Gerencie as configurações da sua conta",
@@ -1995,6 +2229,8 @@ const pt = {
1995
2229
  invite: "Convidar membro",
1996
2230
  members: "Membros",
1997
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',
1998
2234
  },
1999
2235
  help: {
2000
2236
  onThisPage: "Nesta página",
@@ -2005,7 +2241,7 @@ const pt = {
2005
2241
  },
2006
2242
  sidebar: {
2007
2243
  packageManagement: "Gerenciamento de pacotes",
2008
- searchNavigation: "Pesquisar na navegação...",
2244
+ searchNavigation: "Pesquisar na navegação…",
2009
2245
  settings: "Configurações",
2010
2246
  help: "Ajuda",
2011
2247
  helpTooltip: "Ajuda e documentação",
@@ -2029,8 +2265,8 @@ const pt = {
2029
2265
  switchObject: "Trocar de objeto",
2030
2266
  connection: {
2031
2267
  connected: "Conectado",
2032
- connecting: "Conectando...",
2033
- reconnecting: "Reconectando...",
2268
+ connecting: "Conectando…",
2269
+ reconnecting: "Reconectando…",
2034
2270
  disconnected: "Desconectado",
2035
2271
  error: "Erro de conexão",
2036
2272
  },
@@ -2069,6 +2305,14 @@ const pt = {
2069
2305
  publishing: "Publicando…",
2070
2306
  published: "Publicado! Suas alterações estão ativas.",
2071
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.",
2072
2316
  },
2073
2317
  title: "Início",
2074
2318
  subtitle: "Painel do seu espaço de trabalho",
@@ -2082,7 +2326,7 @@ const pt = {
2082
2326
  title: "Requer a sua atenção",
2083
2327
  empty: "Está tudo em dia",
2084
2328
  },
2085
- loading: "Carregando espaço de trabalho...",
2329
+ loading: "Carregando espaço de trabalho…",
2086
2330
  recent: "Recentes",
2087
2331
  starred: "Favoritos",
2088
2332
  welcome: "Bem-vindo ao ObjectUI",
@@ -2143,6 +2387,9 @@ const pt = {
2143
2387
  roles: "Perfis",
2144
2388
  configuration: "Configuração",
2145
2389
  createApp: "Criar aplicativo",
2390
+ administration: "Administração",
2391
+ datasources: "Fontes de dados",
2392
+ documentation: "Documentação",
2146
2393
  },
2147
2394
  appSwitcher: {
2148
2395
  switchApplication: "Trocar de aplicativo",
@@ -2182,7 +2429,7 @@ const pt = {
2182
2429
  search: {
2183
2430
  title: "Pesquisar",
2184
2431
  back: "Voltar",
2185
- placeholder: "Pesquisar objetos, painéis, páginas, relatórios...",
2432
+ placeholder: "Pesquisar objetos, painéis, páginas, relatórios…",
2186
2433
  inputAriaLabel: "Pesquisar objetos, painéis, páginas, relatórios",
2187
2434
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2188
2435
  resultsCountPlural: "{{count}} resultados para \"{{query}}\"",
@@ -2201,6 +2448,7 @@ const pt = {
2201
2448
  empty: {
2202
2449
  objectNotFound: "Objeto não encontrado",
2203
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.",
2204
2452
  pageNotFound: "Página não encontrada",
2205
2453
  pageNotFoundDescription: "A página \"{{name}}\" não foi encontrada. Ela pode ter sido removida ou renomeada.",
2206
2454
  dashboardNotFound: "Painel não encontrado",
@@ -2209,6 +2457,11 @@ const pt = {
2209
2457
  reportNotFoundDescription: "O relatório \"{{name}}\" não foi encontrado. Ele pode ter sido removido ou renomeado.",
2210
2458
  noAppsConfigured: "Nenhum aplicativo configurado",
2211
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",
2212
2465
  createFirstApp: "Criar primeiro aplicativo",
2213
2466
  systemSettings: "Configurações do sistema",
2214
2467
  back: "Voltar",
@@ -2280,7 +2533,7 @@ const pt = {
2280
2533
  deleteFailed: "Não foi possível excluir a exibição",
2281
2534
  },
2282
2535
  dashboardActions: {
2283
- 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)",
2284
2537
  exportFailed: "Falha na exportação: {{message}}",
2285
2538
  forecastSoon: "A exibição de previsão está chegando em breve",
2286
2539
  },
@@ -2324,111 +2577,7 @@ const pt = {
2324
2577
  first: "Primeiro",
2325
2578
  },
2326
2579
  editor: {
2327
- breadcrumb: "Configuração",
2328
- basic: "Geral",
2329
- title: "Título",
2330
- titlePlaceholder: "ex.: Pipeline por trimestre",
2331
- description: "Descrição",
2332
- descriptionPlaceholder: "O que este relatório mostra?",
2333
- type: "Tipo de relatório",
2334
- typeTabular: "Tabular — lista plana",
2335
- typeSummary: "Resumo — agrupado com totais",
2336
- typeMatrix: "Matriz — pivô linhas × colunas",
2337
- typeJoined: "Combinado — vários blocos",
2338
- typeHelp: "Escolha o layout que corresponde ao que deseja ver.",
2339
- data: "Dados",
2340
- objectName: "Fonte de dados",
2341
- objectNamePlaceholder: "ex.: opportunity",
2342
- objectNameHelp: "Qual objeto este relatório deve consultar?",
2343
- limit: "Limite de linhas",
2344
- limitPlaceholder: "ex.: 100",
2345
- columns: "Colunas",
2346
- columnsHint: "Escolha quais campos aparecem como colunas. Adicione uma agregação (Soma, Contagem…) em relatórios de Resumo ou Matriz.",
2347
- filters: "Filtros",
2348
- filtersHint: "Restrinja as linhas incluídas neste relatório.",
2349
- filtersComplex: "Este relatório usa um filtro avançado que não pode ser editado aqui. Ao salvar será mantido inalterado.",
2350
- groupBy: "Agrupar por",
2351
- groupByHint: "Agrupe os dados e calcule subtotais.",
2352
- rows: "Linhas",
2353
- rowsHint: "Agrupe linhas por estes campos.",
2354
- columnsAxis: "Colunas",
2355
- columnsAxisHint: "Pivote estes campos no topo.",
2356
- values: "Valores",
2357
- valuesHint: "Números exibidos em cada célula. Escolha um ou mais campos e adicione uma agregação (Soma, Contagem…).",
2358
- grouping: "Agrupamento",
2359
- addGrouping: "Adicionar agrupamento",
2360
- dateGranularity: "Granularidade de data",
2361
- dateGranularityNone: "(usar valor bruto)",
2362
- day: "Dia",
2363
- week: "Semana",
2364
- month: "Mês",
2365
- quarter: "Trimestre",
2366
- year: "Ano",
2367
- sortAsc: "Crescente",
2368
- sortDesc: "Decrescente",
2369
- chart: "Gráfico",
2370
- chartHint: "Visualização opcional ao lado da tabela.",
2371
- chartType: "Tipo de gráfico",
2372
- chartTitle: "Título do gráfico",
2373
- chartTitlePlaceholder: "Padrão: título do relatório",
2374
- chartXAxis: "Eixo X (categoria)",
2375
- chartYAxis: "Eixo Y (valor)",
2376
- chartShowLegend: "Mostrar legenda",
2377
- chartShowDataLabels: "Mostrar rótulos de dados",
2378
- chartNone: "(sem gráfico)",
2379
- chartBar: "Barras",
2380
- chartLine: "Linhas",
2381
- chartArea: "Áreas",
2382
- chartPie: "Pizza",
2383
- chartDonut: "Rosca",
2384
- chartFunnel: "Funil",
2385
- validationNeedsObject: "Escolha uma fonte de dados antes de adicionar colunas.",
2386
- validationMatrixNeedsRowsCols: "Relatórios de matriz precisam de pelo menos uma Linha e uma Coluna.",
2387
- validationSummaryNeedsRows: "Relatórios de resumo precisam de pelo menos um campo de agrupamento.",
2388
- blocks: "Blocos",
2389
- blocksHint: "Cada bloco é sua própria tabela ou gráfico. Filtros de bloco são combinados (E) com o filtro do relatório.",
2390
- addBlock: "Adicionar bloco",
2391
- removeBlock: "Remover bloco",
2392
- blockName: "Nome do bloco",
2393
- blockNamePlaceholder: "nome_unico_do_bloco",
2394
- blockLabel: "Rótulo de exibição",
2395
- blockLabelPlaceholder: "Exibido acima do bloco",
2396
- blockDescription: "Descrição",
2397
- blockDescriptionPlaceholder: "Contexto opcional para este bloco",
2398
- validationJoinedNeedsBlocks: "Relatórios combinados precisam de pelo menos um bloco.",
2399
- validationBlockNameRequired: "Cada bloco precisa de um nome não vazio.",
2400
- validationBlockNameDuplicate: "Os nomes dos blocos devem ser únicos no relatório.",
2401
- validationBlockNeedsColumns: "Cada bloco precisa de pelo menos uma coluna.",
2402
- noneOption: "(nenhum)",
2403
- addCondition: "Adicionar condição",
2404
- combineLogic: "Combinar com",
2405
- opContains: "contém",
2406
- opIsEmpty: "está vazio",
2407
- opIsNotEmpty: "não está vazio",
2408
- formatAuto: "Automático",
2409
- formatCurrency: "Moeda",
2410
- formatPercent: "Porcentagem",
2411
- formatInteger: "Inteiro",
2412
- formatDate: "Data",
2413
- formatDatetime: "Data e hora",
2414
- columnLabelPlaceholder: "Substituir rótulo",
2415
- aggregateColumn: "Agregação",
2416
- formatColumn: "Formato",
2417
- addColumns: "Adicionar colunas",
2418
- searchFields: "Pesquisar campos…",
2419
- noMatchingFields: "Nenhum campo corresponde à sua pesquisa.",
2420
- noFieldsAvailable: "Nenhum campo disponível.",
2421
- columnsCount: "{n} coluna(s) selecionada(s)",
2422
- columnsEmpty: "Nenhuma coluna selecionada ainda.",
2423
- fieldPickerTitle: "Selecionar campos",
2424
- fieldPickerDescription: "Escolha um ou mais campos para adicionar. Use o campo de pesquisa para filtrar a lista.",
2425
- fieldPickerChangeTitle: "Alterar campo",
2426
- fieldPickerAddGroupingTitle: "Adicionar agrupamento",
2427
- fieldPickerEmpty: "(Selecionar campo)",
2428
- fieldPickerSelected: "{n} selecionado(s)",
2429
- fieldPickerClear: "Limpar seleção",
2430
- fieldPickerAdd: "Adicionar",
2431
- fieldPickerAddN: "Adicionar {n}",
2580
+ panelTitle: "Editar relatório",
2432
2581
  },
2433
2582
  },
2434
2583
  organizations: {
@@ -2445,6 +2594,140 @@ const pt = {
2445
2594
  emptyDescription: "Crie sua primeira organização para começar.",
2446
2595
  noMatches: "Nenhuma organização corresponde à sua pesquisa.",
2447
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
+ },
2448
2731
  notifications: {
2449
2732
  regionLabel: "Notificações",
2450
2733
  groupCount: "{{count}} notificações",
@@ -2458,6 +2741,9 @@ const pt = {
2458
2741
  viewApprovals: "Ver aprovações",
2459
2742
  noPendingApprovals: "Sem aprovações pendentes",
2460
2743
  openApprovalsInbox: "Abrir caixa de aprovações",
2744
+ badgeTotal: "{{total}} no total",
2745
+ badgeNotifications: "{{unread}} notificações",
2746
+ badgeApprovals: "{{approvals}} aprovações pendentes",
2461
2747
  emptyUnread: "Tudo lido",
2462
2748
  filterUnread: "Não lidos",
2463
2749
  filterAll: "Todos",
@@ -2744,6 +3030,7 @@ const pt = {
2744
3030
  dismiss: "Fechar",
2745
3031
  openOnCloud: "Abrir na nuvem",
2746
3032
  backHome: "Voltar ao início",
3033
+ updateTo: "Atualizar",
2747
3034
  },
2748
3035
  install: {
2749
3036
  dialogTitle: "Instalar {{name}}",
@@ -2760,6 +3047,37 @@ const pt = {
2760
3047
  localManifestConflict: "{{message}}\nNota: Um aplicativo local já possui este manifest_id. Remova-o primeiro de objectstack.config.ts.",
2761
3048
  localUnauthorized: "Faça login neste runtime primeiro.",
2762
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
+ },
2763
3081
  },
2764
3082
  uninstall: {
2765
3083
  confirm: "Desinstalar {{manifestId}} v{{version}} deste runtime?\n\nO manifesto em cache será removido.",
@@ -3009,6 +3327,34 @@ const pt = {
3009
3327
  confirmNote: 'Publicar libera atomicamente todos os {{count}} rascunhos pendentes deste pacote.',
3010
3328
  publishConfirm: 'Publicar tudo',
3011
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
+ },
3012
3358
  },
3013
3359
  filterBuilder: {
3014
3360
  where: "Onde",
@@ -3087,5 +3433,57 @@ const pt = {
3087
3433
  statusIdle: "inativo",
3088
3434
  statusAway: "ausente",
3089
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
+ },
3090
3488
  };
3091
3489
  export default pt;