@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.cjs CHANGED
@@ -316,6 +316,50 @@ function initialState(editor, remembered) {
316
316
  if (editor?.initialState === "remember") return remembered || "closed";
317
317
  return "closed";
318
318
  }
319
+ var withoutField = (rows, name) => rows.map((row) => row.filter((field) => field?.name !== name)).filter((row) => row.length);
320
+ function dropField4(layout, name) {
321
+ if (!name || !layout?.components) return layout;
322
+ 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])) };
323
+ }
324
+ function humanize(name) {
325
+ 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(" ");
326
+ return text.charAt(0).toUpperCase() + text.slice(1);
327
+ }
328
+ function localized(value, locale = "en") {
329
+ if (typeof value === "string") return value;
330
+ if (!value || typeof value !== "object") return void 0;
331
+ const keys = Object.keys(value);
332
+ const lang = (key2) => key2.toLowerCase().split("-")[0];
333
+ const lower = String(locale || "en").toLowerCase();
334
+ 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];
335
+ return key === void 0 ? void 0 : value[key];
336
+ }
337
+ function fieldText(fields, owner, name, label, locale, on) {
338
+ const entry = owner && fields?.[owner]?.[name] || {};
339
+ const out = {};
340
+ const text = localized(entry.label, locale) ?? (on && label === name ? humanize(name) : void 0);
341
+ if (text !== void 0) out.label = text;
342
+ for (const key of ["description", "placeholder"]) {
343
+ const value = localized(entry[key], locale);
344
+ if (value !== void 0) out[key] = value;
345
+ }
346
+ return Object.keys(out).length ? out : null;
347
+ }
348
+ var labelsOff = (catalog) => !catalog?.editor?.enabled || !catalog.editor.friendlyLabels && !Object.keys(catalog.fields || {}).length;
349
+ function labelEditLayout4(layout, catalog, locale) {
350
+ const uid = layout?.contentType?.uid;
351
+ if (labelsOff(catalog) || !uid || catalog.contentTypes?.[uid]?.enabled === false) return layout;
352
+ const fix = (owner) => (field) => {
353
+ const text = field?.metadatas && fieldText(catalog.fields, owner, field.name, field.metadatas.label, locale, catalog.editor.friendlyLabels);
354
+ return text ? { ...field, metadatas: { ...field.metadatas, ...text } } : field;
355
+ };
356
+ const rows = (target, owner) => Array.isArray(target?.layouts?.edit) ? { ...target, layouts: { ...target.layouts, edit: target.layouts.edit.map((row) => row.map(fix(owner))) } } : target;
357
+ return {
358
+ ...layout,
359
+ contentType: rows(layout.contentType, uid),
360
+ components: Object.fromEntries(Object.entries(layout.components || {}).map(([cuid, component]) => [cuid, rows(component, cuid)]))
361
+ };
362
+ }
319
363
 
320
364
  // admin/preview.mjs
321
365
  var import_groups = __toESM(require_groups(), 1);
@@ -519,11 +563,11 @@ function setAll(list, open, batch = (run) => run()) {
519
563
  }
520
564
  const changed = click(now.map((i) => rows[i]));
521
565
  if (!later.length) return changed;
522
- const pending = later.map((i) => rows[i]);
566
+ const pending2 = later.map((i) => rows[i]);
523
567
  const slice = (deadline) => {
524
568
  if (stopped) return;
525
- click(pending.splice(0, deadline.timeRemaining() > 10 ? PER_FRAME : 1));
526
- if (pending.length) idle(slice);
569
+ click(pending2.splice(0, deadline.timeRemaining() > 10 ? PER_FRAME : 1));
570
+ if (pending2.length) idle(slice);
527
571
  else jobs.delete(list);
528
572
  };
529
573
  idle(slice);
