feat(cms): add recovery history and operational reliability tools
CI / check (push) Failing after 22s
CI / deploy (push) Skipped
CI / publish-container (push) Skipped

This commit is contained in:
Simo committed 2026-09-09 21:57:56 +02:00
1 parent 89526af344
commit 1ef405be0a
92 files changed
+6384 -267

No files matched your search

+140 -3
View File
@@ -1077,7 +1077,8 @@
"guilds": "Gruppi",
"shop": "Negozio",
"hint": "Inizia a scrivere per cercare tra utenti, articoli, stanze, gruppi e articoli del negozio"
}
},
"operationsCenter": "Centro operazioni"
},
"dashboard": {
"title": "Dashboard",
@@ -2176,6 +2177,40 @@
"acceptBulk": "Accetta prezzi nella bozza",
"previous": "Precedente",
"next": "Successiva"
},
"integrity": {
"title": "Integrità del catalogo",
"description": "Controlla riferimenti, percorsi delle categorie, identificativi e icone dei furni. Il controllo non modifica i record.",
"catalog": "Catalogo",
"normal": "Catalogo normale",
"bc": "Builders Club",
"refresh": "Ripeti controllo",
"working": "Controllo in corso…",
"failed": "Non è stato possibile completare l’operazione. Riprova.",
"stalePreview": "Il catalogo è cambiato dopo l’anteprima. Genera una nuova anteprima prima di applicare le correzioni.",
"applied": "{count} categorie ricollegate alla radice del catalogo.",
"iconsUnavailable": "Impossibile leggere la cartella delle icone. La disponibilità delle icone non è stata verificata.",
"healthy": "Nessun problema rilevato nei controlli completati.",
"total": "Rilevati {count} problemi. Visualizzati {shown}.",
"open": "Apri",
"reference": "Riferimento: {value}",
"repairHint": "Visualizza le categorie il cui genitore non esiste più. L’applicazione sposta solo queste categorie alla radice e conserva tutti i record. Cicli, furni mancanti, icone e conflitti di identificativi richiedono una verifica individuale.",
"preview": "Anteprima correzioni sicure",
"planned": "Verranno spostate {count} categorie:",
"parentChange": "genitore #{from} → radice del catalogo",
"apply": "Applica le correzioni mostrate",
"legacyTitle": "Azioni di manutenzione avanzata",
"legacyHint": "Questi strumenti di manutenzione esistenti possono riscrivere identificativi e unire o rimuovere record duplicati. Sono separati dal controllo di integrità non distruttivo e dalla correzione dei genitori mostrata in anteprima.",
"issues": {
"missing_furniture": "Offerta con furni mancanti",
"invalid_item_ids": "Identificativi furni non validi",
"missing_page": "Offerta con categoria mancante",
"unreachable_page": "Categoria non raggiungibile",
"category_cycle": "Percorso categoria con ciclo",
"missing_icon": "Icona furni mancante",
"invalid_offer_id": "Identificativo offerta non valido",
"duplicate_offer_id": "Identificativo offerta ripetuto"
}
}
},
"shop": {
@@ -3136,6 +3171,51 @@
"colStatus": "Stato",
"statusUnknown": "sconosciuto",
"searchPlaceholder": "Cerca per username…"
},
"history": {
"preview": "Anteprima ripristino",
"title": "Ripristina una modifica registrata",
"description": "Confronta i valori attuali con quelli precedenti prima di confermare. Vengono ripristinati solo impostazioni della categoria, prezzi dell’offerta o contenuto della notizia. Record eliminati e gerarchia delle categorie sono esclusi.",
"loading": "Caricamento…",
"unavailable": "La revisione non è disponibile oppure non hai il permesso di ripristinarla.",
"conflict": "Questo record è cambiato dopo la modifica selezionata. Aggiorna e controlla lo storico più recente prima di ripristinare.",
"failed": "Ripristino non completato. Ricarica la pagina e riprova.",
"field": "Campo",
"current": "Valore attuale",
"restore": "Valore da ripristinare",
"confirm": "Conferma ripristino",
"restoring": "Ripristino in corso…",
"fields": {
"caption": "Nome categoria",
"captionSave": "Nome interno categoria",
"pageLayout": "Layout categoria",
"enabled": "Abilitata",
"visible": "Visibile",
"clubOnly": "Solo membri Club",
"vipOnly": "Solo membri VIP",
"minRank": "Grado minimo",
"iconImage": "Icona categoria",
"iconColor": "Colore icona",
"pageHeadline": "Immagine intestazione",
"pageTeaser": "Immagine anteprima",
"pageSpecial": "Immagine speciale",
"pageText1": "Testo principale",
"pageText2": "Testo secondario",
"pageTextDetails": "Testo dettagli",
"pageTextTeaser": "Testo anteprima",
"includes": "Categorie incluse",
"costCredits": "Prezzo in crediti",
"costPoints": "Prezzo in punti",
"pointsType": "Valuta dei punti",
"title": "Titolo notizia",
"slug": "Indirizzo notizia",
"image": "Immagine notizia",
"shortStory": "Sommario",
"fullStory": "Contenuto articolo",
"status": "Stato pubblicazione",
"publishAt": "Pubblicazione programmata",
"publishedAt": "Data pubblicazione"
}
}
},
"wordfilter": {
@@ -3966,7 +4046,17 @@
"clearAssignment": "Rimuovi assegnazione",
"openOperation": "Apri area collegata",
"releaseOccurrences": "Occorrenze per release",
"releaseScope": "Queste release compaiono nei dati conservati. La prima occorrenza disponibile non dimostra quale release abbia introdotto l’errore."
"releaseScope": "Queste release compaiono nei dati conservati. La prima occorrenza disponibile non dimostra quale release abbia introdotto l’errore.",
"releaseFilter": "Versione",
"allReleases": "Tutte le versioni",
"period": "Periodo",
"allRetained": "Tutti gli eventi conservati",
"last24h": "Ultime 24 ore",
"last7d": "Ultimi 7 giorni",
"sort": "Ordine",
"recentFirst": "Prima i più recenti",
"frequentFirst": "Prima i più frequenti",
"filterScope": "I conteggi riguardano gli eventi conservati che corrispondono ai filtri. Stato e dettagli più recenti del gruppo restano aggiornati tra le versioni."
},
"importHistory": {
"summary": "Storico importazioni · {count} attive",
@@ -3991,7 +4081,11 @@
"refreshHistory": "Aggiorna cronologia",
"showMoreItems": "Mostra altri 50 elementi",
"uncertainOutcome": "Un elemento interrotto potrebbe avere già modificato i dati locali. È escluso dai tentativi successivi.",
"reviewLocalData": "Controlla i dati locali"
"reviewLocalData": "Controlla i dati locali",
"ownerHistory": "Le tue importazioni e riparazioni, dalla più recente. Il retry non ripete elementi completati o dall’esito incerto.",
"previousPage": "Precedente",
"nextPage": "Successiva",
"page": "Pagina {page}"
},
"installation": {
"title": "Diagnostica installazione",
@@ -4094,6 +4188,49 @@
"specialPricing": "Prezzo speciale: {credits} crediti, {points} punti (tipo {type})",
"restrictedOffers": "{count} offerte in questa categoria richiedono l’iscrizione al Club.",
"clubOffer": "Offerta Club"
},
"permissionPreview": {
"title": "Anteprima accessi del ruolo",
"description": "Verifica gli accessi CMS senza modificare sessioni o impersonare utenti.",
"back": "Torna ai permessi",
"role": "Ruolo",
"show": "Mostra accessi",
"missing": "Seleziona un ruolo esistente.",
"entryAllowed": "Accesso HK consentito",
"entryDenied": "Accesso HK negato: manca il permesso dashboard",
"superAdmin": "Questo grado riceve attualmente i privilegi del grado più alto.",
"scope": "Questa anteprima considera un solo ruolo. Un utente può avere altri ruoli. La navigazione personalizzata può nascondere sezioni consentite; singoli dati e azioni possono richiedere ulteriori controlli.",
"sections": "Sezioni",
"allowed": "Consentito",
"denied": "Negato",
"actions": "Permessi CMS",
"actionScope": "Un permesso concesso non supera i controlli di accesso HK, gerarchia dei gradi, proprietà dei dati o validazione della singola azione.",
"granted": "Concesso",
"notGranted": "Non concesso"
},
"operationsCenter": {
"title": "Centro operazioni",
"hint": "Segui le tue importazioni e riparazioni persistenti e la coda condivisa di esportazione catalogo.",
"syncTitle": "Sincronizzazione sorgenti",
"syncHint": "La sincronizzazione delle sorgenti avviene nella sua pagina. Qui non dispone di cronologia persistente o ripetizione automatica degli elementi falliti. L’esportazione catalogo mostra coda condivisa e ultimo esito; non supporta retry dei singoli elementi.",
"openSync": "Apri sincronizzazione ed esportazione",
"openImports": "Apri importazioni furni"
},
"operationsExport": {
"title": "Esportazione repository catalogo",
"hint": "Esportazione automatica di bundle, icone, gamedata, traduzioni e SQL catalogo. Coda e ultimo esito sono condivisi tra operatori.",
"loadError": "Impossibile caricare lo stato esportazione",
"queueError": "Impossibile accodare l’esportazione",
"loading": "Caricamento…",
"disabled": "Esportazione disabilitata. Apri sincronizzazione per verificarne la configurazione.",
"active": "In attesa del completamento di {count} operazioni.",
"running": "Esportazione in corso…",
"pending": "{count} aggiornamenti in coda per esportazione.",
"idle": "Nessun aggiornamento in attesa.",
"lastCommit": "Ultimo commit pubblicato:",
"lastAttempt": "Ultimo tentativo: {date}",
"queuing": "Accodamento…",
"queue": "Esporta ora / riprova"
}
},
"radioRequests": {