@object-ui/i18n 17.6.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 (56) hide show
  1. package/CHANGELOG.md +4320 -0
  2. package/README.md +192 -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 +27 -1
  10. package/dist/i18n.js +99 -16
  11. package/dist/index.d.ts +7 -13
  12. package/dist/index.js +41 -17
  13. package/dist/locales/ar.d.ts +946 -113
  14. package/dist/locales/ar.js +1095 -161
  15. package/dist/locales/de.d.ts +618 -113
  16. package/dist/locales/de.js +715 -134
  17. package/dist/locales/en.d.ts +632 -127
  18. package/dist/locales/en.js +1044 -162
  19. package/dist/locales/es.d.ts +700 -113
  20. package/dist/locales/es.js +794 -130
  21. package/dist/locales/fr.d.ts +700 -113
  22. package/dist/locales/fr.js +795 -132
  23. package/dist/locales/index.d.ts +6990 -1169
  24. package/dist/locales/index.js +48 -9
  25. package/dist/locales/ja.d.ts +618 -113
  26. package/dist/locales/ja.js +708 -128
  27. package/dist/locales/ko.d.ts +618 -113
  28. package/dist/locales/ko.js +712 -132
  29. package/dist/locales/pt.d.ts +700 -113
  30. package/dist/locales/pt.js +794 -130
  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 +782 -113
  36. package/dist/locales/ru.js +910 -152
  37. package/dist/locales/zh.d.ts +635 -130
  38. package/dist/locales/zh.js +725 -131
  39. package/dist/pickLocalized.d.ts +30 -0
  40. package/dist/pickLocalized.js +39 -0
  41. package/dist/provider.d.ts +101 -12
  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 +11 -0
  47. package/dist/useObjectLabel.d.ts +40 -18
  48. package/dist/useObjectLabel.js +46 -14
  49. package/dist/useSafeTranslation.js +40 -42
  50. package/dist/utils/formatting.d.ts +16 -0
  51. package/dist/utils/formatting.js +23 -3
  52. package/dist/utils/spec-formatters.d.ts +13 -23
  53. package/dist/utils/spec-formatters.js +41 -2
  54. package/dist/utils/spec-translations.d.ts +16 -3
  55. package/dist/utils/spec-translations.js +52 -13
  56. 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',
