Deep-review of the quickfix batch surfaced two data/preference-loss bugs plus smaller items; all fixed with tests. - watch_sync _pull_apply: don't let the Plex-authoritative pull overwrite a DIRTY local row (a change whose immediate push failed) — that stranded the value forever since _repush_dirty only retries dirty rows. Leave it dirty for re-push. - PlexProvider / ChannelsProvider: a partial shared link opened in a fresh tab persisted mount-time DEFAULTS over the account's stored scope/sort/filters (base read before the account was pinned). Persist/keep only URL-present dims; re-hydrate the omitted ones from storage. - playback resume write-back: guard against out-of-order delivery (a superseded older push now drops) and evict the throttle map so it can't grow unbounded. - PlexPlayer: announce mid-playback buffering to assistive tech (role=status + sr-only label); new plex.player.buffering (HU+EN). - columnSort: hoist the shared key:dir sort codec used by both URL-state modules. - Tests: dirty-guard + flag-settle + per-key throttle scoping + superseded-push (backend); hold-repeat/suppress-click/unmount + partial-link no-clobber + refetch-doesn't-clobber-undo (frontend). Backend pytest 475, FE vitest 519.
335 lines
10 KiB
JSON
335 lines
10 KiB
JSON
{
|
||
"navLabel": "Plex",
|
||
"backToFeed": "YouTube feed",
|
||
"backToLibrary": "Back to library",
|
||
"collection": {
|
||
"playAll": "Play all",
|
||
"shuffle": "Shuffle",
|
||
"rename": "Rename",
|
||
"addItem": "Add title",
|
||
"delete": "Delete",
|
||
"enableEdit": "Enable editing",
|
||
"removeItem": "Remove from collection",
|
||
"removeConfirm": "Remove \"{{title}}\" from this collection? This affects all users on Plex.",
|
||
"nameMaybeTaken": "A collection with this name may already exist in another library — you can still create it here.",
|
||
"readOnly": "Read-only",
|
||
"empty": "This collection has no items.",
|
||
"more": "More",
|
||
"less": "Less",
|
||
"addSearch": "Search titles to add…",
|
||
"addHint": "Type to search for a title to add.",
|
||
"addNoResults": "No matches.",
|
||
"add": "Add",
|
||
"added": "Added",
|
||
"deleteConfirm": "Delete the collection \"{{title}}\"? This removes it from Plex too.",
|
||
"editFailed": "Collection edit failed",
|
||
"playFailed": "Couldn't build the play queue — try again.",
|
||
"playEmpty": "Nothing to play in this collection yet.",
|
||
"newCollection": "New collection",
|
||
"namePlaceholder": "Collection name",
|
||
"nameTaken": "A collection with this name already exists.",
|
||
"newHint": "Pick the first title to add — a collection needs at least one.",
|
||
"createWith": "Create"
|
||
},
|
||
"searchPlaceholder": "Search Plex…",
|
||
"searchField": {
|
||
"aria": "Search scope",
|
||
"all": "Everywhere",
|
||
"title": "Titles",
|
||
"people": "Cast & crew",
|
||
"summary": "Descriptions",
|
||
"episode": "Episodes"
|
||
},
|
||
"suggest": {
|
||
"aria": "Search suggestions"
|
||
},
|
||
"sort": {
|
||
"added": "Recently added",
|
||
"lastwatched": "Last watched",
|
||
"title": "Title",
|
||
"year": "Year",
|
||
"rating": "IMDb rating",
|
||
"duration": "Length",
|
||
"release": "Release date"
|
||
},
|
||
"filter": {
|
||
"scope": "Library",
|
||
"scopeOpt": {
|
||
"both": "All",
|
||
"movie": "Movies",
|
||
"show": "Shows",
|
||
"playlists": "Playlists",
|
||
"collections": "Collections"
|
||
},
|
||
"show": "Show",
|
||
"showOpt": {
|
||
"all": "All",
|
||
"unwatched": "Unwatched",
|
||
"in_progress": "In progress",
|
||
"watched": "Watched"
|
||
},
|
||
"sort": "Sort",
|
||
"clearAll": "Clear filters",
|
||
"active": "Active",
|
||
"any": "Any",
|
||
"rating": "IMDb rating",
|
||
"genre": "Genre",
|
||
"year": "Year",
|
||
"duration": "Length",
|
||
"durationUnit": "min",
|
||
"durationOpt": {
|
||
"short": "Under 90m",
|
||
"mid": "90–120m",
|
||
"long": "Over 2h"
|
||
},
|
||
"added": "Added to Plex",
|
||
"addedOpt": {
|
||
"24h": "24h",
|
||
"1w": "1 week",
|
||
"1m": "1 month",
|
||
"6m": "6 months",
|
||
"1y": "1 year"
|
||
},
|
||
"contentRating": "Age rating",
|
||
"match": {
|
||
"any": "Any",
|
||
"all": "All"
|
||
},
|
||
"dir": {
|
||
"desc": "↓ Descending",
|
||
"asc": "↑ Ascending"
|
||
},
|
||
"collection": "Collection",
|
||
"collectionSearch": "Search collections…",
|
||
"collectionEmpty": "No collections",
|
||
"matchLabel": "Match",
|
||
"studio": "Studio",
|
||
"moreRefine": "{{count}} more — refine with search"
|
||
},
|
||
"count": "{{count}} titles",
|
||
"searchCount": "{{count}} matches",
|
||
"noMatches": "No matches.",
|
||
"noMatchesFiltered_one": "No matches — a filter is also narrowing the results.",
|
||
"noMatchesFiltered_other": "No matches — {{count}} filters are also narrowing the results.",
|
||
"loading": "Loading…",
|
||
"empty": "Nothing here yet. Run a Plex sync from the admin Config page.",
|
||
"watched": "Watched",
|
||
"inProgress": "In progress",
|
||
"play": "Play",
|
||
"resume": "Resume",
|
||
"openShow": "Open show",
|
||
"markWatched": "Mark watched",
|
||
"markUnwatched": "Mark unwatched",
|
||
"watchedFailed": "Couldn't update the watched state — please try again.",
|
||
"seasons": "{{count}} seasons",
|
||
"unified": {
|
||
"titles": "Titles",
|
||
"episodes": "Episodes"
|
||
},
|
||
"series": {
|
||
"seasons": "Seasons",
|
||
"backToShow": "Back to show",
|
||
"episodeCount": "{{count}} episodes",
|
||
"playFromStart": "Play from start",
|
||
"related": "Related shows",
|
||
"markShowWatched": "Mark show watched",
|
||
"markShowUnwatched": "Mark show unwatched",
|
||
"markSeasonWatched": "Mark season watched",
|
||
"markSeasonUnwatched": "Mark season unwatched",
|
||
"addShowCollection": "Add to collection"
|
||
},
|
||
"collEditor": {
|
||
"manage": "Collections",
|
||
"title": "Collections — {{title}}",
|
||
"newPlaceholder": "New collection name…",
|
||
"create": "Create",
|
||
"search": "Filter collections…",
|
||
"none": "No editable collections yet. Create one above.",
|
||
"count": "{{count}} items",
|
||
"delete": "Delete",
|
||
"deleteConfirm": "Delete the collection \"{{title}}\" from Plex? This affects all users.",
|
||
"note": "Changes are written to Plex and shared across all clients and users.",
|
||
"others": "Manage {{count}} existing collections…",
|
||
"makeEditable": "Manage"
|
||
},
|
||
"player": {
|
||
"loading": "Loading…",
|
||
"buffering": "Buffering…",
|
||
"back": "Back",
|
||
"skipIntro": "Skip intro",
|
||
"skipCredits": "Skip credits",
|
||
"playPause": "Play / pause (space)",
|
||
"restart": "Restart from beginning",
|
||
"prev": "Previous episode",
|
||
"next": "Next episode",
|
||
"mute": "Mute (m)",
|
||
"fullscreen": "Fullscreen (f)",
|
||
"download": "Download original file",
|
||
"tracks": "Audio & subtitles",
|
||
"audio": "Audio",
|
||
"subtitles": "Subtitles",
|
||
"subOff": "Off",
|
||
"errNotFound": "This file can't be played — the media isn't reachable on the server (the Plex media mount is missing or the path map is wrong). Ask the admin to check the Plex configuration.",
|
||
"errTranscode": "This file's format needs transcoding, which isn't supported yet.",
|
||
"errGeneric": "Playback couldn't start. Please try again.",
|
||
"stop": "Stop",
|
||
"help": "Keyboard shortcuts",
|
||
"infoBtn": "Media info",
|
||
"keys": {
|
||
"playPause": "Play / pause",
|
||
"seek": "Seek 10 seconds",
|
||
"episode": "Previous / next episode",
|
||
"volume": "Volume up / down",
|
||
"mute": "Mute",
|
||
"fullscreen": "Fullscreen",
|
||
"info": "Media info",
|
||
"back": "Stop & back to feed",
|
||
"help": "Show this help",
|
||
"audio": "Cycle audio track",
|
||
"subtitle": "Cycle subtitle",
|
||
"fineSeek": "Fine seek"
|
||
},
|
||
"settings": "Settings",
|
||
"sync": "Offsets",
|
||
"subOffset": "Subtitle delay",
|
||
"audioOffset": "Audio delay",
|
||
"playback": "Playback",
|
||
"seekStep": "Seek step",
|
||
"fineSeek": "Fine seek (Ctrl)",
|
||
"autoHide": "Auto-hide controls",
|
||
"subStyle": "Subtitles",
|
||
"subSize": "Text size",
|
||
"subPos": "Position",
|
||
"subColor": "Text color",
|
||
"subBg": "Background",
|
||
"subBgNone": "None",
|
||
"clock": "Clock",
|
||
"clockShow": "Show clock",
|
||
"clock24h": "24-hour",
|
||
"clockSize": "Size",
|
||
"clockColor": "Color",
|
||
"clockDate": "Show date",
|
||
"subShadow": "Shadow",
|
||
"subShadowColor": "Shadow color",
|
||
"autoSkipIntro": "Auto-skip intro",
|
||
"autoSkipCredits": "Auto-skip credits",
|
||
"autoSkipDelay": "Auto-skip delay"
|
||
},
|
||
"info": {
|
||
"title": "Media info",
|
||
"customize": "Customize view",
|
||
"prefArtBg": "Faint backdrop",
|
||
"prefCast": "Cast & crew",
|
||
"prefRelated": "Related shows",
|
||
"prefFacts": "Details",
|
||
"prefKeywords": "Keywords",
|
||
"prefCrew": "Crew",
|
||
"stripSource": {
|
||
"collection": "Collections",
|
||
"imdb": "IMDb",
|
||
"tmdb": "TMDb",
|
||
"tvdb": "TVDb",
|
||
"trakt": "Trakt",
|
||
"smart": "Smart lists"
|
||
},
|
||
"openImdb": "Open on IMDb",
|
||
"director": "Director",
|
||
"cast": "Cast & crew",
|
||
"markWatched": "Mark watched",
|
||
"markUnwatched": "Mark unwatched",
|
||
"clearResume": "Clear resume position",
|
||
"filterYear": "Show titles from {{year}}",
|
||
"filterRating": "Show titles rated {{n}}+",
|
||
"filterActor": "Show titles with {{name}}",
|
||
"viewPerson": "View {{name}}'s filmography",
|
||
"browseCollection": "Browse collection →",
|
||
"audience": "Audience",
|
||
"keywords": "Keywords",
|
||
"crew": "Crew",
|
||
"filterKeyword": "Filter by \"{{name}}\"",
|
||
"facts": {
|
||
"title": "Details",
|
||
"release": "Released",
|
||
"runtime": "Runtime",
|
||
"cert": "Rating",
|
||
"budget": "Budget",
|
||
"revenue": "Revenue",
|
||
"studios": "Studios",
|
||
"countries": "Countries"
|
||
},
|
||
"prefCrossfade": "Crossfade backdrop"
|
||
},
|
||
"playable": {
|
||
"direct": "Plays directly in the browser",
|
||
"remux": "Needs a light remux (no video re-encode)",
|
||
"transcode": "Needs transcoding (heavier)"
|
||
},
|
||
"playlistAdd": {
|
||
"manage": "Add to playlist",
|
||
"title": "Add to playlist — {{title}}",
|
||
"newPlaceholder": "New playlist name…",
|
||
"create": "Create",
|
||
"none": "No playlists yet. Create one above.",
|
||
"count": "{{count}} items",
|
||
"groupProgress": "{{in}} / {{size}}"
|
||
},
|
||
"playlist": {
|
||
"section": "Playlists",
|
||
"newPlaceholder": "New playlist…",
|
||
"pickerPlaceholder": "Find or create a playlist…",
|
||
"createNamed": "Create \"{{name}}\"",
|
||
"create": "Create playlist",
|
||
"none": "No playlists yet.",
|
||
"deleteConfirm": "Delete the playlist \"{{title}}\"?",
|
||
"rename": "Rename",
|
||
"playAll": "Play all",
|
||
"delete": "Delete playlist",
|
||
"empty": "This playlist is empty. Add titles from their info page.",
|
||
"layoutLabel": "Layout",
|
||
"layoutAccordion": "Accordion view",
|
||
"layoutTree": "Tree view",
|
||
"removeShow": "Remove whole show",
|
||
"removeSeason": "Remove whole season",
|
||
"episodes": "{{count}} episodes",
|
||
"season": "Season {{n}}",
|
||
"seasonUnknown": "Episodes",
|
||
"addShow": "Add whole show to a playlist",
|
||
"addSeason": "Add season to a playlist",
|
||
"addEpisode": "Add episode to a playlist"
|
||
},
|
||
"people": {
|
||
"count_one": "{{count}} title",
|
||
"count_other": "{{count}} titles",
|
||
"remove": "Remove from filter"
|
||
},
|
||
"person": {
|
||
"credits": "{{movies}} movies · {{shows}} shows",
|
||
"filterBy": "Filter library by {{name}}",
|
||
"movies": "Movies ({{count}})",
|
||
"shows": "Shows ({{count}})",
|
||
"empty": "No titles found for this person.",
|
||
"born": "Born",
|
||
"died": "Died",
|
||
"aka": "Also known as",
|
||
"knownFor": "Known for"
|
||
},
|
||
"view": {
|
||
"label": "View",
|
||
"browse": "Browse"
|
||
},
|
||
"browse": {
|
||
"items": "{{count}} items"
|
||
},
|
||
"discover": {
|
||
"tab": "Discover",
|
||
"continueWatching": "Continue watching",
|
||
"recentlyWatched": "Recently watched",
|
||
"recentlyAdded": "Recently added",
|
||
"surprise": "Surprise me",
|
||
"reshuffle": "Reshuffle",
|
||
"byGenre": "Browse by genre",
|
||
"becauseWatched": "Because you watched {{title}}",
|
||
"empty": "Nothing to discover yet — run a Plex sync from the admin Config page."
|
||
}
|
||
}
|