@object-ui/i18n 16.1.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,6 +83,10 @@ 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
91
  defaultTitle: 'Guarda este valor ahora',
79
92
  acknowledge: 'Lo he guardado',
@@ -94,6 +107,16 @@ const es = {
94
107
  type: "{{field}} debe ser un {{type}} válido",
95
108
  },
96
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",
97
120
  addItem: "Añadir elemento",
98
121
  removeItem: "Eliminar elemento",
99
122
  fieldRequired: "Este campo es obligatorio",
@@ -104,8 +127,6 @@ const es = {
104
127
  stepOf: "Paso {{current}} de {{total}}",
105
128
  createTitle: "Crear {{object}}",
106
129
  editTitle: "Editar {{object}}",
107
- createDescription: "Agregar un nuevo {{object}} a su base de datos.",
108
- editDescription: "Actualizar detalles de {{object}}",
109
130
  saveRecord: "Guardar registro",
110
131
  create: "Crear",
111
132
  update: "Actualizar",
@@ -114,14 +135,70 @@ const es = {
114
135
  deleteSuccess: "{{object}} eliminado",
115
136
  },
116
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
+ },
117
151
  relativeDate: {
118
152
  overdue: "Atrasado {{count}} d",
119
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
+ },
120
170
  richText: {
121
171
  format: "Formato: {{format}}",
122
172
  basicEditorHint: "Editor de texto enriquecido (básico)",
123
173
  placeholder: "Escribe algo...",
124
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
+ },
125
202
  },
126
203
  table: {
127
204
  rowsPerPage: "Filas por página",
@@ -156,6 +233,37 @@ const es = {
156
233
  delete: "Eliminar",
157
234
  },
158
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
+ },
159
267
  actions: "Acciones",
160
268
  edit: "Editar",
161
269
  delete: "Eliminar",
@@ -181,7 +289,88 @@ const es = {
181
289
  densityCycleShortHint: "Clic para cambiar",
182
290
  },
183
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).",
184
372
  title: "Importar {{object}}",
373
+ notAllowed: "Este objeto no está habilitado para la importación.",
185
374
  stepUpload: "Cargar",
186
375
  stepMapping: "Asignación",
187
376
  stepPreview: "Vista previa",
@@ -257,6 +446,42 @@ const es = {
257
446
  moreEvents: "+{{count}} más",
258
447
  },
259
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",
260
485
  loading: 'Loading records...',
261
486
  recordCount: "{{count}} registros",
262
487
  recordCountOne: "{{count}} registro",
@@ -268,6 +493,8 @@ const es = {
268
493
  filterRecords: "Filtrar registros",
269
494
  sort: "Ordenar",
270
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.",
271
498
  group: "Agrupar",
272
499
  groupBy: "Agrupar por",
273
500
  export: "Exportar",
@@ -297,6 +524,11 @@ const es = {
297
524
  recordEditingTitle: "Edición de registros",
298
525
  },
299
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
+ },
300
532
  config: {
301
533
  short: "Configuración",
302
534
  title: "Configuración del administrador",
@@ -319,6 +551,7 @@ const es = {
319
551
  },
320
552
  },
321
553
  kanban: {
554
+ uncategorized: "Sin categoría",
322
555
  addCard: "Añadir tarjeta",
323
556
  addColumn: "Añadir columna",
324
557
  moveCard: "Mover tarjeta",
@@ -340,12 +573,92 @@ const es = {
340
573
  },
341
574
  },
342
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",
343
644
  column: {
344
645
  taskName: "Nombre de tarea",
345
646
  start: "Inicio",
346
647
  end: "Fin",
347
648
  },
348
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",
349
662
  prevPeriod: "Período anterior",
350
663
  nextPeriod: "Período siguiente",
351
664
  zoomIn: "Acercar",
@@ -391,6 +704,9 @@ const es = {
391
704
  redo: 'Redo',
392
705
  },
