@object-ui/i18n 17.5.0 → 17.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +4954 -0
  2. package/README.md +234 -13
  3. package/dist/builtinAggregateLabels.d.ts +40 -0
  4. package/dist/builtinAggregateLabels.js +23 -0
  5. package/dist/currency.d.ts +27 -3
  6. package/dist/currency.js +28 -4
  7. package/dist/fallbackInterpolation.d.ts +79 -0
  8. package/dist/fallbackInterpolation.js +124 -0
  9. package/dist/i18n.d.ts +28 -2
  10. package/dist/i18n.js +99 -17
  11. package/dist/index.d.ts +17 -23
  12. package/dist/index.js +51 -27
  13. package/dist/locales/ar.d.ts +1113 -370
  14. package/dist/locales/ar.js +1276 -428
  15. package/dist/locales/de.d.ts +785 -370
  16. package/dist/locales/de.js +896 -401
  17. package/dist/locales/en.d.ts +800 -385
  18. package/dist/locales/en.js +1261 -419
  19. package/dist/locales/es.d.ts +867 -370
  20. package/dist/locales/es.js +976 -398
  21. package/dist/locales/fr.d.ts +867 -370
  22. package/dist/locales/fr.js +976 -399
  23. package/dist/locales/index.d.ts +8682 -3761
  24. package/dist/locales/index.js +68 -29
  25. package/dist/locales/ja.d.ts +785 -370
  26. package/dist/locales/ja.js +891 -395
  27. package/dist/locales/ko.d.ts +785 -370
  28. package/dist/locales/ko.js +893 -399
  29. package/dist/locales/pt.d.ts +867 -370
  30. package/dist/locales/pt.js +975 -397
  31. package/dist/locales/registry.d.ts +102 -0
  32. package/dist/locales/registry.js +220 -0
  33. package/dist/locales/rtl.d.ts +24 -0
  34. package/dist/locales/rtl.js +26 -0
  35. package/dist/locales/ru.d.ts +949 -370
  36. package/dist/locales/ru.js +1093 -419
  37. package/dist/locales/zh.d.ts +803 -388
  38. package/dist/locales/zh.js +899 -388
  39. package/dist/pickLocalized.d.ts +67 -0
  40. package/dist/pickLocalized.js +114 -0
  41. package/dist/provider.d.ts +102 -13
  42. package/dist/provider.js +335 -50
  43. package/dist/translateFn.d.ts +29 -0
  44. package/dist/translateFn.js +8 -0
  45. package/dist/useDisplayLocale.d.ts +11 -0
  46. package/dist/useDisplayLocale.js +13 -2
  47. package/dist/useObjectLabel.d.ts +118 -22
  48. package/dist/useObjectLabel.js +148 -23
  49. package/dist/useSafeTranslation.js +41 -43
  50. package/dist/utils/formatting.d.ts +16 -0
  51. package/dist/utils/formatting.js +23 -3
  52. package/dist/utils/index.d.ts +4 -4
  53. package/dist/utils/index.js +4 -4
  54. package/dist/utils/spec-formatters.d.ts +13 -23
  55. package/dist/utils/spec-formatters.js +41 -2
  56. package/dist/utils/spec-translations.d.ts +16 -3
  57. package/dist/utils/spec-translations.js +52 -13
  58. package/package.json +12 -6
@@ -19,10 +19,12 @@ const es = {
19
19
  manage_users: "Gestionar usuarios",
20
20
  manage_org_users: "Gestionar usuarios de la organización",
21
21
  manage_metadata: "Gestionar metadatos",
22
+ manage_org_presentation: "Gestionar la presentación de la organización",
22
23
  manage_platform_settings: "Gestionar la configuración de la plataforma",
23
24
  setup_access: "Acceso a la configuración",
24
25
  setup_write: "Escritura de la configuración",
25
26
  studio_access: "Acceso a Studio",
27
+ manage_sharing: "Gestionar el uso compartido",
26
28
  },
