@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 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,12 @@ 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",
51
84
  cancel: "Cancelar",
52
85
  delete: "Eliminar",
53
86
  edit: "Editar",
54
87
  create: "Crear",
55
- search: "Buscar",
56
88
  filter: "Filtrar",
57
89
  reset: "Restablecer",
58
90
  confirm: "Confirmar",
@@ -76,7 +108,7 @@ const es = {
76
108
  required: "Obligatorio",
77
109
  optional: "Opcional",
78
110
  selectOption: "Seleccionar una opción",
79
- select: "Seleccionar...",
111
+ select: "Seleccionar…",
80
112
  openChat: "Abrir chat",
81
113
  closeChat: "Cerrar chat",
82
114
  closePanel: "Cerrar panel",
@@ -85,6 +117,11 @@ const es = {
85
117
  itemCountOne: "{{count}} elemento",
86
118
  toggleSidebar: "Alternar barra lateral",
87
119
  package: "Paquete",
120
+ done: "Listo",
121
+ editInStudio: "Editar en Studio",
122
+ record: "Registro",
123
+ retry: "Reintentar",
124
+ printDialogHint: "Abre el cuadro de diálogo de impresión de tu navegador (no es una exportación a PDF)",
88
125
  },
89
126
  actions: {
90
127
  decisionOutput: {
@@ -121,6 +158,9 @@ const es = {
121
158
  submitFailed: "No se pudo guardar. Inténtalo de nuevo.",
122
159
  discardTitle: "¿Descartar los cambios?",
123
160
  discardMessage: "Tiene cambios sin guardar. Si cierra este formulario ahora, sus ediciones se perderán.",
161
+ // objectui#4024 — the create/edit dialog's `sr-only` accessible
162
+ // description, used when the form declares no `description` of its own.
163
+ dialogDescriptionFallback: "Complete los campos del formulario y luego envíe o cancele.",
124
164
  keepEditing: "Seguir editando",
125
165
  discard: "Descartar",
126
166
  conflictTitle: "Conflicto al guardar",
@@ -189,7 +229,7 @@ const es = {
189
229
  richText: {
190
230
  format: "Formato: {{format}}",
191
231
  basicEditorHint: "Editor de texto enriquecido (básico)",
192
- placeholder: "Escribe algo...",
232
+ placeholder: "Escribe algo…",
193
233
  },
194
234
  options: {
195
235
  empty: "No hay opciones disponibles",
@@ -255,7 +295,7 @@ const es = {
255
295
  saveAll: "Guardar todo ({{count}})",
256
296
  addRecord: "Agregar registro",
257
297
  open: "Abrir",
258
- search: "Buscar...",
298
+ search: "Buscar…",
259
299
  modified: "{{count}} filas modificadas",
260
300
  saveFailed: 'Error al guardar',
261
301
  selected: "{{count}} seleccionados",
@@ -299,7 +339,7 @@ const es = {
299
339
  delete: "Eliminar",
300
340
  export: "Exportar",
301
341
  exportAs: "Exportar como {{format}}",
302
- loading: "Cargando cuadrícula...",
342
+ loading: "Cargando cuadrícula…",
303
343
  errorLoading: "Error al cargar la cuadrícula",
304
344
  pullToRefresh: "Desliza para actualizar",
305
345
  refreshing: "Actualizando…",
@@ -310,6 +350,22 @@ const es = {
310
350
  yes: "Sí",
311
351
  no: "No",
312
352
  systemFields: "Sistema",
353
+ // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
354
+ // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
355
+ // pack controls its own separator and word order.
356
+ summary: {
357
+ pattern: "{{label}}: {{value}}",
358
+ count: "Recuento",
359
+ countEmpty: "Vacíos",
360
+ countFilled: "Rellenos",
361
+ countUnique: "Únicos",
362
+ percentEmpty: "Vacíos",
363
+ percentFilled: "Rellenos",
364
+ sum: "Suma",
365
+ avg: "Promedio",
366
+ min: "Mín.",
367
+ max: "Máx.",
368
+ },
313
369
  toolbar: {
314
370
  densityMode: "Densidad",
315
371
  densityCompact: "Compacto",
@@ -423,12 +479,12 @@ const es = {
423
479
  templateName: "Nombre de la plantilla",
424
480
  save: "Guardar",
425
481
  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.',
482
+ savedMapping: 'Asignación guardada:',
483
+ chooseSavedMapping: 'Elegir una asignación guardada…',
484
+ manualMapping: '— Asignar columnas manualmente —',
485
+ transform: 'Transformación',
486
+ 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.',
487
+ 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
488
  csvColumn: "Columna",
433
489
  mapsTo: "Se asigna a",
434
490
  typeMismatch: "Parece {{type}}",
@@ -488,6 +544,8 @@ const es = {
488
544
  loadErrorUnauthorizedMessage: "Su sesión ha expirado o ha cerrado sesión. Inicie sesión de nuevo para ver estos registros.",
489
545
  loadErrorRejectedTitle: "La consulta de esta vista fue rechazada",
490
546
  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.",
547
+ loadErrorApiDisabledTitle: "Este objeto no está disponible a través de la API",
548
+ 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
549
  retry: "Reintentar",
492
550
  managedBy: {
493
551
  system: {
@@ -512,7 +570,7 @@ const es = {
512
570
  },
513
571
  },
514
572
  refresh: "Actualizar",
515
- loading: 'Loading records...',
573
+ loading: "Cargando registros…",
516
574
  recordCount: "{{count}} registros",
517
575
  recordCountOne: "{{count}} registro",
518
576
  addRecord: "Agregar registro",
@@ -524,7 +582,8 @@ const es = {
524
582
  sort: "Ordenar",
525
583
  sortRecords: "Ordenar registros",
526
584
  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.",
585
+ 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.",
586
+ resetSortToDefault: "Restablecer al valor predeterminado de la vista",
528
587
  group: "Agrupar",
529
588
  groupBy: "Agrupar por",
530
589
  export: "Exportar",
@@ -582,13 +641,16 @@ const es = {
582
641
  },
583
642
  kanban: {
584
643
  uncategorized: "Sin categoría",
644
+ columns: "columnas",
585
645
  addCard: "Añadir tarjeta",
586
646
  addColumn: "Añadir columna",
587
647
  moveCard: "Mover tarjeta",
588
648
  deleteCard: "Eliminar tarjeta",
589
649
  deleteColumn: "Eliminar columna",
590
650
  noCards: "Sin tarjetas",
591
- cardTitlePlaceholder: "Escriba el título de la tarjeta...",
651
+ cardTitlePlaceholder: "Escriba el título de la tarjeta…",
652
+ requiredFieldsTitle: "Complete los campos obligatorios",
653
+ requiredFieldsDescription: "Este movimiento hace que los campos siguientes sean obligatorios. Complételos para continuar.",
592
654
  },
593
655
  timeline: {
594
656
  bucket: {
@@ -601,6 +663,13 @@ const es = {
601
663
  noDate: "Sin fecha",
602
664
  unassigned: "Sin asignar",
603
665
  },
666
+ scale: {
667
+ week: "Semana {{n}}",
668
+ quarter: "T{{quarter}} {{year}}",
669
+ },
670
+ gantt: {
671
+ rowLabel: "Elementos",
672
+ },
604
673
  },
605
674
  gantt: {
606
675
  viewMode: {
@@ -647,6 +716,18 @@ const es = {
647
716
  ff: "Fin → Fin",
648
717
  sf: "Inicio → Fin",
649
718
  },
719
+ linkEnd: {
720
+ start: "Inicio",
721
+ end: "Fin",
722
+ },
723
+ link: {
724
+ rejected: {
725
+ self: "Una tarea no puede depender de sí misma.",
726
+ locked: "Esta fila está bloqueada y no puede recibir una nueva dependencia.",
727
+ group: "Una fila de resumen no puede recibir dependencias: vincule una de sus tareas.",
728
+ cycle: "Ese vínculo crearía una dependencia circular.",
729
+ },
730
+ },
650
731
  conflict: {
651
732
  title: "Conflicto de programación",
652
733
  body: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea(s) afectada(s)?",
@@ -655,8 +736,8 @@ const es = {
655
736
  },
656
737
  autoScheduleDlg: {
657
738
  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.",
739
+ body: "¿Retrasar {{count}} tarea(s) para respetar los vínculos de dependencia?",
740
+ skipped: "{{count}} tarea(s) bloqueada(s) también incumplen los vínculos y se han omitido.",
660
741
  confirm: "Aplicar",
661
742
  cancel: "Cancelar",
662
743
  none: "Todas las dependencias se cumplen: no hay nada que reprogramar.",
@@ -693,6 +774,7 @@ const es = {
693
774
  exportPng: "Exportar como PNG",
694
775
  exportPdf: "Exportar PDF",
695
776
  saveLayout: "Guardar la disposición",
777
+ refresh: "Actualizar",
696
778
  undo: "Deshacer",
697
779
  redo: "Rehacer",
698
780
  prevPeriod: "Período anterior",
@@ -733,11 +815,11 @@ const es = {
733
815
  defaultBadge: "predeterminada",
734
816
  tabActionsFor: "Acciones de vista para {{name}}",
735
817
  readonlyAriaLabel: "Vista de solo lectura",
736
- readonlyTooltip: "Vista del sistema — duplique para personalizar.",
818
+ readonlyTooltip: "Vista del sistema — definida en el código, solo lectura.",
737
819
  },
738
820
  designer: {
739
- undo: 'Undo',
740
- redo: 'Redo',
821
+ undo: "Deshacer",
822
+ redo: "Rehacer",
741
823
  },
742
824
  detail: {
743
825
  editInlineHint: "Haga doble clic para editar",
@@ -777,13 +859,15 @@ const es = {
777
859
  relatedRecords: "{{count}} registros",
778
860
  relatedRecordOne: "{{count}} registro",
779
861
  noRelatedRecords: "No se encontraron registros relacionados",
780
- loading: "Cargando...",
862
+ loading: "Cargando…",
781
863
  copyToClipboard: "Copiar al portapapeles",
782
864
  copied: "¡Copiado!",
783
865
  deleteConfirmation: "¿Está seguro de que desea eliminar este registro?",
866
+ deleted: "Registro eliminado",
784
867
  editRecord: "Editar registro",
785
868
  viewAll: "Ver todo",
786
869
  new: "Nuevo",
870
+ add: "Agregar",
787
871
  emptyValue: "—",
788
872
  comments: "Comentarios",
789
873
  searchComments: "Buscar comentarios…",
@@ -848,6 +932,7 @@ const es = {
848
932
  loadMore: "Cargar más",
849
933
  edited: "(editado)",
850
934
  via: "vía {{source}}",
935
+ viewSource: "Ver origen",
851
936
  replyCount: "{{count}} respuesta",
852
937
  replyCountPlural: "{{count}} respuestas",
853
938
  replyPlaceholder: "Responder…",
@@ -889,9 +974,11 @@ const es = {
889
974
  concurrentUpdateReload: "Cargar versión actual",
890
975
  concurrentUpdateOverwrite: "Sobrescribir de todos modos",
891
976
  concurrentUpdateCancel: "Cancelar",
977
+ concurrentUpdateRecordLabel: "este registro",
892
978
  openInNewTab: "Abrir en nueva pestaña",
893
979
  activity: "Actividad",
894
980
  history: "Historial",
981
+ historyEmpty: "Aún no hay historial",
895
982
  editRow: "Editar",
896
983
  deleteRow: "Eliminar",
897
984
  deleteRowConfirmation: "¿Eliminar este registro?",
@@ -901,12 +988,15 @@ const es = {
901
988
  nextPage: "Siguiente",
902
989
  pageOf: "Página {{current}} de {{total}}",
903
990
  sortBy: "Ordenar por",
904
- filterPlaceholder: "Filtrar...",
991
+ filterPlaceholder: "Filtrar…",
905
992
  highlightFields: "Campos clave",
906
993
  createdBy: "Creado por",
907
994
  updatedBy: "Actualizado por",
908
995
  created: "Creado",
909
996
  updated: "Actualizado",
997
+ // objectui#3863 — base key. es's third category `many` starts at a million, where
998
+ // the plural form is correct, so the base repeats `_other`.
999
+ showEmptyRelated: "+ {{count}} vacíos",
910
1000
  showEmptyRelated_one: "+ {{count}} vacío",
911
1001
  showEmptyRelated_other: "+ {{count}} vacíos",
912
1002
  copyEmail: "Copiar correo",
@@ -918,7 +1008,8 @@ const es = {
918
1008
  },
919
1009
  chart: {
920
1010
  noData: "No hay datos de gráfico disponibles",
921
- loading: "Cargando gráfico...",
1011
+ loading: "Cargando gráfico…",
1012
+ nullCategory: "(Sin especificar)",
922
1013
  },
923
1014
  map: {
924
1015
  searchLocations: "Buscar ubicaciones…",
@@ -940,8 +1031,8 @@ const es = {
940
1031
  properties: "Propiedades",
941
1032
  connections: "Conexiones",
942
1033
  quickConnect: "Conexión rápida",
943
- fromPlaceholder: "Desde...",
944
- toPlaceholder: "Hasta...",
1034
+ fromPlaceholder: "Desde…",
1035
+ toPlaceholder: "Hasta…",
945
1036
  connect: "Conectar",
946
1037
  label: "Etiqueta",
947
1038
  type: "Tipo",
@@ -989,6 +1080,7 @@ const es = {
989
1080
  },
990
1081
  dashboard: {
991
1082
  noRows: "Sin filas",
1083
+ loading: "Cargando…",
992
1084
  pickMeasures: "Elija medidas (valores) para este widget de dataset.",
993
1085
  datasetUnsupported: "Esta fuente de datos no admite consultas de dataset.",
994
1086
  details: "Detalles",
@@ -1246,6 +1338,7 @@ const es = {
1246
1338
  },
1247
1339
  },
1248
1340
  console: {
1341
+ saveAdvisoryTitle: "Guardado: la comprobación de creación generó {{count}} recomendación(es)",
1249
1342
  settingsHub: {
1250
1343
  title: "Configuración",
1251
1344
  subtitle: "Configure su espacio de trabajo, las integraciones y los indicadores de funciones.",
@@ -1312,7 +1405,7 @@ const es = {
1312
1405
  shareTitle: "Compartir esta conversación",
1313
1406
  shareDisabledTitle: "Empiece a chatear para habilitar el uso compartido",
1314
1407
  newChat: "Nuevo",
1315
- searchChats: "Buscar chats...",
1408
+ searchChats: "Buscar chats…",
1316
1409
  noChatsYet: "Todavía no hay chats",
1317
1410
  noChatsDescription: "Inicie una conversación nueva para verla aquí.",
1318
1411
  noMatchingChats: "No hay chats coincidentes.",
@@ -1321,18 +1414,18 @@ const es = {
1321
1414
  deleteConversation: "Eliminar conversación",
1322
1415
  saveRename: "Guardar el nombre",
1323
1416
  cancelRename: "Cancelar el cambio de nombre",
1324
- loadingHistory: "Cargando el historial de la conversación...",
1417
+ loadingHistory: "Cargando el historial de la conversación…",
1325
1418
  conversationReady: "Conversación lista",
1326
1419
  preparingConversation: "Preparando una nueva conversación",
1327
1420
  offlineDemoMode: "Modo de demostración sin conexión — lista de agentes no disponible",
1328
1421
  sendFailedRateLimited: "Está enviando mensajes demasiado rápido. Su mensaje se conserva abajo — espere un momento y vuelva a intentarlo.",
1329
1422
  sendFailedGeneric: "No se pudo enviar su mensaje. Se conserva abajo — inténtelo de nuevo.",
1330
- askAgent: "Pregunte a {{agent}}...",
1423
+ askAgent: "Pregunte a {{agent}}…",
1331
1424
  assistant: "Asistente",
1332
1425
  liveCanvas: "Vista previa en vivo — {{app}} (borrador)",
1333
1426
  liveCanvasUnlisted: "Aplicación en vivo — {{app}} (no listada hasta su publicación)",
1334
- loadingAgents: "Cargando agentes...",
1335
- askAnything: "Pregunte lo que quiera...",
1427
+ loadingAgents: "Cargando agentes…",
1428
+ askAnything: "Pregunte lo que quiera…",
1336
1429
  emptyTitle: "Iniciar una conversación",
1337
1430
  emptyDescription: "Pregunte lo que quiera — el asistente tiene acceso al contexto de su aplicación actual.",
1338
1431
  switchAssistant: "Cambiar de asistente",
@@ -1435,9 +1528,60 @@ const es = {
1435
1528
  createSeed: "Generar datos de ejemplo",
1436
1529
  createPackage: "Crear paquete de aplicación",
1437
1530
  },
1531
+ // objectui#3546 slice four — the AI console surfaces: the /ai chat page's app switcher,
1532
+ // connection banner and plan/publish cards, the ChatDock chrome, and the
1533
+ // conversation-list date buckets. `group.*` is the template-key family
1534
+ // `console.ai.group.${key}` (ConversationsSidebar), enumerated from the
1535
+ // ConversationGroupKey union — all five members, no wildcard.
1536
+ collapseToDock: "Contraer al panel lateral",
1537
+ switchApp: "Cambiar de aplicación",
1538
+ switchAppLabel: "Conversaciones de creación por aplicación",
1539
+ newApp: "Nueva aplicación",
1540
+ connectionWaiting: "Esperando al servidor…",
1541
+ connectionStalled: "Sigue en proceso…",
1542
+ connectionOffline: "Conexión perdida — reconectando…",
1543
+ designingPlan: "Diseñando su aplicación…",
1544
+ designingPlanHint: {
1545
+ data: "Trazando los datos que va a registrar…",
1546
+ objects: "Dando forma a los objetos y sus campos…",
1547
+ relations: "Conectando los registros relacionados…",
1548
+ lookups: "Configurando las relaciones y los campos de búsqueda…",
1549
+ views: "Planificando las pantallas y las vistas…",
1550
+ forms: "Organizando los formularios y las listas…",
1551
+ defaults: "Agregando valores predeterminados y validaciones razonables…",
1552
+ dashboard: "Bosquejando un panel para el seguimiento…",
1553
+ review: "Comprobando que la estructura encaje…",
1554
+ finalize: "Reuniendo el plan…",
1555
+ },
1556
+ planBuilding: "Creando…",
1557
+ planBuilt: "Creado",
1558
+ planDeferred: "Aún no creado",
1559
+ planReady: "El plan está listo. Créelo ahora o dígame qué ajustar.",
1560
+ published: "Publicado",
1561
+ publishFailed: "Error al publicar",
1562
+ unavailableTitle: "Asistente de IA no disponible",
1563
+ unavailableDescription: "Esta implementación no tiene habilitado un asistente de IA. Todo lo demás funciona con normalidad.",
1564
+ unavailableError: "No se pudo contactar con el servicio de IA. Puede estar temporalmente sin conexión — reinténtelo o vuelva al inicio.",
1565
+ unavailableRetry: "Reintentar",
1566
+ unavailableHome: "Volver al inicio",
1567
+ dock: {
1568
+ title: "Asistente",
1569
+ description: "Chat con el asistente de IA",
1570
+ resize: "Redimensionar el chat",
1571
+ collapse: "Contraer el chat",
1572
+ maximize: "Abrir como página completa",
1573
+ open: "Abrir el asistente",
1574
+ },
1575
+ group: {
1576
+ today: "Hoy",
1577
+ yesterday: "Ayer",
1578
+ previous7Days: "7 días anteriores",
1579
+ previous30Days: "30 días anteriores",
1580
+ older: "Anteriores",
1581
+ },
1438
1582
  },
1439
1583
  title: "Consola ObjectStack",
1440
- initializing: "Inicializando aplicación...",
1584
+ initializing: "Inicializando aplicación…",
1441
1585
  loadingHint: "Configurar un entorno nuevo puede tardar unos momentos.",
1442
1586
  breadcrumb: {
1443
1587
  dashboards: "Paneles",
@@ -1445,6 +1589,31 @@ const es = {
1445
1589
  reports: "Informes",
1446
1590
  system: "Sistema",
1447
1591
  },
1592
+ // objectui#4024 — the single-namespace settings screen. Its sibling
1593
+ // `settingsHub` above already resolved through this pack; the view was the
1594
+ // one file still carrying English literals.
1595
+ settingsView: {
1596
+ backToHub: "Toda la configuración",
1597
+ back: "Atrás",
1598
+ noNamespace: "No hay ningún espacio de nombres seleccionado.",
1599
+ loadError: "No se pudo cargar la configuración",
1600
+ saved: "Configuración guardada",
1601
+ saveFailed: "Error al guardar",
1602
+ lockedByEnv: "Bloqueado por el entorno: {{key}}",
1603
+ lockedByEnvNoKey: "Bloqueado por el entorno",
1604
+ actionSucceeded: "La acción se completó correctamente",
1605
+ actionFailed: "La acción falló",
1606
+ discard: "Descartar",
1607
+ saveChanges: "Guardar cambios",
1608
+ unsavedCount: "{{count}} cambios sin guardar",
1609
+ unsavedCount_one: "{{count}} cambio sin guardar",
1610
+ unsavedCount_other: "{{count}} cambios sin guardar",
1611
+ cryptoRefusalTitle: "Esta instalación no puede cifrar secretos",
1612
+ cryptoRefusalSubjectSuffix: "está declarado como cifrado, por lo que no se escribió nada.",
1613
+ cryptoRefusalNoSubject: "El valor declarado como cifrado fue rechazado, por lo que no se escribió nada.",
1614
+ cryptoRefusalToast: "No se pueden cifrar los secretos: {{subject}}",
1615
+ cryptoRefusalToastNoSubject: "No se pueden cifrar los secretos",
1616
+ },
1448
1617
  loadingSteps: {
1449
1618
  connecting: "Conectando a la fuente de datos",
1450
1619
  loadingConfig: "Cargando configuración",
@@ -1474,6 +1643,7 @@ const es = {
1474
1643
  general: "General",
1475
1644
  navigation: "Navegación",
1476
1645
  dataViews: "Vistas de datos",
1646
+ aiChat: "Asistente de IA",
1477
1647
  preferences: "Preferencias",
1478
1648
  },
1479
1649
  openCommandPalette: "Abrir paleta de comandos",
@@ -1484,11 +1654,13 @@ const es = {
1484
1654
  createRecord: "Crear nuevo registro",
1485
1655
  refreshData: "Actualizar datos",
1486
1656
  editRecord: "Editar registro seleccionado",
1657
+ newChat: "Nuevo chat",
1658
+ toggleChatsList: "Alternar lista de chats",
1487
1659
  toggleDarkMode: "Alternar modo oscuro",
1488
1660
  },
1489
1661
  commandPalette: {
1490
1662
  title: "Paleta de comandos",
1491
- placeholder: "Escriba un comando o busque...",
1663
+ placeholder: "Escriba un comando o busque…",
1492
1664
  noResults: "No se encontraron resultados.",
1493
1665
  objects: "Objetos",
1494
1666
  dashboards: "Paneles",
@@ -1514,6 +1686,12 @@ const es = {
1514
1686
  goHome: "Ir al inicio",
1515
1687
  errorDetails: "Detalles del error (solo desarrollo)",
1516
1688
  },
1689
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1690
+ notFound: {
1691
+ title: "Página no encontrada",
1692
+ description: "La URL que siguió no coincide con ninguna vista de esta aplicación.",
1693
+ back: "Volver",
1694
+ },
1517
1695
  theme: {
1518
1696
  toggle: "Cambiar tema",
1519
1697
  light: "Claro",
@@ -1529,8 +1707,10 @@ const es = {
1529
1707
  viewNameHelp: "Clave técnica (snake_case). Se rellena automáticamente a partir del título — edítela si lo desea.",
1530
1708
  viewNameRequired: "Introduzca una clave (minúsculas, números, guion bajo). No se rellena automáticamente con títulos no latinos.",
1531
1709
  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',
1710
+ systemViewReadonly: "Vista del sistema definida en el código: solo lectura.",
1711
+ cannotEditMetaView: "Esta vista está integrada y definida en el código: no se puede modificar.",
1712
+ cannotDeleteMetaView: "Esta vista está integrada y definida en el código: no se puede eliminar.",
1713
+ expandToPage: "Abrir como página completa",
1534
1714
  objectNotFound: "Objeto no encontrado",
1535
1715
  objectNotFoundDescription: "El objeto \"{{objectName}}\" no existe en la configuración actual.",
1536
1716
  objectNotFoundHint: "Verifique la configuración de navegación de su aplicación o seleccione un objeto diferente en la barra lateral.",
@@ -1562,7 +1742,7 @@ const es = {
1562
1742
  exportPrintHint: "Formatos de exportación, impresión y visualización del recuento de registros",
1563
1743
  showAllFields: "Mostrar todo",
1564
1744
  hideAllFields: "Ocultar todo",
1565
- searchFields: "Buscar campos...",
1745
+ searchFields: "Buscar campos…",
1566
1746
  title: "Título",
1567
1747
  description: "Descripción",
1568
1748
  data: "Datos",
@@ -1601,7 +1781,7 @@ const es = {
1601
1781
  longitudeField: "Campo de longitud",
1602
1782
  imageField: "Campo de imagen",
1603
1783
  dateField: "Campo de fecha",
1604
- selectField: "Seleccionar campo...",
1784
+ selectField: "Seleccionar campo…",
1605
1785
  gridOptionsHint: "La vista de cuadrícula usa las columnas configuradas arriba.",
1606
1786
  groupBy: "Agrupar por",
1607
1787
  prefixField: "Campo de prefijo",
@@ -1664,7 +1844,7 @@ const es = {
1664
1844
  latitudeFieldHelp: "Campo que contiene la latitud (solo campos geográficos).",
1665
1845
  longitudeFieldHelp: "Campo que contiene la longitud (solo campos geográficos).",
1666
1846
  imageFieldHelp: "La portada de la galería proviene de este campo de imagen o adjunto.",
1667
- selectOption: "Seleccionar...",
1847
+ selectOption: "Seleccionar…",
1668
1848
  noEligibleFieldForType: "Ningún campo elegible de ese tipo. Agregue uno al objeto primero.",
1669
1849
  viewTypeUnavailable: "Este objeto no tiene un campo que sirva como \"{{field}}\".",
1670
1850
  viewTypeUnavailableShort: "No compatible con este objeto.",
@@ -1714,7 +1894,7 @@ const es = {
1714
1894
  ufDropdown: "Desplegable",
1715
1895
  ufTabs: "Pestañas",
1716
1896
  ufToggle: "Alternar",
1717
- ufAddField: "+ Agregar campo de filtro...",
1897
+ ufAddField: "+ Agregar campo de filtro…",
1718
1898
  ufNoFields: "Sin campos disponibles",
1719
1899
  ufAddTab: "+ Agregar pestaña",
1720
1900
  ufTabLabel: "Etiqueta",
@@ -1774,7 +1954,7 @@ const es = {
1774
1954
  passwordPlaceholder: "Ingresa tu contraseña",
1775
1955
  forgotPasswordText: "¿Olvidaste tu contraseña?",
1776
1956
  submitButton: "Iniciar sesión",
1777
- submittingButton: "Iniciando sesión...",
1957
+ submittingButton: "Iniciando sesión…",
1778
1958
  noAccountText: "¿No tienes una cuenta?",
1779
1959
  signUpText: "Regístrate",
1780
1960
  errors: {
@@ -1782,6 +1962,18 @@ const es = {
1782
1962
  invalidCredentials: "Correo o contraseña inválidos. Inténtelo de nuevo.",
1783
1963
  emailNotVerified: "Verifique su correo electrónico antes de iniciar sesión.",
1784
1964
  },
1965
+ // objectui#3546 slice three — phone/OTP sign-in. `{seconds}` is LoginForm's own
1966
+ // literal `.replace()` hole, not i18next interpolation: keep the single braces.
1967
+ emailOrPhoneLabel: "Correo electrónico o número de teléfono",
1968
+ emailOrPhonePlaceholder: "name@example.com o +1 555 000 0000",
1969
+ phoneLabel: "Número de teléfono",
1970
+ phonePlaceholder: "+1 555 000 0000",
1971
+ otpCodeLabel: "Código de verificación",
1972
+ otpCodePlaceholder: "Código de 6 dígitos",
1973
+ sendOtpButton: "Obtener código",
1974
+ resendOtpCountdownText: "Reenviar en {seconds} s",
1975
+ usePhoneOtpText: "Iniciar sesión con código de verificación",
1976
+ usePasswordSignInText: "Iniciar sesión con contraseña en su lugar",
1785
1977
  },
1786
1978
  register: {
1787
1979
  title: "Crear una cuenta",
@@ -1797,7 +1989,7 @@ const es = {
1797
1989
  passwordMismatchError: "Las contraseñas no coinciden",
1798
1990
  passwordTooShortError: "La contraseña debe tener al menos 8 caracteres",
1799
1991
  submitButton: "Crear cuenta",
1800
- submittingButton: "Creando cuenta...",
1992
+ submittingButton: "Creando cuenta…",
1801
1993
  hasAccountText: "¿Ya tienes una cuenta?",
1802
1994
  signInText: "Iniciar sesión",
1803
1995
  errors: {
@@ -1818,12 +2010,26 @@ const es = {
1818
2010
  emailLabel: "Correo electrónico",
1819
2011
  emailPlaceholder: "name@example.com",
1820
2012
  submitButton: "Enviar enlace de restablecimiento",
1821
- submittingButton: "Enviando...",
2013
+ submittingButton: "Enviando…",
1822
2014
  successTitle: "Revisa tu correo electrónico",
1823
2015
  successDescription: "Hemos enviado un enlace para restablecer la contraseña a {{email}}. Por favor revisa tu bandeja de entrada.",
1824
2016
  backToSignInText: "Volver a iniciar sesión",
1825
2017
  rememberPasswordText: "¿Recuerdas tu contraseña?",
1826
2018
  signInText: "Iniciar sesión",
2019
+ // objectui#3546 slice three — the SMS reset branch of the same form.
2020
+ phoneLabel: "Número de teléfono",
2021
+ phonePlaceholder: "+1 555 000 0000",
2022
+ otpCodeLabel: "Código de verificación",
2023
+ otpCodePlaceholder: "Código de 6 dígitos",
2024
+ sendOtpButton: "Obtener código",
2025
+ resendOtpCountdownText: "Reenviar en {seconds} s",
2026
+ newPasswordLabel: "Nueva contraseña",
2027
+ newPasswordPlaceholder: "Ingresa una nueva contraseña",
2028
+ resetButton: "Restablecer contraseña",
2029
+ usePhoneResetText: "Restablecer con código SMS",
2030
+ useEmailResetText: "Restablecer por correo electrónico en su lugar",
2031
+ phoneSuccessTitle: "Contraseña restablecida",
2032
+ phoneSuccessDescription: "Tu contraseña ha sido restablecida. Ahora puedes iniciar sesión con tu nueva contraseña.",
1827
2033
  },
1828
2034
  resetPassword: {
1829
2035
  title: "Establecer nueva contraseña",
@@ -1862,6 +2068,8 @@ const es = {
1862
2068
  backToLogin: "Volver al inicio de sesión",
1863
2069
  checkSpam: "¿No recibió el correo? Revise su carpeta de spam o contacte soporte.",
1864
2070
  or: "O",
2071
+ // objectui#3546 slice three.
2072
+ resendUnavailable: "Puede que el envío de correos no esté configurado en este entorno. Contacte soporte si el problema persiste.",
1865
2073
  },
1866
2074
  setup: {
1867
2075
  welcomeTitle: "Bienvenido a ObjectStack",
@@ -1900,6 +2108,9 @@ const es = {
1900
2108
  invalidDescription: "No se proporcionó código de dispositivo en la URL.",
1901
2109
  loading: "Cargando…",
1902
2110
  cancel: "Cancelar",
2111
+ // objectui#3546 slice three — device-authorization plugin switched off.
2112
+ disabledTitle: "La autorización de dispositivos no está habilitada",
2113
+ disabledDescription: "Esta implementación no tiene habilitada la autorización de dispositivos, por lo que este dispositivo no puede aprobarse aquí.",
1903
2114
  },
1904
2115
  shell: {
1905
2116
  tenantHostHint: "Está iniciando sesión en este espacio de trabajo",
@@ -1939,6 +2150,29 @@ const es = {
1939
2150
  },
1940
2151
  },
1941
2152
  },
2153
+ // objectui#3546 slice three — the /oauth/consent screen.
2154
+ oauth: {
2155
+ consent: {
2156
+ title: "{{appName}} quiere acceder a su cuenta",
2157
+ request: "{{appName}} solicita permiso{{suffix}}.",
2158
+ unknownApp: "una aplicación",
2159
+ willAllow: "Esta aplicación podrá:",
2160
+ scope: {
2161
+ openid: "Confirmar su identidad",
2162
+ profile: "Leer su perfil básico (nombre, foto)",
2163
+ email: "Leer su dirección de correo electrónico",
2164
+ offlineAccess: "Mantener la sesión abierta (renovar el acceso)",
2165
+ },
2166
+ deny: "Denegar",
2167
+ authorize: "Autorizar",
2168
+ submitting: "Autorizando…",
2169
+ granted: "Acceso concedido",
2170
+ denied: "Acceso denegado",
2171
+ noRedirect: "El servidor no devolvió ninguna URL de redirección.",
2172
+ failed: "Error en el consentimiento",
2173
+ footer: "Puede revocar el acceso en cualquier momento desde la configuración de su cuenta.",
2174
+ },
2175
+ },
1942
2176
  profile: {
1943
2177
  title: "Perfil",
1944
2178
  subtitle: "Gestione la configuración de su cuenta",
@@ -2000,6 +2234,8 @@ const es = {
2000
2234
  invite: "Invitar miembro",
2001
2235
  members: "Miembros",
2002
2236
  settings: "Configuración del espacio de trabajo",
2237
+ multiOrgDisabled: "La creación de nuevas organizaciones está deshabilitada en esta instancia.",
2238
+ createFailed: 'No se pudo crear el espacio de trabajo',
2003
2239
  },
2004
2240
  help: {
2005
2241
  onThisPage: "En esta página",
@@ -2010,7 +2246,7 @@ const es = {
2010
2246
  },
2011
2247
  sidebar: {
2012
2248
  packageManagement: "Gestión de paquetes",
2013
- searchNavigation: "Buscar en la navegación...",
2249
+ searchNavigation: "Buscar en la navegación…",
2014
2250
  settings: "Configuración",
2015
2251
  help: "Ayuda",
2016
2252
  helpTooltip: "Ayuda y documentación",
@@ -2034,8 +2270,8 @@ const es = {
2034
2270
  switchObject: "Cambiar de objeto",
2035
2271
  connection: {
2036
2272
  connected: "Conectado",
2037
- connecting: "Conectando...",
2038
- reconnecting: "Reconectando...",
2273
+ connecting: "Conectando…",
2274
+ reconnecting: "Reconectando…",
2039
2275
  disconnected: "Desconectado",
2040
2276
  error: "Error de conexión",
2041
2277
  },
@@ -2074,6 +2310,14 @@ const es = {
2074
2310
  publishing: "Publicando…",
2075
2311
  published: "¡Publicado! Sus cambios están activos.",
2076
2312
  publishFailed: "Error al publicar",
2313
+ // objectui#3546 slice six — seedWarn reutiliza la traducción de
2314
+ // console.ai.seedWarn (misma frase en inglés). Marcador "(s)" como en
2315
+ // home.pendingDrafts.message, de esta misma familia.
2316
+ nothing: "Nada que publicar.",
2317
+ probeWarn: "Publicado, pero la verificación encontró problemas.",
2318
+ seedWarn: "Publicado, pero no se pudieron cargar algunos datos de ejemplo.",
2319
+ publishedVerified: "Publicado y verificado — {{count}} fila(s) de ejemplo activa(s).",
2320
+ capabilityWarn: "Comprobación de autoría: {{count}} referencia(s) de capacidad no apuntan a nada.",
2077
2321
  },
2078
2322
  title: "Inicio",
2079
2323
  subtitle: "Panel de tu espacio de trabajo",
@@ -2087,7 +2331,7 @@ const es = {
2087
2331
  title: "Requiere tu atención",
2088
2332
  empty: "Estás al día",
2089
2333
  },
2090
- loading: "Cargando espacio de trabajo...",
2334
+ loading: "Cargando espacio de trabajo…",
2091
2335
  recent: "Recientes",
2092
2336
  starred: "Destacados",
2093
2337
  welcome: "Bienvenido a ObjectUI",
@@ -2148,6 +2392,9 @@ const es = {
2148
2392
  roles: "Roles",
2149
2393
  configuration: "Configuración",
2150
2394
  createApp: "Crear aplicación",
2395
+ administration: "Administración",
2396
+ datasources: "Fuentes de datos",
2397
+ documentation: "Documentación",
2151
2398
  },
2152
2399
  appSwitcher: {
2153
2400
  switchApplication: "Cambiar de aplicación",
@@ -2187,7 +2434,7 @@ const es = {
2187
2434
  search: {
2188
2435
  title: "Buscar",
2189
2436
  back: "Atrás",
2190
- placeholder: "Buscar objetos, paneles, páginas, informes...",
2437
+ placeholder: "Buscar objetos, paneles, páginas, informes…",
2191
2438
  inputAriaLabel: "Buscar objetos, paneles, páginas, informes",
2192
2439
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2193
2440
  resultsCountPlural: "{{count}} resultados para \"{{query}}\"",
@@ -2206,6 +2453,7 @@ const es = {
2206
2453
  empty: {
2207
2454
  objectNotFound: "Objeto no encontrado",
2208
2455
  objectNotFoundDescription: "Falta la definición del objeto \"{{name}}\". Verifique su configuración o navegue hacia atrás.",
2456
+ interfacePageSourceMissing: "Esta página de interfaz hace referencia a \"{{name}}\", que no está disponible.",
2209
2457
  pageNotFound: "Página no encontrada",
2210
2458
  pageNotFoundDescription: "La página \"{{name}}\" no fue encontrada. Puede haber sido eliminada o renombrada.",
2211
2459
  dashboardNotFound: "Panel no encontrado",
@@ -2214,6 +2462,11 @@ const es = {
2214
2462
  reportNotFoundDescription: "El informe \"{{name}}\" no fue encontrado. Puede haber sido eliminado o renombrado.",
2215
2463
  noAppsConfigured: "Sin aplicaciones configuradas",
2216
2464
  noAppsConfiguredDescription: "No hay aplicaciones registradas. Cree su primera aplicación o visite la configuración del sistema.",
2465
+ appNotAvailable: "Aplicación no disponible",
2466
+ appNotAvailableDescription: "Esta aplicación aún no está disponible — puede que todavía se esté publicando. Vuelva a intentarlo en un momento.",
2467
+ appAccessDenied: "No tiene acceso a esta aplicación",
2468
+ appAccessDeniedDescription: "Esta aplicación existe, pero su cuenta no está autorizada para abrirla. Solicite acceso a un administrador.",
2469
+ appAccessDeniedHome: "Volver al inicio",
2217
2470
  createFirstApp: "Crear primera aplicación",
2218
2471
  systemSettings: "Configuración del sistema",
2219
2472
  back: "Atrás",
@@ -2285,7 +2538,7 @@ const es = {
2285
2538
  deleteFailed: "No se pudo eliminar la vista",
2286
2539
  },
2287
2540
  dashboardActions: {
2288
- pdfPreparing: "Preparando exportación PDF…",
2541
+ printDialogOpening: "Abriendo el cuadro de diálogo de impresión de tu navegador (no es una exportación a PDF)",
2289
2542
  exportFailed: "Error al exportar: {{message}}",
2290
2543
  forecastSoon: "La vista de pronóstico llegará pronto",
2291
2544
  },
@@ -2329,111 +2582,7 @@ const es = {
2329
2582
  first: "Primero",
2330
2583
  },
2331
2584
  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}",
2585
+ panelTitle: "Editar informe",
2437
2586
  },
2438
2587
  },
2439
2588
  organizations: {
@@ -2450,6 +2599,140 @@ const es = {
2450
2599
  emptyDescription: "Crea tu primera organización para empezar.",
2451
2600
  noMatches: "Ninguna organización coincide con tu búsqueda.",
2452
2601
  },
2602
+ organization: {
2603
+ roles: {
2604
+ owner: 'Propietario',
2605
+ admin: 'Administrador',
2606
+ delegatedAdmin: 'Administrador delegado',
2607
+ member: 'Miembro',
2608
+ },
2609
+ errors: {
2610
+ notAllowedToInvite: 'No tiene permiso para invitar usuarios a esta organización.',
2611
+ notAllowedToInviteWithRole: 'No tiene permiso para invitar a un usuario con este rol.',
2612
+ alreadyInvited: 'Este usuario ya ha sido invitado a esta organización.',
2613
+ organizationExists: 'Esa organización ya existe.',
2614
+ slugTaken: 'Ese slug ya está en uso.',
2615
+ notAllowedToCreate: 'No tiene permiso para crear una organización nueva.',
2616
+ notTheRecipient: 'No es el destinatario de esta invitación.',
2617
+ invitationNotFound: 'Esta invitación ya no existe o ha caducado.',
2618
+ unknown: 'Algo salió mal. Inténtelo de nuevo.',
2619
+ },
2620
+ backToList: "Volver a las organizaciones",
2621
+ notFound: "Organización no encontrada",
2622
+ notFoundDescription: "Esta organización no existe o no tienes acceso.",
2623
+ tabs: {
2624
+ members: "Miembros",
2625
+ invitations: "Invitaciones",
2626
+ settings: "Configuración",
2627
+ },
2628
+ members: {
2629
+ title: "Miembros",
2630
+ inviteMember: "Invitar miembro",
2631
+ inviteRestrictedNote: "Solo los administradores de la organización pueden invitar a miembros.",
2632
+ removeMember: "Eliminar miembro",
2633
+ removeConfirmTitle: "¿Eliminar miembro?",
2634
+ removeConfirmDescription: "Se eliminará a {{name}} de la organización y perderá el acceso de inmediato.",
2635
+ removeConfirmAction: "Eliminar",
2636
+ memberRemoved: "Miembro eliminado",
2637
+ removeFailed: "No se pudo eliminar al miembro",
2638
+ roleUpdated: "Rol actualizado",
2639
+ roleUpdateFailed: "No se pudo actualizar el rol",
2640
+ memberActions: 'Acciones del miembro',
2641
+ loadFailed: 'No se pudieron cargar los miembros',
2642
+ },
2643
+ invitations: {
2644
+ title: "Invitaciones",
2645
+ empty: "No hay invitaciones.",
2646
+ expiresAt: "Caduca",
2647
+ linkCopied: "Enlace de invitación copiado",
2648
+ copyFailed: "No se pudo copiar el enlace",
2649
+ canceled: "Invitación cancelada",
2650
+ cancelFailed: "No se pudo cancelar la invitación",
2651
+ cancelTitle: "¿Cancelar la invitación?",
2652
+ cancelDescription: "Se revocará la invitación de {{email}}.",
2653
+ cancelAction: "Cancelar invitación",
2654
+ inviteTitle: "Invitar a un miembro",
2655
+ inviteDescription: "Recibirá una invitación para unirse a esta organización.",
2656
+ emailLabel: "Correo electrónico",
2657
+ roleLabel: "Rol",
2658
+ placementLabel: "Asignación (opcional)",
2659
+ placementDescription: "Se aplica cuando se acepta la invitación. Solo se listan las unidades y los puestos que puedes delegar.",
2660
+ businessUnitLabel: "Unidad de negocio",
2661
+ businessUnitPlaceholder: "Sin asignación",
2662
+ positionsLabel: "Puestos",
2663
+ sendInvite: "Enviar invitación",
2664
+ sentTitle: "Invitación creada",
2665
+ sentDescription: "Comparte el enlace de abajo con la persona invitada. Tendrá que iniciar sesión para aceptarla.",
2666
+ linkLabel: "Enlace de aceptación",
2667
+ invitedAs: "{{email}} invitado como {{role}}",
2668
+ copyLinkLabel: 'Copiar enlace de invitación',
2669
+ loadFailed: 'No se pudieron cargar las invitaciones',
2670
+ inviteFailed: 'No se pudo invitar al miembro',
2671
+ status: {
2672
+ all: "Todas",
2673
+ pending: "Pendiente",
2674
+ accepted: "Aceptada",
2675
+ rejected: "Rechazada",
2676
+ canceled: "Cancelada",
2677
+ },
2678
+ },
2679
+ settings: {
2680
+ generalTitle: "General",
2681
+ generalDescription: "Actualiza la información de tu organización.",
2682
+ readOnlyNote: "Solo los propietarios pueden cambiar la configuración.",
2683
+ nameLabel: "Nombre de la organización",
2684
+ slugLabel: "Slug",
2685
+ logoLabel: "Logo",
2686
+ logoUpload: "Subir",
2687
+ logoReplace: "Reemplazar",
2688
+ logoClear: "Quitar",
2689
+ logoUploaded: "Logo subido: guarda para aplicarlo",
2690
+ logoUploadFailed: "No se pudo subir el logo",
2691
+ save: "Guardar cambios",
2692
+ saved: "Configuración guardada",
2693
+ saveFailed: "No se pudo guardar la configuración",
2694
+ leaveTitle: "Salir de la organización",
2695
+ leaveDescription: "Perderás el acceso a esta organización.",
2696
+ leaveAction: "Salir",
2697
+ leaveConfirmTitle: "¿Salir de la organización?",
2698
+ leaveConfirmDescription: "¿Seguro que quieres salir de {{name}}? Perderás el acceso de inmediato.",
2699
+ leaveConfirmAction: "Salir",
2700
+ leftOrg: "Has salido de la organización",
2701
+ leaveFailed: "No se pudo salir de la organización",
2702
+ dangerZone: "Zona de peligro",
2703
+ deleteTitle: "Eliminar organización",
2704
+ deleteDescription: "Elimina permanentemente esta organización y todos sus datos.",
2705
+ deleteAction: "Eliminar",
2706
+ deleteConfirmTitle: "¿Eliminar la organización?",
2707
+ deleteConfirmDescription: "Esta acción es irreversible. Todos los datos se eliminarán de forma permanente. Escribe el slug de la organización para confirmar.",
2708
+ deleteConfirmSlugLabel: "Escribe «{{slug}}» para confirmar",
2709
+ deleteConfirmAction: "Eliminar organización",
2710
+ deleted: "Organización eliminada",
2711
+ deleteFailed: "No se pudo eliminar la organización",
2712
+ },
2713
+ accept: {
2714
+ title: "Te han invitado",
2715
+ description: "Te han invitado a unirte a {{orgName}} como {{role}}.",
2716
+ errorTitle: "Invitación no disponible",
2717
+ goToOrgs: "Ir a las organizaciones",
2718
+ loading: "Cargando la invitación…",
2719
+ organization: "Organización",
2720
+ role: "Rol",
2721
+ expiresAt: "Caduca",
2722
+ accept: "Aceptar invitación",
2723
+ accepted: "Invitación aceptada",
2724
+ acceptFailed: "No se pudo aceptar la invitación",
2725
+ decline: "Rechazar",
2726
+ declined: "Invitación rechazada",
2727
+ declineFailed: "No se pudo rechazar la invitación",
2728
+ },
2729
+ switcher: {
2730
+ label: "Cambiar de organización",
2731
+ groupLabel: "Organización de trabajo",
2732
+ groupHint: "Los registros nuevos se crean aquí. Las vistas muestran datos de todas tus organizaciones.",
2733
+ manageMembers: "Administrar miembros",
2734
+ },
2735
+ },
2453
2736
  notifications: {
2454
2737
  regionLabel: "Notificaciones",
2455
2738
  groupCount: "{{count}} notificaciones",
@@ -2463,6 +2746,9 @@ const es = {
2463
2746
  viewApprovals: "Ver aprobaciones",
2464
2747
  noPendingApprovals: "Sin aprobaciones pendientes",
2465
2748
  openApprovalsInbox: "Abrir bandeja de aprobaciones",
2749
+ badgeTotal: "{{total}} en total",
2750
+ badgeNotifications: "{{unread}} notificaciones",
2751
+ badgeApprovals: "{{approvals}} aprobaciones pendientes",
2466
2752
  emptyUnread: "Todo al día",
2467
2753
  filterUnread: "No leídos",
2468
2754
  filterAll: "Todos",
@@ -2749,6 +3035,7 @@ const es = {
2749
3035
  dismiss: "Descartar",
2750
3036
  openOnCloud: "Abrir en la nube",
2751
3037
  backHome: "Volver al inicio",
3038
+ updateTo: "Actualizar",
2752
3039
  },
2753
3040
  install: {
2754
3041
  dialogTitle: "Instalar {{name}}",
@@ -2765,6 +3052,37 @@ const es = {
2765
3052
  localManifestConflict: "{{message}}\nNota: Una aplicación local ya tiene este manifest_id. Primero elimínela de objectstack.config.ts.",
2766
3053
  localUnauthorized: "Primero inicie sesión en este runtime.",
2767
3054
  localMarketplaceUnavailable: "Este runtime no tiene configurado OS_CLOUD_URL.",
3055
+ updateTo: "Actualizar → v{{version}}",
3056
+ installedVersion: "Instalado v{{version}}",
3057
+ },
3058
+ // objectui#3546 — the MarketplacePage "Your organization" strip.
3059
+ org: {
3060
+ heading: "Su organización",
3061
+ install: "Instalar",
3062
+ installed: "{{name}} instalado",
3063
+ installedBadge: "Instalado",
3064
+ installing: "Instalando…",
3065
+ },
3066
+ // ADR-0025 PD4 §3.5/§3.11 — the pre-install consent panel
3067
+ // (PluginDisclosure.tsx). `runtime` is a CLOSED enum: spec
3068
+ // PluginRuntimeSchema = z.enum(['node', 'sandbox', 'worker']).
3069
+ disclosure: {
3070
+ containsCode: "Este paquete contiene código",
3071
+ reviewed: "Revisado y aprobado",
3072
+ unreviewed: "Sin revisar todavía",
3073
+ signed: "Firmado",
3074
+ grantsIntro: "Al instalarlo, este paquete recibirá:",
3075
+ services: "Servicios de la plataforma",
3076
+ hooks: "Hooks de ciclo de vida",
3077
+ network: "Acceso a la red",
3078
+ fs: "Acceso al sistema de archivos",
3079
+ noPermissions: "No solicita permisos especiales.",
3080
+ acknowledge: "Entiendo que este paquete ejecuta código y recibe los permisos anteriores.",
3081
+ runtime: {
3082
+ node: "En el proceso · confianza total",
3083
+ sandbox: "En sandbox",
3084
+ worker: "Fuera del proceso",
3085
+ },
2768
3086
  },
2769
3087
  uninstall: {
2770
3088
  confirm: "¿Desinstalar {{manifestId}} v{{version}} de este runtime?\n\nEl manifiesto en caché será eliminado.",
@@ -2984,16 +3302,16 @@ const es = {
2984
3302
  loadFailedTitle: 'No se pudo cargar la vista previa del borrador',
2985
3303
  loadFailedDescription: 'No se pudo leer la capa de borrador. Reintenta o comprueba tu conexión.',
2986
3304
  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.',
3305
+ 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
3306
  nothingTitle: 'Nada que previsualizar todavía',
2989
3307
  retry: 'Reintentar',
2990
3308
  },
2991
3309
  draftBar: {
2992
- messageClean: "Vista previa del borrador: no hay cambios sin publicar; todo lo que ve aquí ya está activo.",
3310
+ messageClean: "Vista previa del borrador — no hay cambios sin publicar; todo lo que ve aquí ya está activo.",
2993
3311
  sampleDataTitle: "Los datos de ejemplo aparecen tras publicar",
2994
3312
  sampleDataBody: "Está viendo la estructura de su aplicación. Publíquela para cargar registros de ejemplo y activarla.",
2995
3313
  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.',
3314
+ message: 'Vista previa del borrador — está viendo cambios sin publicar. Nada de lo que ve aquí está activo hasta que publique.',
2997
3315
  publish: 'Publicar',
2998
3316
  publishing: 'Publicando…',
2999
3317
  exit: 'Salir de la vista previa',
@@ -3014,6 +3332,34 @@ const es = {
3014
3332
  confirmNote: 'Publicar libera atómicamente los {{count}} borradores pendientes de este paquete.',
3015
3333
  publishConfirm: 'Publicar todo',
3016
3334
  },
3335
+ // ADR-0045 — the materialized-but-unlisted app banner
3336
+ // (UnpublishedAppBar.tsx), sibling of draftBar above.
3337
+ unpublishedBar: {
3338
+ message: 'Aplicación sin publicar — totalmente funcional, pero solo la ven los creadores. Publíquela para que sus usuarios la vean.',
3339
+ publish: 'Publicar',
3340
+ publishing: 'Publicando…',
3341
+ published: '¡Publicado! La aplicación ya es visible para sus usuarios.',
3342
+ publishFailed: 'Error al publicar',
3343
+ },
3344
+ // ADR-0067 — the append-only build/revert timeline (CommitTimeline.tsx);
3345
+ // `button` is the banner's entry point into it.
3346
+ history: {
3347
+ button: 'Historial',
3348
+ title: 'Historial de compilaciones',
3349
+ 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.',
3350
+ loadFailed: 'No se pudo cargar el historial:',
3351
+ 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.',
3352
+ loading: 'Cargando historial…',
3353
+ empty: 'Aún no hay historial para esta aplicación.',
3354
+ revertLabel: 'Se deshizo un cambio',
3355
+ applyLabel: 'Cambio de compilación',
3356
+ revert: 'deshacer',
3357
+ items: 'elementos',
3358
+ revertAction: 'Deshacer',
3359
+ reverted: 'Deshecho — el cambio se ha revertido.',
3360
+ revertFailed: 'Error al deshacer',
3361
+ 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.',
3362
+ },
3017
3363
  },
3018
3364
  filterBuilder: {
3019
3365
  where: "Donde",
@@ -3092,5 +3438,57 @@ const es = {
3092
3438
  statusIdle: "inactivo",
3093
3439
  statusAway: "ausente",
3094
3440
  },
3441
+ wizard: {
3442
+ missingRequired: "Complete los campos obligatorios: {{fields}}",
3443
+ },
3444
+ appManagement: {
3445
+ title: "Aplicaciones",
3446
+ subtitle: "Gestione todas las aplicaciones configuradas",
3447
+ newApp: "Nueva aplicación",
3448
+ searchLabel: "Buscar aplicaciones",
3449
+ searchPlaceholder: "Buscar aplicaciones…",
3450
+ selectedCount: "{{n}} seleccionadas",
3451
+ bulkEnable: "Habilitar",
3452
+ bulkDisable: "Deshabilitar",
3453
+ selectAll: "Seleccionar todo ({{n}})",
3454
+ empty: "No se encontraron aplicaciones.",
3455
+ defaultBadge: "Predeterminada",
3456
+ active: "Activa",
3457
+ inactive: "Inactiva",
3458
+ selectApp: "Seleccionar {{name}}",
3459
+ openApp: "Abrir aplicación",
3460
+ openAppNamed: "Abrir {{name}}",
3461
+ editApp: "Editar aplicación",
3462
+ editAppNamed: "Editar {{name}}",
3463
+ editWithAi: "Editar con IA",
3464
+ editWithAiNamed: "Editar {{name}} con IA",
3465
+ enableApp: "Habilitar aplicación",
3466
+ disableApp: "Deshabilitar aplicación",
3467
+ enableAppNamed: "Habilitar {{name}}",
3468
+ disableAppNamed: "Deshabilitar {{name}}",
3469
+ setDefault: "Establecer como predeterminada",
3470
+ setDefaultNamed: "Establecer {{name}} como predeterminada",
3471
+ deleteApp: "Eliminar aplicación",
3472
+ deleteAppNamed: "Eliminar {{name}}",
3473
+ confirmDelete: "Haga clic de nuevo para confirmar la eliminación",
3474
+ confirmDeleteNamed: "Confirmar la eliminación de {{name}}",
3475
+ toast: {
3476
+ noClient: "No se puede acceder al servicio de metadatos",
3477
+ unknownError: "error desconocido",
3478
+ appEnabled: "{{name}} habilitada",
3479
+ appDisabled: "{{name}} deshabilitada",
3480
+ toggleFailed: "Error al cambiar el estado de la aplicación: {{reason}}",
3481
+ setDefaultDone: "{{name}} establecida como predeterminada",
3482
+ setDefaultFailed: "Error al establecer la aplicación predeterminada: {{reason}}",
3483
+ appDeleted: "{{name}} eliminada",
3484
+ deleteFailed: "Error al eliminar la aplicación: {{reason}}",
3485
+ bulkEnabled: "{{n}} aplicaciones habilitadas",
3486
+ bulkDisabled: "{{n}} aplicaciones deshabilitadas",
3487
+ bulkFailed: "Error en {{n}}: {{details}}",
3488
+ bulkFailureEntry: "{{name}} ({{reason}})",
3489
+ bulkFailureJoiner: "; ",
3490
+ bulkOperationFailed: "Error en la operación masiva: {{reason}}",
3491
+ },
3492
+ },
3095
3493
  };
3096
3494
  export default es;