@aduptive/strapi-blockscene 1.0.0-alpha.5 → 1.0.0-alpha.6

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.
package/dist/admin.mjs CHANGED
@@ -151,7 +151,8 @@ import {
151
151
  useLibrary,
152
152
  useRBAC,
153
153
  useNotification,
154
- auth
154
+ auth,
155
+ getFetchClient
155
156
  } from "@strapi/helper-plugin";
156
157
 
157
158
  // admin/Gallery.tsx
@@ -329,6 +330,50 @@ function initialState(editor, remembered) {
329
330
  if (editor?.initialState === "remember") return remembered || "closed";
330
331
  return "closed";
331
332
  }
333
+ var withoutField = (rows, name) => rows.map((row) => row.filter((field) => field?.name !== name)).filter((row) => row.length);
334
+ function dropField4(layout, name) {
335
+ if (!name || !layout?.components) return layout;
336
+ return { ...layout, components: Object.fromEntries(Object.entries(layout.components).map(([uid, component]) => [uid, Array.isArray(component?.layouts?.edit) ? { ...component, layouts: { ...component.layouts, edit: withoutField(component.layouts.edit, name) } } : component])) };
337
+ }
338
+ function humanize(name) {
339
+ const text = String(name || "").replace(/[_\-\s]+/g, " ").replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2").trim().split(" ").filter(Boolean).map((word) => /^[A-Z0-9]{2,}$/.test(word) && /[A-Z]/.test(word) ? word : word.toLowerCase()).join(" ");
340
+ return text.charAt(0).toUpperCase() + text.slice(1);
341
+ }
342
+ function localized(value, locale = "en") {
343
+ if (typeof value === "string") return value;
344
+ if (!value || typeof value !== "object") return void 0;
345
+ const keys = Object.keys(value);
346
+ const lang = (key2) => key2.toLowerCase().split("-")[0];
347
+ const lower = String(locale || "en").toLowerCase();
348
+ const key = keys.find((k) => k.toLowerCase() === lower) ?? keys.find((k) => k.toLowerCase() === lang(lower)) ?? keys.find((k) => lang(k) === lang(lower)) ?? keys.find((k) => lang(k) === "en") ?? keys[0];
349
+ return key === void 0 ? void 0 : value[key];
350
+ }
351
+ function fieldText(fields, owner, name, label, locale, on) {
352
+ const entry = owner && fields?.[owner]?.[name] || {};
353
+ const out = {};
354
+ const text = localized(entry.label, locale) ?? (on && label === name ? humanize(name) : void 0);
355
+ if (text !== void 0) out.label = text;
356
+ for (const key of ["description", "placeholder"]) {
357
+ const value = localized(entry[key], locale);
358
+ if (value !== void 0) out[key] = value;
359
+ }
360
+ return Object.keys(out).length ? out : null;
361
+ }
362
+ var labelsOff = (catalog) => !catalog?.editor?.enabled || !catalog.editor.friendlyLabels && !Object.keys(catalog.fields || {}).length;
363
+ function labelEditLayout4(layout, catalog, locale) {
364
+ const uid = layout?.contentType?.uid;
365
+ if (labelsOff(catalog) || !uid || catalog.contentTypes?.[uid]?.enabled === false) return layout;
366
+ const fix = (owner) => (field) => {
367
+ const text = field?.metadatas && fieldText(catalog.fields, owner, field.name, field.metadatas.label, locale, catalog.editor.friendlyLabels);
368
+ return text ? { ...field, metadatas: { ...field.metadatas, ...text } } : field;
369
+ };
370
+ const rows = (target, owner) => Array.isArray(target?.layouts?.edit) ? { ...target, layouts: { ...target.layouts, edit: target.layouts.edit.map((row) => row.map(fix(owner))) } } : target;
371
+ return {
372
+ ...layout,
373
+ contentType: rows(layout.contentType, uid),
374
+ components: Object.fromEntries(Object.entries(layout.components || {}).map(([cuid, component]) => [cuid, rows(component, cuid)]))
375
+ };
376
+ }
332
377
 
333
378
  // admin/preview.mjs
334
379
  var import_groups = __toESM(require_groups(), 1);
@@ -532,11 +577,11 @@ function setAll(list, open, batch = (run) => run()) {
532
577
  }
533
578
  const changed = click(now.map((i) => rows[i]));
534
579
  if (!later.length) return changed;
535
- const pending = later.map((i) => rows[i]);
580
+ const pending2 = later.map((i) => rows[i]);
536
581
  const slice = (deadline) => {
537
582
  if (stopped) return;
538
- click(pending.splice(0, deadline.timeRemaining() > 10 ? PER_FRAME : 1));
539
- if (pending.length) idle(slice);
583
+ click(pending2.splice(0, deadline.timeRemaining() > 10 ? PER_FRAME : 1));
584
+ if (pending2.length) idle(slice);
540
585
  else jobs.delete(list);
541
586
  };
542
587
  idle(slice);
