- admin._decide: add an idempotency guard (409 unless status was 'pending') so a repeat/stale approve OR deny can't re-run its side effects — now that deny emails, this stops duplicate denial mails and a rejection mail to an already-approved user. - SavedViewsWidget: extract runViewMutation(fn, failMsg) (returns success) — dedups the five try/catch+refresh blocks AND lets create/rename close their input only on success, so a failed create keeps the user's typed name. - worker._notify_download_done: take user_id/title captured BEFORE the caller's commit (no post-commit refresh SELECT); add a so the inbox labels an edit job 'Edit ready' instead of 'Download ready' (new inbox.editDone i18n, HU+EN). Gate green (ruff/tsc/eslint-0/prettier/knip/vitest 79/pytest 193); smoke-tested the saved-views + notifications surfaces render clean on a fresh dev server.
33 lines
1010 B
JSON
33 lines
1010 B
JSON
{
|
|
"navLabel": "Notifications",
|
|
"title": "Notifications",
|
|
"subtitle": "Updates from your library and the system.",
|
|
"tabInbox": "Notifications",
|
|
"empty": "You're all caught up.",
|
|
"markAllRead": "Mark all read",
|
|
"clearAll": "Clear all",
|
|
"markRead": "Mark read",
|
|
"dismiss": "Dismiss",
|
|
"sectionSystem": "System",
|
|
"sectionActivity": "Activity",
|
|
"andMore": "and {{count}} more",
|
|
"openScheduler": "Open Scheduler",
|
|
"openDownloads": "Open Downloads",
|
|
"revertFailed": "Couldn't undo that — please try again.",
|
|
"downloadDone": {
|
|
"title": "Download ready"
|
|
},
|
|
"editDone": {
|
|
"title": "Edit ready"
|
|
},
|
|
"maintenance": {
|
|
"title": "Videos removed",
|
|
"body_one": "{{count}} saved or playlisted video was removed because it's no longer available on YouTube.",
|
|
"body_other": "{{count}} saved or playlisted videos were removed because they're no longer available on YouTube."
|
|
},
|
|
"jobDone": {
|
|
"titleOk": "{{job}} finished",
|
|
"titleError": "{{job}} failed"
|
|
}
|
|
}
|