`req` opens its blocking dialog for 400/409/422/5xx only. A 403/404/429 was left to the caller and a 502-504 or lost connection got just the self-clearing connection notice, so 34 mutations without a reporting onError and 15 direct api writes with a bare or missing catch failed in silence: a hidden channel that snapped back, a share link that never revoked, a confirmed account delete that ended with nothing said. - lib/queryClient: one MutationCache reporter. react-query awaits it BEFORE the mutation's own onError, so it waits a task and skips a failure the site already reported; the toast title comes from `meta.failTitle`, `meta.errorShownInline` opts out. - notifyActionError: title names WHAT failed, the line under it says WHY (`failureReason`: a structured localized detail, else the status). It marks the error reported (`markReported`), so nothing reports one failure twice; `notifyKnownFailure` for a site's own specific sentence. - Every silent site named (45 new HU/EN titles, 4 reasons). Stale "the global dialog shows it" comments corrected on the job actions, channel block, Plex sync, cookies, download enqueue, account delete and usePref. - Channels passed the tag hook's channel id to the reporter as the error; the tag and priority hooks now report themselves, with the real error. - A contract test keeps every useMutation naming its failure; CLAUDE.md gains the pattern row. - history.dom.test: the "navigates only once the entries are back" assertion raced an async act's macrotask flush (1 in 5 runs); it now asserts from a later popstate listener.
88 lines
4.3 KiB
JSON
88 lines
4.3 KiB
JSON
{
|
|
"title": "Couldn't complete that",
|
|
"generic": "The server couldn't carry out that action. Please try again.",
|
|
"demo": "This isn't available in the demo account.",
|
|
"validation": "Some of the values you entered weren't valid. Please check them and try again.",
|
|
"server": "Server error",
|
|
"syncCooldown": "You've synced a few times just now — give it a few minutes. The YouTube budget is shared with everyone on this instance, and background syncing keeps running either way.",
|
|
"notFound": {
|
|
"generic": "This item doesn't exist any more.",
|
|
"view": "This view doesn't exist any more.",
|
|
"tag": "This tag doesn't exist any more.",
|
|
"pin": "This isn't on your comfort shelf any more.",
|
|
"playlist": "This playlist doesn't exist any more.",
|
|
"move_target": "The playlist you're moving it to doesn't exist any more.",
|
|
"video": "This video isn't in the library any more.",
|
|
"invite": "This invite doesn't exist any more.",
|
|
"user": "This user doesn't exist any more.",
|
|
"channel": "This channel isn't in the library any more.",
|
|
"subscription": "You're not subscribed to this channel any more.",
|
|
"recipient": "There's no user with that email address.",
|
|
"job": "This job doesn't exist any more."
|
|
},
|
|
"reason": {
|
|
"unreachable": "The server couldn't be reached, so the change didn't go through. Try again.",
|
|
"forbidden": "You don't have permission to do that.",
|
|
"rateLimited": "Too many requests at once — wait a moment and try again.",
|
|
"unexpected": "Something went wrong in the app. Try again."
|
|
},
|
|
"writeFailed": {
|
|
"hideChannel": "Couldn't change whether the channel is hidden",
|
|
"blockChannel": "Couldn't change the channel's block",
|
|
"unblockChannel": "Couldn't unblock the channel",
|
|
"channelSettings": "Couldn't save the channel's settings",
|
|
"channelPriority": "Couldn't save the channel's priority",
|
|
"exploreChannel": "Couldn't load the channel's videos",
|
|
"downloadQuota": "Couldn't save the download quota",
|
|
"downloadQuotaReset": "Couldn't reset the download quota",
|
|
"job": {
|
|
"pause": "Couldn't pause the download",
|
|
"resume": "Couldn't resume the download",
|
|
"cancel": "Couldn't cancel the download",
|
|
"delete": "Couldn't delete the download",
|
|
"redownload": "Couldn't start the download again"
|
|
},
|
|
"removeShared": "Couldn't remove the shared item",
|
|
"downloadDetails": "Couldn't save the download's details",
|
|
"enqueueDownload": "Couldn't queue the download",
|
|
"downloadProfileSave": "Couldn't save the download profile",
|
|
"downloadProfileDelete": "Couldn't delete the download profile",
|
|
"downloadCookiesRemove": "Couldn't remove those cookies",
|
|
"notifRead": "Couldn't mark the notification as read",
|
|
"notifReadAll": "Couldn't mark the notifications as read",
|
|
"notifDismiss": "Couldn't dismiss the notification",
|
|
"notifClear": "Couldn't clear the notifications",
|
|
"createPlaylist": "Couldn't create the playlist",
|
|
"schedulerRun": "Couldn't start the job",
|
|
"schedulerRunAll": "Couldn't start the jobs",
|
|
"maintenanceBatch": "Couldn't save the maintenance batch size",
|
|
"purgeDiscovery": "Couldn't clear the discovery data",
|
|
"plexWatchLink": "Couldn't change the Plex watch-state sync",
|
|
"plexWatchImport": "Couldn't import the watch state from Plex",
|
|
"shareLinkDownload": "Couldn't change whether the link allows downloading",
|
|
"shareLinkRevoke": "Couldn't revoke the link",
|
|
"shareLinkPassword": "Couldn't change the link's password",
|
|
"syncPause": "Couldn't pause syncing",
|
|
"syncResume": "Couldn't resume syncing",
|
|
"prefs": "Couldn't save your settings",
|
|
"deleteAccount": "Couldn't delete your account",
|
|
"videoState": "Couldn't change the video's state",
|
|
"videoReset": "Couldn't reset the video",
|
|
"watchLaterAdd": "Couldn't add it to Watch later",
|
|
"watchLaterRemove": "Couldn't remove it from Watch later",
|
|
"clearSearch": "Couldn't clear the search results"
|
|
},
|
|
"ok": "OK",
|
|
"offline": {
|
|
"title": "Connection lost",
|
|
"body": "Couldn't reach the server — it may be restarting. This notice will clear once the connection is back."
|
|
},
|
|
"boundary": {
|
|
"title": "Something went wrong.",
|
|
"subtitle": "The app hit an unexpected error.",
|
|
"reload": "Reload",
|
|
"notifTitle": "Something broke",
|
|
"notifMessage": "Unexpected error"
|
|
}
|
|
}
|