393
706
  detail: {
707
+ editInlineHint: "Haga doble clic para editar",
708
+ systemActor: "Sistema",
709
+ unknownUser: "Desconocido",
394
710
  back: "Volver",
395
711
  edit: "Editar",
396
712
  editInline: "Editar",
@@ -440,6 +756,18 @@ const es = {
440
756
  attachmentCount: "{{count}} archivo adjunto",
441
757
  attachmentCountPlural: "{{count}} archivos adjuntos",
442
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.",
443
771
  unifiedDiff: "Vista unificada",
444
772
  sideBySideDiff: "Vista lado a lado",
445
773
  noChanges: "Sin cambios",
@@ -487,9 +815,15 @@ const es = {
487
815
  saving: "Guardando…",
488
816
  lockedByApproval: "Bloqueado para aprobación",
489
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",
490
823
  cancelApproval: "Cancelar aprobación",
491
824
  cancelApprovalInFlight: "Cancelando…",
492
825
  cancelApprovalTooltip: "Cancelar la solicitud de aprobación pendiente para desbloquear el registro",
826
+ cancelApprovalTooltipUnlocked: "Cancelar la solicitud de aprobación pendiente",
493
827
  cancelApprovalFailed: "No se pudo cancelar la aprobación",
494
828
  cancelApprovalUnavailable: "La cancelación de aprobaciones no es compatible con esta fuente de datos",
495
829
  linkCopied: "Enlace copiado al portapapeles",
@@ -605,6 +939,35 @@ const es = {
605
939
  resetZoom: "Restablecer zoom",
606
940
  },
607
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
+ },
608
971
  addWidget: "Añadir widget",
609
972
  removeWidget: "Eliminar widget",
610
973
  editLayout: "Editar diseño",
@@ -732,6 +1095,7 @@ const es = {
732
1095
  navTypeGroup: "Grupo",
733
1096
  navTypeSeparator: "Separador",
734
1097
  navTypeAction: "Acción",
1098
+ navTypeComponent: "Componente",
735
1099
  navEditIcon: "Editar icono",
736
1100
  navToggleVisible: "Alternar visibilidad",
737
1101
  navHidden: "Oculto",
@@ -833,8 +1197,199 @@ const es = {
833
1197
  },
834
1198
  },
835
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
+ },
836
1390
  title: "Consola ObjectStack",
837
1391
  initializing: "Inicializando aplicación...",
1392
+ loadingHint: "Configurar un entorno nuevo puede tardar unos momentos.",
838
1393
  breadcrumb: {
839
1394
  dashboards: "Paneles",
840
1395
  pages: "Páginas",
@@ -876,6 +1431,7 @@ const es = {
876
1431
  toggleDarkMode: "Alternar modo oscuro",
877
1432
  },
878
1433
  commandPalette: {
1434
+ title: "Paleta de comandos",
879
1435
  placeholder: "Escriba un comando o busque...",
880
1436
  noResults: "No se encontraron resultados.",
881
1437
  objects: "Objetos",
@@ -909,6 +1465,14 @@ const es = {
909
1465
  system: "Sistema",
910
1466
  },
911
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.",
912
1476
  systemViewReadonly: 'System view defined in code - duplicate to customize.',
913
1477
  expandToPage: 'Open as full page',
914
1478
  objectNotFound: "Objeto no encontrado",
@@ -1122,7 +1686,28 @@ const es = {
1122
1686
  },
1123
1687
  },
1124
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
+ },
1125
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
+ },
1126
1711
  title: "Inicia sesión en tu cuenta",
1127
1712
  description: "Ingresa tu correo electrónico y contraseña para continuar",
1128
1713
  emailLabel: "Correo electrónico",
@@ -1135,6 +1720,7 @@ const es = {
1135
1720
  noAccountText: "¿No tienes una cuenta?",
1136
1721
  signUpText: "Regístrate",
1137
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.",
1138
1724
  invalidCredentials: "Correo o contraseña inválidos. Inténtelo de nuevo.",
1139
1725
  emailNotVerified: "Verifique su correo electrónico antes de iniciar sesión.",
1140
1726
  },
@@ -1260,6 +1846,40 @@ const es = {
1260
1846
  shell: {
1261
1847
  tenantHostHint: "Está iniciando sesión en este espacio de trabajo",
1262
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
+ },
1263
1883
  },
1264
1884
  profile: {
1265
1885
  title: "Perfil",
@@ -1324,11 +1944,15 @@ const es = {
1324
1944
  settings: "Configuración del espacio de trabajo",
1325
1945
  },
1326
1946
  help: {
1947
+ onThisPage: "En esta página",
1948
+ keyboardShortcuts: "Atajos de teclado",
1327
1949
  appDocs: 'Documentación de esta app',
1328
1950
  allDocs: 'Toda la documentación',
1329
1951
  onlineDocs: 'Documentación en línea',
1330
1952
  },
1331
1953
  sidebar: {
1954
+ packageManagement: "Gestión de paquetes",
1955
+ searchNavigation: "Buscar en la navegación...",
1332
1956
  settings: "Configuración",
1333
1957
  help: "Ayuda",
1334
1958
  helpTooltip: "Ayuda y documentación",
@@ -1345,14 +1969,66 @@ const es = {
1345
1969
  removeFromFavorites: "Quitar {{name}} de favoritos",
1346
1970
  },
1347
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
+ },
1348
1989
  aiAssistant: "Asistente de IA",
1349
1990
  designInStudio: "Diseñar en Studio",
1350
1991
  },
1351
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
+ },
1352
2020
  title: "Inicio",
