A reorder was invisible to the overlap bookkeeping: a failed removal reset the screen from a cache without it, and the membership guard never corrects an order. It now counts as a write, a rollback leaves the order to the read after the last write, and the accepted order keeps the rows it does not name, as the server does. Undo places come from the order on screen. A stored position landing during a write reaches the screen, and what a read brought is taken once the refresh is in. A write that went through drops its rows from the cache again, past a read from before it. Closing the player after Trash took the row it opened from no longer strands the focus: the row in that place takes it, else the header's box, else the list's menu. The page menu's grouping row closes its menu when it goes with the view. One hidden row gets its own wording. /search/clear refuses a body without its list.
172 lines
9.3 KiB
JSON
172 lines
9.3 KiB
JSON
{
|
||
"title": "Playlists",
|
||
"manageGroup": "Manage",
|
||
"listGroup": "Your playlists",
|
||
"watchLater": "Watch later",
|
||
"syncYoutube": "Sync from YouTube",
|
||
"syncedToast_one": "Synced {{count}} playlist from YouTube",
|
||
"syncedToast_other": "Synced {{count}} playlists from YouTube",
|
||
"syncFailed": "Couldn't sync from YouTube",
|
||
"noneYet": "No playlists yet",
|
||
"newPlaylist": "New playlist…",
|
||
"searchPlaceholder": "Search playlists…",
|
||
"noMatches": "No playlists match.",
|
||
"itemCount_one": "{{count}} video",
|
||
"itemCount_other": "{{count}} videos",
|
||
"pickOne": "Pick a playlist on the left.",
|
||
"loading": "Loading…",
|
||
"empty": "This playlist is empty — add videos from the Feed.",
|
||
"playAll": "Play all",
|
||
"delete": "Delete",
|
||
"rename": "Rename",
|
||
"confirmDelete": "Delete the playlist “{{name}}”? This can't be undone.",
|
||
"addToPlaylist": "Add to playlist…",
|
||
"addToPlaylistTitle": "Add to playlist",
|
||
"exportToYoutube": "Export to YouTube",
|
||
"pushToYoutube": "Sync to YouTube",
|
||
"unsynced": "Unsynced",
|
||
"unsyncedHint": "You have local changes not yet synced to YouTube.",
|
||
"openOnYoutube": "Open on YouTube",
|
||
"revert": "Reset to YouTube",
|
||
"revertTitle": "Discard local changes?",
|
||
"revertMsg": "This reloads the playlist from YouTube and discards your unsynced local changes (order, additions, removals, rename). Continue?",
|
||
"revertConfirm": "Discard & reload",
|
||
"revertDone": "“{{name}}” synced from YouTube",
|
||
"revertFailed": "Couldn't sync from YouTube",
|
||
"pushTitle": "Sync to YouTube",
|
||
"pushConfirm": "Sync",
|
||
"pushPlanCreate_one": "Create a new YouTube playlist with {{count}} video? (~{{units}} quota units; {{left}} left today.)",
|
||
"pushPlanCreate_other": "Create a new YouTube playlist with {{count}} videos? (~{{units}} quota units; {{left}} left today.)",
|
||
"mergeAddLocal_one": "{{count}} video added to Siftlode from YouTube.",
|
||
"mergeAddLocal_other": "{{count}} videos added to Siftlode from YouTube.",
|
||
"mergeRemoveLocal_one": "{{count}} video removed from Siftlode.",
|
||
"mergeRemoveLocal_other": "{{count}} videos removed from Siftlode.",
|
||
"mergeAddYt_one": "{{count}} video added to YouTube.",
|
||
"mergeAddYt_other": "{{count}} videos added to YouTube.",
|
||
"mergeRemoveYt_one": "{{count}} video removed from YouTube.",
|
||
"mergeRemoveYt_other": "{{count}} videos removed from YouTube.",
|
||
"mergeReorder_one": "{{count}} video reordered on YouTube.",
|
||
"mergeReorder_other": "{{count}} videos reordered on YouTube.",
|
||
"mergeRename": "The playlist will be renamed on YouTube.",
|
||
"mergeYtUnchanged": "Your YouTube playlist stays unchanged.",
|
||
"mergeLocalUnchanged": "Your Siftlode playlist stays unchanged.",
|
||
"mergeQuota": " (~{{units}} quota units; {{left}} left today.)",
|
||
"mergeQuotaFree": " (~0 quota units.)",
|
||
"pushNoQuota": "Not enough YouTube quota left today ({{left}}) for this sync (~{{units}} needed). Try again tomorrow.",
|
||
"pushUpToDate": "“{{name}}” is already in sync with YouTube",
|
||
"pushDone": "“{{name}}” synced to YouTube",
|
||
"pushPartial_one": "Synced, but {{count}} video was skipped",
|
||
"pushPartial_other": "Synced, but {{count}} videos were skipped",
|
||
"pushFailed": "Couldn't sync to YouTube",
|
||
"deleteHereOnly": "Delete here only",
|
||
"deleteYtFailed": "Couldn't delete on YouTube; deleted here only",
|
||
"sortLabel": "Sort",
|
||
"dirAsc": "Ascending",
|
||
"dirDesc": "Descending",
|
||
"groupByChannel": "Group by channel",
|
||
"railSortCustom": "Custom order",
|
||
"railSortName": "Name",
|
||
"railSortCount": "Video count",
|
||
"railSortDuration": "Total length",
|
||
"railSortRecent": "Recently changed",
|
||
"dirtyFirst": "Unsynced first",
|
||
"colTitle": "Title",
|
||
"colChannel": "Channel",
|
||
"colDuration": "Length",
|
||
"rowMenu": "Video actions",
|
||
"moveTo": "Move to another list",
|
||
"moveToRecent": "Move to “{{name}}”",
|
||
"moveNoTargets": "There is no other playlist to move it to yet",
|
||
"movedToast": "“{{title}}” moved to “{{name}}”",
|
||
"moveFailed": "Couldn't move the video",
|
||
"removedToast": "“{{title}}” removed from the playlist",
|
||
"undoRemoveFailed": "Couldn't put the video back",
|
||
"removeFailed": "Couldn't remove the video",
|
||
"errors": {
|
||
"name_required": "Give the playlist a name",
|
||
"youtube_read_scope": "Connect YouTube (read access) to sync your playlists",
|
||
"not_on_youtube": "This playlist isn't on YouTube",
|
||
"watch_later_not_pushable": "The Watch later list can't be sent to YouTube",
|
||
"watch_later_undeletable": "The Watch later list can't be deleted",
|
||
"youtube_editing_off": "Enable YouTube editing in Settings first",
|
||
"quota_exceeded": "Not enough YouTube quota left today for this sync",
|
||
"sync_busy": "This playlist is already syncing with YouTube — try again when it finishes",
|
||
"sync_all_busy": "Your playlists are already syncing with YouTube — try again when it finishes"
|
||
},
|
||
"moveErrors": {
|
||
"same_playlist": "That video is already in this playlist"
|
||
},
|
||
"railMenu": "Playlist actions",
|
||
"builtinLocked": "The built-in “{{name}}” list can’t be renamed or deleted.",
|
||
"removeItem": "Remove",
|
||
"removeItemOf": "Remove “{{title}}” from the playlist",
|
||
"dragHandleOf": "Reorder “{{title}}”",
|
||
"selectRow": "Select “{{title}}”",
|
||
"selectAllShown": "Select all the rows shown",
|
||
"selectedCount_one": "{{count}} selected",
|
||
"selectedCount_other": "{{count}} selected",
|
||
"selectedHidden_one": "{{count}} more hidden by the filter",
|
||
"selectedHidden_other": "{{count}} more hidden by the filter",
|
||
"selectedHiddenShort": "+{{n}}",
|
||
"clearSelection": "Clear selection",
|
||
"moveSelected": "Move to",
|
||
"removeSelected": "Remove",
|
||
"movedManyToast_one": "{{count}} video moved to “{{name}}”",
|
||
"movedManyToast_other": "{{count}} videos moved to “{{name}}”",
|
||
"removedManyToast_one": "{{count}} video removed from the playlist",
|
||
"removedManyToast_other": "{{count}} videos removed from the playlist",
|
||
"moveNoneLeft_one": "Nothing moved: it isn’t in this playlist any more",
|
||
"moveNoneLeft_other": "Nothing moved: they aren’t in this playlist any more",
|
||
"removeNoneLeft_one": "Nothing removed: it isn’t in this playlist any more",
|
||
"removeNoneLeft_other": "Nothing removed: they aren’t in this playlist any more",
|
||
"selectionCleared": "Selection cleared",
|
||
"removeAllHidden_one": "The selected row is hidden by the filter",
|
||
"removeAllHidden_other": "The selected rows are hidden by the filter",
|
||
"undoNoneBack_one": "Nothing came back: that video isn’t where it was any more",
|
||
"undoNoneBack_other": "Nothing came back: those videos aren’t where they were any more",
|
||
"undoSomeBack_one": "Only {{count}} video came back: the rest aren’t where they were any more",
|
||
"undoSomeBack_other": "Only {{count}} videos came back: the rest aren’t where they were any more",
|
||
"dragCancelledMany_one": "Move cancelled; {{count}} video stays where it was",
|
||
"dragCancelledMany_other": "Move cancelled; {{count}} videos stay where they were",
|
||
"moveTargetsFailed": "Your playlists couldn’t be loaded",
|
||
"moveTargetsLoading": "Loading your playlists…",
|
||
"moveManyFailed": "Couldn't move the videos",
|
||
"removeManyFailed": "Couldn't remove the videos",
|
||
"undoMoveFailed": "Couldn't move the video back",
|
||
"undoMoveManyFailed": "Couldn't move the videos back",
|
||
"undoRemoveManyFailed": "Couldn't put the videos back",
|
||
"dragHandleToList": "Drag “{{title}}” onto a list",
|
||
"dragPickedMany_one": "{{count}} video picked up",
|
||
"dragPickedMany_other": "{{count}} videos picked up",
|
||
"dragOverList": "Over “{{name}}”",
|
||
"dragDroppedOnList": "Dropped on “{{name}}”",
|
||
"dragBlockedSort": "Reordering by hand is off while a column sort or grouping is applied.",
|
||
"dragBlockedFilter": "Reordering by hand is off while a filter is applied.",
|
||
"clearView": "Reset view",
|
||
"saveOrder": "Save this order",
|
||
"filteredCount_one": "{{count}} shown",
|
||
"filteredCount_other": "{{count}} shown",
|
||
"noneMatchFilter": "No videos match the filter.",
|
||
"loadFailed": "Couldn't load this playlist",
|
||
"reorderFailed": "Couldn't save the new order",
|
||
"renameFailed": "Couldn't rename the playlist",
|
||
"deleteFailed": "Couldn't delete the playlist",
|
||
"confirmDeleteLinked": "Delete the playlist “{{name}}”? It is synced with YouTube — choose whether to delete it there as well. This can't be undone.",
|
||
"dragBlockedBuiltin": "This list's order is fixed — it can't be reordered by hand.",
|
||
"deleteBoth": "Delete here and on YouTube",
|
||
"viewGrouped": "grouped by channel",
|
||
"viewGroupedAnd": "grouped by channel, {{sort}}",
|
||
"viewDiffers": "Temporary view ({{view}}) — the playlist's saved order is unchanged. Save it to keep this order.",
|
||
"viewMatches": "This view ({{view}}) already matches the playlist's saved order, so there is nothing to save.",
|
||
"viewFiltered": "Filtered view — {{shown}} of {{total}} shown. The order can't be saved while a filter is on.",
|
||
"addFailed": "Couldn't add it to the playlist",
|
||
"limits": {
|
||
"hint": "Missing a list?",
|
||
"why": "Why?",
|
||
"title": "What YouTube lets Siftlode read",
|
||
"closed": "YouTube's own Watch later and History have been closed to its API since 2016, so no app can read them. The Watch later list here is Siftlode's own.",
|
||
"ownOnly": "Only playlists you own sync. Lists you saved from other channels are not returned.",
|
||
"noChannel": "A Google account with no YouTube channel has no playlists at all, as far as the API is concerned."
|
||
}
|
||
}
|