@object-ui/i18n 17.3.0 → 17.6.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 (44) hide show
  1. package/CHANGELOG.md +1929 -1
  2. package/README.md +41 -12
  3. package/dist/i18n.d.ts +1 -1
  4. package/dist/i18n.js +1 -2
  5. package/dist/index.d.ts +23 -21
  6. package/dist/index.js +31 -21
  7. package/dist/locales/ar.d.ts +638 -369
  8. package/dist/locales/ar.js +744 -424
  9. package/dist/locales/de.d.ts +638 -369
  10. package/dist/locales/de.js +759 -446
  11. package/dist/locales/en.d.ts +673 -404
  12. package/dist/locales/en.js +899 -406
  13. package/dist/locales/es.d.ts +638 -369
  14. package/dist/locales/es.js +739 -427
  15. package/dist/locales/fr.d.ts +638 -369
  16. package/dist/locales/fr.js +738 -423
  17. package/dist/locales/index.d.ts +6476 -3786
  18. package/dist/locales/index.js +20 -20
  19. package/dist/locales/ja.d.ts +638 -369
  20. package/dist/locales/ja.js +732 -417
  21. package/dist/locales/ko.d.ts +638 -369
  22. package/dist/locales/ko.js +736 -424
  23. package/dist/locales/pt.d.ts +638 -369
  24. package/dist/locales/pt.js +737 -425
  25. package/dist/locales/ru.d.ts +638 -369
  26. package/dist/locales/ru.js +750 -424
  27. package/dist/locales/zh.d.ts +672 -403
  28. package/dist/locales/zh.js +720 -403
  29. package/dist/pickLocalized.d.ts +58 -0
  30. package/dist/pickLocalized.js +115 -7
  31. package/dist/provider.d.ts +84 -2
  32. package/dist/provider.js +305 -31
  33. package/dist/useDisplayLocale.d.ts +49 -0
  34. package/dist/useDisplayLocale.js +55 -0
  35. package/dist/useObjectLabel.d.ts +94 -14
  36. package/dist/useObjectLabel.js +134 -21
  37. package/dist/useSafeTranslation.js +51 -3
  38. package/dist/utils/index.d.ts +4 -3
  39. package/dist/utils/index.js +4 -3
  40. package/dist/utils/number-display.d.ts +32 -0
  41. package/dist/utils/number-display.js +32 -0
  42. package/dist/utils/spec-formatters.d.ts +39 -13
  43. package/dist/utils/spec-formatters.js +3 -3
  44. package/package.json +4 -3
@@ -1,4 +1,18 @@
1
1
  const es = {
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: 'Está suplantando a {{user}}: todas las acciones se registran a su nombre.',
9
+ startedBy: 'Iniciado por el administrador {{admin}}.',
10
+ stop: 'Dejar de suplantar',
11
+ stopping: 'Finalizando…',
12
+ stopFailed: 'No se pudo dejar de suplantar: {{reason}}',
13
+ notRestored: 'El servidor aceptó la solicitud pero no restauró su sesión de administrador: sigue suplantando a {{user}}. Cierre sesión y vuelva a iniciarla para terminar.',
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 es = {
16
30
  other: 'Otro',
17
31
  },
18
32
  },