@@ -548,7 +593,9 @@ function setAll(list, open, batch = (run) => run()) {
548
593
  function isNativeAddButton(button, zone) {
549
594
  if (!button || button.getAttribute("aria-expanded") || button.closest('ol[aria-describedby] > li, [role="dialog"], [data-testid^="open-gallery-"], [data-testid^="block-"], [data-testid^="page-preview"], [data-testid^="bp-"], [data-testid^="zone-"], [data-blockscene-row-actions]')) return false;
550
595
  const text = (button.textContent || "").trim();
551
- return Boolean(text) && new RegExp(`(^|\\s)${String(zone.name).replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`).test(text);
596
+ const escape = (value) => String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
597
+ const names = [...new Set([zone.name, zone.label].filter(Boolean))].map(escape).join("|");
598
+ return Boolean(text) && new RegExp(`(^|\\s)(${names})$`).test(text);
552
599
  }
553
600
 
554
601
  // admin/wireframes.tsx
@@ -671,7 +718,6 @@ var en_default = {
671
718
  previewHelp: "Unsaved changes appear in the preview. Click a block to open its form, an image to open the Media Library, a text to edit it.",
672
719
  previewNoUrl: "No preview URL: set it in Settings, Blockscene, or configure Strapi's native Preview for this content type.",
673
720
  previewFailed: "The preview did not answer within 15 s. If the frontend is still loading it will appear by itself; the form stays usable.",
674
- previewReady: "Page preview \xB7 unsaved changes",
675
721
  previewLoading: "Loading preview\u2026",
676
722
  retry: "Try again",
677
723
  editText: "Edit text",
@@ -829,12 +875,57 @@ var en_default = {
829
875
  confirmDeleteOption: "Confirm before deleting a block",
830
876
  duplicateOption: 'Show "Duplicate" on each block',
831
877
  clipboardOption: 'Show "Copy" and "Paste" (across pages)',
878
+ friendlyLabels: "Friendly field labels",
879
+ friendlyLabelsHelp: `Fields whose label is still the attribute name read as words ("mobileColumnsCount" becomes "Mobile columns count"). Labels set in "Configure the view" and texts from the project's "fields" config are kept.`,
832
880
  hiddenBlocks: "Blocks hidden on the site",
833
881
  "hiddenModes.strip": "Removed from the content API",
834
882
  "hiddenModes.flag": "Sent with the flag (the frontend decides)",
835
883
  "hiddenModes.off": "Off (no hide button)",
836
884
  hiddenBlocksHelp: "The eye on each block marks it hidden on the site. Removed: content API reads (REST, GraphQL) leave it out, the admin always shows it. Flag: it is sent with the attribute so the frontend can decide.",
837
- hiddenAttributeOff: "The plugin config sets hiddenAttribute to false: blocks cannot be hidden."
885
+ hiddenAttributeOff: "The plugin config sets hiddenAttribute to false: blocks cannot be hidden.",
886
+ historyTitle: "History",
887
+ historyEmpty: "No versions yet. Saves, publishes and deletes are recorded from now on.",
888
+ historyLoading: "Loading history\u2026",
889
+ historyFailed: "The history could not be loaded.",
890
+ historyRefresh: "Refresh history",
891
+ historySystem: "System",
892
+ "historyActions.create": "Created",
893
+ "historyActions.update": "Saved",
894
+ "historyActions.publish": "Published",
895
+ "historyActions.unpublish": "Unpublished",
896
+ "historyActions.discard": "Draft discarded",
897
+ "historyActions.delete": "Deleted",
898
+ "historyActions.restore": "Restored",
899
+ historyInitial: "First version",
900
+ historyNoChange: "No content change",
901
+ historyMissing: "Not recorded (the capture failed)",
902
+ historyBlocksSummary: "Blocks: {added} added, {removed} removed, {changed} changed",
903
+ historyFieldsSummary: "Fields: {fields}",
904
+ historyNotKept: "This version is no longer kept.",
905
+ historyCompare: "Compared with the form",
906
+ historySame: "Same content as the form.",
907
+ "diffOps.added": "Added",
908
+ "diffOps.removed": "Removed",
909
+ "diffOps.changed": "Changed",
910
+ historyDiffFields: "Fields that differ: {fields}",
911
+ historyDiffNote: "Relations are not compared.",
912
+ historyLoad: "Load this version",
913
+ historyLoaded: "Version loaded into the form. Nothing is saved until you save.",
914
+ historyLeft: "Left as they are: {fields}",
915
+ historyRemovedFields: "No longer in the schema, not loaded: {fields}",
916
+ historyMissingItems: "No longer exist, left out: {media} media files, {relations} related entries, {blocks} blocks",
917
+ historyLoadFailed: "This version could not be loaded.",
918
+ historyShowMore: "Show more",
919
+ historySettings: "Version history",
920
+ historySettingsHelp: "Records every create, save, publish, unpublish, discard and delete made through Strapi's document service (the admin, the REST and GraphQL APIs, other plugins), with a snapshot of the content. Editors see the versions in the edit view and can load one into the form. This is content activity, not a security audit log: direct database writes are not seen.",
921
+ historyEnabled: "Record versions",
922
+ historyAll: "All content types",
923
+ historyTypes: "Content types",
924
+ historyRetention: "Keep snapshots (days)",
925
+ historyMax: "Snapshots per document (maximum)",
926
+ historyEventDays: "Keep the activity (days)",
927
+ historyRetentionHelp: "A nightly job empties snapshots older than this or beyond the per-document maximum (the newest are kept) and deletes activity older than its limit. It never deletes media files.",
928
+ historyInvalid: "Whole numbers: 1 to 3650 days (the activity kept at least as long as the snapshots) and 1 to 1000 snapshots."
838
929
  };
839
930
 
840
931
  // admin/translations/pt-BR.json
@@ -912,7 +1003,6 @@ var pt_BR_default = {
912
1003
  previewHelp: "Altera\xE7\xF5es n\xE3o salvas aparecem na preview. Clique em um bloco para abrir seu formul\xE1rio, em uma imagem para abrir a Media Library, em um texto para edit\xE1-lo.",
913
1004
  previewNoUrl: "Sem URL de preview: defina em Configura\xE7\xF5es, Blockscene, ou configure a Preview nativa do Strapi para este tipo de conte\xFAdo.",
914
1005
  previewFailed: "A preview n\xE3o respondeu em 15 s. Se o frontend ainda estiver carregando, ela aparece sozinha; o formul\xE1rio continua utiliz\xE1vel.",
915
- previewReady: "Preview da p\xE1gina \xB7 altera\xE7\xF5es n\xE3o salvas",
916
1006
  previewLoading: "Carregando preview\u2026",
917
1007
  retry: "Tentar novamente",
918
1008
  editText: "Editar texto",
@@ -1070,12 +1160,57 @@ var pt_BR_default = {
1070
1160
  confirmDeleteOption: "Confirmar antes de excluir um bloco",
1071
1161
  duplicateOption: 'Mostrar "Duplicar" em cada bloco',
1072
1162
  clipboardOption: 'Mostrar "Copiar" e "Colar" (entre p\xE1ginas)',
1163
+ friendlyLabels: "R\xF3tulos de campo amig\xE1veis",
1164
+ friendlyLabelsHelp: 'Campos cujo r\xF3tulo ainda \xE9 o nome do atributo aparecem como palavras ("mobileColumnsCount" vira "Mobile columns count"). R\xF3tulos definidos em "Configurar a visualiza\xE7\xE3o" e textos da configura\xE7\xE3o "fields" do projeto s\xE3o mantidos.',
1073
1165
  hiddenBlocks: "Blocos ocultos no site",
1074
1166
  "hiddenModes.strip": "Removidos da API de conte\xFAdo",
1075
1167
  "hiddenModes.flag": "Enviados com a marca\xE7\xE3o (o frontend decide)",
1076
1168
  "hiddenModes.off": "Desligado (sem bot\xE3o de ocultar)",
1077
1169
  hiddenBlocksHelp: "O olho em cada bloco o marca como oculto no site. Removidos: as leituras da API de conte\xFAdo (REST, GraphQL) o deixam de fora; o admin sempre o mostra. Marca\xE7\xE3o: ele \xE9 enviado com o atributo para o frontend decidir.",
1078
- hiddenAttributeOff: "A config do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos."
1170
+ hiddenAttributeOff: "A config do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos.",
1171
+ historyTitle: "Hist\xF3rico",
1172
+ historyEmpty: "Nenhuma vers\xE3o ainda. Salvamentos, publica\xE7\xF5es e exclus\xF5es passam a ser registrados a partir de agora.",
1173
+ historyLoading: "Carregando hist\xF3rico\u2026",
1174
+ historyFailed: "N\xE3o foi poss\xEDvel carregar o hist\xF3rico.",
1175
+ historyRefresh: "Atualizar hist\xF3rico",
1176
+ historySystem: "Sistema",
1177
+ "historyActions.create": "Criado",
1178
+ "historyActions.update": "Salvo",
1179
+ "historyActions.publish": "Publicado",
1180
+ "historyActions.unpublish": "Despublicado",
1181
+ "historyActions.discard": "Rascunho descartado",
1182
+ "historyActions.delete": "Exclu\xEDdo",
1183
+ "historyActions.restore": "Restaurado",
1184
+ historyInitial: "Primeira vers\xE3o",
1185
+ historyNoChange: "Sem mudan\xE7a de conte\xFAdo",
1186
+ historyMissing: "N\xE3o registrado (a captura falhou)",
1187
+ historyBlocksSummary: "Blocos: {added} adicionados, {removed} removidos, {changed} alterados",
1188
+ historyFieldsSummary: "Campos: {fields}",
1189
+ historyNotKept: "Esta vers\xE3o n\xE3o \xE9 mais mantida.",
1190
+ historyCompare: "Comparado com o formul\xE1rio",
1191
+ historySame: "Mesmo conte\xFAdo do formul\xE1rio.",
1192
+ "diffOps.added": "Adicionado",
1193
+ "diffOps.removed": "Removido",
1194
+ "diffOps.changed": "Alterado",
1195
+ historyDiffFields: "Campos diferentes: {fields}",
1196
+ historyDiffNote: "Rela\xE7\xF5es n\xE3o s\xE3o comparadas.",
1197
+ historyLoad: "Carregar esta vers\xE3o",
1198
+ historyLoaded: "Vers\xE3o carregada no formul\xE1rio. Nada \xE9 salvo at\xE9 voc\xEA salvar.",
1199
+ historyLeft: "Mantidos como est\xE3o: {fields}",
1200
+ historyRemovedFields: "N\xE3o existem mais no schema, n\xE3o carregados: {fields}",
1201
+ historyMissingItems: "N\xE3o existem mais, deixados de fora: {media} arquivos de m\xEDdia, {relations} entradas relacionadas, {blocks} blocos",
1202
+ historyLoadFailed: "N\xE3o foi poss\xEDvel carregar esta vers\xE3o.",
1203
+ historyShowMore: "Mostrar mais",
1204
+ historySettings: "Hist\xF3rico de vers\xF5es",
1205
+ historySettingsHelp: "Registra cada cria\xE7\xE3o, salvamento, publica\xE7\xE3o, despublica\xE7\xE3o, descarte e exclus\xE3o feitos pelo document service do Strapi (o admin, as APIs REST e GraphQL, outros plugins), com um snapshot do conte\xFAdo. Editores veem as vers\xF5es na tela de edi\xE7\xE3o e podem carregar uma no formul\xE1rio. \xC9 atividade de conte\xFAdo, n\xE3o um log de auditoria de seguran\xE7a: grava\xE7\xF5es diretas no banco n\xE3o s\xE3o vistas.",
1206
+ historyEnabled: "Registrar vers\xF5es",
1207
+ historyAll: "Todos os tipos de conte\xFAdo",
1208
+ historyTypes: "Tipos de conte\xFAdo",
1209
+ historyRetention: "Manter snapshots (dias)",
1210
+ historyMax: "Snapshots por documento (m\xE1ximo)",
1211
+ historyEventDays: "Manter a atividade (dias)",
1212
+ historyRetentionHelp: "Uma rotina noturna esvazia snapshots mais antigos que isso ou al\xE9m do m\xE1ximo por documento (os mais novos s\xE3o mantidos) e exclui a atividade mais antiga que o limite. Nunca exclui arquivos de m\xEDdia.",
1213
+ historyInvalid: "N\xFAmeros inteiros: 1 a 3650 dias (a atividade mantida pelo menos tanto quanto os snapshots) e 1 a 1000 snapshots."
1079
1214
  };
1080
1215
 
1081
1216
  // admin/translations/pt.json
@@ -1153,7 +1288,6 @@ var pt_default = {
1153
1288
  previewHelp: "As altera\xE7\xF5es por guardar aparecem na pr\xE9-visualiza\xE7\xE3o. Clique num bloco para abrir o seu formul\xE1rio, numa imagem para abrir a Media Library, num texto para o editar.",
1154
1289
  previewNoUrl: "Sem URL de pr\xE9-visualiza\xE7\xE3o: defina em Defini\xE7\xF5es, Blockscene, ou configure a Preview nativa do Strapi para este tipo de conte\xFAdo.",
1155
1290
  previewFailed: "A pr\xE9-visualiza\xE7\xE3o n\xE3o respondeu em 15 s. Se o frontend ainda estiver a carregar, ela aparece sozinha; o formul\xE1rio continua utiliz\xE1vel.",
1156
- previewReady: "Pr\xE9-visualiza\xE7\xE3o da p\xE1gina \xB7 altera\xE7\xF5es por guardar",
1157
1291
  previewLoading: "A carregar pr\xE9-visualiza\xE7\xE3o\u2026",
1158
1292
  retry: "Tentar novamente",
1159
1293
  editText: "Editar texto",
@@ -1311,12 +1445,57 @@ var pt_default = {
1311
1445
  confirmDeleteOption: "Confirmar antes de eliminar um bloco",
1312
1446
  duplicateOption: 'Mostrar "Duplicar" em cada bloco',
1313
1447
  clipboardOption: 'Mostrar "Copiar" e "Colar" (entre p\xE1ginas)',
1448
+ friendlyLabels: "Etiquetas de campo leg\xEDveis",
1449
+ friendlyLabelsHelp: 'Os campos cuja etiqueta ainda \xE9 o nome do atributo aparecem como palavras ("mobileColumnsCount" passa a "Mobile columns count"). As etiquetas definidas em "Configurar a vista" e os textos da configura\xE7\xE3o "fields" do projeto mant\xEAm-se.',
1314
1450
  hiddenBlocks: "Blocos ocultos no site",
1315
1451
  "hiddenModes.strip": "Removidos da API de conte\xFAdo",
1316
1452
  "hiddenModes.flag": "Enviados com a marca\xE7\xE3o (o frontend decide)",
1317
1453
  "hiddenModes.off": "Desligado (sem bot\xE3o de ocultar)",
1318
1454
  hiddenBlocksHelp: "O olho em cada bloco marca-o como oculto no site. Removidos: as leituras da API de conte\xFAdo (REST, GraphQL) deixam-no de fora; o admin mostra-o sempre. Marca\xE7\xE3o: \xE9 enviado com o atributo para o frontend decidir.",
1319
- hiddenAttributeOff: "A configura\xE7\xE3o do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos."
1455
+ hiddenAttributeOff: "A configura\xE7\xE3o do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos.",
1456
+ historyTitle: "Hist\xF3rico",
1457
+ historyEmpty: "Ainda n\xE3o h\xE1 vers\xF5es. Grava\xE7\xF5es, publica\xE7\xF5es e elimina\xE7\xF5es passam a ser registadas a partir de agora.",
1458
+ historyLoading: "A carregar o hist\xF3rico\u2026",
1459
+ historyFailed: "N\xE3o foi poss\xEDvel carregar o hist\xF3rico.",
1460
+ historyRefresh: "Atualizar hist\xF3rico",
1461
+ historySystem: "Sistema",
1462
+ "historyActions.create": "Criado",
1463
+ "historyActions.update": "Guardado",
1464
+ "historyActions.publish": "Publicado",
1465
+ "historyActions.unpublish": "Despublicado",
1466
+ "historyActions.discard": "Rascunho descartado",
1467
+ "historyActions.delete": "Eliminado",
1468
+ "historyActions.restore": "Restaurado",
1469
+ historyInitial: "Primeira vers\xE3o",
1470
+ historyNoChange: "Sem altera\xE7\xE3o de conte\xFAdo",
1471
+ historyMissing: "N\xE3o registado (a captura falhou)",
1472
+ historyBlocksSummary: "Blocos: {added} adicionados, {removed} removidos, {changed} alterados",
1473
+ historyFieldsSummary: "Campos: {fields}",
1474
+ historyNotKept: "Esta vers\xE3o j\xE1 n\xE3o \xE9 mantida.",
1475
+ historyCompare: "Comparado com o formul\xE1rio",
1476
+ historySame: "Mesmo conte\xFAdo do formul\xE1rio.",
1477
+ "diffOps.added": "Adicionado",
1478
+ "diffOps.removed": "Removido",
1479
+ "diffOps.changed": "Alterado",
1480
+ historyDiffFields: "Campos diferentes: {fields}",
1481
+ historyDiffNote: "As rela\xE7\xF5es n\xE3o s\xE3o comparadas.",
1482
+ historyLoad: "Carregar esta vers\xE3o",
1483
+ historyLoaded: "Vers\xE3o carregada no formul\xE1rio. Nada \xE9 guardado at\xE9 guardar.",
1484
+ historyLeft: "Mantidos como est\xE3o: {fields}",
1485
+ historyRemovedFields: "J\xE1 n\xE3o existem no esquema, n\xE3o carregados: {fields}",
1486
+ historyMissingItems: "J\xE1 n\xE3o existem, deixados de fora: {media} ficheiros multim\xE9dia, {relations} entradas relacionadas, {blocks} blocos",
1487
+ historyLoadFailed: "N\xE3o foi poss\xEDvel carregar esta vers\xE3o.",
1488
+ historyShowMore: "Mostrar mais",
1489
+ historySettings: "Hist\xF3rico de vers\xF5es",
1490
+ historySettingsHelp: "Regista cada cria\xE7\xE3o, grava\xE7\xE3o, publica\xE7\xE3o, despublica\xE7\xE3o, descarte e elimina\xE7\xE3o feitos pelo document service do Strapi (o admin, as APIs REST e GraphQL, outros plugins), com um snapshot do conte\xFAdo. Os editores veem as vers\xF5es no ecr\xE3 de edi\xE7\xE3o e podem carregar uma no formul\xE1rio. \xC9 atividade de conte\xFAdo, n\xE3o um registo de auditoria de seguran\xE7a: escritas diretas na base de dados n\xE3o s\xE3o vistas.",
1491
+ historyEnabled: "Registar vers\xF5es",
1492
+ historyAll: "Todos os tipos de conte\xFAdo",
1493
+ historyTypes: "Tipos de conte\xFAdo",
1494
+ historyRetention: "Manter snapshots (dias)",
1495
+ historyMax: "Snapshots por documento (m\xE1ximo)",
1496
+ historyEventDays: "Manter a atividade (dias)",
1497
+ historyRetentionHelp: "Uma tarefa noturna esvazia os snapshots mais antigos do que isto ou al\xE9m do m\xE1ximo por documento (os mais recentes s\xE3o mantidos) e elimina a atividade mais antiga do que o limite. Nunca elimina ficheiros multim\xE9dia.",
1498
+ historyInvalid: "N\xFAmeros inteiros: 1 a 3650 dias (a atividade mantida pelo menos tanto quanto os snapshots) e 1 a 1000 snapshots."
1320
1499
  };
1321
1500
 
1322
1501
  // admin/translations/fr.json
@@ -1394,7 +1573,6 @@ var fr_default = {
1394
1573
  previewHelp: "Les modifications non enregistr\xE9es apparaissent dans l'aper\xE7u. Cliquez sur un bloc pour ouvrir son formulaire, sur une image pour ouvrir la M\xE9diath\xE8que, sur un texte pour le modifier.",
1395
1574
  previewNoUrl: "Aucune URL d'aper\xE7u : d\xE9finissez-la dans Param\xE8tres, Blockscene, ou configurez l'aper\xE7u natif de Strapi pour ce type de contenu.",
1396
1575
  previewFailed: "L'aper\xE7u n'a pas r\xE9pondu en 15 s. Si le frontend est encore en train de charger, il appara\xEEtra de lui-m\xEAme ; le formulaire reste utilisable.",
1397
- previewReady: "Aper\xE7u de la page \xB7 modifications non enregistr\xE9es",
1398
1576
  previewLoading: "Chargement de l'aper\xE7u\u2026",
1399
1577
  retry: "R\xE9essayer",
1400
1578
  editText: "Modifier le texte",
@@ -1552,12 +1730,57 @@ var fr_default = {
1552
1730
  confirmDeleteOption: "Confirmer avant de supprimer un bloc",
1553
1731
  duplicateOption: "Afficher \xAB Dupliquer \xBB sur chaque bloc",
1554
1732
  clipboardOption: "Afficher \xAB Copier \xBB et \xAB Coller \xBB (entre pages)",
1733
+ friendlyLabels: "Libell\xE9s de champ lisibles",
1734
+ friendlyLabelsHelp: `Les champs dont le libell\xE9 est encore le nom de l'attribut s'affichent en mots ("mobileColumnsCount" devient "Mobile columns count"). Les libell\xE9s d\xE9finis dans \xAB Configurer la vue \xBB et les textes de la configuration \xAB fields \xBB du projet sont conserv\xE9s.`,
1555
1735
  hiddenBlocks: "Blocs masqu\xE9s sur le site",
1556
1736
  "hiddenModes.strip": "Retir\xE9s de l'API de contenu",
1557
1737
  "hiddenModes.flag": "Envoy\xE9s avec l'indicateur (le frontend d\xE9cide)",
1558
1738
  "hiddenModes.off": "D\xE9sactiv\xE9 (pas de bouton masquer)",
1559
1739
  hiddenBlocksHelp: "L'\u0153il de chaque bloc le marque comme masqu\xE9 sur le site. Retir\xE9s : les lectures de l'API de contenu (REST, GraphQL) l'omettent, l'admin l'affiche toujours. Indicateur : il est envoy\xE9 avec l'attribut et le frontend d\xE9cide.",
1560
- hiddenAttributeOff: "La configuration du plugin fixe hiddenAttribute \xE0 false : les blocs ne peuvent pas \xEAtre masqu\xE9s."
1740
+ hiddenAttributeOff: "La configuration du plugin fixe hiddenAttribute \xE0 false : les blocs ne peuvent pas \xEAtre masqu\xE9s.",
1741
+ historyTitle: "Historique",
1742
+ historyEmpty: "Aucune version pour l'instant. Les enregistrements, publications et suppressions sont d\xE9sormais consign\xE9s.",
1743
+ historyLoading: "Chargement de l'historique\u2026",
1744
+ historyFailed: "Impossible de charger l'historique.",
1745
+ historyRefresh: "Actualiser l'historique",
1746
+ historySystem: "Syst\xE8me",
1747
+ "historyActions.create": "Cr\xE9\xE9",
1748
+ "historyActions.update": "Enregistr\xE9",
1749
+ "historyActions.publish": "Publi\xE9",
1750
+ "historyActions.unpublish": "D\xE9publi\xE9",
1751
+ "historyActions.discard": "Brouillon abandonn\xE9",
1752
+ "historyActions.delete": "Supprim\xE9",
1753
+ "historyActions.restore": "Restaur\xE9",
1754
+ historyInitial: "Premi\xE8re version",
1755
+ historyNoChange: "Aucun changement de contenu",
1756
+ historyMissing: "Non consign\xE9 (la capture a \xE9chou\xE9)",
1757
+ historyBlocksSummary: "Blocs : {added} ajout\xE9s, {removed} supprim\xE9s, {changed} modifi\xE9s",
1758
+ historyFieldsSummary: "Champs : {fields}",
1759
+ historyNotKept: "Cette version n'est plus conserv\xE9e.",
1760
+ historyCompare: "Compar\xE9 au formulaire",
1761
+ historySame: "M\xEAme contenu que le formulaire.",
1762
+ "diffOps.added": "Ajout\xE9",
1763
+ "diffOps.removed": "Supprim\xE9",
1764
+ "diffOps.changed": "Modifi\xE9",
1765
+ historyDiffFields: "Champs diff\xE9rents : {fields}",
1766
+ historyDiffNote: "Les relations ne sont pas compar\xE9es.",
1767
+ historyLoad: "Charger cette version",
1768
+ historyLoaded: "Version charg\xE9e dans le formulaire. Rien n'est enregistr\xE9 tant que vous n'enregistrez pas.",
1769
+ historyLeft: "Laiss\xE9s tels quels : {fields}",
1770
+ historyRemovedFields: "N'existent plus dans le sch\xE9ma, non charg\xE9s : {fields}",
1771
+ historyMissingItems: "N'existent plus, laiss\xE9s de c\xF4t\xE9 : {media} fichiers m\xE9dia, {relations} entr\xE9es li\xE9es, {blocks} blocs",
1772
+ historyLoadFailed: "Impossible de charger cette version.",
1773
+ historyShowMore: "Afficher plus",
1774
+ historySettings: "Historique des versions",
1775
+ historySettingsHelp: "Consigne chaque cr\xE9ation, enregistrement, publication, d\xE9publication, abandon de brouillon et suppression passant par le document service de Strapi (l'admin, les API REST et GraphQL, d'autres plugins), avec un instantan\xE9 du contenu. Les \xE9diteurs voient les versions dans la vue d'\xE9dition et peuvent en charger une dans le formulaire. Il s'agit d'activit\xE9 de contenu, pas d'un journal d'audit de s\xE9curit\xE9 : les \xE9critures directes en base ne sont pas vues.",
1776
+ historyEnabled: "Consigner les versions",
1777
+ historyAll: "Tous les types de contenu",
1778
+ historyTypes: "Types de contenu",
1779
+ historyRetention: "Conserver les instantan\xE9s (jours)",
1780
+ historyMax: "Instantan\xE9s par document (maximum)",
1781
+ historyEventDays: "Conserver l'activit\xE9 (jours)",
1782
+ historyRetentionHelp: "Une t\xE2che nocturne vide les instantan\xE9s plus anciens que cela ou au-del\xE0 du maximum par document (les plus r\xE9cents sont gard\xE9s) et supprime l'activit\xE9 plus ancienne que sa limite. Elle ne supprime jamais de fichiers m\xE9dia.",
1783
+ historyInvalid: "Nombres entiers : 1 \xE0 3650 jours (l'activit\xE9 conserv\xE9e au moins aussi longtemps que les instantan\xE9s) et 1 \xE0 1000 instantan\xE9s."
1561
1784
  };
1562
1785
 
1563
1786
  // admin/translations/es.json
@@ -1635,7 +1858,6 @@ var es_default = {
1635
1858
  previewHelp: "Los cambios sin guardar aparecen en la vista previa. Haga clic en un bloque para abrir su formulario, en una imagen para abrir la Biblioteca multimedia, en un texto para editarlo.",
1636
1859
  previewNoUrl: "Sin URL de vista previa: def\xEDnala en Ajustes, Blockscene, o configure la Vista previa nativa de Strapi para este tipo de contenido.",
1637
1860
  previewFailed: "La vista previa no respondi\xF3 en 15 s. Si el frontend a\xFAn est\xE1 cargando, aparecer\xE1 sola; el formulario sigue utilizable.",
1638
- previewReady: "Vista previa de la p\xE1gina \xB7 cambios sin guardar",
1639
1861
  previewLoading: "Cargando vista previa\u2026",
1640
1862
  retry: "Reintentar",
1641
1863
  editText: "Editar texto",
@@ -1793,12 +2015,57 @@ var es_default = {
1793
2015
  confirmDeleteOption: "Confirmar antes de eliminar un bloque",
1794
2016
  duplicateOption: "Mostrar \xABDuplicar\xBB en cada bloque",
1795
2017
  clipboardOption: "Mostrar \xABCopiar\xBB y \xABPegar\xBB (entre p\xE1ginas)",
2018
+ friendlyLabels: "Etiquetas de campo legibles",
2019
+ friendlyLabelsHelp: 'Los campos cuya etiqueta sigue siendo el nombre del atributo se muestran como palabras ("mobileColumnsCount" pasa a "Mobile columns count"). Se conservan las etiquetas definidas en \xABConfigurar la vista\xBB y los textos de la configuraci\xF3n \xABfields\xBB del proyecto.',
1796
2020
  hiddenBlocks: "Bloques ocultos en el sitio",
1797
2021
  "hiddenModes.strip": "Eliminados de la API de contenido",
1798
2022
  "hiddenModes.flag": "Enviados con la marca (el frontend decide)",
1799
2023
  "hiddenModes.off": "Desactivado (sin bot\xF3n de ocultar)",
1800
2024
  hiddenBlocksHelp: "El ojo de cada bloque lo marca como oculto en el sitio. Eliminados: las lecturas de la API de contenido (REST, GraphQL) lo omiten; el admin siempre lo muestra. Marca: se env\xEDa con el atributo y el frontend decide.",
1801
- hiddenAttributeOff: "La configuraci\xF3n del plugin fija hiddenAttribute en false: no se pueden ocultar bloques."
2025
+ hiddenAttributeOff: "La configuraci\xF3n del plugin fija hiddenAttribute en false: no se pueden ocultar bloques.",
2026
+ historyTitle: "Historial",
2027
+ historyEmpty: "A\xFAn no hay versiones. Desde ahora se registran los guardados, las publicaciones y las eliminaciones.",
2028
+ historyLoading: "Cargando historial\u2026",
2029
+ historyFailed: "No se pudo cargar el historial.",
2030
+ historyRefresh: "Actualizar historial",
2031
+ historySystem: "Sistema",
2032
+ "historyActions.create": "Creado",
2033
+ "historyActions.update": "Guardado",
2034
+ "historyActions.publish": "Publicado",
2035
+ "historyActions.unpublish": "Despublicado",
2036
+ "historyActions.discard": "Borrador descartado",
2037
+ "historyActions.delete": "Eliminado",
2038
+ "historyActions.restore": "Restaurado",
2039
+ historyInitial: "Primera versi\xF3n",
2040
+ historyNoChange: "Sin cambios de contenido",
2041
+ historyMissing: "No registrado (la captura fall\xF3)",
2042
+ historyBlocksSummary: "Bloques: {added} a\xF1adidos, {removed} eliminados, {changed} modificados",
2043
+ historyFieldsSummary: "Campos: {fields}",
2044
+ historyNotKept: "Esta versi\xF3n ya no se conserva.",
2045
+ historyCompare: "Comparado con el formulario",
2046
+ historySame: "Mismo contenido que el formulario.",
2047
+ "diffOps.added": "A\xF1adido",
2048
+ "diffOps.removed": "Eliminado",
2049
+ "diffOps.changed": "Modificado",
2050
+ historyDiffFields: "Campos distintos: {fields}",
2051
+ historyDiffNote: "Las relaciones no se comparan.",
2052
+ historyLoad: "Cargar esta versi\xF3n",
2053
+ historyLoaded: "Versi\xF3n cargada en el formulario. No se guarda nada hasta que guardes.",
2054
+ historyLeft: "Se dejan como est\xE1n: {fields}",
2055
+ historyRemovedFields: "Ya no est\xE1n en el esquema, no se cargan: {fields}",
2056
+ historyMissingItems: "Ya no existen, se omiten: {media} archivos multimedia, {relations} entradas relacionadas, {blocks} bloques",
2057
+ historyLoadFailed: "No se pudo cargar esta versi\xF3n.",
2058
+ historyShowMore: "Mostrar m\xE1s",
2059
+ historySettings: "Historial de versiones",
2060
+ historySettingsHelp: "Registra cada creaci\xF3n, guardado, publicaci\xF3n, despublicaci\xF3n, descarte y eliminaci\xF3n hechos a trav\xE9s del document service de Strapi (el admin, las API REST y GraphQL, otros plugins), con una instant\xE1nea del contenido. Los editores ven las versiones en la vista de edici\xF3n y pueden cargar una en el formulario. Es actividad de contenido, no un registro de auditor\xEDa de seguridad: las escrituras directas en la base de datos no se ven.",
2061
+ historyEnabled: "Registrar versiones",
2062
+ historyAll: "Todos los tipos de contenido",
2063
+ historyTypes: "Tipos de contenido",
2064
+ historyRetention: "Conservar instant\xE1neas (d\xEDas)",
2065
+ historyMax: "Instant\xE1neas por documento (m\xE1ximo)",
2066
+ historyEventDays: "Conservar la actividad (d\xEDas)",
2067
+ historyRetentionHelp: "Una tarea nocturna vac\xEDa las instant\xE1neas m\xE1s antiguas que esto o por encima del m\xE1ximo por documento (se conservan las m\xE1s recientes) y elimina la actividad m\xE1s antigua que su l\xEDmite. Nunca elimina archivos multimedia.",
2068
+ historyInvalid: "N\xFAmeros enteros: de 1 a 3650 d\xEDas (la actividad se conserva al menos tanto como las instant\xE1neas) y de 1 a 1000 instant\xE1neas."
1802
2069
  };
1803
2070
 
1804
2071
  // admin/translations/de.json
@@ -1876,7 +2143,6 @@ var de_default = {
1876
2143
  previewHelp: "Ungespeicherte \xC4nderungen erscheinen in der Vorschau. Klicken Sie auf einen Block, um sein Formular zu \xF6ffnen, auf ein Bild f\xFCr die Medienbibliothek, auf einen Text, um ihn zu bearbeiten.",
1877
2144
  previewNoUrl: "Keine Vorschau-URL: in Einstellungen, Blockscene festlegen oder die native Strapi-Vorschau f\xFCr diesen Inhaltstyp konfigurieren.",
1878
2145
  previewFailed: "Die Vorschau hat innerhalb von 15 s nicht geantwortet. L\xE4dt das Frontend noch, erscheint sie von selbst; das Formular bleibt benutzbar.",
1879
- previewReady: "Seitenvorschau \xB7 ungespeicherte \xC4nderungen",
1880
2146
  previewLoading: "Vorschau wird geladen\u2026",
1881
2147
  retry: "Erneut versuchen",
1882
2148
  editText: "Text bearbeiten",
@@ -2034,12 +2300,57 @@ var de_default = {
2034
2300
  confirmDeleteOption: "Vor dem L\xF6schen eines Blocks nachfragen",
2035
2301
  duplicateOption: "\u201EDuplizieren\u201C an jedem Block anzeigen",
2036
2302
  clipboardOption: "\u201EKopieren\u201C und \u201EEinf\xFCgen\u201C anzeigen (seiten\xFCbergreifend)",
2303
+ friendlyLabels: "Lesbare Feldbezeichnungen",
2304
+ friendlyLabelsHelp: "Felder, deren Bezeichnung noch der Attributname ist, erscheinen als W\xF6rter (\u201EmobileColumnsCount\u201C wird zu \u201EMobile columns count\u201C). In \u201EAnsicht konfigurieren\u201C gesetzte Bezeichnungen und Texte aus der \u201Efields\u201C-Konfiguration des Projekts bleiben erhalten.",
2037
2305
  hiddenBlocks: "Auf der Website ausgeblendete Bl\xF6cke",
2038
2306
  "hiddenModes.strip": "Aus der Content-API entfernt",
2039
2307
  "hiddenModes.flag": "Mit Markierung gesendet (das Frontend entscheidet)",
2040
2308
  "hiddenModes.off": "Aus (kein Ausblenden-Knopf)",
2041
2309
  hiddenBlocksHelp: "Das Auge an jedem Block blendet ihn auf der Website aus. Entfernt: Lesezugriffe der Content-API (REST, GraphQL) lassen ihn weg, der Admin zeigt ihn immer. Markierung: Er wird mit dem Attribut gesendet und das Frontend entscheidet.",
2042
- hiddenAttributeOff: "Die Plugin-Konfiguration setzt hiddenAttribute auf false: Bl\xF6cke k\xF6nnen nicht ausgeblendet werden."
2310
+ hiddenAttributeOff: "Die Plugin-Konfiguration setzt hiddenAttribute auf false: Bl\xF6cke k\xF6nnen nicht ausgeblendet werden.",
2311
+ historyTitle: "Verlauf",
2312
+ historyEmpty: "Noch keine Versionen. Speichern, Ver\xF6ffentlichen und L\xF6schen werden ab jetzt aufgezeichnet.",
2313
+ historyLoading: "Verlauf wird geladen\u2026",
2314
+ historyFailed: "Der Verlauf konnte nicht geladen werden.",
2315
+ historyRefresh: "Verlauf aktualisieren",
2316
+ historySystem: "System",
2317
+ "historyActions.create": "Erstellt",
2318
+ "historyActions.update": "Gespeichert",
2319
+ "historyActions.publish": "Ver\xF6ffentlicht",
2320
+ "historyActions.unpublish": "Ver\xF6ffentlichung zur\xFCckgezogen",
2321
+ "historyActions.discard": "Entwurf verworfen",
2322
+ "historyActions.delete": "Gel\xF6scht",
2323
+ "historyActions.restore": "Wiederhergestellt",
2324
+ historyInitial: "Erste Version",
2325
+ historyNoChange: "Keine inhaltliche \xC4nderung",
2326
+ historyMissing: "Nicht aufgezeichnet (Erfassung fehlgeschlagen)",
2327
+ historyBlocksSummary: "Bl\xF6cke: {added} hinzugef\xFCgt, {removed} entfernt, {changed} ge\xE4ndert",
2328
+ historyFieldsSummary: "Felder: {fields}",
2329
+ historyNotKept: "Diese Version wird nicht mehr aufbewahrt.",
2330
+ historyCompare: "Verglichen mit dem Formular",
2331
+ historySame: "Gleicher Inhalt wie im Formular.",
2332
+ "diffOps.added": "Hinzugef\xFCgt",
2333
+ "diffOps.removed": "Entfernt",
2334
+ "diffOps.changed": "Ge\xE4ndert",
2335
+ historyDiffFields: "Abweichende Felder: {fields}",
2336
+ historyDiffNote: "Relationen werden nicht verglichen.",
2337
+ historyLoad: "Diese Version laden",
2338
+ historyLoaded: "Version ins Formular geladen. Nichts wird gespeichert, bis Sie speichern.",
2339
+ historyLeft: "Unver\xE4ndert gelassen: {fields}",
2340
+ historyRemovedFields: "Nicht mehr im Schema, nicht geladen: {fields}",
2341
+ historyMissingItems: "Existieren nicht mehr, ausgelassen: {media} Mediendateien, {relations} verkn\xFCpfte Eintr\xE4ge, {blocks} Bl\xF6cke",
2342
+ historyLoadFailed: "Diese Version konnte nicht geladen werden.",
2343
+ historyShowMore: "Mehr anzeigen",
2344
+ historySettings: "Versionsverlauf",
2345
+ historySettingsHelp: "Zeichnet jedes Erstellen, Speichern, Ver\xF6ffentlichen, Zur\xFCckziehen, Verwerfen und L\xF6schen \xFCber den Document Service von Strapi auf (Admin, REST- und GraphQL-API, andere Plugins), mit einem Snapshot des Inhalts. Redakteure sehen die Versionen in der Bearbeitungsansicht und k\xF6nnen eine ins Formular laden. Das ist Inhaltsaktivit\xE4t, kein Sicherheits-Audit-Log: direkte Datenbankschreibvorg\xE4nge werden nicht erfasst.",
2346
+ historyEnabled: "Versionen aufzeichnen",
2347
+ historyAll: "Alle Inhaltstypen",
2348
+ historyTypes: "Inhaltstypen",
2349
+ historyRetention: "Snapshots aufbewahren (Tage)",
2350
+ historyMax: "Snapshots pro Dokument (Maximum)",
2351
+ historyEventDays: "Aktivit\xE4t aufbewahren (Tage)",
2352
+ historyRetentionHelp: "Ein n\xE4chtlicher Job leert Snapshots, die \xE4lter sind oder das Maximum pro Dokument \xFCberschreiten (die neuesten bleiben), und l\xF6scht Aktivit\xE4t, die \xE4lter als ihr Limit ist. Mediendateien l\xF6scht er nie.",
2353
+ historyInvalid: "Ganze Zahlen: 1 bis 3650 Tage (die Aktivit\xE4t mindestens so lange wie die Snapshots) und 1 bis 1000 Snapshots."
2043
2354
  };
2044
2355
 
2045
2356
  // admin/translations/it.json
@@ -2117,7 +2428,6 @@ var it_default = {
2117
2428
  previewHelp: "Le modifiche non salvate compaiono nell'anteprima. Clicca un blocco per aprire il suo modulo, un'immagine per aprire la Libreria media, un testo per modificarlo.",
2118
2429
  previewNoUrl: "Nessun URL di anteprima: impostalo in Impostazioni, Blockscene, oppure configura l'Anteprima nativa di Strapi per questo tipo di contenuto.",
2119
2430
  previewFailed: "L'anteprima non ha risposto entro 15 s. Se il frontend sta ancora caricando, comparir\xE0 da sola; il modulo resta utilizzabile.",
2120
- previewReady: "Anteprima della pagina \xB7 modifiche non salvate",
2121
2431
  previewLoading: "Caricamento dell'anteprima\u2026",
2122
2432
  retry: "Riprova",
2123
2433
  editText: "Modifica testo",
@@ -2275,12 +2585,57 @@ var it_default = {
2275
2585
  confirmDeleteOption: "Chiedi conferma prima di eliminare un blocco",
2276
2586
  duplicateOption: 'Mostra "Duplica" su ogni blocco',
2277
2587
  clipboardOption: 'Mostra "Copia" e "Incolla" (tra pagine)',
2588
+ friendlyLabels: "Etichette dei campi leggibili",
2589
+ friendlyLabelsHelp: `I campi la cui etichetta \xE8 ancora il nome dell'attributo appaiono come parole ("mobileColumnsCount" diventa "Mobile columns count"). Le etichette impostate in "Configura la vista" e i testi della configurazione "fields" del progetto restano invariati.`,
2278
2590
  hiddenBlocks: "Blocchi nascosti sul sito",
2279
2591
  "hiddenModes.strip": "Rimossi dall'API dei contenuti",
2280
2592
  "hiddenModes.flag": "Inviati con il flag (decide il frontend)",
2281
2593
  "hiddenModes.off": "Disattivato (nessun pulsante nascondi)",
2282
2594
  hiddenBlocksHelp: "L'occhio su ogni blocco lo segna come nascosto sul sito. Rimossi: le letture dell'API dei contenuti (REST, GraphQL) lo omettono, l'admin lo mostra sempre. Flag: viene inviato con l'attributo e decide il frontend.",
2283
- hiddenAttributeOff: "La configurazione del plugin imposta hiddenAttribute a false: i blocchi non possono essere nascosti."
2595
+ hiddenAttributeOff: "La configurazione del plugin imposta hiddenAttribute a false: i blocchi non possono essere nascosti.",
2596
+ historyTitle: "Cronologia",
2597
+ historyEmpty: "Ancora nessuna versione. Da ora vengono registrati salvataggi, pubblicazioni ed eliminazioni.",
2598
+ historyLoading: "Caricamento della cronologia\u2026",
2599
+ historyFailed: "Impossibile caricare la cronologia.",
2600
+ historyRefresh: "Aggiorna cronologia",
2601
+ historySystem: "Sistema",
2602
+ "historyActions.create": "Creato",
2603
+ "historyActions.update": "Salvato",
2604
+ "historyActions.publish": "Pubblicato",
2605
+ "historyActions.unpublish": "Pubblicazione annullata",
2606
+ "historyActions.discard": "Bozza scartata",
2607
+ "historyActions.delete": "Eliminato",
2608
+ "historyActions.restore": "Ripristinato",
2609
+ historyInitial: "Prima versione",
2610
+ historyNoChange: "Nessuna modifica al contenuto",
2611
+ historyMissing: "Non registrato (acquisizione non riuscita)",
2612
+ historyBlocksSummary: "Blocchi: {added} aggiunti, {removed} rimossi, {changed} modificati",
2613
+ historyFieldsSummary: "Campi: {fields}",
2614
+ historyNotKept: "Questa versione non \xE8 pi\xF9 conservata.",
2615
+ historyCompare: "Confrontato con il modulo",
2616
+ historySame: "Stesso contenuto del modulo.",
2617
+ "diffOps.added": "Aggiunto",
2618
+ "diffOps.removed": "Rimosso",
2619
+ "diffOps.changed": "Modificato",
2620
+ historyDiffFields: "Campi diversi: {fields}",
2621
+ historyDiffNote: "Le relazioni non vengono confrontate.",
2622
+ historyLoad: "Carica questa versione",
2623
+ historyLoaded: "Versione caricata nel modulo. Nulla viene salvato finch\xE9 non salvi.",
2624
+ historyLeft: "Lasciati come sono: {fields}",
2625
+ historyRemovedFields: "Non pi\xF9 nello schema, non caricati: {fields}",
2626
+ historyMissingItems: "Non esistono pi\xF9, esclusi: {media} file multimediali, {relations} voci collegate, {blocks} blocchi",
2627
+ historyLoadFailed: "Impossibile caricare questa versione.",
2628
+ historyShowMore: "Mostra altro",
2629
+ historySettings: "Cronologia delle versioni",
2630
+ historySettingsHelp: "Registra ogni creazione, salvataggio, pubblicazione, annullamento della pubblicazione, scarto e eliminazione fatti tramite il document service di Strapi (l'admin, le API REST e GraphQL, altri plugin), con un'istantanea del contenuto. Gli editor vedono le versioni nella vista di modifica e possono caricarne una nel modulo. \xC8 attivit\xE0 sui contenuti, non un registro di audit di sicurezza: le scritture dirette nel database non vengono viste.",
2631
+ historyEnabled: "Registra le versioni",
2632
+ historyAll: "Tutti i tipi di contenuto",
2633
+ historyTypes: "Tipi di contenuto",
2634
+ historyRetention: "Conserva le istantanee (giorni)",
2635
+ historyMax: "Istantanee per documento (massimo)",
2636
+ historyEventDays: "Conserva l'attivit\xE0 (giorni)",
2637
+ historyRetentionHelp: "Un'attivit\xE0 notturna svuota le istantanee pi\xF9 vecchie di cos\xEC o oltre il massimo per documento (le pi\xF9 recenti restano) ed elimina l'attivit\xE0 pi\xF9 vecchia del suo limite. Non elimina mai file multimediali.",
2638
+ historyInvalid: "Numeri interi: da 1 a 3650 giorni (l'attivit\xE0 conservata almeno quanto le istantanee) e da 1 a 1000 istantanee."
2284
2639
  };
2285
2640
 
2286
2641
  // admin/translations/nl.json
@@ -2358,7 +2713,6 @@ var nl_default = {
2358
2713
  previewHelp: "Niet-opgeslagen wijzigingen verschijnen in het voorbeeld. Klik op een blok om het formulier te openen, op een afbeelding voor de Mediabibliotheek, op een tekst om die te bewerken.",
2359
2714
  previewNoUrl: "Geen voorbeeld-URL: stel die in bij Instellingen, Blockscene, of configureer Strapi's native Preview voor dit contenttype.",
2360
2715
  previewFailed: "Het voorbeeld antwoordde niet binnen 15 s. Als de frontend nog laadt, verschijnt het vanzelf; het formulier blijft bruikbaar.",
2361
- previewReady: "Paginavoorbeeld \xB7 niet-opgeslagen wijzigingen",
2362
2716
  previewLoading: "Voorbeeld laden\u2026",
2363
2717
  retry: "Opnieuw proberen",
2364
2718
  editText: "Tekst bewerken",
@@ -2516,12 +2870,57 @@ var nl_default = {
2516
2870
  confirmDeleteOption: "Bevestigen voordat een blok wordt verwijderd",
2517
2871
  duplicateOption: '"Dupliceren" op elk blok tonen',
2518
2872
  clipboardOption: `"Kopi\xEBren" en "Plakken" tonen (tussen pagina's)`,
2873
+ friendlyLabels: "Leesbare veldlabels",
2874
+ friendlyLabelsHelp: 'Velden waarvan het label nog de attribuutnaam is, verschijnen als woorden ("mobileColumnsCount" wordt "Mobile columns count"). Labels uit "Weergave configureren" en teksten uit de "fields"-configuratie van het project blijven behouden.',
2519
2875
  hiddenBlocks: "Op de site verborgen blokken",
2520
2876
  "hiddenModes.strip": "Verwijderd uit de content-API",
2521
2877
  "hiddenModes.flag": "Verzonden met de markering (de frontend beslist)",
2522
2878
  "hiddenModes.off": "Uit (geen verbergknop)",
2523
2879
  hiddenBlocksHelp: "Het oog op elk blok markeert het als verborgen op de site. Verwijderd: leesverzoeken van de content-API (REST, GraphQL) laten het weg, de admin toont het altijd. Markering: het wordt met het attribuut verzonden en de frontend beslist.",
2524
- hiddenAttributeOff: "De pluginconfiguratie zet hiddenAttribute op false: blokken kunnen niet verborgen worden."
2880
+ hiddenAttributeOff: "De pluginconfiguratie zet hiddenAttribute op false: blokken kunnen niet verborgen worden.",
2881
+ historyTitle: "Geschiedenis",
2882
+ historyEmpty: "Nog geen versies. Opslaan, publiceren en verwijderen worden vanaf nu vastgelegd.",
2883
+ historyLoading: "Geschiedenis laden\u2026",
2884
+ historyFailed: "De geschiedenis kon niet worden geladen.",
2885
+ historyRefresh: "Geschiedenis vernieuwen",
2886
+ historySystem: "Systeem",
2887
+ "historyActions.create": "Aangemaakt",
2888
+ "historyActions.update": "Opgeslagen",
2889
+ "historyActions.publish": "Gepubliceerd",
2890
+ "historyActions.unpublish": "Publicatie ingetrokken",
2891
+ "historyActions.discard": "Concept verworpen",
2892
+ "historyActions.delete": "Verwijderd",
2893
+ "historyActions.restore": "Hersteld",
2894
+ historyInitial: "Eerste versie",
2895
+ historyNoChange: "Geen inhoudelijke wijziging",
2896
+ historyMissing: "Niet vastgelegd (vastleggen mislukt)",
2897
+ historyBlocksSummary: "Blokken: {added} toegevoegd, {removed} verwijderd, {changed} gewijzigd",
2898
+ historyFieldsSummary: "Velden: {fields}",
2899
+ historyNotKept: "Deze versie wordt niet meer bewaard.",
2900
+ historyCompare: "Vergeleken met het formulier",
2901
+ historySame: "Zelfde inhoud als het formulier.",
2902
+ "diffOps.added": "Toegevoegd",
2903
+ "diffOps.removed": "Verwijderd",
2904
+ "diffOps.changed": "Gewijzigd",
2905
+ historyDiffFields: "Afwijkende velden: {fields}",
2906
+ historyDiffNote: "Relaties worden niet vergeleken.",
2907
+ historyLoad: "Deze versie laden",
2908
+ historyLoaded: "Versie in het formulier geladen. Er wordt niets opgeslagen totdat je opslaat.",
2909
+ historyLeft: "Gelaten zoals ze zijn: {fields}",
2910
+ historyRemovedFields: "Niet meer in het schema, niet geladen: {fields}",
2911
+ historyMissingItems: "Bestaan niet meer, weggelaten: {media} mediabestanden, {relations} gekoppelde items, {blocks} blokken",
2912
+ historyLoadFailed: "Deze versie kon niet worden geladen.",
2913
+ historyShowMore: "Meer tonen",
2914
+ historySettings: "Versiegeschiedenis",
2915
+ historySettingsHelp: "Legt elke aanmaak, opslag, publicatie, intrekking, verwerping en verwijdering via de document service van Strapi vast (de admin, de REST- en GraphQL-API's, andere plugins), met een momentopname van de inhoud. Redacteuren zien de versies in de bewerkweergave en kunnen er een in het formulier laden. Dit is inhoudsactiviteit, geen beveiligingsauditlog: rechtstreekse schrijfacties in de database worden niet gezien.",
2916
+ historyEnabled: "Versies vastleggen",
2917
+ historyAll: "Alle inhoudstypen",
2918
+ historyTypes: "Inhoudstypen",
2919
+ historyRetention: "Momentopnamen bewaren (dagen)",
2920
+ historyMax: "Momentopnamen per document (maximum)",
2921
+ historyEventDays: "Activiteit bewaren (dagen)",
2922
+ historyRetentionHelp: "Een nachtelijke taak leegt momentopnamen die ouder zijn of boven het maximum per document uitkomen (de nieuwste blijven) en verwijdert activiteit die ouder is dan de limiet. Mediabestanden worden nooit verwijderd.",
2923
+ historyInvalid: "Gehele getallen: 1 tot 3650 dagen (de activiteit minstens zo lang bewaard als de momentopnamen) en 1 tot 1000 momentopnamen."
2525
2924
  };
2526
2925
 
2527
2926
  // admin/messages.ts
@@ -4214,14 +4613,14 @@ function useInitialAccordions({
4214
4613
  };
4215
4614
  document.addEventListener("click", cancel, true);
4216
4615
  const timer = setInterval(() => {
4217
- const pending = latest.current.filter((zone) => zone.count > 0);
4218
- const ready = pending.length > 0 && pending.every((zone) => {
4616
+ const pending2 = latest.current.filter((zone) => zone.count > 0);
4617
+ const ready = pending2.length > 0 && pending2.every((zone) => {
4219
4618
  const list = findZoneList(zone.label);
4220
4619
  return list && toggles(list).length >= zone.count;
4221
4620
  }) && (editor.initialState !== "remember" || user.current);
4222
4621
  if (!ready && ++tries < 25) return;
4223
4622
  stop();
4224
- for (const zone of pending) {
4623
+ for (const zone of pending2) {
4225
4624
  const list = findZoneList(zone.label);
4226
4625
  if (!list) continue;
4227
4626
  const key = memoryKey({
@@ -4436,6 +4835,49 @@ var Checks = styled4.fieldset`
4436
4835
  legend { font-size: 12px; font-weight: 600; margin-bottom: 4px; }
4437
4836
  label { display: inline-flex; align-items: center; gap: 6px; }
4438
4837
  `;
4838
+ var DAYS = (n) => Number.isInteger(n) && n >= 1 && n <= 3650;
4839
+ var badRetention = (h) => !h || !DAYS(h.retentionDays) || !DAYS(h.eventDays) || h.eventDays < h.retentionDays || !(Number.isInteger(h.maxSnapshots) && h.maxSnapshots >= 1 && h.maxSnapshots <= 1e3);
4840
+ function HistorySettings({ types, history, set, t, disabled, ToggleField: ToggleField2, TextField: TextField2 }) {
4841
+ const all = history.contentTypes === "all";
4842
+ const list = all ? [] : history.contentTypes;
4843
+ const number = (key) => /* @__PURE__ */ jsx6(Box2, { style: { minWidth: 200 }, children: /* @__PURE__ */ jsx6(
4844
+ TextField2,
4845
+ {
4846
+ name: `history-${key}`,
4847
+ label: t[{ retentionDays: "historyRetention", maxSnapshots: "historyMax", eventDays: "historyEventDays" }[key]],
4848
+ value: Number.isFinite(history[key]) ? String(history[key]) : "",
4849
+ disabled,
4850
+ onChange: (v) => set(key, /^\d{1,5}$/.test(v.trim()) ? Number(v.trim()) : NaN)
4851
+ }
4852
+ ) });
4853
+ return /* @__PURE__ */ jsx6(Box2, { padding: 6, background: "neutral0", hasRadius: true, children: /* @__PURE__ */ jsxs4(Flex3, { direction: "column", alignItems: "stretch", gap: 4, "data-testid": "history-settings", children: [
4854
+ /* @__PURE__ */ jsx6(Typography3, { variant: "beta", tag: "h2", children: t.historySettings }),
4855
+ /* @__PURE__ */ jsx6(Typography3, { variant: "pi", textColor: "neutral600", children: t.historySettingsHelp }),
4856
+ /* @__PURE__ */ jsx6(ToggleField2, { name: "history-enabled", label: t.historyEnabled, value: history.enabled, disabled, onChange: (v) => set("enabled", v) }),
4857
+ /* @__PURE__ */ jsx6(ToggleField2, { name: "history-all", label: t.historyAll, value: all, disabled: disabled || !history.enabled, onChange: (v) => set("contentTypes", v ? "all" : types.map((type) => type.uid)) }),
4858
+ !all && /* @__PURE__ */ jsxs4(Checks, { disabled: disabled || !history.enabled, children: [
4859
+ /* @__PURE__ */ jsx6("legend", { children: t.historyTypes }),
4860
+ types.map((type) => /* @__PURE__ */ jsxs4("label", { children: [
4861
+ /* @__PURE__ */ jsx6(
4862
+ "input",
4863
+ {
4864
+ type: "checkbox",
4865
+ name: `history-type-${type.uid}`,
4866
+ checked: list.includes(type.uid),
4867
+ onChange: (e) => set("contentTypes", e.target.checked ? [...list, type.uid] : list.filter((uid) => uid !== type.uid))
4868
+ }
4869
+ ),
4870
+ type.displayName
4871
+ ] }, type.uid))
4872
+ ] }),
4873
+ /* @__PURE__ */ jsxs4(Flex3, { gap: 4, wrap: "wrap", alignItems: "flex-end", children: [
4874
+ number("retentionDays"),
4875
+ number("maxSnapshots"),
4876
+ number("eventDays")
4877
+ ] }),
4878
+ /* @__PURE__ */ jsx6(Typography3, { variant: "pi", textColor: badRetention(history) ? "danger600" : "neutral600", role: badRetention(history) ? "alert" : void 0, children: badRetention(history) ? t.historyInvalid : t.historyRetentionHelp })
4879
+ ] }) });
4880
+ }
4439
4881
  function SidebarEditor({ type, entry, set, t, disabled, SelectField: SelectField2, TextField: TextField2 }) {
4440
4882
  const items = entry.sidebar || [];
4441
4883
  const save = (next) => set("sidebar", next.length ? next : void 0, void 0);
@@ -4565,7 +5007,8 @@ function Settings({ useClient, usePermissions: usePermissions2, MediaPicker: Med
4565
5007
  const badColor = settings && (Object.values(settings.palette).some((value) => !COLOR2.test(value)) || [settings.editor.previewUrl, settings.editor.blockPreviewUrl].some((url) => url && !/^https?:\/\/\S+$/.test(url)));
4566
5008
  const badSidebar = settings && Object.values(settings.contentTypes || {}).some((entry) => (entry.sidebar || []).some(badItem));
4567
5009
  const badLazy = settings && badUids(settings.editor.lazyFields);
4568
- const invalid = badColor || badSidebar || badLazy;
5010
+ const badHistory = settings && data?.historyTypes && badRetention(settings.history);
5011
+ const invalid = badColor || badSidebar || badLazy || badHistory;
4569
5012
  const save = async () => {
4570
5013
  if (!settings || invalid || !canUpdate) return;
4571
5014
  setSaving(true);
@@ -4690,6 +5133,11 @@ function Settings({ useClient, usePermissions: usePermissions2, MediaPicker: Med
4690
5133
  s.editor.showRowThumbnails = v;
4691
5134
  return s;
4692
5135
  }) }),
5136
+ /* @__PURE__ */ jsx6(ToggleField2, { name: "editor-friendlyLabels", label: t.friendlyLabels, value: editor.friendlyLabels !== false, disabled: !canUpdate || saving, onChange: (v) => update((s) => {
5137
+ s.editor.friendlyLabels = v;
5138
+ return s;
5139
+ }) }),
5140
+ /* @__PURE__ */ jsx6(Typography3, { variant: "pi", textColor: "neutral600", children: t.friendlyLabelsHelp }),
4693
5141
  /* @__PURE__ */ jsx6(
4694
5142
  SelectField2,
4695
5143
  {
@@ -4810,6 +5258,21 @@ function Settings({ useClient, usePermissions: usePermissions2, MediaPicker: Med
4810
5258
  ),
4811
5259
  /* @__PURE__ */ jsx6(Typography3, { variant: "pi", textColor: "neutral600", children: data.hiddenAttribute ? t.hiddenBlocksHelp : t.hiddenAttributeOff })
4812
5260
  ] }) }),
5261
+ data.historyTypes && settings.history && /* @__PURE__ */ jsx6(
5262
+ HistorySettings,
5263
+ {
5264
+ types: data.historyTypes,
5265
+ history: settings.history,
5266
+ t,
5267
+ disabled: !canUpdate || saving,
5268
+ ToggleField: ToggleField2,
5269
+ TextField: TextField2,
5270
+ set: (key, value) => update((s) => {
5271
+ s.history = { ...s.history, [key]: value };
5272
+ return s;
5273
+ })
5274
+ }
5275
+ ),
4813
5276
  (data.contentTypes || []).length > 0 && /* @__PURE__ */ jsx6(Box2, { padding: 6, background: "neutral0", hasRadius: true, children: /* @__PURE__ */ jsxs4(Flex3, { direction: "column", alignItems: "stretch", gap: 4, "data-testid": "content-types", children: [
4814
5277
  /* @__PURE__ */ jsx6(Typography3, { variant: "beta", tag: "h2", children: t.contentTypes }),
4815
5278
  /* @__PURE__ */ jsx6(Typography3, { variant: "pi", textColor: "neutral600", children: t.contentTypesHelp }),
@@ -4972,11 +5435,17 @@ function register(app, Component2, to) {
4972
5435
 
4973
5436
  // admin/catalog.ts
4974
5437
  import * as React6 from "react";
5438
+ var cached = null;
5439
+ var pending = null;
5440
+ var load = (get) => get("/blockscene/catalog").then(({ data }) => {
5441
+ cached = data;
5442
+ return data;
5443
+ });
4975
5444
  function useCatalog(get) {
4976
5445
  const [catalog, setCatalog] = React6.useState(null);
4977
5446
  React6.useEffect(() => {
4978
5447
  let active = true;
4979
- get("/blockscene/catalog").then(({ data }) => {
5448
+ load(get).then((data) => {
4980
5449
  if (active) setCatalog(data);
4981
5450
  }).catch(() => {
4982
5451
  if (active) setCatalog(null);
@@ -4987,6 +5456,27 @@ function useCatalog(get) {
4987
5456
  }, [get]);
4988
5457
  return catalog;
4989
5458
  }
5459
+ var adminLocale = () => {
5460
+ try {
5461
+ return localStorage.getItem("strapi-admin-language") || document.documentElement.lang || "en";
5462
+ } catch {
5463
+ return "en";
5464
+ }
5465
+ };
5466
+ var labelsHook = (get, relabel, drop) => (args) => {
5467
+ try {
5468
+ if (!cached) pending || (pending = load(get()).catch(() => {
5469
+ }).finally(() => {
5470
+ pending = null;
5471
+ }));
5472
+ const trimmed = drop(args.layout, cached ? cached.hiddenAttribute : "bsHidden");
5473
+ const layout = cached ? relabel(trimmed, cached, adminLocale()) : trimmed;
5474
+ return layout === args.layout ? args : { ...args, layout };
5475
+ } catch (error) {
5476
+ console.error("[blockscene] field labels skipped after an error:", error);
5477
+ return args;
5478
+ }
5479
+ };
4990
5480
 
4991
5481
  // admin/Guard.tsx
4992
5482
  import * as React7 from "react";
@@ -5054,7 +5544,8 @@ function Picker() {
5054
5544
  !c.addComponentToDynamicZone
5055
5545
  ).map((zone) => ({
5056
5546
  ...zone,
5057
- label: schema?.metadatas?.[zone.name]?.edit?.label || zone.name
5547
+ // The rendered label: the edit layout's (field labels may have rewritten it), else the stored metadata.
5548
+ label: schema?.layouts?.edit?.flat().find((field) => field?.name === zone.name)?.metadatas?.label || schema?.metadatas?.[zone.name]?.edit?.label || zone.name
5058
5549
  }));
5059
5550
  const add = (zone, uid) => {
5060
5551
  const close = catalog?.groups?.[uid];
@@ -5171,6 +5662,7 @@ var strapi4_default = {
5171
5662
  },
5172
5663
  registerTrads,
5173
5664
  bootstrap(app) {
5665
+ app.registerHook("Admin/CM/pages/EditView/mutate-edit-view-layout", labelsHook(() => getFetchClient().get, labelEditLayout4, dropField4));
5174
5666
  app.injectContentManagerComponent("editView", "right-links", {
5175
5667
  name: "blockscene",
5176
5668
  Component: () => /* @__PURE__ */ jsx8(Guard, { children: /* @__PURE__ */ jsx8(Picker, {}) })