The two manual syncs (subscriptions import, playlist pull) had no YouTubeError
handler, so a quota, token or transport failure was a raw 500 and the blocking
"Server error" dialog (E9 F1). The other YouTube routes answered either the
upstream's English or a playlist-scoped "youtube_failed".
One helper, routes/_common.youtube_refusal: 422 {code: "youtube", reason} with
the reason sorted by what the user can do — quota (wait for the reset),
reconnect (the token step refused), unavailable (retry). Used by every route
that surfaces a YouTube failure; localizeDetail translates it.
"Reconnect" had no path: a grant Google revoked still read as granted, so
Settings and the wizard offered no connect button while every call failed.
An invalid_grant from the token endpoint now clears the stored grant.
101 lines
5.2 KiB
JSON
101 lines
5.2 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."
|
|
},
|
|
"admin": {
|
|
"not_allowed": "Their address isn't approved any more. Add it to the whitelist first.",
|
|
"not_applicable": "This account has nothing left to confirm.",
|
|
"not_approved": "Only an approved address can be invited.",
|
|
"email_off": "No mail was sent: this instance has no working SMTP setup. Check Configuration → Email / SMTP.",
|
|
"send_failed": "The mail couldn't be sent: the mail server was unreachable, or it refused the login or the message. Check Configuration → Email / SMTP, then try again.",
|
|
"demo": "The demo account is shared, so it can't get a set-password link."
|
|
},
|
|
"reason": {
|
|
"unreachable": "The server couldn't be reached. 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"
|
|
},
|
|
"youtube": {
|
|
"quota": "Today's YouTube budget for this instance is spent. It resets at midnight Pacific time — try again then.",
|
|
"reconnect": "Google no longer accepts this account's YouTube connection. Sign out and sign in with Google again to reconnect it.",
|
|
"unavailable": "YouTube didn't accept that just now. Please try again."
|
|
}
|
|
}
|