33
+ // objectui#3546 slice six — el resumen de solo lectura de las facetas de
34
+ // autorización de PermissionFacetLink. "pestaña" como en list.tabs.
35
+ perm: {
36
+ facet: {
37
+ none: "Ninguno",
38
+ more: "+{{count}} más",
39
+ objects: "{{count}} objetos",
40
+ objects_one: "{{count}} objeto",
41
+ fields: "{{count}} reglas de campo",
42
+ fields_one: "{{count}} regla de campo",
43
+ rls: "{{count}} políticas RLS",
44
+ rls_one: "{{count}} política RLS",
45
+ tabs: "{{count}} reglas de pestaña",
46
+ tabs_one: "{{count}} regla de pestaña",
47
+ adminScope: "Administración delegada configurada",
48
+ designInStudio: "Diseñar en Studio →",
49
+ designInStudioHint: "Diseñar en Studio",
50
+ },
51
+ },
19
52
  lookup: {
20
53
  recentlyUsed: 'Usados recientemente',
21
54
  allResults: 'Todos los resultados',
@@ -46,13 +79,13 @@ const es = {
46
79
  common: {
47
80
  addToFavorites: "Añadir a favoritos",
48
81
  removeFromFavorites: "Quitar de favoritos",
49
- loading: "Cargando...",
82
+ loading: "Cargando…",
50
83
  save: "Guardar",
84
+ discard: "Descartar",
51
85
  cancel: "Cancelar",
52
86
  delete: "Eliminar",
53
87
  edit: "Editar",
54
88
  create: "Crear",
55
- search: "Buscar",
56
89
  filter: "Filtrar",
57
90
  reset: "Restablecer",
58
91
  confirm: "Confirmar",
@@ -76,7 +109,7 @@ const es = {
76
109
  required: "Obligatorio",
77
110
  optional: "Opcional",
78
111
  selectOption: "Seleccionar una opción",
79
- select: "Seleccionar...",
112
+ select: "Seleccionar…",
80
113
  openChat: "Abrir chat",
81
114
  closeChat: "Cerrar chat",
82
115
  closePanel: "Cerrar panel",
@@ -85,6 +118,11 @@ const es = {
85
118
  itemCountOne: "{{count}} elemento",
86
119
  toggleSidebar: "Alternar barra lateral",
87
120
  package: "Paquete",
121
+ done: "Listo",
122
+ editInStudio: "Editar en Studio",
123
+ record: "Registro",
124
+ retry: "Reintentar",
125
+ printDialogHint: "Abre el cuadro de diálogo de impresión de tu navegador (no es una exportación a PDF)",
88
126
  },
89
127
  actions: {
90
128
  decisionOutput: {
@@ -121,6 +159,9 @@ const es = {
121
159
  submitFailed: "No se pudo guardar. Inténtalo de nuevo.",
122
160
  discardTitle: "¿Descartar los cambios?",
123
161
  discardMessage: "Tiene cambios sin guardar. Si cierra este formulario ahora, sus ediciones se perderán.",
162
+ // objectui#4024 — the create/edit dialog's `sr-only` accessible
163
+ // description, used when the form declares no `description` of its own.
164
+ dialogDescriptionFallback: "Complete los campos del formulario y luego envíe o cancele.",
124
165
  keepEditing: "Seguir editando",
125
166
  discard: "Descartar",
126
167
  conflictTitle: "Conflicto al guardar",
@@ -189,7 +230,7 @@ const es = {
189
230
  richText: {
190
231
  format: "Formato: {{format}}",
191
232
  basicEditorHint: "Editor de texto enriquecido (básico)",
192
- placeholder: "Escribe algo...",
233
+ placeholder: "Escribe algo…",
193
234
  },
194
235
  options: {
195
236
  empty: "No hay opciones disponibles",
@@ -225,6 +266,14 @@ const es = {
225
266
  tags: {
226
267
  placeholder: "Escriba y pulse Intro para añadir…",
227
268
  },
269
+ // objectui#4028 — `AddressField`'s five sub-labels.
270
+ address: {
271
+ street: "Dirección (calle)",
272
+ city: "Ciudad",
273
+ state: "Estado / Provincia",
274
+ postalCode: "Código postal",
275
+ country: "País",
276
+ },
228
277
  textarea: {
229
278
  characterCount: "Recuento de caracteres: {{count}} de {{max}}",
230
279
  charactersRemaining: "Caracteres restantes: {{count}}",
@@ -255,7 +304,7 @@ const es = {
255
304
  saveAll: "Guardar todo ({{count}})",
256
305
  addRecord: "Agregar registro",
257
306
  open: "Abrir",
258
- search: "Buscar...",
307
+ search: "Buscar…",
259
308
  modified: "{{count}} filas modificadas",
260
309
  saveFailed: 'Error al guardar',
261
310
  selected: "{{count}} seleccionados",
@@ -290,7 +339,7 @@ const es = {
290
339
  running: "Ejecutando…",
291
340
  undo: "Deshacer",
292
341
  undoing: "Deshaciendo…",
293
- done: "Hecho",
342
+ done: "Listo",
294
343
  selectPlaceholder: "Seleccionar…",
295
344
  loading: "Cargando…",
296
345
  },
@@ -299,7 +348,7 @@ const es = {
299
348
  delete: "Eliminar",
300
349
  export: "Exportar",
301
350
  exportAs: "Exportar como {{format}}",
302
- loading: "Cargando cuadrícula...",
351
+ loading: "Cargando cuadrícula…",
303
352
  errorLoading: "Error al cargar la cuadrícula",
304
353
  pullToRefresh: "Desliza para actualizar",
305
354
  refreshing: "Actualizando…",
@@ -310,6 +359,22 @@ const es = {
310
359
  yes: "Sí",
311
360
  no: "No",
312
361
  systemFields: "Sistema",
362
+ // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
363
+ // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
364
+ // pack controls its own separator and word order.
365
+ summary: {
366
+ pattern: "{{label}}: {{value}}",
367
+ count: "Recuento",
368
+ countEmpty: "Vacíos",
369
+ countFilled: "Rellenos",
370
+ countUnique: "Únicos",
371
+ percentEmpty: "Vacíos",
372
+ percentFilled: "Rellenos",
373
+ sum: "Suma",
374
+ avg: "Promedio",
375
+ min: "Mín.",
376
+ max: "Máx.",
377
+ },
313
378
  toolbar: {
314
379
  densityMode: "Densidad",
315
380
  densityCompact: "Compacto",
@@ -423,12 +488,12 @@ const es = {
423
488
  templateName: "Nombre de la plantilla",
424
489
  save: "Guardar",
425
490
  deleteTemplate: "Eliminar plantilla",
426
- savedMapping: 'Saved mapping:',
427
- chooseSavedMapping: 'Choose a saved mapping…',
428
- manualMapping: '— Map columns manually —',
429
- transform: 'Transform',
430
- savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
431
- savedMappingPreviewNote: 'The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.',
491
+ savedMapping: 'Asignación guardada:',
492
+ chooseSavedMapping: 'Elegir una asignación guardada…',
493
+ manualMapping: '— Asignar columnas manualmente —',
494
+ transform: 'Transformación',
495
+ savedMappingHint: 'La asignación "{{name}}" aplica el cambio de nombre + las transformaciones + la conversión de tipos en el servidor. La asignación de columnas es de solo lectura.',
496
+ savedMappingPreviewNote: 'La vista previa muestra sus columnas de origen; al importar, la asignación "{{name}}" aplica el cambio de nombre, las transformaciones y la conversión de tipos en el servidor.',
432
497
  csvColumn: "Columna",
433
498
  mapsTo: "Se asigna a",
434
499
  typeMismatch: "Parece {{type}}",
@@ -488,6 +553,8 @@ const es = {
488
553
  loadErrorUnauthorizedMessage: "Su sesión ha expirado o ha cerrado sesión. Inicie sesión de nuevo para ver estos registros.",
489
554
  loadErrorRejectedTitle: "La consulta de esta vista fue rechazada",
490
555
  loadErrorRejectedMessage: "El servidor no pudo procesar el filtro ni las opciones de consulta de esta vista. Borrar los filtros suele resolverlo; si la vista está guardada así, un administrador debe corregirla.",
556
+ loadErrorApiDisabledTitle: "Este objeto no está disponible a través de la API",
557
+ loadErrorApiDisabledMessage: "Esta página no puede cargar sus registros porque el objeto no está expuesto a través de la API. Es un ajuste del propio objeto, no un permiso: un administrador debe habilitar el acceso por API para que esta página funcione.",
491
558
  retry: "Reintentar",
492
559
  managedBy: {
493
560
  system: {
@@ -512,7 +579,7 @@ const es = {
512
579
  },
513
580
  },
514
581
  refresh: "Actualizar",
515
- loading: 'Loading records...',
582
+ loading: "Cargando registros…",
516
583
  recordCount: "{{count}} registros",
517
584
  recordCountOne: "{{count}} registro",
518
585
  addRecord: "Agregar registro",
@@ -524,7 +591,8 @@ const es = {
524
591
  sort: "Ordenar",
525
592
  sortRecords: "Ordenar registros",
526
593
  sortByIdSuffix: "(por ID)",
527
- sortRelationalHint: "Las columnas que apuntan a otro registro no aparecen aquí: solo pueden ordenarse por el ID almacenado, no por el nombre que se muestra en la celda. Para ordenar por ese nombre, añada un campo de fórmula que lo contenga.",
594
+ sortRelationalHint: "Las columnas que apuntan a otro registro no aparecen aquí: solo pueden ordenarse por el ID almacenado, no por el nombre que se muestra en la celda. Para ordenar por ese nombre, desnormalícelo en este objeto como un campo almacenado, que se escribe cuando cambia el origen, y ordene por él. No un campo de fórmula: es virtual, no se almacena ninguna columna para él y el servidor rechaza ordenar por él.",
595
+ resetSortToDefault: "Restablecer al valor predeterminado de la vista",
528
596
  group: "Agrupar",
529
597
  groupBy: "Agrupar por",
530
598
  export: "Exportar",
@@ -582,13 +650,16 @@ const es = {
582
650
  },
583
651
  kanban: {
584
652
  uncategorized: "Sin categoría",
653
+ columns: "columnas",
585
654
  addCard: "Añadir tarjeta",
586
655
  addColumn: "Añadir columna",
587
656
  moveCard: "Mover tarjeta",
588
657
  deleteCard: "Eliminar tarjeta",
589
658
  deleteColumn: "Eliminar columna",
590
659
  noCards: "Sin tarjetas",
591
- cardTitlePlaceholder: "Escriba el título de la tarjeta...",
660
+ cardTitlePlaceholder: "Escriba el título de la tarjeta…",
661
+ requiredFieldsTitle: "Complete los campos obligatorios",
662
+ requiredFieldsDescription: "Este movimiento hace que los campos siguientes sean obligatorios. Complételos para continuar.",
592
663
  },
593
664
  timeline: {
594
665
  bucket: {
@@ -601,6 +672,13 @@ const es = {
601
672
  noDate: "Sin fecha",
602
673
  unassigned: "Sin asignar",
603
674
  },
675
+ scale: {
676
+ week: "Semana {{n}}",
677
+ quarter: "T{{quarter}} {{year}}",
678
+ },
679
+ gantt: {
680
+ rowLabel: "Elementos",
681
+ },
604
682
  },
605
683
  gantt: {
606
684
  viewMode: {
@@ -647,6 +725,18 @@ const es = {
647
725
  ff: "Fin → Fin",
648
726
  sf: "Inicio → Fin",
649
727
  },
728
+ linkEnd: {
729
+ start: "Inicio",
730
+ end: "Fin",
731
+ },
732
+ link: {
733
+ rejected: {
734
+ self: "Una tarea no puede depender de sí misma.",
735
+ locked: "Esta fila está bloqueada y no puede recibir una nueva dependencia.",
736
+ group: "Una fila de resumen no puede recibir dependencias: vincule una de sus tareas.",
737
+ cycle: "Ese vínculo crearía una dependencia circular.",
738
+ },
739
+ },
650
740
  conflict: {
651
741
  title: "Conflicto de programación",
652
742
  body: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea(s) afectada(s)?",
@@ -655,8 +745,8 @@ const es = {
655
745
  },
656
746
  autoScheduleDlg: {
657
747
  title: "Programación automática",
658
- body: "¿Retrasar {count} tarea(s) para respetar los vínculos de dependencia?",
659
- skipped: "{count} tarea(s) bloqueada(s) también incumplen los vínculos y se han omitido.",
748
+ body: "¿Retrasar {{count}} tarea(s) para respetar los vínculos de dependencia?",
749
+ skipped: "{{count}} tarea(s) bloqueada(s) también incumplen los vínculos y se han omitido.",
660
750
  confirm: "Aplicar",
661
751
  cancel: "Cancelar",
662
752
  none: "Todas las dependencias se cumplen: no hay nada que reprogramar.",
@@ -693,6 +783,7 @@ const es = {
693
783
  exportPng: "Exportar como PNG",
694
784
  exportPdf: "Exportar PDF",
695
785
  saveLayout: "Guardar la disposición",
786
+ refresh: "Actualizar",
696
787
  undo: "Deshacer",
697
788
  redo: "Rehacer",
698
789
  prevPeriod: "Período anterior",
@@ -733,11 +824,11 @@ const es = {
733
824
  defaultBadge: "predeterminada",
734
825
  tabActionsFor: "Acciones de vista para {{name}}",
735
826
  readonlyAriaLabel: "Vista de solo lectura",
736
- readonlyTooltip: "Vista del sistema — duplique para personalizar.",
827
+ readonlyTooltip: "Vista del sistema — definida en el código, solo lectura.",
737
828
  },
738
829
  designer: {
739
- undo: 'Undo',
740
- redo: 'Redo',
830
+ undo: "Deshacer",
831
+ redo: "Rehacer",
741
832
  },
742
833
  detail: {
743
834
  editInlineHint: "Haga doble clic para editar",
@@ -777,13 +868,15 @@ const es = {
777
868
  relatedRecords: "{{count}} registros",
778
869
  relatedRecordOne: "{{count}} registro",
779
870
  noRelatedRecords: "No se encontraron registros relacionados",
780
- loading: "Cargando...",
871
+ loading: "Cargando…",
781
872
  copyToClipboard: "Copiar al portapapeles",
782
873
  copied: "¡Copiado!",
783
874
  deleteConfirmation: "¿Está seguro de que desea eliminar este registro?",
875
+ deleted: "Registro eliminado",
784
876
  editRecord: "Editar registro",
785
877
  viewAll: "Ver todo",
786
878
  new: "Nuevo",
879
+ add: "Agregar",
787
880
  emptyValue: "—",
788
881
  comments: "Comentarios",
789
882
  searchComments: "Buscar comentarios…",
@@ -813,6 +906,10 @@ const es = {
813
906
  attachmentDownloadDenied: "No tiene acceso para descargar este adjunto.",
814
907
  attachmentAuthRequired: "Inicie sesión para descargar este adjunto.",
815
908
  attachmentPermissionDenied: "No tiene permiso para hacer eso.",
909
+ attachmentsAccessDenied: "No tiene acceso a estos adjuntos.",
910
+ attachmentsLoadFailed: "No se pudieron cargar los adjuntos de este registro.",
911
+ attachmentsApiUnavailable: "La lista de adjuntos no está disponible en este objeto.",
912
+ retryLoadAttachments: "Reintentar",
816
913
  unifiedDiff: "Vista unificada",
817
914
  sideBySideDiff: "Vista lado a lado",
818
915
  noChanges: "Sin cambios",
@@ -848,6 +945,7 @@ const es = {
848
945
  loadMore: "Cargar más",
849
946
  edited: "(editado)",
850
947
  via: "vía {{source}}",
948
+ viewSource: "Ver origen",
851
949
  replyCount: "{{count}} respuesta",
852
950
  replyCountPlural: "{{count}} respuestas",
853
951
  replyPlaceholder: "Responder…",
@@ -863,6 +961,8 @@ const es = {
863
961
  writeStrippedTitle: "Guardado, pero algunos campos no se aplicaron",
864
962
  writeStrippedReadonly: "De solo lectura, por lo que no se aplicó: {{fields}}",
865
963
  writeStrippedByState: "No editable en el estado actual de este registro, por lo que no se aplicó: {{fields}}",
964
+ writeStrippedPrimaryKey: "El identificador del registro no se puede cambiar al guardar, por lo que no se aplicó: {{fields}}",
965
+ writeStrippedUnknownReason: "No aplicado por el servidor: {{fields}}",
866
966
  approvalPendingEditable: "En aprobación · editable",
867
967
  approvalPendingTooltip: "Este registro tiene una solicitud de aprobación pendiente; este paso todavía permite la edición",
868
968
  approvalProgress: "Aprobaciones — {{got}} de {{need}}",
@@ -875,6 +975,13 @@ const es = {
875
975
  cancelApprovalTooltipUnlocked: "Cancelar la solicitud de aprobación pendiente",
876
976
  cancelApprovalFailed: "No se pudo cancelar la aprobación",
877
977
  cancelApprovalUnavailable: "La cancelación de aprobaciones no es compatible con esta fuente de datos",
978
+ pathLabel: 'Ruta del registro',
979
+ pathStageCompleted: '{{stage}}, completada',
980
+ pathStageCurrent: '{{stage}}, etapa actual',
981
+ pathStageUpcoming: '{{stage}}, pendiente',
982
+ pathStageLostCurrent: '{{stage}}, perdida, etapa actual',
983
+ pathStageLostUpcoming: '{{stage}}, perdida, no alcanzada',
984
+ pathStageWonUpcoming: '{{stage}}, etapa objetivo, no alcanzada',
878
985
  linkCopied: "Enlace copiado al portapapeles",
879
986
  linkCopyFailed: "No se pudo copiar el enlace",
880
987
  cancel: "Cancelar",
@@ -889,9 +996,11 @@ const es = {
889
996
  concurrentUpdateReload: "Cargar versión actual",
890
997
  concurrentUpdateOverwrite: "Sobrescribir de todos modos",
891
998
  concurrentUpdateCancel: "Cancelar",
999
+ concurrentUpdateRecordLabel: "este registro",
892
1000
  openInNewTab: "Abrir en nueva pestaña",
893
1001
  activity: "Actividad",
894
1002
  history: "Historial",
1003
+ historyEmpty: "Aún no hay historial",
895
1004
  editRow: "Editar",
896
1005
  deleteRow: "Eliminar",
897
1006
  deleteRowConfirmation: "¿Eliminar este registro?",
@@ -901,12 +1010,15 @@ const es = {
901
1010
  nextPage: "Siguiente",
902
1011
  pageOf: "Página {{current}} de {{total}}",
903
1012
  sortBy: "Ordenar por",
904
- filterPlaceholder: "Filtrar...",
1013
+ filterPlaceholder: "Filtrar…",
905
1014
  highlightFields: "Campos clave",
906
1015
  createdBy: "Creado por",
907
1016
  updatedBy: "Actualizado por",
908
1017
  created: "Creado",
909
1018
  updated: "Actualizado",
1019
+ // objectui#3863 — base key. es's third category `many` starts at a million, where
1020
+ // the plural form is correct, so the base repeats `_other`.
1021
+ showEmptyRelated: "+ {{count}} vacíos",
910
1022
  showEmptyRelated_one: "+ {{count}} vacío",
911
1023
  showEmptyRelated_other: "+ {{count}} vacíos",
912
1024
  copyEmail: "Copiar correo",
@@ -918,7 +1030,8 @@ const es = {
918
1030
  },
919
1031
  chart: {
920
1032
  noData: "No hay datos de gráfico disponibles",
921
- loading: "Cargando gráfico...",
1033
+ loading: "Cargando gráfico…",
1034
+ nullCategory: "(Sin especificar)",
922
1035
  },
923
1036
  map: {
924
1037
  searchLocations: "Buscar ubicaciones…",
@@ -927,68 +1040,9 @@ const es = {
927
1040
  invalidCoordinates: "{{count}} registro con coordenadas faltantes o inválidas excluido del mapa.",
928
1041
  invalidCoordinatesPlural: "{{count}} registros con coordenadas faltantes o inválidas excluidos del mapa.",
929
1042
  },
930
- workflow: {
931
- draft: "Borrador",
932
- active: "Activo",
933
- paused: "En pausa",
934
- completed: "Completado",
935
- cancelled: "Cancelado",
936
- save: "Guardar",
937
- publish: "Publicar",
938
- addNode: "Añadir nodo",
939
- workflowFlow: "Flujo de trabajo",
940
- properties: "Propiedades",
941
- connections: "Conexiones",
942
- quickConnect: "Conexión rápida",
943
- fromPlaceholder: "Desde...",
944
- toPlaceholder: "Hasta...",
945
- connect: "Conectar",
946
- label: "Etiqueta",
947
- type: "Tipo",
948
- description: "Descripción",
949
- assignee: "Responsable",
950
- assigneeType: "Tipo de responsable",
951
- user: "Usuario",
952
- role: "Rol",
953
- group: "Grupo",
954
- expression: "Expresión",
955
- timeoutMinutes: "Tiempo límite (minutos)",
956
- selectNodeToEdit: "Selecciona un nodo para editar sus propiedades",
957
- workflowTitle: "Título del flujo de trabajo",
958
- newWorkflow: "Nuevo flujo de trabajo",
959
- outConnections: "{{count}} salida(s)",
960
- start: "Inicio",
961
- end: "Fin",
962
- task: "Tarea",
963
- userTask: "Tarea de usuario",
964
- serviceTask: "Tarea de servicio",
965
- scriptTask: "Tarea de script",
966
- approval: "Aprobación",
967
- condition: "Condición",
968
- parallelGateway: "Compuerta paralela",
969
- joinGateway: "Compuerta de unión",
970
- boundaryEvent: "Evento límite",
971
- delay: "Retraso",
972
- notification: "Notificación",
973
- webhook: "Webhook",
974
- allowConcurrency: "Permitir (ejecución simultánea)",
975
- forbidConcurrency: "Prohibir (omitir nuevos)",
976
- replaceConcurrency: "Reemplazar (cancelar existentes)",
977
- queueConcurrency: "Cola (ejecutar después)",
978
- conditionEvent: "Condición",
979
- manualEvent: "Manual",
980
- webhookEvent: "Webhook",
981
- timerEvent: "Temporizador",
982
- signalEvent: "Señal",
983
- versionHistory: "Historial de versiones",
984
- importBpmn: "Importar BPMN",
985
- exportBpmn: "Exportar BPMN",
986
- undo: "Deshacer",
987
- redo: "Rehacer",
988
- resetZoom: "Restablecer zoom",
989
- },
990
1043
  dashboard: {
991
1044
  noRows: "Sin filas",
1045
+ loading: "Cargando…",
992
1046
  pickMeasures: "Elija medidas (valores) para este widget de dataset.",
993
1047
  datasetUnsupported: "Esta fuente de datos no admite consultas de dataset.",
994
1048
  details: "Detalles",
@@ -1025,6 +1079,105 @@ const es = {
1025
1079
  total: "Total",
1026
1080
  noDataAvailable: "Sin datos disponibles",
1027
1081
  noDataSourceFor: "Sin fuente de datos para",
1082
+ config: {
1083
+ breadcrumb: {
1084
+ dashboard: "Panel de control",
1085
+ configuration: "Configuración",
1086
+ widget: "Widget",
1087
+ chart: "Gráfico",
1088
+ table: "Tabla",
1089
+ pivotTable: "Tabla dinámica",
1090
+ },
1091
+ section: {
1092
+ general: "General",
1093
+ layout: "Diseño",
1094
+ data: "Datos",
1095
+ dataBinding: "Vinculación de datos",
1096
+ appearance: "Apariencia",
1097
+ },
1098
+ field: {
1099
+ title: "Título",
1100
+ description: "Descripción",
1101
+ columns: "Columnas",
1102
+ gap: "Espaciado",
1103
+ rowHeight: "Altura de fila (px)",
1104
+ autoRefresh: "Actualización automática",
1105
+ showDescription: "Mostrar descripción",
1106
+ theme: "Tema",
1107
+ widgetType: "Tipo de widget",
1108
+ colorVariant: "Variante de color",
1109
+ dataset: "Conjunto de datos",
1110
+ dimensions: "Dimensiones",
1111
+ values: "Valores",
1112
+ width: "Ancho (columnas)",
1113
+ height: "Alto (filas)",
1114
+ },
1115
+ placeholder: {
1116
+ dashboardTitle: "Título del panel",
1117
+ dashboardDescription: "Resumen breve mostrado bajo el título",
1118
+ widgetTitle: "Título del widget",
1119
+ widgetDescription: "Descripción del widget",
1120
+ datasetName: "Nombre del conjunto de datos",
1121
+ selectDataset: "Seleccionar conjunto de datos…",
1122
+ searchDatasets: "Buscar conjuntos de datos…",
1123
+ addDimension: "Añadir dimensión…",
1124
+ addMeasure: "Añadir medida…",
1125
+ searchMembers: "Buscar…",
1126
+ },
1127
+ empty: {
1128
+ datasets: "No se encontraron conjuntos de datos.",
1129
+ dimensions: "No hay dimensiones seleccionadas.",
1130
+ measures: "No hay medidas seleccionadas.",
1131
+ nothingToAdd: "No queda nada por añadir.",
1132
+ },
1133
+ help: {
1134
+ dataset: "El conjunto de datos de la capa semántica al que se vincula este widget (ADR-0021).",
1135
+ dimensions: "Agrupar/dividir los valores por estas dimensiones del conjunto de datos.",
1136
+ dimensionsPivot: "Campos de agrupación/división. La última dimensión se despliega como columnas.",
1137
+ values: "Medidas del conjunto de datos que se mostrarán (al menos una).",
1138
+ },
1139
+ action: {
1140
+ add: "Añadir",
1141
+ remove: "Eliminar {{name}}",
1142
+ },
1143
+ refresh: {
1144
+ off: "Desactivado",
1145
+ every30s: "Cada 30 s",
1146
+ every1m: "Cada 1 min",
1147
+ every5m: "Cada 5 min",
1148
+ every15m: "Cada 15 min",
1149
+ every30m: "Cada 30 min",
1150
+ every1h: "Cada 1 hora",
1151
+ },
1152
+ themeOption: {
1153
+ light: "Claro",
1154
+ dark: "Oscuro",
1155
+ auto: "Automático",
1156
+ },
1157
+ widgetType: {
1158
+ metric: "Métrica",
1159
+ bar: "Gráfico de barras",
1160
+ horizontalBar: "Barras horizontales",
1161
+ line: "Gráfico de líneas",
1162
+ pie: "Gráfico circular",
1163
+ donut: "Gráfico de anillo",
1164
+ area: "Gráfico de área",
1165
+ scatter: "Gráfico de dispersión",
1166
+ funnel: "Embudo",
1167
+ table: "Tabla",
1168
+ pivot: "Tabla dinámica",
1169
+ },
1170
+ color: {
1171
+ default: "Predeterminado",
1172
+ blue: "Azul",
1173
+ teal: "Verde azulado",
1174
+ orange: "Naranja",
1175
+ purple: "Morado",
1176
+ success: "Éxito",
1177
+ warning: "Advertencia",
1178
+ danger: "Peligro",
1179
+ },
1180
+ },
1028
1181
  trend: {
1029
1182
  vsLastQuarter: "vs. trimestre anterior",
1030
1183
  vsLastMonth: "vs. mes anterior",
@@ -1034,24 +1187,6 @@ const es = {
1034
1187
  vsPreviousPeriod: "vs. período anterior",
1035
1188
  },
1036
1189
  },
1037
- configPanel: {
1038
- save: "Guardar",
1039
- discard: "Descartar",
1040
- close: "Cerrar",
1041
- layout: "Diseño",
1042
- columns: "Columnas",
1043
- gap: "Espaciado",
1044
- rowHeight: "Altura de fila",
1045
- data: "Datos",
1046
- refreshInterval: "Intervalo de actualización",
1047
- appearance: "Apariencia",
1048
- title: "Título",
1049
- showDescription: "Mostrar descripción",
1050
- theme: "Tema",
1051
- configuration: "Configuración",
1052
- general: "General",
1053
- advanced: "Avanzado",
1054
- },
1055
1190
  appDesigner: {
1056
1191
  createApp: "Crear aplicación",
1057
1192
  editApp: "Editar aplicación",
@@ -1102,8 +1237,6 @@ const es = {
1102
1237
  showSort: "Mostrar orden",
1103
1238
  appearance: "Apariencia",
1104
1239
  rowHeight: "Altura de fila",
1105
- stripedRows: "Filas alternadas",
1106
- bordered: "Con borde",
1107
1240
  livePreview: "Vista previa en vivo",
1108
1241
  stepBasicDesc: "Nombre, título y diseño",
1109
1242
  stepObjectsDesc: "Seleccionar objetos de negocio",
@@ -1217,7 +1350,6 @@ const es = {
1217
1350
  unique: "Único",
1218
1351
  readOnly: "Solo lectura",
1219
1352
  hidden: "Oculto",
1220
- indexed: "Indexado",
1221
1353
  externalId: "ID externo",
1222
1354
  trackHistory: "Rastrear historial",
1223
1355
  defaultValue: "Valor predeterminado",
@@ -1246,6 +1378,7 @@ const es = {
1246
1378
  },
1247
1379
  },
1248
1380
  console: {
1381
+ saveAdvisoryTitle: "Guardado: la comprobación de creación generó {{count}} recomendación(es)",
1249
1382
  settingsHub: {
1250
1383
  title: "Configuración",
1251
1384
  subtitle: "Configure su espacio de trabajo, las integraciones y los indicadores de funciones.",
@@ -1290,6 +1423,13 @@ const es = {
1290
1423
  passwordsDownload: "Descargar CSV",
1291
1424
  },
1292
1425
  ai: {
1426
+ pendingDrafts: {
1427
+ count: "{{count}} cambio(s) aún no se han publicado — los usuarios no pueden verlos.",
1428
+ publish: "Publicar",
1429
+ published: "Todos los cambios pendientes están activos.",
1430
+ failed: "Error al publicar.",
1431
+ publishedWithFindings: "Publicado, pero las comprobaciones en tiempo de ejecución detectaron problemas: {{detail}}",
1432
+ },
1293
1433
  usage: {
1294
1434
  title: "Uso de IA",
1295
1435
  meterBuild: "Crear",
@@ -1312,7 +1452,7 @@ const es = {
1312
1452
  shareTitle: "Compartir esta conversación",
1313
1453
  shareDisabledTitle: "Empiece a chatear para habilitar el uso compartido",
1314
1454
  newChat: "Nuevo",
1315
- searchChats: "Buscar chats...",
1455
+ searchChats: "Buscar chats…",
1316
1456
  noChatsYet: "Todavía no hay chats",
1317
1457
  noChatsDescription: "Inicie una conversación nueva para verla aquí.",
1318
1458
  noMatchingChats: "No hay chats coincidentes.",
@@ -1321,18 +1461,18 @@ const es = {
1321
1461
  deleteConversation: "Eliminar conversación",
1322
1462
  saveRename: "Guardar el nombre",
1323
1463
  cancelRename: "Cancelar el cambio de nombre",
1324
- loadingHistory: "Cargando el historial de la conversación...",
1464
+ loadingHistory: "Cargando el historial de la conversación…",
1325
1465
  conversationReady: "Conversación lista",
1326
1466
  preparingConversation: "Preparando una nueva conversación",
1327
1467
  offlineDemoMode: "Modo de demostración sin conexión — lista de agentes no disponible",
1328
1468
  sendFailedRateLimited: "Está enviando mensajes demasiado rápido. Su mensaje se conserva abajo — espere un momento y vuelva a intentarlo.",
1329
1469
  sendFailedGeneric: "No se pudo enviar su mensaje. Se conserva abajo — inténtelo de nuevo.",
1330
- askAgent: "Pregunte a {{agent}}...",
1470
+ askAgent: "Pregunte a {{agent}}…",
1331
1471
  assistant: "Asistente",
1332
1472
  liveCanvas: "Vista previa en vivo — {{app}} (borrador)",
1333
1473
  liveCanvasUnlisted: "Aplicación en vivo — {{app}} (no listada hasta su publicación)",
1334
- loadingAgents: "Cargando agentes...",
1335
- askAnything: "Pregunte lo que quiera...",
1474
+ loadingAgents: "Cargando agentes…",
1475
+ askAnything: "Pregunte lo que quiera…",
1336
1476
  emptyTitle: "Iniciar una conversación",
1337
1477
  emptyDescription: "Pregunte lo que quiera — el asistente tiene acceso al contexto de su aplicación actual.",
1338
1478
  switchAssistant: "Cambiar de asistente",
@@ -1425,6 +1565,11 @@ const es = {
1425
1565
  changesConfirmed: "Confirmado",
1426
1566
  changesConfirm: "Confirmar",
1427
1567
  changesConfirmHint: "Responda para confirmar o ajustar este cambio.",
1568
+ changesApplying: "Aplicando…",
1569
+ changesApplied: "Aplicado",
1570
+ changesDrafted: "Guardado como borrador",
1571
+ changesFailed: "No aplicado",
1572
+ discussing: "Tratando: {{target}}",
1428
1573
  changeVerb: {
1429
1574
  createObject: "Crear objeto",
1430
1575
  addField: "Añadir campo",
@@ -1435,9 +1580,60 @@ const es = {
1435
1580
  createSeed: "Generar datos de ejemplo",
1436
1581
  createPackage: "Crear paquete de aplicación",
1437
1582
  },
1583
+ // objectui#3546 slice four — the AI console surfaces: the /ai chat page's app switcher,
1584
+ // connection banner and plan/publish cards, the ChatDock chrome, and the
1585
+ // conversation-list date buckets. `group.*` is the template-key family
1586
+ // `console.ai.group.${key}` (ConversationsSidebar), enumerated from the
1587
+ // ConversationGroupKey union — all five members, no wildcard.
1588
+ collapseToDock: "Contraer al panel lateral",
1589
+ switchApp: "Cambiar de aplicación",
1590
+ switchAppLabel: "Conversaciones de creación por aplicación",
1591
+ newApp: "Nueva aplicación",
1592
+ connectionWaiting: "Esperando al servidor…",
1593
+ connectionStalled: "Sigue en proceso…",
1594
+ connectionOffline: "Conexión perdida — reconectando…",
1595
+ designingPlan: "Diseñando su aplicación…",
1596
+ designingPlanHint: {
1597
+ data: "Trazando los datos que va a registrar…",
1598
+ objects: "Dando forma a los objetos y sus campos…",
1599
+ relations: "Conectando los registros relacionados…",
1600
+ lookups: "Configurando las relaciones y los campos de búsqueda…",
1601
+ views: "Planificando las pantallas y las vistas…",
1602
+ forms: "Organizando los formularios y las listas…",
1603
+ defaults: "Agregando valores predeterminados y validaciones razonables…",
1604
+ dashboard: "Bosquejando un panel para el seguimiento…",
1605
+ review: "Comprobando que la estructura encaje…",
1606
+ finalize: "Reuniendo el plan…",
1607
+ },
1608
+ planBuilding: "Creando…",
1609
+ planBuilt: "Creado",
1610
+ planDeferred: "Aún no creado",
1611
+ planReady: "El plan está listo. Créelo ahora o dígame qué ajustar.",
1612
+ published: "Publicado",
1613
+ publishFailed: "Error al publicar",
1614
+ unavailableTitle: "Asistente de IA no disponible",
1615
+ unavailableDescription: "Esta implementación no tiene habilitado un asistente de IA. Todo lo demás funciona con normalidad.",
1616
+ unavailableError: "No se pudo contactar con el servicio de IA. Puede estar temporalmente sin conexión — reinténtelo o vuelva al inicio.",
1617
+ unavailableRetry: "Reintentar",
1618
+ unavailableHome: "Volver al inicio",
1619
+ dock: {
1620
+ title: "Asistente",
1621
+ description: "Chat con el asistente de IA",
1622
+ resize: "Redimensionar el chat",
1623
+ collapse: "Contraer el chat",
1624
+ maximize: "Abrir como página completa",
1625
+ open: "Abrir el asistente",
1626
+ },
1627
+ group: {
1628
+ today: "Hoy",
1629
+ yesterday: "Ayer",
1630
+ previous7Days: "7 días anteriores",
1631
+ previous30Days: "30 días anteriores",
1632
+ older: "Anteriores",
1633
+ },
1438
1634
  },
1439
1635
  title: "Consola ObjectStack",
1440
- initializing: "Inicializando aplicación...",
1636
+ initializing: "Inicializando aplicación…",
1441
1637
  loadingHint: "Configurar un entorno nuevo puede tardar unos momentos.",
1442
1638
  breadcrumb: {
1443
1639
  dashboards: "Paneles",
@@ -1445,6 +1641,31 @@ const es = {
1445
1641
  reports: "Informes",
1446
1642
  system: "Sistema",
1447
1643
  },
1644
+ // objectui#4024 — the single-namespace settings screen. Its sibling
1645
+ // `settingsHub` above already resolved through this pack; the view was the
1646
+ // one file still carrying English literals.
1647
+ settingsView: {
1648
+ backToHub: "Toda la configuración",
1649
+ back: "Atrás",
1650
+ noNamespace: "No hay ningún espacio de nombres seleccionado.",
1651
+ loadError: "No se pudo cargar la configuración",
1652
+ saved: "Configuración guardada",
1653
+ saveFailed: "Error al guardar",
1654
+ lockedByEnv: "Bloqueado por el entorno: {{key}}",
1655
+ lockedByEnvNoKey: "Bloqueado por el entorno",
1656
+ actionSucceeded: "La acción se completó correctamente",
1657
+ actionFailed: "La acción falló",
1658
+ discard: "Descartar",
1659
+ saveChanges: "Guardar cambios",
1660
+ unsavedCount: "{{count}} cambios sin guardar",
1661
+ unsavedCount_one: "{{count}} cambio sin guardar",
1662
+ unsavedCount_other: "{{count}} cambios sin guardar",
1663
+ cryptoRefusalTitle: "Esta instalación no puede cifrar secretos",
1664
+ cryptoRefusalSubjectSuffix: "está declarado como cifrado, por lo que no se escribió nada.",
1665
+ cryptoRefusalNoSubject: "El valor declarado como cifrado fue rechazado, por lo que no se escribió nada.",
1666
+ cryptoRefusalToast: "No se pueden cifrar los secretos: {{subject}}",
1667
+ cryptoRefusalToastNoSubject: "No se pueden cifrar los secretos",
1668
+ },
1448
1669
  loadingSteps: {
1449
1670
  connecting: "Conectando a la fuente de datos",
1450
1671
  loadingConfig: "Cargando configuración",
@@ -1474,6 +1695,7 @@ const es = {
1474
1695
  general: "General",
1475
1696
  navigation: "Navegación",
1476
1697
  dataViews: "Vistas de datos",
1698
+ aiChat: "Asistente de IA",
1477
1699
  preferences: "Preferencias",
1478
1700
  },
1479
1701
  openCommandPalette: "Abrir paleta de comandos",
@@ -1484,11 +1706,13 @@ const es = {
1484
1706
  createRecord: "Crear nuevo registro",
1485
1707
  refreshData: "Actualizar datos",
1486
1708
  editRecord: "Editar registro seleccionado",
1709
+ newChat: "Nuevo chat",
1710
+ toggleChatsList: "Alternar lista de chats",
1487
1711
  toggleDarkMode: "Alternar modo oscuro",
1488
1712
  },
1489
1713
  commandPalette: {
1490
1714
  title: "Paleta de comandos",
1491
- placeholder: "Escriba un comando o busque...",
1715
+ placeholder: "Escriba un comando o busque…",
1492
1716
  noResults: "No se encontraron resultados.",
1493
1717
  objects: "Objetos",
1494
1718
  dashboards: "Paneles",
@@ -1514,6 +1738,12 @@ const es = {
1514
1738
  goHome: "Ir al inicio",
1515
1739
  errorDetails: "Detalles del error (solo desarrollo)",
1516
1740
  },
1741
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1742
+ notFound: {
1743
+ title: "Página no encontrada",
1744
+ description: "La URL que siguió no coincide con ninguna vista de esta aplicación.",
1745
+ back: "Volver",
1746
+ },
1517
1747
  theme: {
1518
1748
  toggle: "Cambiar tema",
1519
1749
  light: "Claro",
@@ -1529,109 +1759,41 @@ const es = {
1529
1759
  viewNameHelp: "Clave técnica (snake_case). Se rellena automáticamente a partir del título — edítela si lo desea.",
1530
1760
  viewNameRequired: "Introduzca una clave (minúsculas, números, guion bajo). No se rellena automáticamente con títulos no latinos.",
1531
1761
  viewNameInvalid: "Use minúsculas, números y guiones bajos; empiece por una letra o un guion bajo.",
1532
- systemViewReadonly: 'System view defined in code - duplicate to customize.',
1533
- expandToPage: 'Open as full page',
1762
+ systemViewReadonly: "Vista del sistema definida en el código: solo lectura.",
1763
+ cannotEditMetaView: "Esta vista está integrada y definida en el código: no se puede modificar.",
1764
+ cannotDeleteMetaView: "Esta vista está integrada y definida en el código: no se puede eliminar.",
1765
+ expandToPage: "Abrir como página completa",
1534
1766
  objectNotFound: "Objeto no encontrado",
1535
1767
  objectNotFoundDescription: "El objeto \"{{objectName}}\" no existe en la configuración actual.",
1536
1768
  objectNotFoundHint: "Verifique la configuración de navegación de su aplicación o seleccione un objeto diferente en la barra lateral.",
1537
1769
  filterOrNotSavable: "Este filtro une las condiciones con O, algo que una vista guardada aún no puede almacenar. Se sigue aplicando a esta lista: quite la agrupación O para guardarlo en la vista.",
1538
1770
  filterNestedNotSavable: "Este filtro usa grupos de condiciones anidados, que una vista guardada no puede almacenar. Conviértalo en una única lista de condiciones para guardarlo en la vista.",
1539
1771
  allRecords: "Todos los registros",
1540
- exitDesignMode: "Salir del modo de diseño",
1541
- enterDesignMode: "Entrar en modo de diseño",
1542
- metadataInspector: "Inspector de metadatos",
1543
- editView: "Editar vista",
1544
- addView: "Agregar vista",
1545
- designTools: "Herramientas de diseño",
1546
1772
  new: "Nuevo",
1547
1773
  configureView: "Configurar vista",
1548
- closePanel: "Cerrar panel",
1549
- page: "Página",
1550
- pageConfigHint: "Barra de herramientas, navegación y configuración del shell de vista",
1551
- listConfigHint: "Renderizado de datos, columnas y apariencia para este tipo de lista",
1552
- general: "General",
1553
- generalHint: "Título, descripción y tipo de la vista",
1554
1774
  toolbar: "Barra de herramientas",
1555
- toolbarHint: "Búsqueda, filtro, orden, agrupación y alternancia de densidad",
1556
1775
  toolbarEnabledCount: "{{count}} de {{total}} habilitados",
1557
- navigationSection: "Navegación",
1558
- navigationHint: "Comportamiento al hacer clic en la fila y configuración de la vista detallada",
1559
- records: "Registros",
1560
- recordsHint: "Modo de selección, agregar registro y edición en línea",
1561
- exportPrint: "Exportar e imprimir",
1562
- exportPrintHint: "Formatos de exportación, impresión y visualización del recuento de registros",
1563
- showAllFields: "Mostrar todo",
1564
- hideAllFields: "Ocultar todo",
1565
- searchFields: "Buscar campos...",
1776
+ searchFields: "Buscar campos…",
1566
1777
  title: "Título",
1567
- description: "Descripción",
1568
- data: "Datos",
1569
- source: "Fuente",
1570
- columns: "Columnas",
1571
- filterBy: "Filtrar por",
1572
- sortBy: "Ordenar por",
1573
- appearance: "Apariencia",
1574
- showDescription: "Mostrar descripción",
1575
1778
  viewType: "Tipo de vista",
1576
- userFilters: "Filtros de usuario",
1577
- enableSearch: "Habilitar búsqueda",
1578
- enableFilter: "Habilitar filtro",
1579
- enableSort: "Habilitar ordenamiento",
1580
- enableHideFields: "Habilitar ocultar campos",
1581
- enableGroup: "Habilitar agrupación",
1582
- enableColor: "Habilitar color",
1583
- enableDensity: "Habilitar densidad",
1584
- userActions: "Acciones de usuario",
1585
- addRecordViaForm: "Agregar registros mediante formulario",
1586
- advanced: "Avanzado",
1587
- allowExport: "Permitir exportación",
1588
1779
  recordCount: "{{count}} registros",
1589
- noDescription: "Sin descripción",
1590
- none: "Ninguno",
1591
- columnsConfigured: "{{count}} columnas",
1592
1780
  save: "Guardar",
1593
1781
  discard: "Descartar",
1594
1782
  createView: "Crear vista",
1595
1783
  newView: "Nueva vista",
1596
- typeOptions: "Opciones de tipo",
1597
1784
  groupByField: "Campo de agrupación",
1598
1785
  startDateField: "Campo de fecha de inicio",
1599
1786
  titleField: "Campo de título",
1600
1787
  latitudeField: "Campo de latitud",
1601
1788
  longitudeField: "Campo de longitud",
1602
1789
  imageField: "Campo de imagen",
1603
- dateField: "Campo de fecha",
1604
- selectField: "Seleccionar campo...",
1605
- gridOptionsHint: "La vista de cuadrícula usa las columnas configuradas arriba.",
1790
+ selectField: "Seleccionar campo…",
1606
1791
  groupBy: "Agrupar por",
1607
- prefixField: "Campo de prefijo",
1608
- fields: "Campos",
1609
- fieldsVisible: "{{count}} visibles",
1610
- sortsCount: "{{count}} ordenamientos",
1611
- filtersCount: "{{count}} filtros",
1612
1792
  endDateField: "Campo de fecha de fin",
1613
- color: "Color",
1614
- fieldTextColor: "Color del texto del campo",
1615
- rowHeight: "Altura de fila",
1616
- wrapHeaders: "Ajustar encabezados",
1617
- showFieldDescriptions: "Mostrar descripciones de campos",
1618
- collapseAllByDefault: "Contraer todo por defecto",
1619
- striped: "Filas alternadas",
1620
- bordered: "Celdas con borde",
1621
- inlineEdit: "Editar registros en línea",
1622
- addDeleteRecordsInline: "Agregar/eliminar registros en línea",
1623
- clickIntoRecordDetails: "Clic para detalles del registro",
1624
- navigationMode: "Modo de navegación",
1625
- navigationWidth: "Ancho de navegación",
1626
- navigationWidthHint: "Disponible para los modos de navegación cajón, modal y dividido",
1627
- openNewTab: "Abrir en nueva pestaña",
1628
- openNewTabHint: "Disponible para los modos de navegación página y nueva ventana",
1629
1793
  import: "Importar",
1630
1794
  importTitle: "Importar desde CSV",
1631
1795
  importedToast: "{{count}} fila(s) importada(s).",
1632
1796
  importedWithSkipped: "{{ok}} fila(s) importada(s); {{skipped}} omitida(s).",
1633
- showAdvancedSettings: "Mostrar configuración avanzada",
1634
- showFewerSettings: "Mostrar menos configuraciones",
1635
1797
  createViewDesc: "Elija un tipo de vista y asígnele un nombre. Todas las configuraciones se pueden cambiar después.",
1636
1798
  cancel: "Cancelar",
1637
1799
  create: "Crear",
@@ -1664,7 +1826,7 @@ const es = {
1664
1826
  latitudeFieldHelp: "Campo que contiene la latitud (solo campos geográficos).",
1665
1827
  longitudeFieldHelp: "Campo que contiene la longitud (solo campos geográficos).",
1666
1828
  imageFieldHelp: "La portada de la galería proviene de este campo de imagen o adjunto.",
1667
- selectOption: "Seleccionar...",
1829
+ selectOption: "Seleccionar…",
1668
1830
  noEligibleFieldForType: "Ningún campo elegible de ese tipo. Agregue uno al objeto primero.",
1669
1831
  viewTypeUnavailable: "Este objeto no tiene un campo que sirva como \"{{field}}\".",
1670
1832
  viewTypeUnavailableShort: "No compatible con este objeto.",
@@ -1679,58 +1841,9 @@ const es = {
1679
1841
  xAxisFieldHelp: "La dimensión categórica o temporal.",
1680
1842
  yAxisField: "Campo eje Y",
1681
1843
  yAxisFieldHelp: "El campo numérico para agregar.",
1682
- selectionMode: "Modo de selección",
1683
- selectionNone: "Ninguno",
1684
- selectionSingle: "Individual",
1685
- selectionMultiple: "Múltiple",
1686
- pageSize: "Tamaño de página",
1687
- pageSizeOptions: "Opciones de tamaño de página",
1688
- exportFormats: "Formatos de exportación",
1689
- exportMaxRecords: "Máximo de registros",
1690
- exportIncludeHeaders: "Incluir encabezados",
1691
- exportFileNamePrefix: "Prefijo de nombre de archivo",
1692
- searchableFields: "Campos buscables",
1693
- filterableFields: "Campos filtrables",
1694
- resizableColumns: "Columnas redimensionables",
1695
- densityCompact: "Compacto",
1696
- densityComfortable: "Normal",
1697
- densitySpacious: "Espacioso",
1698
- densityMode: "Modo de densidad",
1699
- hiddenFields: "Campos ocultos",
1700
- rowActions: "Acciones de fila",
1701
- bulkActions: "Acciones masivas",
1702
- sharing: "Compartir",
1703
- sharingEnabled: "Compartir habilitado",
1704
- sharingVisibility: "Visibilidad",
1705
- addRecordEnabled: "Agregar registro habilitado",
1706
- addRecordPosition: "Posición",
1707
- addRecordMode: "Modo",
1708
- addRecordFormView: "Vista de formulario",
1709
- conditionalFormatting: "Formato condicional",
1710
- addRule: "Agregar regla",
1711
- quickFilters: "Filtros rápidos",
1712
- addQuickFilter: "Agregar filtro rápido",
1713
- ufElements: "Elementos",
1714
- ufDropdown: "Desplegable",
1715
1844
  ufTabs: "Pestañas",
1716
- ufToggle: "Alternar",
1717
- ufAddField: "+ Agregar campo de filtro...",
1718
- ufNoFields: "Sin campos disponibles",
1719
- ufAddTab: "+ Agregar pestaña",
1720
- ufTabLabel: "Etiqueta",
1845
+ ufAddField: "+ Agregar campo de filtro…",
1721
1846
  ufShowAllRecords: "Mostrar pestaña \"Todos los registros\"",
1722
- ufAllowAddTab: "Permitir agregar pestañas",
1723
- showRecordCount: "Mostrar recuento de registros",
1724
- allowPrinting: "Permitir impresión",
1725
- virtualScroll: "Desplazamiento virtual",
1726
- emptyStateTitle: "Título de estado vacío",
1727
- emptyStateMessage: "Mensaje de estado vacío",
1728
- emptyStateIcon: "Ícono de estado vacío",
1729
- ariaLabel: "Etiqueta ARIA",
1730
- ariaDescribedBy: "Descrito por ARIA",
1731
- ariaLive: "ARIA en vivo",
1732
- accessibility: "Accesibilidad",
1733
- viewTabs: "Pestañas de vista",
1734
1847
  },
1735
1848
  localeSwitcher: {
1736
1849
  label: "Idioma",
@@ -1774,7 +1887,7 @@ const es = {
1774
1887
  passwordPlaceholder: "Ingresa tu contraseña",
1775
1888
  forgotPasswordText: "¿Olvidaste tu contraseña?",
1776
1889
  submitButton: "Iniciar sesión",
1777
- submittingButton: "Iniciando sesión...",
1890
+ submittingButton: "Iniciando sesión…",
1778
1891
  noAccountText: "¿No tienes una cuenta?",
1779
1892
  signUpText: "Regístrate",
1780
1893
  errors: {
@@ -1782,6 +1895,18 @@ const es = {
1782
1895
  invalidCredentials: "Correo o contraseña inválidos. Inténtelo de nuevo.",
1783
1896
  emailNotVerified: "Verifique su correo electrónico antes de iniciar sesión.",
1784
1897
  },
1898
+ // objectui#3546 slice three — phone/OTP sign-in. `{seconds}` is LoginForm's own
1899
+ // literal `.replace()` hole, not i18next interpolation: keep the single braces.
1900
+ emailOrPhoneLabel: "Correo electrónico o número de teléfono",
1901
+ emailOrPhonePlaceholder: "name@example.com o +1 555 000 0000",
1902
+ phoneLabel: "Número de teléfono",
1903
+ phonePlaceholder: "+1 555 000 0000",
1904
+ otpCodeLabel: "Código de verificación",
1905
+ otpCodePlaceholder: "Código de 6 dígitos",
1906
+ sendOtpButton: "Obtener código",
1907
+ resendOtpCountdownText: "Reenviar en {seconds} s",
1908
+ usePhoneOtpText: "Iniciar sesión con código de verificación",
1909
+ usePasswordSignInText: "Iniciar sesión con contraseña en su lugar",
1785
1910
  },
1786
1911
  register: {
1787
1912
  title: "Crear una cuenta",
@@ -1797,7 +1922,7 @@ const es = {
1797
1922
  passwordMismatchError: "Las contraseñas no coinciden",
1798
1923
  passwordTooShortError: "La contraseña debe tener al menos 8 caracteres",
1799
1924
  submitButton: "Crear cuenta",
1800
- submittingButton: "Creando cuenta...",
1925
+ submittingButton: "Creando cuenta…",
1801
1926
  hasAccountText: "¿Ya tienes una cuenta?",
1802
1927
  signInText: "Iniciar sesión",
1803
1928
  errors: {
@@ -1818,12 +1943,26 @@ const es = {
1818
1943
  emailLabel: "Correo electrónico",
1819
1944
  emailPlaceholder: "name@example.com",
1820
1945
  submitButton: "Enviar enlace de restablecimiento",
1821
- submittingButton: "Enviando...",
1946
+ submittingButton: "Enviando…",
1822
1947
  successTitle: "Revisa tu correo electrónico",
1823
- successDescription: "Hemos enviado un enlace para restablecer la contraseña a {{email}}. Por favor revisa tu bandeja de entrada.",
1948
+ successDescription: "Hemos enviado un enlace para restablecer la contraseña a {email}. Por favor revisa tu bandeja de entrada.",
1824
1949
  backToSignInText: "Volver a iniciar sesión",
1825
1950
  rememberPasswordText: "¿Recuerdas tu contraseña?",
1826
1951
  signInText: "Iniciar sesión",
1952
+ // objectui#3546 slice three — the SMS reset branch of the same form.
1953
+ phoneLabel: "Número de teléfono",
1954
+ phonePlaceholder: "+1 555 000 0000",
1955
+ otpCodeLabel: "Código de verificación",
1956
+ otpCodePlaceholder: "Código de 6 dígitos",
1957
+ sendOtpButton: "Obtener código",
1958
+ resendOtpCountdownText: "Reenviar en {seconds} s",
1959
+ newPasswordLabel: "Nueva contraseña",
1960
+ newPasswordPlaceholder: "Ingresa una nueva contraseña",
1961
+ resetButton: "Restablecer contraseña",
1962
+ usePhoneResetText: "Restablecer con código SMS",
1963
+ useEmailResetText: "Restablecer por correo electrónico en su lugar",
1964
+ phoneSuccessTitle: "Contraseña restablecida",
1965
+ phoneSuccessDescription: "Tu contraseña ha sido restablecida. Ahora puedes iniciar sesión con tu nueva contraseña.",
1827
1966
  },
1828
1967
  resetPassword: {
1829
1968
  title: "Establecer nueva contraseña",
@@ -1862,6 +2001,8 @@ const es = {
1862
2001
  backToLogin: "Volver al inicio de sesión",
1863
2002
  checkSpam: "¿No recibió el correo? Revise su carpeta de spam o contacte soporte.",
1864
2003
  or: "O",
2004
+ // objectui#3546 slice three.
2005
+ resendUnavailable: "Puede que el envío de correos no esté configurado en este entorno. Contacte soporte si el problema persiste.",
1865
2006
  },
1866
2007
  setup: {
1867
2008
  welcomeTitle: "Bienvenido a ObjectStack",
@@ -1900,6 +2041,9 @@ const es = {
1900
2041
  invalidDescription: "No se proporcionó código de dispositivo en la URL.",
1901
2042
  loading: "Cargando…",
1902
2043
  cancel: "Cancelar",
2044
+ // objectui#3546 slice three — device-authorization plugin switched off.
2045
+ disabledTitle: "La autorización de dispositivos no está habilitada",
2046
+ disabledDescription: "Esta implementación no tiene habilitada la autorización de dispositivos, por lo que este dispositivo no puede aprobarse aquí.",
1903
2047
  },
1904
2048
  shell: {
1905
2049
  tenantHostHint: "Está iniciando sesión en este espacio de trabajo",
@@ -1939,6 +2083,29 @@ const es = {
1939
2083
  },
1940
2084
  },
1941
2085
  },
2086
+ // objectui#3546 slice three — the /oauth/consent screen.
2087
+ oauth: {
2088
+ consent: {
2089
+ title: "{{appName}} quiere acceder a su cuenta",
2090
+ request: "{{appName}} solicita permiso{{suffix}}.",
2091
+ unknownApp: "una aplicación",
2092
+ willAllow: "Esta aplicación podrá:",
2093
+ scope: {
2094
+ openid: "Confirmar su identidad",
2095
+ profile: "Leer su perfil básico (nombre, foto)",
2096
+ email: "Leer su dirección de correo electrónico",
2097
+ offlineAccess: "Mantener la sesión abierta (renovar el acceso)",
2098
+ },
2099
+ deny: "Denegar",
2100
+ authorize: "Autorizar",
2101
+ submitting: "Autorizando…",
2102
+ granted: "Acceso concedido",
2103
+ denied: "Acceso denegado",
2104
+ noRedirect: "El servidor no devolvió ninguna URL de redirección.",
2105
+ failed: "Error en el consentimiento",
2106
+ footer: "Puede revocar el acceso en cualquier momento desde la configuración de su cuenta.",
2107
+ },
2108
+ },
1942
2109
  profile: {
1943
2110
  title: "Perfil",
1944
2111
  subtitle: "Gestione la configuración de su cuenta",
@@ -2000,6 +2167,8 @@ const es = {
2000
2167
  invite: "Invitar miembro",
2001
2168
  members: "Miembros",
2002
2169
  settings: "Configuración del espacio de trabajo",
2170
+ multiOrgDisabled: "La creación de nuevas organizaciones está deshabilitada en esta instancia.",
2171
+ createFailed: 'No se pudo crear el espacio de trabajo',
2003
2172
  },
2004
2173
  help: {
2005
2174
  onThisPage: "En esta página",
@@ -2010,7 +2179,7 @@ const es = {
2010
2179
  },
2011
2180
  sidebar: {
2012
2181
  packageManagement: "Gestión de paquetes",
2013
- searchNavigation: "Buscar en la navegación...",
2182
+ searchNavigation: "Buscar en la navegación…",
2014
2183
  settings: "Configuración",
2015
2184
  help: "Ayuda",
2016
2185
  helpTooltip: "Ayuda y documentación",
@@ -2034,8 +2203,8 @@ const es = {
2034
2203
  switchObject: "Cambiar de objeto",
2035
2204
  connection: {
2036
2205
  connected: "Conectado",
2037
- connecting: "Conectando...",
2038
- reconnecting: "Reconectando...",
2206
+ connecting: "Conectando…",
2207
+ reconnecting: "Reconectando…",
2039
2208
  disconnected: "Desconectado",
2040
2209
  error: "Error de conexión",
2041
2210
  },
@@ -2051,10 +2220,12 @@ const es = {
2051
2220
  build: {
2052
2221
  title: "Crear una aplicación",
2053
2222
  subtitle: "Empiece desde cero — diseñe objetos, formularios, automatizaciones e interfaces.",
2223
+ noCapability: "La creación de aplicaciones no está disponible en este espacio de trabajo: requiere el permiso «Gestionar metadatos», que su cuenta no tiene.",
2054
2224
  },
2055
2225
  template: {
2056
2226
  title: "Empezar con una plantilla",
2057
2227
  subtitle: "Instale una aplicación de plantilla desde el mercado y personalícela.",
2228
+ marketplaceDisabled: "Este runtime no tiene un marketplace de aplicaciones configurado, por lo que no hay plantillas que instalar aquí.",
2058
2229
  },
2059
2230
  welcomeAdminDescription: "Describa su negocio en una frase — la IA genera los objetos, las pantallas, las API y las herramientas del agente. O configúrelo usted mismo desde el menú de la izquierda.",
2060
2231
  welcomeAdminDescriptionNoBuild: "Configure su primera aplicación desde el menú de Administración de la izquierda. Cuando tenga datos, el asistente de IA podrá ayudarle a explorarlos.",
@@ -2074,6 +2245,14 @@ const es = {
2074
2245
  publishing: "Publicando…",
2075
2246
  published: "¡Publicado! Sus cambios están activos.",
2076
2247
  publishFailed: "Error al publicar",
2248
+ // objectui#3546 slice six — seedWarn reutiliza la traducción de
2249
+ // console.ai.seedWarn (misma frase en inglés). Marcador "(s)" como en
2250
+ // home.pendingDrafts.message, de esta misma familia.
2251
+ nothing: "Nada que publicar.",
2252
+ probeWarn: "Publicado, pero la verificación encontró problemas.",
2253
+ seedWarn: "Publicado, pero no se pudieron cargar algunos datos de ejemplo.",
2254
+ publishedVerified: "Publicado y verificado — {{count}} fila(s) de ejemplo activa(s).",
2255
+ capabilityWarn: "Comprobación de autoría: {{count}} referencia(s) de capacidad no apuntan a nada.",
2077
2256
  },
2078
2257
  title: "Inicio",
2079
2258
  subtitle: "Panel de tu espacio de trabajo",
@@ -2087,7 +2266,7 @@ const es = {
2087
2266
  title: "Requiere tu atención",
2088
2267
  empty: "Estás al día",
2089
2268
  },
2090
- loading: "Cargando espacio de trabajo...",
2269
+ loading: "Cargando espacio de trabajo…",
2091
2270
  recent: "Recientes",
2092
2271
  starred: "Destacados",
2093
2272
  welcome: "Bienvenido a ObjectUI",
@@ -2148,6 +2327,9 @@ const es = {
2148
2327
  roles: "Roles",
2149
2328
  configuration: "Configuración",
2150
2329
  createApp: "Crear aplicación",
2330
+ administration: "Administración",
2331
+ datasources: "Fuentes de datos",
2332
+ documentation: "Documentación",
2151
2333
  },
2152
2334
  appSwitcher: {
2153
2335
  switchApplication: "Cambiar de aplicación",
@@ -2187,7 +2369,7 @@ const es = {
2187
2369
  search: {
2188
2370
  title: "Buscar",
2189
2371
  back: "Atrás",
2190
- placeholder: "Buscar objetos, paneles, páginas, informes...",
2372
+ placeholder: "Buscar objetos, paneles, páginas, informes…",
2191
2373
  inputAriaLabel: "Buscar objetos, paneles, páginas, informes",
2192
2374
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2193
2375
  resultsCountPlural: "{{count}} resultados para \"{{query}}\"",
@@ -2206,6 +2388,7 @@ const es = {
2206
2388
  empty: {
2207
2389
  objectNotFound: "Objeto no encontrado",
2208
2390
  objectNotFoundDescription: "Falta la definición del objeto \"{{name}}\". Verifique su configuración o navegue hacia atrás.",
2391
+ interfacePageSourceMissing: "Esta página de interfaz hace referencia a \"{{name}}\", que no está disponible.",
2209
2392
  pageNotFound: "Página no encontrada",
2210
2393
  pageNotFoundDescription: "La página \"{{name}}\" no fue encontrada. Puede haber sido eliminada o renombrada.",
2211
2394
  dashboardNotFound: "Panel no encontrado",
@@ -2214,27 +2397,17 @@ const es = {
2214
2397
  reportNotFoundDescription: "El informe \"{{name}}\" no fue encontrado. Puede haber sido eliminado o renombrado.",
2215
2398
  noAppsConfigured: "Sin aplicaciones configuradas",
2216
2399
  noAppsConfiguredDescription: "No hay aplicaciones registradas. Cree su primera aplicación o visite la configuración del sistema.",
2400
+ appNotAvailable: "Aplicación no disponible",
2401
+ appNotAvailableDescription: "Esta aplicación aún no está disponible — puede que todavía se esté publicando. Vuelva a intentarlo en un momento.",
2402
+ appAccessDenied: "No tiene acceso a esta aplicación",
2403
+ appAccessDeniedDescription: "Esta aplicación existe, pero su cuenta no está autorizada para abrirla. Solicite acceso a un administrador.",
2404
+ appAccessDeniedHome: "Volver al inicio",
2217
2405
  createFirstApp: "Crear primera aplicación",
2218
2406
  systemSettings: "Configuración del sistema",
2219
2407
  back: "Atrás",
2220
2408
  recordNotFound: "Registro no encontrado",
2221
2409
  recordNotFoundDescription: "El registro que busca no existe o puede haber sido eliminado.",
2222
2410
  },
2223
- renderer: {
2224
- noPageSchema: "No se proporcionó esquema de página",
2225
- noFormSchema: "No se proporcionó esquema de formulario",
2226
- noDashboardSchema: "No se proporcionó esquema de panel",
2227
- pageRendering: "Renderizando página: {{name}}",
2228
- dashboardRendering: "Renderizando panel: {{name}}",
2229
- formRenderingMode: "Formulario renderizado en modo {{mode}}",
2230
- formRenderingFor: "para registro {{id}}",
2231
- createRecord: "Crear registro",
2232
- editRecord: "Editar registro",
2233
- page: "Página",
2234
- dashboard: "Panel",
2235
- save: "Guardar",
2236
- cancel: "Cancelar",
2237
- },
2238
2411
  actionDialog: {
2239
2412
  title: "Parámetros de acción",
2240
2413
  description: "Ingrese la información requerida para continuar.",
@@ -2285,7 +2458,7 @@ const es = {
2285
2458
  deleteFailed: "No se pudo eliminar la vista",
2286
2459
  },
2287
2460
  dashboardActions: {
2288
- pdfPreparing: "Preparando exportación PDF…",
2461
+ printDialogOpening: "Abriendo el cuadro de diálogo de impresión de tu navegador (no es una exportación a PDF)",
2289
2462
  exportFailed: "Error al exportar: {{message}}",
2290
2463
  forecastSoon: "La vista de pronóstico llegará pronto",
2291
2464
  },
@@ -2329,126 +2502,159 @@ const es = {
2329
2502
  first: "Primero",
2330
2503
  },
2331
2504
  editor: {
2332
- breadcrumb: "Configuración",
2333
- basic: "General",
2334
- title: "Título",
2335
- titlePlaceholder: "p. ej. Pipeline por trimestre",
2336
- description: "Descripción",
2337
- descriptionPlaceholder: "¿Qué muestra este informe?",
2338
- type: "Tipo de informe",
2339
- typeTabular: "Tabla — lista plana",
2340
- typeSummary: "Resumen — agrupado con totales",
2341
- typeMatrix: "Matriz — pivote filas × columnas",
2342
- typeJoined: "Combinado — varios bloques",
2343
- typeHelp: "Elige el diseño que mejor refleje lo que quieres ver.",
2344
- data: "Datos",
2345
- objectName: "Fuente de datos",
2346
- objectNamePlaceholder: "p. ej. opportunity",
2347
- objectNameHelp: "¿Qué objeto debe consultar este informe?",
2348
- limit: "Límite de filas",
2349
- limitPlaceholder: "p. ej. 100",
2350
- columns: "Columnas",
2351
- columnsHint: "Elige los campos que aparecerán como columnas. Añade una agregación (Suma, Recuento…) en los informes Resumen o Matriz.",
2352
- filters: "Filtros",
2353
- filtersHint: "Limita las filas incluidas en este informe.",
2354
- filtersComplex: "Este informe usa un filtro avanzado que no se puede editar aquí. Al guardar se mantendrá intacto.",
2355
- groupBy: "Agrupar por",
2356
- groupByHint: "Agrupa los datos y calcula subtotales.",
2357
- rows: "Filas",
2358
- rowsHint: "Agrupa las filas por estos campos.",
2359
- columnsAxis: "Columnas",
2360
- columnsAxisHint: "Pivota estos campos en la parte superior.",
2361
- values: "Valores",
2362
- valuesHint: "Números mostrados en cada celda. Elige uno o varios campos y añade una agregación (Suma, Recuento…).",
2363
- grouping: "Agrupación",
2364
- addGrouping: "Añadir agrupación",
2365
- dateGranularity: "Granularidad de fecha",
2366
- dateGranularityNone: "(valor original)",
2367
- day: "Día",
2368
- week: "Semana",
2369
- month: "Mes",
2370
- quarter: "Trimestre",
2371
- year: "Año",
2372
- sortAsc: "Ascendente",
2373
- sortDesc: "Descendente",
2374
- chart: "Gráfico",
2375
- chartHint: "Visualización opcional junto a la tabla.",
2376
- chartType: "Tipo de gráfico",
2377
- chartTitle: "Título del gráfico",
2378
- chartTitlePlaceholder: "Por defecto, el título del informe",
2379
- chartXAxis: "Eje X (categoría)",
2380
- chartYAxis: "Eje Y (valor)",
2381
- chartShowLegend: "Mostrar leyenda",
2382
- chartShowDataLabels: "Mostrar etiquetas de datos",
2383
- chartNone: "(sin gráfico)",
2384
- chartBar: "Barras",
2385
- chartLine: "Líneas",
2386
- chartArea: "Áreas",
2387
- chartPie: "Circular",
2388
- chartDonut: "Anillo",
2389
- chartFunnel: "Embudo",
2390
- validationNeedsObject: "Selecciona una fuente de datos antes de añadir columnas.",
2391
- validationMatrixNeedsRowsCols: "Los informes de matriz necesitan al menos una fila y una columna.",
2392
- validationSummaryNeedsRows: "Los informes de resumen necesitan al menos un campo de agrupación.",
2393
- blocks: "Bloques",
2394
- blocksHint: "Cada bloque es su propia tabla o gráfico. Los filtros del bloque se combinan (Y) con el filtro del informe.",
2395
- addBlock: "Añadir bloque",
2396
- removeBlock: "Eliminar bloque",
2397
- blockName: "Nombre del bloque",
2398
- blockNamePlaceholder: "nombre_unico_del_bloque",
2399
- blockLabel: "Etiqueta a mostrar",
2400
- blockLabelPlaceholder: "Se muestra encima del bloque",
2401
- blockDescription: "Descripción",
2402
- blockDescriptionPlaceholder: "Contexto opcional para este bloque",
2403
- validationJoinedNeedsBlocks: "Los informes combinados necesitan al menos un bloque.",
2404
- validationBlockNameRequired: "Cada bloque debe tener un nombre no vacío.",
2405
- validationBlockNameDuplicate: "Los nombres de bloque deben ser únicos dentro del informe.",
2406
- validationBlockNeedsColumns: "Cada bloque debe tener al menos una columna.",
2407
- noneOption: "(ninguno)",
2408
- addCondition: "Añadir condición",
2409
- combineLogic: "Combinar con",
2410
- opContains: "contiene",
2411
- opIsEmpty: "está vacío",
2412
- opIsNotEmpty: "no está vacío",
2413
- formatAuto: "Auto",
2414
- formatCurrency: "Moneda",
2415
- formatPercent: "Porcentaje",
2416
- formatInteger: "Entero",
2417
- formatDate: "Fecha",
2418
- formatDatetime: "Fecha y hora",
2419
- columnLabelPlaceholder: "Sobrescribir etiqueta",
2420
- aggregateColumn: "Agregación",
2421
- formatColumn: "Formato",
2422
- addColumns: "Añadir columnas",
2423
- searchFields: "Buscar campos…",
2424
- noMatchingFields: "Ningún campo coincide con tu búsqueda.",
2425
- noFieldsAvailable: "No hay campos disponibles.",
2426
- columnsCount: "{n} columna(s) seleccionada(s)",
2427
- columnsEmpty: "Aún no hay columnas seleccionadas.",
2428
- fieldPickerTitle: "Seleccionar campos",
2429
- fieldPickerDescription: "Elija uno o más campos para agregar. Use el campo de búsqueda para filtrar la lista.",
2430
- fieldPickerChangeTitle: "Cambiar campo",
2431
- fieldPickerAddGroupingTitle: "Agregar agrupación",
2432
- fieldPickerEmpty: "(Seleccionar campo)",
2433
- fieldPickerSelected: "{n} seleccionado(s)",
2434
- fieldPickerClear: "Limpiar selección",
2435
- fieldPickerAdd: "Agregar",
2436
- fieldPickerAddN: "Agregar {n}",
2505
+ panelTitle: "Editar informe",
2437
2506
  },
2438
2507
  },
2439
2508
  organizations: {
2440
2509
  create: "Crear espacio de trabajo",
2441
- mine: "Mis organizaciones",
2442
- title: "Organizaciones",
2443
- heading: "Tus organizaciones",
2444
- subtitle: "Selecciona una organización para continuar o crea una nueva.",
2445
- searchPlaceholder: "Buscar una organización",
2446
- new: "Nueva organización",
2447
- current: "Organización actual",
2510
+ mine: "Mis espacios de trabajo",
2511
+ title: "Espacios de trabajo",
2512
+ heading: "Tus espacios de trabajo",
2513
+ subtitle: "Selecciona un espacio de trabajo para continuar o crea uno nuevo.",
2514
+ searchPlaceholder: "Buscar un espacio de trabajo",
2515
+ new: "Nuevo espacio de trabajo",
2516
+ current: "Espacio de trabajo actual",
2448
2517
  manage: "Administrar",
2449
- emptyTitle: "Aún no hay organizaciones",
2450
- emptyDescription: "Crea tu primera organización para empezar.",
2451
- noMatches: "Ninguna organización coincide con tu búsqueda.",
2518
+ emptyTitle: "Aún no hay espacios de trabajo",
2519
+ emptyDescription: "Crea tu primer espacio de trabajo para empezar.",
2520
+ noMatches: "Ningún espacio de trabajo coincide con tu búsqueda.",
2521
+ },
2522
+ organization: {
2523
+ roles: {
2524
+ owner: 'Propietario',
2525
+ admin: 'Administrador',
2526
+ delegatedAdmin: 'Administrador delegado',
2527
+ member: 'Miembro',
2528
+ },
2529
+ errors: {
2530
+ notAllowedToInvite: 'No tiene permiso para invitar usuarios a esta organización.',
2531
+ notAllowedToInviteWithRole: 'No tiene permiso para invitar a un usuario con este rol.',
2532
+ alreadyInvited: 'Este usuario ya ha sido invitado a esta organización.',
2533
+ organizationExists: 'Esa organización ya existe.',
2534
+ slugTaken: 'Ese slug ya está en uso.',
2535
+ notAllowedToCreate: 'No tiene permiso para crear una organización nueva.',
2536
+ notTheRecipient: 'No es el destinatario de esta invitación.',
2537
+ invitationNotFound: 'Esta invitación ya no existe o ha caducado.',
2538
+ unknown: 'Algo salió mal. Inténtelo de nuevo.',
2539
+ },
2540
+ backToList: "Volver a las organizaciones",
2541
+ notFound: "Organización no encontrada",
2542
+ notFoundDescription: "Esta organización no existe o no tienes acceso.",
2543
+ tabs: {
2544
+ members: "Miembros",
2545
+ invitations: "Invitaciones",
2546
+ settings: "Configuración",
2547
+ },
2548
+ members: {
2549
+ title: "Miembros",
2550
+ inviteMember: "Invitar miembro",
2551
+ inviteRestrictedNote: "Solo los administradores de la organización pueden invitar a miembros.",
2552
+ removeMember: "Eliminar miembro",
2553
+ removeConfirmTitle: "¿Eliminar miembro?",
2554
+ removeConfirmDescription: "Se eliminará a {{name}} de la organización y perderá el acceso de inmediato.",
2555
+ removeConfirmAction: "Eliminar",
2556
+ memberRemoved: "Miembro eliminado",
2557
+ removeFailed: "No se pudo eliminar al miembro",
2558
+ roleUpdated: "Rol actualizado",
2559
+ roleUpdateFailed: "No se pudo actualizar el rol",
2560
+ memberActions: 'Acciones del miembro',
2561
+ loadFailed: 'No se pudieron cargar los miembros',
2562
+ },
2563
+ invitations: {
2564
+ title: "Invitaciones",
2565
+ empty: "No hay invitaciones.",
2566
+ expiresAt: "Caduca",
2567
+ linkCopied: "Enlace de invitación copiado",
2568
+ copyFailed: "No se pudo copiar el enlace",
2569
+ canceled: "Invitación cancelada",
2570
+ cancelFailed: "No se pudo cancelar la invitación",
2571
+ cancelTitle: "¿Cancelar la invitación?",
2572
+ cancelDescription: "Se revocará la invitación de {{email}}.",
2573
+ cancelAction: "Cancelar invitación",
2574
+ inviteTitle: "Invitar a un miembro",
2575
+ inviteDescription: "Recibirá una invitación para unirse a esta organización.",
2576
+ emailLabel: "Correo electrónico",
2577
+ roleLabel: "Rol",
2578
+ placementLabel: "Asignación (opcional)",
2579
+ placementDescription: "Se aplica cuando se acepta la invitación. Solo se listan las unidades y los puestos que puedes delegar.",
2580
+ businessUnitLabel: "Unidad de negocio",
2581
+ businessUnitPlaceholder: "Sin asignación",
2582
+ positionsLabel: "Puestos",
2583
+ sendInvite: "Enviar invitación",
2584
+ sentTitle: "Invitación creada",
2585
+ sentDescription: "Comparte el enlace de abajo con la persona invitada. Tendrá que iniciar sesión para aceptarla.",
2586
+ linkLabel: "Enlace de aceptación",
2587
+ invitedAs: "{{email}} invitado como {{role}}",
2588
+ copyLinkLabel: 'Copiar enlace de invitación',
2589
+ loadFailed: 'No se pudieron cargar las invitaciones',
2590
+ inviteFailed: 'No se pudo invitar al miembro',
2591
+ status: {
2592
+ all: "Todas",
2593
+ pending: "Pendiente",
2594
+ accepted: "Aceptada",
2595
+ rejected: "Rechazada",
2596
+ canceled: "Cancelada",
2597
+ },
2598
+ },
2599
+ settings: {
2600
+ generalTitle: "General",
2601
+ generalDescription: "Actualiza la información de tu organización.",
2602
+ readOnlyNote: "Solo los propietarios pueden cambiar la configuración.",
2603
+ nameLabel: "Nombre de la organización",
2604
+ slugLabel: "Slug",
2605
+ logoLabel: "Logo",
2606
+ logoUpload: "Subir",
2607
+ logoReplace: "Reemplazar",
2608
+ logoClear: "Quitar",
2609
+ logoUploaded: "Logo subido: guarda para aplicarlo",
2610
+ logoUploadFailed: "No se pudo subir el logo",
2611
+ save: "Guardar cambios",
2612
+ saved: "Configuración guardada",
2613
+ saveFailed: "No se pudo guardar la configuración",
2614
+ leaveTitle: "Salir de la organización",
2615
+ leaveDescription: "Perderás el acceso a esta organización.",
2616
+ leaveAction: "Salir",
2617
+ leaveConfirmTitle: "¿Salir de la organización?",
2618
+ leaveConfirmDescription: "¿Seguro que quieres salir de {{name}}? Perderás el acceso de inmediato.",
2619
+ leaveConfirmAction: "Salir",
2620
+ leftOrg: "Has salido de la organización",
2621
+ leaveFailed: "No se pudo salir de la organización",
2622
+ dangerZone: "Zona de peligro",
2623
+ deleteTitle: "Eliminar organización",
2624
+ deleteDescription: "Elimina permanentemente esta organización y todos sus datos.",
2625
+ deleteAction: "Eliminar",
2626
+ deleteConfirmTitle: "¿Eliminar la organización?",
2627
+ deleteConfirmDescription: "Esta acción es irreversible. Todos los datos se eliminarán de forma permanente. Escribe el slug de la organización para confirmar.",
2628
+ deleteConfirmSlugLabel: "Escribe «{{slug}}» para confirmar",
2629
+ deleteConfirmAction: "Eliminar organización",
2630
+ deleted: "Organización eliminada",
2631
+ deleteFailed: "No se pudo eliminar la organización",
2632
+ },
2633
+ accept: {
2634
+ title: "Te han invitado",
2635
+ description: "Te han invitado a unirte a {{orgName}} como {{role}}.",
2636
+ errorTitle: "Invitación no disponible",
2637
+ goToOrgs: "Ir a las organizaciones",
2638
+ loading: "Cargando la invitación…",
2639
+ organization: "Organización",
2640
+ role: "Rol",
2641
+ expiresAt: "Caduca",
2642
+ accept: "Aceptar invitación",
2643
+ accepted: "Invitación aceptada",
2644
+ acceptFailed: "No se pudo aceptar la invitación",
2645
+ decline: "Rechazar",
2646
+ declined: "Invitación rechazada",
2647
+ declineFailed: "No se pudo rechazar la invitación",
2648
+ },
2649
+ current: {
2650
+ label: "Organización actual",
2651
+ },
2652
+ switcher: {
2653
+ label: "Cambiar de organización",
2654
+ groupLabel: "Organización de trabajo",
2655
+ groupHint: "Los registros nuevos se crean aquí. Las vistas muestran datos de todas tus organizaciones.",
2656
+ manageMembers: "Administrar miembros",
2657
+ },
2452
2658
  },
2453
2659
  notifications: {
2454
2660
  regionLabel: "Notificaciones",
@@ -2463,6 +2669,9 @@ const es = {
2463
2669
  viewApprovals: "Ver aprobaciones",
2464
2670
  noPendingApprovals: "Sin aprobaciones pendientes",
2465
2671
  openApprovalsInbox: "Abrir bandeja de aprobaciones",
2672
+ badgeTotal: "{{total}} en total",
2673
+ badgeNotifications: "{{unread}} notificaciones",
2674
+ badgeApprovals: "{{approvals}} aprobaciones pendientes",
2466
2675
  emptyUnread: "Todo al día",
2467
2676
  filterUnread: "No leídos",
2468
2677
  filterAll: "Todos",
@@ -2487,52 +2696,6 @@ const es = {
2487
2696
  consentRequired: "Acepte la política de privacidad para continuar.",
2488
2697
  rateLimited: "Tómese un momento para revisar sus respuestas antes de enviar.",
2489
2698
  redirectBlocked: "Envío aceptado, pero la URL de redirección fue bloqueada por seguridad.",
2490
- demo: {
2491
- contactTitle: "Ponerse en contacto",
2492
- contactDescription: "Cuéntenos sobre su proyecto y un representante de ventas le contactará en un día hábil.",
2493
- supportTitle: "Enviar solicitud de soporte",
2494
- supportDescription: "Descríbanos el problema — nuestro equipo responderá en un día hábil.",
2495
- thankYouSalesTitle: "¡Gracias — recibimos su mensaje!",
2496
- thankYouSalesMessage: "Un representante de ventas le contactará en un día hábil.",
2497
- thankYouSupportTitle: "Listo — su solicitud está en cola.",
2498
- thankYouSupportMessage: "Un ingeniero de soporte le dará seguimiento pronto. Guarde esta página si tiene capturas de pantalla adicionales.",
2499
- field: {
2500
- firstName: "Nombre",
2501
- lastName: "Apellido",
2502
- email: "Correo empresarial",
2503
- phone: "Teléfono",
2504
- jobTitle: "Cargo",
2505
- company: "Empresa",
2506
- website: "Sitio web",
2507
- industry: "Industria",
2508
- companySize: "Tamaño de empresa",
2509
- howCanWeHelp: "¿Cómo podemos ayudarle?",
2510
- subject: "Asunto",
2511
- description: "Descripción",
2512
- issueType: "Tipo de problema",
2513
- priority: "Prioridad",
2514
- },
2515
- industry: {
2516
- technology: "Tecnología",
2517
- software: "Software / SaaS",
2518
- finance: "Finanzas",
2519
- healthcare: "Salud",
2520
- retail: "Retail",
2521
- other: "Otro",
2522
- },
2523
- issueType: {
2524
- question: "Pregunta",
2525
- problem: "Problema",
2526
- bug: "Error",
2527
- feature_request: "Solicitud de función",
2528
- },
2529
- priority: {
2530
- low: "Baja",
2531
- medium: "Media",
2532
- high: "Alta",
2533
- critical: "Crítica",
2534
- },
2535
- },
2536
2699
  },
2537
2700
  connectAgent: {
2538
2701
  disabled: {
@@ -2645,6 +2808,7 @@ const es = {
2645
2808
  retry: "Reintentar",
2646
2809
  errors: {
2647
2810
  expired: "La solicitud caducó antes de ser aprobada. Vuelva a empezar.",
2811
+ accessDenied: "La solicitud de conexión fue rechazada. Vuelva a empezar.",
2648
2812
  bindFailed: "Error al vincular.",
2649
2813
  deviceCodeFailed: "Error en la solicitud del código de dispositivo.",
2650
2814
  },
@@ -2710,10 +2874,16 @@ const es = {
2710
2874
  installedBadge: "Instalado v{{version}}",
2711
2875
  load: {
2712
2876
  failed: "No se pudo cargar el marketplace",
2713
- failedHint: "Por defecto, este runtime apunta a la nube pública de ObjectStack. Asegúrese de que el runtime esté en línea.",
2877
+ failedHintConfigured: "Este runtime accede al marketplace a través del plano de control en {{url}}. Compruebe que esté en línea y sea accesible desde aquí.",
2878
+ failedHintSameOrigin: "Este runtime sirve el catálogo del marketplace por sí mismo. Compruebe que el runtime esté en línea.",
2714
2879
  packageFailed: "No se pudo cargar el paquete",
2715
2880
  notFound: "No encontrado.",
2716
2881
  },
2882
+ disabled: {
2883
+ title: "El marketplace de aplicaciones está desactivado",
2884
+ description: "Este runtime no tiene ningún marketplace configurado, por lo que no hay nada que explorar ni instalar desde aquí.",
2885
+ hint: "Ese es el estado esperado cuando el runtime se inicia con <code>OS_CLOUD_URL=off</code> (o <code>none</code>, <code>local</code>, <code>disabled</code>). Para activar el marketplace, apunte <code>OS_CLOUD_URL</code> a un plano de control y reinicie el runtime.",
2886
+ },
2717
2887
  detail: {
2718
2888
  homepage: "Página de inicio",
2719
2889
  installedV: "Instalado · v{{version}}",
@@ -2749,6 +2919,7 @@ const es = {
2749
2919
  dismiss: "Descartar",
2750
2920
  openOnCloud: "Abrir en la nube",
2751
2921
  backHome: "Volver al inicio",
2922
+ updateTo: "Actualizar",
2752
2923
  },
2753
2924
  install: {
2754
2925
  dialogTitle: "Instalar {{name}}",
@@ -2765,6 +2936,37 @@ const es = {
2765
2936
  localManifestConflict: "{{message}}\nNota: Una aplicación local ya tiene este manifest_id. Primero elimínela de objectstack.config.ts.",
2766
2937
  localUnauthorized: "Primero inicie sesión en este runtime.",
2767
2938
  localMarketplaceUnavailable: "Este runtime no tiene configurado OS_CLOUD_URL.",
2939
+ updateTo: "Actualizar → v{{version}}",
2940
+ installedVersion: "Instalado v{{version}}",
2941
+ },
2942
+ // objectui#3546 — the MarketplacePage "Your organization" strip.
2943
+ org: {
2944
+ heading: "Su organización",
2945
+ install: "Instalar",
2946
+ installed: "{{name}} instalado",
2947
+ installedBadge: "Instalado",
2948
+ installing: "Instalando…",
2949
+ },
2950
+ // ADR-0025 PD4 §3.5/§3.11 — the pre-install consent panel
2951
+ // (PluginDisclosure.tsx). `runtime` is a CLOSED enum: spec
2952
+ // PluginRuntimeSchema = z.enum(['node', 'sandbox', 'worker']).
2953
+ disclosure: {
2954
+ containsCode: "Este paquete contiene código",
2955
+ reviewed: "Revisado y aprobado",
2956
+ unreviewed: "Sin revisar todavía",
2957
+ signed: "Firmado",
2958
+ grantsIntro: "Al instalarlo, este paquete recibirá:",
2959
+ services: "Servicios de la plataforma",
2960
+ hooks: "Hooks de ciclo de vida",
2961
+ network: "Acceso a la red",
2962
+ fs: "Acceso al sistema de archivos",
2963
+ noPermissions: "No solicita permisos especiales.",
2964
+ acknowledge: "Entiendo que este paquete ejecuta código y recibe los permisos anteriores.",
2965
+ runtime: {
2966
+ node: "En el proceso · confianza total",
2967
+ sandbox: "En sandbox",
2968
+ worker: "Fuera del proceso",
2969
+ },
2768
2970
  },
2769
2971
  uninstall: {
2770
2972
  confirm: "¿Desinstalar {{manifestId}} v{{version}} de este runtime?\n\nEl manifiesto en caché será eliminado.",
@@ -2921,12 +3123,19 @@ const es = {
2921
3123
  submittedAgo: 'Enviada {{when}}',
2922
3124
  completedAt: 'Completada {{when}}',
2923
3125
  waitingOn: 'A la espera de',
3126
+ approverNameSeparator: ', ',
3127
+ approverUnstaffed: '{{seat}} (actualmente sin titular)',
2924
3128
  history: 'Actividad',
2925
3129
  noActions: 'Aún no hay acciones.',
2926
3130
  actSubmit: 'Enviada',
2927
3131
  actApprove: 'Aprobada',
2928
3132
  actReject: 'Rechazada',
2929
3133
  actRecall: 'Retirada',
3134
+ overrideActionLabel: '{{action}} (anulación)',
3135
+ overrideNotice: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso se finaliza de inmediato y se omite a cualquier aprobador que aún no haya actuado. La decisión se registra como anulación de administrador.',
3136
+ overrideNoticeWho: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso se finaliza de inmediato y se omite a los aprobadores que aún no han actuado — {{who}}. La decisión se registra como anulación de administrador.',
3137
+ viaOverrideChip: 'Anulación de administrador',
3138
+ viaOverrideHint: 'Quien actuó no ocupaba ningún puesto de aprobador en este paso: fue admitido por la vía de anulación de administrador.',
2930
3139
  rawData: 'Datos sin procesar (JSON)',
2931
3140
  copy: 'Copiar',
2932
3141
  copied: 'Copiado',
@@ -2984,16 +3193,16 @@ const es = {
2984
3193
  loadFailedTitle: 'No se pudo cargar la vista previa del borrador',
2985
3194
  loadFailedDescription: 'No se pudo leer la capa de borrador. Reintenta o comprueba tu conexión.',
2986
3195
  notReadyTitle: '«{{app}}» aún no está en el borrador',
2987
- notReadyDescription: 'La compilación puede seguir en curso, o falló antes de preparar esta aplicación. Revisa la conversación para ver el estado — este panel se actualiza cuando llegan borradores.',
3196
+ notReadyDescription: 'La compilación puede seguir en curso, o falló antes de preparar esta aplicación. Revise la conversación para ver el estado — este panel se actualiza cuando llegan borradores.',
2988
3197
  nothingTitle: 'Nada que previsualizar todavía',
2989
3198
  retry: 'Reintentar',
2990
3199
  },
2991
3200
  draftBar: {
2992
- messageClean: "Vista previa del borrador: no hay cambios sin publicar; todo lo que ve aquí ya está activo.",
3201
+ messageClean: "Vista previa del borrador — no hay cambios sin publicar; todo lo que ve aquí ya está activo.",
2993
3202
  sampleDataTitle: "Los datos de ejemplo aparecen tras publicar",
2994
3203
  sampleDataBody: "Está viendo la estructura de su aplicación. Publíquela para cargar registros de ejemplo y activarla.",
2995
3204
  publishCta: "Publicar para verlo activo",
2996
- message: 'Vista previa de borrador — estás viendo cambios sin publicar. Nada está en producción hasta que publiques.',
3205
+ message: 'Vista previa del borrador — está viendo cambios sin publicar. Nada de lo que ve aquí está activo hasta que publique.',
2997
3206
  publish: 'Publicar',
2998
3207
  publishing: 'Publicando…',
2999
3208
  exit: 'Salir de la vista previa',
@@ -3013,6 +3222,39 @@ const es = {
3013
3222
  detailChangedKeys: 'También cambió:',
3014
3223
  confirmNote: 'Publicar libera atómicamente los {{count}} borradores pendientes de este paquete.',
3015
3224
  publishConfirm: 'Publicar todo',
3225
+ // [objectui#5418] Pre-publish security-posture findings, shown next to
3226
+ // the confirm button so a refusal the door would issue is read BEFORE
3227
+ // the click rather than as a toast after the batch rolled back.
3228
+ securityBlockTitle: 'La publicación será rechazada: {{count}} elemento(s) necesitan una decisión primero',
3229
+ securityBlockWhere: 'Corríjalo en el objeto en Configuración → Uso compartido de registros y vuelva a publicar.',
3230
+ },
3231
+ // ADR-0045 — the materialized-but-unlisted app banner
3232
+ // (UnpublishedAppBar.tsx), sibling of draftBar above.
3233
+ unpublishedBar: {
3234
+ message: 'Aplicación sin publicar — totalmente funcional, pero solo la ven los creadores. Publíquela para que sus usuarios la vean.',
3235
+ publish: 'Publicar',
3236
+ publishing: 'Publicando…',
3237
+ published: '¡Publicado! La aplicación ya es visible para sus usuarios.',
3238
+ publishFailed: 'Error al publicar',
3239
+ },
3240
+ // ADR-0067 — the append-only build/revert timeline (CommitTimeline.tsx);
3241
+ // `button` is the banner's entry point into it.
3242
+ history: {
3243
+ button: 'Historial',
3244
+ title: 'Historial de compilaciones',
3245
+ description: 'Todos los cambios de esta aplicación, los más recientes primero. Deshaga cualquier paso para revertirlo — no hace falta confirmar la publicación.',
3246
+ loadFailed: 'No se pudo cargar el historial:',
3247
+ loadFailedUnavailable: 'Almacén de commits temporalmente inaccesible — esta lectura no se produjo, por lo que no se muestra ningún historial. Vuelva a intentarlo en un momento.',
3248
+ loading: 'Cargando historial…',
3249
+ empty: 'Aún no hay historial para esta aplicación.',
3250
+ revertLabel: 'Se deshizo un cambio',
3251
+ applyLabel: 'Cambio de compilación',
3252
+ revert: 'deshacer',
3253
+ items: 'elementos',
3254
+ revertAction: 'Deshacer',
3255
+ reverted: 'Deshecho — el cambio se ha revertido.',
3256
+ revertFailed: 'Error al deshacer',
3257
+ revertUnavailable: 'Almacén de commits temporalmente inaccesible — es posible que la reversión no se haya aplicado. Vuelva a abrir este historial para comprobarlo antes de reintentar.',
3016
3258
  },
3017
3259
  },
3018
3260
  filterBuilder: {
@@ -3031,10 +3273,15 @@ const es = {
3031
3273
  noResults: "Sin resultados",
3032
3274
  searchField: "Buscar {{label}}…",
3033
3275
  enterId: "Ingresar ID de {{label}}",
3276
+ addValue: "Escriba un valor y pulse Intro",
3277
+ removeValue: "Quitar {{value}}",
3278
+ rangeStart: "Desde",
3279
+ rangeEnd: "Hasta",
3034
3280
  operators: {
3035
3281
  equals: "Igual a",
3036
3282
  notEquals: "Distinto de",
3037
3283
  contains: "Contiene",
3284
+ containsCaseInsensitive: "Contiene (ignorar mayúsculas)",
3038
3285
  notContains: "No contiene",
3039
3286
  isEmpty: "Está vacío",
3040
3287
  isNotEmpty: "No está vacío",
@@ -3047,6 +3294,12 @@ const es = {
3047
3294
  between: "Entre",
3048
3295
  in: "En",
3049
3296
  notIn: "No en",
3297
+ startsWith: "Comienza por",
3298
+ endsWith: "Termina en",
3299
+ isNull: "Es null",
3300
+ isNotNull: "No es null",
3301
+ exists: "Está definido",
3302
+ notExists: "No está definido",
3050
3303
  },
3051
3304
  },
3052
3305
  sortBuilder: {
@@ -3092,5 +3345,64 @@ const es = {
3092
3345
  statusIdle: "inactivo",
3093
3346
  statusAway: "ausente",
3094
3347
  },
3348
+ wizard: {
3349
+ missingRequired: "Complete los campos obligatorios: {{fields}}",
3350
+ },
3351
+ flowRunner: {
3352
+ title: 'Entrada',
3353
+ submitting: 'Enviando…',
3354
+ saveAndContinue: 'Guardar y continuar',
3355
+ nextStep: 'Guardado — paso siguiente',
3356
+ completed: 'Flujo «{{flow}}» completado',
3357
+ },
3358
+ appManagement: {
3359
+ title: "Aplicaciones",
3360
+ subtitle: "Gestione todas las aplicaciones configuradas",
3361
+ newApp: "Nueva aplicación",
3362
+ searchLabel: "Buscar aplicaciones",
3363
+ searchPlaceholder: "Buscar aplicaciones…",
3364
+ selectedCount: "{{n}} seleccionadas",
3365
+ bulkEnable: "Habilitar",
3366
+ bulkDisable: "Deshabilitar",
3367
+ selectAll: "Seleccionar todo ({{n}})",
3368
+ empty: "No se encontraron aplicaciones.",
3369
+ defaultBadge: "Predeterminada",
3370
+ active: "Activa",
3371
+ inactive: "Inactiva",
3372
+ selectApp: "Seleccionar {{name}}",
3373
+ openApp: "Abrir aplicación",
3374
+ openAppNamed: "Abrir {{name}}",
3375
+ editApp: "Editar aplicación",
3376
+ editAppNamed: "Editar {{name}}",
3377
+ editWithAi: "Editar con IA",
3378
+ editWithAiNamed: "Editar {{name}} con IA",
3379
+ enableApp: "Habilitar aplicación",
3380
+ disableApp: "Deshabilitar aplicación",
3381
+ enableAppNamed: "Habilitar {{name}}",
3382
+ disableAppNamed: "Deshabilitar {{name}}",
3383
+ setDefault: "Establecer como predeterminada",
3384
+ setDefaultNamed: "Establecer {{name}} como predeterminada",
3385
+ deleteApp: "Eliminar aplicación",
3386
+ deleteAppNamed: "Eliminar {{name}}",
3387
+ confirmDelete: "Haga clic de nuevo para confirmar la eliminación",
3388
+ confirmDeleteNamed: "Confirmar la eliminación de {{name}}",
3389
+ toast: {
3390
+ noClient: "No se puede acceder al servicio de metadatos",
3391
+ unknownError: "error desconocido",
3392
+ appEnabled: "{{name}} habilitada",
3393
+ appDisabled: "{{name}} deshabilitada",
3394
+ toggleFailed: "Error al cambiar el estado de la aplicación: {{reason}}",
3395
+ setDefaultDone: "{{name}} establecida como predeterminada",
3396
+ setDefaultFailed: "Error al establecer la aplicación predeterminada: {{reason}}",
3397
+ appDeleted: "{{name}} eliminada",
3398
+ deleteFailed: "Error al eliminar la aplicación: {{reason}}",
3399
+ bulkEnabled: "{{n}} aplicaciones habilitadas",
3400
+ bulkDisabled: "{{n}} aplicaciones deshabilitadas",
3401
+ bulkFailed: "Error en {{n}}: {{details}}",
3402
+ bulkFailureEntry: "{{name}} ({{reason}})",
3403
+ bulkFailureJoiner: "; ",
3404
+ bulkOperationFailed: "Error en la operación masiva: {{reason}}",
3405
+ },
3406
+ },
3095
3407
  };
3096
3408
  export default es;