@object-ui/i18n 17.6.0 → 18.0.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 (62) hide show
  1. package/CHANGELOG.md +5408 -0
  2. package/README.md +255 -13
  3. package/dist/LocalizationContext.d.ts +32 -9
  4. package/dist/LocalizationContext.js +32 -10
  5. package/dist/builtinAggregateLabels.d.ts +40 -0
  6. package/dist/builtinAggregateLabels.js +23 -0
  7. package/dist/currency.d.ts +27 -3
  8. package/dist/currency.js +28 -4
  9. package/dist/fallbackInterpolation.d.ts +79 -0
  10. package/dist/fallbackInterpolation.js +124 -0
  11. package/dist/i18n.d.ts +27 -1
  12. package/dist/i18n.js +99 -16
  13. package/dist/index.d.ts +8 -13
  14. package/dist/index.js +45 -17
  15. package/dist/locales/ar.d.ts +1504 -188
  16. package/dist/locales/ar.js +1711 -281
  17. package/dist/locales/de.d.ts +1080 -188
  18. package/dist/locales/de.js +1248 -261
  19. package/dist/locales/en.d.ts +1141 -249
  20. package/dist/locales/en.js +1714 -295
  21. package/dist/locales/es.d.ts +1186 -188
  22. package/dist/locales/es.js +1350 -255
  23. package/dist/locales/fr.d.ts +1186 -188
  24. package/dist/locales/fr.js +1351 -258
  25. package/dist/locales/index.d.ts +11940 -2033
  26. package/dist/locales/index.js +48 -9
  27. package/dist/locales/ja.d.ts +1080 -188
  28. package/dist/locales/ja.js +1240 -254
  29. package/dist/locales/ko.d.ts +1080 -188
  30. package/dist/locales/ko.js +1244 -258
  31. package/dist/locales/pt.d.ts +1186 -188
  32. package/dist/locales/pt.js +1350 -255
  33. package/dist/locales/registry.d.ts +102 -0
  34. package/dist/locales/registry.js +220 -0
  35. package/dist/locales/rtl.d.ts +24 -0
  36. package/dist/locales/rtl.js +26 -0
  37. package/dist/locales/ru.d.ts +1292 -188
  38. package/dist/locales/ru.js +1479 -272
  39. package/dist/locales/zh.d.ts +1144 -252
  40. package/dist/locales/zh.js +1245 -259
  41. package/dist/pickLocalized.d.ts +30 -0
  42. package/dist/pickLocalized.js +39 -0
  43. package/dist/provider.d.ts +101 -12
  44. package/dist/provider.js +335 -50
  45. package/dist/translateFn.d.ts +29 -0
  46. package/dist/translateFn.js +8 -0
  47. package/dist/useDisplayLocale.d.ts +11 -0
  48. package/dist/useDisplayLocale.js +11 -0
  49. package/dist/useObjectLabel.d.ts +143 -100
  50. package/dist/useObjectLabel.js +129 -82
  51. package/dist/useSafeTranslation.js +40 -42
  52. package/dist/utils/first-day-of-week.d.ts +71 -0
  53. package/dist/utils/first-day-of-week.js +61 -0
  54. package/dist/utils/formatting.d.ts +23 -1
  55. package/dist/utils/formatting.js +34 -5
  56. package/dist/utils/index.d.ts +1 -0
  57. package/dist/utils/index.js +1 -0
  58. package/dist/utils/spec-formatters.d.ts +13 -23
  59. package/dist/utils/spec-formatters.js +41 -2
  60. package/dist/utils/spec-translations.d.ts +16 -3
  61. package/dist/utils/spec-translations.js +52 -13
  62. package/package.json +12 -6
@@ -13,16 +13,19 @@ const es = {
13
13
  notRestored: 'El servidor aceptó la solicitud pero no restauró su sesión de administrador: sigue suplantando a {{user}}. Cierre sesión y vuelva a iniciarla para terminar.',
14
14
  },
15
15
  },
