Backend (migration 0047_plex_collections): a plex_collections table mirrors every Plex collection (card metadata + smart flag + an editable flag reserved for Phase 2); membership is stored as GIN-indexed collection_keys on member movies (plex_items) and shows (plex_shows). The background sync (plex_sync) now fetches each library's collections + their children and rebuilds membership — so ALL reads are local (Plex's dual-language collection queries are slow; this trades a ~4-min background sync for instant reads). New /api/plex/collections endpoint; /browse gains a combinable filter; item_detail returns the movie's collection 'strips' (sibling titles as playable cards, smallest/most-specific collection first) — all pure local lookups. Frontend: PlexSidebar gains a searchable Collection picker + an active-collection chip; PlexInfo renders the collection strips (playable posters + 'Browse collection' → sets the filter); the collection is part of PlexFilters (persisted). i18n en/hu/de. Phase 2 (create/edit collections with write-back to Plex) is separate.
117 lines
4 KiB
JSON
117 lines
4 KiB
JSON
{
|
||
"navLabel": "Plex",
|
||
"backToFeed": "YouTube-Feed",
|
||
"backToLibrary": "Zurück zur Bibliothek",
|
||
"searchPlaceholder": "Plex durchsuchen…",
|
||
"sort": {
|
||
"added": "Kürzlich hinzugefügt",
|
||
"title": "Titel",
|
||
"year": "Jahr",
|
||
"rating": "IMDb-Wertung",
|
||
"duration": "Länge",
|
||
"release": "Erscheinungsdatum"
|
||
},
|
||
"filter": {
|
||
"library": "Bibliothek",
|
||
"show": "Anzeige",
|
||
"showOpt": {
|
||
"all": "Alle",
|
||
"unwatched": "Ungesehen",
|
||
"in_progress": "Läuft",
|
||
"watched": "Gesehen"
|
||
},
|
||
"sort": "Sortierung",
|
||
"clearAll": "Filter zurücksetzen",
|
||
"active": "Aktiv",
|
||
"any": "Alle",
|
||
"rating": "IMDb-Wertung",
|
||
"genre": "Genre",
|
||
"year": "Jahr",
|
||
"duration": "Länge",
|
||
"durationOpt": { "short": "Unter 90 Min.", "mid": "90–120 Min.", "long": "Über 2 Std." },
|
||
"added": "Zu Plex hinzugefügt",
|
||
"addedOpt": { "24h": "24 Std.", "1w": "1 Woche", "1m": "1 Monat", "6m": "6 Monate", "1y": "1 Jahr" },
|
||
"contentRating": "Altersfreigabe",
|
||
"match": { "any": "Beliebig", "all": "Alle" },
|
||
"dir": { "desc": "↓ Absteigend", "asc": "↑ Aufsteigend" },
|
||
"collection": "Sammlung",
|
||
"collectionSearch": "Sammlungen suchen…",
|
||
"collectionEmpty": "Keine Sammlungen"
|
||
},
|
||
"count": "{{count}} Titel",
|
||
"searchCount": "{{count}} Treffer",
|
||
"noMatches": "Keine Treffer.",
|
||
"loading": "Wird geladen…",
|
||
"empty": "Noch nichts hier. Starte eine Plex-Synchronisierung auf der Admin-Konfigurationsseite.",
|
||
"loadMore": "Mehr laden",
|
||
"watched": "Angesehen",
|
||
"play": "Abspielen",
|
||
"resume": "Fortsetzen",
|
||
"openShow": "Serie öffnen",
|
||
"markWatched": "Als gesehen markieren",
|
||
"markUnwatched": "Als ungesehen markieren",
|
||
"seasons": "{{count}} Staffeln",
|
||
"playerSoon": "Player kommt bald — „{{title}}“",
|
||
"people": {
|
||
"match": "Personen",
|
||
"actor": "Schauspieler",
|
||
"director": "Regie",
|
||
"count": "{{count}} Titel",
|
||
"added": "hinzugefügt"
|
||
},
|
||
"player": {
|
||
"loading": "Wird geladen…",
|
||
"back": "Zurück",
|
||
"skipIntro": "Intro überspringen",
|
||
"skipCredits": "Abspann überspringen",
|
||
"playPause": "Wiedergabe / Pause (Leertaste)",
|
||
"restart": "Von vorn beginnen",
|
||
"prev": "Vorherige Folge",
|
||
"next": "Nächste Folge",
|
||
"mute": "Stumm (m)",
|
||
"fullscreen": "Vollbild (f)",
|
||
"download": "Originaldatei herunterladen",
|
||
"tracks": "Audio & Untertitel",
|
||
"audio": "Audio",
|
||
"subtitles": "Untertitel",
|
||
"subOff": "Aus",
|
||
"errNotFound": "Diese Datei kann nicht abgespielt werden — die Medien sind auf dem Server nicht erreichbar (die Plex-Medieneinbindung fehlt oder die Pfadzuordnung ist falsch). Bitte den Administrator, die Plex-Konfiguration zu prüfen.",
|
||
"errTranscode": "Das Format dieser Datei erfordert eine Transkodierung, die noch nicht unterstützt wird.",
|
||
"errGeneric": "Die Wiedergabe konnte nicht gestartet werden. Bitte erneut versuchen.",
|
||
"stop": "Stopp",
|
||
"help": "Tastenkürzel",
|
||
"infoBtn": "Medieninfo",
|
||
"keys": {
|
||
"playPause": "Wiedergabe / Pause",
|
||
"seek": "10 Sekunden spulen",
|
||
"episode": "Vorherige / nächste Folge",
|
||
"volume": "Lautstärke lauter / leiser",
|
||
"mute": "Stumm",
|
||
"fullscreen": "Vollbild",
|
||
"info": "Medieninfo",
|
||
"back": "Stopp & zurück zum Feed",
|
||
"help": "Diese Hilfe anzeigen"
|
||
}
|
||
},
|
||
"info": {
|
||
"title": "Medieninfo",
|
||
"customize": "Ansicht anpassen",
|
||
"prefArtBg": "Dezenter Hintergrund",
|
||
"prefCast": "Besetzung",
|
||
"openImdb": "Bei IMDb öffnen",
|
||
"director": "Regie",
|
||
"cast": "Besetzung & Crew",
|
||
"markWatched": "Als gesehen markieren",
|
||
"markUnwatched": "Gesehen zurücknehmen",
|
||
"clearResume": "Fortsetzungsposition löschen",
|
||
"filterYear": "Titel aus {{year}}",
|
||
"filterRating": "Titel mit {{n}}+",
|
||
"filterActor": "Titel mit {{name}}",
|
||
"browseCollection": "Sammlung durchsuchen →"
|
||
},
|
||
"playable": {
|
||
"direct": "Spielt direkt im Browser",
|
||
"remux": "Braucht ein leichtes Remux (keine Video-Neucodierung)",
|
||
"transcode": "Braucht Transcoding (aufwendiger)"
|
||
}
|
||
}
|