@@ -115,7 +127,9 @@ const es = {
115
127
  closePanel: "Cerrar panel",
116
128
  resizeDrawer: "Ajustar el ancho del panel",
117
129
  itemCount: "{{count}} elementos",
118
- itemCountOne: "{{count}} elemento",
130
+ itemCount_one: "{{count}} elemento",
131
+ itemCount_many: "{{count}} de elementos",
132
+ itemCount_other: "{{count}} elementos",
119
133
  toggleSidebar: "Alternar barra lateral",
120
134
  package: "Paquete",
121
135
  done: "Listo",
@@ -123,6 +137,16 @@ const es = {
123
137
  record: "Registro",
124
138
  retry: "Reintentar",
125
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.",
126
150
  },
127
151
  actions: {
128
152
  decisionOutput: {
@@ -134,6 +158,14 @@ const es = {
134
158
  acknowledge: 'Lo he guardado',
135
159
  copyAll: 'Copiar todo',
136
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}}',
137
169
  },
138
170
  validation: {
139
171
  // "{{field}} es obligatorio" only agreed with masculine field labels —
@@ -156,19 +188,45 @@ const es = {
156
188
  },
157
189
  form: {
158
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.",
159
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.",
160
197
  discardTitle: "¿Descartar los cambios?",
161
198
  discardMessage: "Tiene cambios sin guardar. Si cierra este formulario ahora, sus ediciones se perderán.",
162
199
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
163
200
  // description, used when the form declares no `description` of its own.
164
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
+ },
165
224
  keepEditing: "Seguir editando",
166
225
  discard: "Descartar",
167
226
  conflictTitle: "Conflicto al guardar",
168
227
  conflictMessage: "Otra persona modificó este registro mientras lo editaba. Sobrescribir reemplazará sus cambios por los suyos.",
169
228
  conflictLatestVersion: "Su guardado: {{time}}",
170
229
  conflictOverwrite: "Sobrescribir",
171
- addItem: "Añadir elemento",
172
230
  removeItem: "Eliminar elemento",
173
231
  fieldRequired: "Este campo es obligatorio",
174
232
  invalidFormat: "Formato no válido",
@@ -186,6 +244,12 @@ const es = {
186
244
  createSuccess: "{{object}} creado",
187
245
  updateSuccess: "{{object}} actualizado",
188
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.",
189
253
  fullscreen: {
190
254
  title: "Editar texto",
191
255
  description: "Edita el valor de texto completo y luego guarda o cancela los cambios.",
@@ -210,6 +274,9 @@ const es = {
210
274
  },
211
275
  relativeDate: {
212
276
  overdue: "Atrasado {{count}} d",
277
+ overdue_one: "Atrasado {{count}} d",
278
+ overdue_many: "Atrasado {{count}} d",
279
+ overdue_other: "Atrasado {{count}} d",
213
280
  },
214
281
  file: {
215
282
  dragDropHere: 'Arrastra y suelta archivos aquí',
@@ -226,6 +293,7 @@ const es = {
226
293
  remove: 'Quitar {{name}}',
227
294
  exceedsMaxSize: '«{{name}}» supera el tamaño máximo ({{max}} MB)',
228
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',
229
297
  },
230
298
  richText: {
231
299
  format: "Formato: {{format}}",
@@ -253,6 +321,9 @@ const es = {
253
321
  selectBusinessUnit: "Seleccionar una unidad de negocio",
254
322
  selectPosition: "Seleccionar un puesto",
255
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",
256
327
  },
257
328
  filterCondition: {
258
329
  selectObjectFirst: "Selecciona primero un objeto.",
@@ -263,6 +334,26 @@ const es = {
263
334
  editAsJson: "Editar como JSON",
264
335
  useVisualBuilder: "Usar el constructor visual",
265
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
+ },
266
357
  tags: {
267
358
  placeholder: "Escriba y pulse Intro para añadir…",
268
359
  },
@@ -278,6 +369,16 @@ const es = {
278
369
  characterCount: "Recuento de caracteres: {{count}} de {{max}}",
279
370
  charactersRemaining: "Caracteres restantes: {{count}}",
280
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
+ },
281
382
  },
282
383
  table: {
283
384
  rowsPerPage: "Filas por página",
@@ -306,23 +407,41 @@ const es = {
306
407
  open: "Abrir",
307
408
  search: "Buscar…",
308
409
  modified: "{{count}} filas modificadas",
410
+ modified_one: "{{count}} fila modificada",
411
+ modified_many: "{{count}} de filas modificadas",
412
+ modified_other: "{{count}} filas modificadas",
309
413
  saveFailed: 'Error al guardar',
310
414
  selected: "{{count}} seleccionados",
415
+ selected_one: "{{count}} seleccionado",
416
+ selected_many: "{{count}} seleccionados",
417
+ selected_other: "{{count}} seleccionados",
311
418
  edit: "Editar",
312
419
  delete: "Eliminar",
313
420
  },
314
421
  grid: {
315
422
  bulkSelected: "{{count}} seleccionados",
423
+ bulkSelected_one: "{{count}} seleccionado",
424
+ bulkSelected_many: "{{count}} seleccionados",
425
+ bulkSelected_other: "{{count}} seleccionados",
316
426
  bulkSelectedAllMatches: "{{count}} seleccionados (todas las coincidencias)",
317
427
  bulkClear: "Quitar selección",
318
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.",
319
432
  bulkSelectAllMatching: "Seleccionar las {{count}} coincidencias",
320
433
  bulkAllMatchingSelected: "Están seleccionados los {{count}} registros coincidentes.",
321
434
  bulk: {
322
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.",
323
439
  overLimit: "La selección ({{count}}) supera el límite de la acción ({{limit}}). Reduzca la selección para continuar.",
324
440
  affectedRecords: "Registros afectados ({{count}}):",
325
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.',
326
445
  rowFallback: "Fila {{index}}",
327
446
  andMore: "… y {{count}} más",
328
447
  processed: "{{count}} / {{total}} procesados",
@@ -340,7 +459,6 @@ const es = {
340
459
  undo: "Deshacer",
341
460
  undoing: "Deshaciendo…",
342
461
  done: "Listo",
343
- selectPlaceholder: "Seleccionar…",
344
462
  loading: "Cargando…",
345
463
  },
346
464
  actions: "Acciones",
@@ -359,6 +477,14 @@ const es = {
359
477
  yes: "Sí",
360
478
  no: "No",
361
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
+ },
362
488
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
363
489
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
364
490
  // pack controls its own separator and word order.
@@ -385,10 +511,15 @@ const es = {
385
511
  },
386
512
  import: {
387
513
  downloadTemplate: "Descargar plantilla",
388
- 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.",
389
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.",
390
518
  autoMatched: "Emparejado automáticamente",
391
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.",
392
523
  confidence: {
393
524
  high: "Confianza alta",
394
525
  medium: "Confianza media",
@@ -401,8 +532,17 @@ const es = {
401
532
  cancelImport: "Cancelar la importación",
402
533
  importCancelled: "Importación cancelada",
403
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}}).",
404
538
  createdCount: "{{count}} creados",
539
+ createdCount_one: "{{count}} creado",
540
+ createdCount_many: "{{count}} creados",
541
+ createdCount_other: "{{count}} creados",
405
542
  updatedCount: "{{count}} actualizados",
543
+ updatedCount_one: "{{count}} actualizado",
544
+ updatedCount_many: "{{count}} actualizados",
545
+ updatedCount_other: "{{count}} actualizados",
406
546
  downloadFailed: "Descargar las filas con error",
407
547
  options: "Opciones de importación",
408
548
  writeMode: "Cuando una fila coincide con un registro existente",
@@ -450,6 +590,9 @@ const es = {
450
590
  historyColResult: "Resultado",
451
591
  historyColTime: "Cuándo",
452
592
  errorCount: "{{count}} errores",
593
+ errorCount_one: "{{count}} error",
594
+ errorCount_many: "{{count}} de errores",
595
+ errorCount_other: "{{count}} errores",
453
596
  undoImport: "Deshacer la importación",
454
597
  undoing: "Deshaciendo…",
455
598
  undoConfirm: "¿Deshacer esta importación? Los registros que creó se eliminarán y los que actualizó se restaurarán a sus valores anteriores.",
@@ -510,7 +653,13 @@ const es = {
510
653
  mapped: "Asignado",
511
654
  skipped: "Omitido",
512
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",
513
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",
514
663
  clickToFix: "— haga clic en una celda resaltada para editar en línea.",
515
664
  showingRows: "Mostrando {{shown}} de {{total}} filas",
516
665
  importing: "Importando… {{progress}}%",
@@ -518,11 +667,17 @@ const es = {
518
667
  imported: "{{count}} importado(s)",
519
668
  skippedCount: "{{count}} omitido(s)",
520
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",
521
673
  cancel: "Cancelar",
522
674
  back: "Atrás",
523
675
  next: "Siguiente",
524
676
  close: "Cerrar",
525
677
  importNRows: "Importar {{count}} filas",
678
+ importNRows_one: "Importar {{count}} fila",
679
+ importNRows_many: "Importar {{count}} de filas",
680
+ importNRows_other: "Importar {{count}} filas",
526
681
  importingProgress: "Importando…",
527
682
  requiredMark: "*",
528
683
  required: "Obligatorio",
@@ -534,11 +689,38 @@ const es = {
534
689
  month: "Mes",
535
690
  week: "Semana",
536
691
  day: "Día",
537
- agenda: "Agenda",
538
692
  allDay: "Todo el día",
539
- noEvents: "Sin eventos",
540
693
  newEvent: "Nuevo evento",
541
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
+ },
542
724
  },
543
725
  list: {
544
726
  firstRunTitle: "Aquí todavía no hay nada",
@@ -581,7 +763,9 @@ const es = {
581
763
  refresh: "Actualizar",
582
764
  loading: "Cargando registros…",
583
765
  recordCount: "{{count}} registros",
584
- recordCountOne: "{{count}} registro",
766
+ recordCount_one: "{{count}} registro",
767
+ recordCount_many: "{{count}} de registros",
768
+ recordCount_other: "{{count}} registros",
585
769
  addRecord: "Agregar registro",
586
770
  tabs: "Pestañas",
587
771
  allRecords: "Todos los registros",
@@ -613,7 +797,7 @@ const es = {
613
797
  hideFieldsTitle: "Ocultar campos",
614
798
  dataLimitReached: "Se muestran los primeros {{limit}} registros. Puede haber más datos disponibles.",
615
799
  viewSettings: "Configuración de vista",
616
- 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.",
617
801
  addGroup: "Agregar campo de grupo",
618
802
  collapsedByDefault: "Contraído por defecto",
619
803
  removeGroup: "Eliminar",
@@ -678,6 +862,17 @@ const es = {
678
862
  },
679
863
  gantt: {
680
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.",
681
876
  },
682
877
  },
683
878
  gantt: {
@@ -695,6 +890,7 @@ const es = {
695
890
  },
696
891
  aria: {
697
892
  taskList: "Lista de tareas",
893
+ refreshing: "Actualizando…",
698
894
  },
699
895
  tooltip: {
700
896
  days: "d",
@@ -740,13 +936,22 @@ const es = {
740
936
  conflict: {
741
937
  title: "Conflicto de programación",
742
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?",
743
942
  confirm: "Reprogramar automáticamente",
744
943
  cancel: "Dejarlo como está",
745
944
  },
746
945
  autoScheduleDlg: {
747
946
  title: "Programación automática",
748
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?",
749
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.",
750
955
  confirm: "Aplicar",
751
956
  cancel: "Cancelar",
752
957
  none: "Todas las dependencias se cumplen: no hay nada que reprogramar.",
@@ -825,6 +1030,7 @@ const es = {
825
1030
  tabActionsFor: "Acciones de vista para {{name}}",
826
1031
  readonlyAriaLabel: "Vista de solo lectura",
827
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.",
828
1034
  },
829
1035
  designer: {
830
1036
  undo: "Deshacer",
@@ -850,7 +1056,9 @@ const es = {
850
1056
  pageHeaderActions: "Acciones del encabezado de página",
851
1057
  emojiPicker: "Selector de emojis",
852
1058
  reactionCount: "{{emoji}} {{count}} reacciones",
853
- 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",
854
1062
  recordDetail: "Detalle del registro",
855
1063
  recordDetailWithLabel: "Detalle de {{label}}",
856
1064
  openAsFullPage: "Abrir como página completa",
@@ -877,7 +1085,6 @@ const es = {
877
1085
  viewAll: "Ver todo",
878
1086
  new: "Nuevo",
879
1087
  add: "Agregar",
880
- emptyValue: "—",
881
1088
  comments: "Comentarios",
882
1089
  searchComments: "Buscar comentarios…",
883
1090
  addCommentPlaceholder: "Añadir comentario… (Ctrl+Enter para enviar)",
@@ -888,11 +1095,22 @@ const es = {
888
1095
  unpin: "Desfijar",
889
1096
  justNow: "justo ahora",
890
1097
  minutesAgo: "hace {{count}} min",
1098
+ minutesAgo_one: "hace {{count}} min",
1099
+ minutesAgo_many: "hace {{count}} min",
1100
+ minutesAgo_other: "hace {{count}} min",
891
1101
  hoursAgo: "hace {{count}} h",
1102
+ hoursAgo_one: "hace {{count}} h",
1103
+ hoursAgo_many: "hace {{count}} h",
1104
+ hoursAgo_other: "hace {{count}} h",
892
1105
  daysAgo: "hace {{count}} d",
1106
+ daysAgo_one: "hace {{count}} d",
1107
+ daysAgo_many: "hace {{count}} d",
1108
+ daysAgo_other: "hace {{count}} d",
893
1109
  dropFilesToUpload: "Arrastra archivos aquí o haz clic para subir",
894
1110
  attachmentCount: "{{count}} archivo adjunto",
895
- attachmentCountPlural: "{{count}} archivos adjuntos",
1111
+ attachmentCount_one: "{{count}} archivo adjunto",
1112
+ attachmentCount_many: "{{count}} de archivos adjuntos",
1113
+ attachmentCount_other: "{{count}} archivos adjuntos",
896
1114
  removeAttachment: "Eliminar adjunto",
897
1115
  // Record Attachments panel (enable.files, objectstack#4358)
898
1116
  attachments: "Adjuntos",
@@ -910,11 +1128,6 @@ const es = {
910
1128
  attachmentsLoadFailed: "No se pudieron cargar los adjuntos de este registro.",
911
1129
  attachmentsApiUnavailable: "La lista de adjuntos no está disponible en este objeto.",
912
1130
  retryLoadAttachments: "Reintentar",
913
- unifiedDiff: "Vista unificada",
914
- sideBySideDiff: "Vista lado a lado",
915
- noChanges: "Sin cambios",
916
- previousVersion: "Anterior",
917
- currentVersion: "Actual",
918
1131
  discussion: "Discusión",
919
1132
  showDiscussion: "Mostrar discusión ({{count}})",
920
1133
  hideDiscussion: "Ocultar discusión",
@@ -929,25 +1142,36 @@ const es = {
929
1142
  writeComment: "Escribe un comentario…",
930
1143
  subscribedTooltip: "Suscrito — clic para cancelar suscripción",
931
1144
  unsubscribedTooltip: "Suscribirse a notificaciones",
932
- firstRecord: "Primer registro (Inicio)",
933
- previousRecordKey: "Registro anterior (←)",
934
- nextRecordKey: "Siguiente registro (→)",
935
- lastRecord: "Último registro (Fin)",
936
1145
  noRecords: "Sin registros",
937
- searchWhileNavigating: "Buscar mientras navegas",
938
- searchRecords: "Buscar registros…",
939
1146
  allActivity: "Toda la actividad",
940
1147
  commentsOnly: "Solo comentarios",
941
1148
  fieldChangesFilter: "Cambios de campo",
942
1149
  tasksOnly: "Solo tareas",
943
1150
  leaveCommentPlaceholder: "Deja un comentario… (Ctrl+Enter para enviar)",
944
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',
945
1167
  loadMore: "Cargar más",
946
1168
  edited: "(editado)",
947
1169
  via: "vía {{source}}",
948
1170
  viewSource: "Ver origen",
949
1171
  replyCount: "{{count}} respuesta",
950
- replyCountPlural: "{{count}} respuestas",
1172
+ replyCount_one: "{{count}} respuesta",
1173
+ replyCount_many: "{{count}} de respuestas",
1174
+ replyCount_other: "{{count}} respuestas",
951
1175
  replyPlaceholder: "Responder…",
952
1176
  filterActivity: "Filtrar actividad",
953
1177
  openDiscussion: "Abrir panel de discusión",
@@ -962,6 +1186,7 @@ const es = {
962
1186
  writeStrippedReadonly: "De solo lectura, por lo que no se aplicó: {{fields}}",
963
1187
  writeStrippedByState: "No editable en el estado actual de este registro, por lo que no se aplicó: {{fields}}",
964
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}}",
965
1190
  writeStrippedUnknownReason: "No aplicado por el servidor: {{fields}}",
966
1191
  approvalPendingEditable: "En aprobación · editable",
967
1192
  approvalPendingTooltip: "Este registro tiene una solicitud de aprobación pendiente; este paso todavía permite la edición",
@@ -983,6 +1208,8 @@ const es = {
983
1208
  pathStageLostUpcoming: '{{stage}}, perdida, no alcanzada',
984
1209
  pathStageWonUpcoming: '{{stage}}, etapa objetivo, no alcanzada',
985
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.",
986
1213
  linkCopyFailed: "No se pudo copiar el enlace",
987
1214
  cancel: "Cancelar",
988
1215
  cancelEdit: "Descartar cambios",
@@ -1012,39 +1239,69 @@ const es = {
1012
1239
  sortBy: "Ordenar por",
1013
1240
  filterPlaceholder: "Filtrar…",
1014
1241
  highlightFields: "Campos clave",
1242
+ highlightsLabel: "Campos clave del registro",
1015
1243
  createdBy: "Creado por",
1016
1244
  updatedBy: "Actualizado por",
1017
1245
  created: "Creado",
1018
1246
  updated: "Actualizado",
1019
- // objectui#3863 — base key. es's third category `many` starts at a million, where
1020
- // the plural form is correct, so the base repeats `_other`.
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.
1021
1250
  showEmptyRelated: "+ {{count}} vacíos",
1022
1251
  showEmptyRelated_one: "+ {{count}} vacío",
1252
+ showEmptyRelated_many: "+ {{count}} vacíos",
1023
1253
  showEmptyRelated_other: "+ {{count}} vacíos",
1024
1254
  copyEmail: "Copiar correo",
1025
1255
  copyPhone: "Copiar teléfono",
1026
1256
  copyRecordId: "Copiar ID de registro",
1027
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",
1028
1261
  hideEmptyFields: "Ocultar campos vacíos",
1029
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",
1030
1273
  },
1031
1274
  chart: {
1032
- noData: "No hay datos de gráfico disponibles",
1033
1275
  loading: "Cargando gráfico…",
1276
+ refreshing: "Actualizando…",
1034
1277
  nullCategory: "(Sin especificar)",
1035
- },
1036
- map: {
1037
- searchLocations: "Buscar ubicaciones…",
1038
- locationDetails: "Detalles de ubicación",
1039
- markersCount: "{{count}} marcadores",
1040
- invalidCoordinates: "{{count}} registro con coordenadas faltantes o inválidas excluido del mapa.",
1041
- invalidCoordinatesPlural: "{{count}} registros con coordenadas faltantes o inválidas excluidos del mapa.",
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
+ },
1042
1282
  },
1043
1283
  dashboard: {
1044
- 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
+ },
1045
1297
  loading: "Cargando…",
1298
+ refreshing: "Actualizando…",
1299
+ refreshAll: "Actualizar todo",
1300
+ refreshDashboard: "Actualizar panel de control",
1046
1301
  pickMeasures: "Elija medidas (valores) para este widget de dataset.",
1047
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.",
1048
1305
  details: "Detalles",
1049
1306
  exportCsv: "Exportar CSV",
1050
1307
  openInList: "Abrir en la lista",
@@ -1072,12 +1329,10 @@ const es = {
1072
1329
  },
1073
1330
  },
1074
1331
  addWidget: "Añadir widget",
1075
- removeWidget: "Eliminar widget",
1076
1332
  editLayout: "Editar diseño",
1077
1333
  saveLayout: "Guardar diseño",
1078
1334
  resetLayout: "Restablecer diseño",
1079
1335
  total: "Total",
1080
- noDataAvailable: "Sin datos disponibles",
1081
1336
  noDataSourceFor: "Sin fuente de datos para",
1082
1337
  config: {
1083
1338
  breadcrumb: {
@@ -1199,10 +1454,6 @@ const es = {
1199
1454
  appDescription: "Descripción",
1200
1455
  appIcon: "Icono",
1201
1456
  template: "Plantilla",
1202
- layout: "Diseño",
1203
- layoutSidebar: "Barra lateral",
1204
- layoutHeader: "Encabezado",
1205
- layoutEmpty: "Vacío",
1206
1457
  selectObjects: "Seleccionar objetos",
1207
1458
  searchObjects: "Buscar objetos…",
1208
1459
  selectAll: "Seleccionar todo",
@@ -1211,7 +1462,6 @@ const es = {
1211
1462
  addGroup: "Agregar grupo",
1212
1463
  addUrl: "Agregar URL",
1213
1464
  addSeparator: "Agregar separador",
1214
- noNavItems: "Aún no hay elementos de navegación.",
1215
1465
  logoUrl: "URL del logo",
1216
1466
  primaryColor: "Color primario",
1217
1467
  faviconUrl: "URL del favicon",
@@ -1238,13 +1488,12 @@ const es = {
1238
1488
  appearance: "Apariencia",
1239
1489
  rowHeight: "Altura de fila",
1240
1490
  livePreview: "Vista previa en vivo",
1241
- stepBasicDesc: "Nombre, título y diseño",
1491
+ stepBasicDesc: "Nombre, título e icono",
1242
1492
  stepObjectsDesc: "Seleccionar objetos de negocio",
1243
1493
  stepNavigationDesc: "Construir árbol de navegación",
1244
1494
  stepBrandingDesc: "Logo, colores y favicon",
1245
1495
  noObjectsFound: "No se encontraron objetos.",
1246
1496
  noNavItemsHint: "Aún no hay elementos de navegación. Seleccione objetos en el paso anterior o agregue elementos manualmente.",
1247
- separator: "Separador",
1248
1497
  separatorLabel: "— Separador —",
1249
1498
  newGroup: "Nuevo grupo",
1250
1499
  newLink: "Nuevo enlace",
@@ -1278,6 +1527,7 @@ const es = {
1278
1527
  navTypeSeparator: "Separador",
1279
1528
  navTypeAction: "Acción",
1280
1529
  navTypeComponent: "Componente",
1530
+ navTypeDoc: "Documento",
1281
1531
  navEditIcon: "Editar icono",
1282
1532
  navToggleVisible: "Alternar visibilidad",
1283
1533
  navHidden: "Oculto",
@@ -1355,11 +1605,8 @@ const es = {
1355
1605
  defaultValue: "Valor predeterminado",
1356
1606
  placeholder: "Marcador de posición",
1357
1607
  referenceTo: "Referencia a",
1358
- formula: "Fórmula",
1359
1608
  options: "Opciones",
1360
1609
  addOption: "Agregar opción",
1361
- validationRules: "Reglas de validación",
1362
- addRule: "Agregar regla",
1363
1610
  systemBadge: "Sistema",
1364
1611
  ungrouped: "General",
1365
1612
  deleteConfirmTitle: "¿Eliminar campo?",
@@ -1378,7 +1625,23 @@ const es = {
1378
1625
  },
1379
1626
  },
1380
1627
  console: {
1628
+ studio: {
1629
+ backToHome: "Volver al inicio",
1630
+ },
1381
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.",
1382
1645
  settingsHub: {
1383
1646
  title: "Configuración",
1384
1647
  subtitle: "Configure su espacio de trabajo, las integraciones y los indicadores de funciones.",
@@ -1439,9 +1702,18 @@ const es = {
1439
1702
  statusFull: "Límite alcanzado",
1440
1703
  resetsDaily: "Se restablece esta noche",
1441
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",
1442
1713
  ctaUpgrade: "Mejore el plan para continuar",
1443
1714
  ctaTopUp: "Añada créditos para continuar",
1444
1715
  ariaLabel: "Uso de IA: {{status}}",
1716
+ breakdownTitle: "Usado hasta ahora",
1445
1717
  },
1446
1718
  workspaceTitle: "Espacio de trabajo de IA",
1447
1719
  workspaceSubtitle: "Pregunte, inspeccione y retome conversaciones",
@@ -1451,6 +1723,31 @@ const es = {
1451
1723
  share: "Compartir",
1452
1724
  shareTitle: "Compartir esta conversación",
1453
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
+ },
1454
1751
  newChat: "Nuevo",
1455
1752
  searchChats: "Buscar chats…",
1456
1753
  noChatsYet: "Todavía no hay chats",
@@ -1480,7 +1777,7 @@ const es = {
1480
1777
  empty: {
1481
1778
  build: {
1482
1779
  title: "Crear con IA",
1483
- 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.",
1484
1781
  },
1485
1782
  ask: {
1486
1783
  title: "Pregunte a sus datos",
@@ -1489,7 +1786,7 @@ const es = {
1489
1786
  editApp: {
1490
1787
  title: "Editando «{{app}}»",
1491
1788
  titleGeneric: "Editar esta aplicación",
1492
- 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.",
1493
1790
  },
1494
1791
  },
1495
1792
  clearConversation: "Borrar",
@@ -1542,23 +1839,41 @@ const es = {
1542
1839
  recentRecords: "Enumera los 5 registros creados más recientemente.",
1543
1840
  recordCounts: "Cuenta los registros de cada objeto.",
1544
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.
1545
1850
  metadataAssistant: {
1546
- buildCrm: "Crea un CRM de ventas — clientes, contactos y un embudo de oportunidades que pueda totalizar por etapa.",
1547
- buildApp: "Crea un seguimiento de proyectos — proyectos, tareas con responsables y fechas de vencimiento, y un tablero por estado.",
1548
- buildFlow: "Diseña una mesa de ayuda — tickets con prioridad, un flujo de estados y vínculos con los clientes.",
1549
- buildInventory: "Crea una aplicación de inventario — productos, niveles de stock, proveedores y visibilidad de stock bajo.",
1550
- 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.",
1551
1856
  },
1552
1857
  generic: {
1553
1858
  help: "¿En qué puedes ayudarme?",
1554
1859
  availableObjects: "Enumera los objetos de datos disponibles.",
1555
1860
  recentActivity: "Resume mi actividad reciente.",
1556
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`.
1557
1872
  editApp: {
1558
1873
  addField: "Añade un campo a uno de los objetos.",
1559
1874
  addObject: "Añade un objeto nuevo y relaciónalo con uno existente.",
1560
1875
  addDashboard: "Añade un panel para las métricas clave.",
1561
- 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.",
1562
1877
  },
1563
1878
  },
1564
1879
  changesTitle: "Confirmar cambios",
@@ -1640,6 +1955,13 @@ const es = {
1640
1955
  pages: "Páginas",
1641
1956
  reports: "Informes",
1642
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',
1643
1965
  },
1644
1966
  // objectui#4024 — the single-namespace settings screen. Its sibling
1645
1967
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1659,6 +1981,7 @@ const es = {
1659
1981
  saveChanges: "Guardar cambios",
1660
1982
  unsavedCount: "{{count}} cambios sin guardar",
1661
1983
  unsavedCount_one: "{{count}} cambio sin guardar",
1984
+ unsavedCount_many: "{{count}} de cambios sin guardar",
1662
1985
  unsavedCount_other: "{{count}} cambios sin guardar",
1663
1986
  cryptoRefusalTitle: "Esta instalación no puede cifrar secretos",
1664
1987
  cryptoRefusalSubjectSuffix: "está declarado como cifrado, por lo que no se escribió nada.",
@@ -1731,6 +2054,21 @@ const es = {
1731
2054
  records: "Registros",
1732
2055
  recentRecords: "Visto recientemente",
1733
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
+ },
1734
2072
  errors: {
1735
2073
  somethingWentWrong: "Algo salió mal",
1736
2074
  unexpectedError: "Ocurrió un error inesperado al renderizar esta vista.",
@@ -1761,6 +2099,7 @@ const es = {
1761
2099
  viewNameInvalid: "Use minúsculas, números y guiones bajos; empiece por una letra o un guion bajo.",
1762
2100
  systemViewReadonly: "Vista del sistema definida en el código: solo lectura.",
1763
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.",
1764
2103
  cannotDeleteMetaView: "Esta vista está integrada y definida en el código: no se puede eliminar.",
1765
2104
  expandToPage: "Abrir como página completa",
1766
2105
  objectNotFound: "Objeto no encontrado",
@@ -1771,12 +2110,14 @@ const es = {
1771
2110
  allRecords: "Todos los registros",
1772
2111
  new: "Nuevo",
1773
2112
  configureView: "Configurar vista",
1774
- toolbar: "Barra de herramientas",
1775
2113
  toolbarEnabledCount: "{{count}} de {{total}} habilitados",
1776
2114
  searchFields: "Buscar campos…",
1777
2115
  title: "Título",
1778
2116
  viewType: "Tipo de vista",
1779
2117
  recordCount: "{{count}} registros",
2118
+ recordCount_one: "{{count}} registro",
2119
+ recordCount_many: "{{count}} de registros",
2120
+ recordCount_other: "{{count}} registros",
1780
2121
  save: "Guardar",
1781
2122
  discard: "Descartar",
1782
2123
  createView: "Crear vista",
@@ -1788,11 +2129,13 @@ const es = {
1788
2129
  longitudeField: "Campo de longitud",
1789
2130
  imageField: "Campo de imagen",
1790
2131
  selectField: "Seleccionar campo…",
1791
- groupBy: "Agrupar por",
1792
2132
  endDateField: "Campo de fecha de fin",
1793
2133
  import: "Importar",
1794
2134
  importTitle: "Importar desde CSV",
1795
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.",
1796
2139
  importedWithSkipped: "{{ok}} fila(s) importada(s); {{skipped}} omitida(s).",
1797
2140
  createViewDesc: "Elija un tipo de vista y asígnele un nombre. Todas las configuraciones se pueden cambiar después.",
1798
2141
  cancel: "Cancelar",
@@ -1801,6 +2144,9 @@ const es = {
1801
2144
  deleteViewTitle: "Eliminar vista",
1802
2145
  deleteViewConfirm: "¿Eliminar la vista \"{{name}}\"? Esto no se puede deshacer.",
1803
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.",
1804
2150
  duplicateViewName: "Ya existe una vista con ese nombre.",
1805
2151
  viewTypeGrid: "Cuadrícula",
1806
2152
  viewTypeGridDesc: "Tabla tipo hoja de cálculo de registros.",
@@ -1837,10 +2183,14 @@ const es = {
1837
2183
  chartTypePie: "Gráfico circular",
1838
2184
  chartTypeArea: "Gráfico de área",
1839
2185
  chartTypeScatter: "Gráfico de dispersión",
1840
- xAxisField: "Campo eje X",
1841
- xAxisFieldHelp: "La dimensión categórica o temporal.",
1842
- yAxisField: "Campo eje Y",
1843
- yAxisFieldHelp: "El campo numérico para agregar.",
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.",
1844
2194
  ufTabs: "Pestañas",
1845
2195
  ufAddField: "+ Agregar campo de filtro…",
1846
2196
  ufShowAllRecords: "Mostrar pestaña \"Todos los registros\"",
@@ -1854,6 +2204,9 @@ const es = {
1854
2204
  unpinItem: "Desfijar {{name}}",
1855
2205
  dragToReorder: "Arrastrar para reordenar",
1856
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.",
1857
2210
  },
1858
2211
  },
1859
2212
  auth: {
@@ -1907,6 +2260,8 @@ const es = {
1907
2260
  resendOtpCountdownText: "Reenviar en {seconds} s",
1908
2261
  usePhoneOtpText: "Iniciar sesión con código de verificación",
1909
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",
1910
2265
  },
1911
2266
  register: {
1912
2267
  title: "Crear una cuenta",
@@ -1925,8 +2280,12 @@ const es = {
1925
2280
  submittingButton: "Creando cuenta…",
1926
2281
  hasAccountText: "¿Ya tienes una cuenta?",
1927
2282
  signInText: "Iniciar sesión",
2283
+ socialButton: "Registrarse con {provider}",
2284
+ orText: "o continúe con correo electrónico",
1928
2285
  errors: {
1929
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.",
1930
2289
  },
1931
2290
  verifyInbox: {
1932
2291
  title: "Revise su bandeja de entrada",
@@ -2125,6 +2484,15 @@ const es = {
2125
2484
  role: "Rol",
2126
2485
  save: "Guardar cambios",
2127
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
+ },
2128
2496
  password: {
2129
2497
  changeTitle: "Cambiar contraseña",
2130
2498
  setTitle: "Establecer contraseña local",
@@ -2156,7 +2524,6 @@ const es = {
2156
2524
  label: "Espacios de trabajo",
2157
2525
  default: "Mi espacio de trabajo",
2158
2526
  switch: "Cambiar espacio de trabajo",
2159
- create: "Crear espacio de trabajo",
2160
2527
  createTitle: "Crear un espacio de trabajo",
2161
2528
  createDescription: "Un espacio de trabajo es un lugar compartido para que tu equipo colabore.",
2162
2529
  createButton: "Crear espacio de trabajo",
@@ -2181,7 +2548,6 @@ const es = {
2181
2548
  packageManagement: "Gestión de paquetes",
2182
2549
  searchNavigation: "Buscar en la navegación…",
2183
2550
  settings: "Configuración",
2184
- help: "Ayuda",
2185
2551
  helpTooltip: "Ayuda y documentación",
2186
2552
  activityFeed: "Feed de actividad",
2187
2553
  notifications: "Notificaciones",
@@ -2241,6 +2607,9 @@ const es = {
2241
2607
  },
2242
2608
  pendingDrafts: {
2243
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.",
2244
2613
  cta: "Publicar",
2245
2614
  publishing: "Publicando…",
2246
2615
  published: "¡Publicado! Sus cambios están activos.",
@@ -2255,7 +2624,6 @@ const es = {
2255
2624
  capabilityWarn: "Comprobación de autoría: {{count}} referencia(s) de capacidad no apuntan a nada.",
2256
2625
  },
2257
2626
  title: "Inicio",
2258
- subtitle: "Panel de tu espacio de trabajo",
2259
2627
  nav: "Inicio",
2260
2628
  allApps: "Todas las aplicaciones",
2261
2629
  yourApps: "Tus aplicaciones",
@@ -2267,8 +2635,6 @@ const es = {
2267
2635
  empty: "Estás al día",
2268
2636
  },
2269
2637
  loading: "Cargando espacio de trabajo…",
2270
- recent: "Recientes",
2271
- starred: "Destacados",
2272
2638
  welcome: "Bienvenido a ObjectUI",
2273
2639
  welcomeDescription: "Comienza creando tu primera aplicación o configura los ajustes del sistema.",
2274
2640
  createFirstApp: "Crea tu primera aplicación",
@@ -2276,8 +2642,6 @@ const es = {
2276
2642
  browseMarketplace: "Explorar marketplace de apps",
2277
2643
  quickActions: {
2278
2644
  title: "Acciones rápidas",
2279
- createApp: "Crear app",
2280
- createAppDesc: "Comienza con una nueva aplicación",
2281
2645
  manageObjects: "Gestionar objetos",
2282
2646
  manageObjectsDesc: "Configura modelos de datos",
2283
2647
  systemSettings: "Configuración del sistema",
@@ -2293,18 +2657,15 @@ const es = {
2293
2657
  greetingNight: "Turno de noche",
2294
2658
  heroTagline: "Continúe donde lo dejó o descubra algo nuevo.",
2295
2659
  open: "Abrir",
2296
- stats: {
2297
- apps: "Aplicaciones",
2298
- starred: "Destacados",
2299
- recent: "Recientes",
2300
- },
2301
2660
  recentApps: {
2302
2661
  title: "Abiertos recientemente",
2303
2662
  itemType: {
2304
2663
  object: "Objeto",
2305
2664
  dashboard: "Panel",
2306
2665
  page: "Página",
2666
+ report: "Informe",
2307
2667
  record: "Registro",
2668
+ metadata: "Metadatos",
2308
2669
  },
2309
2670
  },
2310
2671
  starredApps: {
@@ -2326,7 +2687,6 @@ const es = {
2326
2687
  organizations: "Organizaciones",
2327
2688
  roles: "Roles",
2328
2689
  configuration: "Configuración",
2329
- createApp: "Crear aplicación",
2330
2690
  administration: "Administración",
2331
2691
  datasources: "Fuentes de datos",
2332
2692
  documentation: "Documentación",
@@ -2351,6 +2711,7 @@ const es = {
2351
2711
  typeUpdate: "Actualizar",
2352
2712
  typeDelete: "Eliminar",
2353
2713
  typeComment: "Comentario",
2714
+ typeSystem: "Sistema",
2354
2715
  relativeJustNow: "ahora mismo",
2355
2716
  relativeSecondsAgo: "hace {{count}}s",
2356
2717
  relativeMinutesAgo: "hace {{count}}m",
@@ -2372,8 +2733,13 @@ const es = {
2372
2733
  placeholder: "Buscar objetos, paneles, páginas, informes…",
2373
2734
  inputAriaLabel: "Buscar objetos, paneles, páginas, informes",
2374
2735
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2375
- 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}}\"",
2376
2739
  itemsAvailable: "{{count}} elementos disponibles",
2740
+ itemsAvailable_one: "{{count}} elemento disponible",
2741
+ itemsAvailable_many: "{{count}} de elementos disponibles",
2742
+ itemsAvailable_other: "{{count}} elementos disponibles",
2377
2743
  noResults: "Sin resultados encontrados",
2378
2744
  noResultsHint: "Intente ajustar sus términos de búsqueda",
2379
2745
  typeObjects: "Objetos",
@@ -2398,7 +2764,11 @@ const es = {
2398
2764
  noAppsConfigured: "Sin aplicaciones configuradas",
2399
2765
  noAppsConfiguredDescription: "No hay aplicaciones registradas. Cree su primera aplicación o visite la configuración del sistema.",
2400
2766
  appNotAvailable: "Aplicación no disponible",
2401
- appNotAvailableDescription: "Esta aplicación aún no está disponible — puede que todavía se esté publicando. Vuelva a intentarlo en un momento.",
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.",
2402
2772
  appAccessDenied: "No tiene acceso a esta aplicación",
2403
2773
  appAccessDeniedDescription: "Esta aplicación existe, pero su cuenta no está autorizada para abrirla. Solicite acceso a un administrador.",
2404
2774
  appAccessDeniedHome: "Volver al inicio",
@@ -2413,11 +2783,11 @@ const es = {
2413
2783
  description: "Ingrese la información requerida para continuar.",
2414
2784
  selectPlaceholder: "Seleccionar {{label}}",
2415
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)',
2416
2788
  cancel: "Cancelar",
2417
2789
  confirm: "Confirmar",
2418
2790
  uploading: "Subiendo…",
2419
- defaultActionTitle: "Acción",
2420
- ok: "Aceptar",
2421
2791
  lookupPlaceholder: "ID de registro para {{label}}",
2422
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.",
2423
2793
  },
@@ -2426,11 +2796,6 @@ const es = {
2426
2796
  confirm: "Continuar",
2427
2797
  cancel: "Cancelar",
2428
2798
  },
2429
- rowAction: {
2430
- openMenu: "Abrir menú",
2431
- edit: "Editar",
2432
- delete: "Eliminar",
2433
- },
2434
2799
  navigationSync: {
2435
2800
  addedPage: "Navegación actualizada: página \"{{name}}\" agregada",
2436
2801
  addedDashboard: "Navegación actualizada: panel \"{{name}}\" agregado",
@@ -2451,6 +2816,9 @@ const es = {
2451
2816
  noRecordId: "No se proporcionó ID de registro",
2452
2817
  deleteConfirm: "¿Eliminar este registro?",
2453
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",
2454
2822
  bulkDeletePartial: "{{succeeded}} eliminados, {{failed}} fallidos",
2455
2823
  },
2456
2824
  objectViewActions: {
@@ -2462,15 +2830,6 @@ const es = {
2462
2830
  exportFailed: "Error al exportar: {{message}}",
2463
2831
  forecastSoon: "La vista de pronóstico llegará pronto",
2464
2832
  },
2465
- recordDetail: {
2466
- viewersTooltip: "Usuarios viendo este registro ahora",
2467
- },
2468
- cellRender: {
2469
- empty: "Vacío",
2470
- yes: "Sí",
2471
- no: "No",
2472
- systemFields: "Sistema",
2473
- },
2474
2833
  user: {
2475
2834
  profile: "Perfil",
2476
2835
  settings: "Configuración",
@@ -2660,18 +3019,37 @@ const es = {
2660
3019
  regionLabel: "Notificaciones",
2661
3020
  groupCount: "{{count}} notificaciones",
2662
3021
  groupUnread: "{{count}} sin leer",
3022
+ groupUnread_one: "{{count}} sin leer",
3023
+ groupUnread_many: "{{count}} sin leer",
3024
+ groupUnread_other: "{{count}} sin leer",
2663
3025
  groupMarkRead: "Marcar como leídas",
2664
3026
  groupMarkReadTitle: "Marcar como leídas todas las de este tipo",
2665
3027
  empty: "Sin notificaciones",
2666
3028
  markAllRead: "Marcar todo como leído",
2667
3029
  viewAll: "Ver todas las notificaciones",
2668
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",
2669
3034
  viewApprovals: "Ver aprobaciones",
2670
3035
  noPendingApprovals: "Sin aprobaciones pendientes",
2671
3036
  openApprovalsInbox: "Abrir bandeja de aprobaciones",
2672
3037
  badgeTotal: "{{total}} en total",
2673
3038
  badgeNotifications: "{{unread}} notificaciones",
2674
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.",
2675
3053
  emptyUnread: "Todo al día",
2676
3054
  filterUnread: "No leídos",
2677
3055
  filterAll: "Todos",
@@ -2685,12 +3063,14 @@ const es = {
2685
3063
  thankYouTitle: "¡Gracias!",
2686
3064
  thankYouMessage: "Su envío fue recibido correctamente.",
2687
3065
  redirecting: "Redirigiendo en {{seconds}} segundos…",
3066
+ redirectPending: "Redirigiendo…",
2688
3067
  unavailableTitle: "Formulario no disponible",
2689
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.",
2690
3069
  tryDemo: "Probar demo",
2691
3070
  retry: "Reintentar",
2692
3071
  loading: "Cargando formulario…",
2693
3072
  requiredHint: "* Campo obligatorio",
3073
+ requiredFields: "Campos obligatorios: {{fields}}",
2694
3074
  consentLabelDefault: "Acepto la política de privacidad y doy mi consentimiento para procesar mis datos para esta solicitud.",
2695
3075
  consentLink: "Política de privacidad",
2696
3076
  consentRequired: "Acepte la política de privacidad para continuar.",
@@ -2741,6 +3121,9 @@ const es = {
2741
3121
  noImportableFields: "Ese objeto no tiene campos importables.",
2742
3122
  schemaReadFailed: "No se pudo leer el esquema del objeto.",
2743
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}}.",
2744
3127
  importFrom: "Importar las filas reales desde",
2745
3128
  into: "a",
2746
3129
  opening: "Abriendo…",
@@ -2754,6 +3137,78 @@ const es = {
2754
3137
  openProduction: "Abrir producción",
2755
3138
  manageEnvironments: "Gestionar entornos",
2756
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
+ },
2757
3212
  aiModelStatus: {
2758
3213
  summary: "Crear / Preguntar usa {{conversational}} ({{conversationalSource}}); estructurado usa {{structured}} ({{structuredSource}}).",
2759
3214
  summaryRouting: "Política de enrutamiento: planes gratuitos → {{free}}, planes de pago → {{paid}}.",
@@ -2771,6 +3226,114 @@ const es = {
2771
3226
  sourceInherits: "igual que build/ask",
2772
3227
  sourcePinned: "fijado por {{source}}",
2773
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
+ },
2774
3337
  chatbotError: {
2775
3338
  title: "Error en la respuesta",
2776
3339
  fallbackDetail: "Algo salió mal. Vuelva a intentarlo.",
@@ -2851,7 +3414,7 @@ const es = {
2851
3414
  },
2852
3415
  title: "Marketplace de aplicaciones",
2853
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.",
2854
- searchPlaceholder: "Buscar aplicaciones por nombre o ID de manifiesto…",
3417
+ searchPlaceholder: 'Buscar aplicaciones por nombre o ID de aplicación…',
2855
3418
  searchAria: "Buscar aplicaciones del marketplace",
2856
3419
  installed: "Instalado",
2857
3420
  installedCount: "Instaladas ({{count}})",
@@ -2899,10 +3462,17 @@ const es = {
2899
3462
  purgeSampleData: 'Eliminar datos de ejemplo',
2900
3463
  purgeConfirm: '¿Eliminar todos los registros de ejemplo creados por este paquete? Los registros añadidos por el usuario NO se verán afectados.',
2901
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.',
2902
3468
  purgeNoData: 'No se encontraron registros de ejemplo para eliminar.',
2903
3469
  reseedQueued: 'Los datos de ejemplo se volverán a cargar en el próximo acceso al entorno.',
2904
3470
  reseedLocalSuccess: 'Datos de ejemplo recargados: {{inserted}} insertados, {{updated}} actualizados.',
2905
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.',
2906
3476
  updateAvailable: 'Actualización disponible',
2907
3477
  },
2908
3478
  action: {
@@ -2955,7 +3525,8 @@ const es = {
2955
3525
  reviewed: "Revisado y aprobado",
2956
3526
  unreviewed: "Sin revisar todavía",
2957
3527
  signed: "Firmado",
2958
- 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.",
2959
3530
  services: "Servicios de la plataforma",
2960
3531
  hooks: "Hooks de ciclo de vida",
2961
3532
  network: "Acceso a la red",
@@ -2994,30 +3565,21 @@ const es = {
2994
3565
  storage: "Almacenamiento",
2995
3566
  other: "Otro",
2996
3567
  },
2997
- pricing: {
2998
- free: "Gratis",
2999
- freemium: "Freemium",
3000
- paid: "De pago",
3001
- subscription: "Suscripción",
3002
- "usage-based": "Por uso",
3003
- "contact-sales": "Contactar ventas",
3004
- },
3005
3568
  relativeTime: {
3006
3569
  today: "hoy",
3007
3570
  daysAgo: "hace {{count}}d",
3008
3571
  monthsAgo: "hace {{count}} meses",
3572
+ monthsAgo_one: "hace {{count}} mes",
3573
+ monthsAgo_many: "hace {{count}} meses",
3574
+ monthsAgo_other: "hace {{count}} meses",
3009
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",
3010
3579
  },
3011
3580
  },
3012
- approvals: {
3013
- approve: 'Aprobar',
3014
- reject: 'Rechazar',
3015
- comment: 'Comentario (opcional)',
3016
- approveSuccess: 'Aprobado',
3017
- rejectSuccess: 'Rechazado',
3018
- rejectConfirm: '¿Rechazar esta solicitud de aprobación?',
3019
- },
3020
3581
  approvalsInbox: {
3582
+ recordUnresolvable: 'Este registro no se puede abrir',
3021
3583
  loadMore: 'Cargar más',
3022
3584
  loadingMore: 'Cargando…',
3023
3585
  loadedOf: '{{loaded}} de {{total}} cargadas',
@@ -3036,6 +3598,9 @@ const es = {
3036
3598
  requestInfoSent: 'Devuelta al solicitante para más información',
3037
3599
  remindBtn: 'Recordatorio',
3038
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',
3039
3604
  remindThrottled: 'Ya se envió un recordatorio hace poco; inténtalo más tarde.',
3040
3605
  replyPlaceholder: 'Responder en esta solicitud…',
3041
3606
  slaRemaining: 'SLA: quedan {{dur}}',
@@ -3052,6 +3617,9 @@ const es = {
3052
3617
  progressApprovals: 'Aprobaciones — {{got}} de {{need}}',
3053
3618
  progressGroups: 'Progreso de firmas — {{got}} de {{need}} grupos',
3054
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',
3055
3623
  progressBar: 'Progreso de la decisión',
3056
3624
  declaredActions: 'Acciones',
3057
3625
  attachmentChip: 'Adjunto',
@@ -3083,6 +3651,9 @@ const es = {
3083
3651
  filterCount: '{{shown}} de {{total}}',
3084
3652
  selected: 'seleccionadas',
3085
3653
  actionableCount: '({{count}} accionables)',
3654
+ actionableCount_one: '({{count}} accionable)',
3655
+ actionableCount_many: '({{count}} accionables)',
3656
+ actionableCount_other: '({{count}} accionables)',
3086
3657
  selectAll: 'Seleccionar todo',
3087
3658
  selectRow: 'Seleccionar solicitud',
3088
3659
  colRequest: 'Solicitud',
@@ -3156,11 +3727,23 @@ const es = {
3156
3727
  approveN: 'Aprobar {{count}}',
3157
3728
  rejectN: 'Rechazar {{count}}',
3158
3729
  bulkApproveTitle: '¿Aprobar {{count}} solicitudes?',
3730
+ bulkApproveTitle_one: '¿Aprobar {{count}} solicitud?',
3731
+ bulkApproveTitle_many: '¿Aprobar {{count}} de solicitudes?',
3732
+ bulkApproveTitle_other: '¿Aprobar {{count}} solicitudes?',
3159
3733
  bulkApproveBody: 'Cada solicitud se aprueba con tu identidad y su flujo continúa por la rama de aprobación.',
3160
3734
  bulkRejectTitle: '¿Rechazar {{count}} solicitudes?',
3735
+ bulkRejectTitle_one: '¿Rechazar {{count}} solicitud?',
3736
+ bulkRejectTitle_many: '¿Rechazar {{count}} de solicitudes?',
3737
+ bulkRejectTitle_other: '¿Rechazar {{count}} solicitudes?',
3161
3738
  bulkRejectBody: 'Se rechazarán las solicitudes seleccionadas y se notificará a los solicitantes.',
3162
3739
  bulkApproved: '{{count}} solicitudes aprobadas',
3740
+ bulkApproved_one: '{{count}} solicitud aprobada',
3741
+ bulkApproved_many: '{{count}} de solicitudes aprobadas',
3742
+ bulkApproved_other: '{{count}} solicitudes aprobadas',
3163
3743
  bulkRejected: '{{count}} solicitudes rechazadas',
3744
+ bulkRejected_one: '{{count}} solicitud rechazada',
3745
+ bulkRejected_many: '{{count}} de solicitudes rechazadas',
3746
+ bulkRejected_other: '{{count}} solicitudes rechazadas',
3164
3747
  bulkPartial: '{{ok}} con éxito, {{fail}} fallidas: {{which}}',
3165
3748
  rejectOneTitle: '¿Rechazar "{{title}}"?',
3166
3749
  rejectOneBody: 'Se rechaza la solicitud y se notifica al solicitante.',
@@ -3185,8 +3768,17 @@ const es = {
3185
3768
  alreadyDecided: 'Esta solicitud ya fue decidida. Actualiza la lista.',
3186
3769
  justNow: 'justo ahora',
3187
3770
  minutesAgo: 'hace {{count}} min',
3771
+ minutesAgo_one: 'hace {{count}} min',
3772
+ minutesAgo_many: 'hace {{count}} min',
3773
+ minutesAgo_other: 'hace {{count}} min',
3188
3774
  hoursAgo: 'hace {{count}} h',
3775
+ hoursAgo_one: 'hace {{count}} h',
3776
+ hoursAgo_many: 'hace {{count}} h',
3777
+ hoursAgo_other: 'hace {{count}} h',
3189
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',
3190
3782
  },
3191
3783
  preview: {
3192
3784
  empty: {
@@ -3221,11 +3813,17 @@ const es = {
3221
3813
  detailNone: 'No se detectaron diferencias — el borrador coincide con la versión publicada.',
3222
3814
  detailChangedKeys: 'También cambió:',
3223
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.',
3224
3819
  publishConfirm: 'Publicar todo',
3225
- // [objectui#5418] Pre-publish security-posture findings, shown next to
3820
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3226
3821
  // the confirm button so a refusal the door would issue is read BEFORE
3227
3822
  // the click rather than as a toast after the batch rolled back.
3228
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',
3229
3827
  securityBlockWhere: 'Corríjalo en el objeto en Configuración → Uso compartido de registros y vuelva a publicar.',
3230
3828
  },
3231
3829
  // ADR-0045 — the materialized-but-unlisted app banner
@@ -3250,7 +3848,7 @@ const es = {
3250
3848
  revertLabel: 'Se deshizo un cambio',
3251
3849
  applyLabel: 'Cambio de compilación',
3252
3850
  revert: 'deshacer',
3253
- items: 'elementos',
3851
+ items: 'Elementos: {{count}}',
3254
3852
  revertAction: 'Deshacer',
3255
3853
  reverted: 'Deshecho — el cambio se ha revertido.',
3256
3854
  revertFailed: 'Error al deshacer',
@@ -3279,25 +3877,25 @@ const es = {
3279
3877
  rangeEnd: "Hasta",
3280
3878
  operators: {
3281
3879
  equals: "Igual a",
3282
- notEquals: "Distinto de",
3880
+ not_equals: "Distinto de",
3283
3881
  contains: "Contiene",
3284
- containsCaseInsensitive: "Contiene (ignorar mayúsculas)",
3285
- notContains: "No contiene",
3286
- isEmpty: "Está vacío",
3287
- isNotEmpty: "No está vacío",
3288
- greaterThan: "Mayor que",
3289
- lessThan: "Menor que",
3290
- greaterOrEqual: "Mayor o igual",
3291
- 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",
3292
3890
  before: "Antes de",
3293
3891
  after: "Después de",
3294
3892
  between: "Entre",
3295
3893
  in: "En",
3296
- notIn: "No en",
3297
- startsWith: "Comienza por",
3298
- endsWith: "Termina en",
3299
- isNull: "Es null",
3300
- isNotNull: "No es null",
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",
3301
3899
  exists: "Está definido",
3302
3900
  notExists: "No está definido",
3303
3901
  },
@@ -3313,7 +3911,9 @@ const es = {
3313
3911
  },
3314
3912
  collaboration: {
3315
3913
  commentCount: "{{count}} comentarios",
3316
- commentCountOne: "{{count}} comentario",
3914
+ commentCount_one: "{{count}} comentario",
3915
+ commentCount_many: "{{count}} de comentarios",
3916
+ commentCount_other: "{{count}} comentarios",
3317
3917
  resolvedSuffix: " · Resuelto",
3318
3918
  sortComments: "Ordenar comentarios",
3319
3919
  sortOldest: "Más antiguos",
@@ -3322,11 +3922,22 @@ const es = {
3322
3922
  reopen: "Reabrir",
3323
3923
  justNow: "ahora mismo",
3324
3924
  minutesAgo: "hace {{count}} min",
3925
+ minutesAgo_one: "hace {{count}} min",
3926
+ minutesAgo_many: "hace {{count}} min",
3927
+ minutesAgo_other: "hace {{count}} min",
3325
3928
  hoursAgo: "hace {{count}} h",
3929
+ hoursAgo_one: "hace {{count}} h",
3930
+ hoursAgo_many: "hace {{count}} h",
3931
+ hoursAgo_other: "hace {{count}} h",
3326
3932
  daysAgo: "hace {{count}} d",
3933
+ daysAgo_one: "hace {{count}} d",
3934
+ daysAgo_many: "hace {{count}} d",
3935
+ daysAgo_other: "hace {{count}} d",
3327
3936
  edited: "(editado)",
3328
3937
  reactionCount: "{{count}} reacciones",
3329
- reactionCountOne: "{{count}} reacción",
3938
+ reactionCount_one: "{{count}} reacción",
3939
+ reactionCount_many: "{{count}} de reacciones",
3940
+ reactionCount_other: "{{count}} reacciones",
3330
3941
  addThumbsUp: "Agregar me gusta",
3331
3942
  reply: "Responder",
3332
3943
  reactThumbsUp: "Reaccionar con me gusta",
@@ -3337,9 +3948,13 @@ const es = {
3337
3948
  commentPlaceholder: "Agregar un comentario… (usa @ para mencionar)",
3338
3949
  send: "Enviar",
3339
3950
  presentUserCount: "{{count}} usuarios presentes",
3340
- presentUserCountOne: "{{count}} usuario presente",
3951
+ presentUserCount_one: "{{count}} usuario presente",
3952
+ presentUserCount_many: "{{count}} de usuarios presentes",
3953
+ presentUserCount_other: "{{count}} usuarios presentes",
3341
3954
  moreUserCount: "{{count}} usuarios más",
3342
- 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",
3343
3958
  userStatusTitle: "{{name}} ({{status}})",
3344
3959
  statusActive: "activo",
3345
3960
  statusIdle: "inactivo",
@@ -3347,6 +3962,11 @@ const es = {
3347
3962
  },
3348
3963
  wizard: {
3349
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",
3350
3970
  },
3351
3971
  flowRunner: {
3352
3972
  title: 'Entrada',
@@ -3404,5 +4024,49 @@ const es = {
3404
4024
  bulkOperationFailed: "Error en la operación masiva: {{reason}}",
3405
4025
  },
3406
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
+ },
3407
4071
  };
3408
4072
  export default es;