@@ -535,7 +579,9 @@ function setAll(list, open, batch = (run) => run()) {
535
579
  function isNativeAddButton(button, zone) {
536
580
  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;
537
581
  const text = (button.textContent || "").trim();
538
- return Boolean(text) && new RegExp(`(^|\\s)${String(zone.name).replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`).test(text);
582
+ const escape = (value) => String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
583
+ const names = [...new Set([zone.name, zone.label].filter(Boolean))].map(escape).join("|");
584
+ return Boolean(text) && new RegExp(`(^|\\s)(${names})$`).test(text);
539
585
  }
540
586
 
541
587
  // admin/wireframes.tsx
@@ -658,7 +704,6 @@ var en_default = {
658
704
  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.",
659
705
  previewNoUrl: "No preview URL: set it in Settings, Blockscene, or configure Strapi's native Preview for this content type.",
660
706
  previewFailed: "The preview did not answer within 15 s. If the frontend is still loading it will appear by itself; the form stays usable.",
661
- previewReady: "Page preview \xB7 unsaved changes",
662
707
  previewLoading: "Loading preview\u2026",
663
708
  retry: "Try again",
664
709
  editText: "Edit text",
@@ -816,12 +861,57 @@ var en_default = {
816
861
  confirmDeleteOption: "Confirm before deleting a block",
817
862
  duplicateOption: 'Show "Duplicate" on each block',
818
863
  clipboardOption: 'Show "Copy" and "Paste" (across pages)',
864
+ friendlyLabels: "Friendly field labels",
865
+ 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.`,
819
866
  hiddenBlocks: "Blocks hidden on the site",
820
867
  "hiddenModes.strip": "Removed from the content API",
821
868
  "hiddenModes.flag": "Sent with the flag (the frontend decides)",
822
869
  "hiddenModes.off": "Off (no hide button)",
823
870
  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.",
824
- hiddenAttributeOff: "The plugin config sets hiddenAttribute to false: blocks cannot be hidden."
871
+ hiddenAttributeOff: "The plugin config sets hiddenAttribute to false: blocks cannot be hidden.",
872
+ historyTitle: "History",
873
+ historyEmpty: "No versions yet. Saves, publishes and deletes are recorded from now on.",
874
+ historyLoading: "Loading history\u2026",
875
+ historyFailed: "The history could not be loaded.",
876
+ historyRefresh: "Refresh history",
877
+ historySystem: "System",
878
+ "historyActions.create": "Created",
879
+ "historyActions.update": "Saved",
880
+ "historyActions.publish": "Published",
881
+ "historyActions.unpublish": "Unpublished",
882
+ "historyActions.discard": "Draft discarded",
883
+ "historyActions.delete": "Deleted",
884
+ "historyActions.restore": "Restored",
885
+ historyInitial: "First version",
886
+ historyNoChange: "No content change",
887
+ historyMissing: "Not recorded (the capture failed)",
888
+ historyBlocksSummary: "Blocks: {added} added, {removed} removed, {changed} changed",
889
+ historyFieldsSummary: "Fields: {fields}",
890
+ historyNotKept: "This version is no longer kept.",
891
+ historyCompare: "Compared with the form",
892
+ historySame: "Same content as the form.",
893
+ "diffOps.added": "Added",
894
+ "diffOps.removed": "Removed",
895
+ "diffOps.changed": "Changed",
896
+ historyDiffFields: "Fields that differ: {fields}",
897
+ historyDiffNote: "Relations are not compared.",
898
+ historyLoad: "Load this version",
899
+ historyLoaded: "Version loaded into the form. Nothing is saved until you save.",
900
+ historyLeft: "Left as they are: {fields}",
901
+ historyRemovedFields: "No longer in the schema, not loaded: {fields}",
902
+ historyMissingItems: "No longer exist, left out: {media} media files, {relations} related entries, {blocks} blocks",
903
+ historyLoadFailed: "This version could not be loaded.",
904
+ historyShowMore: "Show more",
905
+ historySettings: "Version history",
906
+ 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.",
907
+ historyEnabled: "Record versions",
908
+ historyAll: "All content types",
909
+ historyTypes: "Content types",
910
+ historyRetention: "Keep snapshots (days)",
911
+ historyMax: "Snapshots per document (maximum)",
912
+ historyEventDays: "Keep the activity (days)",
913
+ 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.",
914
+ historyInvalid: "Whole numbers: 1 to 3650 days (the activity kept at least as long as the snapshots) and 1 to 1000 snapshots."
825
915
  };
826
916
 
827
917
  // admin/translations/pt-BR.json
@@ -899,7 +989,6 @@ var pt_BR_default = {
899
989
  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.",
900
990
  previewNoUrl: "Sem URL de preview: defina em Configura\xE7\xF5es, Blockscene, ou configure a Preview nativa do Strapi para este tipo de conte\xFAdo.",
901
991
  previewFailed: "A preview n\xE3o respondeu em 15 s. Se o frontend ainda estiver carregando, ela aparece sozinha; o formul\xE1rio continua utiliz\xE1vel.",
902
- previewReady: "Preview da p\xE1gina \xB7 altera\xE7\xF5es n\xE3o salvas",
903
992
  previewLoading: "Carregando preview\u2026",
904
993
  retry: "Tentar novamente",
905
994
  editText: "Editar texto",
@@ -1057,12 +1146,57 @@ var pt_BR_default = {
1057
1146
  confirmDeleteOption: "Confirmar antes de excluir um bloco",
1058
1147
  duplicateOption: 'Mostrar "Duplicar" em cada bloco',
1059
1148
  clipboardOption: 'Mostrar "Copiar" e "Colar" (entre p\xE1ginas)',
1149
+ friendlyLabels: "R\xF3tulos de campo amig\xE1veis",
1150
+ 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.',
1060
1151
  hiddenBlocks: "Blocos ocultos no site",
1061
1152
  "hiddenModes.strip": "Removidos da API de conte\xFAdo",
1062
1153
  "hiddenModes.flag": "Enviados com a marca\xE7\xE3o (o frontend decide)",
1063
1154
  "hiddenModes.off": "Desligado (sem bot\xE3o de ocultar)",
1064
1155
  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.",
1065
- hiddenAttributeOff: "A config do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos."
1156
+ hiddenAttributeOff: "A config do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos.",
1157
+ historyTitle: "Hist\xF3rico",
1158
+ historyEmpty: "Nenhuma vers\xE3o ainda. Salvamentos, publica\xE7\xF5es e exclus\xF5es passam a ser registrados a partir de agora.",
1159
+ historyLoading: "Carregando hist\xF3rico\u2026",
1160
+ historyFailed: "N\xE3o foi poss\xEDvel carregar o hist\xF3rico.",
1161
+ historyRefresh: "Atualizar hist\xF3rico",
1162
+ historySystem: "Sistema",
1163
+ "historyActions.create": "Criado",
1164
+ "historyActions.update": "Salvo",
1165
+ "historyActions.publish": "Publicado",
1166
+ "historyActions.unpublish": "Despublicado",
1167
+ "historyActions.discard": "Rascunho descartado",
1168
+ "historyActions.delete": "Exclu\xEDdo",
1169
+ "historyActions.restore": "Restaurado",
1170
+ historyInitial: "Primeira vers\xE3o",
1171
+ historyNoChange: "Sem mudan\xE7a de conte\xFAdo",
1172
+ historyMissing: "N\xE3o registrado (a captura falhou)",
1173
+ historyBlocksSummary: "Blocos: {added} adicionados, {removed} removidos, {changed} alterados",
1174
+ historyFieldsSummary: "Campos: {fields}",
1175
+ historyNotKept: "Esta vers\xE3o n\xE3o \xE9 mais mantida.",
1176
+ historyCompare: "Comparado com o formul\xE1rio",
1177
+ historySame: "Mesmo conte\xFAdo do formul\xE1rio.",
1178
+ "diffOps.added": "Adicionado",
1179
+ "diffOps.removed": "Removido",
1180
+ "diffOps.changed": "Alterado",
1181
+ historyDiffFields: "Campos diferentes: {fields}",
1182
+ historyDiffNote: "Rela\xE7\xF5es n\xE3o s\xE3o comparadas.",
1183
+ historyLoad: "Carregar esta vers\xE3o",
1184
+ historyLoaded: "Vers\xE3o carregada no formul\xE1rio. Nada \xE9 salvo at\xE9 voc\xEA salvar.",
1185
+ historyLeft: "Mantidos como est\xE3o: {fields}",
1186
+ historyRemovedFields: "N\xE3o existem mais no schema, n\xE3o carregados: {fields}",
1187
+ historyMissingItems: "N\xE3o existem mais, deixados de fora: {media} arquivos de m\xEDdia, {relations} entradas relacionadas, {blocks} blocos",
1188
+ historyLoadFailed: "N\xE3o foi poss\xEDvel carregar esta vers\xE3o.",
1189
+ historyShowMore: "Mostrar mais",
1190
+ historySettings: "Hist\xF3rico de vers\xF5es",
1191
+ 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.",
1192
+ historyEnabled: "Registrar vers\xF5es",
1193
+ historyAll: "Todos os tipos de conte\xFAdo",
1194
+ historyTypes: "Tipos de conte\xFAdo",
1195
+ historyRetention: "Manter snapshots (dias)",
1196
+ historyMax: "Snapshots por documento (m\xE1ximo)",
1197
+ historyEventDays: "Manter a atividade (dias)",
1198
+ 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.",
1199
+ historyInvalid: "N\xFAmeros inteiros: 1 a 3650 dias (a atividade mantida pelo menos tanto quanto os snapshots) e 1 a 1000 snapshots."
1066
1200
  };
1067
1201
 
1068
1202
  // admin/translations/pt.json
@@ -1140,7 +1274,6 @@ var pt_default = {
1140
1274
  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.",
1141
1275
  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.",
1142
1276
  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.",
1143
- previewReady: "Pr\xE9-visualiza\xE7\xE3o da p\xE1gina \xB7 altera\xE7\xF5es por guardar",
1144
1277
  previewLoading: "A carregar pr\xE9-visualiza\xE7\xE3o\u2026",
1145
1278
  retry: "Tentar novamente",
1146
1279
  editText: "Editar texto",
@@ -1298,12 +1431,57 @@ var pt_default = {
1298
1431
  confirmDeleteOption: "Confirmar antes de eliminar um bloco",
1299
1432
  duplicateOption: 'Mostrar "Duplicar" em cada bloco',
1300
1433
  clipboardOption: 'Mostrar "Copiar" e "Colar" (entre p\xE1ginas)',
1434
+ friendlyLabels: "Etiquetas de campo leg\xEDveis",
1435
+ 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.',
1301
1436
  hiddenBlocks: "Blocos ocultos no site",
1302
1437
  "hiddenModes.strip": "Removidos da API de conte\xFAdo",
1303
1438
  "hiddenModes.flag": "Enviados com a marca\xE7\xE3o (o frontend decide)",
1304
1439
  "hiddenModes.off": "Desligado (sem bot\xE3o de ocultar)",
1305
1440
  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.",
1306
- hiddenAttributeOff: "A configura\xE7\xE3o do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos."
1441
+ hiddenAttributeOff: "A configura\xE7\xE3o do plugin define hiddenAttribute como false: n\xE3o \xE9 poss\xEDvel ocultar blocos.",
1442
+ historyTitle: "Hist\xF3rico",
1443
+ 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.",
1444
+ historyLoading: "A carregar o hist\xF3rico\u2026",
1445
+ historyFailed: "N\xE3o foi poss\xEDvel carregar o hist\xF3rico.",
1446
+ historyRefresh: "Atualizar hist\xF3rico",
1447
+ historySystem: "Sistema",
1448
+ "historyActions.create": "Criado",
1449
+ "historyActions.update": "Guardado",
1450
+ "historyActions.publish": "Publicado",
1451
+ "historyActions.unpublish": "Despublicado",
1452
+ "historyActions.discard": "Rascunho descartado",
1453
+ "historyActions.delete": "Eliminado",
1454
+ "historyActions.restore": "Restaurado",
1455
+ historyInitial: "Primeira vers\xE3o",
1456
+ historyNoChange: "Sem altera\xE7\xE3o de conte\xFAdo",
1457
+ historyMissing: "N\xE3o registado (a captura falhou)",
1458
+ historyBlocksSummary: "Blocos: {added} adicionados, {removed} removidos, {changed} alterados",
1459
+ historyFieldsSummary: "Campos: {fields}",
1460
+ historyNotKept: "Esta vers\xE3o j\xE1 n\xE3o \xE9 mantida.",
1461
+ historyCompare: "Comparado com o formul\xE1rio",
1462
+ historySame: "Mesmo conte\xFAdo do formul\xE1rio.",
1463
+ "diffOps.added": "Adicionado",
1464
+ "diffOps.removed": "Removido",
1465
+ "diffOps.changed": "Alterado",
1466
+ historyDiffFields: "Campos diferentes: {fields}",
1467
+ historyDiffNote: "As rela\xE7\xF5es n\xE3o s\xE3o comparadas.",
1468
+ historyLoad: "Carregar esta vers\xE3o",
1469
+ historyLoaded: "Vers\xE3o carregada no formul\xE1rio. Nada \xE9 guardado at\xE9 guardar.",
1470
+ historyLeft: "Mantidos como est\xE3o: {fields}",
1471
+ historyRemovedFields: "J\xE1 n\xE3o existem no esquema, n\xE3o carregados: {fields}",
1472
+ historyMissingItems: "J\xE1 n\xE3o existem, deixados de fora: {media} ficheiros multim\xE9dia, {relations} entradas relacionadas, {blocks} blocos",
1473
+ historyLoadFailed: "N\xE3o foi poss\xEDvel carregar esta vers\xE3o.",
1474
+ historyShowMore: "Mostrar mais",
1475
+ historySettings: "Hist\xF3rico de vers\xF5es",
1476
+ 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.",
1477
+ historyEnabled: "Registar vers\xF5es",
1478
+ historyAll: "Todos os tipos de conte\xFAdo",
1479
+ historyTypes: "Tipos de conte\xFAdo",
1480
+ historyRetention: "Manter snapshots (dias)",
1481
+ historyMax: "Snapshots por documento (m\xE1ximo)",
1482
+ historyEventDays: "Manter a atividade (dias)",
1483
+ 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.",
1484
+ historyInvalid: "N\xFAmeros inteiros: 1 a 3650 dias (a atividade mantida pelo menos tanto quanto os snapshots) e 1 a 1000 snapshots."
1307
1485
  };
1308
1486
 
1309
1487
  // admin/translations/fr.json
@@ -1381,7 +1559,6 @@ var fr_default = {
1381
1559
  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.",
1382
1560
  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.",
1383
1561
  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.",
1384
- previewReady: "Aper\xE7u de la page \xB7 modifications non enregistr\xE9es",
1385
1562
  previewLoading: "Chargement de l'aper\xE7u\u2026",
1386
1563
  retry: "R\xE9essayer",
1387
1564
  editText: "Modifier le texte",
@@ -1539,12 +1716,57 @@ var fr_default = {
1539
1716
  confirmDeleteOption: "Confirmer avant de supprimer un bloc",
1540
1717
  duplicateOption: "Afficher \xAB Dupliquer \xBB sur chaque bloc",
1541
1718
  clipboardOption: "Afficher \xAB Copier \xBB et \xAB Coller \xBB (entre pages)",
1719
+ friendlyLabels: "Libell\xE9s de champ lisibles",
1720
+ 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.`,
1542
1721
  hiddenBlocks: "Blocs masqu\xE9s sur le site",
1543
1722
  "hiddenModes.strip": "Retir\xE9s de l'API de contenu",
1544
1723
  "hiddenModes.flag": "Envoy\xE9s avec l'indicateur (le frontend d\xE9cide)",
1545
1724
  "hiddenModes.off": "D\xE9sactiv\xE9 (pas de bouton masquer)",
1546
1725
  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.",
1547
- hiddenAttributeOff: "La configuration du plugin fixe hiddenAttribute \xE0 false : les blocs ne peuvent pas \xEAtre masqu\xE9s."
1726
+ hiddenAttributeOff: "La configuration du plugin fixe hiddenAttribute \xE0 false : les blocs ne peuvent pas \xEAtre masqu\xE9s.",
1727
+ historyTitle: "Historique",
1728
+ historyEmpty: "Aucune version pour l'instant. Les enregistrements, publications et suppressions sont d\xE9sormais consign\xE9s.",
1729
+ historyLoading: "Chargement de l'historique\u2026",
1730
+ historyFailed: "Impossible de charger l'historique.",
1731
+ historyRefresh: "Actualiser l'historique",
1732
+ historySystem: "Syst\xE8me",
1733
+ "historyActions.create": "Cr\xE9\xE9",
1734
+ "historyActions.update": "Enregistr\xE9",
1735
+ "historyActions.publish": "Publi\xE9",
1736
+ "historyActions.unpublish": "D\xE9publi\xE9",
1737
+ "historyActions.discard": "Brouillon abandonn\xE9",
1738
+ "historyActions.delete": "Supprim\xE9",
1739
+ "historyActions.restore": "Restaur\xE9",
1740
+ historyInitial: "Premi\xE8re version",
1741
+ historyNoChange: "Aucun changement de contenu",
1742
+ historyMissing: "Non consign\xE9 (la capture a \xE9chou\xE9)",
1743
+ historyBlocksSummary: "Blocs : {added} ajout\xE9s, {removed} supprim\xE9s, {changed} modifi\xE9s",
1744
+ historyFieldsSummary: "Champs : {fields}",
1745
+ historyNotKept: "Cette version n'est plus conserv\xE9e.",
1746
+ historyCompare: "Compar\xE9 au formulaire",
1747
+ historySame: "M\xEAme contenu que le formulaire.",
1748
+ "diffOps.added": "Ajout\xE9",
1749
+ "diffOps.removed": "Supprim\xE9",
1750
+ "diffOps.changed": "Modifi\xE9",
1751
+ historyDiffFields: "Champs diff\xE9rents : {fields}",
1752
+ historyDiffNote: "Les relations ne sont pas compar\xE9es.",
1753
+ historyLoad: "Charger cette version",
1754
+ historyLoaded: "Version charg\xE9e dans le formulaire. Rien n'est enregistr\xE9 tant que vous n'enregistrez pas.",
1755
+ historyLeft: "Laiss\xE9s tels quels : {fields}",
1756
+ historyRemovedFields: "N'existent plus dans le sch\xE9ma, non charg\xE9s : {fields}",
1757
+ historyMissingItems: "N'existent plus, laiss\xE9s de c\xF4t\xE9 : {media} fichiers m\xE9dia, {relations} entr\xE9es li\xE9es, {blocks} blocs",
1758
+ historyLoadFailed: "Impossible de charger cette version.",
1759
+ historyShowMore: "Afficher plus",
1760
+ historySettings: "Historique des versions",
1761
+ 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.",
1762
+ historyEnabled: "Consigner les versions",
1763
+ historyAll: "Tous les types de contenu",
1764
+ historyTypes: "Types de contenu",
1765
+ historyRetention: "Conserver les instantan\xE9s (jours)",
1766
+ historyMax: "Instantan\xE9s par document (maximum)",
1767
+ historyEventDays: "Conserver l'activit\xE9 (jours)",
1768
+ 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.",
1769
+ 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."
1548
1770
  };
1549
1771
 
1550
1772
  // admin/translations/es.json
@@ -1622,7 +1844,6 @@ var es_default = {
1622
1844
  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.",
1623
1845
  previewNoUrl: "Sin URL de vista previa: def\xEDnala en Ajustes, Blockscene, o configure la Vista previa nativa de Strapi para este tipo de contenido.",
1624
1846
  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.",
1625
- previewReady: "Vista previa de la p\xE1gina \xB7 cambios sin guardar",
1626
1847
  previewLoading: "Cargando vista previa\u2026",
1627
1848
  retry: "Reintentar",
1628
1849
  editText: "Editar texto",
@@ -1780,12 +2001,57 @@ var es_default = {
1780
2001
  confirmDeleteOption: "Confirmar antes de eliminar un bloque",
1781
2002
  duplicateOption: "Mostrar \xABDuplicar\xBB en cada bloque",
1782
2003
  clipboardOption: "Mostrar \xABCopiar\xBB y \xABPegar\xBB (entre p\xE1ginas)",
2004
+ friendlyLabels: "Etiquetas de campo legibles",
2005
+ 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.',
1783
2006
  hiddenBlocks: "Bloques ocultos en el sitio",
1784
2007
  "hiddenModes.strip": "Eliminados de la API de contenido",
1785
2008
  "hiddenModes.flag": "Enviados con la marca (el frontend decide)",
1786
2009
  "hiddenModes.off": "Desactivado (sin bot\xF3n de ocultar)",
1787
2010
  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.",
1788
- hiddenAttributeOff: "La configuraci\xF3n del plugin fija hiddenAttribute en false: no se pueden ocultar bloques."
2011
+ hiddenAttributeOff: "La configuraci\xF3n del plugin fija hiddenAttribute en false: no se pueden ocultar bloques.",
2012
+ historyTitle: "Historial",
2013
+ historyEmpty: "A\xFAn no hay versiones. Desde ahora se registran los guardados, las publicaciones y las eliminaciones.",
2014
+ historyLoading: "Cargando historial\u2026",
2015
+ historyFailed: "No se pudo cargar el historial.",
2016
+ historyRefresh: "Actualizar historial",
2017
+ historySystem: "Sistema",
2018
+ "historyActions.create": "Creado",
2019
+ "historyActions.update": "Guardado",
2020
+ "historyActions.publish": "Publicado",
2021
+ "historyActions.unpublish": "Despublicado",
2022
+ "historyActions.discard": "Borrador descartado",
2023
+ "historyActions.delete": "Eliminado",
2024
+ "historyActions.restore": "Restaurado",
2025
+ historyInitial: "Primera versi\xF3n",
2026
+ historyNoChange: "Sin cambios de contenido",
2027
+ historyMissing: "No registrado (la captura fall\xF3)",
2028
+ historyBlocksSummary: "Bloques: {added} a\xF1adidos, {removed} eliminados, {changed} modificados",
2029
+ historyFieldsSummary: "Campos: {fields}",
2030
+ historyNotKept: "Esta versi\xF3n ya no se conserva.",
2031
+ historyCompare: "Comparado con el formulario",
2032
+ historySame: "Mismo contenido que el formulario.",
2033
+ "diffOps.added": "A\xF1adido",
2034
+ "diffOps.removed": "Eliminado",
2035
+ "diffOps.changed": "Modificado",
2036
+ historyDiffFields: "Campos distintos: {fields}",
2037
+ historyDiffNote: "Las relaciones no se comparan.",
2038
+ historyLoad: "Cargar esta versi\xF3n",
2039
+ historyLoaded: "Versi\xF3n cargada en el formulario. No se guarda nada hasta que guardes.",
2040
+ historyLeft: "Se dejan como est\xE1n: {fields}",
2041
+ historyRemovedFields: "Ya no est\xE1n en el esquema, no se cargan: {fields}",
2042
+ historyMissingItems: "Ya no existen, se omiten: {media} archivos multimedia, {relations} entradas relacionadas, {blocks} bloques",
2043
+ historyLoadFailed: "No se pudo cargar esta versi\xF3n.",
2044
+ historyShowMore: "Mostrar m\xE1s",
2045
+ historySettings: "Historial de versiones",
2046
+ 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.",
2047
+ historyEnabled: "Registrar versiones",
2048
+ historyAll: "Todos los tipos de contenido",
2049
+ historyTypes: "Tipos de contenido",
2050
+ historyRetention: "Conservar instant\xE1neas (d\xEDas)",
2051
+ historyMax: "Instant\xE1neas por documento (m\xE1ximo)",
2052
+ historyEventDays: "Conservar la actividad (d\xEDas)",
2053
+ 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.",
2054
+ 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."
1789
2055
  };
1790
2056
 
1791
2057
  // admin/translations/de.json
@@ -1863,7 +2129,6 @@ var de_default = {
1863
2129
  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.",
1864
2130
  previewNoUrl: "Keine Vorschau-URL: in Einstellungen, Blockscene festlegen oder die native Strapi-Vorschau f\xFCr diesen Inhaltstyp konfigurieren.",
1865
2131
  previewFailed: "Die Vorschau hat innerhalb von 15 s nicht geantwortet. L\xE4dt das Frontend noch, erscheint sie von selbst; das Formular bleibt benutzbar.",
1866
- previewReady: "Seitenvorschau \xB7 ungespeicherte \xC4nderungen",
1867
2132
  previewLoading: "Vorschau wird geladen\u2026",
1868
2133
  retry: "Erneut versuchen",
1869
2134
  editText: "Text bearbeiten",
@@ -2021,12 +2286,57 @@ var de_default = {
2021
2286
  confirmDeleteOption: "Vor dem L\xF6schen eines Blocks nachfragen",
2022
2287
  duplicateOption: "\u201EDuplizieren\u201C an jedem Block anzeigen",
2023
2288
  clipboardOption: "\u201EKopieren\u201C und \u201EEinf\xFCgen\u201C anzeigen (seiten\xFCbergreifend)",
2289
+ friendlyLabels: "Lesbare Feldbezeichnungen",
2290
+ 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.",
2024
2291
  hiddenBlocks: "Auf der Website ausgeblendete Bl\xF6cke",
2025
2292
  "hiddenModes.strip": "Aus der Content-API entfernt",
2026
2293
  "hiddenModes.flag": "Mit Markierung gesendet (das Frontend entscheidet)",
2027
2294
  "hiddenModes.off": "Aus (kein Ausblenden-Knopf)",
2028
2295
  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.",
2029
- hiddenAttributeOff: "Die Plugin-Konfiguration setzt hiddenAttribute auf false: Bl\xF6cke k\xF6nnen nicht ausgeblendet werden."
2296
+ hiddenAttributeOff: "Die Plugin-Konfiguration setzt hiddenAttribute auf false: Bl\xF6cke k\xF6nnen nicht ausgeblendet werden.",
2297
+ historyTitle: "Verlauf",
2298
+ historyEmpty: "Noch keine Versionen. Speichern, Ver\xF6ffentlichen und L\xF6schen werden ab jetzt aufgezeichnet.",
2299
+ historyLoading: "Verlauf wird geladen\u2026",
2300
+ historyFailed: "Der Verlauf konnte nicht geladen werden.",
2301
+ historyRefresh: "Verlauf aktualisieren",
2302
+ historySystem: "System",
2303
+ "historyActions.create": "Erstellt",
2304
+ "historyActions.update": "Gespeichert",
2305
+ "historyActions.publish": "Ver\xF6ffentlicht",
2306
+ "historyActions.unpublish": "Ver\xF6ffentlichung zur\xFCckgezogen",
2307
+ "historyActions.discard": "Entwurf verworfen",
2308
+ "historyActions.delete": "Gel\xF6scht",
2309
+ "historyActions.restore": "Wiederhergestellt",
2310
+ historyInitial: "Erste Version",
2311
+ historyNoChange: "Keine inhaltliche \xC4nderung",
2312
+ historyMissing: "Nicht aufgezeichnet (Erfassung fehlgeschlagen)",
2313
+ historyBlocksSummary: "Bl\xF6cke: {added} hinzugef\xFCgt, {removed} entfernt, {changed} ge\xE4ndert",
2314
+ historyFieldsSummary: "Felder: {fields}",
2315
+ historyNotKept: "Diese Version wird nicht mehr aufbewahrt.",
2316
+ historyCompare: "Verglichen mit dem Formular",
2317
+ historySame: "Gleicher Inhalt wie im Formular.",
2318
+ "diffOps.added": "Hinzugef\xFCgt",
2319
+ "diffOps.removed": "Entfernt",
2320
+ "diffOps.changed": "Ge\xE4ndert",
2321
+ historyDiffFields: "Abweichende Felder: {fields}",
2322
+ historyDiffNote: "Relationen werden nicht verglichen.",
2323
+ historyLoad: "Diese Version laden",
2324
+ historyLoaded: "Version ins Formular geladen. Nichts wird gespeichert, bis Sie speichern.",
2325
+ historyLeft: "Unver\xE4ndert gelassen: {fields}",
2326
+ historyRemovedFields: "Nicht mehr im Schema, nicht geladen: {fields}",
2327
+ historyMissingItems: "Existieren nicht mehr, ausgelassen: {media} Mediendateien, {relations} verkn\xFCpfte Eintr\xE4ge, {blocks} Bl\xF6cke",
2328
+ historyLoadFailed: "Diese Version konnte nicht geladen werden.",
2329
+ historyShowMore: "Mehr anzeigen",
2330
+ historySettings: "Versionsverlauf",
2331
+ 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.",
2332
+ historyEnabled: "Versionen aufzeichnen",
2333
+ historyAll: "Alle Inhaltstypen",
2334
+ historyTypes: "Inhaltstypen",
2335
+ historyRetention: "Snapshots aufbewahren (Tage)",
2336
+ historyMax: "Snapshots pro Dokument (Maximum)",
2337
+ historyEventDays: "Aktivit\xE4t aufbewahren (Tage)",
2338
+ 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.",
2339
+ historyInvalid: "Ganze Zahlen: 1 bis 3650 Tage (die Aktivit\xE4t mindestens so lange wie die Snapshots) und 1 bis 1000 Snapshots."
2030
2340
  };
2031
2341
 
2032
2342
  // admin/translations/it.json
@@ -2104,7 +2414,6 @@ var it_default = {
2104
2414
  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.",
2105
2415
  previewNoUrl: "Nessun URL di anteprima: impostalo in Impostazioni, Blockscene, oppure configura l'Anteprima nativa di Strapi per questo tipo di contenuto.",
2106
2416
  previewFailed: "L'anteprima non ha risposto entro 15 s. Se il frontend sta ancora caricando, comparir\xE0 da sola; il modulo resta utilizzabile.",
2107
- previewReady: "Anteprima della pagina \xB7 modifiche non salvate",
2108
2417
  previewLoading: "Caricamento dell'anteprima\u2026",
2109
2418
  retry: "Riprova",
2110
2419
  editText: "Modifica testo",
@@ -2262,12 +2571,57 @@ var it_default = {
2262
2571
  confirmDeleteOption: "Chiedi conferma prima di eliminare un blocco",
2263
2572
  duplicateOption: 'Mostra "Duplica" su ogni blocco',
2264
2573
  clipboardOption: 'Mostra "Copia" e "Incolla" (tra pagine)',
2574
+ friendlyLabels: "Etichette dei campi leggibili",
2575
+ 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.`,
2265
2576
  hiddenBlocks: "Blocchi nascosti sul sito",
2266
2577
  "hiddenModes.strip": "Rimossi dall'API dei contenuti",
2267
2578
  "hiddenModes.flag": "Inviati con il flag (decide il frontend)",
2268
2579
  "hiddenModes.off": "Disattivato (nessun pulsante nascondi)",
2269
2580
  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.",
2270
- hiddenAttributeOff: "La configurazione del plugin imposta hiddenAttribute a false: i blocchi non possono essere nascosti."
2581
+ hiddenAttributeOff: "La configurazione del plugin imposta hiddenAttribute a false: i blocchi non possono essere nascosti.",
2582
+ historyTitle: "Cronologia",
2583
+ historyEmpty: "Ancora nessuna versione. Da ora vengono registrati salvataggi, pubblicazioni ed eliminazioni.",
2584
+ historyLoading: "Caricamento della cronologia\u2026",
2585
+ historyFailed: "Impossibile caricare la cronologia.",
2586
+ historyRefresh: "Aggiorna cronologia",
2587
+ historySystem: "Sistema",
2588
+ "historyActions.create": "Creato",
2589
+ "historyActions.update": "Salvato",
2590
+ "historyActions.publish": "Pubblicato",
2591
+ "historyActions.unpublish": "Pubblicazione annullata",
2592
+ "historyActions.discard": "Bozza scartata",
2593
+ "historyActions.delete": "Eliminato",
2594
+ "historyActions.restore": "Ripristinato",
2595
+ historyInitial: "Prima versione",
2596
+ historyNoChange: "Nessuna modifica al contenuto",
2597
+ historyMissing: "Non registrato (acquisizione non riuscita)",
2598
+ historyBlocksSummary: "Blocchi: {added} aggiunti, {removed} rimossi, {changed} modificati",
2599
+ historyFieldsSummary: "Campi: {fields}",
2600
+ historyNotKept: "Questa versione non \xE8 pi\xF9 conservata.",
2601
+ historyCompare: "Confrontato con il modulo",
2602
+ historySame: "Stesso contenuto del modulo.",
2603
+ "diffOps.added": "Aggiunto",
2604
+ "diffOps.removed": "Rimosso",
2605
+ "diffOps.changed": "Modificato",
2606
+ historyDiffFields: "Campi diversi: {fields}",
2607
+ historyDiffNote: "Le relazioni non vengono confrontate.",
2608
+ historyLoad: "Carica questa versione",
2609
+ historyLoaded: "Versione caricata nel modulo. Nulla viene salvato finch\xE9 non salvi.",
2610
+ historyLeft: "Lasciati come sono: {fields}",
2611
+ historyRemovedFields: "Non pi\xF9 nello schema, non caricati: {fields}",
2612
+ historyMissingItems: "Non esistono pi\xF9, esclusi: {media} file multimediali, {relations} voci collegate, {blocks} blocchi",
2613
+ historyLoadFailed: "Impossibile caricare questa versione.",
2614
+ historyShowMore: "Mostra altro",
2615
+ historySettings: "Cronologia delle versioni",
2616
+ 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.",
2617
+ historyEnabled: "Registra le versioni",
2618
+ historyAll: "Tutti i tipi di contenuto",
2619
+ historyTypes: "Tipi di contenuto",
2620
+ historyRetention: "Conserva le istantanee (giorni)",
2621
+ historyMax: "Istantanee per documento (massimo)",
2622
+ historyEventDays: "Conserva l'attivit\xE0 (giorni)",
2623
+ 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.",
2624
+ historyInvalid: "Numeri interi: da 1 a 3650 giorni (l'attivit\xE0 conservata almeno quanto le istantanee) e da 1 a 1000 istantanee."
2271
2625
  };
2272
2626
 
2273
2627
  // admin/translations/nl.json
@@ -2345,7 +2699,6 @@ var nl_default = {
2345
2699
  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.",
2346
2700
  previewNoUrl: "Geen voorbeeld-URL: stel die in bij Instellingen, Blockscene, of configureer Strapi's native Preview voor dit contenttype.",
2347
2701
  previewFailed: "Het voorbeeld antwoordde niet binnen 15 s. Als de frontend nog laadt, verschijnt het vanzelf; het formulier blijft bruikbaar.",
2348
- previewReady: "Paginavoorbeeld \xB7 niet-opgeslagen wijzigingen",
2349
2702
  previewLoading: "Voorbeeld laden\u2026",
2350
2703
  retry: "Opnieuw proberen",
2351
2704
  editText: "Tekst bewerken",
@@ -2503,12 +2856,57 @@ var nl_default = {
2503
2856
  confirmDeleteOption: "Bevestigen voordat een blok wordt verwijderd",
2504
2857
  duplicateOption: '"Dupliceren" op elk blok tonen',
2505
2858
  clipboardOption: `"Kopi\xEBren" en "Plakken" tonen (tussen pagina's)`,
2859
+ friendlyLabels: "Leesbare veldlabels",
2860
+ 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.',
2506
2861
  hiddenBlocks: "Op de site verborgen blokken",
2507
2862
  "hiddenModes.strip": "Verwijderd uit de content-API",
2508
2863
  "hiddenModes.flag": "Verzonden met de markering (de frontend beslist)",
2509
2864
  "hiddenModes.off": "Uit (geen verbergknop)",
2510
2865
  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.",
2511
- hiddenAttributeOff: "De pluginconfiguratie zet hiddenAttribute op false: blokken kunnen niet verborgen worden."
2866
+ hiddenAttributeOff: "De pluginconfiguratie zet hiddenAttribute op false: blokken kunnen niet verborgen worden.",
2867
+ historyTitle: "Geschiedenis",
2868
+ historyEmpty: "Nog geen versies. Opslaan, publiceren en verwijderen worden vanaf nu vastgelegd.",
2869
+ historyLoading: "Geschiedenis laden\u2026",
2870
+ historyFailed: "De geschiedenis kon niet worden geladen.",
2871
+ historyRefresh: "Geschiedenis vernieuwen",
2872
+ historySystem: "Systeem",
2873
+ "historyActions.create": "Aangemaakt",
2874
+ "historyActions.update": "Opgeslagen",
2875
+ "historyActions.publish": "Gepubliceerd",
2876
+ "historyActions.unpublish": "Publicatie ingetrokken",
2877
+ "historyActions.discard": "Concept verworpen",
2878
+ "historyActions.delete": "Verwijderd",
2879
+ "historyActions.restore": "Hersteld",
2880
+ historyInitial: "Eerste versie",
2881
+ historyNoChange: "Geen inhoudelijke wijziging",
2882
+ historyMissing: "Niet vastgelegd (vastleggen mislukt)",
2883
+ historyBlocksSummary: "Blokken: {added} toegevoegd, {removed} verwijderd, {changed} gewijzigd",
2884
+ historyFieldsSummary: "Velden: {fields}",
2885
+ historyNotKept: "Deze versie wordt niet meer bewaard.",
2886
+ historyCompare: "Vergeleken met het formulier",
2887
+ historySame: "Zelfde inhoud als het formulier.",
2888
+ "diffOps.added": "Toegevoegd",
2889
+ "diffOps.removed": "Verwijderd",
2890
+ "diffOps.changed": "Gewijzigd",
2891
+ historyDiffFields: "Afwijkende velden: {fields}",
2892
+ historyDiffNote: "Relaties worden niet vergeleken.",
2893
+ historyLoad: "Deze versie laden",
2894
+ historyLoaded: "Versie in het formulier geladen. Er wordt niets opgeslagen totdat je opslaat.",
2895
+ historyLeft: "Gelaten zoals ze zijn: {fields}",
2896
+ historyRemovedFields: "Niet meer in het schema, niet geladen: {fields}",
2897
+ historyMissingItems: "Bestaan niet meer, weggelaten: {media} mediabestanden, {relations} gekoppelde items, {blocks} blokken",
2898
+ historyLoadFailed: "Deze versie kon niet worden geladen.",
2899
+ historyShowMore: "Meer tonen",
2900
+ historySettings: "Versiegeschiedenis",
2901
+ 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.",
2902
+ historyEnabled: "Versies vastleggen",
2903
+ historyAll: "Alle inhoudstypen",
2904
+ historyTypes: "Inhoudstypen",
2905
+ historyRetention: "Momentopnamen bewaren (dagen)",
2906
+ historyMax: "Momentopnamen per document (maximum)",
2907
+ historyEventDays: "Activiteit bewaren (dagen)",
2908
+ 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.",
2909
+ historyInvalid: "Gehele getallen: 1 tot 3650 dagen (de activiteit minstens zo lang bewaard als de momentopnamen) en 1 tot 1000 momentopnamen."
2512
2910
  };
2513
2911
 
2514
2912
  // admin/messages.ts
@@ -4201,14 +4599,14 @@ function useInitialAccordions({
4201
4599
  };
4202
4600
  document.addEventListener("click", cancel, true);
4203
4601
  const timer = setInterval(() => {
4204
- const pending = latest.current.filter((zone) => zone.count > 0);
4205
- const ready = pending.length > 0 && pending.every((zone) => {
4602
+ const pending2 = latest.current.filter((zone) => zone.count > 0);
4603
+ const ready = pending2.length > 0 && pending2.every((zone) => {
4206
4604
  const list = findZoneList(zone.label);
4207
4605
  return list && toggles(list).length >= zone.count;
4208
4606
  }) && (editor.initialState !== "remember" || user.current);
4209
4607
  if (!ready && ++tries < 25) return;
4210
4608
  stop();
4211
- for (const zone of pending) {
4609
+ for (const zone of pending2) {
4212
4610
  const list = findZoneList(zone.label);
4213
4611
  if (!list) continue;
4214
4612
  const key = memoryKey({
@@ -4423,6 +4821,49 @@ var Checks = import_styled_components4.default.fieldset`
4423
4821
  legend { font-size: 12px; font-weight: 600; margin-bottom: 4px; }
4424
4822
  label { display: inline-flex; align-items: center; gap: 6px; }
4425
4823
  `;
4824
+ var DAYS = (n) => Number.isInteger(n) && n >= 1 && n <= 3650;
4825
+ var badRetention = (h) => !h || !DAYS(h.retentionDays) || !DAYS(h.eventDays) || h.eventDays < h.retentionDays || !(Number.isInteger(h.maxSnapshots) && h.maxSnapshots >= 1 && h.maxSnapshots <= 1e3);
4826
+ function HistorySettings({ types, history, set, t, disabled, ToggleField: ToggleField2, TextField: TextField2 }) {
4827
+ const all = history.contentTypes === "all";
4828
+ const list = all ? [] : history.contentTypes;
4829
+ const number = (key) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Box, { style: { minWidth: 200 }, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4830
+ TextField2,
4831
+ {
4832
+ name: `history-${key}`,
4833
+ label: t[{ retentionDays: "historyRetention", maxSnapshots: "historyMax", eventDays: "historyEventDays" }[key]],
4834
+ value: Number.isFinite(history[key]) ? String(history[key]) : "",
4835
+ disabled,
4836
+ onChange: (v) => set(key, /^\d{1,5}$/.test(v.trim()) ? Number(v.trim()) : NaN)
4837
+ }
4838
+ ) });
4839
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Box, { padding: 6, background: "neutral0", hasRadius: true, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system3.Flex, { direction: "column", alignItems: "stretch", gap: 4, "data-testid": "history-settings", children: [
4840
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "beta", tag: "h2", children: t.historySettings }),
4841
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "pi", textColor: "neutral600", children: t.historySettingsHelp }),
4842
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ToggleField2, { name: "history-enabled", label: t.historyEnabled, value: history.enabled, disabled, onChange: (v) => set("enabled", v) }),
4843
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ToggleField2, { name: "history-all", label: t.historyAll, value: all, disabled: disabled || !history.enabled, onChange: (v) => set("contentTypes", v ? "all" : types.map((type) => type.uid)) }),
4844
+ !all && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Checks, { disabled: disabled || !history.enabled, children: [
4845
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("legend", { children: t.historyTypes }),
4846
+ types.map((type) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { children: [
4847
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4848
+ "input",
4849
+ {
4850
+ type: "checkbox",
4851
+ name: `history-type-${type.uid}`,
4852
+ checked: list.includes(type.uid),
4853
+ onChange: (e) => set("contentTypes", e.target.checked ? [...list, type.uid] : list.filter((uid) => uid !== type.uid))
4854
+ }
4855
+ ),
4856
+ type.displayName
4857
+ ] }, type.uid))
4858
+ ] }),
4859
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system3.Flex, { gap: 4, wrap: "wrap", alignItems: "flex-end", children: [
4860
+ number("retentionDays"),
4861
+ number("maxSnapshots"),
4862
+ number("eventDays")
4863
+ ] }),
4864
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "pi", textColor: badRetention(history) ? "danger600" : "neutral600", role: badRetention(history) ? "alert" : void 0, children: badRetention(history) ? t.historyInvalid : t.historyRetentionHelp })
4865
+ ] }) });
4866
+ }
4426
4867
  function SidebarEditor({ type, entry, set, t, disabled, SelectField: SelectField2, TextField: TextField2 }) {
4427
4868
  const items = entry.sidebar || [];
4428
4869
  const save = (next) => set("sidebar", next.length ? next : void 0, void 0);
@@ -4552,7 +4993,8 @@ function Settings({ useClient, usePermissions: usePermissions2, MediaPicker: Med
4552
4993
  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)));
