Pick any number of channels; they OR together and every other filter applies across the lot — "the last week's unwatched from these three". `channelId`/`channelName` are replaced outright by `channelIds: string[]`, no legacy reader (standing rule: no back-compat unless asked — a saved view written against the old field simply loses its channel filter). The wire and the share URL move with it: repeated `channel_ids` params, `?channel=a,b`. Backend ORs via `Video.channel_id.in_()`; the count endpoint shares the same params object. Two things the migration exposed: - SavedViewsWidget fed DB blobs straight into serializers that now index an array — the FeedFilters type says nothing about what an older build wrote, so the blob is coerced where it enters. It white-screened the app before this. - Chips carried channelName to label themselves. Without it they resolve names from the channel cache, so they now fall back to the id, not a shared "This channel" that would render N identical chips while the cache loads.
81 lines
2.1 KiB
JSON
81 lines
2.1 KiB
JSON
{
|
||
"filters": "Filters",
|
||
"activeCount": "{{count}} active",
|
||
"clearAll": "Clear all",
|
||
"resetDefaults": "Reset to defaults",
|
||
"customize": "Customize sidebar",
|
||
"done": "Done",
|
||
"editHint": "Drag to reorder · eye to show/hide",
|
||
"channel": "Channel",
|
||
"loading": "Loading…",
|
||
"channelCount": "{{count}} channel",
|
||
"channelCount_other": "{{count}} channels",
|
||
"dragToReorder": "Drag to reorder",
|
||
"showWidget": "Show widget",
|
||
"hideWidget": "Hide widget",
|
||
"expand": "Expand",
|
||
"collapse": "Collapse",
|
||
"pin": "Pin panel open",
|
||
"unpin": "Unpin panel",
|
||
"any": "Any",
|
||
"all": "All",
|
||
"tagModeTooltip": "Match any vs all selected tags",
|
||
"match": "Match",
|
||
"custom": "Custom",
|
||
"from": "From",
|
||
"to": "To",
|
||
"clearDates": "clear dates",
|
||
"reshuffle": "Reshuffle",
|
||
"noMatchingTags": "No matching tags here",
|
||
"manageTags": "Manage",
|
||
"shareView": "Copy a link to this view",
|
||
"shareCopied": "View link copied to clipboard",
|
||
"shareFailed": "Couldn't copy the link",
|
||
"widget": {
|
||
"savedviews": "Saved views",
|
||
"show": "Show",
|
||
"sort": "Sort",
|
||
"date": "Upload date",
|
||
"content": "Content type",
|
||
"language": "Language",
|
||
"topic": "Topic",
|
||
"tags": "Your tags",
|
||
"channel": "Channel"
|
||
},
|
||
"show": {
|
||
"unwatched": "Unwatched",
|
||
"in_progress": "In progress",
|
||
"all": "All",
|
||
"watched": "Watched",
|
||
"saved": "Saved",
|
||
"hidden": "Hidden"
|
||
},
|
||
"sort": {
|
||
"newest": "Newest",
|
||
"oldest": "Oldest",
|
||
"views": "Most viewed",
|
||
"duration_desc": "Longest",
|
||
"duration_asc": "Shortest",
|
||
"title": "Name (A–Z)",
|
||
"subscribers": "Channel subscribers",
|
||
"priority": "Channel priority",
|
||
"shuffle": "Surprise me"
|
||
},
|
||
"content": {
|
||
"normal": "Normal",
|
||
"shorts": "Shorts",
|
||
"live": "Live / Upcoming"
|
||
},
|
||
"datePreset": {
|
||
"24h": "24h",
|
||
"1week": "1 week",
|
||
"1month": "1 month",
|
||
"6months": "6 months",
|
||
"1year": "1 year"
|
||
},
|
||
"channelSearch": "Search channels…",
|
||
"noChannelMatch": "No channel matches.",
|
||
"channelOrder": "Priority first, then A–Z",
|
||
"channelRemove": "Remove channel: {{name}}"
|
||
}
|