2026-06-15 00:30:34 +02:00
{
"feed" : "Feed" ,
"searchPlaceholder" : "Search your subscriptions…" ,
2026-07-01 04:22:39 +02:00
"clearSearch" : "Clear search" ,
2026-06-29 02:01:44 +02:00
"searchYoutube" : "Search YouTube" ,
"searchYoutubeTip" : "Search live on YouTube for this term (uses shared API quota). You can also press Enter." ,
2026-07-13 02:28:06 +02:00
"go" : "Go" ,
"goTip" : "Search (or press Enter)" ,
"prevModule" : "Previous module" ,
"nextModule" : "Next module" ,
2026-06-15 00:30:34 +02:00
"channelManager" : "Channel manager" ,
"usageStats" : "Usage & stats" ,
2026-06-16 14:38:51 +02:00
"scheduler" : "Scheduler" ,
2026-06-19 12:23:00 +02:00
"configuration" : "Configuration" ,
2026-06-19 14:16:48 +02:00
"users" : "Users" ,
2026-06-15 04:06:22 +02:00
"scope" : {
"label" : "Feed source" ,
"my" : "Mine" ,
"myTip" : "Only videos from your own subscriptions" ,
"all" : "Library" ,
"allTip" : "Every video in the shared catalog"
} ,
2026-06-15 00:30:34 +02:00
"account" : {
"admin" : "Admin" ,
"feed" : "Feed" ,
"channels" : "Channels" ,
2026-06-15 14:45:18 +02:00
"playlists" : "Playlists" ,
2026-06-15 00:30:34 +02:00
"stats" : "Stats" ,
2026-06-16 14:38:51 +02:00
"scheduler" : "Scheduler" ,
2026-06-19 12:23:00 +02:00
"config" : "Configuration" ,
2026-06-19 14:16:48 +02:00
"users" : "Users" ,
2026-06-15 00:30:34 +02:00
"settings" : "Settings" ,
"about" : "About" ,
2026-06-16 02:05:38 +02:00
"signOut" : "Sign out" ,
"addAccount" : "Add another account" ,
feat(audit): admin audit log (Notification P3)
Append-only who/what/when trail for admin actions + scheduler run summaries,
generalizing QuotaEvent. Logged at ACTION / run-summary granularity — never
per-row (a scheduler run touching thousands of videos is ONE row).
Backend:
- migration 0054_audit_log + AuditLog model (actor_id FK SET NULL, action,
target_type/id, summary, before/after JSON, created_at).
- app/audit.py: AuditAction constants (single source of truth, i18n'd on the
client) + record() (adds to the caller's txn) + gc(retention_days).
- producers wired: role change / suspend / delete / invite approve-deny-add /
demo add-remove-reset / discovery purge (admin.py); config set/reset — secret
VALUES never logged, key only (config.py); scheduler interval + maintenance
tune (scheduler routes); sync pause/resume (sync.py); and the scheduler _job()
choke point writes ONE run-summary row per run — manual runs + errors always,
automatic runs only when they changed something (no no-op-poll spam).
- retention: audit_gc scheduler job prunes rows older than audit_retention_days
(sysconfig, default 180; 0 = keep forever).
- admin API routes/audit.py (/api/admin/audit): recent-window list (actor emails
resolved, System for background) + clear (leaves one tamper-evidence row).
Frontend:
- new admin-only "Audit log" nav page (ScrollText) using the shared DataTable
(first admin page to reuse it) — sort/filter/paginate/persist, action select
filter, actor text filter, before→after detail, Clear-all with confirm.
- AuditLog.tsx + auditColumns.tsx + api.adminAudit/clearAudit + AuditRow type.
- trilingual audit + auditActions namespaces (HU/EN/DE) + nav + config-group +
scheduler job labels; Audit config group (retention days).
2026-07-12 07:32:41 +02:00
"switchTo" : "Switch to {{name}}" ,
"audit" : "Audit log"
2026-06-15 00:30:34 +02:00
} ,
"sync" : {
"yours" : "yours" ,
"total" : "total" ,
"countTooltip" : "Videos from your subscriptions, against the total in the shared catalog that every user's subscriptions have pulled in." ,
"paused" : "paused" ,
"syncing" : "{{count}} syncing" ,
2026-06-15 04:30:27 +02:00
"backfillingHistory" : "fetching history" ,
2026-06-19 02:57:45 +02:00
"working" : "syncing…" ,
"recentQueued" : "{{count}} queued" ,
2026-06-15 00:30:34 +02:00
"allSynced" : "all synced" ,
"withoutFullHistory" : "{{count}} without full history" ,
"fullHistoryTooltip" : "Some of your channels only have their recent uploads. Click to open the channel manager (filtered to these) and request their full back-catalog." ,
"pause" : "Pause background sync" ,
"resume" : "Resume background sync"
} ,
"banner" : {
"updated" : "Updated to v{{version}} — see what's changed." ,
"releaseNotes" : "Release notes" ,
"dismiss" : "Dismiss"
}
}