4553
4994
  const badSidebar = settings && Object.values(settings.contentTypes || {}).some((entry) => (entry.sidebar || []).some(badItem));
4554
4995
  const badLazy = settings && badUids(settings.editor.lazyFields);
4555
- const invalid = badColor || badSidebar || badLazy;
4996
+ const badHistory = settings && data?.historyTypes && badRetention(settings.history);
4997
+ const invalid = badColor || badSidebar || badLazy || badHistory;
4556
4998
  const save = async () => {
4557
4999
  if (!settings || invalid || !canUpdate) return;
4558
5000
  setSaving(true);
@@ -4677,6 +5119,11 @@ function Settings({ useClient, usePermissions: usePermissions2, MediaPicker: Med
4677
5119
  s.editor.showRowThumbnails = v;
4678
5120
  return s;
4679
5121
  }) }),
5122
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ToggleField2, { name: "editor-friendlyLabels", label: t.friendlyLabels, value: editor.friendlyLabels !== false, disabled: !canUpdate || saving, onChange: (v) => update((s) => {
5123
+ s.editor.friendlyLabels = v;
5124
+ return s;
5125
+ }) }),
5126
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "pi", textColor: "neutral600", children: t.friendlyLabelsHelp }),
4680
5127
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
4681
5128
  SelectField2,