27
29
  group: {
28
30
  platform: 'Plataforma',
@@ -38,12 +40,20 @@ const es = {
38
40
  more: "+{{count}} más",
39
41
  objects: "{{count}} objetos",
40
42
  objects_one: "{{count}} objeto",
43
+ objects_many: "{{count}} de objetos",
44
+ objects_other: "{{count}} objetos",
41
45
  fields: "{{count}} reglas de campo",
42
46
  fields_one: "{{count}} regla de campo",
47
+ fields_many: "{{count}} de reglas de campo",
48
+ fields_other: "{{count}} reglas de campo",
43
49
  rls: "{{count}} políticas RLS",
44
50
  rls_one: "{{count}} política RLS",
51
+ rls_many: "{{count}} de políticas RLS",
52
+ rls_other: "{{count}} políticas RLS",
45
53
  tabs: "{{count}} reglas de pestaña",
46
54
  tabs_one: "{{count}} regla de pestaña",
55
+ tabs_many: "{{count}} de reglas de pestaña",
56
+ tabs_other: "{{count}} reglas de pestaña",
47
57
  adminScope: "Administración delegada configurada",
48
58
  designInStudio: "Diseñar en Studio →",
49
59
  designInStudioHint: "Diseñar en Studio",
@@ -62,7 +72,9 @@ const es = {
62
72
  selectFirst: 'Seleccione primero {{fields}}',
63
73
  selectRecord: 'Seleccionar registro',
64
74
  recordCount: '{{count}} registros',
65
- recordCountOne: '1 registro',
75
+ recordCount_one: '{{count}} registro',
76
+ recordCount_many: '{{count}} de registros',
77
+ recordCount_other: '{{count}} registros',
66
78
  pageOf: 'Página {{current}} de {{total}}',
67
79
  filters: 'Filtros',
68
80
  clear: 'Limpiar',
@@ -81,6 +93,7 @@ const es = {
81
93
  removeFromFavorites: "Quitar de favoritos",
82
94
  loading: "Cargando…",
83
95
  save: "Guardar",
96
+ discard: "Descartar",
84
97
  cancel: "Cancelar",
85
98
  delete: "Eliminar",
86
99
  edit: "Editar",
@@ -114,7 +127,9 @@ const es = {
114
127
  closePanel: "Cerrar panel",
115
128
  resizeDrawer: "Ajustar el ancho del panel",
116
129
  itemCount: "{{count}} elementos",
117
- itemCountOne: "{{count}} elemento",
130
+ itemCount_one: "{{count}} elemento",
131
+ itemCount_many: "{{count}} de elementos",
132
+ itemCount_other: "{{count}} elementos",
118
133
  toggleSidebar: "Alternar barra lateral",
119
134
  package: "Paquete",
120
135
  done: "Listo",
@@ -122,6 +137,16 @@ const es = {
122
137
  record: "Registro",
123
138
  retry: "Reintentar",
124
139
  printDialogHint: "Abre el cuadro de diálogo de impresión de tu navegador (no es una exportación a PDF)",
140
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
141
+ // there are two conditions: a reported `total` states the fact with BOTH
142
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
143
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
144
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
145
+ // headroom is deliberately NOT restated here — it moves on every
146
+ // re-baseline, and the figure that was here went stale.
147
+ // `pnpm check:eager-closure` prints it.
148
+ rowCeilingNote: "Mostrando los primeros {{shown}} de {{total}} registros. Acota el filtro.",
149
+ rowCeilingNoteUnknownTotal: "Mostrando los primeros {{shown}} registros. Acota el filtro.",
125
150
  },
126
151
  actions: {
127
152
  decisionOutput: {
@@ -133,6 +158,14 @@ const es = {
133
158
  acknowledge: 'Lo he guardado',
134
159
  copyAll: 'Copiar todo',
135
160
  },
161
+ notAvailableHere: '«{{action}}» no está disponible en la página actual.',
162
+ completedSuccessfully: 'La acción se completó correctamente',
163
+ failed: 'La acción falló',
164
+ parallelFailed: 'Una o más acciones paralelas fallaron',
165
+ undo: 'Deshacer',
166
+ undone: 'Cambio deshecho',
167
+ undoneOperation: 'Deshacer: {{description}}',
168
+ redoneOperation: 'Rehacer: {{description}}',
136
169
  },
137
170
  validation: {
138
171
  // "{{field}} es obligatorio" only agreed with masculine field labels —
@@ -155,19 +188,45 @@ const es = {
155
188
  },
156
189
  form: {
157
190
  noPermissionToSave: "No tienes permiso para guardar este registro.",
191
+ noPermissionToCreate: "No tienes permiso para crear registros de {{object}}. Los campos son de solo lectura.",
192
+ noPermissionToEdit: "No tienes permiso para editar registros de {{object}}. Los campos son de solo lectura.",
158
193
  submitFailed: "No se pudo guardar. Inténtalo de nuevo.",
194
+ uploadInFlight: "Espere a que finalice la carga antes de guardar.",
195
+ clearedOnHide: "Se borró lo que ya no corresponde a los valores actuales: {{fields}}",
196
+ visibleWhenFaulted: "No se puede enviar: no se pudo evaluar la regla visibleWhen de {{fields}}. Hay que corregir la regla antes de poder enviar este formulario.",
159
197
  discardTitle: "¿Descartar los cambios?",
160
198
  discardMessage: "Tiene cambios sin guardar. Si cierra este formulario ahora, sus ediciones se perderán.",
161
199
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
162
200
  // description, used when the form declares no `description` of its own.
163
201
  dialogDescriptionFallback: "Complete los campos del formulario y luego envíe o cancele.",
202
+ deniedDescription: "No tienes permiso para editar este campo.",
203
+ masterDetail: {
204
+ loadingColumns: "Cargando columnas…",
205
+ subtotal: "Subtotal",
206
+ tax: "Impuesto ({{rate}}%)",
207
+ total: "Total",
208
+ lineItem: "Línea de detalle",
209
+ rowTitle: "{{title}} — fila {{row}}",
210
+ applyRow: "Aplicar",
211
+ editorDescription: "Introduzca el registro y sus líneas de detalle y luego guarde.",
212
+ noChildObject: "Esta colección no tiene configurado ningún objeto secundario: establezca {{property}} en el objeto cuyas filas enumera.",
213
+ schemaUnavailable: "No se pudo cargar el esquema de {{object}}, por lo que esta colección no tiene columnas que mostrar. Compruebe que el objeto existe y se puede leer, y luego vuelva a cargar.",
214
+ noRelationshipField: "No se pudo determinar cómo se vincula {{object}} con {{parent}}: ningún campo lookup o master_detail del objeto hace referencia al principal. Establezca {{property}} en esta colección con el campo que contiene el registro principal.",
215
+ },
216
+ lineItems: {
217
+ title: "Líneas de detalle",
218
+ saveRecordFirst: "Guarde primero el registro para agregar líneas de detalle.",
219
+ notLoaded: "Las líneas de detalle de este registro no se han cargado.",
220
+ loadFailed: "No se pudieron cargar las líneas de detalle",
221
+ saveFailed: "No se pudieron guardar las líneas de detalle",
222
+ noChildObject: "Este panel no tiene configurado ningún objeto secundario: establezca {{property}} en el objeto cuyas filas enumera.",
223
+ },
164
224
  keepEditing: "Seguir editando",
165
225
  discard: "Descartar",
166
226
  conflictTitle: "Conflicto al guardar",
167
227
  conflictMessage: "Otra persona modificó este registro mientras lo editaba. Sobrescribir reemplazará sus cambios por los suyos.",
168
228
  conflictLatestVersion: "Su guardado: {{time}}",
169
229
  conflictOverwrite: "Sobrescribir",
170
- addItem: "Añadir elemento",
171
230
  removeItem: "Eliminar elemento",
172
231
  fieldRequired: "Este campo es obligatorio",
173
232
  invalidFormat: "Formato no válido",
@@ -185,6 +244,12 @@ const es = {
185
244
  createSuccess: "{{object}} creado",
186
245
  updateSuccess: "{{object}} actualizado",
187
246
  deleteSuccess: "{{object}} eliminado",
247
+ created: "Creado",
248
+ saved: "Guardado",
249
+ savedNamed: "{{title}} guardado",
250
+ submitted: "Enviado",
251
+ errorLoading: "Error al cargar el formulario",
252
+ navigateRefused: "El destino `navigateOnSuccess` declarado para este formulario fue rechazado, por lo que no se realizó la navegación.",
188
253
  fullscreen: {
189
254
  title: "Editar texto",
190
255
  description: "Edita el valor de texto completo y luego guarda o cancela los cambios.",
@@ -209,6 +274,9 @@ const es = {
209
274
  },
210
275
  relativeDate: {
211
276
  overdue: "Atrasado {{count}} d",
277
+ overdue_one: "Atrasado {{count}} d",
278
+ overdue_many: "Atrasado {{count}} d",
279
+ overdue_other: "Atrasado {{count}} d",
212
280
  },
213
281
  file: {
214
282
  dragDropHere: 'Arrastra y suelta archivos aquí',
@@ -225,6 +293,7 @@ const es = {
225
293
  remove: 'Quitar {{name}}',
226
294
  exceedsMaxSize: '«{{name}}» supera el tamaño máximo ({{max}} MB)',
227
295
  uploadFailed: 'Error al subir «{{name}}»: {{error}}',
296
+ uploadIncomplete: 'La subida de «{{name}}» no se completó: no se devolvió ningún identificador de archivo, así que no se guardó nada',
228
297
  },
229
298
  richText: {
230
299
  format: "Formato: {{format}}",
@@ -252,6 +321,9 @@ const es = {
252
321
  selectBusinessUnit: "Seleccionar una unidad de negocio",
253
322
  selectPosition: "Seleccionar un puesto",
254
323
  selectUnitAndSubordinates: "Seleccionar una unidad de negocio",
324
+ selectField: "Seleccionar un campo de usuario",
325
+ noUserFields: "Este objeto no tiene campos de usuario",
326
+ fieldNotUserTyped: "{{name}} — no es un campo de usuario",
255
327
  },
256
328
  filterCondition: {
257
329
  selectObjectFirst: "Selecciona primero un objeto.",
@@ -262,13 +334,51 @@ const es = {
262
334
  editAsJson: "Editar como JSON",
263
335
  useVisualBuilder: "Usar el constructor visual",
264
336
  },
337
+ object: {
338
+ invalidJson: "JSON no válido",
339
+ },
340
+ location: {
341
+ refusedFormat: "No guardado: introduce un par latitud, longitud (ejemplo: 30.2741, 120.1551).",
342
+ refusedRange: "No guardado: {{detail}}",
343
+ latitude: "latitud",
344
+ longitude: "longitud",
345
+ refusedResidueOne: "No guardado: {{name}} «{{text}}» no es un número. Introduce decimales simples (ejemplo: 30.2741, 120.1551).",
346
+ refusedResidue: "No guardado: {{name}} «{{text}}» y {{otherName}} «{{otherText}}» no son números. Introduce decimales simples (ejemplo: 30.2741, 120.1551).",
347
+ },
348
+ date: {
349
+ impossibleDay: "El valor guardado «{{value}}» no es una fecha real. Elige una fecha para reemplazarlo.",
350
+ },
351
+ dateTime: {
352
+ impossibleDay: "El valor guardado «{{value}}» no es una fecha real. Elige una fecha y una hora para reemplazarlo.",
353
+ },
354
+ number: {
355
+ badInput: "No guardado: el texto de este campo no es un número. Introduce un decimal simple (ejemplo: {{example}}).",
356
+ },
265
357
  tags: {
266
358
  placeholder: "Escriba y pulse Intro para añadir…",
267
359
  },
360
+ // objectui#4028 — `AddressField`'s five sub-labels.
361
+ address: {
362
+ street: "Dirección (calle)",
363
+ city: "Ciudad",
364
+ state: "Estado / Provincia",
365
+ postalCode: "Código postal",
366
+ country: "País",
367
+ },
268
368
  textarea: {
269
369
  characterCount: "Recuento de caracteres: {{count}} de {{max}}",
270
370
  charactersRemaining: "Caracteres restantes: {{count}}",
271
371
  },
372
+ grid: {
373
+ addLine: "Agregar línea",
374
+ noItems: "Sin elementos",
375
+ noItemsAddHint: "Aún no hay elementos: haga clic en «{{label}}» para empezar.",
376
+ optionalColumns: "Columnas opcionales",
377
+ computed: "Calculado",
378
+ openRow: "Abrir fila",
379
+ duplicateRow: "Duplicar fila",
380
+ removeRow: "Quitar fila",
381
+ },
272
382
  },
273
383
  table: {
274
384
  rowsPerPage: "Filas por página",
@@ -297,23 +407,41 @@ const es = {
297
407
  open: "Abrir",
298
408
  search: "Buscar…",
299
409
  modified: "{{count}} filas modificadas",
410
+ modified_one: "{{count}} fila modificada",
411
+ modified_many: "{{count}} de filas modificadas",
412
+ modified_other: "{{count}} filas modificadas",
300
413
  saveFailed: 'Error al guardar',
301
414
  selected: "{{count}} seleccionados",
415
+ selected_one: "{{count}} seleccionado",
416
+ selected_many: "{{count}} seleccionados",
417
+ selected_other: "{{count}} seleccionados",
302
418
  edit: "Editar",
303
419
  delete: "Eliminar",
304
420
  },
305
421
  grid: {
306
422
  bulkSelected: "{{count}} seleccionados",
423
+ bulkSelected_one: "{{count}} seleccionado",
424
+ bulkSelected_many: "{{count}} seleccionados",
425
+ bulkSelected_other: "{{count}} seleccionados",
307
426
  bulkSelectedAllMatches: "{{count}} seleccionados (todas las coincidencias)",
308
427
  bulkClear: "Quitar selección",
309
428
  bulkAllOnPage: "Están seleccionados los {{count}} de esta página.",
429
+ bulkAllOnPage_one: "{{count}} registro de esta página está seleccionado.",
430
+ bulkAllOnPage_many: "Están seleccionados los {{count}} de esta página.",
431
+ bulkAllOnPage_other: "Están seleccionados los {{count}} de esta página.",
310
432
  bulkSelectAllMatching: "Seleccionar las {{count}} coincidencias",
311
433
  bulkAllMatchingSelected: "Están seleccionados los {{count}} registros coincidentes.",
312
434
  bulk: {
313
435
  confirmDefault: "Esto se aplicará a {{count}} registro(s).",
436
+ confirmDefault_one: "Esto se aplicará a {{count}} registro.",
437
+ confirmDefault_many: "Esto se aplicará a {{count}} de registros.",
438
+ confirmDefault_other: "Esto se aplicará a {{count}} registros.",
314
439
  overLimit: "La selección ({{count}}) supera el límite de la acción ({{limit}}). Reduzca la selección para continuar.",
315
440
  affectedRecords: "Registros afectados ({{count}}):",
316
441
  skippedIneligible: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
442
+ skippedIneligible_one: '{{count}} de los registros seleccionados no es apto para esta acción y se omitirá.',
443
+ skippedIneligible_many: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
444
+ skippedIneligible_other: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
317
445
  rowFallback: "Fila {{index}}",
318
446
  andMore: "… y {{count}} más",
319
447
  processed: "{{count}} / {{total}} procesados",
@@ -330,8 +458,7 @@ const es = {
330
458
  running: "Ejecutando…",
331
459
  undo: "Deshacer",
332
460
  undoing: "Deshaciendo…",
333
- done: "Hecho",
334
- selectPlaceholder: "Seleccionar…",
461
+ done: "Listo",
335
462
  loading: "Cargando…",
336
463
  },
337
464
  actions: "Acciones",
@@ -350,6 +477,14 @@ const es = {
350
477
  yes: "Sí",
351
478
  no: "No",
352
479
  systemFields: "Sistema",
480
+ // objectui#10881 — the grouped grid's two refusals: over a data source
481
+ // that cannot answer the group header query, and over rows a host
482
+ // handed in while declaring them one page of more. `queryGroupHeaders`
483
+ // is the member's name and stays untranslated.
484
+ grouping: {
485
+ needsHeaderQuery: "Esta vista está agrupada, pero su origen de datos no implementa queryGroupHeaders, por lo que no se pueden contar los grupos. Quite la agrupación para mostrar los registros.",
486
+ needsWholeRows: "La agrupación necesita todos los registros, pero esta cuadrícula recibió solo una página de ellos, por lo que no se pueden contar los grupos. Entregue todos los registros o deje que la cuadrícula los obtenga de un origen de datos que implemente queryGroupHeaders.",
487
+ },
353
488
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
354
489
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
355
490
  // pack controls its own separator and word order.
@@ -376,10 +511,15 @@ const es = {
376
511
  },
377
512
  import: {
378
513
  downloadTemplate: "Descargar plantilla",
379
- downloadTemplateHint: "Obtenga un CSV con las columnas correctas (los campos obligatorios llevan *).",
514
+ downloadTemplateHint: "Obtenga un archivo de Excel con las columnas que puede importar (los campos obligatorios llevan *) e instrucciones para rellenarlo.",
380
515
  templateFileName: "{{object}}-import-template",
516
+ templateDownloadFailed: "No se pudo descargar la plantilla. Inténtelo de nuevo.",
517
+ templateNotPermitted: "No tiene permiso para crear registros de este objeto, por lo que su plantilla de importación no está disponible.",
381
518
  autoMatched: "Emparejado automáticamente",
382
519
  autoMatchedSummary: "{{count}} columna(s) emparejada(s) automáticamente: revise y ajuste abajo.",
520
+ autoMatchedSummary_one: "{{count}} columna emparejada automáticamente: revise y ajuste abajo.",
521
+ autoMatchedSummary_many: "{{count}} de columnas emparejadas automáticamente: revise y ajuste abajo.",
522
+ autoMatchedSummary_other: "{{count}} columnas emparejadas automáticamente: revise y ajuste abajo.",
383
523
  confidence: {
384
524
  high: "Confianza alta",
385
525
  medium: "Confianza media",
@@ -392,8 +532,17 @@ const es = {
392
532
  cancelImport: "Cancelar la importación",
393
533
  importCancelled: "Importación cancelada",
394
534
  resultsTruncated: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
535
+ resultsTruncated_one: "Mostrando el primer resultado de fila ({{count}} de {{total}}).",
536
+ resultsTruncated_many: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
537
+ resultsTruncated_other: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
395
538
  createdCount: "{{count}} creados",
539
+ createdCount_one: "{{count}} creado",
540
+ createdCount_many: "{{count}} creados",
541
+ createdCount_other: "{{count}} creados",
396
542
  updatedCount: "{{count}} actualizados",
543
+ updatedCount_one: "{{count}} actualizado",
544
+ updatedCount_many: "{{count}} actualizados",
545
+ updatedCount_other: "{{count}} actualizados",
397
546
  downloadFailed: "Descargar las filas con error",
398
547
  options: "Opciones de importación",
399
548
  writeMode: "Cuando una fila coincide con un registro existente",
@@ -441,6 +590,9 @@ const es = {
441
590
  historyColResult: "Resultado",
442
591
  historyColTime: "Cuándo",
443
592
  errorCount: "{{count}} errores",
593
+ errorCount_one: "{{count}} error",
594
+ errorCount_many: "{{count}} de errores",
595
+ errorCount_other: "{{count}} errores",
444
596
  undoImport: "Deshacer la importación",
445
597
  undoing: "Deshaciendo…",
446
598
  undoConfirm: "¿Deshacer esta importación? Los registros que creó se eliminarán y los que actualizó se restaurarán a sus valores anteriores.",
@@ -501,7 +653,13 @@ const es = {
501
653
  mapped: "Asignado",
502
654
  skipped: "Omitido",
503
655
  rowsWithErrors: "{{count}} fila(s) con errores",
656
+ rowsWithErrors_one: "{{count}} fila con errores",
657
+ rowsWithErrors_many: "{{count}} de filas con errores",
658
+ rowsWithErrors_other: "{{count}} filas con errores",
504
659
  rowsCorrected: "{{count}} fila(s) corregida(s)",
660
+ rowsCorrected_one: "{{count}} fila corregida",
661
+ rowsCorrected_many: "{{count}} de filas corregidas",
662
+ rowsCorrected_other: "{{count}} filas corregidas",
505
663
  clickToFix: "— haga clic en una celda resaltada para editar en línea.",
506
664
  showingRows: "Mostrando {{shown}} de {{total}} filas",
507
665
  importing: "Importando… {{progress}}%",
@@ -509,11 +667,17 @@ const es = {
509
667
  imported: "{{count}} importado(s)",
510
668
  skippedCount: "{{count}} omitido(s)",
511
669
  moreErrors: "…y {{count}} error(es) más",
670
+ moreErrors_one: "…y {{count}} error más",
671
+ moreErrors_many: "…y {{count}} de errores más",
672
+ moreErrors_other: "…y {{count}} errores más",
512
673
  cancel: "Cancelar",
513
674
  back: "Atrás",
514
675
  next: "Siguiente",
515
676
  close: "Cerrar",
516
677
  importNRows: "Importar {{count}} filas",
678
+ importNRows_one: "Importar {{count}} fila",
679
+ importNRows_many: "Importar {{count}} de filas",
680
+ importNRows_other: "Importar {{count}} filas",
517
681
  importingProgress: "Importando…",
518
682
  requiredMark: "*",
519
683
  required: "Obligatorio",
@@ -525,11 +689,38 @@ const es = {
525
689
  month: "Mes",
526
690
  week: "Semana",
527
691
  day: "Día",
528
- agenda: "Agenda",
529
692
  allDay: "Todo el día",
530
- noEvents: "Sin eventos",
531
693
  newEvent: "Nuevo evento",
532
694
  moreEvents: "+{{count}} más",
695
+ unscheduled: "Sin programar ({{count}})",
696
+ loading: "Cargando calendario…",
697
+ loadError: "Error: {{message}}",
698
+ configRequired: "Se requiere la configuración del calendario. Indica startDateField, la única clave obligatoria del calendario; el título del evento se resuelve sin titleField.",
699
+ configRequiredHint: "Pertenece al bloque calendar de la vista. Una página de interfaz no tiene su propio espacio de calendario: apunta su sourceView a una vista que declare uno.",
700
+ eventDetails: "Detalles del evento",
701
+ pullToRefresh: "Desliza para actualizar",
702
+ refreshing: "Actualizando…",
703
+ onDate: "El {{date}}",
704
+ eventTitle: "Título",
705
+ eventTitlePlaceholder: "¿De qué trata este evento?",
706
+ creating: "Creando…",
707
+ titleRequired: "El título es obligatorio",
708
+ a11y: {
709
+ region: "Calendario",
710
+ grid: "Cuadrícula del calendario",
711
+ goToToday: "Ir a hoy",
712
+ previousPeriod: "Período anterior",
713
+ nextPeriod: "Período siguiente",
714
+ currentDate: "Fecha actual: {{date}}",
715
+ dayCell: "{{date}}, {{count}} eventos",
716
+ dayCell_one: "{{date}}, {{count}} evento",
717
+ dayCell_many: "{{date}}, {{count}} de eventos",
718
+ dayCell_other: "{{date}}, {{count}} eventos",
719
+ resizeEventEnd: "Cambiar el fin del evento",
720
+ resizeEventEndHint: "Arrastra para cambiar la fecha de fin",
721
+ resizeStart: "Cambiar el inicio",
722
+ resizeEnd: "Cambiar el fin",
723
+ },
533
724
  },
534
725
  list: {
535
726
  firstRunTitle: "Aquí todavía no hay nada",
@@ -572,7 +763,9 @@ const es = {
572
763
  refresh: "Actualizar",
573
764
  loading: "Cargando registros…",
574
765
  recordCount: "{{count}} registros",
575
- recordCountOne: "{{count}} registro",
766
+ recordCount_one: "{{count}} registro",
767
+ recordCount_many: "{{count}} de registros",
768
+ recordCount_other: "{{count}} registros",
576
769
  addRecord: "Agregar registro",
577
770
  tabs: "Pestañas",
578
771
  allRecords: "Todos los registros",
@@ -604,7 +797,7 @@ const es = {
604
797
  hideFieldsTitle: "Ocultar campos",
605
798
  dataLimitReached: "Se muestran los primeros {{limit}} registros. Puede haber más datos disponibles.",
606
799
  viewSettings: "Configuración de vista",
607
- viewSettingsHint: "Agrupación, color, densidad y campos visibles.",
800
+ viewSettingsHint: "Agrupación, color, densidad y campos visibles. Se aplica a todos los usuarios de esta vista.",
608
801
  addGroup: "Agregar campo de grupo",
609
802
  collapsedByDefault: "Contraído por defecto",
610
803
  removeGroup: "Eliminar",
@@ -669,6 +862,17 @@ const es = {
669
862
  },
670
863
  gantt: {
671
864
  rowLabel: "Elementos",
865
+ unusableRange: {
866
+ malformedDate: "Rango de fechas del gantt inutilizable: {{path}} es {{value}}, que no es una fecha válida. Todas las fechas del gantt deben poder analizarse: startDate y endDate de cada elemento de fila, además de cualquier minDate / maxDate fijado en el esquema.",
867
+ malformedRow: "Filas del gantt inutilizables: {{path}} es {{value}}, que no tiene la forma de una fila. Un gantt lee items como una lista de filas, cada fila como un objeto con label y sus propios items, y los items de cada fila como una lista de barras; un null, un número, una cadena o un objeto simple en cualquiera de esas posiciones no se puede dibujar.",
868
+ inverted: "Rango de fechas del gantt inutilizable: minDate {{minDate}} es posterior a maxDate {{maxDate}}. Un minDate / maxDate fijado prevalece sobre el rango calculado a partir de las filas, por lo que este eje no tiene columnas y no se puede colocar ninguna barra; intercambie los dos valores.",
869
+ },
870
+ },
871
+ unsupported: {
872
+ objectBoundGantt: "Variante \"gantt\" no admitida: una línea de tiempo vinculada a un objeto representa las variantes de feed ({{variants}}). Gantt necesita filas literales, cada una con sus propios items anidados, por lo que el eje gantt (scale) no tiene efecto aquí.",
873
+ },
874
+ unconfigured: {
875
+ noDateAxis: "Se requiere el eje de fechas de la línea de tiempo: esta vista no declara ningún campo de fecha y una línea de tiempo vinculada a un objeto no inventa ninguno. Declare uno de: {{fields}}. El primero es la grafía de la especificación; los demás son alias heredados.",
672
876
  },
673
877
  },
674
878
  gantt: {
@@ -686,6 +890,7 @@ const es = {
686
890
  },
687
891
  aria: {
688
892
  taskList: "Lista de tareas",
893
+ refreshing: "Actualizando…",
689
894
  },
690
895
  tooltip: {
691
896
  days: "d",
@@ -731,13 +936,22 @@ const es = {
731
936
  conflict: {
732
937
  title: "Conflicto de programación",
733
938
  body: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea(s) afectada(s)?",
939
+ body_one: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea afectada?",
940
+ body_many: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} de tareas afectadas?",
941
+ body_other: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tareas afectadas?",
734
942
  confirm: "Reprogramar automáticamente",
735
943
  cancel: "Dejarlo como está",
736
944
  },
737
945
  autoScheduleDlg: {
738
946
  title: "Programación automática",
739
947
  body: "¿Retrasar {{count}} tarea(s) para respetar los vínculos de dependencia?",
948
+ body_one: "¿Retrasar {{count}} tarea para respetar los vínculos de dependencia?",
949
+ body_many: "¿Retrasar {{count}} de tareas para respetar los vínculos de dependencia?",
950
+ body_other: "¿Retrasar {{count}} tareas para respetar los vínculos de dependencia?",
740
951
  skipped: "{{count}} tarea(s) bloqueada(s) también incumplen los vínculos y se han omitido.",
952
+ skipped_one: "{{count}} tarea bloqueada también incumple los vínculos y se ha omitido.",
953
+ skipped_many: "{{count}} de tareas bloqueadas también incumplen los vínculos y se han omitido.",
954
+ skipped_other: "{{count}} tareas bloqueadas también incumplen los vínculos y se han omitido.",
741
955
  confirm: "Aplicar",
742
956
  cancel: "Cancelar",
743
957
  none: "Todas las dependencias se cumplen: no hay nada que reprogramar.",
@@ -816,6 +1030,7 @@ const es = {
816
1030
  tabActionsFor: "Acciones de vista para {{name}}",
817
1031
  readonlyAriaLabel: "Vista de solo lectura",
818
1032
  readonlyTooltip: "Vista del sistema — definida en el código, solo lectura.",
1033
+ malformedFilter: "El filtro de esta vista no es válido, por lo que no se muestra ningún registro: la condición {{subject}} no se puede aplicar.",
819
1034
  },
820
1035
  designer: {
821
1036
  undo: "Deshacer",
@@ -841,7 +1056,9 @@ const es = {
841
1056
  pageHeaderActions: "Acciones del encabezado de página",
842
1057
  emojiPicker: "Selector de emojis",
843
1058
  reactionCount: "{{emoji}} {{count}} reacciones",
844
- reactionCountOne: "{{emoji}} {{count}} reacción",
1059
+ reactionCount_one: "{{emoji}} {{count}} reacción",
1060
+ reactionCount_many: "{{emoji}} {{count}} de reacciones",
1061
+ reactionCount_other: "{{emoji}} {{count}} reacciones",
845
1062
  recordDetail: "Detalle del registro",
846
1063
  recordDetailWithLabel: "Detalle de {{label}}",
847
1064
  openAsFullPage: "Abrir como página completa",
@@ -868,7 +1085,6 @@ const es = {
868
1085
  viewAll: "Ver todo",
869
1086
  new: "Nuevo",
870
1087
  add: "Agregar",
871
- emptyValue: "—",
872
1088
  comments: "Comentarios",
873
1089
  searchComments: "Buscar comentarios…",
874
1090
  addCommentPlaceholder: "Añadir comentario… (Ctrl+Enter para enviar)",
@@ -879,11 +1095,22 @@ const es = {
879
1095
  unpin: "Desfijar",
880
1096
  justNow: "justo ahora",
881
1097
  minutesAgo: "hace {{count}} min",
1098
+ minutesAgo_one: "hace {{count}} min",
1099
+ minutesAgo_many: "hace {{count}} min",
1100
+ minutesAgo_other: "hace {{count}} min",
882
1101
  hoursAgo: "hace {{count}} h",
1102
+ hoursAgo_one: "hace {{count}} h",
1103
+ hoursAgo_many: "hace {{count}} h",
1104
+ hoursAgo_other: "hace {{count}} h",
883
1105
  daysAgo: "hace {{count}} d",
1106
+ daysAgo_one: "hace {{count}} d",
1107
+ daysAgo_many: "hace {{count}} d",
1108
+ daysAgo_other: "hace {{count}} d",
884
1109
  dropFilesToUpload: "Arrastra archivos aquí o haz clic para subir",
885
1110
  attachmentCount: "{{count}} archivo adjunto",
886
- attachmentCountPlural: "{{count}} archivos adjuntos",
1111
+ attachmentCount_one: "{{count}} archivo adjunto",
1112
+ attachmentCount_many: "{{count}} de archivos adjuntos",
1113
+ attachmentCount_other: "{{count}} archivos adjuntos",
887
1114
  removeAttachment: "Eliminar adjunto",
888
1115
  // Record Attachments panel (enable.files, objectstack#4358)
889
1116
  attachments: "Adjuntos",
@@ -897,11 +1124,10 @@ const es = {
897
1124
  attachmentDownloadDenied: "No tiene acceso para descargar este adjunto.",
898
1125
  attachmentAuthRequired: "Inicie sesión para descargar este adjunto.",
899
1126
  attachmentPermissionDenied: "No tiene permiso para hacer eso.",
900
- unifiedDiff: "Vista unificada",
901
- sideBySideDiff: "Vista lado a lado",
902
- noChanges: "Sin cambios",
903
- previousVersion: "Anterior",
904
- currentVersion: "Actual",
1127
+ attachmentsAccessDenied: "No tiene acceso a estos adjuntos.",
1128
+ attachmentsLoadFailed: "No se pudieron cargar los adjuntos de este registro.",
1129
+ attachmentsApiUnavailable: "La lista de adjuntos no está disponible en este objeto.",
1130
+ retryLoadAttachments: "Reintentar",
905
1131
  discussion: "Discusión",
906
1132
  showDiscussion: "Mostrar discusión ({{count}})",
907
1133
  hideDiscussion: "Ocultar discusión",
@@ -916,25 +1142,36 @@ const es = {
916
1142
  writeComment: "Escribe un comentario…",
917
1143
  subscribedTooltip: "Suscrito — clic para cancelar suscripción",
918
1144
  unsubscribedTooltip: "Suscribirse a notificaciones",
919
- firstRecord: "Primer registro (Inicio)",
920
- previousRecordKey: "Registro anterior (←)",
921
- nextRecordKey: "Siguiente registro (→)",
922
- lastRecord: "Último registro (Fin)",
923
1145
  noRecords: "Sin registros",
924
- searchWhileNavigating: "Buscar mientras navegas",
925
- searchRecords: "Buscar registros…",
926
1146
  allActivity: "Toda la actividad",
927
1147
  commentsOnly: "Solo comentarios",
928
1148
  fieldChangesFilter: "Cambios de campo",
929
1149
  tasksOnly: "Solo tareas",
930
1150
  leaveCommentPlaceholder: "Deja un comentario… (Ctrl+Enter para enviar)",
931
1151
  noActivity: "Sin actividad registrada",
1152
+ activityAccessDenied: "No tiene permiso para ver la actividad de este registro.",
1153
+ commentsAccessDenied: "No tiene permiso para ver los comentarios de este registro.",
1154
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1155
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1156
+ // sentences, which are assembled in code and so need interpolation holes.
1157
+ allFilter: 'Todo',
1158
+ createsFilter: 'Creaciones',
1159
+ deletesFilter: 'Eliminaciones',
1160
+ statusChangesFilter: 'Cambios de estado',
1161
+ activityEmptyValue: '(vacío)',
1162
+ activityFieldChanged: 'Cambió {{field}} de "{{old}}" a "{{new}}"',
1163
+ activityCreated: 'Creó este registro',
1164
+ activityDeleted: 'Eliminó este registro',
1165
+ activityStatusChanged: 'Cambió el estado a "{{value}}"',
1166
+ activityUpdated: 'Actualizó el registro',
932
1167
  loadMore: "Cargar más",
933
1168
  edited: "(editado)",
934
1169
  via: "vía {{source}}",
935
1170
  viewSource: "Ver origen",
936
1171
  replyCount: "{{count}} respuesta",
937
- replyCountPlural: "{{count}} respuestas",
1172
+ replyCount_one: "{{count}} respuesta",
1173
+ replyCount_many: "{{count}} de respuestas",
1174
+ replyCount_other: "{{count}} respuestas",
938
1175
  replyPlaceholder: "Responder…",
939
1176
  filterActivity: "Filtrar actividad",
940
1177
  openDiscussion: "Abrir panel de discusión",
@@ -948,6 +1185,9 @@ const es = {
948
1185
  writeStrippedTitle: "Guardado, pero algunos campos no se aplicaron",
949
1186
  writeStrippedReadonly: "De solo lectura, por lo que no se aplicó: {{fields}}",
950
1187
  writeStrippedByState: "No editable en el estado actual de este registro, por lo que no se aplicó: {{fields}}",
1188
+ writeStrippedPrimaryKey: "El identificador del registro no se puede cambiar al guardar, por lo que no se aplicó: {{fields}}",
1189
+ writeStrippedComputed: "Lo calcula el servidor mediante una fórmula, por lo que el valor enviado no se aplicó: {{fields}}",
1190
+ writeStrippedUnknownReason: "No aplicado por el servidor: {{fields}}",
951
1191
  approvalPendingEditable: "En aprobación · editable",
952
1192
  approvalPendingTooltip: "Este registro tiene una solicitud de aprobación pendiente; este paso todavía permite la edición",
953
1193
  approvalProgress: "Aprobaciones — {{got}} de {{need}}",
@@ -960,7 +1200,16 @@ const es = {
960
1200
  cancelApprovalTooltipUnlocked: "Cancelar la solicitud de aprobación pendiente",
961
1201
  cancelApprovalFailed: "No se pudo cancelar la aprobación",
962
1202
  cancelApprovalUnavailable: "La cancelación de aprobaciones no es compatible con esta fuente de datos",
1203
+ pathLabel: 'Ruta del registro',
1204
+ pathStageCompleted: '{{stage}}, completada',
1205
+ pathStageCurrent: '{{stage}}, etapa actual',
1206
+ pathStageUpcoming: '{{stage}}, pendiente',
1207
+ pathStageLostCurrent: '{{stage}}, perdida, etapa actual',
1208
+ pathStageLostUpcoming: '{{stage}}, perdida, no alcanzada',
1209
+ pathStageWonUpcoming: '{{stage}}, etapa objetivo, no alcanzada',
963
1210
  linkCopied: "Enlace copiado al portapapeles",
1211
+ commentFailed: "Tu comentario no se ha publicado. No se ha guardado nada; inténtalo de nuevo.",
1212
+ reactionFailed: "Tu reacción no se ha guardado. Inténtalo de nuevo.",
964
1213
  linkCopyFailed: "No se pudo copiar el enlace",
965
1214
  cancel: "Cancelar",
966
1215
  cancelEdit: "Descartar cambios",
@@ -990,99 +1239,69 @@ const es = {
990
1239
  sortBy: "Ordenar por",
991
1240
  filterPlaceholder: "Filtrar…",
992
1241
  highlightFields: "Campos clave",
1242
+ highlightsLabel: "Campos clave del registro",
993
1243
  createdBy: "Creado por",
994
1244
  updatedBy: "Actualizado por",
995
1245
  created: "Creado",
996
1246
  updated: "Actualizado",
997
- // objectui#3863 — base key. es's third category `many` starts at a million, where
998
- // the plural form is correct, so the base repeats `_other`.
1247
+ // objectui#3863 — base key, answering only a call made without a count. es's
1248
+ // `many` (exact millions) has its own slot since objectui#11432; it repeats
1249
+ // `_other` here because the count governs no noun complement.
999
1250
  showEmptyRelated: "+ {{count}} vacíos",
1000
1251
  showEmptyRelated_one: "+ {{count}} vacío",
1252
+ showEmptyRelated_many: "+ {{count}} vacíos",
1001
1253
  showEmptyRelated_other: "+ {{count}} vacíos",
1002
1254
  copyEmail: "Copiar correo",
1003
1255
  copyPhone: "Copiar teléfono",
1004
1256
  copyRecordId: "Copiar ID de registro",
1005
1257
  showEmptyFields: "Mostrar {{count}} campos vacíos",
1258
+ showEmptyFields_one: "Mostrar {{count}} campo vacío",
1259
+ showEmptyFields_many: "Mostrar {{count}} de campos vacíos",
1260
+ showEmptyFields_other: "Mostrar {{count}} campos vacíos",
1006
1261
  hideEmptyFields: "Ocultar campos vacíos",
1007
1262
  noValue: "Sin valor",
1263
+ unresolvedReference: "Referencia sin resolver: {{value}} no se resolvió como un usuario",
1264
+ unresolvedLookupReference: "Referencia sin resolver: {{value}} no se resolvió como un registro en esta pantalla",
1265
+ repeaterItemCount: "{{count}} elementos",
1266
+ repeaterItemCount_one: "{{count}} elemento",
1267
+ repeaterItemCount_many: "{{count}} de elementos",
1268
+ repeaterItemCount_other: "{{count}} elementos",
1269
+ fileCount: "{{count}} archivos",
1270
+ fileCount_one: "{{count}} archivo",
1271
+ fileCount_many: "{{count}} de archivos",
1272
+ fileCount_other: "{{count}} archivos",
1008
1273
  },
1009
1274
  chart: {
1010
- noData: "No hay datos de gráfico disponibles",
1011
1275
  loading: "Cargando gráfico…",
1276
+ refreshing: "Actualizando…",
1012
1277
  nullCategory: "(Sin especificar)",
1013
- },
1014
- map: {
1015
- searchLocations: "Buscar ubicaciones…",
1016
- locationDetails: "Detalles de ubicación",
1017
- markersCount: "{{count}} marcadores",
1018
- invalidCoordinates: "{{count}} registro con coordenadas faltantes o inválidas excluido del mapa.",
1019
- invalidCoordinatesPlural: "{{count}} registros con coordenadas faltantes o inválidas excluidos del mapa.",
1020
- },
1021
- workflow: {
1022
- draft: "Borrador",
1023
- active: "Activo",
1024
- paused: "En pausa",
1025
- completed: "Completado",
1026
- cancelled: "Cancelado",
1027
- save: "Guardar",
1028
- publish: "Publicar",
1029
- addNode: "Añadir nodo",
1030
- workflowFlow: "Flujo de trabajo",
1031
- properties: "Propiedades",
1032
- connections: "Conexiones",
1033
- quickConnect: "Conexión rápida",
1034
- fromPlaceholder: "Desde…",
1035
- toPlaceholder: "Hasta…",
1036
- connect: "Conectar",
1037
- label: "Etiqueta",
1038
- type: "Tipo",
1039
- description: "Descripción",
1040
- assignee: "Responsable",
1041
- assigneeType: "Tipo de responsable",
1042
- user: "Usuario",
1043
- role: "Rol",
1044
- group: "Grupo",
1045
- expression: "Expresión",
1046
- timeoutMinutes: "Tiempo límite (minutos)",
1047
- selectNodeToEdit: "Selecciona un nodo para editar sus propiedades",
1048
- workflowTitle: "Título del flujo de trabajo",
1049
- newWorkflow: "Nuevo flujo de trabajo",
1050
- outConnections: "{{count}} salida(s)",
1051
- start: "Inicio",
1052
- end: "Fin",
1053
- task: "Tarea",
1054
- userTask: "Tarea de usuario",
1055
- serviceTask: "Tarea de servicio",
1056
- scriptTask: "Tarea de script",
1057
- approval: "Aprobación",
1058
- condition: "Condición",
1059
- parallelGateway: "Compuerta paralela",
1060
- joinGateway: "Compuerta de unión",
1061
- boundaryEvent: "Evento límite",
1062
- delay: "Retraso",
1063
- notification: "Notificación",
1064
- webhook: "Webhook",
1065
- allowConcurrency: "Permitir (ejecución simultánea)",
1066
- forbidConcurrency: "Prohibir (omitir nuevos)",
1067
- replaceConcurrency: "Reemplazar (cancelar existentes)",
1068
- queueConcurrency: "Cola (ejecutar después)",
1069
- conditionEvent: "Condición",
1070
- manualEvent: "Manual",
1071
- webhookEvent: "Webhook",
1072
- timerEvent: "Temporizador",
1073
- signalEvent: "Señal",
1074
- versionHistory: "Historial de versiones",
1075
- importBpmn: "Importar BPMN",
1076
- exportBpmn: "Exportar BPMN",
1077
- undo: "Deshacer",
1078
- redo: "Rehacer",
1079
- resetZoom: "Restablecer zoom",
1278
+ scatterOneMeasure: "Un gráfico de dispersión traza una sola medida. Conserve una sola serie:",
1279
+ unconfigured: {
1280
+ noCategoryAxis: "Se requiere el eje de categorías del gráfico — un gráfico vinculado a un objeto no lo inventa. Declare uno de:",
1281
+ },
1080
1282
  },
1081
1283
  dashboard: {
1082
- noRows: "Sin filas",
1284
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1285
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1286
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1287
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1288
+ // read them. The copy here has to read as a state rather than a failure,
1289
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1290
+ // punctuation so the call site concatenates no separator (see
1291
+ // `WidgetEmptyState`).
1292
+ empty: {
1293
+ title: "Aún no hay datos",
1294
+ message: "Este widget se cargó correctamente, pero la consulta todavía no ha devuelto ningún registro.",
1295
+ sourceLabel: "Origen de datos:",
1296
+ },
1083
1297
  loading: "Cargando…",
1298
+ refreshing: "Actualizando…",
1299
+ refreshAll: "Actualizar todo",
1300
+ refreshDashboard: "Actualizar panel de control",
1084
1301
  pickMeasures: "Elija medidas (valores) para este widget de dataset.",
1085
1302
  datasetUnsupported: "Esta fuente de datos no admite consultas de dataset.",
1303
+ widgetForbiddenTitle: "Sin acceso",
1304
+ widgetForbiddenMessage: "No tienes permiso para ver los datos de este widget.",
1086
1305
  details: "Detalles",
1087
1306
  exportCsv: "Exportar CSV",
1088
1307
  openInList: "Abrir en la lista",
@@ -1110,13 +1329,110 @@ const es = {
1110
1329
  },
1111
1330
  },
1112
1331
  addWidget: "Añadir widget",
1113
- removeWidget: "Eliminar widget",
1114
1332
  editLayout: "Editar diseño",
1115
1333
  saveLayout: "Guardar diseño",
1116
1334
  resetLayout: "Restablecer diseño",
1117
1335
  total: "Total",
1118
- noDataAvailable: "Sin datos disponibles",
1119
1336
  noDataSourceFor: "Sin fuente de datos para",
1337
+ config: {
1338
+ breadcrumb: {
1339
+ dashboard: "Panel de control",
1340
+ configuration: "Configuración",
1341
+ widget: "Widget",
1342
+ chart: "Gráfico",
1343
+ table: "Tabla",
1344
+ pivotTable: "Tabla dinámica",
1345
+ },
1346
+ section: {
1347
+ general: "General",
1348
+ layout: "Diseño",
1349
+ data: "Datos",
1350
+ dataBinding: "Vinculación de datos",
1351
+ appearance: "Apariencia",
1352
+ },
1353
+ field: {
1354
+ title: "Título",
1355
+ description: "Descripción",
1356
+ columns: "Columnas",
1357
+ gap: "Espaciado",
1358
+ rowHeight: "Altura de fila (px)",
1359
+ autoRefresh: "Actualización automática",
1360
+ showDescription: "Mostrar descripción",
1361
+ theme: "Tema",
1362
+ widgetType: "Tipo de widget",
1363
+ colorVariant: "Variante de color",
1364
+ dataset: "Conjunto de datos",
1365
+ dimensions: "Dimensiones",
1366
+ values: "Valores",
1367
+ width: "Ancho (columnas)",
1368
+ height: "Alto (filas)",
1369
+ },
1370
+ placeholder: {
1371
+ dashboardTitle: "Título del panel",
1372
+ dashboardDescription: "Resumen breve mostrado bajo el título",
1373
+ widgetTitle: "Título del widget",
1374
+ widgetDescription: "Descripción del widget",
1375
+ datasetName: "Nombre del conjunto de datos",
1376
+ selectDataset: "Seleccionar conjunto de datos…",
1377
+ searchDatasets: "Buscar conjuntos de datos…",
1378
+ addDimension: "Añadir dimensión…",
1379
+ addMeasure: "Añadir medida…",
1380
+ searchMembers: "Buscar…",
1381
+ },
1382
+ empty: {
1383
+ datasets: "No se encontraron conjuntos de datos.",
1384
+ dimensions: "No hay dimensiones seleccionadas.",
1385
+ measures: "No hay medidas seleccionadas.",
1386
+ nothingToAdd: "No queda nada por añadir.",
1387
+ },
1388
+ help: {
1389
+ dataset: "El conjunto de datos de la capa semántica al que se vincula este widget (ADR-0021).",
1390
+ dimensions: "Agrupar/dividir los valores por estas dimensiones del conjunto de datos.",
1391
+ dimensionsPivot: "Campos de agrupación/división. La última dimensión se despliega como columnas.",
1392
+ values: "Medidas del conjunto de datos que se mostrarán (al menos una).",
1393
+ },
1394
+ action: {
1395
+ add: "Añadir",
1396
+ remove: "Eliminar {{name}}",
1397
+ },
1398
+ refresh: {
1399
+ off: "Desactivado",
1400
+ every30s: "Cada 30 s",
1401
+ every1m: "Cada 1 min",
1402
+ every5m: "Cada 5 min",
1403
+ every15m: "Cada 15 min",
1404
+ every30m: "Cada 30 min",
1405
+ every1h: "Cada 1 hora",
1406
+ },
1407
+ themeOption: {
1408
+ light: "Claro",
1409
+ dark: "Oscuro",
1410
+ auto: "Automático",
1411
+ },
1412
+ widgetType: {
1413
+ metric: "Métrica",
1414
+ bar: "Gráfico de barras",
1415
+ horizontalBar: "Barras horizontales",
1416
+ line: "Gráfico de líneas",
1417
+ pie: "Gráfico circular",
1418
+ donut: "Gráfico de anillo",
1419
+ area: "Gráfico de área",
1420
+ scatter: "Gráfico de dispersión",
1421
+ funnel: "Embudo",
1422
+ table: "Tabla",
1423
+ pivot: "Tabla dinámica",
1424
+ },
1425
+ color: {
1426
+ default: "Predeterminado",
1427
+ blue: "Azul",
1428
+ teal: "Verde azulado",
1429
+ orange: "Naranja",
1430
+ purple: "Morado",
1431
+ success: "Éxito",
1432
+ warning: "Advertencia",
1433
+ danger: "Peligro",
1434
+ },
1435
+ },
1120
1436
  trend: {
1121
1437
  vsLastQuarter: "vs. trimestre anterior",
1122
1438
  vsLastMonth: "vs. mes anterior",
@@ -1126,24 +1442,6 @@ const es = {
1126
1442
  vsPreviousPeriod: "vs. período anterior",
1127
1443
  },
1128
1444
  },
1129
- configPanel: {
1130
- save: "Guardar",
1131
- discard: "Descartar",
1132
- close: "Cerrar",
1133
- layout: "Diseño",
1134
- columns: "Columnas",
1135
- gap: "Espaciado",
1136
- rowHeight: "Altura de fila",
1137
- data: "Datos",
1138
- refreshInterval: "Intervalo de actualización",
1139
- appearance: "Apariencia",
1140
- title: "Título",
1141
- showDescription: "Mostrar descripción",
1142
- theme: "Tema",
1143
- configuration: "Configuración",
1144
- general: "General",
1145
- advanced: "Avanzado",
1146
- },
1147
1445
  appDesigner: {
1148
1446
  createApp: "Crear aplicación",
1149
1447
  editApp: "Editar aplicación",
@@ -1156,10 +1454,6 @@ const es = {
1156
1454
  appDescription: "Descripción",
1157
1455
  appIcon: "Icono",
1158
1456
  template: "Plantilla",
1159
- layout: "Diseño",
1160
- layoutSidebar: "Barra lateral",
1161
- layoutHeader: "Encabezado",
1162
- layoutEmpty: "Vacío",
1163
1457
  selectObjects: "Seleccionar objetos",
1164
1458
  searchObjects: "Buscar objetos…",
1165
1459
  selectAll: "Seleccionar todo",
@@ -1168,7 +1462,6 @@ const es = {
1168
1462
  addGroup: "Agregar grupo",
1169
1463
  addUrl: "Agregar URL",
1170
1464
  addSeparator: "Agregar separador",
1171
- noNavItems: "Aún no hay elementos de navegación.",
1172
1465
  logoUrl: "URL del logo",
1173
1466
  primaryColor: "Color primario",
1174
1467
  faviconUrl: "URL del favicon",
@@ -1194,16 +1487,13 @@ const es = {
1194
1487
  showSort: "Mostrar orden",
1195
1488
  appearance: "Apariencia",
1196
1489
  rowHeight: "Altura de fila",
1197
- stripedRows: "Filas alternadas",
1198
- bordered: "Con borde",
1199
1490
  livePreview: "Vista previa en vivo",
1200
- stepBasicDesc: "Nombre, título y diseño",
1491
+ stepBasicDesc: "Nombre, título e icono",
1201
1492
  stepObjectsDesc: "Seleccionar objetos de negocio",
1202
1493
  stepNavigationDesc: "Construir árbol de navegación",
1203
1494
  stepBrandingDesc: "Logo, colores y favicon",
1204
1495
  noObjectsFound: "No se encontraron objetos.",
1205
1496
  noNavItemsHint: "Aún no hay elementos de navegación. Seleccione objetos en el paso anterior o agregue elementos manualmente.",
1206
- separator: "Separador",
1207
1497
  separatorLabel: "— Separador —",
1208
1498
  newGroup: "Nuevo grupo",
1209
1499
  newLink: "Nuevo enlace",
@@ -1237,6 +1527,7 @@ const es = {
1237
1527
  navTypeSeparator: "Separador",
1238
1528
  navTypeAction: "Acción",
1239
1529
  navTypeComponent: "Componente",
1530
+ navTypeDoc: "Documento",
1240
1531
  navEditIcon: "Editar icono",
1241
1532
  navToggleVisible: "Alternar visibilidad",
1242
1533
  navHidden: "Oculto",
@@ -1309,17 +1600,13 @@ const es = {
1309
1600
  unique: "Único",
1310
1601
  readOnly: "Solo lectura",
1311
1602
  hidden: "Oculto",
1312
- indexed: "Indexado",
1313
1603
  externalId: "ID externo",
1314
1604
  trackHistory: "Rastrear historial",
1315
1605
  defaultValue: "Valor predeterminado",
1316
1606
  placeholder: "Marcador de posición",
1317
1607
  referenceTo: "Referencia a",
1318
- formula: "Fórmula",
1319
1608
  options: "Opciones",
1320
1609
  addOption: "Agregar opción",
1321
- validationRules: "Reglas de validación",
1322
- addRule: "Agregar regla",
1323
1610
  systemBadge: "Sistema",
1324
1611
  ungrouped: "General",
1325
1612
  deleteConfirmTitle: "¿Eliminar campo?",
@@ -1338,7 +1625,23 @@ const es = {
1338
1625
  },
1339
1626
  },
1340
1627
  console: {
1628
+ studio: {
1629
+ backToHome: "Volver al inicio",
1630
+ },
1341
1631
  saveAdvisoryTitle: "Guardado: la comprobación de creación generó {{count}} recomendación(es)",
1632
+ saveAdvisoryTitle_one: "Guardado: la comprobación de creación generó {{count}} recomendación",
1633
+ saveAdvisoryTitle_many: "Guardado: la comprobación de creación generó {{count}} de recomendaciones",
1634
+ saveAdvisoryTitle_other: "Guardado: la comprobación de creación generó {{count}} recomendaciones",
1635
+ publishAdvisoryTitle: "Publicado: la comprobación de creación generó {{count}} recomendación(es)",
1636
+ publishAdvisoryTitle_one: "Publicado: la comprobación de creación generó {{count}} recomendación",
1637
+ publishAdvisoryTitle_many: "Publicado: la comprobación de creación generó {{count}} de recomendaciones",
1638
+ publishAdvisoryTitle_other: "Publicado: la comprobación de creación generó {{count}} recomendaciones",
1639
+ importMappingsUnavailable: "No se pudieron cargar las asignaciones de importación guardadas de {{object}}",
1640
+ importMappingsRefused: "El servidor rechazó esta solicitud, por lo que la lista está vacía porque no se pudo leer, no porque no haya nada registrado. Vuelve a iniciar sesión o pide acceso a un administrador.",
1641
+ importMappingsUnreadable: "Esta lista está vacía porque no se pudo leer, no porque no haya nada registrado. Inténtalo de nuevo e informa del problema si continúa.",
1642
+ savedViewsUnavailable: "No se pudieron cargar las vistas guardadas de {{object}}",
1643
+ savedViewsRefused: "El servidor rechazó esta solicitud, por lo que la lista está vacía porque no se pudo leer, no porque este objeto no tenga vistas guardadas. Vuelve a iniciar sesión o pide acceso a un administrador.",
1644
+ savedViewsUnreadable: "Esta lista está vacía porque no se pudo leer, no porque este objeto no tenga vistas guardadas. Inténtalo de nuevo e informa del problema si continúa.",
1342
1645
  settingsHub: {
1343
1646
  title: "Configuración",
1344
1647
  subtitle: "Configure su espacio de trabajo, las integraciones y los indicadores de funciones.",
@@ -1383,6 +1686,13 @@ const es = {
1383
1686
  passwordsDownload: "Descargar CSV",
1384
1687
  },
1385
1688
  ai: {
1689
+ pendingDrafts: {
1690
+ count: "{{count}} cambio(s) aún no se han publicado — los usuarios no pueden verlos.",
1691
+ publish: "Publicar",
1692
+ published: "Todos los cambios pendientes están activos.",
1693
+ failed: "Error al publicar.",
1694
+ publishedWithFindings: "Publicado, pero las comprobaciones en tiempo de ejecución detectaron problemas: {{detail}}",
1695
+ },
1386
1696
  usage: {
1387
1697
  title: "Uso de IA",
1388
1698
  meterBuild: "Crear",
@@ -1392,9 +1702,18 @@ const es = {
1392
1702
  statusFull: "Límite alcanzado",
1393
1703
  resetsDaily: "Se restablece esta noche",
1394
1704
  resetsMonthly: "Se restablece en el próximo ciclo",
1705
+ resetsWeeklyDays: "Se restablece en {{count}} días",
1706
+ resetsWeeklyDays_one: "Se restablece en {{count}} día",
1707
+ resetsWeeklyDays_many: "Se restablece en {{count}} de días",
1708
+ resetsWeeklyDays_other: "Se restablece en {{count}} días",
1709
+ resetsWeeklyHours: "Se restablece en {{count}} horas",
1710
+ resetsWeeklyHours_one: "Se restablece en {{count}} hora",
1711
+ resetsWeeklyHours_many: "Se restablece en {{count}} de horas",
1712
+ resetsWeeklyHours_other: "Se restablece en {{count}} horas",
1395
1713
  ctaUpgrade: "Mejore el plan para continuar",
1396
1714
  ctaTopUp: "Añada créditos para continuar",
1397
1715
  ariaLabel: "Uso de IA: {{status}}",
1716
+ breakdownTitle: "Usado hasta ahora",
1398
1717
  },
1399
1718
  workspaceTitle: "Espacio de trabajo de IA",
1400
1719
  workspaceSubtitle: "Pregunte, inspeccione y retome conversaciones",
@@ -1404,6 +1723,31 @@ const es = {
1404
1723
  share: "Compartir",
1405
1724
  shareTitle: "Compartir esta conversación",
1406
1725
  shareDisabledTitle: "Empiece a chatear para habilitar el uso compartido",
1726
+ buildDoctor: "Diagnóstico de compilación",
1727
+ buildDoctorTitle: "Diagnóstico de compilación — ¿qué se aplicó realmente?",
1728
+ buildDoctorDisabledTitle: "Envíe primero un mensaje",
1729
+ buildDoctorDrawer: {
1730
+ description: 'Lo que el agente afirmó frente a lo que está realmente activo. Diagnóstico de solo lectura.',
1731
+ reconciling: 'Conciliando…',
1732
+ notAvailable: 'No disponible — no se encontró la conversación o no tiene autorización.',
1733
+ untitled: '(sin título)',
1734
+ summary: '{{turns}} turno(s) · {{messages}} msj · {{tokens}} tok · {{seconds}} s LLM',
1735
+ allLive: 'Los {{count}} cambio(s) intentado(s) están activos — no se perdió nada.',
1736
+ discrepancies: '{{count}} discrepancia(s) — lo que dijo el chat no coincide con lo que está activo.',
1737
+ orphanedTitle: 'Propuesto pero nunca aplicado',
1738
+ orphanedHint: 'Una tarjeta de confirmación que el agente propuso pero que ningún turno posterior aplicó — el cambio se perdió sin aviso.',
1739
+ missingTitle: 'Afirmado pero ausente',
1740
+ missingHint: 'Un resultado de herramienta indicó que se aplicó, pero el artefacto no está activo en sys_metadata.',
1741
+ toolErrorsTitle: 'Errores de herramientas',
1742
+ toolErrorsHint: 'Llamadas a herramientas que devolvieron un error durante la compilación.',
1743
+ verifyTitle: 'Comprobación de compilación (verify_build)',
1744
+ yourApp: 'Su aplicación:',
1745
+ noIssues: '0 problemas',
1746
+ issueCount: '{{count}} problema(s)',
1747
+ platformNoise: '{{count}} hallazgo(s) sys_* de la plataforma oculto(s)',
1748
+ pendingActions: 'Acciones pendientes',
1749
+ timeline: 'Cronología ({{count}})',
1750
+ },
1407
1751
  newChat: "Nuevo",
1408
1752
  searchChats: "Buscar chats…",
1409
1753
  noChatsYet: "Todavía no hay chats",
@@ -1433,7 +1777,7 @@ const es = {
1433
1777
  empty: {
1434
1778
  build: {
1435
1779
  title: "Crear con IA",
1436
- 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.",
1780
+ description: "Describa una aplicación en lenguaje natural — yo redacto los objetos, las pantallas y los datos de ejemplo, y luego usted revisa y publica.",
1437
1781
  },
1438
1782
  ask: {
1439
1783
  title: "Pregunte a sus datos",
@@ -1442,7 +1786,7 @@ const es = {
1442
1786
  editApp: {
1443
1787
  title: "Editando «{{app}}»",
1444
1788
  titleGeneric: "Editar esta aplicación",
1445
- 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.",
1789
+ description: "¿Qué desea cambiar? Modifico esta aplicación sobre la marcha — añadir un campo, un objeto, una vista o un panel, o ajustar lo que ya existe.",
1446
1790
  },
1447
1791
  },
1448
1792
  clearConversation: "Borrar",
@@ -1495,29 +1839,52 @@ const es = {
1495
1839
  recentRecords: "Enumera los 5 registros creados más recientemente.",
1496
1840
  recordCounts: "Cuenta los registros de cada objeto.",
1497
1841
  },
1842
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1843
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1844
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1845
+ // wording that promises autonomous behaviour (alert / remind / notify /
1846
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1847
+ // the model silently degrades such a request into a board or a filtered
1848
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1849
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1498
1850
  metadataAssistant: {
1499
- buildCrm: "Crea un CRM de ventas — clientes, contactos y un embudo de oportunidades que pueda totalizar por etapa.",
1500
- buildApp: "Crea un seguimiento de proyectos — proyectos, tareas con responsables y fechas de vencimiento, y un tablero por estado.",
1501
- buildFlow: "Diseña una mesa de ayuda — tickets con prioridad, un flujo de estados y vínculos con los clientes.",
1502
- buildInventory: "Crea una aplicación de inventario — productos, niveles de stock, proveedores y visibilidad de stock bajo.",
1503
- buildRecruiting: "Crea un seguimiento de candidaturas — candidatos, vacantes, etapas de entrevista y notas.",
1851
+ buildCrm: "Crea un CRM de ventas — clientes, contactos y oportunidades con un campo de etapa, y un panel que sume el importe por etapa.",
1852
+ buildApp: "Crea un seguimiento de proyectos — proyectos, tareas con responsables y fechas de vencimiento, un tablero por estado y un calendario de vencimientos.",
1853
+ buildFlow: "Diseña una mesa de ayuda — tickets con campos de prioridad y estado, un tablero por estado y vínculos con los clientes.",
1854
+ buildInventory: "Crea una aplicación de inventario — productos, niveles de stock, proveedores y una vista que filtre los artículos por debajo de su punto de pedido.",
1855
+ buildRecruiting: "Crea un seguimiento de candidaturas — candidatos, vacantes, un campo de etapa de entrevista y un tablero por etapa.",
1504
1856
  },
1505
1857
  generic: {
1506
1858
  help: "¿En qué puedes ayudarme?",
1507
1859
  availableObjects: "Enumera los objetos de datos disponibles.",
1508
1860
  recentActivity: "Resume mi actividad reciente.",
1509
1861
  },
1862
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1863
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1864
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1865
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1866
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1867
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1868
+ // no data is what an existing app most often lacks. REVERT: when
1869
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1870
+ // comes back as `addAutomation`; the retired string is pinned for every
1871
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1510
1872
  editApp: {
1511
1873
  addField: "Añade un campo a uno de los objetos.",
1512
1874
  addObject: "Añade un objeto nuevo y relaciónalo con uno existente.",
1513
1875
  addDashboard: "Añade un panel para las métricas clave.",
1514
- addAutomation: "Añade una automatización — una aprobación, un flujo de estados o una notificación.",
1876
+ addSampleData: "Rellena los objetos existentes con registros de ejemplo realistas para poder mostrar la aplicación.",
1515
1877
  },
1516
1878
  },
1517
1879
  changesTitle: "Confirmar cambios",
1518
1880
  changesConfirmed: "Confirmado",
1519
1881
  changesConfirm: "Confirmar",
1520
1882
  changesConfirmHint: "Responda para confirmar o ajustar este cambio.",
1883
+ changesApplying: "Aplicando…",
1884
+ changesApplied: "Aplicado",
1885
+ changesDrafted: "Guardado como borrador",
1886
+ changesFailed: "No aplicado",
1887
+ discussing: "Tratando: {{target}}",
1521
1888
  changeVerb: {
1522
1889
  createObject: "Crear objeto",
1523
1890
  addField: "Añadir campo",
@@ -1588,6 +1955,13 @@ const es = {
1588
1955
  pages: "Páginas",
1589
1956
  reports: "Informes",
1590
1957
  system: "Sistema",
1958
+ marketplace: "Marketplace",
1959
+ settings: 'Configuración',
1960
+ apps: 'Aplicaciones',
1961
+ profile: 'Perfil',
1962
+ approvals: 'Aprobaciones',
1963
+ aiApprovals: 'Aprobaciones de IA',
1964
+ auditLog: 'Registro de auditoría',
1591
1965
  },
1592
1966
  // objectui#4024 — the single-namespace settings screen. Its sibling
1593
1967
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1607,6 +1981,7 @@ const es = {
1607
1981
  saveChanges: "Guardar cambios",
1608
1982
  unsavedCount: "{{count}} cambios sin guardar",
1609
1983
  unsavedCount_one: "{{count}} cambio sin guardar",
1984
+ unsavedCount_many: "{{count}} de cambios sin guardar",
1610
1985
  unsavedCount_other: "{{count}} cambios sin guardar",
1611
1986
  cryptoRefusalTitle: "Esta instalación no puede cifrar secretos",
1612
1987
  cryptoRefusalSubjectSuffix: "está declarado como cifrado, por lo que no se escribió nada.",
@@ -1679,6 +2054,21 @@ const es = {
1679
2054
  records: "Registros",
1680
2055
  recentRecords: "Visto recientemente",
1681
2056
  },
2057
+ // objectui#9954 — see the `en` pack for what raises each case.
2058
+ readRate: {
2059
+ ratioTitle: 'Volumen de lectura inusual en este entorno',
2060
+ ratio: 'Se leen {{ratio}} filas por cada fila escrita. La plataforma señala todo lo que supere {{threshold}}. No se limita ni se bloquea nada; es un informe para que se pueda revisar el patrón de lectura.',
2061
+ noWritesTitle: 'Lecturas sin ninguna escritura en este entorno',
2062
+ noWrites: 'Se están leyendo filas sin escribir ninguna, por lo que la tasa de lectura no tiene límite superior. Es la lectura más grave. La plataforma señala todo lo que supere {{threshold}}. No se limita ni se bloquea nada; es un informe para que se pueda revisar el patrón de lectura.',
2063
+ },
2064
+ // objectui#10439 — see the `en` pack for what raises each case.
2065
+ storageUsage: {
2066
+ warningTitle: 'El almacenamiento se está llenando',
2067
+ warning: '{{used}} MB de {{limit}} MB usados. Las cargas y las importaciones se pausan cuando el almacenamiento está lleno.',
2068
+ blockedTitle: 'Almacenamiento lleno: las cargas y las importaciones están en pausa',
2069
+ blocked: '{{used}} MB de {{limit}} MB usados. Los datos existentes no se modifican, y la lectura, la exportación y la edición de registros individuales siguen funcionando.',
2070
+ upgrade: 'Mejore el plan para continuar',
2071
+ },
1682
2072
  errors: {
1683
2073
  somethingWentWrong: "Algo salió mal",
1684
2074
  unexpectedError: "Ocurrió un error inesperado al renderizar esta vista.",
@@ -1709,6 +2099,7 @@ const es = {
1709
2099
  viewNameInvalid: "Use minúsculas, números y guiones bajos; empiece por una letra o un guion bajo.",
1710
2100
  systemViewReadonly: "Vista del sistema definida en el código: solo lectura.",
1711
2101
  cannotEditMetaView: "Esta vista está integrada y definida en el código: no se puede modificar.",
2102
+ viewConfigPermissionDenied: "La configuración de la vista se aplica a todos los usuarios que la utilizan, por lo que modificarla requiere el permiso «Administrar metadatos». Pida a un administrador que realice este cambio.",
1712
2103
  cannotDeleteMetaView: "Esta vista está integrada y definida en el código: no se puede eliminar.",
1713
2104
  expandToPage: "Abrir como página completa",
1714
2105
  objectNotFound: "Objeto no encontrado",
@@ -1717,101 +2108,35 @@ const es = {
1717
2108
  filterOrNotSavable: "Este filtro une las condiciones con O, algo que una vista guardada aún no puede almacenar. Se sigue aplicando a esta lista: quite la agrupación O para guardarlo en la vista.",
1718
2109
  filterNestedNotSavable: "Este filtro usa grupos de condiciones anidados, que una vista guardada no puede almacenar. Conviértalo en una única lista de condiciones para guardarlo en la vista.",
1719
2110
  allRecords: "Todos los registros",
1720
- exitDesignMode: "Salir del modo de diseño",
1721
- enterDesignMode: "Entrar en modo de diseño",
1722
- metadataInspector: "Inspector de metadatos",
1723
- editView: "Editar vista",
1724
- addView: "Agregar vista",
1725
- designTools: "Herramientas de diseño",
1726
2111
  new: "Nuevo",
1727
2112
  configureView: "Configurar vista",
1728
- closePanel: "Cerrar panel",
1729
- page: "Página",
1730
- pageConfigHint: "Barra de herramientas, navegación y configuración del shell de vista",
1731
- listConfigHint: "Renderizado de datos, columnas y apariencia para este tipo de lista",
1732
- general: "General",
1733
- generalHint: "Título, descripción y tipo de la vista",
1734
- toolbar: "Barra de herramientas",
1735
- toolbarHint: "Búsqueda, filtro, orden, agrupación y alternancia de densidad",
1736
2113
  toolbarEnabledCount: "{{count}} de {{total}} habilitados",
1737
- navigationSection: "Navegación",
1738
- navigationHint: "Comportamiento al hacer clic en la fila y configuración de la vista detallada",
1739
- records: "Registros",
1740
- recordsHint: "Modo de selección, agregar registro y edición en línea",
1741
- exportPrint: "Exportar e imprimir",
1742
- exportPrintHint: "Formatos de exportación, impresión y visualización del recuento de registros",
1743
- showAllFields: "Mostrar todo",
1744
- hideAllFields: "Ocultar todo",
1745
2114
  searchFields: "Buscar campos…",
1746
2115
  title: "Título",
1747
- description: "Descripción",
1748
- data: "Datos",
1749
- source: "Fuente",
1750
- columns: "Columnas",
1751
- filterBy: "Filtrar por",
1752
- sortBy: "Ordenar por",
1753
- appearance: "Apariencia",
1754
- showDescription: "Mostrar descripción",
1755
2116
  viewType: "Tipo de vista",
1756
- userFilters: "Filtros de usuario",
1757
- enableSearch: "Habilitar búsqueda",
1758
- enableFilter: "Habilitar filtro",
1759
- enableSort: "Habilitar ordenamiento",
1760
- enableHideFields: "Habilitar ocultar campos",
1761
- enableGroup: "Habilitar agrupación",
1762
- enableColor: "Habilitar color",
1763
- enableDensity: "Habilitar densidad",
1764
- userActions: "Acciones de usuario",
1765
- addRecordViaForm: "Agregar registros mediante formulario",
1766
- advanced: "Avanzado",
1767
- allowExport: "Permitir exportación",
1768
2117
  recordCount: "{{count}} registros",
1769
- noDescription: "Sin descripción",
1770
- none: "Ninguno",
1771
- columnsConfigured: "{{count}} columnas",
2118
+ recordCount_one: "{{count}} registro",
2119
+ recordCount_many: "{{count}} de registros",
2120
+ recordCount_other: "{{count}} registros",
1772
2121
  save: "Guardar",
1773
2122
  discard: "Descartar",
1774
2123
  createView: "Crear vista",
1775
2124
  newView: "Nueva vista",
1776
- typeOptions: "Opciones de tipo",
1777
2125
  groupByField: "Campo de agrupación",
1778
2126
  startDateField: "Campo de fecha de inicio",
1779
2127
  titleField: "Campo de título",
1780
2128
  latitudeField: "Campo de latitud",
1781
2129
  longitudeField: "Campo de longitud",
1782
2130
  imageField: "Campo de imagen",
1783
- dateField: "Campo de fecha",
1784
2131
  selectField: "Seleccionar campo…",
1785
- gridOptionsHint: "La vista de cuadrícula usa las columnas configuradas arriba.",
1786
- groupBy: "Agrupar por",
1787
- prefixField: "Campo de prefijo",
1788
- fields: "Campos",
1789
- fieldsVisible: "{{count}} visibles",
1790
- sortsCount: "{{count}} ordenamientos",
1791
- filtersCount: "{{count}} filtros",
1792
2132
  endDateField: "Campo de fecha de fin",
1793
- color: "Color",
1794
- fieldTextColor: "Color del texto del campo",
1795
- rowHeight: "Altura de fila",
1796
- wrapHeaders: "Ajustar encabezados",
1797
- showFieldDescriptions: "Mostrar descripciones de campos",
1798
- collapseAllByDefault: "Contraer todo por defecto",
1799
- striped: "Filas alternadas",
1800
- bordered: "Celdas con borde",
1801
- inlineEdit: "Editar registros en línea",
1802
- addDeleteRecordsInline: "Agregar/eliminar registros en línea",
1803
- clickIntoRecordDetails: "Clic para detalles del registro",
1804
- navigationMode: "Modo de navegación",
1805
- navigationWidth: "Ancho de navegación",
1806
- navigationWidthHint: "Disponible para los modos de navegación cajón, modal y dividido",
1807
- openNewTab: "Abrir en nueva pestaña",
1808
- openNewTabHint: "Disponible para los modos de navegación página y nueva ventana",
1809
2133
  import: "Importar",
1810
2134
  importTitle: "Importar desde CSV",
1811
2135
  importedToast: "{{count}} fila(s) importada(s).",
2136
+ importedToast_one: "{{count}} fila importada.",
2137
+ importedToast_many: "{{count}} de filas importadas.",
2138
+ importedToast_other: "{{count}} filas importadas.",
1812
2139
  importedWithSkipped: "{{ok}} fila(s) importada(s); {{skipped}} omitida(s).",
1813
- showAdvancedSettings: "Mostrar configuración avanzada",
1814
- showFewerSettings: "Mostrar menos configuraciones",
1815
2140
  createViewDesc: "Elija un tipo de vista y asígnele un nombre. Todas las configuraciones se pueden cambiar después.",
1816
2141
  cancel: "Cancelar",
1817
2142
  create: "Crear",
@@ -1819,6 +2144,9 @@ const es = {
1819
2144
  deleteViewTitle: "Eliminar vista",
1820
2145
  deleteViewConfirm: "¿Eliminar la vista \"{{name}}\"? Esto no se puede deshacer.",
1821
2146
  bulkDeleteConfirm: "¿Eliminar {{count}} registros seleccionados? Esto no se puede deshacer.",
2147
+ bulkDeleteConfirm_one: "¿Eliminar {{count}} registro seleccionado? Esto no se puede deshacer.",
2148
+ bulkDeleteConfirm_many: "¿Eliminar {{count}} de registros seleccionados? Esto no se puede deshacer.",
2149
+ bulkDeleteConfirm_other: "¿Eliminar {{count}} registros seleccionados? Esto no se puede deshacer.",
1822
2150
  duplicateViewName: "Ya existe una vista con ese nombre.",
1823
2151
  viewTypeGrid: "Cuadrícula",
1824
2152
  viewTypeGridDesc: "Tabla tipo hoja de cálculo de registros.",
@@ -1855,62 +2183,17 @@ const es = {
1855
2183
  chartTypePie: "Gráfico circular",
1856
2184
  chartTypeArea: "Gráfico de área",
1857
2185
  chartTypeScatter: "Gráfico de dispersión",
1858
- xAxisField: "Campo eje X",
1859
- xAxisFieldHelp: "La dimensión categórica o temporal.",
1860
- yAxisField: "Campo eje Y",
1861
- yAxisFieldHelp: "El campo numérico para agregar.",
1862
- selectionMode: "Modo de selección",
1863
- selectionNone: "Ninguno",
1864
- selectionSingle: "Individual",
1865
- selectionMultiple: "Múltiple",
1866
- pageSize: "Tamaño de página",
1867
- pageSizeOptions: "Opciones de tamaño de página",
1868
- exportFormats: "Formatos de exportación",
1869
- exportMaxRecords: "Máximo de registros",
1870
- exportIncludeHeaders: "Incluir encabezados",
1871
- exportFileNamePrefix: "Prefijo de nombre de archivo",
1872
- searchableFields: "Campos buscables",
1873
- filterableFields: "Campos filtrables",
1874
- resizableColumns: "Columnas redimensionables",
1875
- densityCompact: "Compacto",
1876
- densityComfortable: "Normal",
1877
- densitySpacious: "Espacioso",
1878
- densityMode: "Modo de densidad",
1879
- hiddenFields: "Campos ocultos",
1880
- rowActions: "Acciones de fila",
1881
- bulkActions: "Acciones masivas",
1882
- sharing: "Compartir",
1883
- sharingEnabled: "Compartir habilitado",
1884
- sharingVisibility: "Visibilidad",
1885
- addRecordEnabled: "Agregar registro habilitado",
1886
- addRecordPosition: "Posición",
1887
- addRecordMode: "Modo",
1888
- addRecordFormView: "Vista de formulario",
1889
- conditionalFormatting: "Formato condicional",
1890
- addRule: "Agregar regla",
1891
- quickFilters: "Filtros rápidos",
1892
- addQuickFilter: "Agregar filtro rápido",
1893
- ufElements: "Elementos",
1894
- ufDropdown: "Desplegable",
2186
+ dataset: "Conjunto de datos",
2187
+ datasetHelp: "El gráfico lee sus valores de este conjunto de datos del objeto.",
2188
+ chartMeasure: "Medida",
2189
+ chartMeasureHelp: "La medida del conjunto de datos representada en el eje de valores.",
2190
+ chartDimension: "Dimensión",
2191
+ chartDimensionHelp: "La dimensión del conjunto de datos por la que se agrupan los valores (opcional).",
2192
+ viewTypeUnavailableDataset: "Este objeto no expone ningún conjunto de datos para graficar.",
2193
+ noDatasetMeasure: "Este conjunto de datos no declara ninguna medida para graficar.",
1895
2194
  ufTabs: "Pestañas",
1896
- ufToggle: "Alternar",
1897
2195
  ufAddField: "+ Agregar campo de filtro…",
1898
- ufNoFields: "Sin campos disponibles",
1899
- ufAddTab: "+ Agregar pestaña",
1900
- ufTabLabel: "Etiqueta",
1901
2196
  ufShowAllRecords: "Mostrar pestaña \"Todos los registros\"",
1902
- ufAllowAddTab: "Permitir agregar pestañas",
1903
- showRecordCount: "Mostrar recuento de registros",
1904
- allowPrinting: "Permitir impresión",
1905
- virtualScroll: "Desplazamiento virtual",
1906
- emptyStateTitle: "Título de estado vacío",
1907
- emptyStateMessage: "Mensaje de estado vacío",
1908
- emptyStateIcon: "Ícono de estado vacío",
1909
- ariaLabel: "Etiqueta ARIA",
1910
- ariaDescribedBy: "Descrito por ARIA",
1911
- ariaLive: "ARIA en vivo",
1912
- accessibility: "Accesibilidad",
1913
- viewTabs: "Pestañas de vista",
1914
2197
  },
1915
2198
  localeSwitcher: {
1916
2199
  label: "Idioma",
@@ -1921,6 +2204,9 @@ const es = {
1921
2204
  unpinItem: "Desfijar {{name}}",
1922
2205
  dragToReorder: "Arrastrar para reordenar",
1923
2206
  favorites: "Favoritos",
2207
+ launcherLabel: "Lanzador de aplicaciones",
2208
+ menuLabel: "Navegación de la aplicación",
2209
+ menuEmpty: "Esta aplicación no tiene entradas de navegación que puedas abrir.",
1924
2210
  },
1925
2211
  },
1926
2212
  auth: {
@@ -1974,6 +2260,8 @@ const es = {
1974
2260
  resendOtpCountdownText: "Reenviar en {seconds} s",
1975
2261
  usePhoneOtpText: "Iniciar sesión con código de verificación",
1976
2262
  usePasswordSignInText: "Iniciar sesión con contraseña en su lugar",
2263
+ socialButton: "Continuar con {provider}",
2264
+ orText: "o continúe con correo electrónico",
1977
2265
  },
1978
2266
  register: {
1979
2267
  title: "Crear una cuenta",
@@ -1992,8 +2280,12 @@ const es = {
1992
2280
  submittingButton: "Creando cuenta…",
1993
2281
  hasAccountText: "¿Ya tienes una cuenta?",
1994
2282
  signInText: "Iniciar sesión",
2283
+ socialButton: "Registrarse con {provider}",
2284
+ orText: "o continúe con correo electrónico",
1995
2285
  errors: {
1996
2286
  userExists: "Ya existe una cuenta con ese correo. Intente iniciar sesión.",
2287
+ selfRegistrationClosed: "El registro por cuenta propia no está abierto en este entorno. Solicite una invitación a un administrador.",
2288
+ emailDomainNotAllowed: "El dominio de este correo no está autorizado para registrarse aquí. Use el correo de su organización o solicite una invitación a un administrador.",
1997
2289
  },
1998
2290
  verifyInbox: {
1999
2291
  title: "Revise su bandeja de entrada",
@@ -2012,7 +2304,7 @@ const es = {
2012
2304
  submitButton: "Enviar enlace de restablecimiento",
2013
2305
  submittingButton: "Enviando…",
2014
2306
  successTitle: "Revisa tu correo electrónico",
2015
- successDescription: "Hemos enviado un enlace para restablecer la contraseña a {{email}}. Por favor revisa tu bandeja de entrada.",
2307
+ successDescription: "Hemos enviado un enlace para restablecer la contraseña a {email}. Por favor revisa tu bandeja de entrada.",
2016
2308
  backToSignInText: "Volver a iniciar sesión",
2017
2309
  rememberPasswordText: "¿Recuerdas tu contraseña?",
2018
2310
  signInText: "Iniciar sesión",
@@ -2192,6 +2484,15 @@ const es = {
2192
2484
  role: "Rol",
2193
2485
  save: "Guardar cambios",
2194
2486
  },
2487
+ language: {
2488
+ title: "Idioma",
2489
+ description: "El idioma que se usa para las notificaciones y los mensajes que se le envían. El idioma de la interfaz se elige aparte, en el menú del globo terráqueo.",
2490
+ label: "Idioma preferido",
2491
+ systemDefault: "Usar el valor predeterminado del despliegue",
2492
+ save: "Guardar",
2493
+ saved: "Preferencia de idioma actualizada.",
2494
+ readOnly: "El idioma de su cuenta lo gestiona su administrador.",
2495
+ },
2195
2496
  password: {
2196
2497
  changeTitle: "Cambiar contraseña",
2197
2498
  setTitle: "Establecer contraseña local",
@@ -2223,7 +2524,6 @@ const es = {
2223
2524
  label: "Espacios de trabajo",
2224
2525
  default: "Mi espacio de trabajo",
2225
2526
  switch: "Cambiar espacio de trabajo",
2226
- create: "Crear espacio de trabajo",
2227
2527
  createTitle: "Crear un espacio de trabajo",
2228
2528
  createDescription: "Un espacio de trabajo es un lugar compartido para que tu equipo colabore.",
2229
2529
  createButton: "Crear espacio de trabajo",
@@ -2248,7 +2548,6 @@ const es = {
2248
2548
  packageManagement: "Gestión de paquetes",
2249
2549
  searchNavigation: "Buscar en la navegación…",
2250
2550
  settings: "Configuración",
2251
- help: "Ayuda",
2252
2551
  helpTooltip: "Ayuda y documentación",
2253
2552
  activityFeed: "Feed de actividad",
2254
2553
  notifications: "Notificaciones",
@@ -2287,10 +2586,12 @@ const es = {
2287
2586
  build: {
2288
2587
  title: "Crear una aplicación",
2289
2588
  subtitle: "Empiece desde cero — diseñe objetos, formularios, automatizaciones e interfaces.",
2589
+ noCapability: "La creación de aplicaciones no está disponible en este espacio de trabajo: requiere el permiso «Gestionar metadatos», que su cuenta no tiene.",
2290
2590
  },
2291
2591
  template: {
2292
2592
  title: "Empezar con una plantilla",
2293
2593
  subtitle: "Instale una aplicación de plantilla desde el mercado y personalícela.",
2594
+ marketplaceDisabled: "Este runtime no tiene un marketplace de aplicaciones configurado, por lo que no hay plantillas que instalar aquí.",
2294
2595
  },
2295
2596
  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.",
2296
2597
  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.",
@@ -2306,6 +2607,9 @@ const es = {
2306
2607
  },
2307
2608
  pendingDrafts: {
2308
2609
  message: "Tiene {{count}} cambio(s) sin publicar — publíquelos para activarlos.",
2610
+ message_one: "Tiene {{count}} cambio sin publicar — publíquelo para activarlo.",
2611
+ message_many: "Tiene {{count}} de cambios sin publicar — publíquelos para activarlos.",
2612
+ message_other: "Tiene {{count}} cambios sin publicar — publíquelos para activarlos.",
2309
2613
  cta: "Publicar",
2310
2614
  publishing: "Publicando…",
2311
2615
  published: "¡Publicado! Sus cambios están activos.",
@@ -2320,7 +2624,6 @@ const es = {
2320
2624
  capabilityWarn: "Comprobación de autoría: {{count}} referencia(s) de capacidad no apuntan a nada.",
2321
2625
  },
2322
2626
  title: "Inicio",
2323
- subtitle: "Panel de tu espacio de trabajo",
2324
2627
  nav: "Inicio",
2325
2628
  allApps: "Todas las aplicaciones",
2326
2629
  yourApps: "Tus aplicaciones",
@@ -2332,8 +2635,6 @@ const es = {
2332
2635
  empty: "Estás al día",
2333
2636
  },
2334
2637
  loading: "Cargando espacio de trabajo…",
2335
- recent: "Recientes",
2336
- starred: "Destacados",
2337
2638
  welcome: "Bienvenido a ObjectUI",
2338
2639
  welcomeDescription: "Comienza creando tu primera aplicación o configura los ajustes del sistema.",
2339
2640
  createFirstApp: "Crea tu primera aplicación",
@@ -2341,8 +2642,6 @@ const es = {
2341
2642
  browseMarketplace: "Explorar marketplace de apps",
2342
2643
  quickActions: {
2343
2644
  title: "Acciones rápidas",
2344
- createApp: "Crear app",
2345
- createAppDesc: "Comienza con una nueva aplicación",
2346
2645
  manageObjects: "Gestionar objetos",
2347
2646
  manageObjectsDesc: "Configura modelos de datos",
2348
2647
  systemSettings: "Configuración del sistema",
@@ -2358,18 +2657,15 @@ const es = {
2358
2657
  greetingNight: "Turno de noche",
2359
2658
  heroTagline: "Continúe donde lo dejó o descubra algo nuevo.",
2360
2659
  open: "Abrir",
2361
- stats: {
2362
- apps: "Aplicaciones",
2363
- starred: "Destacados",
2364
- recent: "Recientes",
2365
- },
2366
2660
  recentApps: {
2367
2661
  title: "Abiertos recientemente",
2368
2662
  itemType: {
2369
2663
  object: "Objeto",
2370
2664
  dashboard: "Panel",
2371
2665
  page: "Página",
2666
+ report: "Informe",
2372
2667
  record: "Registro",
2668
+ metadata: "Metadatos",
2373
2669
  },
2374
2670
  },
2375
2671
  starredApps: {
@@ -2391,7 +2687,6 @@ const es = {
2391
2687
  organizations: "Organizaciones",
2392
2688
  roles: "Roles",
2393
2689
  configuration: "Configuración",
2394
- createApp: "Crear aplicación",
2395
2690
  administration: "Administración",
2396
2691
  datasources: "Fuentes de datos",
2397
2692
  documentation: "Documentación",
@@ -2416,6 +2711,7 @@ const es = {
2416
2711
  typeUpdate: "Actualizar",
2417
2712
  typeDelete: "Eliminar",
2418
2713
  typeComment: "Comentario",
2714
+ typeSystem: "Sistema",
2419
2715
  relativeJustNow: "ahora mismo",
2420
2716
  relativeSecondsAgo: "hace {{count}}s",
2421
2717
  relativeMinutesAgo: "hace {{count}}m",
@@ -2437,8 +2733,13 @@ const es = {
2437
2733
  placeholder: "Buscar objetos, paneles, páginas, informes…",
2438
2734
  inputAriaLabel: "Buscar objetos, paneles, páginas, informes",
2439
2735
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2440
- resultsCountPlural: "{{count}} resultados para \"{{query}}\"",
2736
+ resultsCount_one: "{{count}} resultado para \"{{query}}\"",
2737
+ resultsCount_many: "{{count}} de resultados para \"{{query}}\"",
2738
+ resultsCount_other: "{{count}} resultados para \"{{query}}\"",
2441
2739
  itemsAvailable: "{{count}} elementos disponibles",
2740
+ itemsAvailable_one: "{{count}} elemento disponible",
2741
+ itemsAvailable_many: "{{count}} de elementos disponibles",
2742
+ itemsAvailable_other: "{{count}} elementos disponibles",
2442
2743
  noResults: "Sin resultados encontrados",
2443
2744
  noResultsHint: "Intente ajustar sus términos de búsqueda",
2444
2745
  typeObjects: "Objetos",
@@ -2463,7 +2764,11 @@ const es = {
2463
2764
  noAppsConfigured: "Sin aplicaciones configuradas",
2464
2765
  noAppsConfiguredDescription: "No hay aplicaciones registradas. Cree su primera aplicación o visite la configuración del sistema.",
2465
2766
  appNotAvailable: "Aplicación no disponible",
2466
- appNotAvailableDescription: "Esta aplicación aún no está disponible — puede que todavía se esté publicando. Vuelva a intentarlo en un momento.",
2767
+ appNotAvailableDescription: "Esta aplicación no está disponible — vuelva a intentarlo en un momento.",
2768
+ appNotFound: "No se puede abrir esta aplicación",
2769
+ appNotFoundDescription: "El servidor no devolvió esta aplicación para su cuenta.",
2770
+ appUnreachable: "No se pudo conectar con el servidor",
2771
+ appUnreachableDescription: "No se pudo comprobar esta aplicación. Vuelva a intentarlo en un momento.",
2467
2772
  appAccessDenied: "No tiene acceso a esta aplicación",
2468
2773
  appAccessDeniedDescription: "Esta aplicación existe, pero su cuenta no está autorizada para abrirla. Solicite acceso a un administrador.",
2469
2774
  appAccessDeniedHome: "Volver al inicio",
@@ -2473,31 +2778,16 @@ const es = {
2473
2778
  recordNotFound: "Registro no encontrado",
2474
2779
  recordNotFoundDescription: "El registro que busca no existe o puede haber sido eliminado.",
2475
2780
  },
2476
- renderer: {
2477
- noPageSchema: "No se proporcionó esquema de página",
2478
- noFormSchema: "No se proporcionó esquema de formulario",
2479
- noDashboardSchema: "No se proporcionó esquema de panel",
2480
- pageRendering: "Renderizando página: {{name}}",
2481
- dashboardRendering: "Renderizando panel: {{name}}",
2482
- formRenderingMode: "Formulario renderizado en modo {{mode}}",
2483
- formRenderingFor: "para registro {{id}}",
2484
- createRecord: "Crear registro",
2485
- editRecord: "Editar registro",
2486
- page: "Página",
2487
- dashboard: "Panel",
2488
- save: "Guardar",
2489
- cancel: "Cancelar",
2490
- },
2491
2781
  actionDialog: {
2492
2782
  title: "Parámetros de acción",
2493
2783
  description: "Ingrese la información requerida para continuar.",
2494
2784
  selectPlaceholder: "Seleccionar {{label}}",
2495
2785
  requiredError: "{{label}} es obligatorio",
2786
+ unresolvedParam: 'No se puede mostrar este parámetro: el campo en el que se basa no está en los metadatos del objeto, por lo que no se puede construir el control necesario. Pide a un administrador que corrija la definición de la acción.',
2787
+ carryOverHint: 'Se conserva sin cambios (solo lectura)',
2496
2788
  cancel: "Cancelar",
2497
2789
  confirm: "Confirmar",
2498
2790
  uploading: "Subiendo…",
2499
- defaultActionTitle: "Acción",
2500
- ok: "Aceptar",
2501
2791
  lookupPlaceholder: "ID de registro para {{label}}",
2502
2792
  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.",
2503
2793
  },
@@ -2506,11 +2796,6 @@ const es = {
2506
2796
  confirm: "Continuar",
2507
2797
  cancel: "Cancelar",
2508
2798
  },
2509
- rowAction: {
2510
- openMenu: "Abrir menú",
2511
- edit: "Editar",
2512
- delete: "Eliminar",
2513
- },
2514
2799
  navigationSync: {
2515
2800
  addedPage: "Navegación actualizada: página \"{{name}}\" agregada",
2516
2801
  addedDashboard: "Navegación actualizada: panel \"{{name}}\" agregado",
@@ -2531,6 +2816,9 @@ const es = {
2531
2816
  noRecordId: "No se proporcionó ID de registro",
2532
2817
  deleteConfirm: "¿Eliminar este registro?",
2533
2818
  bulkDeleteSuccess: "{{count}} registros de {{label}} eliminados",
2819
+ bulkDeleteSuccess_one: "{{count}} registro de {{label}} eliminado",
2820
+ bulkDeleteSuccess_many: "{{count}} de registros de {{label}} eliminados",
2821
+ bulkDeleteSuccess_other: "{{count}} registros de {{label}} eliminados",
2534
2822
  bulkDeletePartial: "{{succeeded}} eliminados, {{failed}} fallidos",
2535
2823
  },
2536
2824
  objectViewActions: {
@@ -2542,15 +2830,6 @@ const es = {
2542
2830
  exportFailed: "Error al exportar: {{message}}",
2543
2831
  forecastSoon: "La vista de pronóstico llegará pronto",
2544
2832
  },
2545
- recordDetail: {
2546
- viewersTooltip: "Usuarios viendo este registro ahora",
2547
- },
2548
- cellRender: {
2549
- empty: "Vacío",
2550
- yes: "Sí",
2551
- no: "No",
2552
- systemFields: "Sistema",
2553
- },
2554
2833
  user: {
2555
2834
  profile: "Perfil",
2556
2835
  settings: "Configuración",
@@ -2587,17 +2866,17 @@ const es = {
2587
2866
  },
2588
2867
  organizations: {
2589
2868
  create: "Crear espacio de trabajo",
2590
- mine: "Mis organizaciones",
2591
- title: "Organizaciones",
2592
- heading: "Tus organizaciones",
2593
- subtitle: "Selecciona una organización para continuar o crea una nueva.",
2594
- searchPlaceholder: "Buscar una organización",
2595
- new: "Nueva organización",
2596
- current: "Organización actual",
2869
+ mine: "Mis espacios de trabajo",
2870
+ title: "Espacios de trabajo",
2871
+ heading: "Tus espacios de trabajo",
2872
+ subtitle: "Selecciona un espacio de trabajo para continuar o crea uno nuevo.",
2873
+ searchPlaceholder: "Buscar un espacio de trabajo",
2874
+ new: "Nuevo espacio de trabajo",
2875
+ current: "Espacio de trabajo actual",
2597
2876
  manage: "Administrar",
2598
- emptyTitle: "Aún no hay organizaciones",
2599
- emptyDescription: "Crea tu primera organización para empezar.",
2600
- noMatches: "Ninguna organización coincide con tu búsqueda.",
2877
+ emptyTitle: "Aún no hay espacios de trabajo",
2878
+ emptyDescription: "Crea tu primer espacio de trabajo para empezar.",
2879
+ noMatches: "Ningún espacio de trabajo coincide con tu búsqueda.",
2601
2880
  },
2602
2881
  organization: {
2603
2882
  roles: {
@@ -2726,6 +3005,9 @@ const es = {
2726
3005
  declined: "Invitación rechazada",
2727
3006
  declineFailed: "No se pudo rechazar la invitación",
2728
3007
  },
3008
+ current: {
3009
+ label: "Organización actual",
3010
+ },
2729
3011
  switcher: {
2730
3012
  label: "Cambiar de organización",
2731
3013
  groupLabel: "Organización de trabajo",
@@ -2737,18 +3019,37 @@ const es = {
2737
3019
  regionLabel: "Notificaciones",
2738
3020
  groupCount: "{{count}} notificaciones",
2739
3021
  groupUnread: "{{count}} sin leer",
3022
+ groupUnread_one: "{{count}} sin leer",
3023
+ groupUnread_many: "{{count}} sin leer",
3024
+ groupUnread_other: "{{count}} sin leer",
2740
3025
  groupMarkRead: "Marcar como leídas",
2741
3026
  groupMarkReadTitle: "Marcar como leídas todas las de este tipo",
2742
3027
  empty: "Sin notificaciones",
2743
3028
  markAllRead: "Marcar todo como leído",
2744
3029
  viewAll: "Ver todas las notificaciones",
2745
3030
  approvalsPending: "{{count}} aprobaciones pendientes",
3031
+ approvalsPending_one: "{{count}} aprobación pendiente",
3032
+ approvalsPending_many: "{{count}} de aprobaciones pendientes",
3033
+ approvalsPending_other: "{{count}} aprobaciones pendientes",
2746
3034
  viewApprovals: "Ver aprobaciones",
2747
3035
  noPendingApprovals: "Sin aprobaciones pendientes",
2748
3036
  openApprovalsInbox: "Abrir bandeja de aprobaciones",
2749
3037
  badgeTotal: "{{total}} en total",
2750
3038
  badgeNotifications: "{{unread}} notificaciones",
2751
3039
  badgeApprovals: "{{approvals}} aprobaciones pendientes",
3040
+ arrivalMany: "{{count}} mensajes nuevos",
3041
+ arrivalMany_one: "{{count}} mensaje nuevo",
3042
+ arrivalMany_many: "{{count}} de mensajes nuevos",
3043
+ arrivalMany_other: "{{count}} mensajes nuevos",
3044
+ arrivalRepeats: "{{count}} mensajes nuevos sobre este tema",
3045
+ arrivalRepeats_one: "{{count}} mensaje nuevo sobre este tema",
3046
+ arrivalRepeats_many: "{{count}} de mensajes nuevos sobre este tema",
3047
+ arrivalRepeats_other: "{{count}} mensajes nuevos sobre este tema",
3048
+ arrivalOpen: "Ver",
3049
+ toastEnabled: "Avisos en la aplicación",
3050
+ desktopEnabled: "Notificaciones de escritorio",
3051
+ desktopBlocked: "Bloqueado. Permite las notificaciones de este sitio en la configuración del navegador.",
3052
+ desktopUnsupported: "Este navegador no admite notificaciones de escritorio.",
2752
3053
  emptyUnread: "Todo al día",
2753
3054
  filterUnread: "No leídos",
2754
3055
  filterAll: "Todos",
@@ -2762,63 +3063,19 @@ const es = {
2762
3063
  thankYouTitle: "¡Gracias!",
2763
3064
  thankYouMessage: "Su envío fue recibido correctamente.",
2764
3065
  redirecting: "Redirigiendo en {{seconds}} segundos…",
3066
+ redirectPending: "Redirigiendo…",
2765
3067
  unavailableTitle: "Formulario no disponible",
2766
3068
  unavailableDescription: "No hay formulario público disponible en esta URL. Asegúrese de que la vista subyacente tenga habilitado el uso compartido anónimo.",
2767
3069
  tryDemo: "Probar demo",
2768
3070
  retry: "Reintentar",
2769
3071
  loading: "Cargando formulario…",
2770
3072
  requiredHint: "* Campo obligatorio",
3073
+ requiredFields: "Campos obligatorios: {{fields}}",
2771
3074
  consentLabelDefault: "Acepto la política de privacidad y doy mi consentimiento para procesar mis datos para esta solicitud.",
2772
3075
  consentLink: "Política de privacidad",
2773
3076
  consentRequired: "Acepte la política de privacidad para continuar.",
2774
3077
  rateLimited: "Tómese un momento para revisar sus respuestas antes de enviar.",
2775
3078
  redirectBlocked: "Envío aceptado, pero la URL de redirección fue bloqueada por seguridad.",
2776
- demo: {
2777
- contactTitle: "Ponerse en contacto",
2778
- contactDescription: "Cuéntenos sobre su proyecto y un representante de ventas le contactará en un día hábil.",
2779
- supportTitle: "Enviar solicitud de soporte",
2780
- supportDescription: "Descríbanos el problema — nuestro equipo responderá en un día hábil.",
2781
- thankYouSalesTitle: "¡Gracias — recibimos su mensaje!",
2782
- thankYouSalesMessage: "Un representante de ventas le contactará en un día hábil.",
2783
- thankYouSupportTitle: "Listo — su solicitud está en cola.",
2784
- thankYouSupportMessage: "Un ingeniero de soporte le dará seguimiento pronto. Guarde esta página si tiene capturas de pantalla adicionales.",
2785
- field: {
2786
- firstName: "Nombre",
2787
- lastName: "Apellido",
2788
- email: "Correo empresarial",
2789
- phone: "Teléfono",
2790
- jobTitle: "Cargo",
2791
- company: "Empresa",
2792
- website: "Sitio web",
2793
- industry: "Industria",
2794
- companySize: "Tamaño de empresa",
2795
- howCanWeHelp: "¿Cómo podemos ayudarle?",
2796
- subject: "Asunto",
2797
- description: "Descripción",
2798
- issueType: "Tipo de problema",
2799
- priority: "Prioridad",
2800
- },
2801
- industry: {
2802
- technology: "Tecnología",
2803
- software: "Software / SaaS",
2804
- finance: "Finanzas",
2805
- healthcare: "Salud",
2806
- retail: "Retail",
2807
- other: "Otro",
2808
- },
2809
- issueType: {
2810
- question: "Pregunta",
2811
- problem: "Problema",
2812
- bug: "Error",
2813
- feature_request: "Solicitud de función",
2814
- },
2815
- priority: {
2816
- low: "Baja",
2817
- medium: "Media",
2818
- high: "Alta",
2819
- critical: "Crítica",
2820
- },
2821
- },
2822
3079
  },
2823
3080
  connectAgent: {
2824
3081
  disabled: {
@@ -2864,6 +3121,9 @@ const es = {
2864
3121
  noImportableFields: "Ese objeto no tiene campos importables.",
2865
3122
  schemaReadFailed: "No se pudo leer el esquema del objeto.",
2866
3123
  imported: "Se importaron {{count}} fila(s) en {{object}}.",
3124
+ imported_one: "Se importó {{count}} fila en {{object}}.",
3125
+ imported_many: "Se importaron {{count}} de filas en {{object}}.",
3126
+ imported_other: "Se importaron {{count}} filas en {{object}}.",
2867
3127
  importFrom: "Importar las filas reales desde",
2868
3128
  into: "a",
2869
3129
  opening: "Abriendo…",
@@ -2877,6 +3137,78 @@ const es = {
2877
3137
  openProduction: "Abrir producción",
2878
3138
  manageEnvironments: "Gestionar entornos",
2879
3139
  },
3140
+ cloudPlanStatus: {
3141
+ current: "Plan actual",
3142
+ },
3143
+ ai: {
3144
+ nlQuery: {
3145
+ placeholder: "Haga una pregunta sobre sus datos…",
3146
+ ask: "Preguntar",
3147
+ results: "Resultados",
3148
+ match: "Coincidencia: {{percent}}",
3149
+ simulatedSummary: "Resultados de: {{query}}",
3150
+ noResults: "No se encontraron registros coincidentes",
3151
+ recentQueries: "Consultas recientes",
3152
+ },
3153
+ formAssist: {
3154
+ title: "Sugerencias de IA",
3155
+ suggestionCount: "{{count}} sugerencias",
3156
+ suggestionCount_one: "{{count}} sugerencia",
3157
+ suggestionCount_many: "{{count}} de sugerencias",
3158
+ suggestionCount_other: "{{count}} sugerencias",
3159
+ applyAll: "Aplicar todo",
3160
+ confidence: "Confianza: {{percent}}",
3161
+ appliedCount: "{{count}} sugerencias aplicadas",
3162
+ appliedCount_one: "{{count}} sugerencia aplicada",
3163
+ appliedCount_many: "{{count}} de sugerencias aplicadas",
3164
+ appliedCount_other: "{{count}} sugerencias aplicadas",
3165
+ },
3166
+ recommendations: {
3167
+ title: "Recomendaciones",
3168
+ generating: "Generando recomendaciones…",
3169
+ empty: "No hay recomendaciones disponibles",
3170
+ },
3171
+ },
3172
+ aiApprovals: {
3173
+ title: "Aprobaciones de IA",
3174
+ description: "Acciones propuestas por un agente de IA que necesitan revisión humana antes de ejecutarse.",
3175
+ tabPending: "Pendientes",
3176
+ tabDecided: "Decididas",
3177
+ tabAll: "Todas",
3178
+ statusPending: "Pendiente",
3179
+ statusApproved: "Aprobada",
3180
+ statusExecuted: "Ejecutada",
3181
+ statusFailed: "Fallida",
3182
+ statusRejected: "Rechazada",
3183
+ colTool: "Herramienta",
3184
+ colAction: "Acción",
3185
+ colObject: "Objeto",
3186
+ colStatus: "Estado",
3187
+ colProposed: "Propuesta",
3188
+ colDecision: "Decisión",
3189
+ emptyTitle: "No hay acciones en espera",
3190
+ emptyDescription: "Cuando la IA proponga una acción sensible, aparecerá aquí para su revisión.",
3191
+ view: "Ver",
3192
+ approve: "Aprobar",
3193
+ reject: "Rechazar",
3194
+ working: "Procesando…",
3195
+ approveAndExecute: "Aprobar y ejecutar",
3196
+ outcomeApprove: "Aprobación de {{id}}: {{message}}",
3197
+ outcomeReject: "Rechazo de {{id}}: {{message}}",
3198
+ outcomeExecuteFailed: "La acción falló durante su ejecución",
3199
+ drawerFallbackTitle: "Acción pendiente",
3200
+ drawerSubtitle: "Herramienta {{tool}} sobre {{object}}",
3201
+ fieldProposedBy: "Propuesta por",
3202
+ fieldDecidedBy: "Decidida por",
3203
+ fieldConversation: "Conversación",
3204
+ fieldToolInput: "Entrada de la herramienta",
3205
+ fieldResult: "Resultado",
3206
+ fieldError: "Error",
3207
+ fieldRejectionReason: "Motivo del rechazo",
3208
+ rejectTitle: "¿Rechazar esta acción?",
3209
+ rejectBody: "El motivo se devuelve a la IA para que ajuste su siguiente respuesta.",
3210
+ rejectPlaceholder: "Motivo opcional (p. ej.: «ID de registro incorrecto — confírmalo antes con la persona usuaria.»)",
3211
+ },
2880
3212
  aiModelStatus: {
2881
3213
  summary: "Crear / Preguntar usa {{conversational}} ({{conversationalSource}}); estructurado usa {{structured}} ({{structuredSource}}).",
2882
3214
  summaryRouting: "Política de enrutamiento: planes gratuitos → {{free}}, planes de pago → {{paid}}.",
@@ -2894,6 +3226,114 @@ const es = {
2894
3226
  sourceInherits: "igual que build/ask",
2895
3227
  sourcePinned: "fijado por {{source}}",
2896
3228
  },
3229
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3230
+ // English-only until this landed while every other string on the same screen
3231
+ // was translated:
3232
+ //
3233
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3234
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3235
+ // closed registry those runtimes are conformance-tested
3236
+ // against). `humanizeToolName` looks each up as
3237
+ // `chatbot.tool.<tool_name>` and falls back to its English
3238
+ // title-caser for a custom / third-party tool, so a name
3239
+ // missing here is degraded, never broken. The `en` values
3240
+ // are deliberately EQUAL to what that title-caser produces:
3241
+ // adding the key must not silently reword the English UI.
3242
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3243
+ // set for both surfaces (they used to carry separate
3244
+ // tables and disagreed on casing).
3245
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3246
+ // FAMILIES: one slot per CLDR category the pack's language
3247
+ // selects (objectui#11432), plus the base key for a call
3248
+ // made without a count. `all-locales-key-parity.test.ts`
3249
+ // derives the required slots from `Intl.PluralRules`.
3250
+ //
3251
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3252
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3253
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3254
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3255
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3256
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3257
+ // against the registry instead of against its own hand-held list.
3258
+ chatbot: {
3259
+ tool: {
3260
+ aggregate_data: "Resumir datos",
3261
+ get_record: "Obtener registro",
3262
+ query_data: "Consultar datos",
3263
+ query_records: "Consultar registros",
3264
+ search_knowledge: "Buscar en la base de conocimiento",
3265
+ visualize_data: "Crear gráfico",
3266
+ add_field: "Añadir campo",
3267
+ apply_blueprint: "Construir la aplicación",
3268
+ apply_edit: "Aplicar cambios",
3269
+ create_metadata: "Crear metadatos",
3270
+ create_object: "Crear objeto",
3271
+ create_package: "Crear paquete",
3272
+ create_seed: "Generar datos de ejemplo",
3273
+ delete_field: "Eliminar campo",
3274
+ describe_metadata: "Consultar metadatos",
3275
+ describe_object: "Consultar la estructura del objeto",
3276
+ get_active_package: "Obtener el paquete activo",
3277
+ get_authoring_rules: "Leer las reglas de autoría",
3278
+ get_metadata_schema: "Obtener el esquema de metadatos",
3279
+ get_package: "Obtener paquete",
3280
+ list_metadata: "Listar metadatos",
3281
+ list_objects: "Listar objetos",
3282
+ list_packages: "Listar paquetes",
3283
+ load_tools: "Cargar herramientas",
3284
+ modify_field: "Modificar campo",
3285
+ open_record: "Abrir registro",
3286
+ propose_blueprint: "Diseñar el plan de la aplicación",
3287
+ set_active_package: "Cambiar el paquete activo",
3288
+ suggest_builder: "Sugerir cómo construirlo",
3289
+ test_flow: "Probar el flujo",
3290
+ todo_write: "Anotar tareas",
3291
+ toggle_flow: "Activar o desactivar el flujo",
3292
+ update_metadata: "Actualizar metadatos",
3293
+ validate_expression: "Validar expresión",
3294
+ verify_build: "Verificar la construcción",
3295
+ },
3296
+ toolState: {
3297
+ agentActivity: "Actividad del agente",
3298
+ pending: "Pendiente",
3299
+ running: "En curso",
3300
+ awaitingApproval: "Esperando aprobación",
3301
+ responded: "Respondido",
3302
+ completed: "Completado",
3303
+ error: "Error",
3304
+ denied: "Denegado",
3305
+ failed: "Fallido",
3306
+ },
3307
+ plan: {
3308
+ countObjects: "{{count}} objetos",
3309
+ countObjects_one: "{{count}} objeto",
3310
+ countObjects_many: "{{count}} de objetos",
3311
+ countObjects_other: "{{count}} objetos",
3312
+ countViews: "{{count}} vistas",
3313
+ countViews_one: "{{count}} vista",
3314
+ countViews_many: "{{count}} de vistas",
3315
+ countViews_other: "{{count}} vistas",
3316
+ countDashboards: "{{count}} paneles",
3317
+ countDashboards_one: "{{count}} panel",
3318
+ countDashboards_many: "{{count}} de paneles",
3319
+ countDashboards_other: "{{count}} paneles",
3320
+ countSeedData: "datos de ejemplo",
3321
+ },
3322
+ build: {
3323
+ building: "Creando {{app}}…",
3324
+ built: "Creación de {{app}} completada",
3325
+ appFallback: "su aplicación",
3326
+ addingSampleData: "añadiendo datos de ejemplo",
3327
+ group: {
3328
+ object: "Objetos",
3329
+ view: "Vistas",
3330
+ dashboard: "Paneles",
3331
+ app: "Aplicación",
3332
+ seed: "Datos de ejemplo",
3333
+ },
3334
+ moreArtifacts: "+{{n}} más",
3335
+ },
3336
+ },
2897
3337
  chatbotError: {
2898
3338
  title: "Error en la respuesta",
2899
3339
  fallbackDetail: "Algo salió mal. Vuelva a intentarlo.",
@@ -2931,6 +3371,7 @@ const es = {
2931
3371
  retry: "Reintentar",
2932
3372
  errors: {
2933
3373
  expired: "La solicitud caducó antes de ser aprobada. Vuelva a empezar.",
3374
+ accessDenied: "La solicitud de conexión fue rechazada. Vuelva a empezar.",
2934
3375
  bindFailed: "Error al vincular.",
2935
3376
  deviceCodeFailed: "Error en la solicitud del código de dispositivo.",
2936
3377
  },
@@ -2973,7 +3414,7 @@ const es = {
2973
3414
  },
2974
3415
  title: "Marketplace de aplicaciones",
2975
3416
  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.",
2976
- searchPlaceholder: "Buscar aplicaciones por nombre o ID de manifiesto…",
3417
+ searchPlaceholder: 'Buscar aplicaciones por nombre o ID de aplicación…',
2977
3418
  searchAria: "Buscar aplicaciones del marketplace",
2978
3419
  installed: "Instalado",
2979
3420
  installedCount: "Instaladas ({{count}})",
@@ -2996,10 +3437,16 @@ const es = {
2996
3437
  installedBadge: "Instalado v{{version}}",
2997
3438
  load: {
2998
3439
  failed: "No se pudo cargar el marketplace",
2999
- failedHint: "Por defecto, este runtime apunta a la nube pública de ObjectStack. Asegúrese de que el runtime esté en línea.",
3440
+ failedHintConfigured: "Este runtime accede al marketplace a través del plano de control en {{url}}. Compruebe que esté en línea y sea accesible desde aquí.",
3441
+ failedHintSameOrigin: "Este runtime sirve el catálogo del marketplace por sí mismo. Compruebe que el runtime esté en línea.",
3000
3442
  packageFailed: "No se pudo cargar el paquete",
3001
3443
  notFound: "No encontrado.",
3002
3444
  },
3445
+ disabled: {
3446
+ title: "El marketplace de aplicaciones está desactivado",
3447
+ description: "Este runtime no tiene ningún marketplace configurado, por lo que no hay nada que explorar ni instalar desde aquí.",
3448
+ hint: "Ese es el estado esperado cuando el runtime se inicia con <code>OS_CLOUD_URL=off</code> (o <code>none</code>, <code>local</code>, <code>disabled</code>). Para activar el marketplace, apunte <code>OS_CLOUD_URL</code> a un plano de control y reinicie el runtime.",
3449
+ },
3003
3450
  detail: {
3004
3451
  homepage: "Página de inicio",
3005
3452
  installedV: "Instalado · v{{version}}",
@@ -3015,10 +3462,17 @@ const es = {
3015
3462
  purgeSampleData: 'Eliminar datos de ejemplo',
3016
3463
  purgeConfirm: '¿Eliminar todos los registros de ejemplo creados por este paquete? Los registros añadidos por el usuario NO se verán afectados.',
3017
3464
  purgeSuccess: 'Se eliminaron {{count}} registro(s) de ejemplo.',
3465
+ purgeSuccess_one: 'Se eliminó {{count}} registro de ejemplo.',
3466
+ purgeSuccess_many: 'Se eliminaron {{count}} de registros de ejemplo.',
3467
+ purgeSuccess_other: 'Se eliminaron {{count}} registros de ejemplo.',
3018
3468
  purgeNoData: 'No se encontraron registros de ejemplo para eliminar.',
3019
3469
  reseedQueued: 'Los datos de ejemplo se volverán a cargar en el próximo acceso al entorno.',
3020
3470
  reseedLocalSuccess: 'Datos de ejemplo recargados: {{inserted}} insertados, {{updated}} actualizados.',
3021
3471
  reseedPartialErrors: '({{count}} registro(s) no se pudieron escribir)',
3472
+ reseedPartialErrors_one: '({{count}} registro no se pudo escribir)',
3473
+ reseedPartialErrors_many: '({{count}} de registros no se pudieron escribir)',
3474
+ reseedPartialErrors_other: '({{count}} registros no se pudieron escribir)',
3475
+ sampleDataKernelUnavailable: 'Este plano de control no tiene un kernel de entorno, por lo que los datos de ejemplo no se pueden volver a cargar ni eliminar desde aquí. Hágalo desde el propio runtime del entorno.',
3022
3476
  updateAvailable: 'Actualización disponible',
3023
3477
  },
3024
3478
  action: {
@@ -3071,7 +3525,8 @@ const es = {
3071
3525
  reviewed: "Revisado y aprobado",
3072
3526
  unreviewed: "Sin revisar todavía",
3073
3527
  signed: "Firmado",
3074
- grantsIntro: "Al instalarlo, este paquete recibirá:",
3528
+ grantsIntro: "Este paquete solicita:",
3529
+ notEnforced: "Esta lista se registra al instalar y se vuelve a confirmar si una versión posterior solicita más, pero el runtime aún no restringe el paquete a ella.",
3075
3530
  services: "Servicios de la plataforma",
3076
3531
  hooks: "Hooks de ciclo de vida",
3077
3532
  network: "Acceso a la red",
@@ -3110,30 +3565,21 @@ const es = {
3110
3565
  storage: "Almacenamiento",
3111
3566
  other: "Otro",
3112
3567
  },
3113
- pricing: {
3114
- free: "Gratis",
3115
- freemium: "Freemium",
3116
- paid: "De pago",
3117
- subscription: "Suscripción",
3118
- "usage-based": "Por uso",
3119
- "contact-sales": "Contactar ventas",
3120
- },
3121
3568
  relativeTime: {
3122
3569
  today: "hoy",
3123
3570
  daysAgo: "hace {{count}}d",
3124
3571
  monthsAgo: "hace {{count}} meses",
3572
+ monthsAgo_one: "hace {{count}} mes",
3573
+ monthsAgo_many: "hace {{count}} meses",
3574
+ monthsAgo_other: "hace {{count}} meses",
3125
3575
  yearsAgo: "hace {{count}} años",
3576
+ yearsAgo_one: "hace {{count}} año",
3577
+ yearsAgo_many: "hace {{count}} años",
3578
+ yearsAgo_other: "hace {{count}} años",
3126
3579
  },
3127
3580
  },
3128
- approvals: {
3129
- approve: 'Aprobar',
3130
- reject: 'Rechazar',
3131
- comment: 'Comentario (opcional)',
3132
- approveSuccess: 'Aprobado',
3133
- rejectSuccess: 'Rechazado',
3134
- rejectConfirm: '¿Rechazar esta solicitud de aprobación?',
3135
- },
3136
3581
  approvalsInbox: {
3582
+ recordUnresolvable: 'Este registro no se puede abrir',
3137
3583
  loadMore: 'Cargar más',
3138
3584
  loadingMore: 'Cargando…',
3139
3585
  loadedOf: '{{loaded}} de {{total}} cargadas',
@@ -3152,6 +3598,9 @@ const es = {
3152
3598
  requestInfoSent: 'Devuelta al solicitante para más información',
3153
3599
  remindBtn: 'Recordatorio',
3154
3600
  remindSuccess: 'Recordatorio enviado a {{count}} aprobador(es)',
3601
+ remindSuccess_one: 'Recordatorio enviado a {{count}} aprobador',
3602
+ remindSuccess_many: 'Recordatorio enviado a {{count}} de aprobadores',
3603
+ remindSuccess_other: 'Recordatorio enviado a {{count}} aprobadores',
3155
3604
  remindThrottled: 'Ya se envió un recordatorio hace poco; inténtalo más tarde.',
3156
3605
  replyPlaceholder: 'Responder en esta solicitud…',
3157
3606
  slaRemaining: 'SLA: quedan {{dur}}',
@@ -3168,6 +3617,9 @@ const es = {
3168
3617
  progressApprovals: 'Aprobaciones — {{got}} de {{need}}',
3169
3618
  progressGroups: 'Progreso de firmas — {{got}} de {{need}} grupos',
3170
3619
  progressEligible: '{{count}} aprobador(es) elegible(s)',
3620
+ progressEligible_one: '{{count}} aprobador elegible',
3621
+ progressEligible_many: '{{count}} de aprobadores elegibles',
3622
+ progressEligible_other: '{{count}} aprobadores elegibles',
3171
3623
  progressBar: 'Progreso de la decisión',
3172
3624
  declaredActions: 'Acciones',
3173
3625
  attachmentChip: 'Adjunto',
@@ -3199,6 +3651,9 @@ const es = {
3199
3651
  filterCount: '{{shown}} de {{total}}',
3200
3652
  selected: 'seleccionadas',
3201
3653
  actionableCount: '({{count}} accionables)',
3654
+ actionableCount_one: '({{count}} accionable)',
3655
+ actionableCount_many: '({{count}} accionables)',
3656
+ actionableCount_other: '({{count}} accionables)',
3202
3657
  selectAll: 'Seleccionar todo',
3203
3658
  selectRow: 'Seleccionar solicitud',
3204
3659
  colRequest: 'Solicitud',
@@ -3239,12 +3694,19 @@ const es = {
3239
3694
  submittedAgo: 'Enviada {{when}}',
3240
3695
  completedAt: 'Completada {{when}}',
3241
3696
  waitingOn: 'A la espera de',
3697
+ approverNameSeparator: ', ',
3698
+ approverUnstaffed: '{{seat}} (actualmente sin titular)',
3242
3699
  history: 'Actividad',
3243
3700
  noActions: 'Aún no hay acciones.',
3244
3701
  actSubmit: 'Enviada',
3245
3702
  actApprove: 'Aprobada',
3246
3703
  actReject: 'Rechazada',
3247
3704
  actRecall: 'Retirada',
3705
+ overrideActionLabel: '{{action}} (anulación)',
3706
+ overrideNotice: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso se finaliza de inmediato y se omite a cualquier aprobador que aún no haya actuado. La decisión se registra como anulación de administrador.',
3707
+ overrideNoticeWho: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso se finaliza de inmediato y se omite a los aprobadores que aún no han actuado — {{who}}. La decisión se registra como anulación de administrador.',
3708
+ viaOverrideChip: 'Anulación de administrador',
3709
+ viaOverrideHint: 'Quien actuó no ocupaba ningún puesto de aprobador en este paso: fue admitido por la vía de anulación de administrador.',
3248
3710
  rawData: 'Datos sin procesar (JSON)',
3249
3711
  copy: 'Copiar',
3250
3712
  copied: 'Copiado',
@@ -3265,11 +3727,23 @@ const es = {
3265
3727
  approveN: 'Aprobar {{count}}',
3266
3728
  rejectN: 'Rechazar {{count}}',
3267
3729
  bulkApproveTitle: '¿Aprobar {{count}} solicitudes?',
3730
+ bulkApproveTitle_one: '¿Aprobar {{count}} solicitud?',
3731
+ bulkApproveTitle_many: '¿Aprobar {{count}} de solicitudes?',
3732
+ bulkApproveTitle_other: '¿Aprobar {{count}} solicitudes?',
3268
3733
  bulkApproveBody: 'Cada solicitud se aprueba con tu identidad y su flujo continúa por la rama de aprobación.',
3269
3734
  bulkRejectTitle: '¿Rechazar {{count}} solicitudes?',
3735
+ bulkRejectTitle_one: '¿Rechazar {{count}} solicitud?',
3736
+ bulkRejectTitle_many: '¿Rechazar {{count}} de solicitudes?',
3737
+ bulkRejectTitle_other: '¿Rechazar {{count}} solicitudes?',
3270
3738
  bulkRejectBody: 'Se rechazarán las solicitudes seleccionadas y se notificará a los solicitantes.',
3271
3739
  bulkApproved: '{{count}} solicitudes aprobadas',
3740
+ bulkApproved_one: '{{count}} solicitud aprobada',
3741
+ bulkApproved_many: '{{count}} de solicitudes aprobadas',
3742
+ bulkApproved_other: '{{count}} solicitudes aprobadas',
3272
3743
  bulkRejected: '{{count}} solicitudes rechazadas',
3744
+ bulkRejected_one: '{{count}} solicitud rechazada',
3745
+ bulkRejected_many: '{{count}} de solicitudes rechazadas',
3746
+ bulkRejected_other: '{{count}} solicitudes rechazadas',
3273
3747
  bulkPartial: '{{ok}} con éxito, {{fail}} fallidas: {{which}}',
3274
3748
  rejectOneTitle: '¿Rechazar "{{title}}"?',
3275
3749
  rejectOneBody: 'Se rechaza la solicitud y se notifica al solicitante.',
@@ -3294,8 +3768,17 @@ const es = {
3294
3768
  alreadyDecided: 'Esta solicitud ya fue decidida. Actualiza la lista.',
3295
3769
  justNow: 'justo ahora',
3296
3770
  minutesAgo: 'hace {{count}} min',
3771
+ minutesAgo_one: 'hace {{count}} min',
3772
+ minutesAgo_many: 'hace {{count}} min',
3773
+ minutesAgo_other: 'hace {{count}} min',
3297
3774
  hoursAgo: 'hace {{count}} h',
3775
+ hoursAgo_one: 'hace {{count}} h',
3776
+ hoursAgo_many: 'hace {{count}} h',
3777
+ hoursAgo_other: 'hace {{count}} h',
3298
3778
  daysAgo: 'hace {{count}} días',
3779
+ daysAgo_one: 'hace {{count}} día',
3780
+ daysAgo_many: 'hace {{count}} días',
3781
+ daysAgo_other: 'hace {{count}} días',
3299
3782
  },
3300
3783
  preview: {
3301
3784
  empty: {
@@ -3330,7 +3813,18 @@ const es = {
3330
3813
  detailNone: 'No se detectaron diferencias — el borrador coincide con la versión publicada.',
3331
3814
  detailChangedKeys: 'También cambió:',
3332
3815
  confirmNote: 'Publicar libera atómicamente los {{count}} borradores pendientes de este paquete.',
3816
+ confirmNote_one: 'Publicar libera atómicamente {{count}} borrador pendiente de este paquete.',
3817
+ confirmNote_many: 'Publicar libera atómicamente los {{count}} de borradores pendientes de este paquete.',
3818
+ confirmNote_other: 'Publicar libera atómicamente los {{count}} borradores pendientes de este paquete.',
3333
3819
  publishConfirm: 'Publicar todo',
3820
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3821
+ // the confirm button so a refusal the door would issue is read BEFORE
3822
+ // the click rather than as a toast after the batch rolled back.
3823
+ securityBlockTitle: 'La publicación será rechazada: {{count}} elemento(s) necesitan una decisión primero',
3824
+ securityBlockTitle_one: 'La publicación será rechazada: {{count}} elemento necesita una decisión primero',
3825
+ securityBlockTitle_many: 'La publicación será rechazada: {{count}} de elementos necesitan una decisión primero',
3826
+ securityBlockTitle_other: 'La publicación será rechazada: {{count}} elementos necesitan una decisión primero',
3827
+ securityBlockWhere: 'Corríjalo en el objeto en Configuración → Uso compartido de registros y vuelva a publicar.',
3334
3828
  },
3335
3829
  // ADR-0045 — the materialized-but-unlisted app banner
3336
3830
  // (UnpublishedAppBar.tsx), sibling of draftBar above.
@@ -3354,7 +3848,7 @@ const es = {
3354
3848
  revertLabel: 'Se deshizo un cambio',
3355
3849
  applyLabel: 'Cambio de compilación',
3356
3850
  revert: 'deshacer',
3357
- items: 'elementos',
3851
+ items: 'Elementos: {{count}}',
3358
3852
  revertAction: 'Deshacer',
3359
3853
  reverted: 'Deshecho — el cambio se ha revertido.',
3360
3854
  revertFailed: 'Error al deshacer',
@@ -3377,22 +3871,33 @@ const es = {
3377
3871
  noResults: "Sin resultados",
3378
3872
  searchField: "Buscar {{label}}…",
3379
3873
  enterId: "Ingresar ID de {{label}}",
3874
+ addValue: "Escriba un valor y pulse Intro",
3875
+ removeValue: "Quitar {{value}}",
3876
+ rangeStart: "Desde",
3877
+ rangeEnd: "Hasta",
3380
3878
  operators: {
3381
3879
  equals: "Igual a",
3382
- notEquals: "Distinto de",
3880
+ not_equals: "Distinto de",
3383
3881
  contains: "Contiene",
3384
- notContains: "No contiene",
3385
- isEmpty: "Está vacío",
3386
- isNotEmpty: "No está vacío",
3387
- greaterThan: "Mayor que",
3388
- lessThan: "Menor que",
3389
- greaterOrEqual: "Mayor o igual",
3390
- lessOrEqual: "Menor o igual",
3882
+ icontains: "Contiene (ignorar mayúsculas)",
3883
+ not_contains: "No contiene",
3884
+ is_empty: "Está vacío",
3885
+ is_not_empty: "No está vacío",
3886
+ greater_than: "Mayor que",
3887
+ less_than: "Menor que",
3888
+ greater_than_or_equal: "Mayor o igual",
3889
+ less_than_or_equal: "Menor o igual",
3391
3890
  before: "Antes de",
3392
3891
  after: "Después de",
3393
3892
  between: "Entre",
3394
3893
  in: "En",
3395
- notIn: "No en",
3894
+ not_in: "No en",
3895
+ starts_with: "Comienza por",
3896
+ ends_with: "Termina en",
3897
+ is_null: "Es null",
3898
+ is_not_null: "No es null",
3899
+ exists: "Está definido",
3900
+ notExists: "No está definido",
3396
3901
  },
3397
3902
  },
3398
3903
  sortBuilder: {
@@ -3406,7 +3911,9 @@ const es = {
3406
3911
  },
3407
3912
  collaboration: {
3408
3913
  commentCount: "{{count}} comentarios",
3409
- commentCountOne: "{{count}} comentario",
3914
+ commentCount_one: "{{count}} comentario",
3915
+ commentCount_many: "{{count}} de comentarios",
3916
+ commentCount_other: "{{count}} comentarios",
3410
3917
  resolvedSuffix: " · Resuelto",
3411
3918
  sortComments: "Ordenar comentarios",
3412
3919
  sortOldest: "Más antiguos",
@@ -3415,11 +3922,22 @@ const es = {
3415
3922
  reopen: "Reabrir",
3416
3923
  justNow: "ahora mismo",
3417
3924
  minutesAgo: "hace {{count}} min",
3925
+ minutesAgo_one: "hace {{count}} min",
3926
+ minutesAgo_many: "hace {{count}} min",
3927
+ minutesAgo_other: "hace {{count}} min",
3418
3928
  hoursAgo: "hace {{count}} h",
3929
+ hoursAgo_one: "hace {{count}} h",
3930
+ hoursAgo_many: "hace {{count}} h",
3931
+ hoursAgo_other: "hace {{count}} h",
3419
3932
  daysAgo: "hace {{count}} d",
3933
+ daysAgo_one: "hace {{count}} d",
3934
+ daysAgo_many: "hace {{count}} d",
3935
+ daysAgo_other: "hace {{count}} d",
3420
3936
  edited: "(editado)",
3421
3937
  reactionCount: "{{count}} reacciones",
3422
- reactionCountOne: "{{count}} reacción",
3938
+ reactionCount_one: "{{count}} reacción",
3939
+ reactionCount_many: "{{count}} de reacciones",
3940
+ reactionCount_other: "{{count}} reacciones",
3423
3941
  addThumbsUp: "Agregar me gusta",
3424
3942
  reply: "Responder",
3425
3943
  reactThumbsUp: "Reaccionar con me gusta",
@@ -3430,9 +3948,13 @@ const es = {
3430
3948
  commentPlaceholder: "Agregar un comentario… (usa @ para mencionar)",
3431
3949
  send: "Enviar",
3432
3950
  presentUserCount: "{{count}} usuarios presentes",
3433
- presentUserCountOne: "{{count}} usuario presente",
3951
+ presentUserCount_one: "{{count}} usuario presente",
3952
+ presentUserCount_many: "{{count}} de usuarios presentes",
3953
+ presentUserCount_other: "{{count}} usuarios presentes",
3434
3954
  moreUserCount: "{{count}} usuarios más",
3435
- moreUserCountOne: "{{count}} usuario más",
3955
+ moreUserCount_one: "{{count}} usuario más",
3956
+ moreUserCount_many: "{{count}} de usuarios más",
3957
+ moreUserCount_other: "{{count}} usuarios más",
3436
3958
  userStatusTitle: "{{name}} ({{status}})",
3437
3959
  statusActive: "activo",
3438
3960
  statusIdle: "inactivo",
@@ -3440,6 +3962,18 @@ const es = {
3440
3962
  },
3441
3963
  wizard: {
3442
3964
  missingRequired: "Complete los campos obligatorios: {{fields}}",
3965
+ back: "Atrás",
3966
+ submitting: "Enviando…",
3967
+ stepFallback: "Paso {{n}}",
3968
+ progressLabel: "Progreso",
3969
+ emptyStep: "No hay campos configurados para este paso",
3970
+ },
3971
+ flowRunner: {
3972
+ title: 'Entrada',
3973
+ submitting: 'Enviando…',
3974
+ saveAndContinue: 'Guardar y continuar',
3975
+ nextStep: 'Guardado — paso siguiente',
3976
+ completed: 'Flujo «{{flow}}» completado',
3443
3977
  },
3444
3978
  appManagement: {
3445
3979
  title: "Aplicaciones",
@@ -3490,5 +4024,49 @@ const es = {
3490
4024
  bulkOperationFailed: "Error en la operación masiva: {{reason}}",
3491
4025
  },
3492
4026
  },
4027
+ // objectui#6301 — Configuración › Automatización de paquetes (ADR-0126
4028
+ // §7.4). Terminología del pack: `common.package` = Paquete,
4029
+ // `flowRunner.completed` = Flujo, comillas «…». ⛔ Ninguna formulación de
4030
+ // linaje o desviación en este grupo (§9).
4031
+ packagedAutomation: {
4032
+ title: "Automatización de paquetes",
4033
+ subtitle: "Flujos y acciones incluidos en los paquetes instalados. Desactiva uno en esta implementación o clona un flujo con un nombre nuevo para personalizarlo. La edición se hace en Studio.",
4034
+ refresh: "Actualizar",
4035
+ flowsHeading: "Flujos de paquete",
4036
+ actionsHeading: "Acciones de paquete",
4037
+ colFlow: "Flujo",
4038
+ colActivation: "Activación",
4039
+ colActions: "Acciones",
4040
+ toggleLabel: "Activación de {{label}}",
4041
+ on: "Activado",
4042
+ off: "Desactivado",
4043
+ clone: "Clonar",
4044
+ cloneTitle: "Clonar flujo del paquete",
4045
+ cloneBody: "La copia conserva toda la definición y necesita un nombre de máquina y una etiqueta nuevos. Edita la copia en Studio.",
4046
+ cloneName: "Nuevo nombre de máquina",
4047
+ cloneLabel: "Nueva etiqueta",
4048
+ cancel: "Cancelar",
4049
+ cloneConfirm: "Crear clon",
4050
+ cloneCreated: "Flujo «{{name}}» creado.",
4051
+ emptyTitle: "Sin flujos de paquete",
4052
+ emptyBody: "Ningún paquete instalado incluye un flujo de automatización en esta implementación. Los flujos que creas tú están en Studio.",
4053
+ loadFailed: "No se pudo cargar la automatización de paquetes.",
4054
+ toggleFailedHttp: "No se pudo cambiar la activación (HTTP {{status}}).",
4055
+ toggleFailed: "No se pudo cambiar la activación.",
4056
+ cloneFailedHttp: "No se pudo clonar este flujo (HTTP {{status}}).",
4057
+ cloneFailed: "No se pudo clonar este flujo.",
4058
+ actionsSubtitle: "Acciones incluidas en los paquetes instalados. Desactiva una en esta implementación y dejará de ejecutarse en todos los lugares donde se ofrece. Crear tu propia acción junto a ella sigue estando disponible en Studio.",
4059
+ colAction: "Acción",
4060
+ colObject: "Objeto",
4061
+ actionToggleLabel: "Activación de {{label}} en {{object}}",
4062
+ actionsEmptyTitle: "Sin acciones de paquete",
4063
+ actionsEmptyBody: "Ningún paquete instalado declara una acción en esta implementación. Las acciones que creas tú están en Studio.",
4064
+ actionsLoadFailed: "No se pudieron cargar las acciones de paquete.",
4065
+ },
4066
+ element: {
4067
+ number: {
4068
+ noObject: "No se ha indicado ningún objeto: define object o dataSource.object.",
4069
+ },
4070
+ },
3493
4071
  };
3494
4072
  export default es;