Translate the whole site to English: English routes with 301 redirects from the Dutch paths, English UI, docs, seeds and captions, one-time live content migration

This commit is contained in:
2026-10-05 11:25:41 +02:00
parent bbdecdc95b
commit ff547e1677
153 changed files with 1095 additions and 774 deletions
+14 -14
View File
@@ -160,17 +160,17 @@ async def process_backup_async(row, codec):
class BackupService(BaseService):
name = "backup"
title = "Back-ups"
description = "Verwerkt de back-upwachtrij, plant automatische back-ups en snoeit oude archieven."
title = "Backups"
description = "Works through the backup queue, schedules automatic backups and prunes old archives."
default_interval = 10
min_interval = 5
metrics_interval = 30
config_fields = [
ConfigField("schedule_hours", "int", 24, "Automatisch elke N uur (0 = uit)", minimum=0, maximum=720, group="Planning"),
ConfigField("schedule_target", "select", "database", "Automatisch doel", options=list(TARGETS), group="Planning"),
ConfigField("keep_last", "int", 14, "Bewaar laatste N", minimum=1, maximum=1000, group="Bewaren"),
ConfigField("codec", "select", "zstd", "Compressie", options=["zstd", "brotli"], group="Archief"),
ConfigField("offload", "bool", "0", "Offload via rclone", group="Archief"),
ConfigField("schedule_hours", "int", 24, "Automatic every N hours (0 = off)", minimum=0, maximum=720, group="Schedule"),
ConfigField("schedule_target", "select", "database", "Automatic target", options=list(TARGETS), group="Schedule"),
ConfigField("keep_last", "int", 14, "Keep last N", minimum=1, maximum=1000, group="Retention"),
ConfigField("codec", "select", "zstd", "Compression", options=["zstd", "brotli"], group="Archive"),
ConfigField("offload", "bool", "0", "Offload via rclone", group="Archive"),
]
def __init__(self):
@@ -190,30 +190,30 @@ class BackupService(BaseService):
cfg = self.get_config()
if self._schedule_due(int(cfg["schedule_hours"])):
enqueue_backup(cfg["schedule_target"], "system")
self.log(f"automatische back-up ingepland: {cfg['schedule_target']}")
self.log(f"automatic backup scheduled: {cfg['schedule_target']}")
for row in pending_backups():
update_backup(row["uid"], status="running")
ok = await process_backup_async(row, cfg["codec"])
self.processed += 1
self.log(f"back-up {row['target']} {'klaar' if ok else 'mislukt'}")
self.log(f"backup {row['target']} {'finished' if ok else 'failed'}")
primary = admin_uids_ordered()[:1]
for uid in primary:
create_notification(uid, "backup.finished" if ok else "backup.failed", f"Back-up {row['target']} {'klaar' if ok else 'mislukt'}", "/admin/backups")
create_notification(uid, "backup.finished" if ok else "backup.failed", f"Backup {row['target']} {'finished' if ok else 'failed'}", "/admin/backups")
if ok and cfg["offload"] == "1":
done = [item for item in list_backups(limit=5) if item["uid"] == row["uid"]]
if done:
self.log(f"offload: {offload(backup_path(done[0]))}")
pruned = prune_backups(int(cfg["keep_last"]))
if pruned:
self.log(f"{pruned} oude back-ups gesnoeid")
self.log(f"{pruned} old backups pruned")
def collect_metrics(self):
rows = list_backups(limit=200)
return {
"cards": [
{"label": "Archieven", "value": sum(1 for row in rows if row["status"] == "done")},
{"label": "Wachtrij", "value": sum(1 for row in rows if row["status"] == "pending")},
{"label": "Verwerkt sinds start", "value": self.processed},
{"label": "Archives", "value": sum(1 for row in rows if row["status"] == "done")},
{"label": "Queue", "value": sum(1 for row in rows if row["status"] == "pending")},
{"label": "Processed since start", "value": self.processed},
],
"table": None,
}