4682
5129
  {
@@ -4797,6 +5244,21 @@ function Settings({ useClient, usePermissions: usePermissions2, MediaPicker: Med
4797
5244
  ),
4798
5245
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "pi", textColor: "neutral600", children: data.hiddenAttribute ? t.hiddenBlocksHelp : t.hiddenAttributeOff })
4799
5246
  ] }) }),
5247
+ data.historyTypes && settings.history && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
5248
+ HistorySettings,
5249
+ {
5250
+ types: data.historyTypes,
5251
+ history: settings.history,
5252
+ t,
5253
+ disabled: !canUpdate || saving,
5254
+ ToggleField: ToggleField2,
5255
+ TextField: TextField2,
5256
+ set: (key, value) => update((s) => {
5257
+ s.history = { ...s.history, [key]: value };
5258
+ return s;
5259
+ })
5260
+ }
5261
+ ),
4800
5262
  (data.contentTypes || []).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Box, { padding: 6, background: "neutral0", hasRadius: true, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system3.Flex, { direction: "column", alignItems: "stretch", gap: 4, "data-testid": "content-types", children: [
4801
5263
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "beta", tag: "h2", children: t.contentTypes }),
4802
5264
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system3.Typography, { variant: "pi", textColor: "neutral600", children: t.contentTypesHelp }),
@@ -4959,11 +5421,17 @@ function register(app, Component2, to) {
4959
5421
 
4960
5422
  // admin/catalog.ts
4961
5423
  var React6 = __toESM(require("react"));
5424
+ var cached = null;
5425
+ var pending = null;
5426
+ var load = (get) => get("/blockscene/catalog").then(({ data }) => {
5427
+ cached = data;
5428
+ return data;
5429
+ });
4962
5430
  function useCatalog(get) {
4963
5431
  const [catalog, setCatalog] = React6.useState(null);
4964
5432
  React6.useEffect(() => {
4965
5433
  let active = true;
4966
- get("/blockscene/catalog").then(({ data }) => {
5434
+ load(get).then((data) => {
4967
5435
  if (active) setCatalog(data);
4968
5436
  }).catch(() => {
4969
5437
  if (active) setCatalog(null);
@@ -4974,6 +5442,27 @@ function useCatalog(get) {
4974
5442
  }, [get]);
4975
5443
  return catalog;
4976
5444
  }
5445
+ var adminLocale = () => {
5446
+ try {
5447
+ return localStorage.getItem("strapi-admin-language") || document.documentElement.lang || "en";
5448
+ } catch {
5449
+ return "en";
5450
+ }
5451
+ };
5452
+ var labelsHook = (get, relabel, drop) => (args) => {
5453
+ try {
5454
+ if (!cached) pending || (pending = load(get()).catch(() => {
5455
+ }).finally(() => {
5456
+ pending = null;
5457
+ }));
5458
+ const trimmed = drop(args.layout, cached ? cached.hiddenAttribute : "bsHidden");
5459
+ const layout = cached ? relabel(trimmed, cached, adminLocale()) : trimmed;
5460
+ return layout === args.layout ? args : { ...args, layout };
5461
+ } catch (error) {
5462
+ console.error("[blockscene] field labels skipped after an error:", error);
5463
+ return args;
5464
+ }
5465
+ };
4977
5466
 
4978
5467
  // admin/Guard.tsx
4979
5468
  var React7 = __toESM(require("react"));
@@ -5041,7 +5530,8 @@ function Picker() {
5041
5530
  !c.addComponentToDynamicZone
5042
5531
  ).map((zone) => ({
5043
5532
  ...zone,
5044
- label: schema?.metadatas?.[zone.name]?.edit?.label || zone.name
5533
+ // The rendered label: the edit layout's (field labels may have rewritten it), else the stored metadata.
5534
+ label: schema?.layouts?.edit?.flat().find((field) => field?.name === zone.name)?.metadatas?.label || schema?.metadatas?.[zone.name]?.edit?.label || zone.name
5045
5535
  }));
5046
5536
  const add = (zone, uid) => {
5047
5537
  const close = catalog?.groups?.[uid];
@@ -5158,6 +5648,7 @@ var strapi4_default = {
5158
5648
  },
5159
5649
  registerTrads,
5160
5650
  bootstrap(app) {
5651
+ app.registerHook("Admin/CM/pages/EditView/mutate-edit-view-layout", labelsHook(() => (0, import_helper_plugin.getFetchClient)().get, labelEditLayout4, dropField4));
5161
5652
  app.injectContentManagerComponent("editView", "right-links", {
5162
5653
  name: "blockscene",
5163
5654
  Component: () => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Guard, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Picker, {}) })