16
- // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
16
+ // objectui#2600 B5 — capability picker scope group headers (labels come from the capability registry).
17
17
  capability: {
18
18
  label: {
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_mailboxes: "Gestionar los buzones",
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",
28
+ view_all_audit_log: "Ver todo el registro de auditoría",
26
29
  },
27
30
  group: {
28
31
  platform: 'Plataforma',
@@ -30,25 +33,6 @@ const es = {
30
33
  other: 'Otro',
31
34
  },
32
35
  },
33
- // objectui#3546 slice six — el resumen de solo lectura de las facetas de
34
- // autorización de PermissionFacetLink. "pestaña" como en list.tabs.
35
- perm: {
36
- facet: {
37
- none: "Ninguno",
38
- more: "+{{count}} más",
39
- objects: "{{count}} objetos",
40
- objects_one: "{{count}} objeto",
41
- fields: "{{count}} reglas de campo",
42
- fields_one: "{{count}} regla de campo",
43
- rls: "{{count}} políticas RLS",
44
- rls_one: "{{count}} política RLS",
45
- tabs: "{{count}} reglas de pestaña",
46
- tabs_one: "{{count}} regla de pestaña",
47
- adminScope: "Administración delegada configurada",
48
- designInStudio: "Diseñar en Studio →",
49
- designInStudioHint: "Diseñar en Studio",
50
- },
51
- },
52
36
  lookup: {
53
37
  recentlyUsed: 'Usados recientemente',
54
38
  allResults: 'Todos los resultados',
@@ -62,7 +46,9 @@ const es = {
62
46
  selectFirst: 'Seleccione primero {{fields}}',
63
47
  selectRecord: 'Seleccionar registro',
64
48
  recordCount: '{{count}} registros',
65
- recordCountOne: '1 registro',
49
+ recordCount_one: '{{count}} registro',
50
+ recordCount_many: '{{count}} de registros',
51
+ recordCount_other: '{{count}} registros',
66
52
  pageOf: 'Página {{current}} de {{total}}',
67
53
  filters: 'Filtros',
68
54
  clear: 'Limpiar',
@@ -115,14 +101,27 @@ const es = {
115
101
  closePanel: "Cerrar panel",
116
102
  resizeDrawer: "Ajustar el ancho del panel",
117
103
  itemCount: "{{count}} elementos",
118
- itemCountOne: "{{count}} elemento",
104
+ itemCount_one: "{{count}} elemento",
105
+ itemCount_many: "{{count}} de elementos",
106
+ itemCount_other: "{{count}} elementos",
119
107
  toggleSidebar: "Alternar barra lateral",
108
+ breadcrumb: "Ruta de navegación",
120
109
  package: "Paquete",
121
110
  done: "Listo",
122
111
  editInStudio: "Editar en Studio",
123
112
  record: "Registro",
124
113
  retry: "Reintentar",
125
114
  printDialogHint: "Abre el cuadro de diálogo de impresión de tu navegador (no es una exportación a PDF)",
115
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
116
+ // there are two conditions: a reported `total` states the fact with BOTH
117
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
118
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
119
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
120
+ // headroom is deliberately NOT restated here — it moves on every
121
+ // re-baseline, and the figure that was here went stale.
122
+ // `pnpm check:eager-closure` prints it.
123
+ rowCeilingNote: "Mostrando los primeros {{shown}} de {{total}} registros. Acota el filtro.",
124
+ rowCeilingNoteUnknownTotal: "Mostrando los primeros {{shown}} registros. Acota el filtro.",
126
125
  },
127
126
  actions: {
128
127
  decisionOutput: {
@@ -134,6 +133,15 @@ const es = {
134
133
  acknowledge: 'Lo he guardado',
135
134
  copyAll: 'Copiar todo',
136
135
  },
136
+ notAvailableHere: '«{{action}}» no está disponible en la página actual.',
137
+ notAvailableForRecord: 'No disponible para este registro',
138
+ completedSuccessfully: 'La acción se completó correctamente',
139
+ failed: 'La acción falló',
140
+ parallelFailed: 'Una o más acciones paralelas fallaron',
141
+ undo: 'Deshacer',
142
+ undone: 'Cambio deshecho',
143
+ undoneOperation: 'Deshacer: {{description}}',
144
+ redoneOperation: 'Rehacer: {{description}}',
137
145
  },
138
146
  validation: {
139
147
  // "{{field}} es obligatorio" only agreed with masculine field labels —
@@ -156,19 +164,47 @@ const es = {
156
164
  },
157
165
  form: {
158
166
  noPermissionToSave: "No tienes permiso para guardar este registro.",
167
+ noPermissionToCreate: "No tienes permiso para crear registros de {{object}}. Los campos son de solo lectura.",
168
+ noPermissionToEdit: "No tienes permiso para editar registros de {{object}}. Los campos son de solo lectura.",
159
169
  submitFailed: "No se pudo guardar. Inténtalo de nuevo.",
170
+ uploadInFlight: "Espere a que finalice la carga antes de guardar.",
171
+ clearedOnHide: "Se borró lo que ya no corresponde a los valores actuales: {{fields}}",
172
+ 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
173
  discardTitle: "¿Descartar los cambios?",
161
174
  discardMessage: "Tiene cambios sin guardar. Si cierra este formulario ahora, sus ediciones se perderán.",
162
175
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
163
176
  // description, used when the form declares no `description` of its own.
164
177
  dialogDescriptionFallback: "Complete los campos del formulario y luego envíe o cancele.",
178
+ deniedDescription: "No tienes permiso para editar este campo.",
179
+ serverDefaultHint: "Se establece automáticamente al guardar.",
180
+ maxFileSize: "Tamaño máximo: {{size}}",
181
+ masterDetail: {
182
+ loadingColumns: "Cargando columnas…",
183
+ subtotal: "Subtotal",
184
+ tax: "Impuesto ({{rate}}%)",
185
+ total: "Total",
186
+ lineItem: "Línea de detalle",
187
+ rowTitle: "{{title}} — fila {{row}}",
188
+ applyRow: "Aplicar",
189
+ editorDescription: "Introduzca el registro y sus líneas de detalle y luego guarde.",
190
+ noChildObject: "Esta colección no tiene configurado ningún objeto secundario: establezca {{property}} en el objeto cuyas filas enumera.",
191
+ 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.",
192
+ 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.",
193
+ },
194
+ lineItems: {
195
+ title: "Líneas de detalle",
196
+ saveRecordFirst: "Guarde primero el registro para agregar líneas de detalle.",
197
+ notLoaded: "Las líneas de detalle de este registro no se han cargado.",
198
+ loadFailed: "No se pudieron cargar las líneas de detalle",
199
+ saveFailed: "No se pudieron guardar las líneas de detalle",
200
+ noChildObject: "Este panel no tiene configurado ningún objeto secundario: establezca {{property}} en el objeto cuyas filas enumera.",
201
+ },
165
202
  keepEditing: "Seguir editando",
166
203
  discard: "Descartar",
167
204
  conflictTitle: "Conflicto al guardar",
168
205
  conflictMessage: "Otra persona modificó este registro mientras lo editaba. Sobrescribir reemplazará sus cambios por los suyos.",
169
206
  conflictLatestVersion: "Su guardado: {{time}}",
170
207
  conflictOverwrite: "Sobrescribir",
171
- addItem: "Añadir elemento",
172
208
  removeItem: "Eliminar elemento",
173
209
  fieldRequired: "Este campo es obligatorio",
174
210
  invalidFormat: "Formato no válido",
@@ -186,6 +222,12 @@ const es = {
186
222
  createSuccess: "{{object}} creado",
187
223
  updateSuccess: "{{object}} actualizado",
188
224
  deleteSuccess: "{{object}} eliminado",
225
+ created: "Creado",
226
+ saved: "Guardado",
227
+ savedNamed: "{{title}} guardado",
228
+ submitted: "Enviado",
229
+ errorLoading: "Error al cargar el formulario",
230
+ navigateRefused: "El destino `navigateOnSuccess` declarado para este formulario fue rechazado, por lo que no se realizó la navegación.",
189
231
  fullscreen: {
190
232
  title: "Editar texto",
191
233
  description: "Edita el valor de texto completo y luego guarda o cancela los cambios.",
@@ -204,12 +246,19 @@ const es = {
204
246
  remove: "Eliminar la imagen {{index}}",
205
247
  enlarge: "Ampliar {{name}}",
206
248
  preview: "Vista previa de la imagen",
249
+ cropPreview: "Vista previa del recorte de la imagen",
207
250
  previous: "Imagen anterior",
208
251
  next: "Imagen siguiente",
209
252
  counter: "{{current}} / {{total}}",
210
253
  },
254
+ percent: {
255
+ slider: "Porcentaje",
256
+ },
211
257
  relativeDate: {
212
258
  overdue: "Atrasado {{count}} d",
259
+ overdue_one: "Atrasado {{count}} d",
260
+ overdue_many: "Atrasado {{count}} d",
261
+ overdue_other: "Atrasado {{count}} d",
213
262
  },
214
263
  file: {
215
264
  dragDropHere: 'Arrastra y suelta archivos aquí',
@@ -226,6 +275,9 @@ const es = {
226
275
  remove: 'Quitar {{name}}',
227
276
  exceedsMaxSize: '«{{name}}» supera el tamaño máximo ({{max}} MB)',
228
277
  uploadFailed: 'Error al subir «{{name}}»: {{error}}',
278
+ uploadIncomplete: 'La subida de «{{name}}» no se completó: no se devolvió ningún identificador de archivo, así que no se guardó nada',
279
+ restricted: 'Archivo restringido',
280
+ restrictedHint: 'No tienes acceso a los detalles de este archivo',
229
281
  },
230
282
  richText: {
231
283
  format: "Formato: {{format}}",
@@ -242,6 +294,10 @@ const es = {
242
294
  search: "Buscar objetos…",
243
295
  empty: "No se encontraron objetos",
244
296
  },
297
+ registryRef: {
298
+ loadFailed: "No se pudo cargar la lista. Todavía puede escribir el nombre.",
299
+ notFound: "{{name}} (no encontrado)",
300
+ },
245
301
  recipient: {
246
302
  selectTypeFirst: "Selecciona primero un tipo de destinatario.",
247
303
  loading: "Cargando…",
@@ -253,6 +309,9 @@ const es = {
253
309
  selectBusinessUnit: "Seleccionar una unidad de negocio",
254
310
  selectPosition: "Seleccionar un puesto",
255
311
  selectUnitAndSubordinates: "Seleccionar una unidad de negocio",
312
+ selectField: "Seleccionar un campo de usuario",
313
+ noUserFields: "Este objeto no tiene campos de usuario",
314
+ fieldNotUserTyped: "{{name}} — no es un campo de usuario",
256
315
  },
257
316
  filterCondition: {
258
317
  selectObjectFirst: "Selecciona primero un objeto.",
@@ -263,6 +322,33 @@ const es = {
263
322
  editAsJson: "Editar como JSON",
264
323
  useVisualBuilder: "Usar el constructor visual",
265
324
  },
325
+ object: {
326
+ invalidJson: "JSON no válido",
327
+ },
328
+ location: {
329
+ refusedFormat: "No guardado: introduce un par latitud, longitud (ejemplo: 30.2741, 120.1551).",
330
+ refusedRange: "No guardado: {{detail}}",
331
+ latitude: "latitud",
332
+ longitude: "longitud",
333
+ refusedResidueOne: "No guardado: {{name}} «{{text}}» no es un número. Introduce decimales simples (ejemplo: 30.2741, 120.1551).",
334
+ refusedResidue: "No guardado: {{name}} «{{text}}» y {{otherName}} «{{otherText}}» no son números. Introduce decimales simples (ejemplo: 30.2741, 120.1551).",
335
+ },
336
+ date: {
337
+ impossibleDay: "El valor guardado «{{value}}» no es una fecha real. Elige una fecha para reemplazarlo.",
338
+ },
339
+ dateTime: {
340
+ impossibleDay: "El valor guardado «{{value}}» no es una fecha real. Elige una fecha y una hora para reemplazarlo.",
341
+ },
342
+ datePicker: {
343
+ today: "Hoy",
344
+ tomorrow: "Mañana",
345
+ clear: "Borrar fecha",
346
+ openCalendar: "Abrir calendario",
347
+ invalid: "No guardado: «{{value}}» no es una fecha. Escríbela como {{format}} o elígela en el calendario.",
348
+ },
349
+ number: {
350
+ badInput: "No guardado: el texto de este campo no es un número. Introduce un decimal simple (ejemplo: {{example}}).",
351
+ },
266
352
  tags: {
267
353
  placeholder: "Escriba y pulse Intro para añadir…",
268
354
  },
@@ -274,10 +360,25 @@ const es = {
274
360
  postalCode: "Código postal",
275
361
  country: "País",
276
362
  },
363
+ boolean: {
364
+ offBadge: "{{label}} — Desactivado",
365
+ completed: "Completado",
366
+ notCompleted: "No completado",
367
+ },
277
368
  textarea: {
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",
@@ -293,10 +394,15 @@ const es = {
293
394
  selectAllRows: "Seleccionar todas las filas",
294
395
  expandRow: "Expandir fila",
295
396
  collapseRow: "Contraer fila",
397
+ rowActions: "Acciones de fila",
296
398
  hideColumn: "Ocultar columna",
297
399
  freezeColumn: "Fijar columna",
298
400
  unfreezeColumn: "Desfijar columna",
299
401
  pageInfo: "Página {{current}} de {{total}}",
402
+ firstPage: "Primera página",
403
+ previousPage: "Página anterior",
404
+ nextPage: "Página siguiente",
405
+ lastPage: "Última página",
300
406
  totalRecords: "{{count}} en total",
301
407
  noResults: "Sin resultados",
302
408
  noResultsHint: "Intente ajustar sus filtros o términos de búsqueda.",
@@ -306,23 +412,46 @@ const es = {
306
412
  open: "Abrir",
307
413
  search: "Buscar…",
308
414
  modified: "{{count}} filas modificadas",
415
+ modified_one: "{{count}} fila modificada",
416
+ modified_many: "{{count}} de filas modificadas",
417
+ modified_other: "{{count}} filas modificadas",
418
+ saved: "{{count}} filas guardadas",
419
+ saved_one: "{{count}} fila guardada",
420
+ saved_many: "{{count}} de filas guardadas",
421
+ saved_other: "{{count}} filas guardadas",
309
422
  saveFailed: 'Error al guardar',
310
423
  selected: "{{count}} seleccionados",
424
+ selected_one: "{{count}} seleccionado",
425
+ selected_many: "{{count}} seleccionados",
426
+ selected_other: "{{count}} seleccionados",
311
427
  edit: "Editar",
312
428
  delete: "Eliminar",
313
429
  },
314
430
  grid: {
315
431
  bulkSelected: "{{count}} seleccionados",
432
+ bulkSelected_one: "{{count}} seleccionado",
433
+ bulkSelected_many: "{{count}} seleccionados",
434
+ bulkSelected_other: "{{count}} seleccionados",
316
435
  bulkSelectedAllMatches: "{{count}} seleccionados (todas las coincidencias)",
317
436
  bulkClear: "Quitar selección",
318
437
  bulkAllOnPage: "Están seleccionados los {{count}} de esta página.",
438
+ bulkAllOnPage_one: "{{count}} registro de esta página está seleccionado.",
439
+ bulkAllOnPage_many: "Están seleccionados los {{count}} de esta página.",
440
+ bulkAllOnPage_other: "Están seleccionados los {{count}} de esta página.",
319
441
  bulkSelectAllMatching: "Seleccionar las {{count}} coincidencias",
320
442
  bulkAllMatchingSelected: "Están seleccionados los {{count}} registros coincidentes.",
443
+ bulkActions: "Acciones masivas",
321
444
  bulk: {
322
445
  confirmDefault: "Esto se aplicará a {{count}} registro(s).",
446
+ confirmDefault_one: "Esto se aplicará a {{count}} registro.",
447
+ confirmDefault_many: "Esto se aplicará a {{count}} de registros.",
448
+ confirmDefault_other: "Esto se aplicará a {{count}} registros.",
323
449
  overLimit: "La selección ({{count}}) supera el límite de la acción ({{limit}}). Reduzca la selección para continuar.",
324
450
  affectedRecords: "Registros afectados ({{count}}):",
325
451
  skippedIneligible: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
452
+ skippedIneligible_one: '{{count}} de los registros seleccionados no es apto para esta acción y se omitirá.',
453
+ skippedIneligible_many: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
454
+ skippedIneligible_other: '{{count}} de los registros seleccionados no son aptos para esta acción y se omitirán.',
326
455
  rowFallback: "Fila {{index}}",
327
456
  andMore: "… y {{count}} más",
328
457
  processed: "{{count}} / {{total}} procesados",
@@ -340,7 +469,6 @@ const es = {
340
469
  undo: "Deshacer",
341
470
  undoing: "Deshaciendo…",
342
471
  done: "Listo",
343
- selectPlaceholder: "Seleccionar…",
344
472
  loading: "Cargando…",
345
473
  },
346
474
  actions: "Acciones",
@@ -353,17 +481,27 @@ const es = {
353
481
  pullToRefresh: "Desliza para actualizar",
354
482
  refreshing: "Actualizando…",
355
483
  openRecord: "Abrir registro",
484
+ recordUnavailable: "{{object}} · registro no disponible",
356
485
  rowHeight: "Altura de fila: {{mode}}",
357
486
  openMenu: "Abrir menú",
358
487
  empty: "Vacío",
359
488
  yes: "Sí",
360
489
  no: "No",
361
490
  systemFields: "Sistema",
491
+ // objectui#10881 — the grouped grid's two refusals: over a data source
492
+ // that cannot answer the group header query, and over rows a host
493
+ // handed in while declaring them one page of more. `queryGroupHeaders`
494
+ // is the member's name and stays untranslated.
495
+ grouping: {
496
+ 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.",
497
+ 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.",
498
+ },
362
499
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
363
500
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
364
501
  // pack controls its own separator and word order.
365
502
  summary: {
366
503
  pattern: "{{label}}: {{value}}",
504
+ pagePattern: "{{label}} (esta página): {{value}}",
367
505
  count: "Recuento",
368
506
  countEmpty: "Vacíos",
369
507
  countFilled: "Rellenos",
@@ -385,10 +523,15 @@ const es = {
385
523
  },
386
524
  import: {
387
525
  downloadTemplate: "Descargar plantilla",
388
- downloadTemplateHint: "Obtenga un CSV con las columnas correctas (los campos obligatorios llevan *).",
526
+ downloadTemplateHint: "Obtenga un archivo de Excel con las columnas que puede importar (los campos obligatorios llevan *) e instrucciones para rellenarlo.",
389
527
  templateFileName: "{{object}}-import-template",
528
+ templateDownloadFailed: "No se pudo descargar la plantilla. Inténtelo de nuevo.",
529
+ templateNotPermitted: "No tiene permiso para crear registros de este objeto, por lo que su plantilla de importación no está disponible.",
390
530
  autoMatched: "Emparejado automáticamente",
391
531
  autoMatchedSummary: "{{count}} columna(s) emparejada(s) automáticamente: revise y ajuste abajo.",
532
+ autoMatchedSummary_one: "{{count}} columna emparejada automáticamente: revise y ajuste abajo.",
533
+ autoMatchedSummary_many: "{{count}} de columnas emparejadas automáticamente: revise y ajuste abajo.",
534
+ autoMatchedSummary_other: "{{count}} columnas emparejadas automáticamente: revise y ajuste abajo.",
392
535
  confidence: {
393
536
  high: "Confianza alta",
394
537
  medium: "Confianza media",
@@ -401,8 +544,17 @@ const es = {
401
544
  cancelImport: "Cancelar la importación",
402
545
  importCancelled: "Importación cancelada",
403
546
  resultsTruncated: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
547
+ resultsTruncated_one: "Mostrando el primer resultado de fila ({{count}} de {{total}}).",
548
+ resultsTruncated_many: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
549
+ resultsTruncated_other: "Mostrando los primeros {{count}} resultados de filas (de {{total}}).",
404
550
  createdCount: "{{count}} creados",
551
+ createdCount_one: "{{count}} creado",
552
+ createdCount_many: "{{count}} creados",
553
+ createdCount_other: "{{count}} creados",
405
554
  updatedCount: "{{count}} actualizados",
555
+ updatedCount_one: "{{count}} actualizado",
556
+ updatedCount_many: "{{count}} actualizados",
557
+ updatedCount_other: "{{count}} actualizados",
406
558
  downloadFailed: "Descargar las filas con error",
407
559
  options: "Opciones de importación",
408
560
  writeMode: "Cuando una fila coincide con un registro existente",
@@ -417,9 +569,6 @@ const es = {
417
569
  needMatchFields: "Seleccione al menos un campo por el que coincidir.",
418
570
  matchOnlyField: "(solo coincidencia)",
419
571
  optCreateOptions: "Conservar los valores de opción desconocidos",
420
- optRunAutomations: "Ejecutar automatizaciones y disparadores",
421
- optTreatHistorical: "Importar como datos históricos",
422
- optTreatHistoricalHint: "(importa los registros completados tal cual: omite las comprobaciones de la máquina de estados y conserva sus marcas de tiempo y autor originales en lugar de sellarlos ahora)",
423
572
  optSkipBlankKey: "Omitir las filas con valor de coincidencia vacío",
424
573
  optBackground: "Importar en segundo plano",
425
574
  optBackgroundHint: "(se ejecuta como un trabajo reversible)",
@@ -434,6 +583,7 @@ const es = {
434
583
  invalidBoolean: "«{{value}}» no es un valor verdadero/falso válido",
435
584
  invalidNumber: "«{{value}}» no es un número válido",
436
585
  invalidDate: "«{{value}}» no es una fecha válida",
586
+ invalidTime: "«{{value}}» no es una hora válida",
437
587
  invalidOption: "«{{value}}» no es una de las opciones permitidas",
438
588
  requiredValue: "Este campo es obligatorio",
439
589
  matchAmbiguous: "Coincide con más de un registro existente: use un valor único o el id del registro",
@@ -450,10 +600,17 @@ const es = {
450
600
  historyColResult: "Resultado",
451
601
  historyColTime: "Cuándo",
452
602
  errorCount: "{{count}} errores",
603
+ errorCount_one: "{{count}} error",
604
+ errorCount_many: "{{count}} de errores",
605
+ errorCount_other: "{{count}} errores",
453
606
  undoImport: "Deshacer la importación",
454
607
  undoing: "Deshaciendo…",
455
608
  undoConfirm: "¿Deshacer esta importación? Los registros que creó se eliminarán y los que actualizó se restaurarán a sus valores anteriores.",
456
609
  reverted: "Deshecha",
610
+ undoPartial: "{{count}} filas no se deshicieron. Al deshacer de nuevo, solo se reintentan esas filas.",
611
+ undoPartial_one: "{{count}} fila no se deshizo. Al deshacer de nuevo, solo se reintenta esa fila.",
612
+ undoPartial_many: "{{count}} de filas no se deshicieron. Al deshacer de nuevo, solo se reintentan esas filas.",
613
+ undoPartial_other: "{{count}} filas no se deshicieron. Al deshacer de nuevo, solo se reintentan esas filas.",
457
614
  jobStatus: {
458
615
  pending: "Pendiente",
459
616
  running: "En ejecución",
@@ -510,19 +667,33 @@ const es = {
510
667
  mapped: "Asignado",
511
668
  skipped: "Omitido",
512
669
  rowsWithErrors: "{{count}} fila(s) con errores",
670
+ rowsWithErrors_one: "{{count}} fila con errores",
671
+ rowsWithErrors_many: "{{count}} de filas con errores",
672
+ rowsWithErrors_other: "{{count}} filas con errores",
513
673
  rowsCorrected: "{{count}} fila(s) corregida(s)",
674
+ rowsCorrected_one: "{{count}} fila corregida",
675
+ rowsCorrected_many: "{{count}} de filas corregidas",
676
+ rowsCorrected_other: "{{count}} filas corregidas",
514
677
  clickToFix: "— haga clic en una celda resaltada para editar en línea.",
515
678
  showingRows: "Mostrando {{shown}} de {{total}} filas",
516
679
  importing: "Importando… {{progress}}%",
517
680
  importComplete: "Importación completada",
681
+ importPartial: "Importación finalizada con errores",
682
+ importFailed: "La importación ha fallado",
518
683
  imported: "{{count}} importado(s)",
519
684
  skippedCount: "{{count}} omitido(s)",
520
685
  moreErrors: "…y {{count}} error(es) más",
686
+ moreErrors_one: "…y {{count}} error más",
687
+ moreErrors_many: "…y {{count}} de errores más",
688
+ moreErrors_other: "…y {{count}} errores más",
521
689
  cancel: "Cancelar",
522
690
  back: "Atrás",
523
691
  next: "Siguiente",
524
692
  close: "Cerrar",
525
693
  importNRows: "Importar {{count}} filas",
694
+ importNRows_one: "Importar {{count}} fila",
695
+ importNRows_many: "Importar {{count}} de filas",
696
+ importNRows_other: "Importar {{count}} filas",
526
697
  importingProgress: "Importando…",
527
698
  requiredMark: "*",
528
699
  required: "Obligatorio",
@@ -534,17 +705,45 @@ const es = {
534
705
  month: "Mes",
535
706
  week: "Semana",
536
707
  day: "Día",
537
- agenda: "Agenda",
538
708
  allDay: "Todo el día",
539
- noEvents: "Sin eventos",
540
709
  newEvent: "Nuevo evento",
541
710
  moreEvents: "+{{count}} más",
711
+ unscheduled: "Sin programar ({{count}})",
712
+ loading: "Cargando calendario…",
713
+ loadError: "Error: {{message}}",
714
+ 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.",
715
+ 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.",
716
+ eventDetails: "Detalles del evento",
717
+ pullToRefresh: "Desliza para actualizar",
718
+ refreshing: "Actualizando…",
719
+ onDate: "El {{date}}",
720
+ eventTitle: "Título",
721
+ eventTitlePlaceholder: "¿De qué trata este evento?",
722
+ creating: "Creando…",
723
+ titleRequired: "El título es obligatorio",
724
+ a11y: {
725
+ region: "Calendario",
726
+ grid: "Cuadrícula del calendario",
727
+ goToToday: "Ir a hoy",
728
+ previousPeriod: "Período anterior",
729
+ nextPeriod: "Período siguiente",
730
+ currentDate: "Fecha actual: {{date}}",
731
+ dayCell: "{{date}}, {{count}} eventos",
732
+ dayCell_one: "{{date}}, {{count}} evento",
733
+ dayCell_many: "{{date}}, {{count}} de eventos",
734
+ dayCell_other: "{{date}}, {{count}} eventos",
735
+ resizeEventEnd: "Cambiar el fin del evento",
736
+ resizeEventEndHint: "Arrastra para cambiar la fecha de fin",
737
+ resizeStart: "Cambiar el inicio",
738
+ resizeEnd: "Cambiar el fin",
739
+ },
542
740
  },
543
741
  list: {
544
742
  firstRunTitle: "Aquí todavía no hay nada",
545
743
  firstRunMessage: "Cree su primer registro para empezar.",
546
744
  noMatches: "No hay registros coincidentes",
547
745
  noMatchesMessage: "Ningún registro coincide con sus filtros o su búsqueda actuales. Pruebe a ajustarlos o borrarlos.",
746
+ viewFilterNoMatchesMessage: "Ningún registro coincide con el filtro de esta vista.",
548
747
  loadErrorTitle: "No se pudieron cargar los registros",
549
748
  loadErrorMessage: "Algo salió mal al cargar estos datos. Compruebe su conexión y vuelva a intentarlo.",
550
749
  loadErrorForbiddenTitle: "No tiene acceso",
@@ -581,17 +780,26 @@ const es = {
581
780
  refresh: "Actualizar",
582
781
  loading: "Cargando registros…",
583
782
  recordCount: "{{count}} registros",
584
- recordCountOne: "{{count}} registro",
783
+ recordCount_one: "{{count}} registro",
784
+ recordCount_many: "{{count}} de registros",
785
+ recordCount_other: "{{count}} registros",
585
786
  addRecord: "Agregar registro",
787
+ // objectui#12703 — the compact list's footer link to the object's list or the block's view.
788
+ viewAll: "Ver todo",
586
789
  tabs: "Pestañas",
587
790
  allRecords: "Todos los registros",
588
791
  search: "Buscar",
589
792
  filter: "Filtrar",
590
793
  filterRecords: "Filtrar registros",
794
+ filterActive: "Filtrar, {{count}} activos",
795
+ filterActive_one: "Filtrar, {{count}} activo",
796
+ filterActive_many: "Filtrar, {{count}} activos",
797
+ filterActive_other: "Filtrar, {{count}} activos",
591
798
  sort: "Ordenar",
592
799
  sortRecords: "Ordenar registros",
593
800
  sortByIdSuffix: "(por ID)",
594
801
  sortRelationalHint: "Las columnas que apuntan a otro registro no aparecen aquí: solo pueden ordenarse por el ID almacenado, no por el nombre que se muestra en la celda. Para ordenar por ese nombre, desnormalícelo en este objeto como un campo almacenado, que se escribe cuando cambia el origen, y ordene por él. No un campo de fórmula: es virtual, no se almacena ninguna columna para él y el servidor rechaza ordenar por él.",
802
+ sortRelationalPicked: "Una columna vinculada se ordena por el ID almacenado, no por el nombre mostrado.",
595
803
  resetSortToDefault: "Restablecer al valor predeterminado de la vista",
596
804
  group: "Agrupar",
597
805
  groupBy: "Agrupar por",
@@ -612,14 +820,15 @@ const es = {
612
820
  print: "Imprimir",
613
821
  hideFieldsTitle: "Ocultar campos",
614
822
  dataLimitReached: "Se muestran los primeros {{limit}} registros. Puede haber más datos disponibles.",
615
- viewSettings: "Configuración de vista",
616
- viewSettingsHint: "Agrupación, color, densidad y campos visibles.",
823
+ display: "Visualización",
824
+ layout: "Diseño",
825
+ rowNumbers: "Números de fila",
826
+ resetToViewDefault: "Restablecer los valores predeterminados de la vista",
617
827
  addGroup: "Agregar campo de grupo",
618
828
  collapsedByDefault: "Contraído por defecto",
619
829
  removeGroup: "Eliminar",
620
830
  inlineEditShort: "Edición en línea",
621
831
  inlineEditLabel: "Editar registros en línea (haga clic en una celda para editar)",
622
- recordEditingTitle: "Edición de registros",
623
832
  },
624
833
  managedByBadge: {
625
834
  systemWritable: {
@@ -650,6 +859,7 @@ const es = {
650
859
  },
651
860
  kanban: {
652
861
  uncategorized: "Sin categoría",
862
+ loadMore: "Cargar más",
653
863
  columns: "columnas",
654
864
  addCard: "Añadir tarjeta",
655
865
  addColumn: "Añadir columna",
@@ -657,13 +867,28 @@ const es = {
657
867
  deleteCard: "Eliminar tarjeta",
658
868
  deleteColumn: "Eliminar columna",
659
869
  noCards: "Sin tarjetas",
870
+ columnCards: "Tarjetas de la columna {{column}}",
871
+ laneCards: "Tarjetas de {{column}} - {{lane}}",
660
872
  cardTitlePlaceholder: "Escriba el título de la tarjeta…",
661
873
  requiredFieldsTitle: "Complete los campos obligatorios",
662
874
  requiredFieldsDescription: "Este movimiento hace que los campos siguientes sean obligatorios. Complételos para continuar.",
875
+ dnd: {
876
+ start: "Tarjeta {{card}} tomada en la columna {{column}}.",
877
+ overCard: "Tarjeta {{card}} sobre la tarjeta {{target}} en la columna {{column}}.",
878
+ overColumn: "Tarjeta {{card}} sobre la columna {{column}}.",
879
+ overNone: "La tarjeta {{card}} no está sobre ninguna columna.",
880
+ moved: "Tarjeta {{card}} movida a la columna {{column}}.",
881
+ dropped: "Tarjeta {{card}} soltada. Sigue en la columna {{column}}.",
882
+ cancelled: "Arrastre cancelado. La tarjeta {{card}} sigue en la columna {{column}}.",
883
+ untitledCard: "sin título",
884
+ unnamedColumn: "sin nombre",
885
+ instructions: "Para mover esta tarjeta a otra columna, arrástrela con el ratón o de forma táctil.",
886
+ dragging: "Arrastrando la tarjeta {{card}}",
887
+ },
663
888
  },
664
889
  timeline: {
665
890
  bucket: {
666
- overdue: "Atrasado",
891
+ earlier: "Antes",
667
892
  today: "Hoy",
668
893
  tomorrow: "Mañana",
669
894
  thisWeek: "Esta semana",
@@ -678,6 +903,17 @@ const es = {
678
903
  },
679
904
  gantt: {
680
905
  rowLabel: "Elementos",
906
+ unusableRange: {
907
+ 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.",
908
+ 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.",
909
+ 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.",
910
+ },
911
+ },
912
+ unsupported: {
913
+ 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í.",
914
+ },
915
+ unconfigured: {
916
+ 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
917
  },
682
918
  },
683
919
  gantt: {
@@ -695,6 +931,7 @@ const es = {
695
931
  },
696
932
  aria: {
697
933
  taskList: "Lista de tareas",
934
+ refreshing: "Actualizando…",
698
935
  },
699
936
  tooltip: {
700
937
  days: "d",
@@ -740,13 +977,22 @@ const es = {
740
977
  conflict: {
741
978
  title: "Conflicto de programación",
742
979
  body: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea(s) afectada(s)?",
980
+ body_one: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tarea afectada?",
981
+ body_many: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} de tareas afectadas?",
982
+ body_other: "Este movimiento entra en conflicto con las restricciones de dependencia. ¿Reprogramar automáticamente {{count}} tareas afectadas?",
743
983
  confirm: "Reprogramar automáticamente",
744
984
  cancel: "Dejarlo como está",
745
985
  },
746
986
  autoScheduleDlg: {
747
987
  title: "Programación automática",
748
988
  body: "¿Retrasar {{count}} tarea(s) para respetar los vínculos de dependencia?",
989
+ body_one: "¿Retrasar {{count}} tarea para respetar los vínculos de dependencia?",
990
+ body_many: "¿Retrasar {{count}} de tareas para respetar los vínculos de dependencia?",
991
+ body_other: "¿Retrasar {{count}} tareas para respetar los vínculos de dependencia?",
749
992
  skipped: "{{count}} tarea(s) bloqueada(s) también incumplen los vínculos y se han omitido.",
993
+ skipped_one: "{{count}} tarea bloqueada también incumple los vínculos y se ha omitido.",
994
+ skipped_many: "{{count}} de tareas bloqueadas también incumplen los vínculos y se han omitido.",
995
+ skipped_other: "{{count}} tareas bloqueadas también incumplen los vínculos y se han omitido.",
750
996
  confirm: "Aplicar",
751
997
  cancel: "Cancelar",
752
998
  none: "Todas las dependencias se cumplen: no hay nada que reprogramar.",
@@ -825,10 +1071,14 @@ const es = {
825
1071
  tabActionsFor: "Acciones de vista para {{name}}",
826
1072
  readonlyAriaLabel: "Vista de solo lectura",
827
1073
  readonlyTooltip: "Vista del sistema — definida en el código, solo lectura.",
1074
+ 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.",
1075
+ noObject: "No se ha indicado ningún objeto: define {{property}} o dataSource.object.",
828
1076
  },
829
1077
  designer: {
830
1078
  undo: "Deshacer",
831
1079
  redo: "Rehacer",
1080
+ canvasMinimap: "Minimapa del lienzo",
1081
+ versionHistory: "Historial de versiones",
832
1082
  },
833
1083
  detail: {
834
1084
  editInlineHint: "Haga doble clic para editar",
@@ -850,7 +1100,9 @@ const es = {
850
1100
  pageHeaderActions: "Acciones del encabezado de página",
851
1101
  emojiPicker: "Selector de emojis",
852
1102
  reactionCount: "{{emoji}} {{count}} reacciones",
853
- reactionCountOne: "{{emoji}} {{count}} reacción",
1103
+ reactionCount_one: "{{emoji}} {{count}} reacción",
1104
+ reactionCount_many: "{{emoji}} {{count}} de reacciones",
1105
+ reactionCount_other: "{{emoji}} {{count}} reacciones",
854
1106
  recordDetail: "Detalle del registro",
855
1107
  recordDetailWithLabel: "Detalle de {{label}}",
856
1108
  openAsFullPage: "Abrir como página completa",
@@ -877,7 +1129,6 @@ const es = {
877
1129
  viewAll: "Ver todo",
878
1130
  new: "Nuevo",
879
1131
  add: "Agregar",
880
- emptyValue: "—",
881
1132
  comments: "Comentarios",
882
1133
  searchComments: "Buscar comentarios…",
883
1134
  addCommentPlaceholder: "Añadir comentario… (Ctrl+Enter para enviar)",
@@ -888,11 +1139,22 @@ const es = {
888
1139
  unpin: "Desfijar",
889
1140
  justNow: "justo ahora",
890
1141
  minutesAgo: "hace {{count}} min",
1142
+ minutesAgo_one: "hace {{count}} min",
1143
+ minutesAgo_many: "hace {{count}} min",
1144
+ minutesAgo_other: "hace {{count}} min",
891
1145
  hoursAgo: "hace {{count}} h",
1146
+ hoursAgo_one: "hace {{count}} h",
1147
+ hoursAgo_many: "hace {{count}} h",
1148
+ hoursAgo_other: "hace {{count}} h",
892
1149
  daysAgo: "hace {{count}} d",
1150
+ daysAgo_one: "hace {{count}} d",
1151
+ daysAgo_many: "hace {{count}} d",
1152
+ daysAgo_other: "hace {{count}} d",
893
1153
  dropFilesToUpload: "Arrastra archivos aquí o haz clic para subir",
894
1154
  attachmentCount: "{{count}} archivo adjunto",
895
- attachmentCountPlural: "{{count}} archivos adjuntos",
1155
+ attachmentCount_one: "{{count}} archivo adjunto",
1156
+ attachmentCount_many: "{{count}} de archivos adjuntos",
1157
+ attachmentCount_other: "{{count}} archivos adjuntos",
896
1158
  removeAttachment: "Eliminar adjunto",
897
1159
  // Record Attachments panel (enable.files, objectstack#4358)
898
1160
  attachments: "Adjuntos",
@@ -901,6 +1163,7 @@ const es = {
901
1163
  noAttachments: "Aún no hay adjuntos. Suba un archivo para empezar.",
902
1164
  downloadAttachment: "Descargar",
903
1165
  deleteAttachment: "Eliminar adjunto",
1166
+ deleteAttachmentConfirm: "¿Está seguro de que desea eliminar el adjunto \"{{name}}\"?",
904
1167
  attachmentDeleteDenied: "Solo quien lo subió o alguien que pueda editar este registro puede eliminar este adjunto.",
905
1168
  attachmentParentAccessDenied: "No tiene acceso para adjuntar archivos a este registro.",
906
1169
  attachmentDownloadDenied: "No tiene acceso para descargar este adjunto.",
@@ -910,11 +1173,6 @@ const es = {
910
1173
  attachmentsLoadFailed: "No se pudieron cargar los adjuntos de este registro.",
911
1174
  attachmentsApiUnavailable: "La lista de adjuntos no está disponible en este objeto.",
912
1175
  retryLoadAttachments: "Reintentar",
913
- unifiedDiff: "Vista unificada",
914
- sideBySideDiff: "Vista lado a lado",
915
- noChanges: "Sin cambios",
916
- previousVersion: "Anterior",
917
- currentVersion: "Actual",
918
1176
  discussion: "Discusión",
919
1177
  showDiscussion: "Mostrar discusión ({{count}})",
920
1178
  hideDiscussion: "Ocultar discusión",
@@ -929,25 +1187,36 @@ const es = {
929
1187
  writeComment: "Escribe un comentario…",
930
1188
  subscribedTooltip: "Suscrito — clic para cancelar suscripción",
931
1189
  unsubscribedTooltip: "Suscribirse a notificaciones",
932
- firstRecord: "Primer registro (Inicio)",
933
- previousRecordKey: "Registro anterior (←)",
934
- nextRecordKey: "Siguiente registro (→)",
935
- lastRecord: "Último registro (Fin)",
936
1190
  noRecords: "Sin registros",
937
- searchWhileNavigating: "Buscar mientras navegas",
938
- searchRecords: "Buscar registros…",
939
1191
  allActivity: "Toda la actividad",
940
1192
  commentsOnly: "Solo comentarios",
941
1193
  fieldChangesFilter: "Cambios de campo",
942
1194
  tasksOnly: "Solo tareas",
943
1195
  leaveCommentPlaceholder: "Deja un comentario… (Ctrl+Enter para enviar)",
944
1196
  noActivity: "Sin actividad registrada",
1197
+ activityAccessDenied: "No tiene permiso para ver la actividad de este registro.",
1198
+ commentsAccessDenied: "No tiene permiso para ver los comentarios de este registro.",
1199
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1200
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1201
+ // sentences, which are assembled in code and so need interpolation holes.
1202
+ allFilter: 'Todo',
1203
+ createsFilter: 'Creaciones',
1204
+ deletesFilter: 'Eliminaciones',
1205
+ statusChangesFilter: 'Cambios de estado',
1206
+ activityEmptyValue: '(vacío)',
1207
+ activityFieldChanged: 'Cambió {{field}} de "{{old}}" a "{{new}}"',
1208
+ activityCreated: 'Creó este registro',
1209
+ activityDeleted: 'Eliminó este registro',
1210
+ activityStatusChanged: 'Cambió el estado a "{{value}}"',
1211
+ activityUpdated: 'Actualizó el registro',
945
1212
  loadMore: "Cargar más",
946
1213
  edited: "(editado)",
947
1214
  via: "vía {{source}}",
948
1215
  viewSource: "Ver origen",
949
1216
  replyCount: "{{count}} respuesta",
950
- replyCountPlural: "{{count}} respuestas",
1217
+ replyCount_one: "{{count}} respuesta",
1218
+ replyCount_many: "{{count}} de respuestas",
1219
+ replyCount_other: "{{count}} respuestas",
951
1220
  replyPlaceholder: "Responder…",
952
1221
  filterActivity: "Filtrar actividad",
953
1222
  openDiscussion: "Abrir panel de discusión",
@@ -959,9 +1228,12 @@ const es = {
959
1228
  lockedByApproval: "Bloqueado para aprobación",
960
1229
  lockedTooltip: "Este registro tiene una solicitud de aprobación pendiente; la edición está bloqueada",
961
1230
  writeStrippedTitle: "Guardado, pero algunos campos no se aplicaron",
1231
+ writeWarningsTitle: "Guardado, con advertencias",
962
1232
  writeStrippedReadonly: "De solo lectura, por lo que no se aplicó: {{fields}}",
963
1233
  writeStrippedByState: "No editable en el estado actual de este registro, por lo que no se aplicó: {{fields}}",
964
1234
  writeStrippedPrimaryKey: "El identificador del registro no se puede cambiar al guardar, por lo que no se aplicó: {{fields}}",
1235
+ writeStrippedComputed: "Lo calcula el servidor mediante una fórmula, por lo que el valor enviado no se aplicó: {{fields}}",
1236
+ writeStrippedStoredExpression: "Se calcula a partir del registro, por lo que se guardó el valor calculado en lugar del enviado: {{fields}}",
965
1237
  writeStrippedUnknownReason: "No aplicado por el servidor: {{fields}}",
966
1238
  approvalPendingEditable: "En aprobación · editable",
967
1239
  approvalPendingTooltip: "Este registro tiene una solicitud de aprobación pendiente; este paso todavía permite la edición",
@@ -983,6 +1255,13 @@ const es = {
983
1255
  pathStageLostUpcoming: '{{stage}}, perdida, no alcanzada',
984
1256
  pathStageWonUpcoming: '{{stage}}, etapa objetivo, no alcanzada',
985
1257
  linkCopied: "Enlace copiado al portapapeles",
1258
+ commentFailed: "Tu comentario no se ha publicado. No se ha guardado nada; inténtalo de nuevo.",
1259
+ reactionFailed: "Tu reacción no se ha guardado. Inténtalo de nuevo.",
1260
+ editComment: "Editar comentario",
1261
+ deleteComment: "Eliminar comentario",
1262
+ deleteCommentConfirm: "¿Está seguro de que desea eliminar este comentario?",
1263
+ commentEditFailed: "Tu edición no se ha guardado. El comentario conserva su texto anterior.",
1264
+ commentDeleteFailed: "El comentario no se ha eliminado. Inténtalo de nuevo.",
986
1265
  linkCopyFailed: "No se pudo copiar el enlace",
987
1266
  cancel: "Cancelar",
988
1267
  cancelEdit: "Descartar cambios",
@@ -1012,39 +1291,69 @@ const es = {
1012
1291
  sortBy: "Ordenar por",
1013
1292
  filterPlaceholder: "Filtrar…",
1014
1293
  highlightFields: "Campos clave",
1294
+ highlightsLabel: "Campos clave del registro",
1015
1295
  createdBy: "Creado por",
1016
1296
  updatedBy: "Actualizado por",
1017
1297
  created: "Creado",
1018
1298
  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`.
1299
+ // objectui#3863 — base key, answering only a call made without a count. es's
1300
+ // `many` (exact millions) has its own slot since objectui#11432; it repeats
1301
+ // `_other` here because the count governs no noun complement.
1021
1302
  showEmptyRelated: "+ {{count}} vacíos",
1022
1303
  showEmptyRelated_one: "+ {{count}} vacío",
1304
+ showEmptyRelated_many: "+ {{count}} vacíos",
1023
1305
  showEmptyRelated_other: "+ {{count}} vacíos",
1024
1306
  copyEmail: "Copiar correo",
1025
1307
  copyPhone: "Copiar teléfono",
1026
1308
  copyRecordId: "Copiar ID de registro",
1027
1309
  showEmptyFields: "Mostrar {{count}} campos vacíos",
1310
+ showEmptyFields_one: "Mostrar {{count}} campo vacío",
1311
+ showEmptyFields_many: "Mostrar {{count}} de campos vacíos",
1312
+ showEmptyFields_other: "Mostrar {{count}} campos vacíos",
1028
1313
  hideEmptyFields: "Ocultar campos vacíos",
1029
1314
  noValue: "Sin valor",
1315
+ unresolvedReference: "Referencia sin resolver: {{value}} no se resolvió como un usuario",
1316
+ unresolvedLookupReference: "Referencia sin resolver: {{value}} no se resolvió como un registro en esta pantalla",
1317
+ repeaterItemCount: "{{count}} elementos",
1318
+ repeaterItemCount_one: "{{count}} elemento",
1319
+ repeaterItemCount_many: "{{count}} de elementos",
1320
+ repeaterItemCount_other: "{{count}} elementos",
1321
+ fileCount: "{{count}} archivos",
1322
+ fileCount_one: "{{count}} archivo",
1323
+ fileCount_many: "{{count}} de archivos",
1324
+ fileCount_other: "{{count}} archivos",
1030
1325
  },
1031
1326
  chart: {
1032
- noData: "No hay datos de gráfico disponibles",
1033
1327
  loading: "Cargando gráfico…",
1328
+ refreshing: "Actualizando…",
1034
1329
  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.",
1330
+ scatterOneMeasure: "Un gráfico de dispersión traza una sola medida. Conserve una sola serie:",
1331
+ unconfigured: {
1332
+ noCategoryAxis: "Se requiere el eje de categorías del gráfico — un gráfico vinculado a un objeto no lo inventa. Declare uno de:",
1333
+ },
1042
1334
  },
1043
1335
  dashboard: {
1044
- noRows: "Sin filas",
1336
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1337
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1338
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1339
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1340
+ // read them. The copy here has to read as a state rather than a failure,
1341
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1342
+ // punctuation so the call site concatenates no separator (see
1343
+ // `WidgetEmptyState`).
1344
+ empty: {
1345
+ title: "Aún no hay datos",
1346
+ message: "Este widget se cargó correctamente, pero la consulta todavía no ha devuelto ningún registro.",
1347
+ sourceLabel: "Origen de datos:",
1348
+ },
1045
1349
  loading: "Cargando…",
1350
+ refreshing: "Actualizando…",
1351
+ refreshAll: "Actualizar todo",
1352
+ refreshDashboard: "Actualizar panel de control",
1046
1353
  pickMeasures: "Elija medidas (valores) para este widget de dataset.",
1047
1354
  datasetUnsupported: "Esta fuente de datos no admite consultas de dataset.",
1355
+ widgetForbiddenTitle: "Sin acceso",
1356
+ widgetForbiddenMessage: "No tienes permiso para ver los datos de este widget.",
1048
1357
  details: "Detalles",
1049
1358
  exportCsv: "Exportar CSV",
1050
1359
  openInList: "Abrir en la lista",
@@ -1072,12 +1381,10 @@ const es = {
1072
1381
  },
1073
1382
  },
1074
1383
  addWidget: "Añadir widget",
1075
- removeWidget: "Eliminar widget",
1076
1384
  editLayout: "Editar diseño",
1077
1385
  saveLayout: "Guardar diseño",
1078
1386
  resetLayout: "Restablecer diseño",
1079
1387
  total: "Total",
1080
- noDataAvailable: "Sin datos disponibles",
1081
1388
  noDataSourceFor: "Sin fuente de datos para",
1082
1389
  config: {
1083
1390
  breadcrumb: {
@@ -1199,10 +1506,6 @@ const es = {
1199
1506
  appDescription: "Descripción",
1200
1507
  appIcon: "Icono",
1201
1508
  template: "Plantilla",
1202
- layout: "Diseño",
1203
- layoutSidebar: "Barra lateral",
1204
- layoutHeader: "Encabezado",
1205
- layoutEmpty: "Vacío",
1206
1509
  selectObjects: "Seleccionar objetos",
1207
1510
  searchObjects: "Buscar objetos…",
1208
1511
  selectAll: "Seleccionar todo",
@@ -1211,7 +1514,6 @@ const es = {
1211
1514
  addGroup: "Agregar grupo",
1212
1515
  addUrl: "Agregar URL",
1213
1516
  addSeparator: "Agregar separador",
1214
- noNavItems: "Aún no hay elementos de navegación.",
1215
1517
  logoUrl: "URL del logo",
1216
1518
  primaryColor: "Color primario",
1217
1519
  faviconUrl: "URL del favicon",
@@ -1238,13 +1540,12 @@ const es = {
1238
1540
  appearance: "Apariencia",
1239
1541
  rowHeight: "Altura de fila",
1240
1542
  livePreview: "Vista previa en vivo",
1241
- stepBasicDesc: "Nombre, título y diseño",
1543
+ stepBasicDesc: "Nombre, título e icono",
1242
1544
  stepObjectsDesc: "Seleccionar objetos de negocio",
1243
1545
  stepNavigationDesc: "Construir árbol de navegación",
1244
1546
  stepBrandingDesc: "Logo, colores y favicon",
1245
1547
  noObjectsFound: "No se encontraron objetos.",
1246
1548
  noNavItemsHint: "Aún no hay elementos de navegación. Seleccione objetos en el paso anterior o agregue elementos manualmente.",
1247
- separator: "Separador",
1248
1549
  separatorLabel: "— Separador —",
1249
1550
  newGroup: "Nuevo grupo",
1250
1551
  newLink: "Nuevo enlace",
@@ -1278,6 +1579,7 @@ const es = {
1278
1579
  navTypeSeparator: "Separador",
1279
1580
  navTypeAction: "Acción",
1280
1581
  navTypeComponent: "Componente",
1582
+ navTypeDoc: "Documento",
1281
1583
  navEditIcon: "Editar icono",
1282
1584
  navToggleVisible: "Alternar visibilidad",
1283
1585
  navHidden: "Oculto",
@@ -1355,11 +1657,8 @@ const es = {
1355
1657
  defaultValue: "Valor predeterminado",
1356
1658
  placeholder: "Marcador de posición",
1357
1659
  referenceTo: "Referencia a",
1358
- formula: "Fórmula",
1359
1660
  options: "Opciones",
1360
1661
  addOption: "Agregar opción",
1361
- validationRules: "Reglas de validación",
1362
- addRule: "Agregar regla",
1363
1662
  systemBadge: "Sistema",
1364
1663
  ungrouped: "General",
1365
1664
  deleteConfirmTitle: "¿Eliminar campo?",
@@ -1378,16 +1677,33 @@ const es = {
1378
1677
  },
1379
1678
  },
1380
1679
  console: {
1680
+ studio: {
1681
+ title: "Studio",
1682
+ accessRequired: "Necesita acceso a Studio para abrir Studio.",
1683
+ },
1381
1684
  saveAdvisoryTitle: "Guardado: la comprobación de creación generó {{count}} recomendación(es)",
1685
+ saveAdvisoryTitle_one: "Guardado: la comprobación de creación generó {{count}} recomendación",
1686
+ saveAdvisoryTitle_many: "Guardado: la comprobación de creación generó {{count}} de recomendaciones",
1687
+ saveAdvisoryTitle_other: "Guardado: la comprobación de creación generó {{count}} recomendaciones",
1688
+ publishAdvisoryTitle: "Publicado: la comprobación de creación generó {{count}} recomendación(es)",
1689
+ publishAdvisoryTitle_one: "Publicado: la comprobación de creación generó {{count}} recomendación",
1690
+ publishAdvisoryTitle_many: "Publicado: la comprobación de creación generó {{count}} de recomendaciones",
1691
+ publishAdvisoryTitle_other: "Publicado: la comprobación de creación generó {{count}} recomendaciones",
1692
+ importMappingsUnavailable: "No se pudieron cargar las asignaciones de importación guardadas de {{object}}",
1693
+ 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.",
1694
+ 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.",
1695
+ savedViewsUnavailable: "No se pudieron cargar las vistas guardadas de {{object}}",
1696
+ 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.",
1697
+ 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
1698
  settingsHub: {
1383
1699
  title: "Configuración",
1384
- subtitle: "Configure su espacio de trabajo, las integraciones y los indicadores de funciones.",
1700
+ subtitle: "Configure su sistema, las integraciones y los indicadores de funciones.",
1385
1701
  loadError: "No se pudo cargar la configuración",
1386
1702
  empty: "No hay configuraciones registradas. Los plugins pueden registrar manifiestos de configuración mediante el SettingsService.",
1387
1703
  settingsCount: "{{n}} configuraciones",
1388
1704
  beta: "Beta",
1389
1705
  categories: {
1390
- Workspace: "Espacio de trabajo",
1706
+ Workspace: "General",
1391
1707
  Communication: "Comunicación",
1392
1708
  Security: "Seguridad",
1393
1709
  Infrastructure: "Infraestructura",
@@ -1432,13 +1748,20 @@ const es = {
1432
1748
  },
1433
1749
  usage: {
1434
1750
  title: "Uso de IA",
1435
- meterBuild: "Crear",
1436
- meterAsk: "Preguntar",
1751
+ poolUsed: "{{percent}} usado",
1437
1752
  statusOk: "Queda bastante",
1438
1753
  statusLow: "Se está agotando",
1439
1754
  statusFull: "Límite alcanzado",
1440
1755
  resetsDaily: "Se restablece esta noche",
1441
1756
  resetsMonthly: "Se restablece en el próximo ciclo",
1757
+ resetsWeeklyDays: "Se restablece en {{count}} días",
1758
+ resetsWeeklyDays_one: "Se restablece en {{count}} día",
1759
+ resetsWeeklyDays_many: "Se restablece en {{count}} de días",
1760
+ resetsWeeklyDays_other: "Se restablece en {{count}} días",
1761
+ resetsWeeklyHours: "Se restablece en {{count}} horas",
1762
+ resetsWeeklyHours_one: "Se restablece en {{count}} hora",
1763
+ resetsWeeklyHours_many: "Se restablece en {{count}} de horas",
1764
+ resetsWeeklyHours_other: "Se restablece en {{count}} horas",
1442
1765
  ctaUpgrade: "Mejore el plan para continuar",
1443
1766
  ctaTopUp: "Añada créditos para continuar",
1444
1767
  ariaLabel: "Uso de IA: {{status}}",
@@ -1451,6 +1774,31 @@ const es = {
1451
1774
  share: "Compartir",
1452
1775
  shareTitle: "Compartir esta conversación",
1453
1776
  shareDisabledTitle: "Empiece a chatear para habilitar el uso compartido",
1777
+ buildDoctor: "Diagnóstico de compilación",
1778
+ buildDoctorTitle: "Diagnóstico de compilación — ¿qué se aplicó realmente?",
1779
+ buildDoctorDisabledTitle: "Envíe primero un mensaje",
1780
+ buildDoctorDrawer: {
1781
+ description: 'Lo que el agente afirmó frente a lo que está realmente activo. Diagnóstico de solo lectura.',
1782
+ reconciling: 'Conciliando…',
1783
+ notAvailable: 'No disponible — no se encontró la conversación o no tiene autorización.',
1784
+ untitled: '(sin título)',
1785
+ summary: '{{turns}} turno(s) · {{messages}} msj · {{tokens}} tok · {{seconds}} s LLM',
1786
+ allLive: 'Los {{count}} cambio(s) intentado(s) están activos — no se perdió nada.',
1787
+ discrepancies: '{{count}} discrepancia(s) — lo que dijo el chat no coincide con lo que está activo.',
1788
+ orphanedTitle: 'Propuesto pero nunca aplicado',
1789
+ orphanedHint: 'Una tarjeta de confirmación que el agente propuso pero que ningún turno posterior aplicó — el cambio se perdió sin aviso.',
1790
+ missingTitle: 'Afirmado pero ausente',
1791
+ missingHint: 'Un resultado de herramienta indicó que se aplicó, pero el artefacto no está activo en sys_metadata.',
1792
+ toolErrorsTitle: 'Errores de herramientas',
1793
+ toolErrorsHint: 'Llamadas a herramientas que devolvieron un error durante la compilación.',
1794
+ verifyTitle: 'Comprobación de compilación (verify_build)',
1795
+ yourApp: 'Su aplicación:',
1796
+ noIssues: '0 problemas',
1797
+ issueCount: '{{count}} problema(s)',
1798
+ platformNoise: '{{count}} hallazgo(s) sys_* de la plataforma oculto(s)',
1799
+ pendingActions: 'Acciones pendientes',
1800
+ timeline: 'Cronología ({{count}})',
1801
+ },
1454
1802
  newChat: "Nuevo",
1455
1803
  searchChats: "Buscar chats…",
1456
1804
  noChatsYet: "Todavía no hay chats",
@@ -1473,6 +1821,8 @@ const es = {
1473
1821
  liveCanvasUnlisted: "Aplicación en vivo — {{app}} (no listada hasta su publicación)",
1474
1822
  loadingAgents: "Cargando agentes…",
1475
1823
  askAnything: "Pregunte lo que quiera…",
1824
+ askOrChangeApp: "Pregunte por sus datos o pídame que cambie esta app…",
1825
+ describeAppToBuild: "Describa la app que quiere crear o lo que hay que cambiar…",
1476
1826
  emptyTitle: "Iniciar una conversación",
1477
1827
  emptyDescription: "Pregunte lo que quiera — el asistente tiene acceso al contexto de su aplicación actual.",
1478
1828
  switchAssistant: "Cambiar de asistente",
@@ -1480,7 +1830,7 @@ const es = {
1480
1830
  empty: {
1481
1831
  build: {
1482
1832
  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.",
1833
+ 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
1834
  },
1485
1835
  ask: {
1486
1836
  title: "Pregunte a sus datos",
@@ -1489,17 +1839,22 @@ const es = {
1489
1839
  editApp: {
1490
1840
  title: "Editando «{{app}}»",
1491
1841
  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.",
1842
+ 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
1843
  },
1494
1844
  },
1495
1845
  clearConversation: "Borrar",
1496
1846
  sendHint: "para enviar",
1847
+ newlineHint: "para una nueva línea",
1497
1848
  agentActivity: "Actividad del agente",
1498
1849
  toolCompleted: "Completado",
1499
1850
  toolRunning: "En ejecución",
1500
1851
  toolAwaitingApproval: "Esperando aprobación",
1501
1852
  toolFailed: "Error",
1502
1853
  toolDetailsHidden: "Las entradas de las herramientas y los resultados sin procesar están ocultos en esta vista.",
1854
+ toolDenyReason: "Rechazado por el operador desde el chat",
1855
+ builderHandoffTitle: "Crear en el constructor",
1856
+ builderHandoffOpen: "Abrir en el constructor →",
1857
+ builderHandoffSuperseded: "Hay una solicitud más reciente",
1503
1858
  copy: "Copiar",
1504
1859
  copied: "Copiado",
1505
1860
  regenerate: "Regenerar",
@@ -1514,7 +1869,7 @@ const es = {
1514
1869
  publishOk: "Publicado — los objetos ya están activos.",
1515
1870
  seedWarn: "Publicado, pero no se pudieron cargar algunos datos de ejemplo.",
1516
1871
  openBuiltApp: "Abrir la aplicación",
1517
- designBuiltApp: "Diseñar en Studio",
1872
+ viewBuiltAppInStudio: "Ver en Studio",
1518
1873
  previewDraft: "Vista previa",
1519
1874
  previewApp: "Vista previa de la aplicación",
1520
1875
  resizeSplit: "Redimensionar el chat y la vista previa",
@@ -1542,23 +1897,41 @@ const es = {
1542
1897
  recentRecords: "Enumera los 5 registros creados más recientemente.",
1543
1898
  recordCounts: "Cuenta los registros de cada objeto.",
1544
1899
  },
1900
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1901
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1902
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1903
+ // wording that promises autonomous behaviour (alert / remind / notify /
1904
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1905
+ // the model silently degrades such a request into a board or a filtered
1906
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1907
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1545
1908
  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.",
1909
+ buildCrm: "Crea un CRM de ventas — clientes, contactos y oportunidades con un campo de etapa, y un panel que sume el importe por etapa.",
1910
+ buildApp: "Crea un seguimiento de proyectos — proyectos, tareas con responsables y fechas de vencimiento, un tablero por estado y un calendario de vencimientos.",
1911
+ buildFlow: "Diseña una mesa de ayuda — tickets con campos de prioridad y estado, un tablero por estado y vínculos con los clientes.",
1912
+ 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.",
1913
+ buildRecruiting: "Crea un seguimiento de candidaturas — candidatos, vacantes, un campo de etapa de entrevista y un tablero por etapa.",
1551
1914
  },
1552
1915
  generic: {
1553
1916
  help: "¿En qué puedes ayudarme?",
1554
1917
  availableObjects: "Enumera los objetos de datos disponibles.",
1555
1918
  recentActivity: "Resume mi actividad reciente.",
1556
1919
  },
1920
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1921
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1922
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1923
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1924
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1925
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1926
+ // no data is what an existing app most often lacks. REVERT: when
1927
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1928
+ // comes back as `addAutomation`; the retired string is pinned for every
1929
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1557
1930
  editApp: {
1558
1931
  addField: "Añade un campo a uno de los objetos.",
1559
1932
  addObject: "Añade un objeto nuevo y relaciónalo con uno existente.",
1560
1933
  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.",
1934
+ addSampleData: "Rellena los objetos existentes con registros de ejemplo realistas para poder mostrar la aplicación.",
1562
1935
  },
1563
1936
  },
1564
1937
  changesTitle: "Confirmar cambios",
@@ -1623,6 +1996,7 @@ const es = {
1623
1996
  collapse: "Contraer el chat",
1624
1997
  maximize: "Abrir como página completa",
1625
1998
  open: "Abrir el asistente",
1999
+ planAwaitingApproval: "Un plan propuesto espera su aprobación",
1626
2000
  },
1627
2001
  group: {
1628
2002
  today: "Hoy",
@@ -1633,13 +2007,17 @@ const es = {
1633
2007
  },
1634
2008
  },
1635
2009
  title: "Consola ObjectStack",
1636
- initializing: "Inicializando aplicación…",
1637
- loadingHint: "Configurar un entorno nuevo puede tardar unos momentos.",
2010
+ initializing: "Abriendo su consola…",
2011
+ skipToContent: "Saltar al contenido",
1638
2012
  breadcrumb: {
1639
- dashboards: "Paneles",
1640
- pages: "Páginas",
1641
- reports: "Informes",
1642
2013
  system: "Sistema",
2014
+ marketplace: "Marketplace",
2015
+ settings: 'Configuración',
2016
+ apps: 'Aplicaciones',
2017
+ profile: 'Perfil',
2018
+ approvals: 'Aprobaciones',
2019
+ aiApprovals: 'Aprobaciones de IA',
2020
+ auditLog: 'Registro de auditoría',
1643
2021
  },
1644
2022
  // objectui#4024 — the single-namespace settings screen. Its sibling
1645
2023
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1659,17 +2037,33 @@ const es = {
1659
2037
  saveChanges: "Guardar cambios",
1660
2038
  unsavedCount: "{{count}} cambios sin guardar",
1661
2039
  unsavedCount_one: "{{count}} cambio sin guardar",
2040
+ unsavedCount_many: "{{count}} de cambios sin guardar",
1662
2041
  unsavedCount_other: "{{count}} cambios sin guardar",
2042
+ fieldErrorsToast: "{{count}} ajustes requieren atención: {{settings}}",
2043
+ fieldErrorsToast_one: "{{count}} ajuste requiere atención: {{settings}}",
2044
+ fieldErrorsToast_many: "{{count}} de ajustes requieren atención: {{settings}}",
2045
+ fieldErrorsToast_other: "{{count}} ajustes requieren atención: {{settings}}",
1663
2046
  cryptoRefusalTitle: "Esta instalación no puede cifrar secretos",
1664
2047
  cryptoRefusalSubjectSuffix: "está declarado como cifrado, por lo que no se escribió nada.",
1665
2048
  cryptoRefusalNoSubject: "El valor declarado como cifrado fue rechazado, por lo que no se escribió nada.",
1666
2049
  cryptoRefusalToast: "No se pueden cifrar los secretos: {{subject}}",
1667
2050
  cryptoRefusalToastNoSubject: "No se pueden cifrar los secretos",
1668
- },
1669
- loadingSteps: {
1670
- connecting: "Conectando a la fuente de datos",
1671
- loadingConfig: "Cargando configuración",
1672
- preparingWorkspace: "Preparando espacio de trabajo",
2051
+ sourceBadgeInherited: "Heredado de {{source}}",
2052
+ sourceBadgeOverrides: "Sobrescribe {{source}}",
2053
+ resetToDefault: "Restablecer valor predeterminado",
2054
+ envLockBadge: "Bloqueado por el entorno",
2055
+ envLockBadgeTitle: "Fijado por una variable de entorno: no se puede editar desde la interfaz.",
2056
+ deprecatedBadge: "Obsoleto",
2057
+ deprecatedBadgeReplacedBy: "Obsoleto → {{replacedBy}}",
2058
+ unsupportedSpecifierType: "Tipo de ajuste no admitido: {{type}}",
2059
+ },
2060
+ workspaceTimezonePrompt: {
2061
+ title: "Configure la zona horaria del sistema",
2062
+ description: "Este sistema aún usa la zona horaria predeterminada de la plataforma, {{current}}. La zona horaria del sistema determina qué significa «hoy» en las fórmulas, cómo agrupan los informes por fecha y cómo se muestran las fechas y horas, para todos en el sistema. Abajo se indica la zona horaria de su navegador.",
2063
+ laterHint: "Puede cambiarla en cualquier momento en la página de Configuración.",
2064
+ decline: "Mantener la predeterminada",
2065
+ confirm: "Configurar zona horaria",
2066
+ saved: "Zona horaria del sistema configurada en {{zone}}",
1673
2067
  },
1674
2068
  error: {
1675
2069
  connectionFailed: "No se puede conectar al servidor",
@@ -1694,27 +2088,28 @@ const es = {
1694
2088
  groups: {
1695
2089
  general: "General",
1696
2090
  navigation: "Navegación",
1697
- dataViews: "Vistas de datos",
1698
2091
  aiChat: "Asistente de IA",
1699
- preferences: "Preferencias",
1700
2092
  },
1701
2093
  openCommandPalette: "Abrir paleta de comandos",
1702
2094
  showShortcuts: "Mostrar atajos de teclado",
1703
2095
  closeDialog: "Cerrar diálogo / panel",
1704
2096
  toggleSidebar: "Alternar barra lateral",
1705
- focusSearch: "Enfocar búsqueda",
1706
- createRecord: "Crear nuevo registro",
1707
- refreshData: "Actualizar datos",
1708
- editRecord: "Editar registro seleccionado",
1709
2097
  newChat: "Nuevo chat",
1710
2098
  toggleChatsList: "Alternar lista de chats",
1711
- toggleDarkMode: "Alternar modo oscuro",
2099
+ goHome: "Volver al inicio",
2100
+ },
2101
+ reportIndex: {
2102
+ title: "Informes",
2103
+ emptyTitle: "No hay informes",
2104
+ emptyDescription: "Esta aplicación no tiene informes que puedas abrir.",
1712
2105
  },
1713
2106
  commandPalette: {
1714
2107
  title: "Paleta de comandos",
1715
2108
  placeholder: "Escriba un comando o busque…",
1716
2109
  noResults: "No se encontraron resultados.",
1717
2110
  objects: "Objetos",
2111
+ packages: "Paquetes",
2112
+ flows: "Flujos",
1718
2113
  dashboards: "Paneles",
1719
2114
  pages: "Páginas",
1720
2115
  reports: "Informes",
@@ -1731,6 +2126,21 @@ const es = {
1731
2126
  records: "Registros",
1732
2127
  recentRecords: "Visto recientemente",
1733
2128
  },
2129
+ // objectui#9954 — see the `en` pack for what raises each case.
2130
+ readRate: {
2131
+ ratioTitle: 'Volumen de lectura inusual en este sistema',
2132
+ 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.',
2133
+ noWritesTitle: 'Lecturas sin ninguna escritura en este sistema',
2134
+ 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.',
2135
+ },
2136
+ // objectui#10439 — see the `en` pack for what raises each case.
2137
+ storageUsage: {
2138
+ warningTitle: 'El almacenamiento se está llenando',
2139
+ warning: '{{used}} MB de {{limit}} MB usados. Las cargas y las importaciones se pausan cuando el almacenamiento está lleno.',
2140
+ blockedTitle: 'Almacenamiento lleno: las cargas y las importaciones están en pausa',
2141
+ 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.',
2142
+ upgrade: 'Mejore el plan para continuar',
2143
+ },
1734
2144
  errors: {
1735
2145
  somethingWentWrong: "Algo salió mal",
1736
2146
  unexpectedError: "Ocurrió un error inesperado al renderizar esta vista.",
@@ -1761,22 +2171,27 @@ const es = {
1761
2171
  viewNameInvalid: "Use minúsculas, números y guiones bajos; empiece por una letra o un guion bajo.",
1762
2172
  systemViewReadonly: "Vista del sistema definida en el código: solo lectura.",
1763
2173
  cannotEditMetaView: "Esta vista está integrada y definida en el código: no se puede modificar.",
2174
+ resetView: "Restablecer vista",
2175
+ resetViewTitle: "Devolver esta vista a su propia ordenación, filtros y anchos de columna. Solo cambia su configuración.",
1764
2176
  cannotDeleteMetaView: "Esta vista está integrada y definida en el código: no se puede eliminar.",
1765
2177
  expandToPage: "Abrir como página completa",
1766
2178
  objectNotFound: "Objeto no encontrado",
1767
2179
  objectNotFoundDescription: "El objeto \"{{objectName}}\" no existe en la configuración actual.",
1768
2180
  objectNotFoundHint: "Verifique la configuración de navegación de su aplicación o seleccione un objeto diferente en la barra lateral.",
2181
+ objectPackageDisabled: "El objeto \"{{objectName}}\" pertenece a un paquete deshabilitado, por lo que no se está sirviendo.",
1769
2182
  filterOrNotSavable: "Este filtro une las condiciones con O, algo que una vista guardada aún no puede almacenar. Se sigue aplicando a esta lista: quite la agrupación O para guardarlo en la vista.",
1770
2183
  filterNestedNotSavable: "Este filtro usa grupos de condiciones anidados, que una vista guardada no puede almacenar. Conviértalo en una única lista de condiciones para guardarlo en la vista.",
1771
2184
  allRecords: "Todos los registros",
1772
2185
  new: "Nuevo",
1773
2186
  configureView: "Configurar vista",
1774
- toolbar: "Barra de herramientas",
1775
2187
  toolbarEnabledCount: "{{count}} de {{total}} habilitados",
1776
2188
  searchFields: "Buscar campos…",
1777
2189
  title: "Título",
1778
2190
  viewType: "Tipo de vista",
1779
2191
  recordCount: "{{count}} registros",
2192
+ recordCount_one: "{{count}} registro",
2193
+ recordCount_many: "{{count}} de registros",
2194
+ recordCount_other: "{{count}} registros",
1780
2195
  save: "Guardar",
1781
2196
  discard: "Descartar",
1782
2197
  createView: "Crear vista",
@@ -1788,11 +2203,13 @@ const es = {
1788
2203
  longitudeField: "Campo de longitud",
1789
2204
  imageField: "Campo de imagen",
1790
2205
  selectField: "Seleccionar campo…",
1791
- groupBy: "Agrupar por",
1792
2206
  endDateField: "Campo de fecha de fin",
1793
2207
  import: "Importar",
1794
2208
  importTitle: "Importar desde CSV",
1795
2209
  importedToast: "{{count}} fila(s) importada(s).",
2210
+ importedToast_one: "{{count}} fila importada.",
2211
+ importedToast_many: "{{count}} de filas importadas.",
2212
+ importedToast_other: "{{count}} filas importadas.",
1796
2213
  importedWithSkipped: "{{ok}} fila(s) importada(s); {{skipped}} omitida(s).",
1797
2214
  createViewDesc: "Elija un tipo de vista y asígnele un nombre. Todas las configuraciones se pueden cambiar después.",
1798
2215
  cancel: "Cancelar",
@@ -1801,6 +2218,9 @@ const es = {
1801
2218
  deleteViewTitle: "Eliminar vista",
1802
2219
  deleteViewConfirm: "¿Eliminar la vista \"{{name}}\"? Esto no se puede deshacer.",
1803
2220
  bulkDeleteConfirm: "¿Eliminar {{count}} registros seleccionados? Esto no se puede deshacer.",
2221
+ bulkDeleteConfirm_one: "¿Eliminar {{count}} registro seleccionado? Esto no se puede deshacer.",
2222
+ bulkDeleteConfirm_many: "¿Eliminar {{count}} de registros seleccionados? Esto no se puede deshacer.",
2223
+ bulkDeleteConfirm_other: "¿Eliminar {{count}} registros seleccionados? Esto no se puede deshacer.",
1804
2224
  duplicateViewName: "Ya existe una vista con ese nombre.",
1805
2225
  viewTypeGrid: "Cuadrícula",
1806
2226
  viewTypeGridDesc: "Tabla tipo hoja de cálculo de registros.",
@@ -1837,14 +2257,22 @@ const es = {
1837
2257
  chartTypePie: "Gráfico circular",
1838
2258
  chartTypeArea: "Gráfico de área",
1839
2259
  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.",
2260
+ dataset: "Conjunto de datos",
2261
+ datasetHelp: "El gráfico lee sus valores de este conjunto de datos del objeto.",
2262
+ chartMeasure: "Medida",
2263
+ chartMeasureHelp: "La medida del conjunto de datos representada en el eje de valores.",
2264
+ chartDimension: "Dimensión",
2265
+ chartDimensionHelp: "La dimensión del conjunto de datos por la que se agrupan los valores (opcional).",
2266
+ viewTypeUnavailableDataset: "Este objeto no expone ningún conjunto de datos para graficar.",
2267
+ noDatasetMeasure: "Este conjunto de datos no declara ninguna medida para graficar.",
1844
2268
  ufTabs: "Pestañas",
1845
2269
  ufAddField: "+ Agregar campo de filtro…",
1846
2270
  ufShowAllRecords: "Mostrar pestaña \"Todos los registros\"",
1847
2271
  },
2272
+ runtimeDraft: {
2273
+ publishFailed: "Error al publicar",
2274
+ discardFailed: "Error al descartar el borrador",
2275
+ },
1848
2276
  localeSwitcher: {
1849
2277
  label: "Idioma",
1850
2278
  },
@@ -1852,14 +2280,22 @@ const es = {
1852
2280
  nav: {
1853
2281
  pinItem: "Fijar {{name}}",
1854
2282
  unpinItem: "Desfijar {{name}}",
1855
- dragToReorder: "Arrastrar para reordenar",
1856
2283
  favorites: "Favoritos",
2284
+ launcherLabel: "Lanzador de aplicaciones",
2285
+ menuLabel: "Navegación de la aplicación",
2286
+ menuEmpty: "Esta aplicación no tiene entradas de navegación que puedas abrir.",
2287
+ itemMenu: "Más acciones para {{name}}",
2288
+ openInNewTab: "Abrir en nueva pestaña",
2289
+ copyLink: "Copiar enlace",
2290
+ linkCopied: "Enlace copiado al portapapeles",
2291
+ linkCopyFailed: "No se pudo copiar el enlace",
2292
+ design: "Diseñar",
1857
2293
  },
1858
2294
  },
1859
2295
  auth: {
1860
2296
  setPassword: {
1861
2297
  title: "Establecer una contraseña de recuperación",
1862
- description: "Ha iniciado sesión mediante inicio de sesión único. Establezca una contraseña local para poder seguir accediendo directamente a este entorno si el SSO deja de estar disponible.",
2298
+ description: "Ha iniciado sesión mediante inicio de sesión único. Establezca una contraseña local para poder seguir accediendo directamente si el SSO deja de estar disponible.",
1863
2299
  email: "Correo electrónico",
1864
2300
  newPassword: "Nueva contraseña",
1865
2301
  confirmPassword: "Confirmar la contraseña",
@@ -1875,9 +2311,8 @@ const es = {
1875
2311
  signingIn: "Iniciando sesión…",
1876
2312
  ssoHandoff: "Continuar a {{target}}",
1877
2313
  devAdminHint: {
1878
- title: "Instancia de desarrollo",
1879
- body: "Inicie sesión con el administrador de desarrollo predefinido:",
1880
- dismiss: "Descartar",
2314
+ title: "Instancia de desarrollo local",
2315
+ signIn: "Iniciar sesión como administrador de desarrollo",
1881
2316
  },
1882
2317
  title: "Inicia sesión en tu cuenta",
1883
2318
  description: "Ingresa tu correo electrónico y contraseña para continuar",
@@ -1907,6 +2342,22 @@ const es = {
1907
2342
  resendOtpCountdownText: "Reenviar en {seconds} s",
1908
2343
  usePhoneOtpText: "Iniciar sesión con código de verificación",
1909
2344
  usePasswordSignInText: "Iniciar sesión con contraseña en su lugar",
2345
+ socialButton: "Continuar con {provider}",
2346
+ orText: "o continúe con correo electrónico",
2347
+ ssoButton: "Iniciar sesión con SSO",
2348
+ ssoOnlyDescription: "Accede con el inicio de sesión único de tu organización",
2349
+ usePasswordText: "Usar una contraseña en su lugar",
2350
+ backToSsoText: "Volver al inicio de sesión único",
2351
+ // objectui#12600 — the console login card's own header, the password
2352
+ // field's reveal toggle, and the footer's legal links.
2353
+ welcomeTitle: "Bienvenido de nuevo",
2354
+ welcomeDescription: "Inicia sesión para continuar con tu trabajo",
2355
+ showPasswordText: "Mostrar contraseña",
2356
+ hidePasswordText: "Ocultar contraseña",
2357
+ footer: {
2358
+ privacy: "Privacidad",
2359
+ terms: "Términos",
2360
+ },
1910
2361
  },
1911
2362
  register: {
1912
2363
  title: "Crear una cuenta",
@@ -1925,8 +2376,12 @@ const es = {
1925
2376
  submittingButton: "Creando cuenta…",
1926
2377
  hasAccountText: "¿Ya tienes una cuenta?",
1927
2378
  signInText: "Iniciar sesión",
2379
+ socialButton: "Registrarse con {provider}",
2380
+ orText: "o continúe con correo electrónico",
1928
2381
  errors: {
1929
2382
  userExists: "Ya existe una cuenta con ese correo. Intente iniciar sesión.",
2383
+ selfRegistrationClosed: "El registro por cuenta propia no está abierto en este sistema. Solicite una invitación a un administrador.",
2384
+ 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
2385
  },
1931
2386
  verifyInbox: {
1932
2387
  title: "Revise su bandeja de entrada",
@@ -2002,7 +2457,7 @@ const es = {
2002
2457
  checkSpam: "¿No recibió el correo? Revise su carpeta de spam o contacte soporte.",
2003
2458
  or: "O",
2004
2459
  // objectui#3546 slice three.
2005
- resendUnavailable: "Puede que el envío de correos no esté configurado en este entorno. Contacte soporte si el problema persiste.",
2460
+ resendUnavailable: "Puede que el envío de correos no esté configurado en este sistema. Contacte soporte si el problema persiste.",
2006
2461
  },
2007
2462
  setup: {
2008
2463
  welcomeTitle: "Bienvenido a ObjectStack",
@@ -2046,7 +2501,7 @@ const es = {
2046
2501
  disabledDescription: "Esta implementación no tiene habilitada la autorización de dispositivos, por lo que este dispositivo no puede aprobarse aquí.",
2047
2502
  },
2048
2503
  shell: {
2049
- tenantHostHint: "Está iniciando sesión en este espacio de trabajo",
2504
+ tenantHostHint: "Está iniciando sesión en este sistema",
2050
2505
  },
2051
2506
  layout: {
2052
2507
  headline: "Cree aplicaciones empresariales potentes, más rápido.",
@@ -2056,6 +2511,7 @@ const es = {
2056
2511
  signOut: "Cerrar sesión en su lugar",
2057
2512
  password: {
2058
2513
  title: "Su contraseña ha caducado",
2514
+ resetTitle: "Debe cambiar su contraseña",
2059
2515
  fallbackMessage: "Establezca una nueva contraseña para continuar.",
2060
2516
  current: "Contraseña actual",
2061
2517
  next: "Nueva contraseña",
@@ -2081,6 +2537,11 @@ const es = {
2081
2537
  verifying: "Verificando…",
2082
2538
  invalidCode: "Código no válido. Inténtelo de nuevo.",
2083
2539
  },
2540
+ impersonation: {
2541
+ passwordTitle: "{{user}} debe cambiar su contraseña",
2542
+ mfaTitle: "{{user}} debe configurar la autenticación en dos pasos",
2543
+ body: "Está suplantando a {{user}} y solo esa persona puede hacerlo por sí misma. Deje de suplantar para volver a su propia cuenta.",
2544
+ },
2084
2545
  },
2085
2546
  },
2086
2547
  // objectui#3546 slice three — the /oauth/consent screen.
@@ -2089,12 +2550,17 @@ const es = {
2089
2550
  title: "{{appName}} quiere acceder a su cuenta",
2090
2551
  request: "{{appName}} solicita permiso{{suffix}}.",
2091
2552
  unknownApp: "una aplicación",
2553
+ unidentified: "No se pudo identificar esta aplicación.",
2554
+ clientId: "ID de cliente",
2092
2555
  willAllow: "Esta aplicación podrá:",
2093
2556
  scope: {
2094
2557
  openid: "Confirmar su identidad",
2095
2558
  profile: "Leer su perfil básico (nombre, foto)",
2096
2559
  email: "Leer su dirección de correo electrónico",
2097
2560
  offlineAccess: "Mantener la sesión abierta (renovar el acceso)",
2561
+ dataRead: "Leer registros (dentro de sus propios permisos)",
2562
+ dataWrite: "Crear, modificar y eliminar registros (dentro de sus propios permisos)",
2563
+ actionsExecute: "Ejecutar acciones en su nombre (dentro de sus propios permisos)",
2098
2564
  },
2099
2565
  deny: "Denegar",
2100
2566
  authorize: "Autorizar",
@@ -2125,11 +2591,20 @@ const es = {
2125
2591
  role: "Rol",
2126
2592
  save: "Guardar cambios",
2127
2593
  },
2594
+ language: {
2595
+ title: "Idioma",
2596
+ 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.",
2597
+ label: "Idioma preferido",
2598
+ systemDefault: "Usar el valor predeterminado del despliegue",
2599
+ save: "Guardar",
2600
+ saved: "Preferencia de idioma actualizada.",
2601
+ readOnly: "El idioma de su cuenta lo gestiona su administrador.",
2602
+ },
2128
2603
  password: {
2129
2604
  changeTitle: "Cambiar contraseña",
2130
2605
  setTitle: "Establecer contraseña local",
2131
- changeDescription: "Actualice la contraseña que usa para iniciar sesión en este entorno.",
2132
- setDescription: "Inició sesión mediante inicio de sesión único. Establezca una contraseña local para poder iniciar sesión también con correo y contraseña en este entorno.",
2606
+ changeDescription: "Actualice la contraseña que usa para iniciar sesión.",
2607
+ setDescription: "Inició sesión mediante inicio de sesión único. Establezca una contraseña local para poder iniciar sesión también con correo y contraseña.",
2133
2608
  current: "Contraseña actual",
2134
2609
  new: "Nueva contraseña",
2135
2610
  password: "Contraseña",
@@ -2138,7 +2613,7 @@ const es = {
2138
2613
  mismatch: "Las contraseñas no coinciden",
2139
2614
  enterCurrent: "Introduzca su contraseña actual",
2140
2615
  changed: "Contraseña cambiada.",
2141
- localSet: "Contraseña local establecida. Ahora puede iniciar sesión con correo y contraseña en este entorno.",
2616
+ localSet: "Contraseña local establecida. Ahora puede iniciar sesión con correo y contraseña.",
2142
2617
  changeAction: "Cambiar contraseña",
2143
2618
  setAction: "Establecer contraseña",
2144
2619
  },
@@ -2153,22 +2628,21 @@ const es = {
2153
2628
  unknown: "Ha ocurrido un error inesperado.",
2154
2629
  },
2155
2630
  workspace: {
2156
- label: "Espacios de trabajo",
2157
- default: "Mi espacio de trabajo",
2158
- switch: "Cambiar espacio de trabajo",
2159
- create: "Crear espacio de trabajo",
2160
- createTitle: "Crear un espacio de trabajo",
2161
- createDescription: "Un espacio de trabajo es un lugar compartido para que tu equipo colabore.",
2162
- createButton: "Crear espacio de trabajo",
2163
- nameLabel: "Nombre del espacio de trabajo",
2631
+ label: "Organizaciones",
2632
+ default: "Mi organización",
2633
+ switch: "Cambiar organización",
2634
+ createTitle: "Crear una organización",
2635
+ createDescription: "Una organización es un lugar compartido para que tu equipo colabore.",
2636
+ createButton: "Crear organización",
2637
+ nameLabel: "Nombre de la organización",
2164
2638
  namePlaceholder: "p.ej., Acme Inc",
2165
2639
  slugLabel: "Slug de URL",
2166
2640
  slugHint: "Se utiliza en URLs. Solo minúsculas, números y guiones.",
2167
2641
  invite: "Invitar miembro",
2168
2642
  members: "Miembros",
2169
- settings: "Configuración del espacio de trabajo",
2643
+ settings: "Configuración de la organización",
2170
2644
  multiOrgDisabled: "La creación de nuevas organizaciones está deshabilitada en esta instancia.",
2171
- createFailed: 'No se pudo crear el espacio de trabajo',
2645
+ createFailed: 'No se pudo crear la organización',
2172
2646
  },
2173
2647
  help: {
2174
2648
  onThisPage: "En esta página",
@@ -2176,12 +2650,17 @@ const es = {
2176
2650
  appDocs: 'Documentación de esta app',
2177
2651
  allDocs: 'Toda la documentación',
2178
2652
  onlineDocs: 'Documentación en línea',
2653
+ loadingDocumentation: 'Cargando documentación',
2654
+ about: 'Acerca de',
2655
+ aboutTitle: 'Acerca de esta consola',
2656
+ aboutDescription: 'La compilación a partir de la cual se generó esta consola.',
2657
+ aboutBuild: 'Compilación de la consola',
2658
+ aboutBuildUnknown: 'Compilación desconocida (no se definió ninguna versión al compilar esta consola)',
2179
2659
  },
2180
2660
  sidebar: {
2181
2661
  packageManagement: "Gestión de paquetes",
2182
2662
  searchNavigation: "Buscar en la navegación…",
2183
2663
  settings: "Configuración",
2184
- help: "Ayuda",
2185
2664
  helpTooltip: "Ayuda y documentación",
2186
2665
  activityFeed: "Feed de actividad",
2187
2666
  notifications: "Notificaciones",
@@ -2191,18 +2670,16 @@ const es = {
2191
2670
  area: "Área",
2192
2671
  scope: "Ámbito",
2193
2672
  recent: "Reciente",
2194
- favorites: "Favoritos",
2195
2673
  starred: "Destacados",
2196
2674
  removeFromFavorites: "Quitar {{name}} de favoritos",
2675
+ allReports: "Todos los informes",
2197
2676
  },
2198
2677
  topbar: {
2199
2678
  openAssistant: "Abrir el asistente {{name}}",
2200
2679
  offline: "Sin conexión",
2201
2680
  usersOnline: "Usuarios conectados ahora mismo",
2202
2681
  switchView: "Cambiar de vista",
2203
- switchObject: "Cambiar de objeto",
2204
2682
  connection: {
2205
- connected: "Conectado",
2206
2683
  connecting: "Conectando…",
2207
2684
  reconnecting: "Reconectando…",
2208
2685
  disconnected: "Desconectado",
@@ -2215,23 +2692,22 @@ const es = {
2215
2692
  },
2216
2693
  aiAssistant: "Asistente de IA",
2217
2694
  designInStudio: "Diseñar en Studio",
2695
+ editApp: "Editar aplicación",
2218
2696
  },
2219
2697
  home: {
2220
2698
  build: {
2221
2699
  title: "Crear una aplicación",
2222
- subtitle: "Empiece desde cero — diseñe objetos, formularios, automatizaciones e interfaces.",
2223
- noCapability: "La creación de aplicaciones no está disponible en este espacio de trabajo: requiere el permiso «Gestionar metadatos», que su cuenta no tiene.",
2700
+ noCapability: "La creación de aplicaciones no está disponible en este sistema: requiere el permiso «Gestionar metadatos», que su cuenta no tiene.",
2224
2701
  },
2225
2702
  template: {
2226
2703
  title: "Empezar con una plantilla",
2227
- subtitle: "Instale una aplicación de plantilla desde el mercado y personalícela.",
2228
2704
  marketplaceDisabled: "Este runtime no tiene un marketplace de aplicaciones configurado, por lo que no hay plantillas que instalar aquí.",
2229
2705
  },
2230
2706
  welcomeAdminDescription: "Describa su negocio en una frase — la IA genera los objetos, las pantallas, las API y las herramientas del agente. O configúrelo usted mismo desde el menú de la izquierda.",
2231
2707
  welcomeAdminDescriptionNoBuild: "Configure su primera aplicación desde el menú de Administración de la izquierda. Cuando tenga datos, el asistente de IA podrá ayudarle a explorarlos.",
2232
2708
  welcomeAdminDescriptionNoAi: "Configure su primera aplicación desde el menú de Administración de la izquierda.",
2233
2709
  noAppsTitle: "Todavía no hay aplicaciones",
2234
- noAppsDescription: "Su espacio de trabajo se está preparando — las aplicaciones que su administrador comparta aparecerán aquí.",
2710
+ noAppsDescription: "El sistema se está preparando — las aplicaciones que su administrador comparta aparecerán aquí.",
2235
2711
  buildWithAI: "Crear con IA",
2236
2712
  askAI: "Preguntar a la IA",
2237
2713
  recoveryReminder: {
@@ -2240,7 +2716,16 @@ const es = {
2240
2716
  dismiss: "Descartar",
2241
2717
  },
2242
2718
  pendingDrafts: {
2243
- message: "Tiene {{count}} cambio(s) sin publicar — publíquelos para activarlos.",
2719
+ // objectui#12602 — the drafts row in Home's "My work" section: the
2720
+ // count, then the first draft names joined by `nameSeparator`, in
2721
+ // their package when they share one.
2722
+ title: "{{count}} cambio(s) sin publicar",
2723
+ title_one: "{{count}} cambio sin publicar",
2724
+ title_many: "{{count}} cambios sin publicar",
2725
+ title_other: "{{count}} cambios sin publicar",
2726
+ inPackage: "{{names}} pendientes de publicar en {{package}}",
2727
+ waiting: "{{names}} pendientes de publicar",
2728
+ nameSeparator: ", ",
2244
2729
  cta: "Publicar",
2245
2730
  publishing: "Publicando…",
2246
2731
  published: "¡Publicado! Sus cambios están activos.",
@@ -2255,20 +2740,24 @@ const es = {
2255
2740
  capabilityWarn: "Comprobación de autoría: {{count}} referencia(s) de capacidad no apuntan a nada.",
2256
2741
  },
2257
2742
  title: "Inicio",
2258
- subtitle: "Panel de tu espacio de trabajo",
2259
2743
  nav: "Inicio",
2260
2744
  allApps: "Todas las aplicaciones",
2261
2745
  yourApps: "Tus aplicaciones",
2262
2746
  showMoreApps: "Más",
2263
2747
  showLess: "Mostrar menos",
2264
2748
  continueEmpty: "Los elementos que abras aparecerán aquí.",
2265
- actionCenter: {
2266
- title: "Requiere tu atención",
2267
- empty: "Estás al día",
2749
+ // objectui#12602 — Home's "My work" section: its heading, the link to the
2750
+ // full inbox, each column's title, "view all" link and empty line.
2751
+ myWork: {
2752
+ title: "Mi trabajo",
2753
+ openInbox: "Abrir bandeja de entrada",
2754
+ viewAll: "Ver todo",
2755
+ approvals: "Pendiente de aprobación",
2756
+ approvalsEmpty: "Nada pendiente de su aprobación",
2757
+ notifications: "Notificaciones",
2758
+ notificationsEmpty: "No hay notificaciones sin leer",
2268
2759
  },
2269
- loading: "Cargando espacio de trabajo…",
2270
- recent: "Recientes",
2271
- starred: "Destacados",
2760
+ loading: "Cargando…",
2272
2761
  welcome: "Bienvenido a ObjectUI",
2273
2762
  welcomeDescription: "Comienza creando tu primera aplicación o configura los ajustes del sistema.",
2274
2763
  createFirstApp: "Crea tu primera aplicación",
@@ -2276,12 +2765,10 @@ const es = {
2276
2765
  browseMarketplace: "Explorar marketplace de apps",
2277
2766
  quickActions: {
2278
2767
  title: "Acciones rápidas",
2279
- createApp: "Crear app",
2280
- createAppDesc: "Comienza con una nueva aplicación",
2281
2768
  manageObjects: "Gestionar objetos",
2282
2769
  manageObjectsDesc: "Configura modelos de datos",
2283
2770
  systemSettings: "Configuración del sistema",
2284
- systemSettingsDesc: "Configura tu espacio de trabajo",
2771
+ systemSettingsDesc: "Configura tu sistema",
2285
2772
  },
2286
2773
  appCard: {
2287
2774
  noDescription: "Sin descripción",
@@ -2291,20 +2778,30 @@ const es = {
2291
2778
  greetingAfternoon: "Buenas tardes",
2292
2779
  greetingEvening: "Buenas noches",
2293
2780
  greetingNight: "Turno de noche",
2294
- heroTagline: "Continúe donde lo dejó o descubra algo nuevo.",
2781
+ greetingSeparator: ", ",
2782
+ greetingEnd: ".",
2783
+ search: "Buscar aplicaciones, registros, páginas…",
2784
+ summary: {
2785
+ approvals: "Hoy tiene {{count}} aprobaciones pendientes",
2786
+ approvals_one: "Hoy tiene {{count}} aprobación pendiente",
2787
+ approvals_many: "Hoy tiene {{count}} aprobaciones pendientes",
2788
+ approvals_other: "Hoy tiene {{count}} aprobaciones pendientes",
2789
+ none: "Hoy no tiene nada pendiente",
2790
+ },
2791
+ addApp: "Agregar aplicación",
2792
+ appOpened: "{{time}}",
2295
2793
  open: "Abrir",
2296
- stats: {
2297
- apps: "Aplicaciones",
2298
- starred: "Destacados",
2299
- recent: "Recientes",
2300
- },
2301
2794
  recentApps: {
2302
2795
  title: "Abiertos recientemente",
2303
2796
  itemType: {
2304
2797
  object: "Objeto",
2305
2798
  dashboard: "Panel",
2306
2799
  page: "Página",
2800
+ report: "Informe",
2801
+ package: "Paquete",
2802
+ view: "Vista de lista",
2307
2803
  record: "Registro",
2804
+ metadata: "Metadatos",
2308
2805
  },
2309
2806
  },
2310
2807
  starredApps: {
@@ -2326,7 +2823,6 @@ const es = {
2326
2823
  organizations: "Organizaciones",
2327
2824
  roles: "Roles",
2328
2825
  configuration: "Configuración",
2329
- createApp: "Crear aplicación",
2330
2826
  administration: "Administración",
2331
2827
  datasources: "Fuentes de datos",
2332
2828
  documentation: "Documentación",
@@ -2341,16 +2837,23 @@ const es = {
2341
2837
  manageAllApps: "Administrar todas las aplicaciones",
2342
2838
  systemConsole: "Consola del sistema",
2343
2839
  noAppsConfigured: "Sin aplicaciones configuradas",
2840
+ allApps: "Todas las aplicaciones",
2841
+ editAppInStudio: "Editar {{app}} en Studio",
2842
+ backToHome: "Volver al inicio",
2843
+ settings: "Configuración",
2844
+ productHome: "Inicio de {{product}}",
2344
2845
  },
2345
2846
  activityFeed: {
2346
2847
  title: "Actividad reciente",
2347
2848
  filter: "Filtrar",
2348
2849
  empty: "Sin actividad reciente",
2850
+ accessDenied: "No tiene permiso para ver la actividad.",
2349
2851
  ariaLabel: "Feed de actividad",
2350
2852
  typeCreate: "Crear",
2351
2853
  typeUpdate: "Actualizar",
2352
2854
  typeDelete: "Eliminar",
2353
2855
  typeComment: "Comentario",
2856
+ typeSystem: "Sistema",
2354
2857
  relativeJustNow: "ahora mismo",
2355
2858
  relativeSecondsAgo: "hace {{count}}s",
2356
2859
  relativeMinutesAgo: "hace {{count}}m",
@@ -2372,8 +2875,13 @@ const es = {
2372
2875
  placeholder: "Buscar objetos, paneles, páginas, informes…",
2373
2876
  inputAriaLabel: "Buscar objetos, paneles, páginas, informes",
2374
2877
  resultsCount: "{{count}} resultado para \"{{query}}\"",
2375
- resultsCountPlural: "{{count}} resultados para \"{{query}}\"",
2878
+ resultsCount_one: "{{count}} resultado para \"{{query}}\"",
2879
+ resultsCount_many: "{{count}} de resultados para \"{{query}}\"",
2880
+ resultsCount_other: "{{count}} resultados para \"{{query}}\"",
2376
2881
  itemsAvailable: "{{count}} elementos disponibles",
2882
+ itemsAvailable_one: "{{count}} elemento disponible",
2883
+ itemsAvailable_many: "{{count}} de elementos disponibles",
2884
+ itemsAvailable_other: "{{count}} elementos disponibles",
2377
2885
  noResults: "Sin resultados encontrados",
2378
2886
  noResultsHint: "Intente ajustar sus términos de búsqueda",
2379
2887
  typeObjects: "Objetos",
@@ -2398,26 +2906,38 @@ const es = {
2398
2906
  noAppsConfigured: "Sin aplicaciones configuradas",
2399
2907
  noAppsConfiguredDescription: "No hay aplicaciones registradas. Cree su primera aplicación o visite la configuración del sistema.",
2400
2908
  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.",
2909
+ appNotAvailableDescription: "Esta aplicación no está disponible — vuelva a intentarlo en un momento.",
2910
+ appNotFound: "No se puede abrir esta aplicación",
2911
+ appNotFoundDescription: "El servidor no devolvió esta aplicación para su cuenta.",
2912
+ appUnreachable: "No se pudo conectar con el servidor",
2913
+ appUnreachableDescription: "No se pudo comprobar esta aplicación. Vuelva a intentarlo en un momento.",
2402
2914
  appAccessDenied: "No tiene acceso a esta aplicación",
2403
2915
  appAccessDeniedDescription: "Esta aplicación existe, pero su cuenta no está autorizada para abrirla. Solicite acceso a un administrador.",
2404
2916
  appAccessDeniedHome: "Volver al inicio",
2917
+ appNothingAvailable: "Aún no hay nada disponible para usted en {{app}}",
2918
+ appNothingAvailableDescription: "Esta aplicación no tiene páginas que su cuenta pueda abrir. Solicite acceso a un administrador.",
2919
+ appNothingAvailableGrantDescription: "Esta aplicación no tiene páginas que su cuenta pueda abrir. Puede conceder el acceso en la configuración.",
2920
+ openSetup: "Abrir la configuración",
2405
2921
  createFirstApp: "Crear primera aplicación",
2406
2922
  systemSettings: "Configuración del sistema",
2407
2923
  back: "Atrás",
2408
2924
  recordNotFound: "Registro no encontrado",
2409
2925
  recordNotFoundDescription: "El registro que busca no existe o puede haber sido eliminado.",
2926
+ recordAccessDenied: "No tiene acceso a los registros de {{object}}",
2927
+ recordAccessDeniedDescription: "No tiene permiso para ver registros de este tipo. Contacte a su administrador si cree que debería tener acceso.",
2928
+ recordLoadFailed: "No se pudo cargar este registro",
2929
+ recordLoadFailedDescription: "Algo salió mal al cargarlo. Compruebe su conexión y vuelva a intentarlo.",
2410
2930
  },
2411
2931
  actionDialog: {
2412
2932
  title: "Parámetros de acción",
2413
2933
  description: "Ingrese la información requerida para continuar.",
2414
2934
  selectPlaceholder: "Seleccionar {{label}}",
2415
2935
  requiredError: "{{label}} es obligatorio",
2936
+ 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.',
2937
+ carryOverHint: 'Se conserva sin cambios (solo lectura)',
2416
2938
  cancel: "Cancelar",
2417
2939
  confirm: "Confirmar",
2418
2940
  uploading: "Subiendo…",
2419
- defaultActionTitle: "Acción",
2420
- ok: "Aceptar",
2421
2941
  lookupPlaceholder: "ID de registro para {{label}}",
2422
2942
  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
2943
  },
@@ -2426,11 +2946,6 @@ const es = {
2426
2946
  confirm: "Continuar",
2427
2947
  cancel: "Cancelar",
2428
2948
  },
2429
- rowAction: {
2430
- openMenu: "Abrir menú",
2431
- edit: "Editar",
2432
- delete: "Eliminar",
2433
- },
2434
2949
  navigationSync: {
2435
2950
  addedPage: "Navegación actualizada: página \"{{name}}\" agregada",
2436
2951
  addedDashboard: "Navegación actualizada: panel \"{{name}}\" agregado",
@@ -2444,13 +2959,20 @@ const es = {
2444
2959
  updateFailed: "No se pudo actualizar la navegación",
2445
2960
  },
2446
2961
  objectActions: {
2447
- resetPackageSetConfirm: "Este conjunto de permisos viene con un paquete instalado y no se puede eliminar. Al eliminarlo se restablece a la versión original del paquete y se descartan sus personalizaciones en este entorno. ¿Continuar?",
2448
- resetPackageSetSuccess: "Conjunto de permisos restablecido a la versión original del paquete",
2449
2962
  deleteSuccess: "{{label}} eliminado correctamente",
2450
2963
  deleteFailed: "No se pudo eliminar {{label}}",
2451
2964
  noRecordId: "No se proporcionó ID de registro",
2452
2965
  deleteConfirm: "¿Eliminar este registro?",
2966
+ deleteConfirmTitle: "¿Eliminar {{label}} \"{{name}}\"?",
2967
+ bulkDeleteConfirmTitle: "¿Eliminar {{count}} registros de {{label}}?",
2968
+ bulkDeleteConfirmTitle_one: "¿Eliminar {{count}} registro de {{label}}?",
2969
+ bulkDeleteConfirmTitle_many: "¿Eliminar {{count}} de registros de {{label}}?",
2970
+ bulkDeleteConfirmTitle_other: "¿Eliminar {{count}} registros de {{label}}?",
2971
+ deleteConfirmButton: "Eliminar",
2453
2972
  bulkDeleteSuccess: "{{count}} registros de {{label}} eliminados",
2973
+ bulkDeleteSuccess_one: "{{count}} registro de {{label}} eliminado",
2974
+ bulkDeleteSuccess_many: "{{count}} de registros de {{label}} eliminados",
2975
+ bulkDeleteSuccess_other: "{{count}} registros de {{label}} eliminados",
2454
2976
  bulkDeletePartial: "{{succeeded}} eliminados, {{failed}} fallidos",
2455
2977
  },
2456
2978
  objectViewActions: {
@@ -2462,15 +2984,6 @@ const es = {
2462
2984
  exportFailed: "Error al exportar: {{message}}",
2463
2985
  forecastSoon: "La vista de pronóstico llegará pronto",
2464
2986
  },
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
2987
  user: {
2475
2988
  profile: "Perfil",
2476
2989
  settings: "Configuración",
@@ -2492,6 +3005,7 @@ const es = {
2492
3005
  loading: "Cargando…",
2493
3006
  failedToLoad: "Error al cargar la matriz: {{message}}",
2494
3007
  needsAcross: "El informe de matriz requiere al menos un campo `groupingsAcross`.",
3008
+ forbiddenMessage: "No tienes permiso para ver los datos de este informe.",
2495
3009
  aggregate: {
2496
3010
  count: "Contar",
2497
3011
  countDistinct: "Contar únicos",
@@ -2506,18 +3020,18 @@ const es = {
2506
3020
  },
2507
3021
  },
2508
3022
  organizations: {
2509
- create: "Crear espacio de trabajo",
2510
- mine: "Mis espacios de trabajo",
2511
- title: "Espacios de trabajo",
2512
- heading: "Tus espacios de trabajo",
2513
- subtitle: "Selecciona un espacio de trabajo para continuar o crea uno nuevo.",
2514
- searchPlaceholder: "Buscar un espacio de trabajo",
2515
- new: "Nuevo espacio de trabajo",
2516
- current: "Espacio de trabajo actual",
3023
+ create: "Crear organización",
3024
+ mine: "Mis organizaciones",
3025
+ title: "Organizaciones",
3026
+ heading: "Tus organizaciones",
3027
+ subtitle: "Selecciona una organización para continuar o crea una nueva.",
3028
+ searchPlaceholder: "Buscar una organización",
3029
+ new: "Nueva organización",
3030
+ current: "Organización actual",
2517
3031
  manage: "Administrar",
2518
- emptyTitle: "Aún no hay espacios de trabajo",
2519
- emptyDescription: "Crea tu primer espacio de trabajo para empezar.",
2520
- noMatches: "Ningún espacio de trabajo coincide con tu búsqueda.",
3032
+ emptyTitle: "Aún no hay organizaciones",
3033
+ emptyDescription: "Crea tu primera organización para empezar.",
3034
+ noMatches: "Ninguna organización coincide con tu búsqueda.",
2521
3035
  },
2522
3036
  organization: {
2523
3037
  roles: {
@@ -2602,6 +3116,7 @@ const es = {
2602
3116
  readOnlyNote: "Solo los propietarios pueden cambiar la configuración.",
2603
3117
  nameLabel: "Nombre de la organización",
2604
3118
  slugLabel: "Slug",
3119
+ slugLockedNote: "Esta organización tiene entornos activos, por lo que su slug no se puede cambiar aquí: renombrarla también mueve sus subdominios.",
2605
3120
  logoLabel: "Logo",
2606
3121
  logoUpload: "Subir",
2607
3122
  logoReplace: "Reemplazar",
@@ -2660,18 +3175,43 @@ const es = {
2660
3175
  regionLabel: "Notificaciones",
2661
3176
  groupCount: "{{count}} notificaciones",
2662
3177
  groupUnread: "{{count}} sin leer",
3178
+ groupUnread_one: "{{count}} sin leer",
3179
+ groupUnread_many: "{{count}} sin leer",
3180
+ groupUnread_other: "{{count}} sin leer",
2663
3181
  groupMarkRead: "Marcar como leídas",
2664
3182
  groupMarkReadTitle: "Marcar como leídas todas las de este tipo",
2665
3183
  empty: "Sin notificaciones",
2666
3184
  markAllRead: "Marcar todo como leído",
2667
3185
  viewAll: "Ver todas las notificaciones",
2668
3186
  approvalsPending: "{{count}} aprobaciones pendientes",
3187
+ approvalsPending_one: "{{count}} aprobación pendiente",
3188
+ approvalsPending_many: "{{count}} de aprobaciones pendientes",
3189
+ approvalsPending_other: "{{count}} aprobaciones pendientes",
2669
3190
  viewApprovals: "Ver aprobaciones",
2670
3191
  noPendingApprovals: "Sin aprobaciones pendientes",
2671
3192
  openApprovalsInbox: "Abrir bandeja de aprobaciones",
2672
3193
  badgeTotal: "{{total}} en total",
2673
- badgeNotifications: "{{unread}} notificaciones",
2674
- badgeApprovals: "{{approvals}} aprobaciones pendientes",
3194
+ badgeNotifications: "{{count}} notificaciones",
3195
+ badgeNotifications_one: "{{count}} notificación",
3196
+ badgeNotifications_many: "{{count}} de notificaciones",
3197
+ badgeNotifications_other: "{{count}} notificaciones",
3198
+ badgeApprovals: "{{count}} aprobaciones pendientes",
3199
+ badgeApprovals_one: "{{count}} aprobación pendiente",
3200
+ badgeApprovals_many: "{{count}} de aprobaciones pendientes",
3201
+ badgeApprovals_other: "{{count}} aprobaciones pendientes",
3202
+ arrivalMany: "{{count}} mensajes nuevos",
3203
+ arrivalMany_one: "{{count}} mensaje nuevo",
3204
+ arrivalMany_many: "{{count}} de mensajes nuevos",
3205
+ arrivalMany_other: "{{count}} mensajes nuevos",
3206
+ arrivalRepeats: "{{count}} mensajes nuevos sobre este tema",
3207
+ arrivalRepeats_one: "{{count}} mensaje nuevo sobre este tema",
3208
+ arrivalRepeats_many: "{{count}} de mensajes nuevos sobre este tema",
3209
+ arrivalRepeats_other: "{{count}} mensajes nuevos sobre este tema",
3210
+ arrivalOpen: "Ver",
3211
+ toastEnabled: "Avisos en la aplicación",
3212
+ desktopEnabled: "Notificaciones de escritorio",
3213
+ desktopBlocked: "Bloqueado. Permite las notificaciones de este sitio en la configuración del navegador.",
3214
+ desktopUnsupported: "Este navegador no admite notificaciones de escritorio.",
2675
3215
  emptyUnread: "Todo al día",
2676
3216
  filterUnread: "No leídos",
2677
3217
  filterAll: "Todos",
@@ -2685,12 +3225,14 @@ const es = {
2685
3225
  thankYouTitle: "¡Gracias!",
2686
3226
  thankYouMessage: "Su envío fue recibido correctamente.",
2687
3227
  redirecting: "Redirigiendo en {{seconds}} segundos…",
3228
+ redirectPending: "Redirigiendo…",
2688
3229
  unavailableTitle: "Formulario no disponible",
2689
3230
  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
3231
  tryDemo: "Probar demo",
2691
3232
  retry: "Reintentar",
2692
3233
  loading: "Cargando formulario…",
2693
3234
  requiredHint: "* Campo obligatorio",
3235
+ requiredFields: "Campos obligatorios: {{fields}}",
2694
3236
  consentLabelDefault: "Acepto la política de privacidad y doy mi consentimiento para procesar mis datos para esta solicitud.",
2695
3237
  consentLink: "Política de privacidad",
2696
3238
  consentRequired: "Acepte la política de privacidad para continuar.",
@@ -2703,10 +3245,10 @@ const es = {
2703
3245
  body: 'La superficie MCP está apagada (OS_MCP_SERVER_ENABLED=false). Pida a su operador que la vuelva a habilitar.',
2704
3246
  },
2705
3247
  url: {
2706
- title: 'Endpoint MCP de este entorno',
3248
+ title: 'Endpoint MCP de este sistema',
2707
3249
  body: 'Cualquier cliente de IA compatible con MCP se conecta con esta URL. La identidad es autoservicio: la implementación es su propio servidor de autorización OAuth 2.1 — inicia sesión como usted mismo y cada llamada corre bajo sus permisos y seguridad a nivel de fila.',
2708
3250
  downloadSkill: 'Descargar SKILL.md',
2709
- skillHint: 'La skill portátil del agente: enseña a cualquier agente compatible cómo trabajar con este entorno.',
3251
+ skillHint: 'La skill portátil del agente: enseña a cualquier agente compatible cómo trabajar con este sistema.',
2710
3252
  },
2711
3253
  claude: {
2712
3254
  body: 'Configuración → Conectores → Añadir conector personalizado, pegue esta URL e inicie sesión en el navegador.',
@@ -2741,18 +3283,86 @@ const es = {
2741
3283
  noImportableFields: "Ese objeto no tiene campos importables.",
2742
3284
  schemaReadFailed: "No se pudo leer el esquema del objeto.",
2743
3285
  imported: "Se importaron {{count}} fila(s) en {{object}}.",
3286
+ imported_one: "Se importó {{count}} fila en {{object}}.",
3287
+ imported_many: "Se importaron {{count}} de filas en {{object}}.",
3288
+ imported_other: "Se importaron {{count}} filas en {{object}}.",
2744
3289
  importFrom: "Importar las filas reales desde",
2745
3290
  into: "a",
2746
3291
  opening: "Abriendo…",
2747
3292
  importAction: "Importar",
2748
3293
  dismiss: "Descartar",
2749
3294
  },
2750
- cloudOnboarding: {
2751
- hintCreate: "Cree su primer entorno: un espacio de trabajo privado con su propia URL, base de datos y plan. La creación de aplicaciones ocurre dentro de él.",
2752
- hintReady: "Su entorno de producción está listo. Ábralo para crear y ejecutar sus aplicaciones: todo ocurre dentro del entorno.",
2753
- createEnvironment: "Cree su entorno",
2754
- openProduction: "Abrir producción",
2755
- manageEnvironments: "Gestionar entornos",
3295
+ cloudWorkspaceTimezoneNotice: {
3296
+ seeded: "La zona horaria del entorno se configuró en {{zone}} a partir de su navegador al crearlo. Puede cambiarla en Configuración → Localización.",
3297
+ },
3298
+ ai: {
3299
+ nlQuery: {
3300
+ placeholder: "Haga una pregunta sobre sus datos…",
3301
+ ask: "Preguntar",
3302
+ results: "Resultados",
3303
+ match: "Coincidencia: {{percent}}",
3304
+ simulatedSummary: "Resultados de: {{query}}",
3305
+ noResults: "No se encontraron registros coincidentes",
3306
+ recentQueries: "Consultas recientes",
3307
+ },
3308
+ formAssist: {
3309
+ title: "Sugerencias de IA",
3310
+ suggestionCount: "{{count}} sugerencias",
3311
+ suggestionCount_one: "{{count}} sugerencia",
3312
+ suggestionCount_many: "{{count}} de sugerencias",
3313
+ suggestionCount_other: "{{count}} sugerencias",
3314
+ applyAll: "Aplicar todo",
3315
+ confidence: "Confianza: {{percent}}",
3316
+ appliedCount: "{{count}} sugerencias aplicadas",
3317
+ appliedCount_one: "{{count}} sugerencia aplicada",
3318
+ appliedCount_many: "{{count}} de sugerencias aplicadas",
3319
+ appliedCount_other: "{{count}} sugerencias aplicadas",
3320
+ },
3321
+ recommendations: {
3322
+ title: "Recomendaciones",
3323
+ generating: "Generando recomendaciones…",
3324
+ empty: "No hay recomendaciones disponibles",
3325
+ },
3326
+ },
3327
+ aiApprovals: {
3328
+ title: "Aprobaciones de IA",
3329
+ description: "Acciones propuestas por un agente de IA que necesitan revisión humana antes de ejecutarse.",
3330
+ tabPending: "Pendientes",
3331
+ tabDecided: "Decididas",
3332
+ tabAll: "Todas",
3333
+ statusPending: "Pendiente",
3334
+ statusApproved: "Aprobada",
3335
+ statusExecuted: "Ejecutada",
3336
+ statusFailed: "Fallida",
3337
+ statusRejected: "Rechazada",
3338
+ colTool: "Herramienta",
3339
+ colAction: "Acción",
3340
+ colObject: "Objeto",
3341
+ colStatus: "Estado",
3342
+ colProposed: "Propuesta",
3343
+ colDecision: "Decisión",
3344
+ emptyTitle: "No hay acciones en espera",
3345
+ emptyDescription: "Cuando la IA proponga una acción sensible, aparecerá aquí para su revisión.",
3346
+ view: "Ver",
3347
+ approve: "Aprobar",
3348
+ reject: "Rechazar",
3349
+ working: "Procesando…",
3350
+ approveAndExecute: "Aprobar y ejecutar",
3351
+ outcomeApprove: "Aprobación de {{id}}: {{message}}",
3352
+ outcomeReject: "Rechazo de {{id}}: {{message}}",
3353
+ outcomeExecuteFailed: "La acción falló durante su ejecución",
3354
+ drawerFallbackTitle: "Acción pendiente",
3355
+ drawerSubtitle: "Herramienta {{tool}} sobre {{object}}",
3356
+ fieldProposedBy: "Propuesta por",
3357
+ fieldDecidedBy: "Decidida por",
3358
+ fieldConversation: "Conversación",
3359
+ fieldToolInput: "Entrada de la herramienta",
3360
+ fieldResult: "Resultado",
3361
+ fieldError: "Error",
3362
+ fieldRejectionReason: "Motivo del rechazo",
3363
+ rejectTitle: "¿Rechazar esta acción?",
3364
+ rejectBody: "El motivo se devuelve a la IA para que ajuste su siguiente respuesta.",
3365
+ rejectPlaceholder: "Motivo opcional (p. ej.: «ID de registro incorrecto — confírmalo antes con la persona usuaria.»)",
2756
3366
  },
2757
3367
  aiModelStatus: {
2758
3368
  summary: "Crear / Preguntar usa {{conversational}} ({{conversationalSource}}); estructurado usa {{structured}} ({{structuredSource}}).",
@@ -2762,8 +3372,8 @@ const es = {
2762
3372
  rowConversational: "Modelo Build / Ask",
2763
3373
  rowStructured: "Estructurado (blueprint / seed)",
2764
3374
  rowReasoning: "Esfuerzo de razonamiento",
2765
- readFailed: "No se pudo leer el modelo de IA efectivo. Puede que este entorno no ejecute un servicio de IA o que no tenga el permiso ai:read.",
2766
- readFailedWithStatus: "No se pudo leer el modelo de IA efectivo (HTTP {{status}}). Puede que este entorno no ejecute un servicio de IA o que no tenga el permiso ai:read.",
3375
+ readFailed: "No se pudo leer el modelo de IA efectivo. Puede que este sistema no ejecute un servicio de IA o que no tenga el permiso ai:read.",
3376
+ readFailedWithStatus: "No se pudo leer el modelo de IA efectivo (HTTP {{status}}). Puede que este sistema no ejecute un servicio de IA o que no tenga el permiso ai:read.",
2767
3377
  overridesInEffect: "Anulaciones vigentes: ",
2768
3378
  noOverrides: "ninguna: se usan los valores predeterminados del código desplegado.",
2769
3379
  adapter: "Adaptador: ",
@@ -2771,6 +3381,181 @@ const es = {
2771
3381
  sourceInherits: "igual que build/ask",
2772
3382
  sourcePinned: "fijado por {{source}}",
2773
3383
  },
3384
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3385
+ // English-only until this landed while every other string on the same screen
3386
+ // was translated:
3387
+ //
3388
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3389
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3390
+ // closed registry those runtimes are conformance-tested
3391
+ // against). `humanizeToolName` looks each up as
3392
+ // `chatbot.tool.<tool_name>` and falls back to its English
3393
+ // title-caser for a custom / third-party tool, so a name
3394
+ // missing here is degraded, never broken. Every value, `en`
3395
+ // included, is a short sentence in the pack's language
3396
+ // saying what the step does (cloud#2927 Target 3, ruled
3397
+ // 「同意」; objectui#12724): never the tool id, and never
3398
+ // the title-caser's output for it, which is how the step
3399
+ // reads for a tool the pack has no entry for.
3400
+ // `toolLabels-locale-parity-7481` holds both.
3401
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3402
+ // set for both surfaces (they used to carry separate
3403
+ // tables and disagreed on casing).
3404
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3405
+ // FAMILIES: one slot per CLDR category the pack's language
3406
+ // selects (objectui#11432), plus the base key for a call
3407
+ // made without a count. `all-locales-key-parity.test.ts`
3408
+ // derives the required slots from `Intl.PluralRules`.
3409
+ //
3410
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3411
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3412
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3413
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3414
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3415
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3416
+ // against the registry instead of against its own hand-held list.
3417
+ chatbot: {
3418
+ answer: {
3419
+ showFull: 'Mostrar respuesta completa',
3420
+ collapse: 'Contraer',
3421
+ expandTable: 'Ampliar',
3422
+ exitExpandedTable: 'Cerrar',
3423
+ },
3424
+ tool: {
3425
+ aggregate_data: "Resumir los datos",
3426
+ get_record: "Leer el registro",
3427
+ query_data: "Consultar los datos necesarios",
3428
+ query_records: "Buscar los registros",
3429
+ search_knowledge: "Consultar la base de conocimiento",
3430
+ visualize_data: "Representar los datos en un gráfico",
3431
+ add_field: "Añadir un campo",
3432
+ apply_blueprint: "Construir la aplicación según el plan",
3433
+ apply_edit: "Aplicar el cambio",
3434
+ create_metadata: "Crear un elemento de metadatos",
3435
+ create_object: "Crear un objeto",
3436
+ create_package: "Crear un paquete",
3437
+ create_seed: "Generar datos de ejemplo para los objetos",
3438
+ delete_field: "Eliminar un campo",
3439
+ describe_metadata: "Revisar los metadatos",
3440
+ describe_object: "Revisar la estructura del objeto",
3441
+ get_active_package: "Comprobar el paquete activo",
3442
+ get_authoring_rules: "Consultar las reglas de autoría",
3443
+ get_metadata_schema: "Consultar el formato de los metadatos",
3444
+ get_package: "Revisar el paquete",
3445
+ list_metadata: "Listar los metadatos existentes",
3446
+ list_objects: "Listar los objetos existentes",
3447
+ list_packages: "Listar los paquetes existentes",
3448
+ load_tools: "Cargar más herramientas",
3449
+ modify_field: "Modificar un campo",
3450
+ open_record: "Abrir el registro",
3451
+ propose_blueprint: "Redactar el plan de la aplicación",
3452
+ set_active_package: "Cambiar al paquete de destino",
3453
+ suggest_builder: "Sugerir construirlo con IA",
3454
+ test_flow: "Hacer una prueba del flujo",
3455
+ todo_write: "Anotar comprobaciones pendientes",
3456
+ toggle_flow: "Encender o apagar el flujo",
3457
+ update_metadata: "Actualizar un elemento de metadatos",
3458
+ validate_expression: "Comprobar la expresión",
3459
+ verify_build: "Comprobar el resultado de la construcción",
3460
+ },
3461
+ toolState: {
3462
+ agentActivity: "Actividad del agente",
3463
+ pending: "Pendiente",
3464
+ running: "En curso",
3465
+ awaitingApproval: "Esperando aprobación",
3466
+ responded: "Respondido",
3467
+ completed: "Completado",
3468
+ error: "Error",
3469
+ denied: "Denegado",
3470
+ failed: "Fallido",
3471
+ },
3472
+ phase: {
3473
+ build: "Creación",
3474
+ design: "Diseño del plan",
3475
+ stepCount: "{{count}} pasos",
3476
+ stepCount_one: "{{count}} paso",
3477
+ stepCount_many: "{{count}} de pasos",
3478
+ stepCount_other: "{{count}} pasos",
3479
+ expand: "Mostrar pasos",
3480
+ collapse: "Ocultar pasos",
3481
+ },
3482
+ plan: {
3483
+ countObjects: "{{count}} objetos",
3484
+ countObjects_one: "{{count}} objeto",
3485
+ countObjects_many: "{{count}} de objetos",
3486
+ countObjects_other: "{{count}} objetos",
3487
+ countViews: "{{count}} vistas",
3488
+ countViews_one: "{{count}} vista",
3489
+ countViews_many: "{{count}} de vistas",
3490
+ countViews_other: "{{count}} vistas",
3491
+ countDashboards: "{{count}} paneles",
3492
+ countDashboards_one: "{{count}} panel",
3493
+ countDashboards_many: "{{count}} de paneles",
3494
+ countDashboards_other: "{{count}} paneles",
3495
+ countSeedData: "datos de ejemplo",
3496
+ extendTarget: "Se añade a la app existente: {{app}}",
3497
+ awaitingConfirm: "Pendiente de confirmación",
3498
+ objectsAndFields: "Objetos y campos",
3499
+ views: "Vistas",
3500
+ suggestedField: "sugerido",
3501
+ nameField: "Nombre: {{field}}",
3502
+ },
3503
+ build: {
3504
+ building: "Creando {{app}}…",
3505
+ built: "Creación de {{app}} completada",
3506
+ builtAndLive: "Creada y publicada · {{app}}",
3507
+ appFallback: "su aplicación",
3508
+ addingSampleData: "añadiendo datos de ejemplo",
3509
+ group: {
3510
+ object: "Objetos",
3511
+ view: "Vistas",
3512
+ dashboard: "Paneles",
3513
+ app: "Aplicación",
3514
+ seed: "Datos de ejemplo",
3515
+ },
3516
+ moreArtifacts: "+{{n}} más",
3517
+ verifying: "Comprobando el cambio…",
3518
+ verifyStep: "paso {{n}}",
3519
+ verified: "Cambio comprobado",
3520
+ unknownPhase: "Fase de creación desconocida",
3521
+ nextStepsLead: "A continuación puede decir: {{steps}}",
3522
+ nextStepQuote: "«{{step}}»",
3523
+ draftPosture: "Los cambios posteriores se guardan como borrador y usted los publica en Studio.",
3524
+ checksPassed: "Comprobaciones superadas {{passed}}/{{total}}",
3525
+ },
3526
+ changes: {
3527
+ planTitle: "Plan de cambios · {{count}} cambios",
3528
+ planTitle_one: "Plan de cambios · {{count}} cambio",
3529
+ planTitle_many: "Plan de cambios · {{count}} de cambios",
3530
+ planTitle_other: "Plan de cambios · {{count}} cambios",
3531
+ saveDraft: "Guardar como borrador",
3532
+ reviewAndPublish: "Revisar cambios y publicar",
3533
+ undo: "Deshacer",
3534
+ undoWithOthers: "Deshacer (y {{count}} borradores más)",
3535
+ undoWithOthers_one: "Deshacer (y {{count}} borrador más)",
3536
+ undoWithOthers_many: "Deshacer (y {{count}} de borradores más)",
3537
+ undoWithOthers_other: "Deshacer (y {{count}} borradores más)",
3538
+ undoConfirm: "Deshacer descarta los {{total}} borradores sin publicar de este paquete, incluidos {{count}} que no forman parte de este cambio.",
3539
+ undoConfirm_one: "Deshacer descarta los {{total}} borradores sin publicar de este paquete, incluido {{count}} que no forma parte de este cambio.",
3540
+ undoConfirm_many: "Deshacer descarta los {{total}} borradores sin publicar de este paquete, incluidos {{count}} de borradores que no forman parte de este cambio.",
3541
+ undoConfirm_other: "Deshacer descarta los {{total}} borradores sin publicar de este paquete, incluidos {{count}} que no forman parte de este cambio.",
3542
+ undoConfirmUnknown: "Deshacer descarta todos los borradores sin publicar de este paquete, no solo este cambio.",
3543
+ undoConfirmAction: "Deshacer todo",
3544
+ undoCancel: "Cancelar",
3545
+ undoing: "Deshaciendo…",
3546
+ undone: "Deshecho",
3547
+ undoFailed: "No se pudo deshacer",
3548
+ kind: {
3549
+ field: "Campo",
3550
+ object: "Objeto",
3551
+ view: "Vista",
3552
+ dashboard: "Panel",
3553
+ app: "Aplicación",
3554
+ seed: "Datos de ejemplo",
3555
+ package: "Paquete de aplicación",
3556
+ },
3557
+ },
3558
+ },
2774
3559
  chatbotError: {
2775
3560
  title: "Error en la respuesta",
2776
3561
  fallbackDetail: "Algo salió mal. Vuelva a intentarlo.",
@@ -2784,10 +3569,13 @@ const es = {
2784
3569
  buyCredits: "Comprar un paquete de créditos",
2785
3570
  upgradePlan: "Mejorar el plan",
2786
3571
  },
3572
+ planTier: {
3573
+ teamAndUp: "Desde el plan Team",
3574
+ },
2787
3575
  environment: {
2788
- addEnvironment: "Añadir entorno",
2789
3576
  setUpProduction: "Configure su entorno de producción",
2790
3577
  addDevelopment: "Añadir entorno de desarrollo",
3578
+ developmentLocked: "Entornos de desarrollo · {{tier}}",
2791
3579
  // Plan/capacity dialog (EnvironmentEntitlementDialog) — cloud#959.
2792
3580
  entitlement: {
2793
3581
  productionLimitTitle: "Ya tiene su entorno de producción",
@@ -2835,7 +3623,7 @@ const es = {
2835
3623
  },
2836
3624
  unbound: {
2837
3625
  title: "No conectado",
2838
- body: "Conecte este runtime a un plano de control de ObjectStack para explorar los paquetes privados de su organización e instalarlos aquí. La aprobación es un solo clic en su cuenta de la nube: no se escriben identificadores ni credenciales en esta página.",
3626
+ body: "Este runtime no está conectado a ningún plano de control. «Conectar» abre su cuenta de la nube en una ventana nueva, donde un solo clic aprueba la conexión: no se escriben identificadores ni credenciales en esta página.",
2839
3627
  connect: "Conectar",
2840
3628
  },
2841
3629
  },
@@ -2848,10 +3636,17 @@ const es = {
2848
3636
  dismiss: "Descartar",
2849
3637
  confirmedToast: "«{{set}}» ya está concedido a {{anchor}}.",
2850
3638
  dismissedToast: "Sugerencia para «{{set}}» descartada.",
3639
+ guestUnsupported: "No se puede conceder aquí: los conjuntos de la posición Guest no se derivan de sugerencias aceptadas.",
3640
+ acceptedState: "«{{set}}» se aceptó para todos los usuarios con sesión iniciada (la posición Everyone).",
3641
+ notInForceState: "«{{set}}» se aceptó, pero aún no está en vigor: la posición Everyone no cambió con esta solicitud. El registro del servidor indica el motivo.",
3642
+ dismissedState: "«{{set}}» no está concedido: la sugerencia se descartó o se revocó.",
3643
+ revoke: "Revocar",
3644
+ revoking: "Revocando…",
3645
+ revokedToast: "Aceptación de «{{set}}» revocada.",
2851
3646
  },
2852
3647
  title: "Marketplace de aplicaciones",
2853
3648
  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…",
3649
+ searchPlaceholder: 'Buscar aplicaciones por nombre o ID de aplicación…',
2855
3650
  searchAria: "Buscar aplicaciones del marketplace",
2856
3651
  installed: "Instalado",
2857
3652
  installedCount: "Instaladas ({{count}})",
@@ -2861,21 +3656,26 @@ const es = {
2861
3656
  noMatchFilters: "Ninguna aplicación coincide con sus filtros.",
2862
3657
  noDescription: "Sin descripción disponible.",
2863
3658
  back: "Volver al marketplace",
2864
- installedTitle: "Aplicaciones instaladas",
2865
- installedSubtitle: "Paquetes del marketplace instalados en el kernel de este runtime.",
2866
- installedEmpty: "Aún no hay aplicaciones del marketplace instaladas en este runtime.",
2867
3659
  browseLink: "Explorar marketplace →",
2868
- installedAdditiveNote: "<strong>Nota:</strong> La API del kernel es solo aditiva — desinstalar elimina el manifiesto del disco para que el paquete no se cargue al próximo inicio, pero el kernel en ejecución mantiene la aplicación registrada hasta reiniciar.",
2869
- installedAt: "Instalado {{when}}",
2870
- installedBy: "por {{user}}",
2871
- installedPackageId: "Paquete",
2872
- cachedAs: "Almacenado en caché como <code>{{path}}</code>",
3660
+ installedAdditiveNote: "La desinstalación retira la aplicación del kernel en ejecución de inmediato, junto con sus conjuntos de permisos y sus asignaciones, y elimina el manifiesto en caché para que el paquete no se cargue en el próximo inicio. Los registros almacenados en sus objetos permanecen en la base de datos.",
2873
3661
  versionBadge: "v{{version}}",
2874
3662
  installedBadge: "Instalado v{{version}}",
3663
+ // objectui#11645 — an install-local entry this runtime refused to load at
3664
+ // startup (the listing's `notLoaded` marker), read on Installed Apps.
3665
+ notLoaded: {
3666
+ badge: "No cargado",
3667
+ protocolIncompatible: "Este runtime no cargó este paquete: está dirigido al protocolo {{requiredRange}}, que este runtime no admite.",
3668
+ otherReason: "Este runtime no cargó este paquete ({{code}}).",
3669
+ },
2875
3670
  load: {
2876
3671
  failed: "No se pudo cargar el marketplace",
2877
3672
  failedHintConfigured: "Este runtime accede al marketplace a través del plano de control en {{url}}. Compruebe que esté en línea y sea accesible desde aquí.",
2878
- failedHintSameOrigin: "Este runtime sirve el catálogo del marketplace por sí mismo. Compruebe que el runtime esté en línea.",
3673
+ failedHintSameOrigin: "Al catálogo del marketplace se accede a través de este runtime. Compruebe que el runtime esté en línea y pueda acceder al catálogo.",
3674
+ loading: "Cargando el catálogo del marketplace…",
3675
+ slow: "Sigue cargando — el catálogo del marketplace tarda en responder.",
3676
+ retry: "Reintentar",
3677
+ unreachable: "No se pudo acceder al catálogo del marketplace.",
3678
+ answeredError: "El catálogo del marketplace respondió con un error (HTTP {{status}}).",
2879
3679
  packageFailed: "No se pudo cargar el paquete",
2880
3680
  notFound: "No encontrado.",
2881
3681
  },
@@ -2899,10 +3699,17 @@ const es = {
2899
3699
  purgeSampleData: 'Eliminar datos de ejemplo',
2900
3700
  purgeConfirm: '¿Eliminar todos los registros de ejemplo creados por este paquete? Los registros añadidos por el usuario NO se verán afectados.',
2901
3701
  purgeSuccess: 'Se eliminaron {{count}} registro(s) de ejemplo.',
3702
+ purgeSuccess_one: 'Se eliminó {{count}} registro de ejemplo.',
3703
+ purgeSuccess_many: 'Se eliminaron {{count}} de registros de ejemplo.',
3704
+ purgeSuccess_other: 'Se eliminaron {{count}} registros de ejemplo.',
2902
3705
  purgeNoData: 'No se encontraron registros de ejemplo para eliminar.',
2903
3706
  reseedQueued: 'Los datos de ejemplo se volverán a cargar en el próximo acceso al entorno.',
2904
3707
  reseedLocalSuccess: 'Datos de ejemplo recargados: {{inserted}} insertados, {{updated}} actualizados.',
2905
3708
  reseedPartialErrors: '({{count}} registro(s) no se pudieron escribir)',
3709
+ reseedPartialErrors_one: '({{count}} registro no se pudo escribir)',
3710
+ reseedPartialErrors_many: '({{count}} de registros no se pudieron escribir)',
3711
+ reseedPartialErrors_other: '({{count}} registros no se pudieron escribir)',
3712
+ 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
3713
  updateAvailable: 'Actualización disponible',
2907
3714
  },
2908
3715
  action: {
@@ -2912,6 +3719,7 @@ const es = {
2912
3719
  working: "Procesando…",
2913
3720
  installToCloud: "Instalar en la nube…",
2914
3721
  installing: "Instalando…",
3722
+ updating: "Actualizando…",
2915
3723
  uninstall: "Desinstalar",
2916
3724
  uninstalling: "Desinstalando…",
2917
3725
  details: "Detalles",
@@ -2929,15 +3737,45 @@ const es = {
2929
3737
  environmentPlaceholder: "Seleccionar entorno",
2930
3738
  includeSampleData: "Incluir datos de muestra",
2931
3739
  noEnvs: "No se encontraron entornos en su organización activa.",
2932
- noPermission: "No tiene permiso para instalar aplicaciones en un entorno. Solo los propietarios y administradores de la organización pueden instalar.",
3740
+ noPermission: "No tiene permiso para instalar aplicaciones en un entorno. Solo los propietarios y administradores de la organización pueden instalar; pida ayuda al administrador de su organización.",
2933
3741
  signInFirst: "Primero debe iniciar sesión en ObjectStack Cloud.",
2934
3742
  success: "Instalado correctamente. Abra el entorno para ver la nueva aplicación.",
2935
3743
  localSuccess: "v{{version}} instalado en este runtime. \"{{name}}\" debería aparecer en el selector de aplicaciones ahora.",
3744
+ localLoadsAtRestart: "v{{version}} instalado en este runtime. \"{{name}}\" se cargará en el próximo reinicio del runtime y no aparecerá en el selector de aplicaciones hasta entonces.",
2936
3745
  localManifestConflict: "{{message}}\nNota: Una aplicación local ya tiene este manifest_id. Primero elimínela de objectstack.config.ts.",
2937
3746
  localUnauthorized: "Primero inicie sesión en este runtime.",
2938
3747
  localMarketplaceUnavailable: "Este runtime no tiene configurado OS_CLOUD_URL.",
2939
3748
  updateTo: "Actualizar → v{{version}}",
2940
3749
  installedVersion: "Instalado v{{version}}",
3750
+ deploying: "Desplegando la aplicación…",
3751
+ deployed: "La aplicación está desplegada y lista.",
3752
+ openApp: "Abrir {{name}}",
3753
+ deployTimeout: "La instalación se registró, pero este entorno aún no ofrece la aplicación. Puede que siga desplegándose; vuelve a comprobarlo en breve. Si nunca aparece, es posible que el paquete no se haya cargado, que no incluya ninguna aplicación o que su aplicación requiera un permiso que no tienes.",
3754
+ checkAgain: "Comprobar de nuevo",
3755
+ // ADR-0131 D6 — the install modes a package's manifest permits, and
3756
+ // what an unmanaged install answers (MarketplacePackagePage).
3757
+ mode: {
3758
+ label: "Modo de instalación",
3759
+ managed: "Administrado",
3760
+ managedHint: "El paquete sigue siendo la autoridad: se registra como código, recibe sus actualizaciones y sus elementos no se editan aquí.",
3761
+ unmanaged: "Copia no administrada",
3762
+ unmanagedHint: "Se copia una sola vez en este runtime como sus propios metadatos: cada elemento se puede editar aquí y la copia no recibe actualizaciones.",
3763
+ required: "Elige un modo de instalación para instalar este paquete.",
3764
+ },
3765
+ unmanagedSuccess: "v{{version}} de \"{{name}}\" copiado en este runtime como sus propios metadatos, en la base {{base}}. La copia se puede editar y no recibe actualizaciones.",
3766
+ unmanagedStrippedLocks: "El paquete bloqueaba estos elementos. La copia se puede editar, así que sus bloqueos no se copiaron:",
3767
+ unmanagedIgnored: "Este runtime no admite instalaciones no administradas, así que \"{{name}}\" se instaló como administrado (registrado como código) en lugar de copiarse. Actualiza el runtime, luego desinstala el paquete y vuelve a instalarlo como copia no administrada.",
3768
+ },
3769
+ // objectui#12146 — the install dialog opened as an UPDATE of the copy
3770
+ // this environment holds (MarketplacePackagePage).
3771
+ update: {
3772
+ dialogTitle: "Actualizar {{name}}",
3773
+ dialogDescCurrent: "Actualizar la copia instalada en este entorno ({{host}}).",
3774
+ dialogDescPicker: "Elija el entorno cuya copia instalada desea actualizar. Debe haber iniciado sesión en ObjectStack Cloud.",
3775
+ majorNotice: "Esta es una actualización de versión principal (v{{fromMajor}} → v{{toMajor}}), que puede incluir cambios incompatibles.",
3776
+ releaseNotes: "Leer las notas de la versión v{{version}}",
3777
+ success: "Actualizado a la v{{version}}.",
3778
+ deployTimeout: "La actualización se registró, pero este entorno aún no ofrece la v{{version}}. Puede que siga desplegándose; vuelva a comprobarlo en breve.",
2941
3779
  },
2942
3780
  // objectui#3546 — the MarketplacePage "Your organization" strip.
2943
3781
  org: {
@@ -2955,7 +3793,8 @@ const es = {
2955
3793
  reviewed: "Revisado y aprobado",
2956
3794
  unreviewed: "Sin revisar todavía",
2957
3795
  signed: "Firmado",
2958
- grantsIntro: "Al instalarlo, este paquete recibirá:",
3796
+ grantsIntro: "Este paquete solicita:",
3797
+ 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
3798
  services: "Servicios de la plataforma",
2960
3799
  hooks: "Hooks de ciclo de vida",
2961
3800
  network: "Acceso a la red",
@@ -2969,9 +3808,11 @@ const es = {
2969
3808
  },
2970
3809
  },
2971
3810
  uninstall: {
2972
- confirm: "¿Desinstalar {{manifestId}} v{{version}} de este runtime?\n\nEl manifiesto en caché será eliminado.",
2973
- successInList: "{{manifestId}} eliminado. Reinicie el runtime para descargarlo completamente.",
2974
- successInDetail: "Manifiesto en caché para {{manifestId}} eliminado.",
3811
+ confirm: "¿Desinstalar {{manifestId}} v{{version}} de este runtime?\n\nLa aplicación se retirará de inmediato del kernel en ejecución, junto con sus conjuntos de permisos y sus asignaciones, y el manifiesto en caché será eliminado. Los registros almacenados en sus objetos permanecen en la base de datos.",
3812
+ successInList: "{{manifestId}} eliminado: la aplicación se retiró del kernel en ejecución, junto con sus conjuntos de permisos y sus asignaciones. Los registros almacenados en sus objetos permanecen en la base de datos.",
3813
+ successInDetail: "{{manifestId}} y su manifiesto en caché eliminados: la aplicación se retiró del kernel en ejecución, junto con sus conjuntos de permisos y sus asignaciones. Los registros almacenados en sus objetos permanecen en la base de datos.",
3814
+ confirmNotLoaded: "¿Desinstalar {{manifestId}} v{{version}} de este runtime?\n\nEl manifiesto en caché será eliminado. Este runtime no cargó el paquete, así que ninguna parte de él está en ejecución.",
3815
+ successNotLoaded: "{{manifestId}} eliminado. No estaba cargado, así que no es necesario reiniciar.",
2975
3816
  },
2976
3817
  accessDenied: {
2977
3818
  title: "Marketplace solo para administradores",
@@ -2994,30 +3835,21 @@ const es = {
2994
3835
  storage: "Almacenamiento",
2995
3836
  other: "Otro",
2996
3837
  },
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
3838
  relativeTime: {
3006
3839
  today: "hoy",
3007
3840
  daysAgo: "hace {{count}}d",
3008
3841
  monthsAgo: "hace {{count}} meses",
3842
+ monthsAgo_one: "hace {{count}} mes",
3843
+ monthsAgo_many: "hace {{count}} meses",
3844
+ monthsAgo_other: "hace {{count}} meses",
3009
3845
  yearsAgo: "hace {{count}} años",
3846
+ yearsAgo_one: "hace {{count}} año",
3847
+ yearsAgo_many: "hace {{count}} años",
3848
+ yearsAgo_other: "hace {{count}} años",
3010
3849
  },
3011
3850
  },
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
3851
  approvalsInbox: {
3852
+ recordUnresolvable: 'Este registro no se puede abrir',
3021
3853
  loadMore: 'Cargar más',
3022
3854
  loadingMore: 'Cargando…',
3023
3855
  loadedOf: '{{loaded}} de {{total}} cargadas',
@@ -3036,6 +3868,9 @@ const es = {
3036
3868
  requestInfoSent: 'Devuelta al solicitante para más información',
3037
3869
  remindBtn: 'Recordatorio',
3038
3870
  remindSuccess: 'Recordatorio enviado a {{count}} aprobador(es)',
3871
+ remindSuccess_one: 'Recordatorio enviado a {{count}} aprobador',
3872
+ remindSuccess_many: 'Recordatorio enviado a {{count}} de aprobadores',
3873
+ remindSuccess_other: 'Recordatorio enviado a {{count}} aprobadores',
3039
3874
  remindThrottled: 'Ya se envió un recordatorio hace poco; inténtalo más tarde.',
3040
3875
  replyPlaceholder: 'Responder en esta solicitud…',
3041
3876
  slaRemaining: 'SLA: quedan {{dur}}',
@@ -3052,8 +3887,12 @@ const es = {
3052
3887
  progressApprovals: 'Aprobaciones — {{got}} de {{need}}',
3053
3888
  progressGroups: 'Progreso de firmas — {{got}} de {{need}} grupos',
3054
3889
  progressEligible: '{{count}} aprobador(es) elegible(s)',
3890
+ progressEligible_one: '{{count}} aprobador elegible',
3891
+ progressEligible_many: '{{count}} de aprobadores elegibles',
3892
+ progressEligible_other: '{{count}} aprobadores elegibles',
3055
3893
  progressBar: 'Progreso de la decisión',
3056
3894
  declaredActions: 'Acciones',
3895
+ decisionPanelOffRequestPage: 'El panel de decisión de aprobación solo funciona en las páginas de solicitudes de aprobación.',
3057
3896
  attachmentChip: 'Adjunto',
3058
3897
  attachmentOpenFailed: 'No se pudo abrir el archivo adjunto: inténtalo de nuevo',
3059
3898
  approveOneTitle: '¿Aprobar «{{title}}»?',
@@ -3083,6 +3922,9 @@ const es = {
3083
3922
  filterCount: '{{shown}} de {{total}}',
3084
3923
  selected: 'seleccionadas',
3085
3924
  actionableCount: '({{count}} accionables)',
3925
+ actionableCount_one: '({{count}} accionable)',
3926
+ actionableCount_many: '({{count}} accionables)',
3927
+ actionableCount_other: '({{count}} accionables)',
3086
3928
  selectAll: 'Seleccionar todo',
3087
3929
  selectRow: 'Seleccionar solicitud',
3088
3930
  colRequest: 'Solicitud',
@@ -3117,6 +3959,10 @@ const es = {
3117
3959
  emptyPending: 'Todo al día: nada espera tu aprobación.',
3118
3960
  emptyOther: 'Aún no hay nada aquí.',
3119
3961
  emptyViewAll: 'Ver todas las solicitudes',
3962
+ waitingOnOthers: "{{count}} solicitudes esperan a otros aprobadores",
3963
+ waitingOnOthers_one: "{{count}} solicitud espera a otros aprobadores",
3964
+ waitingOnOthers_many: "{{count}} de solicitudes esperan a otros aprobadores",
3965
+ waitingOnOthers_other: "{{count}} solicitudes esperan a otros aprobadores",
3120
3966
  noMatches: 'Sin coincidencias con los filtros actuales.',
3121
3967
  keyboardHint: 'Teclado: j/k mover · Enter abrir · x seleccionar · a aprobar · r rechazar',
3122
3968
  drawerTitle: 'Solicitud de aprobación',
@@ -3134,12 +3980,12 @@ const es = {
3134
3980
  overrideActionLabel: '{{action}} (anulación)',
3135
3981
  overrideNotice: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso se finaliza de inmediato y se omite a cualquier aprobador que aún no haya actuado. La decisión se registra como anulación de administrador.',
3136
3982
  overrideNoticeWho: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso se finaliza de inmediato y se omite a los aprobadores que aún no han actuado — {{who}}. La decisión se registra como anulación de administrador.',
3983
+ overrideReassignNotice: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso pasa al nuevo aprobador que elija, que sustituye a cualquier aprobador que aún no haya actuado. La solicitud sigue pendiente a la espera del nuevo aprobador. La reasignación se registra como anulación de administrador.',
3984
+ overrideReassignNoticeWho: 'No ocupa ningún puesto de aprobador en este paso. Al continuar se usará su anulación de administrador: el paso pasa al nuevo aprobador que elija, que sustituye a los aprobadores que aún no han actuado — {{who}}. La solicitud sigue pendiente a la espera del nuevo aprobador. La reasignación se registra como anulación de administrador.',
3985
+ overrideRecallNotice: 'No envió esta solicitud. Al continuar se usará su anulación de administrador: la solicitud se retira, ningún aprobador que aún no haya actuado podrá actuar sobre ella y el registro se desbloquea.',
3986
+ overrideRecallNoticeWho: 'No envió esta solicitud. Al continuar se usará su anulación de administrador: la solicitud se retira, el registro se desbloquea y los aprobadores que aún no han actuado ya no podrán actuar sobre ella — {{who}}.',
3137
3987
  viaOverrideChip: 'Anulación de administrador',
3138
3988
  viaOverrideHint: 'Quien actuó no ocupaba ningún puesto de aprobador en este paso: fue admitido por la vía de anulación de administrador.',
3139
- rawData: 'Datos sin procesar (JSON)',
3140
- copy: 'Copiar',
3141
- copied: 'Copiado',
3142
- copyFailed: 'Error al copiar',
3143
3989
  overrideActor: 'Actuar como otra identidad (admin)',
3144
3990
  actor: 'Actor',
3145
3991
  auto: 'Auto',
@@ -3156,11 +4002,23 @@ const es = {
3156
4002
  approveN: 'Aprobar {{count}}',
3157
4003
  rejectN: 'Rechazar {{count}}',
3158
4004
  bulkApproveTitle: '¿Aprobar {{count}} solicitudes?',
4005
+ bulkApproveTitle_one: '¿Aprobar {{count}} solicitud?',
4006
+ bulkApproveTitle_many: '¿Aprobar {{count}} de solicitudes?',
4007
+ bulkApproveTitle_other: '¿Aprobar {{count}} solicitudes?',
3159
4008
  bulkApproveBody: 'Cada solicitud se aprueba con tu identidad y su flujo continúa por la rama de aprobación.',
3160
4009
  bulkRejectTitle: '¿Rechazar {{count}} solicitudes?',
4010
+ bulkRejectTitle_one: '¿Rechazar {{count}} solicitud?',
4011
+ bulkRejectTitle_many: '¿Rechazar {{count}} de solicitudes?',
4012
+ bulkRejectTitle_other: '¿Rechazar {{count}} solicitudes?',
3161
4013
  bulkRejectBody: 'Se rechazarán las solicitudes seleccionadas y se notificará a los solicitantes.',
3162
4014
  bulkApproved: '{{count}} solicitudes aprobadas',
4015
+ bulkApproved_one: '{{count}} solicitud aprobada',
4016
+ bulkApproved_many: '{{count}} de solicitudes aprobadas',
4017
+ bulkApproved_other: '{{count}} solicitudes aprobadas',
3163
4018
  bulkRejected: '{{count}} solicitudes rechazadas',
4019
+ bulkRejected_one: '{{count}} solicitud rechazada',
4020
+ bulkRejected_many: '{{count}} de solicitudes rechazadas',
4021
+ bulkRejected_other: '{{count}} solicitudes rechazadas',
3164
4022
  bulkPartial: '{{ok}} con éxito, {{fail}} fallidas: {{which}}',
3165
4023
  rejectOneTitle: '¿Rechazar "{{title}}"?',
3166
4024
  rejectOneBody: 'Se rechaza la solicitud y se notifica al solicitante.',
@@ -3185,8 +4043,17 @@ const es = {
3185
4043
  alreadyDecided: 'Esta solicitud ya fue decidida. Actualiza la lista.',
3186
4044
  justNow: 'justo ahora',
3187
4045
  minutesAgo: 'hace {{count}} min',
4046
+ minutesAgo_one: 'hace {{count}} min',
4047
+ minutesAgo_many: 'hace {{count}} min',
4048
+ minutesAgo_other: 'hace {{count}} min',
3188
4049
  hoursAgo: 'hace {{count}} h',
4050
+ hoursAgo_one: 'hace {{count}} h',
4051
+ hoursAgo_many: 'hace {{count}} h',
4052
+ hoursAgo_other: 'hace {{count}} h',
3189
4053
  daysAgo: 'hace {{count}} días',
4054
+ daysAgo_one: 'hace {{count}} día',
4055
+ daysAgo_many: 'hace {{count}} días',
4056
+ daysAgo_other: 'hace {{count}} días',
3190
4057
  },
3191
4058
  preview: {
3192
4059
  empty: {
@@ -3207,6 +4074,10 @@ const es = {
3207
4074
  publishing: 'Publicando…',
3208
4075
  exit: 'Salir de la vista previa',
3209
4076
  changes: 'Cambios',
4077
+ pendingHere: 'Vista previa del borrador · {{count}} cambios sin publicar en esta página',
4078
+ pendingHere_one: 'Vista previa del borrador · {{count}} cambio sin publicar en esta página',
4079
+ pendingHere_many: 'Vista previa del borrador · {{count}} de cambios sin publicar en esta página',
4080
+ pendingHere_other: 'Vista previa del borrador · {{count}} cambios sin publicar en esta página',
3210
4081
  },
3211
4082
  changes: {
3212
4083
  title: 'Cambios pendientes',
@@ -3221,11 +4092,81 @@ const es = {
3221
4092
  detailNone: 'No se detectaron diferencias — el borrador coincide con la versión publicada.',
3222
4093
  detailChangedKeys: 'También cambió:',
3223
4094
  confirmNote: 'Publicar libera atómicamente los {{count}} borradores pendientes de este paquete.',
4095
+ confirmNote_one: 'Publicar libera atómicamente {{count}} borrador pendiente de este paquete.',
4096
+ confirmNote_many: 'Publicar libera atómicamente los {{count}} de borradores pendientes de este paquete.',
4097
+ confirmNote_other: 'Publicar libera atómicamente los {{count}} borradores pendientes de este paquete.',
4098
+ // objectui#11591 — the package-less sheet: no package to batch, so each
4099
+ // draft publishes by itself and one that fails stays pending.
4100
+ confirmNoteSeparate: 'Publicar libera los {{count}} borradores pendientes uno por uno: el que falle sigue pendiente y los demás se publican igualmente.',
4101
+ confirmNoteSeparate_one: 'Publicar libera {{count}} borrador pendiente por sí solo: si falla, sigue pendiente.',
4102
+ confirmNoteSeparate_many: 'Publicar libera los {{count}} de borradores pendientes uno por uno: el que falle sigue pendiente y los demás se publican igualmente.',
4103
+ confirmNoteSeparate_other: 'Publicar libera los {{count}} borradores pendientes uno por uno: el que falle sigue pendiente y los demás se publican igualmente.',
3224
4104
  publishConfirm: 'Publicar todo',
3225
- // [objectui#5418] Pre-publish security-posture findings, shown next to
4105
+ summaryItems: '{{count}} elementos',
4106
+ summaryItems_one: '{{count}} elemento',
4107
+ summaryItems_many: '{{count}} de elementos',
4108
+ summaryItems_other: '{{count}} elementos',
4109
+ summaryType: '{{n}} {{type}}',
4110
+ typeCount: {
4111
+ object: '{{count}} objetos',
4112
+ object_one: '{{count}} objeto',
4113
+ object_many: '{{count}} de objetos',
4114
+ object_other: '{{count}} objetos',
4115
+ view: '{{count}} vistas',
4116
+ view_one: '{{count}} vista',
4117
+ view_many: '{{count}} de vistas',
4118
+ view_other: '{{count}} vistas',
4119
+ page: '{{count}} páginas',
4120
+ page_one: '{{count}} página',
4121
+ page_many: '{{count}} de páginas',
4122
+ page_other: '{{count}} páginas',
4123
+ dashboard: '{{count}} paneles',
4124
+ dashboard_one: '{{count}} panel',
4125
+ dashboard_many: '{{count}} de paneles',
4126
+ dashboard_other: '{{count}} paneles',
4127
+ app: '{{count}} aplicaciones',
4128
+ app_one: '{{count}} aplicación',
4129
+ app_many: '{{count}} de aplicaciones',
4130
+ app_other: '{{count}} aplicaciones',
4131
+ action: '{{count}} acciones',
4132
+ action_one: '{{count}} acción',
4133
+ action_many: '{{count}} de acciones',
4134
+ action_other: '{{count}} acciones',
4135
+ report: '{{count}} informes',
4136
+ report_one: '{{count}} informe',
4137
+ report_many: '{{count}} de informes',
4138
+ report_other: '{{count}} informes',
4139
+ flow: '{{count}} flujos',
4140
+ flow_one: '{{count}} flujo',
4141
+ flow_many: '{{count}} de flujos',
4142
+ flow_other: '{{count}} flujos',
4143
+ permission: '{{count}} conjuntos de permisos',
4144
+ permission_one: '{{count}} conjunto de permisos',
4145
+ permission_many: '{{count}} de conjuntos de permisos',
4146
+ permission_other: '{{count}} conjuntos de permisos',
4147
+ agent: '{{count}} agentes',
4148
+ agent_one: '{{count}} agente',
4149
+ agent_many: '{{count}} de agentes',
4150
+ agent_other: '{{count}} agentes',
4151
+ email_template: '{{count}} plantillas de correo',
4152
+ email_template_one: '{{count}} plantilla de correo',
4153
+ email_template_many: '{{count}} de plantillas de correo',
4154
+ email_template_other: '{{count}} plantillas de correo',
4155
+ },
4156
+ // objectui#12929 — the unchecked choice under an added object field whose
4157
+ // literal default the batch publish can write into the existing records.
4158
+ backfillOption: 'Rellenar el valor predeterminado ({{count}} registros existentes)',
4159
+ backfillOption_one: 'Rellenar el valor predeterminado ({{count}} registro existente)',
4160
+ backfillOption_many: 'Rellenar el valor predeterminado ({{count}} de registros existentes)',
4161
+ backfillOption_other: 'Rellenar el valor predeterminado ({{count}} registros existentes)',
4162
+ backfillOptionNoCount: 'Rellenar el valor predeterminado',
4163
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3226
4164
  // the confirm button so a refusal the door would issue is read BEFORE
3227
4165
  // the click rather than as a toast after the batch rolled back.
3228
4166
  securityBlockTitle: 'La publicación será rechazada: {{count}} elemento(s) necesitan una decisión primero',
4167
+ securityBlockTitle_one: 'La publicación será rechazada: {{count}} elemento necesita una decisión primero',
4168
+ securityBlockTitle_many: 'La publicación será rechazada: {{count}} de elementos necesitan una decisión primero',
4169
+ securityBlockTitle_other: 'La publicación será rechazada: {{count}} elementos necesitan una decisión primero',
3229
4170
  securityBlockWhere: 'Corríjalo en el objeto en Configuración → Uso compartido de registros y vuelva a publicar.',
3230
4171
  },
3231
4172
  // ADR-0045 — the materialized-but-unlisted app banner
@@ -3250,7 +4191,7 @@ const es = {
3250
4191
  revertLabel: 'Se deshizo un cambio',
3251
4192
  applyLabel: 'Cambio de compilación',
3252
4193
  revert: 'deshacer',
3253
- items: 'elementos',
4194
+ items: 'Elementos: {{count}}',
3254
4195
  revertAction: 'Deshacer',
3255
4196
  reverted: 'Deshecho — el cambio se ha revertido.',
3256
4197
  revertFailed: 'Error al deshacer',
@@ -3279,28 +4220,32 @@ const es = {
3279
4220
  rangeEnd: "Hasta",
3280
4221
  operators: {
3281
4222
  equals: "Igual a",
3282
- notEquals: "Distinto de",
4223
+ not_equals: "Distinto de",
3283
4224
  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",
4225
+ icontains: "Contiene (ignorar mayúsculas)",
4226
+ not_contains: "No contiene",
4227
+ is_empty: "Está vacío",
4228
+ is_not_empty: "No está vacío",
4229
+ greater_than: "Mayor que",
4230
+ less_than: "Menor que",
4231
+ greater_than_or_equal: "Mayor o igual",
4232
+ less_than_or_equal: "Menor o igual",
3292
4233
  before: "Antes de",
3293
4234
  after: "Después de",
3294
4235
  between: "Entre",
3295
4236
  in: "En",
3296
- notIn: "No en",
3297
- startsWith: "Comienza por",
3298
- endsWith: "Termina en",
3299
- isNull: "Es null",
3300
- isNotNull: "No es null",
4237
+ not_in: "No en",
4238
+ starts_with: "Comienza por",
4239
+ ends_with: "Termina en",
4240
+ is_null: "Es null",
4241
+ is_not_null: "No es null",
3301
4242
  exists: "Está definido",
3302
4243
  notExists: "No está definido",
3303
4244
  },
4245
+ emptyCheckHint: {
4246
+ text: '«{{isEmpty}}» también incluye texto en blanco; «{{isNull}}» solo un valor ausente.',
4247
+ list: '«{{isEmpty}}» también incluye una lista vacía; «{{isNull}}» solo un valor ausente.',
4248
+ },
3304
4249
  },
3305
4250
  sortBuilder: {
3306
4251
  sortBy: "Ordenar por",
@@ -3313,7 +4258,9 @@ const es = {
3313
4258
  },
3314
4259
  collaboration: {
3315
4260
  commentCount: "{{count}} comentarios",
3316
- commentCountOne: "{{count}} comentario",
4261
+ commentCount_one: "{{count}} comentario",
4262
+ commentCount_many: "{{count}} de comentarios",
4263
+ commentCount_other: "{{count}} comentarios",
3317
4264
  resolvedSuffix: " · Resuelto",
3318
4265
  sortComments: "Ordenar comentarios",
3319
4266
  sortOldest: "Más antiguos",
@@ -3322,11 +4269,22 @@ const es = {
3322
4269
  reopen: "Reabrir",
3323
4270
  justNow: "ahora mismo",
3324
4271
  minutesAgo: "hace {{count}} min",
4272
+ minutesAgo_one: "hace {{count}} min",
4273
+ minutesAgo_many: "hace {{count}} min",
4274
+ minutesAgo_other: "hace {{count}} min",
3325
4275
  hoursAgo: "hace {{count}} h",
4276
+ hoursAgo_one: "hace {{count}} h",
4277
+ hoursAgo_many: "hace {{count}} h",
4278
+ hoursAgo_other: "hace {{count}} h",
3326
4279
  daysAgo: "hace {{count}} d",
4280
+ daysAgo_one: "hace {{count}} d",
4281
+ daysAgo_many: "hace {{count}} d",
4282
+ daysAgo_other: "hace {{count}} d",
3327
4283
  edited: "(editado)",
3328
4284
  reactionCount: "{{count}} reacciones",
3329
- reactionCountOne: "{{count}} reacción",
4285
+ reactionCount_one: "{{count}} reacción",
4286
+ reactionCount_many: "{{count}} de reacciones",
4287
+ reactionCount_other: "{{count}} reacciones",
3330
4288
  addThumbsUp: "Agregar me gusta",
3331
4289
  reply: "Responder",
3332
4290
  reactThumbsUp: "Reaccionar con me gusta",
@@ -3337,9 +4295,13 @@ const es = {
3337
4295
  commentPlaceholder: "Agregar un comentario… (usa @ para mencionar)",
3338
4296
  send: "Enviar",
3339
4297
  presentUserCount: "{{count}} usuarios presentes",
3340
- presentUserCountOne: "{{count}} usuario presente",
4298
+ presentUserCount_one: "{{count}} usuario presente",
4299
+ presentUserCount_many: "{{count}} de usuarios presentes",
4300
+ presentUserCount_other: "{{count}} usuarios presentes",
3341
4301
  moreUserCount: "{{count}} usuarios más",
3342
- moreUserCountOne: "{{count}} usuario más",
4302
+ moreUserCount_one: "{{count}} usuario más",
4303
+ moreUserCount_many: "{{count}} de usuarios más",
4304
+ moreUserCount_other: "{{count}} usuarios más",
3343
4305
  userStatusTitle: "{{name}} ({{status}})",
3344
4306
  statusActive: "activo",
3345
4307
  statusIdle: "inactivo",
@@ -3347,6 +4309,11 @@ const es = {
3347
4309
  },
3348
4310
  wizard: {
3349
4311
  missingRequired: "Complete los campos obligatorios: {{fields}}",
4312
+ back: "Atrás",
4313
+ submitting: "Enviando…",
4314
+ stepFallback: "Paso {{n}}",
4315
+ progressLabel: "Progreso",
4316
+ emptyStep: "No hay campos configurados para este paso",
3350
4317
  },
3351
4318
  flowRunner: {
3352
4319
  title: 'Entrada',
@@ -3396,6 +4363,8 @@ const es = {
3396
4363
  setDefaultFailed: "Error al establecer la aplicación predeterminada: {{reason}}",
3397
4364
  appDeleted: "{{name}} eliminada",
3398
4365
  deleteFailed: "Error al eliminar la aplicación: {{reason}}",
4366
+ nothingToDelete: "Nada que eliminar para {{name}}: {{reason}}",
4367
+ alreadyAtDefault: "ya está en el valor predeterminado de su paquete",
3399
4368
  bulkEnabled: "{{n}} aplicaciones habilitadas",
3400
4369
  bulkDisabled: "{{n}} aplicaciones deshabilitadas",
3401
4370
  bulkFailed: "Error en {{n}}: {{details}}",
@@ -3404,5 +4373,131 @@ const es = {
3404
4373
  bulkOperationFailed: "Error en la operación masiva: {{reason}}",
3405
4374
  },
3406
4375
  },
4376
+ // objectui#6301 — Configuración › Automatización de paquetes (ADR-0126
4377
+ // §7.4). Terminología del pack: `common.package` = Paquete,
4378
+ // `flowRunner.completed` = Flujo, comillas «…». ⛔ Ninguna formulación de
4379
+ // linaje o desviación en este grupo (§9).
4380
+ packagedAutomation: {
4381
+ title: "Automatización de paquetes",
4382
+ 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.",
4383
+ refresh: "Actualizar",
4384
+ flowsHeading: "Flujos de paquete",
4385
+ actionsHeading: "Acciones de paquete",
4386
+ colFlow: "Flujo",
4387
+ colActivation: "Activación",
4388
+ colActions: "Acciones",
4389
+ toggleLabel: "Activación de {{label}}",
4390
+ on: "Activado",
4391
+ off: "Desactivado",
4392
+ notRunning: "No se ejecuta aquí",
4393
+ clone: "Clonar",
4394
+ cloneTitle: "Clonar flujo del paquete",
4395
+ cloneBody: "La copia conserva toda la definición y necesita un nombre de máquina y una etiqueta nuevos. Edita la copia en Studio.",
4396
+ cloneName: "Nuevo nombre de máquina",
4397
+ cloneLabel: "Nueva etiqueta",
4398
+ cancel: "Cancelar",
4399
+ cloneConfirm: "Crear clon",
4400
+ cloneCreated: "Flujo «{{name}}» creado.",
4401
+ cloneSwitchSourceOff: "Desactivar «{{label}}»",
4402
+ cloneSourceOff: "El flujo empaquetado «{{label}}» está desactivado.",
4403
+ cloneOpen: "Abrir la copia en Studio",
4404
+ emptyTitle: "Sin flujos de paquete",
4405
+ emptyBody: "Ningún paquete instalado incluye un flujo de automatización en esta implementación. Los flujos que creas tú están en Studio.",
4406
+ loadFailed: "No se pudo cargar la automatización de paquetes.",
4407
+ toggleFailedHttp: "No se pudo cambiar la activación (HTTP {{status}}).",
4408
+ toggleFailed: "No se pudo cambiar la activación.",
4409
+ cloneFailedHttp: "No se pudo clonar este flujo (HTTP {{status}}).",
4410
+ cloneFailed: "No se pudo clonar este flujo.",
4411
+ reasonDetails: "Detalles",
4412
+ 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.",
4413
+ colAction: "Acción",
4414
+ colObject: "Objeto",
4415
+ actionToggleLabel: "Activación de {{label}} en {{object}}",
4416
+ actionsEmptyTitle: "Sin acciones de paquete",
4417
+ actionsEmptyBody: "Ningún paquete instalado declara una acción en esta implementación. Las acciones que creas tú están en Studio.",
4418
+ actionsLoadFailed: "No se pudieron cargar las acciones de paquete.",
4419
+ },
4420
+ element: {
4421
+ number: {
4422
+ noObject: "No se ha indicado ningún objeto: define dataSource.object.",
4423
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta métrica",
4424
+ },
4425
+ image: {
4426
+ noSource: "Sin origen de imagen",
4427
+ },
4428
+ recordPicker: {
4429
+ sourceUnresolved: "No se pudo resolver el origen de datos de este selector de registros",
4430
+ },
4431
+ calendar: {
4432
+ sourceUnresolved: "No se pudo resolver el origen de datos de este calendario",
4433
+ },
4434
+ chart: {
4435
+ sourceUnresolved: "No se pudo resolver el origen de datos de este gráfico",
4436
+ },
4437
+ pivotTable: {
4438
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta tabla dinámica",
4439
+ },
4440
+ detailView: {
4441
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta vista de detalle",
4442
+ },
4443
+ relatedList: {
4444
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta lista relacionada",
4445
+ parentUnreadable: "No se pudo leer el registro principal de esta lista relacionada",
4446
+ },
4447
+ form: {
4448
+ sourceUnresolved: "No se pudo resolver el origen de datos de este formulario",
4449
+ },
4450
+ lineItems: {
4451
+ sourceUnresolved: "No se pudo resolver el origen de datos de este panel de líneas",
4452
+ },
4453
+ gantt: {
4454
+ sourceUnresolved: "No se pudo resolver el origen de datos de este diagrama de Gantt",
4455
+ },
4456
+ grid: {
4457
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta cuadrícula",
4458
+ },
4459
+ board: {
4460
+ sourceUnresolved: "No se pudo resolver el origen de datos de este tablero",
4461
+ },
4462
+ listView: {
4463
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta vista de lista",
4464
+ },
4465
+ map: {
4466
+ sourceUnresolved: "No se pudo resolver el origen de datos de este mapa",
4467
+ },
4468
+ timeline: {
4469
+ sourceUnresolved: "No se pudo resolver el origen de datos de esta línea de tiempo",
4470
+ },
4471
+ component: {
4472
+ sourceUnresolved: "No se pudo resolver el origen de datos de este componente",
4473
+ noDataSource: "No se resolvió ningún origen de datos",
4474
+ apiRefused: "Se rechazó el origen de datos de API de este componente",
4475
+ apiUnreadable: "No se pudo leer el origen de datos de API de este componente",
4476
+ },
4477
+ metadataViewer: {
4478
+ missingKey: "Falta {{key}} en esta vista.",
4479
+ loading: "Cargando {{name}}…",
4480
+ loadFailed: "No se pudo cargar {{name}}: {{message}}",
4481
+ notFound: "No se encontró {{name}}.",
4482
+ stateMachine: "Máquina de estados",
4483
+ flow: "Flujo",
4484
+ permission: "Permiso",
4485
+ noStateMachine: "No hay ninguna máquina de estados en {{object}}.",
4486
+ noStateMachineNamed: "No hay ninguna máquina de estados llamada «{{name}}» en {{object}}.",
4487
+ lifecycle: "Ciclo de vida de {{object}}",
4488
+ field: "campo {{field}}",
4489
+ initial: "inicio",
4490
+ final: "fin",
4491
+ steps: "Pasos: {{count}}",
4492
+ noSteps: "No hay pasos que mostrar.",
4493
+ untitledStep: "(paso)",
4494
+ hiddenSteps: "Pasos técnicos ocultos: {{count}} · establece {{setting}} para mostrarlos todos",
4495
+ objectAccess: "Acceso a objetos: {{count}}",
4496
+ noPermissions: "No se han declarado permisos de objeto.",
4497
+ object: "Objeto",
4498
+ unknownType: "Tipo de vista de metadatos desconocido. Se esperaba {{a}}, {{b}} o {{c}}.",
4499
+ unknownTypeNamed: "Tipo de vista de metadatos desconocido «{{type}}». Se esperaba {{a}}, {{b}} o {{c}}.",
4500
+ },
4501
+ },
3407
4502
  };
3408
4503
  export default es;