@object-ui/i18n 16.0.0 → 17.1.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.
@@ -1,6 +1,15 @@
1
1
  const es = {
2
2
  // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
3
3
  capability: {
4
+ label: {
5
+ manage_users: "Gestionar usuarios",
6
+ manage_org_users: "Gestionar usuarios de la organización",
7
+ manage_metadata: "Gestionar metadatos",
8
+ manage_platform_settings: "Gestionar la configuración de la plataforma",
9
+ setup_access: "Acceso a la configuración",
10
+ setup_write: "Escritura de la configuración",
11
+ studio_access: "Acceso a Studio",
12
+ },
4
13
  group: {
5
14
  platform: 'Plataforma',
6
15
  org: 'Organización',
@@ -74,9 +83,14 @@ const es = {
74
83
  package: "Paquete",
75
84
  },
76
85
  actions: {
86
+ decisionOutput: {
87
+ help: 'Se transfiere al flujo como salida de la decisión.',
88
+ helpMultiValue: 'Se transfiere al flujo como salida de la decisión. Separe varios valores con comas.',
89
+ },
77
90
  resultDialog: {
78
- defaultTitle: 'Save this value now',
79
- acknowledge: 'I have saved this',
91
+ defaultTitle: 'Guarda este valor ahora',
92
+ acknowledge: 'Lo he guardado',
93
+ copyAll: 'Copiar todo',
80
94
  },
81
95
  },
82
96
  validation: {
@@ -93,6 +107,16 @@ const es = {
93
107
  type: "{{field}} debe ser un {{type}} válido",
94
108
  },
95
109
  form: {
110
+ noPermissionToSave: "No tienes permiso para guardar este registro.",
111
+ submitFailed: "No se pudo guardar. Inténtalo de nuevo.",
112
+ discardTitle: "¿Descartar los cambios?",
113
+ discardMessage: "Tiene cambios sin guardar. Si cierra este formulario ahora, sus ediciones se perderán.",
114
+ keepEditing: "Seguir editando",
115
+ discard: "Descartar",
116
+ conflictTitle: "Conflicto al guardar",
117
+ conflictMessage: "Otra persona modificó este registro mientras lo editaba. Sobrescribir reemplazará sus cambios por los suyos.",
118
+ conflictLatestVersion: "Su guardado: {{time}}",
119
+ conflictOverwrite: "Sobrescribir",
96
120
  addItem: "Añadir elemento",
97
121
  removeItem: "Eliminar elemento",
98
122
  fieldRequired: "Este campo es obligatorio",
@@ -103,8 +127,6 @@ const es = {
103
127
  stepOf: "Paso {{current}} de {{total}}",
104
128
  createTitle: "Crear {{object}}",
105
129
  editTitle: "Editar {{object}}",
106
- createDescription: "Agregar un nuevo {{object}} a su base de datos.",
107
- editDescription: "Actualizar detalles de {{object}}",
108
130
  saveRecord: "Guardar registro",
109
131
  create: "Crear",
110
132
  update: "Actualizar",
@@ -113,14 +135,70 @@ const es = {
113
135
  deleteSuccess: "{{object}} eliminado",
114
136
  },
115
137
  fields: {
138
+ image: {
139
+ upload: "Subir imagen",
140
+ addMore: "Añadir más imágenes",
141
+ uploading: "Subiendo…",
142
+ imageAlt: "Imagen {{index}}",
143
+ crop: "Recortar la imagen {{index}}",
144
+ remove: "Eliminar la imagen {{index}}",
145
+ enlarge: "Ampliar {{name}}",
146
+ preview: "Vista previa de la imagen",
147
+ previous: "Imagen anterior",
148
+ next: "Imagen siguiente",
149
+ counter: "{{current}} / {{total}}",
150
+ },
116
151
  relativeDate: {
117
152
  overdue: "Atrasado {{count}} d",
118
153
  },
154
+ file: {
155
+ dragDropHere: 'Arrastra y suelta archivos aquí',
156
+ dropFilesHere: 'Suelta los archivos aquí',
157
+ browseHint: 'o haz clic para explorar',
158
+ browseHintCamera: 'o haz clic para explorar • usa el botón de cámara de abajo',
159
+ takePhoto: 'Tomar foto',
160
+ takeSelfie: 'Tomar selfie',
161
+ cameraCapture: 'Captura de cámara',
162
+ uploading: 'Subiendo…',
163
+ uploadingPct: 'Subiendo… ({{pct}} %)',
164
+ fileFallback: 'Archivo',
165
+ upload: 'Subir',
166
+ remove: 'Quitar {{name}}',
167
+ exceedsMaxSize: '«{{name}}» supera el tamaño máximo ({{max}} MB)',
168
+ uploadFailed: 'Error al subir «{{name}}»: {{error}}',
169
+ },
119
170
  richText: {
120
171
  format: "Formato: {{format}}",
121
172
  basicEditorHint: "Editor de texto enriquecido (básico)",
122
173
  placeholder: "Escribe algo...",
123
174
  },
175
+ objectRef: {
176
+ loading: "Cargando objetos…",
177
+ placeholder: "Seleccionar un objeto",
178
+ search: "Buscar objetos…",
179
+ empty: "No se encontraron objetos",
180
+ },
181
+ recipient: {
182
+ selectTypeFirst: "Selecciona primero un tipo de destinatario.",
183
+ loading: "Cargando…",
184
+ search: "Buscar…",
185
+ empty: "Sin coincidencias",
186
+ select: "Seleccionar un destinatario",
187
+ selectUser: "Seleccionar un usuario",
188
+ selectTeam: "Seleccionar un equipo",
189
+ selectBusinessUnit: "Seleccionar una unidad de negocio",
190
+ selectPosition: "Seleccionar un puesto",
191
+ selectUnitAndSubordinates: "Seleccionar una unidad de negocio",
192
+ },
193
+ filterCondition: {
194
+ selectObjectFirst: "Selecciona primero un objeto.",
195
+ noCriteria: "Sin criterios: esta regla no comparte nada",
196
+ criteriaRequired: "Añade al menos una condición. Una regla sin criterios compartiría todos los registros, por lo que no se puede guardar.",
197
+ invalidJson: "JSON no válido: la regla no coincidirá con ningún registro hasta que se corrija.",
198
+ jsonOnly: "Este criterio solo se puede editar como JSON",
199
+ editAsJson: "Editar como JSON",
200
+ useVisualBuilder: "Usar el constructor visual",
201
+ },
124
202
  },
125
203
  table: {
126
204
  rowsPerPage: "Filas por página",
@@ -155,6 +233,37 @@ const es = {
155
233
  delete: "Eliminar",
156
234
  },
157
235
  grid: {
236
+ bulkSelected: "{{count}} seleccionados",
237
+ bulkSelectedAllMatches: "{{count}} seleccionados (todas las coincidencias)",
238
+ bulkClear: "Quitar selección",
239
+ bulkAllOnPage: "Están seleccionados los {{count}} de esta página.",
240
+ bulkSelectAllMatching: "Seleccionar las {{count}} coincidencias",
241
+ bulkAllMatchingSelected: "Están seleccionados los {{count}} registros coincidentes.",
242
+ bulk: {
243
+ confirmDefault: "Esto se aplicará a {{count}} registro(s).",
244
+ overLimit: "La selección ({{count}}) supera el límite de la acción ({{limit}}). Reduzca la selección para continuar.",
245
+ affectedRecords: "Registros afectados ({{count}}):",
246
+ skippedIneligible: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
247
+ rowFallback: "Fila {{index}}",
248
+ andMore: "… y {{count}} más",
249
+ processed: "{{count}} / {{total}} procesados",
250
+ processedFailed: " · {{count}} con error",
251
+ undonePrefix: "Deshecho: ",
252
+ succeeded: "Correctos {{count}} / {{total}}",
253
+ resultFailed: " · Fallidos {{count}}",
254
+ retry: "Reintentar",
255
+ downloadErrorCsv: "Descargar CSV de errores",
256
+ cancel: "Cancelar",
257
+ back: "Atrás",
258
+ next: "Siguiente",
259
+ run: "Ejecutar",
260
+ running: "Ejecutando…",
261
+ undo: "Deshacer",
262
+ undoing: "Deshaciendo…",
263
+ done: "Hecho",
264
+ selectPlaceholder: "Seleccionar…",
265
+ loading: "Cargando…",
266
+ },
158
267
  actions: "Acciones",
159
268
  edit: "Editar",
160
269
  delete: "Eliminar",
@@ -180,7 +289,88 @@ const es = {
180
289
  densityCycleShortHint: "Clic para cambiar",
181
290
  },
182
291
  import: {
292
+ downloadTemplate: "Descargar plantilla",
293
+ downloadTemplateHint: "Obtenga un CSV con las columnas correctas (los campos obligatorios llevan *).",
294
+ templateFileName: "{{object}}-import-template",
295
+ autoMatched: "Emparejado automáticamente",
296
+ autoMatchedSummary: "{{count}} columna(s) emparejada(s) automáticamente: revise y ajuste abajo.",
297
+ confidence: {
298
+ high: "Confianza alta",
299
+ medium: "Confianza media",
300
+ low: "Confianza baja",
301
+ },
302
+ asyncQueued: "En cola: preparando la importación…",
303
+ asyncProcessing: "Importando {{processed}} de {{total}} filas… {{progress}} %",
304
+ asyncLargeHint: "Este archivo es grande, así que se importará en segundo plano.",
305
+ largeSampleNotice: "Vista previa de las primeras {{shown}} de {{total}} filas.",
306
+ cancelImport: "Cancelar la importación",
307
+ importCancelled: "Importación cancelada",
308
+ resultsTruncated: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
309
+ createdCount: "{{count}} creados",
310
+ updatedCount: "{{count}} actualizados",
311
+ downloadFailed: "Descargar las filas con error",
312
+ options: "Opciones de importación",
313
+ writeMode: "Cuando una fila coincide con un registro existente",
314
+ writeModeOpt: {
315
+ insert: "Crear siempre uno nuevo",
316
+ update: "Actualizar el existente (omitir si no hay coincidencia)",
317
+ upsert: "Actualizar si coincide; si no, crear",
318
+ },
319
+ matchFields: "Coincidir por",
320
+ matchFieldsPlaceholder: "Elija el campo o campos de coincidencia…",
321
+ matchFieldsHint: "Las filas se emparejan con registros existentes por estos campos.",
322
+ needMatchFields: "Seleccione al menos un campo por el que coincidir.",
323
+ matchOnlyField: "(solo coincidencia)",
324
+ optCreateOptions: "Conservar los valores de opción desconocidos",
325
+ optRunAutomations: "Ejecutar automatizaciones y disparadores",
326
+ optTreatHistorical: "Importar como datos históricos",
327
+ optTreatHistoricalHint: "(importa los registros completados tal cual: omite las comprobaciones de la máquina de estados y conserva sus marcas de tiempo y autor originales en lugar de sellarlos ahora)",
328
+ optSkipBlankKey: "Omitir las filas con valor de coincidencia vacío",
329
+ optBackground: "Importar en segundo plano",
330
+ optBackgroundHint: "(se ejecuta como un trabajo reversible)",
331
+ validate: "Validar los datos",
332
+ validating: "Validando…",
333
+ validateHint: "Comprobar cada fila en el servidor antes de importar.",
334
+ validatePassed: "Las {{ok}} filas son válidas.",
335
+ validateFailed: "{{ok}} válidas, {{errors}} con errores.",
336
+ errorRowPrefix: "Fila {{row}}: ",
337
+ referenceNotFound: "No hay ningún registro que coincida con «{{value}}»",
338
+ referenceAmbiguous: "«{{value}}» coincide con más de un registro: use un valor único o el id del registro",
339
+ invalidBoolean: "«{{value}}» no es un valor verdadero/falso válido",
340
+ invalidNumber: "«{{value}}» no es un número válido",
341
+ invalidDate: "«{{value}}» no es una fecha válida",
342
+ invalidOption: "«{{value}}» no es una de las opciones permitidas",
343
+ requiredValue: "Este campo es obligatorio",
344
+ matchAmbiguous: "Coincide con más de un registro existente: use un valor único o el id del registro",
345
+ history: "Historial",
346
+ historyBack: "Volver a la importación",
347
+ historyDescription: "Importaciones recientes de este objeto.",
348
+ historyHint: "Trabajos de importación en segundo plano, los más recientes primero.",
349
+ historyRefresh: "Actualizar",
350
+ historyLoading: "Cargando…",
351
+ historyEmpty: "Todavía no hay importaciones.",
352
+ historyUnsupported: "El historial de importaciones no está disponible para esta fuente de datos.",
353
+ historyColStatus: "Estado",
354
+ historyColRows: "Filas",
355
+ historyColResult: "Resultado",
356
+ historyColTime: "Cuándo",
357
+ errorCount: "{{count}} errores",
358
+ undoImport: "Deshacer la importación",
359
+ undoing: "Deshaciendo…",
360
+ undoConfirm: "¿Deshacer esta importación? Los registros que creó se eliminarán y los que actualizó se restaurarán a sus valores anteriores.",
361
+ reverted: "Deshecha",
362
+ jobStatus: {
363
+ pending: "Pendiente",
364
+ running: "En ejecución",
365
+ succeeded: "Correcta",
366
+ failed: "Fallida",
367
+ cancelled: "Cancelada",
368
+ },
369
+ legacyReferenceBlocked: "Importación bloqueada: {{fields}} son campos de relación que necesitan la ruta de importación del servidor para convertir nombres en identificadores de registro, y esta conexión no la admite. Importarlos como texto plano dañaría los datos. Actualice el backend/cliente, o desasigne estas columnas e impórtelas por separado.",
370
+ missingRequiredHint: "No se puede continuar: campos obligatorios sin asignar: {{fields}}. Añada una columna correspondiente a su archivo, o vuelva atrás y suba uno que la incluya.",
371
+ legacyFallbackNotice: "Importado mediante un modo de compatibilidad: esta conexión no admite la ruta de importación del servidor, por lo que los valores se guardaron como texto sin conversión de tipos en el servidor. Actualice el backend/cliente para disponer de la importación completa (conversión de tipos y búsqueda de relaciones).",
183
372
  title: "Importar {{object}}",
373
+ notAllowed: "Este objeto no está habilitado para la importación.",
184
374
  stepUpload: "Cargar",
185
375
  stepMapping: "Asignación",
186
376
  stepPreview: "Vista previa",
@@ -256,6 +446,42 @@ const es = {
256
446
  moreEvents: "+{{count}} más",
257
447
  },
258
448
  list: {
449
+ firstRunTitle: "Aquí todavía no hay nada",
450
+ firstRunMessage: "Cree su primer registro para empezar.",
451
+ noMatches: "No hay registros coincidentes",
452
+ noMatchesMessage: "Ningún registro coincide con sus filtros o su búsqueda actuales. Pruebe a ajustarlos o borrarlos.",
453
+ loadErrorTitle: "No se pudieron cargar los registros",
454
+ loadErrorMessage: "Algo salió mal al cargar estos datos. Compruebe su conexión y vuelva a intentarlo.",
455
+ loadErrorForbiddenTitle: "No tiene acceso",
456
+ loadErrorForbiddenMessage: "No tiene permiso para ver estos registros. Contacte a su administrador si cree que debería tener acceso.",
457
+ loadErrorUnauthorizedTitle: "Se requiere iniciar sesión",
458
+ loadErrorUnauthorizedMessage: "Su sesión ha expirado o ha cerrado sesión. Inicie sesión de nuevo para ver estos registros.",
459
+ loadErrorRejectedTitle: "La consulta de esta vista fue rechazada",
460
+ 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.",
461
+ retry: "Reintentar",
462
+ managedBy: {
463
+ system: {
464
+ title: "Aquí todavía no hay nada",
465
+ message: "Las entradas aparecen automáticamente cuando se ejecuta su acción de origen (por ejemplo, Enviar para aprobación, Compartir, Invitar). Ejecute una de ellas en un registro de origen para crear una fila.",
466
+ },
467
+ appendOnly: {
468
+ title: "No se han registrado eventos",
469
+ message: "Este es un registro de auditoría inmutable. Las filas las escribe la plataforma cuando ocurren eventos: puede exportar el historial, pero no crear entradas desde aquí.",
470
+ },
471
+ betterAuth: {
472
+ title: "No hay registros de identidad",
473
+ message: "Estos registros los crea el proveedor de autenticación —mediante el inicio de sesión, el aprovisionamiento y los flujos de seguridad— y no se añaden a mano aquí.",
474
+ },
475
+ betterAuthUser: {
476
+ title: "Todavía no hay usuarios",
477
+ message: "Las cuentas de usuario las aprovisiona el proveedor de autenticación; no se crean aquí. Invite a sus compañeros a la organización y aparecerán automáticamente en su primer inicio de sesión (aprovisionamiento SSO en el momento). Los usuarios finales de la aplicación llegan cuando se registran a través de ella.",
478
+ },
479
+ betterAuthTeam: {
480
+ title: "Todavía no hay equipos",
481
+ message: "Los equipos agrupan a los miembros dentro de una organización. Cree uno con «Crear equipo», o llegarán a través de los flujos de aprovisionamiento de organización y SSO de su proveedor de autenticación.",
482
+ },
483
+ },
484
+ refresh: "Actualizar",
259
485
  loading: 'Loading records...',
260
486
  recordCount: "{{count}} registros",
261
487
  recordCountOne: "{{count}} registro",
@@ -267,6 +493,8 @@ const es = {
267
493
  filterRecords: "Filtrar registros",
268
494
  sort: "Ordenar",
269
495
  sortRecords: "Ordenar registros",
496
+ sortByIdSuffix: "(por ID)",
497
+ 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.",
270
498
  group: "Agrupar",
271
499
  groupBy: "Agrupar por",
272
500
  export: "Exportar",
@@ -296,6 +524,11 @@ const es = {
296
524
  recordEditingTitle: "Edición de registros",
297
525
  },
298
526
  managedByBadge: {
527
+ systemWritable: {
528
+ short: "Esquema de la plataforma",
529
+ title: "Definido por la plataforma, editable por el administrador",
530
+ body: "El esquema de este objeto lo define la plataforma, pero sus filas son suyas: puede crearlas y editarlas aquí. Quién puede escribir lo determinan la administración delegada y la seguridad a nivel de registro, no esta insignia.",
531
+ },
299
532
  config: {
300
533
  short: "Configuración",
301
534
  title: "Configuración del administrador",
@@ -318,6 +551,7 @@ const es = {
318
551
  },
319
552
  },
320
553
  kanban: {
554
+ uncategorized: "Sin categoría",
321
555
  addCard: "Añadir tarjeta",
322
556
  addColumn: "Añadir columna",
323
557
  moveCard: "Mover tarjeta",
@@ -339,12 +573,92 @@ const es = {
339
573
  },
340
574
  },
341
575
  gantt: {
576
+ viewMode: {
577
+ day: "Día",
578
+ week: "Semana",
579
+ month: "Mes",
580
+ quarter: "Trimestre",
581
+ year: "Año",
582
+ },
583
+ row: {
584
+ expand: "Expandir",
585
+ collapse: "Contraer",
586
+ open: "Abrir los detalles",
587
+ },
588
+ aria: {
589
+ taskList: "Lista de tareas",
590
+ },
591
+ tooltip: {
592
+ days: "d",
593
+ },
594
+ menu: {
595
+ view: "Ver los detalles",
596
+ edit: "Editar en línea",
597
+ delete: "Eliminar",
598
+ addPredecessor: "Añadir predecesora…",
599
+ addSuccessor: "Añadir sucesora…",
600
+ removeDependency: "Quitar la dependencia",
601
+ noCandidates: "No hay tareas disponibles",
602
+ searchTasks: "Buscar tareas…",
603
+ },
604
+ delete: {
605
+ title: "¿Eliminar esta tarea?",
606
+ body: "«{{title}}» se eliminará permanentemente. Esta acción no se puede deshacer.",
607
+ cancel: "Cancelar",
608
+ confirm: "Eliminar",
609
+ deleting: "Eliminando…",
610
+ },
611
+ drawer: {
612
+ fallbackTitle: "Detalles de la tarea",
613
+ },
614
+ linkType: {
615
+ fs: "Fin → Inicio",
616
+ ss: "Inicio → Inicio",
617
+ ff: "Fin → Fin",
618
+ sf: "Inicio → Fin",
619
+ },
620
+ conflict: {
621
+ title: "Conflicto de programación",
622
+ body: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea(s) afectada(s)?",
623
+ confirm: "Reprogramar automáticamente",
624
+ cancel: "Dejarlo como está",
625
+ },
626
+ autoScheduleDlg: {
627
+ title: "Programación automática",
628
+ body: "¿Retrasar {count} tarea(s) para respetar los vínculos de dependencia?",
629
+ skipped: "{count} tarea(s) bloqueada(s) también incumplen los vínculos y se han omitido.",
630
+ confirm: "Aplicar",
631
+ cancel: "Cancelar",
632
+ none: "Todas las dependencias se cumplen: no hay nada que reprogramar.",
633
+ },
634
+ resource: {
635
+ header: "Recurso",
636
+ peak: "Pico",
637
+ over: "sobrecargado",
638
+ empty: "No hay tareas que asignar.",
639
+ },
640
+ readOnly: "Solo lectura",
641
+ readOnlyHint: "La edición está deshabilitada en esta vista.",
642
+ lockedHint: "Sin permiso de edición",
643
+ writeFailed: "Error al guardar: el cambio se ha revertido",
342
644
  column: {
343
645
  taskName: "Nombre de tarea",
344
646
  start: "Inicio",
345
647
  end: "Fin",
346
648
  },
347
649
  toolbar: {
650
+ thisWeek: "Esta semana",
651
+ thisMonth: "Este mes",
652
+ viewMode: "Granularidad de la línea de tiempo",
653
+ enterFullscreen: "Pantalla completa",
654
+ exitFullscreen: "Salir de pantalla completa",
655
+ criticalPath: "Resaltar la ruta crítica",
656
+ autoSchedule: "Programar automáticamente las dependencias",
657
+ exportPng: "Exportar como PNG",
658
+ exportPdf: "Exportar PDF",
659
+ saveLayout: "Guardar la disposición",
660
+ undo: "Deshacer",
661
+ redo: "Rehacer",
348
662
  prevPeriod: "Período anterior",
349
663
  nextPeriod: "Período siguiente",
350
664
  zoomIn: "Acercar",
@@ -390,6 +704,9 @@ const es = {
390
704
  redo: 'Redo',
391
705
  },
392
706
  detail: {
707
+ editInlineHint: "Haga doble clic para editar",
708
+ systemActor: "Sistema",
709
+ unknownUser: "Desconocido",
393
710
  back: "Volver",
394
711
  edit: "Editar",
395
712
  editInline: "Editar",
@@ -439,6 +756,18 @@ const es = {
439
756
  attachmentCount: "{{count}} archivo adjunto",
440
757
  attachmentCountPlural: "{{count}} archivos adjuntos",
441
758
  removeAttachment: "Eliminar adjunto",
759
+ // Record Attachments panel (enable.files, objectstack#4358)
760
+ attachments: "Adjuntos",
761
+ uploadAttachment: "Subir",
762
+ loadingAttachments: "Cargando adjuntos…",
763
+ noAttachments: "Aún no hay adjuntos. Suba un archivo para empezar.",
764
+ downloadAttachment: "Descargar",
765
+ deleteAttachment: "Eliminar adjunto",
766
+ attachmentDeleteDenied: "Solo quien lo subió o alguien que pueda editar este registro puede eliminar este adjunto.",
767
+ attachmentParentAccessDenied: "No tiene acceso para adjuntar archivos a este registro.",
768
+ attachmentDownloadDenied: "No tiene acceso para descargar este adjunto.",
769
+ attachmentAuthRequired: "Inicie sesión para descargar este adjunto.",
770
+ attachmentPermissionDenied: "No tiene permiso para hacer eso.",
442
771
  unifiedDiff: "Vista unificada",
443
772
  sideBySideDiff: "Vista lado a lado",
444
773
  noChanges: "Sin cambios",
@@ -486,9 +815,15 @@ const es = {
486
815
  saving: "Guardando…",
487
816
  lockedByApproval: "Bloqueado para aprobación",
488
817
  lockedTooltip: "Este registro tiene una solicitud de aprobación pendiente; la edición está bloqueada",
818
+ writeStrippedTitle: "Algunos campos no se guardaron",
819
+ writeStrippedReadonly: "De solo lectura, por lo que no se guardó: {{fields}}",
820
+ writeStrippedByState: "No editable en el estado actual de este registro, por lo que no se guardó: {{fields}}",
821
+ approvalPendingEditable: "En aprobación · editable",
822
+ approvalPendingTooltip: "Este registro tiene una solicitud de aprobación pendiente; este paso todavía permite la edición",
489
823
  cancelApproval: "Cancelar aprobación",
490
824
  cancelApprovalInFlight: "Cancelando…",
491
825
  cancelApprovalTooltip: "Cancelar la solicitud de aprobación pendiente para desbloquear el registro",
826
+ cancelApprovalTooltipUnlocked: "Cancelar la solicitud de aprobación pendiente",
492
827
  cancelApprovalFailed: "No se pudo cancelar la aprobación",
493
828
  cancelApprovalUnavailable: "La cancelación de aprobaciones no es compatible con esta fuente de datos",
494
829
  linkCopied: "Enlace copiado al portapapeles",
@@ -604,6 +939,35 @@ const es = {
604
939
  resetZoom: "Restablecer zoom",
605
940
  },
606
941
  dashboard: {
942
+ noRows: "Sin filas",
943
+ pickMeasures: "Elija medidas (valores) para este widget de dataset.",
944
+ datasetUnsupported: "Esta fuente de datos no admite consultas de dataset.",
945
+ details: "Detalles",
946
+ exportCsv: "Exportar CSV",
947
+ openInList: "Abrir en la lista",
948
+ filters: {
949
+ label: "Filtros del panel",
950
+ dateRange: "Intervalo de fechas",
951
+ allTime: "Todo el periodo",
952
+ custom: "Personalizado…",
953
+ all: "Todo",
954
+ reset: "Restablecer",
955
+ range: {
956
+ today: "Hoy",
957
+ yesterday: "Ayer",
958
+ this_week: "Esta semana",
959
+ last_week: "La semana pasada",
960
+ this_month: "Este mes",
961
+ last_month: "El mes pasado",
962
+ this_quarter: "Este trimestre",
963
+ last_quarter: "El trimestre pasado",
964
+ this_year: "Este año",
965
+ last_year: "El año pasado",
966
+ last_7_days: "Últimos 7 días",
967
+ last_30_days: "Últimos 30 días",
968
+ last_90_days: "Últimos 90 días",
969
+ },
970
+ },
607
971
  addWidget: "Añadir widget",
608
972
  removeWidget: "Eliminar widget",
609
973
  editLayout: "Editar diseño",
@@ -731,6 +1095,7 @@ const es = {
731
1095
  navTypeGroup: "Grupo",
732
1096
  navTypeSeparator: "Separador",
733
1097
  navTypeAction: "Acción",
1098
+ navTypeComponent: "Componente",
734
1099
  navEditIcon: "Editar icono",
735
1100
  navToggleVisible: "Alternar visibilidad",
736
1101
  navHidden: "Oculto",
@@ -832,8 +1197,199 @@ const es = {
832
1197
  },
833
1198
  },
834
1199
  console: {
1200
+ settingsHub: {
1201
+ title: "Configuración",
1202
+ subtitle: "Configure su espacio de trabajo, las integraciones y los indicadores de funciones.",
1203
+ loadError: "No se pudo cargar la configuración",
1204
+ empty: "No hay configuraciones registradas. Los plugins pueden registrar manifiestos de configuración mediante el SettingsService.",
1205
+ settingsCount: "{{n}} configuraciones",
1206
+ beta: "Beta",
1207
+ categories: {
1208
+ Workspace: "Espacio de trabajo",
1209
+ Communication: "Comunicación",
1210
+ Security: "Seguridad",
1211
+ Infrastructure: "Infraestructura",
1212
+ Beta: "Beta",
1213
+ Other: "Otros",
1214
+ },
1215
+ },
1216
+ objectData: {
1217
+ badge: "Datos",
1218
+ description: "Segmento de datos definido por la URL — no vinculado a ninguna vista guardada.",
1219
+ filteredBy: "Filtrado por",
1220
+ removeFilter: "Quitar el filtro {{field}}",
1221
+ saveAsView: "Guardar como vista",
1222
+ noAccessTitle: "Acceso denegado",
1223
+ noAccess: "No tiene permiso para ver estos datos.",
1224
+ },
1225
+ identityImport: {
1226
+ policyTitle: "Configuración de inicio de sesión para los usuarios importados",
1227
+ policy: {
1228
+ auto: "Automático (recomendado)",
1229
+ invite: "Enviar invitaciones",
1230
+ temporary: "Contraseñas temporales",
1231
+ none: "Sin contraseña (solo identidad)",
1232
+ },
1233
+ policyHint: {
1234
+ auto: "Los usuarios localizables reciben una invitación (correo o SMS); quienes no sean localizables reciben una contraseña de un solo uso, mostrada UNA SOLA VEZ en la pantalla de resultados. Funciona con o sin servicio de correo/SMS.",
1235
+ invite: "Cada usuario creado recibe un correo para establecer su contraseña (o un SMS de invitación en las filas que solo tienen teléfono). Requiere un servicio de correo/SMS configurado — las filas no localizables fallan.",
1236
+ temporary: "Para despliegues sin correo/SMS: cada usuario creado recibe una contraseña de un solo uso, mostrada UNA SOLA VEZ en la pantalla de resultados. El primer inicio de sesión obliga a cambiarla.",
1237
+ none: "Los usuarios inician sesión primero con un OTP por teléfono, un enlace mágico o un enlace de restablecimiento, y luego establecen su propia contraseña.",
1238
+ },
1239
+ passwordsNote: "Contraseñas temporales — se muestran una sola vez y nunca se almacenan. Guárdelas ahora; cada usuario debe cambiar la suya en el primer inicio de sesión.",
1240
+ passwordsMore: "Se han omitido más entradas — use la descarga.",
1241
+ passwordsDownload: "Descargar CSV",
1242
+ },
1243
+ ai: {
1244
+ usage: {
1245
+ title: "Uso de IA",
1246
+ meterBuild: "Crear",
1247
+ meterAsk: "Preguntar",
1248
+ statusOk: "Queda bastante",
1249
+ statusLow: "Se está agotando",
1250
+ statusFull: "Límite alcanzado",
1251
+ resetsDaily: "Se restablece esta noche",
1252
+ resetsMonthly: "Se restablece en el próximo ciclo",
1253
+ ctaUpgrade: "Mejore el plan para continuar",
1254
+ ctaTopUp: "Añada créditos para continuar",
1255
+ ariaLabel: "Uso de IA: {{status}}",
1256
+ },
1257
+ workspaceTitle: "Espacio de trabajo de IA",
1258
+ workspaceSubtitle: "Pregunte, inspeccione y retome conversaciones",
1259
+ openChats: "Abrir chats",
1260
+ chats: "Chats",
1261
+ chatsDescription: "Explore y gestione las conversaciones con la IA.",
1262
+ share: "Compartir",
1263
+ shareTitle: "Compartir esta conversación",
1264
+ shareDisabledTitle: "Empiece a chatear para habilitar el uso compartido",
1265
+ newChat: "Nuevo",
1266
+ searchChats: "Buscar chats...",
1267
+ noChatsYet: "Todavía no hay chats",
1268
+ noChatsDescription: "Inicie una conversación nueva para verla aquí.",
1269
+ noMatchingChats: "No hay chats coincidentes.",
1270
+ newConversation: "Nueva conversación",
1271
+ renameConversation: "Cambiar el nombre de la conversación",
1272
+ deleteConversation: "Eliminar conversación",
1273
+ saveRename: "Guardar el nombre",
1274
+ cancelRename: "Cancelar el cambio de nombre",
1275
+ loadingHistory: "Cargando el historial de la conversación...",
1276
+ conversationReady: "Conversación lista",
1277
+ preparingConversation: "Preparando una nueva conversación",
1278
+ offlineDemoMode: "Modo de demostración sin conexión — lista de agentes no disponible",
1279
+ sendFailedRateLimited: "Está enviando mensajes demasiado rápido. Su mensaje se conserva abajo — espere un momento y vuelva a intentarlo.",
1280
+ sendFailedGeneric: "No se pudo enviar su mensaje. Se conserva abajo — inténtelo de nuevo.",
1281
+ askAgent: "Pregunte a {{agent}}...",
1282
+ assistant: "Asistente",
1283
+ liveCanvas: "Vista previa en vivo — {{app}} (borrador)",
1284
+ liveCanvasUnlisted: "Aplicación en vivo — {{app}} (no listada hasta su publicación)",
1285
+ loadingAgents: "Cargando agentes...",
1286
+ askAnything: "Pregunte lo que quiera...",
1287
+ emptyTitle: "Iniciar una conversación",
1288
+ emptyDescription: "Pregunte lo que quiera — el asistente tiene acceso al contexto de su aplicación actual.",
1289
+ switchAssistant: "Cambiar de asistente",
1290
+ chooseAgent: "Elegir asistente…",
1291
+ empty: {
1292
+ build: {
1293
+ title: "Crear con IA",
1294
+ description: "Describa una aplicación o un flujo de trabajo en lenguaje natural — yo redacto los objetos, las pantallas y las automatizaciones, y luego usted revisa y publica.",
1295
+ },
1296
+ ask: {
1297
+ title: "Pregunte a sus datos",
1298
+ description: "Haga preguntas sobre sus registros — recuentos, listas y resúmenes de los datos a los que tiene acceso.",
1299
+ },
1300
+ editApp: {
1301
+ title: "Editando «{{app}}»",
1302
+ titleGeneric: "Editar esta aplicación",
1303
+ description: "¿Qué desea cambiar? Modifico esta aplicación sobre la marcha — añadir un campo, un objeto, una vista o una automatización, o ajustar lo que ya existe.",
1304
+ },
1305
+ },
1306
+ clearConversation: "Borrar",
1307
+ sendHint: "para enviar",
1308
+ agentActivity: "Actividad del agente",
1309
+ toolCompleted: "Completado",
1310
+ toolRunning: "En ejecución",
1311
+ toolAwaitingApproval: "Esperando aprobación",
1312
+ toolFailed: "Error",
1313
+ toolDetailsHidden: "Las entradas de las herramientas y los resultados sin procesar están ocultos en esta vista.",
1314
+ copy: "Copiar",
1315
+ copied: "Copiado",
1316
+ regenerate: "Regenerar",
1317
+ model: "Modelo",
1318
+ submit: "Enviar",
1319
+ uploadFiles: "Subir archivos",
1320
+ stopResponse: "Detener la respuesta",
1321
+ trace: "traza",
1322
+ viewTrace: "Ver la traza",
1323
+ nextSteps: "Qué sigue",
1324
+ publishDrafts: "Publicar",
1325
+ publishOk: "Publicado — los objetos ya están activos.",
1326
+ seedWarn: "Publicado, pero no se pudieron cargar algunos datos de ejemplo.",
1327
+ openBuiltApp: "Abrir la aplicación",
1328
+ designBuiltApp: "Diseñar en Studio",
1329
+ previewDraft: "Vista previa",
1330
+ previewApp: "Vista previa de la aplicación",
1331
+ resizeSplit: "Redimensionar el chat y la vista previa",
1332
+ hideChats: "Ocultar los chats",
1333
+ showChats: "Mostrar los chats",
1334
+ planTitle: "Plan propuesto",
1335
+ planQuestions: "Confirmar antes de crear",
1336
+ planAssumptions: "Supuestos",
1337
+ planApproveHint: "Responda para aprobar o ajustar este plan.",
1338
+ planApprove: "Crearlo",
1339
+ planAdjust: "Ajustar",
1340
+ justNow: "ahora mismo",
1341
+ minutesAgo: "hace {{count}} min",
1342
+ hoursAgo: "hace {{count}} h",
1343
+ daysAgo: "hace {{count}} d",
1344
+ agentLabels: {
1345
+ ask: "Preguntar",
1346
+ build: "Crear",
1347
+ dataChat: "Asistente",
1348
+ metadataAssistant: "Asistente de metadatos",
1349
+ },
1350
+ suggestions: {
1351
+ dataChat: {
1352
+ userCount: "¿Cuántos usuarios hay en el sistema? Enumera sus correos electrónicos.",
1353
+ recentRecords: "Enumera los 5 registros creados más recientemente.",
1354
+ recordCounts: "Cuenta los registros de cada objeto.",
1355
+ },
1356
+ metadataAssistant: {
1357
+ buildCrm: "Crea un CRM de ventas — clientes, contactos y un embudo de oportunidades que pueda totalizar por etapa.",
1358
+ buildApp: "Crea un seguimiento de proyectos — proyectos, tareas con responsables y fechas de vencimiento, y un tablero por estado.",
1359
+ buildFlow: "Diseña una mesa de ayuda — tickets con prioridad, un flujo de estados y vínculos con los clientes.",
1360
+ buildInventory: "Crea una aplicación de inventario — productos, niveles de stock, proveedores y visibilidad de stock bajo.",
1361
+ buildRecruiting: "Crea un seguimiento de candidaturas — candidatos, vacantes, etapas de entrevista y notas.",
1362
+ },
1363
+ generic: {
1364
+ help: "¿En qué puedes ayudarme?",
1365
+ availableObjects: "Enumera los objetos de datos disponibles.",
1366
+ recentActivity: "Resume mi actividad reciente.",
1367
+ },
1368
+ editApp: {
1369
+ addField: "Añade un campo a uno de los objetos.",
1370
+ addObject: "Añade un objeto nuevo y relaciónalo con uno existente.",
1371
+ addDashboard: "Añade un panel para las métricas clave.",
1372
+ addAutomation: "Añade una automatización — una aprobación, un flujo de estados o una notificación.",
1373
+ },
1374
+ },
1375
+ changesTitle: "Confirmar cambios",
1376
+ changesConfirmed: "Confirmado",
1377
+ changesConfirm: "Confirmar",
1378
+ changesConfirmHint: "Responda para confirmar o ajustar este cambio.",
1379
+ changeVerb: {
1380
+ createObject: "Crear objeto",
1381
+ addField: "Añadir campo",
1382
+ modifyField: "Modificar campo",
1383
+ deleteField: "Eliminar campo",
1384
+ createMetadata: "Crear",
1385
+ updateMetadata: "Modificar",
1386
+ createSeed: "Generar datos de ejemplo",
1387
+ createPackage: "Crear paquete de aplicación",
1388
+ },
1389
+ },
835
1390
  title: "Consola ObjectStack",
836
1391
  initializing: "Inicializando aplicación...",
1392
+ loadingHint: "Configurar un entorno nuevo puede tardar unos momentos.",
837
1393
  breadcrumb: {
838
1394
  dashboards: "Paneles",
839
1395
  pages: "Páginas",
@@ -875,6 +1431,7 @@ const es = {
875
1431
  toggleDarkMode: "Alternar modo oscuro",
876
1432
  },
877
1433
  commandPalette: {
1434
+ title: "Paleta de comandos",
878
1435
  placeholder: "Escriba un comando o busque...",
879
1436
  noResults: "No se encontraron resultados.",
880
1437
  objects: "Objetos",
@@ -908,6 +1465,14 @@ const es = {
908
1465
  system: "Sistema",
909
1466
  },
910
1467
  objectView: {
1468
+ viewTypeTree: "Árbol",
1469
+ viewTypeTreeDesc: "Anida los registros autorreferenciados en una jerarquía mediante un campo principal.",
1470
+ parentField: "Campo principal",
1471
+ parentFieldHelp: "El campo que apunta al registro principal (mismo objeto) y define la jerarquía. Solo son válidos los campos autorreferenciados.",
1472
+ viewName: "Nombre",
1473
+ viewNameHelp: "Clave técnica (snake_case). Se rellena automáticamente a partir del título — edítela si lo desea.",
1474
+ viewNameRequired: "Introduzca una clave (minúsculas, números, guion bajo). No se rellena automáticamente con títulos no latinos.",
1475
+ viewNameInvalid: "Use minúsculas, números y guiones bajos; empiece por una letra o un guion bajo.",
911
1476
  systemViewReadonly: 'System view defined in code - duplicate to customize.',
912
1477
  expandToPage: 'Open as full page',
913
1478
  objectNotFound: "Objeto no encontrado",
@@ -1121,7 +1686,28 @@ const es = {
1121
1686
  },
1122
1687
  },
1123
1688
  auth: {
1689
+ setPassword: {
1690
+ title: "Establecer una contraseña de recuperación",
1691
+ description: "Ha iniciado sesión mediante inicio de sesión único. Establezca una contraseña local para poder seguir accediendo directamente a este entorno si el SSO deja de estar disponible.",
1692
+ email: "Correo electrónico",
1693
+ newPassword: "Nueva contraseña",
1694
+ confirmPassword: "Confirmar la contraseña",
1695
+ submit: "Establecer la contraseña",
1696
+ submitting: "Guardando…",
1697
+ success: "Contraseña local establecida",
1698
+ failed: "No se pudo establecer la contraseña",
1699
+ passwordsMismatch: "Las contraseñas no coinciden",
1700
+ noSession: "Su sesión ha caducado.",
1701
+ backToSignIn: "Volver a iniciar sesión",
1702
+ },
1124
1703
  login: {
1704
+ signingIn: "Iniciando sesión…",
1705
+ ssoHandoff: "Continuar a {{target}}",
1706
+ devAdminHint: {
1707
+ title: "Instancia de desarrollo",
1708
+ body: "Inicie sesión con el administrador de desarrollo predefinido:",
1709
+ dismiss: "Descartar",
1710
+ },
1125
1711
  title: "Inicia sesión en tu cuenta",
1126
1712
  description: "Ingresa tu correo electrónico y contraseña para continuar",
1127
1713
  emailLabel: "Correo electrónico",
@@ -1134,6 +1720,7 @@ const es = {
1134
1720
  noAccountText: "¿No tienes una cuenta?",
1135
1721
  signUpText: "Regístrate",
1136
1722
  errors: {
1723
+ oauthCallbackFailed: "No se pudo completar el inicio de sesión único: el enlace de acceso caducó o ya se había utilizado. Vuelva a intentarlo.",
1137
1724
  invalidCredentials: "Correo o contraseña inválidos. Inténtelo de nuevo.",
1138
1725
  emailNotVerified: "Verifique su correo electrónico antes de iniciar sesión.",
1139
1726
  },
@@ -1259,6 +1846,40 @@ const es = {
1259
1846
  shell: {
1260
1847
  tenantHostHint: "Está iniciando sesión en este espacio de trabajo",
1261
1848
  },
1849
+ layout: {
1850
+ headline: "Cree aplicaciones empresariales potentes, más rápido.",
1851
+ subhead: "La plataforma universal para la gestión de datos empresariales, los flujos de trabajo y la analítica.",
1852
+ },
1853
+ remediation: {
1854
+ signOut: "Cerrar sesión en su lugar",
1855
+ password: {
1856
+ title: "Su contraseña ha caducado",
1857
+ fallbackMessage: "Establezca una nueva contraseña para continuar.",
1858
+ current: "Contraseña actual",
1859
+ next: "Nueva contraseña",
1860
+ confirm: "Confirmar nueva contraseña",
1861
+ submit: "Cambiar contraseña y continuar",
1862
+ submitting: "Actualizando…",
1863
+ mismatch: "Las nuevas contraseñas no coinciden.",
1864
+ failed: "No se pudo cambiar la contraseña.",
1865
+ },
1866
+ mfa: {
1867
+ title: "Configurar la autenticación en dos pasos",
1868
+ fallbackMessage: "Su organización requiere una aplicación de autenticación para continuar.",
1869
+ confirmPassword: "Confirme su contraseña",
1870
+ continue: "Continuar",
1871
+ preparing: "Preparando…",
1872
+ enrollFailed: "No se pudo iniciar el registro.",
1873
+ scanTitle: "Escanee con su aplicación de autenticación",
1874
+ scanBody: "Escanee este código QR con Google Authenticator, 1Password, Authy, etc., y luego introduzca el código de 6 dígitos.",
1875
+ backupTitle: "Guarde sus códigos de respaldo",
1876
+ backupBody: "Guárdelos en un lugar seguro: cada uno puede usarse una vez si pierde su dispositivo.",
1877
+ codeLabel: "Código de 6 dígitos",
1878
+ verify: "Verificar y continuar",
1879
+ verifying: "Verificando…",
1880
+ invalidCode: "Código no válido. Inténtelo de nuevo.",
1881
+ },
1882
+ },
1262
1883
  },
1263
1884
  profile: {
1264
1885
  title: "Perfil",
@@ -1323,11 +1944,15 @@ const es = {
1323
1944
  settings: "Configuración del espacio de trabajo",
1324
1945
  },
1325
1946
  help: {
1947
+ onThisPage: "En esta página",
1948
+ keyboardShortcuts: "Atajos de teclado",
1326
1949
  appDocs: 'Documentación de esta app',
1327
1950
  allDocs: 'Toda la documentación',
1328
1951
  onlineDocs: 'Documentación en línea',
1329
1952
  },
1330
1953
  sidebar: {
1954
+ packageManagement: "Gestión de paquetes",
1955
+ searchNavigation: "Buscar en la navegación...",
1331
1956
  settings: "Configuración",
1332
1957
  help: "Ayuda",
1333
1958
  helpTooltip: "Ayuda y documentación",
@@ -1344,14 +1969,66 @@ const es = {
1344
1969
  removeFromFavorites: "Quitar {{name}} de favoritos",
1345
1970
  },
1346
1971
  topbar: {
1972
+ openAssistant: "Abrir el asistente {{name}}",
1973
+ offline: "Sin conexión",
1974
+ usersOnline: "Usuarios conectados ahora mismo",
1975
+ switchView: "Cambiar de vista",
1976
+ switchObject: "Cambiar de objeto",
1977
+ connection: {
1978
+ connected: "Conectado",
1979
+ connecting: "Conectando...",
1980
+ reconnecting: "Reconectando...",
1981
+ disconnected: "Desconectado",
1982
+ error: "Error de conexión",
1983
+ },
1984
+ stage: {
1985
+ preview: "Vista previa",
1986
+ beta: "Beta",
1987
+ tooltip: "Esta plataforma está en versión preliminar — las funciones pueden cambiar.",
1988
+ },
1347
1989
  aiAssistant: "Asistente de IA",
1348
1990
  designInStudio: "Diseñar en Studio",
1349
1991
  },
1350
1992
  home: {
1993
+ build: {
1994
+ title: "Crear una aplicación",
1995
+ subtitle: "Empiece desde cero — diseñe objetos, formularios, automatizaciones e interfaces.",
1996
+ },
1997
+ template: {
1998
+ title: "Empezar con una plantilla",
1999
+ subtitle: "Instale una aplicación de plantilla desde el mercado y personalícela.",
2000
+ },
2001
+ 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.",
2002
+ 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.",
2003
+ welcomeAdminDescriptionNoAi: "Configure su primera aplicación desde el menú de Administración de la izquierda.",
2004
+ noAppsTitle: "Todavía no hay aplicaciones",
2005
+ noAppsDescription: "Su espacio de trabajo se está preparando — las aplicaciones que su administrador comparta aparecerán aquí.",
2006
+ buildWithAI: "Crear con IA",
2007
+ askAI: "Preguntar a la IA",
2008
+ recoveryReminder: {
2009
+ message: "Establezca una contraseña de recuperación para poder iniciar sesión aunque el inicio de sesión único no esté disponible.",
2010
+ cta: "Establecer contraseña",
2011
+ dismiss: "Descartar",
2012
+ },
2013
+ pendingDrafts: {
2014
+ message: "Tiene {{count}} cambio(s) sin publicar — publíquelos para activarlos.",
2015
+ cta: "Publicar",
2016
+ publishing: "Publicando…",
2017
+ published: "¡Publicado! Sus cambios están activos.",
2018
+ publishFailed: "Error al publicar",
2019
+ },
1351
2020
  title: "Inicio",
1352
2021
  subtitle: "Panel de tu espacio de trabajo",
1353
2022
  nav: "Inicio",
1354
2023
  allApps: "Todas las aplicaciones",
2024
+ yourApps: "Tus aplicaciones",
2025
+ showMoreApps: "Más",
2026
+ showLess: "Mostrar menos",
2027
+ continueEmpty: "Los elementos que abras aparecerán aquí.",
2028
+ actionCenter: {
2029
+ title: "Requiere tu atención",
2030
+ empty: "Estás al día",
2031
+ },
1355
2032
  loading: "Cargando espacio de trabajo...",
1356
2033
  recent: "Recientes",
1357
2034
  starred: "Destacados",
@@ -1403,7 +2080,21 @@ const es = {
1403
2080
  },
1404
2081
  },
1405
2082
  layout: {
2083
+ systemNav: {
2084
+ systemSettings: "Configuración del sistema",
2085
+ applications: "Aplicaciones",
2086
+ appMarketplace: "Mercado de aplicaciones",
2087
+ objectManager: "Gestor de objetos",
2088
+ users: "Usuarios",
2089
+ organizations: "Organizaciones",
2090
+ roles: "Roles",
2091
+ configuration: "Configuración",
2092
+ createApp: "Crear aplicación",
2093
+ },
1406
2094
  appSwitcher: {
2095
+ switchApplication: "Cambiar de aplicación",
2096
+ appsAvailable: "{{count}} aplicaciones disponibles",
2097
+ editNavigation: "Editar la navegación",
1407
2098
  home: "Inicio",
1408
2099
  addApp: "Agregar aplicación",
1409
2100
  editApp: "Editar aplicación",
@@ -1493,10 +2184,11 @@ const es = {
1493
2184
  requiredError: "{{label}} es obligatorio",
1494
2185
  cancel: "Cancelar",
1495
2186
  confirm: "Confirmar",
2187
+ uploading: "Subiendo…",
1496
2188
  defaultActionTitle: "Acción",
1497
2189
  ok: "Aceptar",
1498
- lookupPlaceholder: "Pegar ID de registro (UUID) para {{label}}",
1499
- lookupHelpText: "Ingrese el ID del registro del objeto referenciado. Pronto se añadirá un selector.",
2190
+ lookupPlaceholder: "ID de registro para {{label}}",
2191
+ lookupHelpText: "Este parámetro no tiene un objeto de referencia configurado, por lo que el selector de registros no está disponible. Ingrese un ID de registro o pida a un administrador que corrija el parámetro de la acción.",
1500
2192
  },
1501
2193
  actionConfirm: {
1502
2194
  title: "Confirmar acción",
@@ -1521,6 +2213,8 @@ const es = {
1521
2213
  updateFailed: "No se pudo actualizar la navegación",
1522
2214
  },
1523
2215
  objectActions: {
2216
+ resetPackageSetConfirm: "Este conjunto de permisos viene con un paquete instalado y no se puede eliminar. Al eliminarlo se restablece a la versión original del paquete y se descartan sus personalizaciones en este entorno. ¿Continuar?",
2217
+ resetPackageSetSuccess: "Conjunto de permisos restablecido a la versión original del paquete",
1524
2218
  deleteSuccess: "{{label}} eliminado correctamente",
1525
2219
  deleteFailed: "No se pudo eliminar {{label}}",
1526
2220
  noRecordId: "No se proporcionó ID de registro",
@@ -1685,6 +2379,7 @@ const es = {
1685
2379
  },
1686
2380
  },
1687
2381
  organizations: {
2382
+ create: "Crear espacio de trabajo",
1688
2383
  mine: "Mis organizaciones",
1689
2384
  title: "Organizaciones",
1690
2385
  heading: "Tus organizaciones",
@@ -1698,6 +2393,11 @@ const es = {
1698
2393
  noMatches: "Ninguna organización coincide con tu búsqueda.",
1699
2394
  },
1700
2395
  notifications: {
2396
+ regionLabel: "Notificaciones",
2397
+ groupCount: "{{count}} notificaciones",
2398
+ groupUnread: "{{count}} sin leer",
2399
+ groupMarkRead: "Marcar como leídas",
2400
+ groupMarkReadTitle: "Marcar como leídas todas las de este tipo",
1701
2401
  empty: "Sin notificaciones",
1702
2402
  markAllRead: "Marcar todo como leído",
1703
2403
  viewAll: "Ver todas las notificaciones",
@@ -1816,7 +2516,103 @@ const es = {
1816
2516
  done: 'Listo — ocultar',
1817
2517
  },
1818
2518
  },
2519
+ excelImport: {
2520
+ noImportableFields: "Ese objeto no tiene campos importables.",
2521
+ schemaReadFailed: "No se pudo leer el esquema del objeto.",
2522
+ imported: "Se importaron {{count}} fila(s) en {{object}}.",
2523
+ importFrom: "Importar las filas reales desde",
2524
+ into: "a",
2525
+ opening: "Abriendo…",
2526
+ importAction: "Importar",
2527
+ dismiss: "Descartar",
2528
+ },
2529
+ cloudOnboarding: {
2530
+ hintCreate: "Cree su primer entorno: un espacio de trabajo privado con su propia URL, base de datos y plan. La creación de aplicaciones ocurre dentro de él.",
2531
+ hintReady: "Su entorno de producción está listo. Ábralo para crear y ejecutar sus aplicaciones: todo ocurre dentro del entorno.",
2532
+ createEnvironment: "Cree su entorno",
2533
+ openProduction: "Abrir producción",
2534
+ manageEnvironments: "Gestionar entornos",
2535
+ },
2536
+ aiModelStatus: {
2537
+ summary: "Crear / Preguntar usa {{conversational}} ({{conversationalSource}}); estructurado usa {{structured}} ({{structuredSource}}).",
2538
+ summaryRouting: "Política de enrutamiento: planes gratuitos → {{free}}, planes de pago → {{paid}}.",
2539
+ modelUnknown: "desconocido",
2540
+ sourceUnknown: "no informado por el adaptador",
2541
+ rowConversational: "Modelo Build / Ask",
2542
+ rowStructured: "Estructurado (blueprint / seed)",
2543
+ rowReasoning: "Esfuerzo de razonamiento",
2544
+ readFailed: "No se pudo leer el modelo de IA efectivo. Puede que este entorno no ejecute un servicio de IA o que no tenga el permiso ai:read.",
2545
+ readFailedWithStatus: "No se pudo leer el modelo de IA efectivo (HTTP {{status}}). Puede que este entorno no ejecute un servicio de IA o que no tenga el permiso ai:read.",
2546
+ overridesInEffect: "Anulaciones vigentes: ",
2547
+ noOverrides: "ninguna: se usan los valores predeterminados del código desplegado.",
2548
+ adapter: "Adaptador: ",
2549
+ sourceCodeDefault: "valor predeterminado del código (sin anulación env)",
2550
+ sourceInherits: "igual que build/ask",
2551
+ sourcePinned: "fijado por {{source}}",
2552
+ },
2553
+ chatbotError: {
2554
+ title: "Error en la respuesta",
2555
+ fallbackDetail: "Algo salió mal. Vuelva a intentarlo.",
2556
+ details: "Detalles",
2557
+ hide: "Ocultar",
2558
+ retry: "Reintentar",
2559
+ },
2560
+ chatbotQuota: {
2561
+ title: "Se requiere actualizar",
2562
+ fallbackMessage: "Ha alcanzado su cuota de IA.",
2563
+ buyCredits: "Comprar un paquete de créditos",
2564
+ upgradePlan: "Mejorar el plan",
2565
+ },
2566
+ environment: {
2567
+ addEnvironment: "Añadir entorno",
2568
+ setUpProduction: "Configure su entorno de producción",
2569
+ addDevelopment: "Añadir entorno de desarrollo",
2570
+ },
2571
+ cloudConnection: {
2572
+ checking: "Comprobando la conexión…",
2573
+ retry: "Reintentar",
2574
+ errors: {
2575
+ expired: "La solicitud caducó antes de ser aprobada. Vuelva a empezar.",
2576
+ bindFailed: "Error al vincular.",
2577
+ deviceCodeFailed: "Error en la solicitud del código de dispositivo.",
2578
+ },
2579
+ waiting: {
2580
+ popupOpened: "Apruebe la conexión en la ventana que acaba de abrirse: esta página se actualiza sola.",
2581
+ polling: "Esperando la aprobación en la consola de la nube…",
2582
+ openApproval: "Abrir la página de aprobación",
2583
+ copy: "Copiar",
2584
+ copied: "Copiado",
2585
+ codePrefilled: "El código ya está rellenado en la página de aprobación.",
2586
+ openItHere: "¿No apareció la ventana? Ábrala aquí",
2587
+ cancel: "Cancelar",
2588
+ },
2589
+ bound: {
2590
+ title: "Conectado a ObjectStack Cloud",
2591
+ runtime: "Runtime",
2592
+ organization: "Organización",
2593
+ approvedBy: "Aprobado por",
2594
+ runtimeId: "ID del runtime",
2595
+ environment: "Entorno",
2596
+ since: "Desde",
2597
+ privatePackages: "Los paquetes privados de su organización ya aparecen en el Marketplace en «Su organización».",
2598
+ disconnect: "Desconectar",
2599
+ },
2600
+ unbound: {
2601
+ title: "No conectado",
2602
+ body: "Conecte este runtime a un plano de control de ObjectStack para explorar los paquetes privados de su organización e instalarlos aquí. La aprobación es un solo clic en su cuenta de la nube: no se escriben identificadores ni credenciales en esta página.",
2603
+ connect: "Conectar",
2604
+ },
2605
+ },
1819
2606
  marketplace: {
2607
+ suggestedBindings: {
2608
+ promptEveryone: "Esta aplicación sugiere conceder «{{set}}» a todos los usuarios con sesión iniciada (la posición Everyone).",
2609
+ promptGuest: "Esta aplicación sugiere conceder «{{set}}» a los visitantes no autenticados (la posición Guest).",
2610
+ confirm: "Conceder",
2611
+ confirming: "Concediendo…",
2612
+ dismiss: "Descartar",
2613
+ confirmedToast: "«{{set}}» ya está concedido a {{anchor}}.",
2614
+ dismissedToast: "Sugerencia para «{{set}}» descartada.",
2615
+ },
1820
2616
  title: "Marketplace de aplicaciones",
1821
2617
  subtitle: "Explore aplicaciones aprobadas publicadas en el catálogo de ObjectStack. Haga clic en una aplicación para ver detalles e instalarla en uno de sus entornos.",
1822
2618
  searchPlaceholder: "Buscar aplicaciones por nombre o ID de manifiesto…",
@@ -1868,6 +2664,7 @@ const es = {
1868
2664
  updateAvailable: 'Actualización disponible',
1869
2665
  },
1870
2666
  action: {
2667
+ installed: "Instalada",
1871
2668
  install: "Instalar",
1872
2669
  reinstall: "Reinstalar",
1873
2670
  working: "Procesando…",
@@ -1938,6 +2735,14 @@ const es = {
1938
2735
  yearsAgo: "hace {{count}} años",
1939
2736
  },
1940
2737
  },
2738
+ approvals: {
2739
+ approve: 'Aprobar',
2740
+ reject: 'Rechazar',
2741
+ comment: 'Comentario (opcional)',
2742
+ approveSuccess: 'Aprobado',
2743
+ rejectSuccess: 'Rechazado',
2744
+ rejectConfirm: '¿Rechazar esta solicitud de aprobación?',
2745
+ },
1941
2746
  approvalsInbox: {
1942
2747
  loadMore: 'Cargar más',
1943
2748
  loadingMore: 'Cargando…',
@@ -1962,13 +2767,28 @@ const es = {
1962
2767
  slaRemaining: 'SLA: quedan {{dur}}',
1963
2768
  slaOverdue: 'SLA vencido {{dur}}',
1964
2769
  actReassign: 'Reasignada',
2770
+ reassignFromTo: 'de {{from}} a {{to}}',
1965
2771
  actRemind: 'Recordatorio',
1966
2772
  actRequestInfo: 'Pidió más información',
1967
2773
  actComment: 'Comentó',
1968
2774
  stepProgress: 'Pasos de aprobación',
1969
2775
  prevRequest: 'Anterior',
1970
2776
  nextRequest: 'Siguiente',
1971
- positionOf: '{{index}} de {{total}}',
2777
+ positionOf: 'Solicitud {{index}} de {{total}}',
2778
+ progressApprovals: 'Aprobaciones — {{got}} de {{need}}',
2779
+ progressGroups: 'Progreso de firmas — {{got}} de {{need}} grupos',
2780
+ progressEligible: '{{count}} aprobador(es) elegible(s)',
2781
+ progressBar: 'Progreso de la decisión',
2782
+ declaredActions: 'Acciones',
2783
+ attachmentChip: 'Adjunto',
2784
+ attachmentOpenFailed: 'No se pudo abrir el archivo adjunto: inténtalo de nuevo',
2785
+ approveOneTitle: '¿Aprobar «{{title}}»?',
2786
+ approveOneBody: 'Esto aprueba la solicitud con tu identidad. Para añadir un comentario o un adjunto, abre la solicitud.',
2787
+ flowOrigin: 'Iniciada por flujo',
2788
+ sortBy: 'Ordenar',
2789
+ sortRecent: 'Más recientes primero',
2790
+ sortOldest: 'Más antiguas primero',
2791
+ sortAmount: 'Importe (mayor→menor)',
1972
2792
  quickPhrase1: 'Aprobada: cumple los requisitos.',
1973
2793
  quickPhrase2: 'Aprobada con condiciones: supervisar la ejecución.',
1974
2794
  quickPhrase3: 'Añade documentación de apoyo y vuelve a enviarla.',
@@ -2097,6 +2917,10 @@ const es = {
2097
2917
  retry: 'Reintentar',
2098
2918
  },
2099
2919
  draftBar: {
2920
+ messageClean: "Vista previa del borrador: no hay cambios sin publicar; todo lo que ve aquí ya está activo.",
2921
+ sampleDataTitle: "Los datos de ejemplo aparecen tras publicar",
2922
+ sampleDataBody: "Está viendo la estructura de su aplicación. Publíquela para cargar registros de ejemplo y activarla.",
2923
+ publishCta: "Publicar para verlo activo",
2100
2924
  message: 'Vista previa de borrador — estás viendo cambios sin publicar. Nada está en producción hasta que publiques.',
2101
2925
  publish: 'Publicar',
2102
2926
  publishing: 'Publicando…',