1353
2021
  subtitle: "Panel de tu espacio de trabajo",
1354
2022
  nav: "Inicio",
1355
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
+ },
1356
2032
  loading: "Cargando espacio de trabajo...",
1357
2033
  recent: "Recientes",
1358
2034
  starred: "Destacados",
@@ -1404,7 +2080,21 @@ const es = {
1404
2080
  },
1405
2081
  },
1406
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
+ },
1407
2094
  appSwitcher: {
2095
+ switchApplication: "Cambiar de aplicación",
2096
+ appsAvailable: "{{count}} aplicaciones disponibles",
2097
+ editNavigation: "Editar la navegación",
1408
2098
  home: "Inicio",
1409
2099
  addApp: "Agregar aplicación",
1410
2100
  editApp: "Editar aplicación",
@@ -1497,8 +2187,8 @@ const es = {
1497
2187
  uploading: "Subiendo…",
1498
2188
  defaultActionTitle: "Acción",
1499
2189
  ok: "Aceptar",
1500
- lookupPlaceholder: "Pegar ID de registro (UUID) para {{label}}",
1501
- 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.",
1502
2192
  },
1503
2193
  actionConfirm: {
1504
2194
  title: "Confirmar acción",
@@ -1523,6 +2213,8 @@ const es = {
1523
2213
  updateFailed: "No se pudo actualizar la navegación",
1524
2214
  },
1525
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",
1526
2218
  deleteSuccess: "{{label}} eliminado correctamente",
1527
2219
  deleteFailed: "No se pudo eliminar {{label}}",
1528
2220
  noRecordId: "No se proporcionó ID de registro",
@@ -1687,6 +2379,7 @@ const es = {
1687
2379
  },
1688
2380
  },
1689
2381
  organizations: {
2382
+ create: "Crear espacio de trabajo",
1690
2383
  mine: "Mis organizaciones",
1691
2384
  title: "Organizaciones",
1692
2385
  heading: "Tus organizaciones",
@@ -1700,6 +2393,11 @@ const es = {
1700
2393
  noMatches: "Ninguna organización coincide con tu búsqueda.",
1701
2394
  },
1702
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",
1703
2401
  empty: "Sin notificaciones",
1704
2402
  markAllRead: "Marcar todo como leído",
1705
2403
  viewAll: "Ver todas las notificaciones",
@@ -1818,7 +2516,103 @@ const es = {
1818
2516
  done: 'Listo — ocultar',
1819
2517
  },
1820
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
+ },
1821
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
+ },
1822
2616
  title: "Marketplace de aplicaciones",
1823
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.",
1824
2618
  searchPlaceholder: "Buscar aplicaciones por nombre o ID de manifiesto…",
@@ -1870,6 +2664,7 @@ const es = {
1870
2664
  updateAvailable: 'Actualización disponible',
1871
2665
  },
1872
2666
  action: {
2667
+ installed: "Instalada",
1873
2668
  install: "Instalar",
1874
2669
  reinstall: "Reinstalar",
1875
2670
  working: "Procesando…",
@@ -1940,6 +2735,14 @@ const es = {
1940
2735
  yearsAgo: "hace {{count}} años",
1941
2736
  },
1942
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
+ },
1943
2746
  approvalsInbox: {
1944
2747
  loadMore: 'Cargar más',
1945
2748
  loadingMore: 'Cargando…',
@@ -1964,13 +2767,28 @@ const es = {
1964
2767
  slaRemaining: 'SLA: quedan {{dur}}',
1965
2768
  slaOverdue: 'SLA vencido {{dur}}',
1966
2769
  actReassign: 'Reasignada',
2770
+ reassignFromTo: 'de {{from}} a {{to}}',
1967
2771
  actRemind: 'Recordatorio',
1968
2772
  actRequestInfo: 'Pidió más información',
1969
2773
  actComment: 'Comentó',
1970
2774
  stepProgress: 'Pasos de aprobación',
1971
2775
  prevRequest: 'Anterior',
1972
2776
  nextRequest: 'Siguiente',
1973
- 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)',
1974
2792
  quickPhrase1: 'Aprobada: cumple los requisitos.',
1975
2793
  quickPhrase2: 'Aprobada con condiciones: supervisar la ejecución.',
1976
2794
  quickPhrase3: 'Añade documentación de apoyo y vuelve a enviarla.',
@@ -2099,6 +2917,10 @@ const es = {
2099
2917
  retry: 'Reintentar',
2100
2918
  },
2101
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",
2102
2924
  message: 'Vista previa de borrador — estás viendo cambios sin publicar. Nada está en producción hasta que publiques.',
2103
2925
  publish: 'Publicar',
2104
2926
  publishing: 'Publicando…',