From eebe9280cbfd57842293151dc9c6d00756a91966 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Mon, 14 Sep 2026 06:20:30 +0200 Subject: [PATCH] =?UTF-8?q?Die=20Oberfl=C3=A4che=20wei=C3=9F=20nicht=20meh?= =?UTF-8?q?r,=20dass=20es=20Plex=20gibt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keine Datei unter Views/LiveTV importiert noch PlexKit. Sender, Programm und Einschalten laufen über den neutralen Vertrag, und supportsLiveTV fragt endlich die Fähigkeit ab statt "server != nil" — womit die Zusage in JellyfinBackend.capabilities zum ersten Mal stimmt. Der Player holt die laufende Sendung jetzt für genau einen Sender nach. Vorher ging dafür das Raster über alle Sender hinaus, weil der Plex-Weg keinen schmaleren kannte; im neutralen Vertrag ist die Senderliste ein Parameter. Co-Authored-By: Claude Opus 5 --- Flixy/Resources/Localizable.xcstrings | 7662 +++++++++-------- Flixy/Session/FlixySession.swift | 22 +- .../Views/LiveTV/ChannelSelectionSheet.swift | 16 +- Flixy/Views/LiveTV/LiveTVView.swift | 58 +- Flixy/Views/LiveTV/ProgramGuide.swift | 26 +- Flixy/Views/Navigation/RootView.swift | 3 +- Flixy/Views/Player/PlayerModel.swift | 28 +- .../FlixyKit/Sources/MediaKit/LiveTV.swift | 12 + 8 files changed, 3930 insertions(+), 3897 deletions(-) diff --git a/Flixy/Resources/Localizable.xcstrings b/Flixy/Resources/Localizable.xcstrings index 8ddbbf7..01342d1 100644 --- a/Flixy/Resources/Localizable.xcstrings +++ b/Flixy/Resources/Localizable.xcstrings @@ -1,5956 +1,5964 @@ { - "sourceLanguage": "en", - "strings": { - "%@ → %@": { - "comment": "A line in a diagnostic trace that shows a network request path and its result. The first argument is the network request path. The second argument is the network response result.", - "isCommentAutoGenerated": true, - "localizations": { - "en": { - "stringUnit": { - "state": "new", - "value": "%1$@ → %2$@" + "sourceLanguage" : "en", + "strings" : { + " · " : { + "comment" : "A separator between different parts of the episode metadata.", + "isCommentAutoGenerated" : true + }, + "%@ → %@" : { + "comment" : "A line in a diagnostic trace that shows a network request path and its result. The first argument is the network request path. The second argument is the network response result.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ → %2$@" } } } }, - "%@ GB": { - "comment": "A picker option in the settings view that lets the user select the maximum amount of storage space that can be used for downloaded content. The value is given in gigabytes.", - "isCommentAutoGenerated": true + "%@ GB" : { + "comment" : "A picker option in the settings view that lets the user select the maximum amount of storage space that can be used for downloaded content. The value is given in gigabytes.", + "isCommentAutoGenerated" : true }, - "4K": { - "comment": "A label for a 4K video.", - "isCommentAutoGenerated": true + "4K" : { + "comment" : "A label for a 4K video.", + "isCommentAutoGenerated" : true }, - "720p": { - "comment": "A label for a 720p video.", - "isCommentAutoGenerated": true + "720p" : { + "comment" : "A label for a 720p video.", + "isCommentAutoGenerated" : true }, - "1080p": { - "comment": "A label for a 1080p video.", - "isCommentAutoGenerated": true + "1080p" : { + "comment" : "A label for a 1080p video.", + "isCommentAutoGenerated" : true }, - "account.hint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Öffnet Einstellungen und Abmelden" + "account.hint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öffnet Einstellungen und Abmelden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Opens settings and sign out" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opens settings and sign out" } } } }, - "account.settings": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Einstellungen" + "account.settings" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einstellungen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Settings" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settings" } } } }, - "action.addFavourite": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zu Favoriten" + "action.addFavourite" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zu Favoriten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Add to favourites" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add to favourites" } } } }, - "action.apply": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Übernehmen" + "action.apply" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Übernehmen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Apply" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apply" } } } }, - "action.cancel": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Abbrechen" + "action.cancel" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbrechen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Cancel" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel" } } } }, - "action.clearRating": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bewertung entfernen" + "action.clearRating" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bewertung entfernen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Clear rating" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clear rating" } } } }, - "action.close": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Schließen" + "action.close" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Close" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Close" } } } }, - "action.delete": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Löschen" + "action.delete" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löschen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Delete" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete" } } } }, - "action.done": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Fertig" + "action.done" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fertig" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Done" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Done" } } } }, - "action.markUnwatched": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Als ungesehen markieren" + "action.markUnwatched" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Als ungesehen markieren" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Mark as unwatched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mark as unwatched" } } } }, - "action.markWatched": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Als gesehen markieren" + "action.markWatched" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Als gesehen markieren" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Mark as watched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mark as watched" } } } }, - "action.rate": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bewerten" + "action.rate" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bewerten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Rate" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rate" } } } }, - "action.removeFavourite": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Aus Favoriten entfernen" + "action.removeFavourite" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aus Favoriten entfernen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Remove from favourites" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remove from favourites" } } } }, - "action.retry": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Erneut versuchen" + "action.retry" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erneut versuchen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Try again" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Try again" } } } }, - "action.signOut": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Abmelden" + "action.signOut" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abmelden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign out" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign out" } } } }, - "appearance.accent": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Akzentfarbe" + "appearance.accent" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akzentfarbe" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Accent color" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accent color" } } } }, - "appearance.accentExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Farbe erscheint auf Knöpfen, Fortschrittsbalken und der ausgewählten Zeile in der Seitenleiste." + "appearance.accentExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Farbe erscheint auf Knöpfen, Fortschrittsbalken und der ausgewählten Zeile in der Seitenleiste." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The color appears on buttons, progress bars and the selected row in the sidebar." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The color appears on buttons, progress bars and the selected row in the sidebar." } } } }, - "appearance.adjusted %@": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Farbe wurde auf %@ aufgehellt, damit sie auf dem dunklen Hintergrund lesbar bleibt." + "appearance.adjusted %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Farbe wurde auf %@ aufgehellt, damit sie auf dem dunklen Hintergrund lesbar bleibt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Lightened to %@ so it stays readable on the dark background." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lightened to %@ so it stays readable on the dark background." } } } }, - "appearance.customColor": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Eigene Farbe" + "appearance.customColor" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eigene Farbe" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Custom color" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Custom color" } } } }, - "appearance.hexPlaceholder": { - "comment": "Beispiel für eine Hex-Farbe", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "#1DB954" + "appearance.hexPlaceholder" : { + "comment" : "Beispiel für eine Hex-Farbe", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "#1DB954" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "#1DB954" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "#1DB954" } } } }, - "appearance.invalidHex": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Das ist keine gültige Farbe. Erwartet wird etwas wie #1DB954." + "appearance.invalidHex" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das ist keine gültige Farbe. Erwartet wird etwas wie #1DB954." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "That's not a valid color. Try something like #1DB954." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "That's not a valid color. Try something like #1DB954." } } } }, - "appearance.navigation": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Navigation" + "appearance.navigation" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navigation" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Navigation" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navigation" } } } }, - "appearance.navigationExplanation": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Seitlich fährt die Leiste über den Inhalt und gibt ihn danach wieder frei. Oben stehen alle Einträge gleichzeitig da und nehmen dauerhaft eine Zeile ein." + "appearance.navigationExplanation" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seitlich fährt die Leiste über den Inhalt und gibt ihn danach wieder frei. Oben stehen alle Einträge gleichzeitig da und nehmen dauerhaft eine Zeile ein." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "At the side, the bar slides over the content and gets out of the way again. At the top, every entry is visible at once and takes up a row permanently." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "At the side, the bar slides over the content and gets out of the way again. At the top, every entry is visible at once and takes up a row permanently." } } } }, - "appearance.navigationSide": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Seitlich" + "appearance.navigationSide" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seitlich" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "At the side" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "At the side" } } } }, - "appearance.navigationTop": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Oben" + "appearance.navigationTop" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oben" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "At the top" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "At the top" } } } }, - "appearance.preview": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Vorschau" + "appearance.preview" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vorschau" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Preview" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preview" } } } }, - "appearance.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Erscheinungsbild" + "appearance.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erscheinungsbild" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Appearance" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appearance" } } } }, - "connecting.searching": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Server werden gesucht …" + "connecting.searching" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server werden gesucht …" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Looking for servers…" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Looking for servers…" } } } }, - "connecting.to %@": { - "comment": "Platzhalter: Servername", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbinde mit %@ …" + "connecting.to %@" : { + "comment" : "Platzhalter: Servername", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbinde mit %@ …" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Connecting to %@…" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connecting to %@…" } } } }, - "detail.cast": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Besetzung" + "detail.cast" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Besetzung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Cast" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cast" } } } }, - "detail.episodeCount %lld": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Folgen" + "detail.episodeCount %lld" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Folgen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld episodes" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld episodes" } } } }, - "detail.episodes": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Folgen" + "detail.episodes" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Episodes" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Episodes" } } } }, - "detail.playFromStart": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Von vorn abspielen" + "detail.playFromStart" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Von vorn abspielen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Play from start" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Play from start" } } } }, - "detail.seasons": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Staffeln" + "detail.seasons" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Staffeln" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Seasons" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seasons" } } } }, - "detail.toSeason": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zur Staffel" + "detail.toSeason" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zur Staffel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Go to season" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Go to season" } } } }, - "detail.toSeries": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zur Serie" + "detail.toSeries" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zur Serie" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Go to series" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Go to series" } } } }, - "detail.unwatchedCount %lld": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld ungesehen" + "detail.unwatchedCount %lld" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ungesehen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld unwatched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld unwatched" } } } }, - "detail.versions": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Fassung" + "detail.versions" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fassung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Version" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version" } } } }, - "diagnostics.connection": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbindung" + "diagnostics.connection" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbindung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Connection" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connection" } } } }, - "diagnostics.connectionUsed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbindung" + "diagnostics.connectionUsed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbindung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Connection" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connection" } } } }, - "diagnostics.copy": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bericht kopieren" + "diagnostics.copy" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bericht kopieren" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Copy report" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copy report" } } } }, - "diagnostics.copyHint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Enthält keinen Token. Kannst du unbesorgt weitergeben." + "diagnostics.copyHint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enthält keinen Token. Kannst du unbesorgt weitergeben." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Contains no token. Safe to share." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contains no token. Safe to share." } } } }, - "diagnostics.lastAttempt": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Letzter Abspielversuch" + "diagnostics.lastAttempt" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Letzter Abspielversuch" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Last playback attempt" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Last playback attempt" } } } }, - "diagnostics.liveTV": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Live-TV-Antwort ansehen" + "diagnostics.liveTV" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live-TV-Antwort ansehen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Inspect Live TV response" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inspect Live TV response" } } } }, - "diagnostics.liveTVHint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zeigt den Aufbau der Serverantwort — nur Schlüssel, Anzahl und Sendernamen, keine Zugangsdaten. Hilft dabei zu finden, wo die Sender stehen." + "diagnostics.liveTVHint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zeigt den Aufbau der Serverantwort — nur Schlüssel, Anzahl und Sendernamen, keine Zugangsdaten. Hilft dabei zu finden, wo die Sender stehen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Shows the structure of the server's response — keys, counts and channel names only, no credentials. Helps locate where the channels are." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shows the structure of the server's response — keys, counts and channel names only, no credentials. Helps locate where the channels are." } } } }, - "diagnostics.method": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Weg" + "diagnostics.method" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weg" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Method" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Method" } } } }, - "diagnostics.noServer": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Keine Serververbindung." + "diagnostics.noServer" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Serververbindung." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No server connection." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No server connection." } } } }, - "diagnostics.nothingYet": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Noch nichts abgespielt." + "diagnostics.nothingYet" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noch nichts abgespielt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Nothing played yet." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nothing played yet." } } } }, - "diagnostics.relayWarning": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Über die Plex-Vermittlung. Stark gedrosselt — große Dateien laufen darüber kaum an." + "diagnostics.relayWarning" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Über die Plex-Vermittlung. Stark gedrosselt — große Dateien laufen darüber kaum an." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Via the Plex relay. Heavily throttled — large files barely start over it." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via the Plex relay. Heavily throttled — large files barely start over it." } } } }, - "diagnostics.source": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Quelle (ohne Token)" + "diagnostics.source" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quelle (ohne Token)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Source (token removed)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Source (token removed)" } } } }, - "diagnostics.steps": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ablauf" + "diagnostics.steps" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ablauf" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Timeline" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeline" } } } }, - "diagnostics.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Diagnose" + "diagnostics.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diagnose" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Diagnostics" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diagnostics" } } } }, - "diagnostics.title.label": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Titel" + "diagnostics.title.label" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Titel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Title" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Title" } } } }, - "downloads.active": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Läuft gerade" + "downloads.active" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Läuft gerade" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "In progress" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "In progress" } } } }, - "downloads.allEpisodes": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Alle Folgen laden" + "downloads.allEpisodes" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle Folgen laden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Download all episodes" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download all episodes" } } } }, - "downloads.available": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Offline verfügbar" + "downloads.available" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Offline verfügbar" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Available offline" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Available offline" } } } }, - "downloads.batch.queued %lld": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Folgen in die Warteschlange gelegt." + "downloads.batch.queued %lld" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Folgen in die Warteschlange gelegt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Queued %lld episodes." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Queued %lld episodes." } } } }, - "downloads.batch.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Downloads" + "downloads.batch.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downloads" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Downloads" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downloads" } } } }, - "downloads.batch.unavailable %lld": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Folgen haben keine abspielbare Datei auf dem Server." + "downloads.batch.unavailable %lld" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Folgen haben keine abspielbare Datei auf dem Server." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld episodes have no playable file on the server." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld episodes have no playable file on the server." } } } }, - "downloads.cancel": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Download abbrechen" + "downloads.cancel" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download abbrechen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Cancel download" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel download" } } } }, - "downloads.download": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Herunterladen" + "downloads.download" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Herunterladen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Download" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download" } } } }, - "downloads.empty.description": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Lade Filme und Folgen herunter, um sie ohne Verbindung anzusehen." + "downloads.empty.description" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lade Filme und Folgen herunter, um sie ohne Verbindung anzusehen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Download movies and episodes to watch them without a connection." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download movies and episodes to watch them without a connection." } } } }, - "downloads.empty.title": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nichts offline" + "downloads.empty.title" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nichts offline" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Nothing offline" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nothing offline" } } } }, - "downloads.failed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Fehlgeschlagen" + "downloads.failed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehlgeschlagen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Failed" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Failed" } } } }, - "downloads.hold.offline": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Keine Verbindung" + "downloads.hold.offline" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Verbindung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No connection" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No connection" } } } }, - "downloads.hold.offline.description": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ohne Verbindung geht nichts weiter. Angefangene Downloads laufen weiter, sobald das Gerät wieder am Netz ist." + "downloads.hold.offline.description" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ohne Verbindung geht nichts weiter. Angefangene Downloads laufen weiter, sobald das Gerät wieder am Netz ist." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Nothing transfers without a connection. Started downloads continue once the device is back online." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nothing transfers without a connection. Started downloads continue once the device is back online." } } } }, - "downloads.hold.wifi": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wartet auf WLAN" + "downloads.hold.wifi" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wartet auf WLAN" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Waiting for Wi-Fi" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Waiting for Wi-Fi" } } } }, - "downloads.hold.wifi.description": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "„Nur über WLAN“ ist eingeschaltet und das Gerät hängt gerade am Mobilfunk. Sobald WLAN da ist, geht es von selbst weiter." + "downloads.hold.wifi.description" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "„Nur über WLAN“ ist eingeschaltet und das Gerät hängt gerade am Mobilfunk. Sobald WLAN da ist, geht es von selbst weiter." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "“Wi-Fi only” is on and the device is on cellular. Transfers resume by themselves once Wi-Fi is back." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "“Wi-Fi only” is on and the device is on cellular. Transfers resume by themselves once Wi-Fi is back." } } } }, - "downloads.movies": { - "comment": "Überschrift für heruntergeladene Filme", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Filme" + "downloads.movies" : { + "comment" : "Überschrift für heruntergeladene Filme", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filme" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Movies" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Movies" } } } }, - "downloads.pause": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Anhalten" + "downloads.pause" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anhalten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Pause" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pause" } } } }, - "downloads.paused": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Angehalten" + "downloads.paused" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Angehalten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Paused" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paused" } } } }, - "downloads.quality.approx %@ %@": { - "comment": "Platzhalter: Stufenname, geschätzte Größe", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%@ · etwa %@" + "downloads.quality.approx %@ %@" : { + "comment" : "Platzhalter: Stufenname, geschätzte Größe", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ · etwa %@" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%@ · about %@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ · about %@" } } } }, - "downloads.quality.hint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Niedrigere Stufen rechnet der Server unterwegs herunter. Das dauert länger, spart aber deutlich Platz." + "downloads.quality.hint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niedrigere Stufen rechnet der Server unterwegs herunter. Das dauert länger, spart aber deutlich Platz." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Lower levels are transcoded by the server. That takes longer but saves a lot of space." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lower levels are transcoded by the server. That takes longer but saves a lot of space." } } } }, - "downloads.quality.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "In welcher Qualität?" + "downloads.quality.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "In welcher Qualität?" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Which quality?" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Which quality?" } } } }, - "downloads.queued": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wartet" + "downloads.queued" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wartet" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Queued" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Queued" } } } }, - "downloads.refused.exists": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Dieser Titel steht bereits in der Warteschlange." + "downloads.refused.exists" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieser Titel steht bereits in der Warteschlange." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "This title is already queued." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This title is already queued." } } } }, - "downloads.refused.limit %@ %@": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Das Speicherlimit ist erreicht: %@ von %@ belegt." + "downloads.refused.limit %@ %@" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das Speicherlimit ist erreicht: %@ von %@ belegt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Storage limit reached: %@ of %@ used." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storage limit reached: %@ of %@ used." } } } }, - "downloads.refused.noMedia": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zu diesem Titel liegt keine Datei auf dem Server." + "downloads.refused.noMedia" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zu diesem Titel liegt keine Datei auf dem Server." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "There's no file for this title on the server." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "There's no file for this title on the server." } } } }, - "downloads.refused.noPart": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Datei auf dem Server hat keinen abrufbaren Teil. Möglicherweise wurde sie noch nicht analysiert." + "downloads.refused.noPart" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Datei auf dem Server hat keinen abrufbaren Teil. Möglicherweise wurde sie noch nicht analysiert." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The file on the server has no retrievable part. It may not have been analyzed yet." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The file on the server has no retrievable part. It may not have been analyzed yet." } } } }, - "downloads.refused.noServer": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Keine Verbindung zum Server." + "downloads.refused.noServer" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Verbindung zum Server." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No connection to the server." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No connection to the server." } } } }, - "downloads.refused.noURL": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Download-Adresse ließ sich nicht bilden." + "downloads.refused.noURL" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Download-Adresse ließ sich nicht bilden." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The download address couldn't be built." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The download address couldn't be built." } } } }, - "downloads.refused.space %@ %@": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zu wenig Platz auf dem Gerät: %@ nötig, %@ frei." + "downloads.refused.space %@ %@" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zu wenig Platz auf dem Gerät: %@ nötig, %@ frei." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Not enough space on this device: %@ needed, %@ free." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Not enough space on this device: %@ needed, %@ free." } } } }, - "downloads.refused.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Download nicht möglich" + "downloads.refused.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download nicht möglich" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Can't download" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Can't download" } } } }, - "downloads.removeConfirm": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Download entfernen?" + "downloads.removeConfirm" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download entfernen?" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Remove download?" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remove download?" } } } }, - "downloads.resume": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Fortsetzen" + "downloads.resume" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fortsetzen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Resume" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resume" } } } }, - "downloads.season": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Staffel laden" + "downloads.season" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Staffel laden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Download season" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download season" } } } }, - "downloads.used": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Belegt" + "downloads.used" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Belegt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Used" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Used" } } } }, - "downloads.wifiOnly": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nur über WLAN laden" + "downloads.wifiOnly" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur über WLAN laden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Download over Wi-Fi only" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Download over Wi-Fi only" } } } }, - "episode.short %lld %lld": { - "comment": "Staffel- und Folgennummer", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "S%lld E%lld" + "episode.number" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Episode %lld" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "S%lld E%lld" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Episode %lld" } } } }, - "error.noServers": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "An deinem Plex-Konto hängt kein Server." + "episode.number %@" : { + + }, + "episode.short %lld %lld" : { + "comment" : "Staffel- und Folgennummer", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "S%lld E%lld" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "There's no server on your Plex account." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "S%lld E%lld" } } } }, - "error.notFound": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Dieser Titel ist auf dem Server nicht mehr vorhanden." + "error.noServers" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "An deinem Plex-Konto hängt kein Server." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "This title is no longer on the server." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "There's no server on your Plex account." } } } }, - "error.server %lld": { - "comment": "Platzhalter: HTTP-Statuscode", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Server hat mit Fehler %lld geantwortet." + "error.notFound" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieser Titel ist auf dem Server nicht mehr vorhanden." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server responded with error %lld." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This title is no longer on the server." } } } }, - "error.serverUnreachable": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Server ist nicht erreichbar. Prüfe, ob er läuft und ob du im selben Netzwerk bist." + "error.server %lld" : { + "comment" : "Platzhalter: HTTP-Statuscode", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Server hat mit Fehler %lld geantwortet." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server can't be reached. Check that it's running and that you're on the same network." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server responded with error %lld." } } } }, - "error.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Das hat nicht geklappt" + "error.serverUnreachable" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Server ist nicht erreichbar. Prüfe, ob er läuft und ob du im selben Netzwerk bist." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Something went wrong" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server can't be reached. Check that it's running and that you're on the same network." } } } }, - "error.unauthorized": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Anmeldung ist abgelaufen. Melde dich erneut an." + "error.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das hat nicht geklappt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Your sign-in has expired. Please sign in again." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Something went wrong" } } } }, - "error.unexpectedResponse": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Antwort des Servers war unerwartet. Möglicherweise ist eine neuere Plex-Version installiert." + "error.unauthorized" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Anmeldung ist abgelaufen. Melde dich erneut an." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server's response was unexpected. It may be running a newer version of Plex." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your sign-in has expired. Please sign in again." } } } }, - "filter.any": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Alle" + "error.unexpectedResponse" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Antwort des Servers war unerwartet. Möglicherweise ist eine neuere Plex-Version installiert." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Any" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server's response was unexpected. It may be running a newer version of Plex." } } } }, - "filter.filters": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Filter" + "filter.any" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Filters" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Any" } } } }, - "filter.genre": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Genre" + "filter.filters" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filter" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Genre" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filters" } } } }, - "filter.reset": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zurücksetzen" + "filter.genre" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Genre" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Reset" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Genre" } } } }, - "filter.resolution": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auflösung" + "filter.reset" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zurücksetzen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Resolution" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reset" } } } }, - "filter.sort": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sortierung" + "filter.resolution" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auflösung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sort by" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolution" } } } }, - "filter.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Filter" + "filter.sort" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sortierung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Filters" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sort by" } } } }, - "filter.unwatchedOnly": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nur Ungesehene" + "filter.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filter" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Unwatched only" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filters" } } } }, - "hero.details": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Details" + "filter.unwatchedOnly" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur Ungesehene" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Details" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unwatched only" } } } }, - "hero.play": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Abspielen" + "hero.details" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Details" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Play" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Details" } } } }, - "hero.resume": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Weiterschauen" + "hero.play" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abspielen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Resume" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Play" } } } }, - "home.combineContinue": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Weiterschauen und Als Nächstes zusammenlegen" + "hero.resume" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weiterschauen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Merge Continue and Next Up" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resume" } } } }, - "home.empty.description": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sobald dein Server Mediatheken enthält, erscheinen sie hier." + "home.combineContinue" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weiterschauen und Als Nächstes zusammenlegen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Once your server has libraries, they'll show up here." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Merge Continue and Next Up" } } } }, - "home.empty.title": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Noch nichts da" + "home.empty.description" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sobald dein Server Mediatheken enthält, erscheinen sie hier." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Nothing here yet" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Once your server has libraries, they'll show up here." } } } }, - "home.hero": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Aufmacher" + "home.empty.title" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noch nichts da" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Featured" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nothing here yet" } } } }, - "home.heroCount": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Titel im Wechsel" + "home.hero" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aufmacher" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Titles in rotation" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Featured" } } } }, - "home.heroExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Aufmacher wandert alle sieben Sekunden weiter und hört damit auf, sobald du ihn berührst." + "home.heroCount" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Titel im Wechsel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The featured area moves on every seven seconds and stops as soon as you touch it." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Titles in rotation" } } } }, - "home.heroSource": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Inhalt" + "home.heroExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Aufmacher wandert alle sieben Sekunden weiter und hört damit auf, sobald du ihn berührst." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Content" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The featured area moves on every seven seconds and stops as soon as you touch it." } } } }, - "home.heroSource.continueFirst": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Angefangenes zuerst" + "home.heroSource" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inhalt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Started titles first" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Content" } } } }, - "home.heroSource.latestOnly": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nur Neuzugänge" + "home.heroSource.continueFirst" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Angefangenes zuerst" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "New arrivals only" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Started titles first" } } } }, - "home.hideWatched": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gesehenes aus Neuzugängen ausblenden" + "home.heroSource.latestOnly" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur Neuzugänge" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Hide watched titles from new arrivals" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "New arrivals only" } } } }, - "home.rowsHeader": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Reihen" + "home.hideWatched" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesehenes aus Neuzugängen ausblenden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Rows" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hide watched titles from new arrivals" } } } }, - "homeLayout.empty": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Server liefert derzeit keine Reihen." + "home.rowsHeader" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reihen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server isn't providing any rows right now." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rows" } } } }, - "homeLayout.explanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Schalte Reihen aus, die du nicht brauchst, und sortiere sie über „Bearbeiten“ um. Neue Reihen vom Server erscheinen am Ende." + "homeLayout.empty" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Server liefert derzeit keine Reihen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Turn off rows you don't need and reorder them via Edit. New rows from the server appear at the end." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server isn't providing any rows right now." } } } }, - "homeLayout.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Startseite" + "homeLayout.explanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schalte Reihen aus, die du nicht brauchst, und sortiere sie über „Bearbeiten“ um. Neue Reihen vom Server erscheinen am Ende." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Home screen" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Turn off rows you don't need and reorder them via Edit. New rows from the server appear at the end." } } } }, - "item.watched": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gesehen" + "homeLayout.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Startseite" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Watched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Home screen" } } } }, - "languages.audio": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Tonspur" + "item.watched" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesehen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio track" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Watched" } } } }, - "languages.audioExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gibt es beim Abspielen eine Tonspur in dieser Sprache, wird sie von selbst gewählt. Sonst bleibt es bei der Spur, die der Server voranstellt." + "languages.audio" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tonspur" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "If a track in this language exists, it is selected automatically. Otherwise the server's own first track is used." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio track" } } } }, - "languages.audioHeader": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ton" + "languages.audioExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gibt es beim Abspielen eine Tonspur in dieser Sprache, wird sie von selbst gewählt. Sonst bleibt es bei der Spur, die der Server voranstellt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If a track in this language exists, it is selected automatically. Otherwise the server's own first track is used." } } } }, - "languages.headerExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Welche Tonspur und welche Untertitel beim Abspielen von selbst gewählt werden." + "languages.audioHeader" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ton" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Which audio track and which subtitles are chosen automatically during playback." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio" } } } }, - "languages.serverDefault": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wie der Server vorgibt" + "languages.headerExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Welche Tonspur und welche Untertitel beim Abspielen von selbst gewählt werden." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "As the server prefers" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Which audio track and which subtitles are chosen automatically during playback." } } } }, - "languages.subtitles": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Untertitel" + "languages.serverDefault" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wie der Server vorgibt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Subtitles" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "As the server prefers" } } } }, - "languages.subtitlesExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Untertitel werden nur eingeschaltet, wenn es sie in dieser Sprache gibt. „Aus“ heißt: gar keine, bis du sie im Player selbst einschaltest." + "languages.subtitles" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untertitel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Subtitles are only switched on when they exist in this language. “Off” means none until you turn them on in the player." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subtitles" } } } }, - "languages.subtitlesHeader": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Untertitel" + "languages.subtitlesExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untertitel werden nur eingeschaltet, wenn es sie in dieser Sprache gibt. „Aus“ heißt: gar keine, bis du sie im Player selbst einschaltest." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Subtitles" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subtitles are only switched on when they exist in this language. “Off” means none until you turn them on in the player." } } } }, - "languages.subtitlesOff": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Aus" + "languages.subtitlesHeader" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untertitel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Off" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subtitles" } } } }, - "languages.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ton & Untertitel" + "languages.subtitlesOff" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aus" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio & subtitles" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Off" } } } }, - "library.clearFilters": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Filter zurücksetzen" + "languages.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ton & Untertitel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Clear filters" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio & subtitles" } } } }, - "library.empty.description": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mit den aktuellen Filtern bleibt nichts übrig." + "library.clearFilters" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filter zurücksetzen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Nothing matches the current filters." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clear filters" } } } }, - "library.empty.title": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Keine Titel" + "library.empty.description" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mit den aktuellen Filtern bleibt nichts übrig." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No titles" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nothing matches the current filters." } } } }, - "library.filters": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Filter" + "library.empty.title" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Titel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Filters" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No titles" } } } }, - "library.kind.liveTV": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Live-TV" + "library.filters" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filter" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Live TV" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filters" } } } }, - "library.kind.movie": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Filme" + "library.kind.liveTV" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live-TV" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Movies" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live TV" } } } }, - "library.kind.music": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Musik" + "library.kind.movie" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filme" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Music" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Movies" } } } }, - "library.kind.other": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sonstiges" + "library.kind.music" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Musik" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Other" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Music" } } } }, - "library.kind.photo": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Fotos" + "library.kind.other" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sonstiges" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Photos" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Other" } } } }, - "library.kind.show": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Serien" + "library.kind.photo" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fotos" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "TV shows" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Photos" } } } }, - "library.scan": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mediathek durchsuchen" + "library.kind.show" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serien" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Scan library" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "TV shows" } } } }, - "library.toggleLayout": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ansicht wechseln" + "library.scan" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mediathek durchsuchen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Switch layout" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scan library" } } } }, - "libraryHub.empty": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auf diesem Server ist keine Mediathek zu sehen." + "library.search" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suchen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No library is visible on this server." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search" } } } }, - "liveTV.channelCount %@": { - "comment": "A label displaying the number of channels. The argument is the number of channels.", - "isCommentAutoGenerated": true - }, - "liveTV.channelCount %lld": { - "comment": "Platzhalter: Anzahl Sender", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Sender" + "library.toggleLayout" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ansicht wechseln" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld channels" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Switch layout" } } } }, - "liveTV.gap": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Keine Angaben" + "libraryHub.empty" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auf diesem Server ist keine Mediathek zu sehen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No data" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No library is visible on this server." } } } }, - "liveTV.mode": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ansicht" + "liveTV.channelCount %@" : { + "comment" : "A label displaying the number of channels. The argument is the number of channels.", + "isCommentAutoGenerated" : true + }, + "liveTV.channelCount %lld" : { + "comment" : "Platzhalter: Anzahl Sender", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Sender" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "View" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld channels" } } } }, - "liveTV.mode.guide": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Programm" + "liveTV.gap" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Angaben" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Guide" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No data" } } } }, - "liveTV.mode.now": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Jetzt" + "liveTV.mode" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ansicht" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Now" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "View" } } } }, - "liveTV.next %@ %@": { - "comment": "Platzhalter: Uhrzeit, Sendungstitel", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Danach %@ · %@" + "liveTV.mode.guide" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programm" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Next %@ · %@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guide" } } } }, - "liveTV.noChannels.description": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Empfänger ist eingerichtet, liefert aber keine Sender." + "liveTV.mode.now" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jetzt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The tuner is set up but isn't providing any channels." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Now" } } } }, - "liveTV.noChannels.title": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Keine Sender" + "liveTV.next %@ %@" : { + "comment" : "Platzhalter: Uhrzeit, Sendungstitel", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Danach %@ · %@" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No channels" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Next %@ · %@" } } } }, - "liveTV.noProgram": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Kein Programm verfügbar" + "liveTV.noChannels.description" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Empfänger ist eingerichtet, liefert aber keine Sender." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No guide data" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The tuner is set up but isn't providing any channels." } } } }, - "liveTV.noStream": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Server hat keine Adresse für diesen Sender geliefert." + "liveTV.noChannels.title" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Sender" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server did not return a stream for this channel." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No channels" } } } }, - "liveTV.notConfigured.description": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Live-TV braucht eine Fernsehkarte oder einen Netzwerk-Tuner am Plex-Server. Richte ihn in den Servereinstellungen ein, dann erscheinen die Sender hier." + "liveTV.noProgram" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kein Programm verfügbar" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Live TV needs a tuner card or network tuner on your Plex server. Set one up in the server settings and channels will appear here." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No guide data" } } } }, - "liveTV.notConfigured.title": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Kein Empfänger eingerichtet" + "liveTV.noStream" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Server hat keine Adresse für diesen Sender geliefert." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No tuner set up" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server did not return a stream for this channel." } } } }, - "liveTV.now": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Jetzt" + "liveTV.notConfigured.description" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live-TV braucht eine Fernsehkarte oder einen Netzwerk-Tuner am Plex-Server. Richte ihn in den Servereinstellungen ein, dann erscheinen die Sender hier." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Now" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live TV needs a tuner card or network tuner on your Plex server. Set one up in the server settings and channels will appear here." } } } }, - "liveTV.runningNow": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Läuft gerade" + "liveTV.notConfigured.title" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kein Empfänger eingerichtet" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "On now" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No tuner set up" } } } }, - "liveTV.selection": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sender auswählen" + "liveTV.now" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jetzt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Choose channels" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Now" } } } }, - "liveTV.selection.all": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Alle" + "liveTV.runningNow" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Läuft gerade" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "All" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "On now" } } } }, - "liveTV.selection.hint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ohne Auswahl werden alle Sender gezeigt." + "liveTV.selection" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sender auswählen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "With nothing selected, all channels are shown." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Choose channels" } } } }, - "liveTV.timeRange %@ %@": { - "comment": "Platzhalter: Anfangs- und Endzeit", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%@ – %@" + "liveTV.selection.all" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%@ – %@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "All" } } } }, - "liveTV.tune": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Einschalten" + "liveTV.selection.hint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ohne Auswahl werden alle Sender gezeigt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Watch" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "With nothing selected, all channels are shown." } } } }, - "liveTV.tuneFailed": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sender lässt sich nicht einschalten" + "liveTV.timeRange %@ %@" : { + "comment" : "Platzhalter: Anfangs- und Endzeit", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ – %@" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Cannot tune channel" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ – %@" } } } }, - "miniPlayer.close": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wiedergabe beenden" + "liveTV.tune" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einschalten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Stop playback" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Watch" } } } }, - "miniPlayer.expand": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auf Vollbild vergrößern" + "liveTV.tuneFailed" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sender lässt sich nicht einschalten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Expand to full screen" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cannot tune channel" } } } }, - "miniPlayer.resize": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Größe ändern" + "miniPlayer.close" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiedergabe beenden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Resize" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stop playback" } } } }, - "placeholder.description": { - "comment": "Platzhalter-Bildschirme", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Dieser Bereich entsteht in einer späteren Phase." + "miniPlayer.expand" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auf Vollbild vergrößern" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "This area is coming in a later phase." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Expand to full screen" } } } }, - "player.airPlay": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auf Gerät übertragen" + "miniPlayer.resize" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Größe ändern" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Play on another device" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resize" } } } }, - "player.audioTracks": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Tonspur" + "placeholder.description" : { + "comment" : "Platzhalter-Bildschirme", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieser Bereich entsteht in einer späteren Phase." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This area is coming in a later phase." } } } }, - "player.back10": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "10 Sekunden zurück" + "player.airPlay" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auf Gerät übertragen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Back 10 seconds" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Play on another device" } } } }, - "player.close": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Player schließen" + "player.audioTracks" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tonspur" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Close player" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio" } } } }, - "player.forward10": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "10 Sekunden vor" + "player.back10" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 Sekunden zurück" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Forward 10 seconds" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Back 10 seconds" } } } }, - "player.jellyfinPending": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Wiedergabe von Jellyfin ist noch nicht fertig — sie ist der nächste Schritt." + "player.close" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Player schließen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Playback from Jellyfin isn't finished yet — it's the next step." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Close player" } } } }, - "player.loadFailed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Datei ließ sich nicht öffnen." + "player.forward10" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 Sekunden vor" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The file couldn't be opened." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forward 10 seconds" } } } }, - "player.minimize": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verkleinern" + "player.jellyfinPending" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Wiedergabe von Jellyfin ist noch nicht fertig — sie ist der nächste Schritt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Minimize" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playback from Jellyfin isn't finished yet — it's the next step." } } } }, - "player.nextEpisode": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nächste Folge" + "player.loadFailed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Datei ließ sich nicht öffnen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Next episode" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The file couldn't be opened." } } } }, - "player.noPlayableFile": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zu diesem Titel gibt es keine abspielbare Datei auf dem Server." + "player.minimize" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verkleinern" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "There's no playable file for this title on the server." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Minimize" } } } }, - "player.pause": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Pause" + "player.nextEpisode" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nächste Folge" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Pause" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Next episode" } } } }, - "player.play": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Abspielen" + "player.noPlayableFile" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zu diesem Titel gibt es keine abspielbare Datei auf dem Server." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Play" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "There's no playable file for this title on the server." } } } }, - "player.playbackFailed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Wiedergabe wurde unterbrochen." + "player.pause" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pause" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Playback was interrupted." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pause" } } } }, - "player.preparing": { - "comment": "Hinweis, während der Player die Datei öffnet", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wird vorbereitet …" + "player.play" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abspielen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Preparing…" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Play" } } } }, - "player.quality": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Qualität" + "player.playbackFailed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Wiedergabe wurde unterbrochen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Quality" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playback was interrupted." } } } }, - "player.relayWarning": { - "comment": "Warnung im Player, wenn die Verbindung über die Plex-Vermittlung läuft", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Verbindung läuft über die Vermittlung von Plex und ist stark gedrosselt. Große Dateien laufen darüber kaum an." + "player.preparing" : { + "comment" : "Hinweis, während der Player die Datei öffnet", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wird vorbereitet …" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "You're connected through the Plex relay, which is heavily throttled. Large files barely start over it." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preparing…" } } } }, - "player.restoring": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Stelle wird wiederhergestellt" + "player.quality" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Qualität" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Returning to your position" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quality" } } } }, - "player.skipCredits": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Abspann überspringen" + "player.relayWarning" : { + "comment" : "Warnung im Player, wenn die Verbindung über die Plex-Vermittlung läuft", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Verbindung läuft über die Vermittlung von Plex und ist stark gedrosselt. Große Dateien laufen darüber kaum an." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Skip credits" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "You're connected through the Plex relay, which is heavily throttled. Large files barely start over it." } } } }, - "player.skipIntro": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Intro überspringen" + "player.restoring" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stelle wird wiederhergestellt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Skip intro" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Returning to your position" } } } }, - "player.stalled": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Es kommen keine Daten mehr. Der Strom ist abgerissen." + "player.skipCredits" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abspann überspringen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No more data is arriving. The stream stopped." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skip credits" } } } }, - "player.stop": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Beenden" + "player.skipIntro" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intro überspringen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Stop" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skip intro" } } } }, - "player.subtitlesOff": { - "comment": "Eintrag, der die Untertitel abschaltet", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Aus" + "player.stalled" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Es kommen keine Daten mehr. Der Strom ist abgerissen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Off" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No more data is arriving. The stream stopped." } } } }, - "player.subtitleTracks": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Untertitel" + "player.stop" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beenden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Subtitles" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stop" } } } }, - "player.tracks": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ton und Untertitel" + "player.subtitlesOff" : { + "comment" : "Eintrag, der die Untertitel abschaltet", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aus" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio and subtitles" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Off" } } } }, - "player.transcodeRefused": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Server hat die Wiedergabe abgelehnt." + "player.subtitleTracks" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untertitel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server refused playback." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subtitles" } } } }, - "quality.audioOnly": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nur Ton" + "player.tracks" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ton und Untertitel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio only" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio and subtitles" } } } }, - "quality.audioOnly.hint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Plex kennt für Filme keinen reinen Tonstrom. Diese Stufe überträgt das Bild in der kleinsten Auflösung und blendet es aus." + "player.transcodeRefused" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Server hat die Wiedergabe abgelehnt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Plex has no audio-only stream for video. This setting sends the picture at the smallest size and hides it." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server refused playback." } } } }, - "quality.audioShort": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ton" + "quality.audioOnly" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nur Ton" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio only" } } } }, - "quality.automatic": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Automatisch" + "quality.audioOnly.hint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plex kennt für Filme keinen reinen Tonstrom. Diese Stufe überträgt das Bild in der kleinsten Auflösung und blendet es aus." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Automatic" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plex has no audio-only stream for video. This setting sends the picture at the smallest size and hides it." } } } }, - "quality.autoShort": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auto" + "quality.audioShort" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ton" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Auto" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio" } } } }, - "quality.current": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Läuft gerade" + "quality.automatic" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisch" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Currently playing" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatic" } } } }, - "quality.current.bitrate": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bitrate" + "quality.autoShort" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auto" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Bitrate" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auto" } } } }, - "quality.current.dropped": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verworfene Bilder" + "quality.current" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Läuft gerade" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Dropped frames" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Currently playing" } } } }, - "quality.current.hint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gemessen, nicht gewünscht: die Stufe sagt, was erlaubt ist — hier steht, was ankommt." + "quality.current.bitrate" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitrate" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Measured, not requested: the setting caps the rate, this is what arrives." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitrate" } } } }, - "quality.current.resolution": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auflösung" + "quality.current.dropped" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verworfene Bilder" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Resolution" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dropped frames" } } } }, - "quality.everyRung": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Alle Stufen" + "quality.current.hint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gemessen, nicht gewünscht: die Stufe sagt, was erlaubt ist — hier steht, was ankommt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "All steps" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Measured, not requested: the setting caps the rate, this is what arrives." } } } }, - "quality.fullHD": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "1080p" + "quality.current.resolution" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auflösung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "1080p" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolution" } } } }, - "quality.hd": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "720p" + "quality.everyRung" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle Stufen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "720p" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "All steps" } } } }, - "quality.high": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Hoch (12 Mbit/s)" + "quality.fullHD" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "1080p" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "High (12 Mbps)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "1080p" } } } }, - "quality.kilobits %lld": { - "comment": "Platzhalter: Kilobit je Sekunde", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld kbps" + "quality.hd" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "720p" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld kbps" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "720p" } } } }, - "quality.low": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Niedrig (4 Mbit/s)" + "quality.high" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hoch (12 Mbit/s)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Low (4 Mbps)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "High (12 Mbps)" } } } }, - "quality.lowRes": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "480p" + "quality.kilobits %lld" : { + "comment" : "Platzhalter: Kilobit je Sekunde", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kbps" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "480p" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kbps" } } } }, - "quality.medium": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mittel (8 Mbit/s)" + "quality.low" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niedrig (4 Mbit/s)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Medium (8 Mbps)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Low (4 Mbps)" } } } }, - "quality.megabits %@": { - "comment": "Platzhalter: Megabit je Sekunde", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%@ Mbps" + "quality.lowRes" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "480p" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%@ Mbps" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "480p" } } } }, - "quality.minimal": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sparsam (2 Mbit/s)" + "quality.medium" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mittel (8 Mbit/s)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Data saver (2 Mbps)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medium (8 Mbps)" } } } }, - "quality.original": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Original" + "quality.megabits %@" : { + "comment" : "Platzhalter: Megabit je Sekunde", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Mbps" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Original" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Mbps" } } } }, - "quality.originalShort": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Max" + "quality.minimal" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sparsam (2 Mbit/s)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Max" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data saver (2 Mbps)" } } } }, - "runtime.hoursMinutes %lld %lld": { - "comment": "Laufzeit mit Stunden", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Std %lld Min" + "quality.original" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Original" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lldh %lldm" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Original" } } } }, - "runtime.minutes %lld": { - "comment": "Laufzeit unter einer Stunde", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Min" + "quality.originalShort" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lldm" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max" } } } }, - "SD": { - "comment": "A label for a 720p movie.", - "isCommentAutoGenerated": true - }, - "search.hint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Suche nach Filmen, Serien, Folgen und Personen." + "runtime.hoursMinutes %lld %lld" : { + "comment" : "Laufzeit mit Stunden", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Std %lld Min" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Search for movies, shows, episodes and people." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldh %lldm" } } } }, - "search.recent": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zuletzt gesucht" + "runtime.minutes %lld" : { + "comment" : "Laufzeit unter einer Stunde", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Min" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Recent searches" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lldm" } } } }, - "search.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Suche" + "SD" : { + "comment" : "A label for a 720p movie.", + "isCommentAutoGenerated" : true + }, + "search.hint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suche nach Filmen, Serien, Folgen und Personen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Search" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search for movies, shows, episodes and people." } } } }, - "season.short %lld": { - "comment": "Platzhalter: Staffelnummer", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Staffel %lld" + "search.recent" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zuletzt gesucht" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Season %lld" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recent searches" } } } }, - "serverPicker.owned": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Eigener Server" + "search.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suche" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Your server" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search" } } } }, - "serverPicker.shared": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Geteilt" + "season.number" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Staffel %lld" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Shared" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Season %lld" } } } }, - "serverPicker.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Server wählen" + "season.short %lld" : { + "comment" : "Platzhalter: Staffelnummer", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Staffel %lld" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Choose a server" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Season %lld" } } } }, - "settings.account": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Konto" + "serverPicker.owned" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eigener Server" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Account" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your server" } } } }, - "settings.address": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Adresse" + "serverPicker.shared" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geteilt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Address" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shared" } } } }, - "settings.app": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "App" + "serverPicker.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server wählen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "App" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Choose a server" } } } }, - "settings.autoPlayNext": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nächste Folge automatisch" + "settings.account" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konto" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Play next episode automatically" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Account" } } } }, - "settings.autoSkipCredits": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Abspann automatisch überspringen" + "settings.address" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adresse" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Skip credits automatically" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Address" } } } }, - "settings.autoSkipIntro": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Intro automatisch überspringen" + "settings.app" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "App" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Skip intros automatically" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "App" } } } }, - "settings.build": { - "comment": "Zeitpunkt, zu dem der laufende Build entstanden ist", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Build" + "settings.autoPlayNext" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nächste Folge automatisch" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Build" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Play next episode automatically" } } } }, - "settings.concurrent": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Höchstens gleichzeitig" + "settings.autoSkipCredits" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abspann automatisch überspringen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "At most at once" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skip credits automatically" } } } }, - "settings.concurrentExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Eine ganze Staffel auf einmal zu laden teilt die Leitung so auf, dass keine Folge fertig wird. Unterwegs ist eine fertige Folge mehr wert als zehn halbe." + "settings.autoSkipIntro" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intro automatisch überspringen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Loading a whole season at once splits the line so that no episode finishes. On the move, one finished episode beats ten half ones." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skip intros automatically" } } } }, - "settings.concurrentHeader": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gleichzeitige Downloads" + "settings.build" : { + "comment" : "Zeitpunkt, zu dem der laufende Build entstanden ist", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Build" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Concurrent downloads" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Build" } } } }, - "settings.connection": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbindung" + "settings.concurrent" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Höchstens gleichzeitig" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Connection" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "At most at once" } } } }, - "settings.connectionLocal": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Lokal" + "settings.concurrentExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine ganze Staffel auf einmal zu laden teilt die Leitung so auf, dass keine Folge fertig wird. Unterwegs ist eine fertige Folge mehr wert als zehn halbe." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Local" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loading a whole season at once splits the line so that no episode finishes. On the move, one finished episode beats ten half ones." } } } }, - "settings.connectionRelay": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Über Plex-Vermittlung (gedrosselt)" + "settings.concurrentHeader" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gleichzeitige Downloads" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Via Plex relay (throttled)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Concurrent downloads" } } } }, - "settings.connectionRemote": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Direkt von außen" + "settings.connection" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbindung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Direct remote" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connection" } } } }, - "settings.controls": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Steuerung" + "settings.connectionLocal" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lokal" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Controls" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Local" } } } }, - "settings.controlsExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zurück und vor lassen sich getrennt einstellen: zurück springt man, weil man etwas nicht verstanden hat — vor, weil man etwas überspringen will." + "settings.connectionRelay" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Über Plex-Vermittlung (gedrosselt)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Back and forward are set separately: you jump back because you missed something, and forward because you want to skip something." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via Plex relay (throttled)" } } } }, - "settings.defaultRate": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Startgeschwindigkeit" + "settings.connectionRemote" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direkt von außen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Starting speed" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direct remote" } } } }, - "settings.deleteAfterDay": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nach einem Tag" + "settings.controls" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Steuerung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "After a day" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controls" } } } }, - "settings.deleteAfterWeek": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nach einer Woche" + "settings.controlsExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zurück und vor lassen sich getrennt einstellen: zurück springt man, weil man etwas nicht verstanden hat — vor, weil man etwas überspringen will." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "After a week" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Back and forward are set separately: you jump back because you missed something, and forward because you want to skip something." } } } }, - "settings.deleteImmediately": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Sofort" + "settings.defaultRate" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Startgeschwindigkeit" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Immediately" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Starting speed" } } } }, - "settings.deleteNever": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Nie" + "settings.deleteAfterDay" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nach einem Tag" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Never" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "After a day" } } } }, - "settings.deleteWatched": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gesehenes löschen" + "settings.deleteAfterWeek" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nach einer Woche" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Delete watched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "After a week" } } } }, - "settings.downloadsExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Fehlende Folgen werden nachgeladen, sobald du eine gesehen hast. Gesehenes wird nach der eingestellten Frist entfernt." + "settings.deleteImmediately" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sofort" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Missing episodes are downloaded once you finish one. Watched titles are removed after the chosen delay." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Immediately" } } } }, - "settings.downloadsHeaderExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wie viel Platz Offline-Titel belegen dürfen, wie viele gleichzeitig laden und wann sie wieder verschwinden." + "settings.deleteNever" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "How much space offline titles may take, how many load at once, and when they disappear again." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Never" } } } }, - "settings.episodes": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Folgen" + "settings.deleteWatched" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesehenes löschen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Episodes" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete watched" } } } }, - "settings.forward": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Vorspulen" + "settings.downloadsExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehlende Folgen werden nachgeladen, sobald du eine gesehen hast. Gesehenes wird nach der eingestellten Frist entfernt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Fast-forward" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Missing episodes are downloaded once you finish one. Watched titles are removed after the chosen delay." } } } }, - "settings.keepCount %@": { - "comment": "A label that lets the user choose how many episodes of a series to keep after they've finished watching them all. The argument is the number of episodes to keep.", - "isCommentAutoGenerated": true - }, - "settings.keepCount %lld": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld ungesehene" + "settings.downloadsHeaderExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wie viel Platz Offline-Titel belegen dürfen, wie viele gleichzeitig laden und wann sie wieder verschwinden." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld unwatched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "How much space offline titles may take, how many load at once, and when they disappear again." } } } }, - "settings.keepOff": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Aus" + "settings.episodes" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Off" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Episodes" } } } }, - "settings.keepUnwatched": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Folgen vorhalten" + "settings.forward" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vorspulen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Keep episodes ready" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fast-forward" } } } }, - "settings.libraries": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mediatheken" + "settings.keepCount %@" : { + "comment" : "A label that lets the user choose how many episodes of a series to keep after they've finished watching them all. The argument is the number of episodes to keep.", + "isCommentAutoGenerated" : true + }, + "settings.keepCount %lld" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ungesehene" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Libraries" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld unwatched" } } } }, - "settings.lockLandscape": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Im Querformat sperren" + "settings.keepOff" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aus" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Lock to landscape" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Off" } } } }, - "settings.lockLandscapeExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Player dreht beim Öffnen ins Querformat und bleibt dort. Abgeschaltet folgt er dem Gerät — für den, der im Liegen schaut." + "settings.keepUnwatched" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen vorhalten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The player rotates to landscape when it opens and stays there. Switched off it follows the device — for watching while lying down." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keep episodes ready" } } } }, - "settings.playback": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wiedergabe" + "settings.libraries" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mediatheken" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Playback" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Libraries" } } } }, - "settings.playbackExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wie gut das Bild sein soll, wie weit der Doppeltipp springt und was am Ende einer Folge passiert." + "settings.lockLandscape" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im Querformat sperren" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "How good the picture should be, how far a double tap jumps, and what happens at the end of an episode." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lock to landscape" } } } }, - "settings.quality": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Qualität" + "settings.lockLandscapeExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Player dreht beim Öffnen ins Querformat und bleibt dort. Abgeschaltet folgt er dem Gerät — für den, der im Liegen schaut." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Quality" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The player rotates to landscape when it opens and stays there. Switched off it follows the device — for watching while lying down." } } } }, - "settings.qualityCellular": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Über Mobilfunk" + "settings.playback" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiedergabe" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "On cellular" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playback" } } } }, - "settings.qualityExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wird eine Datei größer als die eingestellte Grenze, rechnet der Server sie unterwegs herunter und passt die Bitrate laufend an die Verbindung an." + "settings.playbackExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wie gut das Bild sein soll, wie weit der Doppeltipp springt und was am Ende einer Folge passiert." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "If a file exceeds the limit, the server transcodes it on the fly and adapts the bitrate to your connection." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "How good the picture should be, how far a double tap jumps, and what happens at the end of an episode." } } } }, - "settings.qualityWifi": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Im WLAN" + "settings.quality" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Qualität" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "On Wi-Fi" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quality" } } } }, - "settings.rateNormal": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Normal" + "settings.qualityCellular" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Über Mobilfunk" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Normal" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "On cellular" } } } }, - "settings.rememberQuality": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gewählte Qualität merken" + "settings.qualityExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wird eine Datei größer als die eingestellte Grenze, rechnet der Server sie unterwegs herunter und passt die Bitrate laufend an die Verbindung an." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Remember the chosen quality" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If a file exceeds the limit, the server transcodes it on the fly and adapts the bitrate to your connection." } } } }, - "settings.rememberQualityExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die im Player gewählte Stufe gilt dann auch für den nächsten Titel. Gibt es sie dort nicht, wird die nächstgelegene genommen." + "settings.qualityWifi" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im WLAN" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The step you pick in the player then applies to the next title as well. If it isn't available there, the closest one is used." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "On Wi-Fi" } } } }, - "settings.rewind": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zurückspulen" + "settings.rateNormal" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Normal" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Rewind" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Normal" } } } }, - "settings.scanExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Suchlauf durchsucht die Ordner auf dem Server nach neuen Dateien. Das kann einige Minuten dauern." + "settings.rememberQuality" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gewählte Qualität merken" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "A scan looks through the folders on the server for new files. It can take a few minutes." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remember the chosen quality" } } } }, - "settings.seconds %@": { - "comment": "Ein Picker, das die Anzahl der Sekunden zeigt, die man zurückgehen kann.", - "isCommentAutoGenerated": true - }, - "settings.seconds %lld": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "%lld Sekunden" + "settings.rememberQualityExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die im Player gewählte Stufe gilt dann auch für den nächsten Titel. Gibt es sie dort nicht, wird die nächstgelegene genommen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "%lld seconds" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The step you pick in the player then applies to the next title as well. If it isn't available there, the closest one is used." } } } }, - "settings.section.look": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Darstellung" + "settings.rewind" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zurückspulen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Appearance" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rewind" } } } }, - "settings.section.playing": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wiedergabe & Offline" + "settings.scanExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Suchlauf durchsucht die Ordner auf dem Server nach neuen Dateien. Das kann einige Minuten dauern." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Playback & offline" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A scan looks through the folders on the server for new files. It can take a few minutes." } } } }, - "settings.server": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Server" + "settings.seconds %@" : { + "comment" : "Ein Picker, das die Anzahl der Sekunden zeigt, die man zurückgehen kann.", + "isCommentAutoGenerated" : true + }, + "settings.seconds %lld" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Sekunden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Server" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld seconds" } } } }, - "settings.serverKind": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Art" + "settings.section.look" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Darstellung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Type" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appearance" } } } }, - "settings.serverName": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Name" + "settings.section.playing" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiedergabe & Offline" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Name" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playback & offline" } } } }, - "settings.showBitrate": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bitrate im Qualitätsmenü zeigen" + "settings.server" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Show the bitrate in the quality menu" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server" } } } }, - "settings.signOutConfirm": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wirklich abmelden?" + "settings.serverKind" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Art" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign out?" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Type" } } } }, - "settings.signOutExplanation": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Das Token wird vom Gerät entfernt. Heruntergeladene Titel bleiben erhalten." + "settings.serverName" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Name" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The token will be removed from this device. Downloaded titles are kept." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Name" } } } }, - "settings.storageLimit": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Speicherlimit" + "settings.showBitrate" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitrate im Qualitätsmenü zeigen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Storage limit" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show the bitrate in the quality menu" } } } }, - "settings.storageUnlimited": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Unbegrenzt" + "settings.signOutConfirm" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wirklich abmelden?" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Unlimited" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign out?" } } } }, - "settings.version": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Version" + "settings.signOutExplanation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das Token wird vom Gerät entfernt. Heruntergeladene Titel bleiben erhalten." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Version" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The token will be removed from this device. Downloaded titles are kept." } } } }, - "sidebar.close": { - "comment": "Barrierefreiheit: abgedunkelte Fläche", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Seitenleiste schließen" + "settings.storageLimit" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Speicherlimit" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Close sidebar" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storage limit" } } } }, - "sidebar.downloads": { - "comment": "Eintrag in der Seitenleiste", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Downloads" + "settings.storageUnlimited" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unbegrenzt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Downloads" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unlimited" } } } }, - "sidebar.home": { - "comment": "Eintrag der Startseite in der Seitenleiste", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Start" + "settings.version" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Home" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version" } } } }, - "sidebar.libraries": { - "comment": "Überschrift über der Liste der Mediatheken", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mediatheken" + "sidebar.close" : { + "comment" : "Barrierefreiheit: abgedunkelte Fläche", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seitenleiste schließen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Libraries" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Close sidebar" } } } }, - "sidebar.library": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bibliothek" + "sidebar.downloads" : { + "comment" : "Eintrag in der Seitenleiste", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downloads" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Library" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downloads" } } } }, - "sidebar.liveTV": { - "comment": "Eintrag in der Seitenleiste", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Live-TV" + "sidebar.edit" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bearbeiten" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Live TV" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Edit" } } } }, - "sidebar.more": { - "comment": "Überschrift über Live-TV, Downloads und Einstellungen", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mehr" + "sidebar.editHint" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ziehen zum Umsortieren, Haken zum Ein- und Ausblenden." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "More" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Drag to reorder, tap the check to show or hide." } } } }, - "sidebar.moveToSide": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Navigation zur Seite" + "sidebar.hide" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ausblenden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Move navigation to side" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hide" } } } }, - "sidebar.moveToTop": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Navigation nach oben" + "sidebar.home" : { + "comment" : "Eintrag der Startseite in der Seitenleiste", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Start" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Move navigation to top" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Home" } } } }, - "sidebar.open": { - "comment": "Barrierefreiheit: Hamburger-Knopf", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Seitenleiste öffnen" + "sidebar.libraries" : { + "comment" : "Überschrift über der Liste der Mediatheken", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mediatheken" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Open sidebar" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Libraries" } } } }, - "sidebar.search": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Suchen" + "sidebar.library" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bibliothek" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Search" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Library" } } } }, - "sidebar.settings": { - "comment": "Eintrag in der Seitenleiste", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Einstellungen" + "sidebar.liveTV" : { + "comment" : "Eintrag in der Seitenleiste", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live-TV" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Settings" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live TV" } } } }, - "signIn.cancelled": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Anmeldung abgebrochen." + "sidebar.more" : { + "comment" : "Überschrift über Live-TV, Downloads und Einstellungen", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mehr" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign-in cancelled." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "More" } } } }, - "signIn.jellyfin.addressHint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Schema und Port kannst du weglassen — die üblichen werden durchprobiert." + "sidebar.moveToSide" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navigation zur Seite" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "You can leave out the scheme and port — the usual ones are tried in turn." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Move navigation to side" } } } }, - "signIn.jellyfin.addressMissing": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Trag bitte die Adresse deines Servers ein." + "sidebar.moveToTop" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Navigation nach oben" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Please enter your server's address." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Move navigation to top" } } } }, - "signIn.jellyfin.addressPlaceholder": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "192.168.1.50 oder medien.example.com" + "sidebar.open" : { + "comment" : "Barrierefreiheit: Hamburger-Knopf", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seitenleiste öffnen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "192.168.1.50 or media.example.com" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open sidebar" } } } }, - "signIn.jellyfin.addressPrompt": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wo steht dein Server?" + "sidebar.search" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suchen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Where is your server?" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search" } } } }, - "signIn.jellyfin.codeExpired": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Code ist abgelaufen. Fordere einen neuen an oder melde dich mit Passwort an." + "sidebar.settings" : { + "comment" : "Eintrag in der Seitenleiste", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einstellungen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The code has expired. Request a new one or sign in with a password." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settings" } } } }, - "signIn.jellyfin.connect": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Verbinden" + "sidebar.show" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einblenden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Connect" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show" } } } }, - "signIn.jellyfin.foundServer": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Gefundener Server" + "signIn.cancelled" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anmeldung abgebrochen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Server found" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign-in cancelled." } } } }, - "signIn.jellyfin.notFound": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Unter dieser Adresse antwortet kein Jellyfin-Server." + "signIn.jellyfin.addressHint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schema und Port kannst du weglassen — die üblichen werden durchprobiert." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "No Jellyfin server answers at that address." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "You can leave out the scheme and port — the usual ones are tried in turn." } } } }, - "signIn.jellyfin.otherAddress": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Andere Adresse eintragen" + "signIn.jellyfin.addressMissing" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trag bitte die Adresse deines Servers ein." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Enter a different address" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Please enter your server's address." } } } }, - "signIn.jellyfin.password": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Passwort" + "signIn.jellyfin.addressPlaceholder" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "192.168.1.50 oder medien.example.com" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Password" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "192.168.1.50 or media.example.com" } } } }, - "signIn.jellyfin.passwordNote": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Das Passwort wird nur für diese eine Anfrage gehalten. Gespeichert wird allein der Zugangsschlüssel, und der im Schlüsselbund." + "signIn.jellyfin.addressPrompt" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wo steht dein Server?" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The password is held for this one request only. Only the access token is stored, and it goes into the keychain." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Where is your server?" } } } }, - "signIn.jellyfin.privacy": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "So erreicht dein Passwort diese App nie." + "signIn.jellyfin.codeExpired" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Code ist abgelaufen. Fordere einen neuen an oder melde dich mit Passwort an." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "This way your password never reaches this app." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The code has expired. Request a new one or sign in with a password." } } } }, - "signIn.jellyfin.quickConnectHint": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Öffne Jellyfin auf einem Gerät, an dem du schon angemeldet bist, und gib diesen Code unter „Benutzer → Quick Connect“ ein." + "signIn.jellyfin.connect" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbinden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Open Jellyfin on a device you're already signed in on and enter this code under “User → Quick Connect”." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connect" } } } }, - "signIn.jellyfin.searching": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Server wird gesucht …" + "signIn.jellyfin.foundServer" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gefundener Server" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Looking for the server …" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server found" } } } }, - "signIn.jellyfin.signingIn": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Anmeldung läuft …" + "signIn.jellyfin.notFound" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unter dieser Adresse antwortet kein Jellyfin-Server." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Signing in …" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Jellyfin server answers at that address." } } } }, - "signIn.jellyfin.submit": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Anmelden" + "signIn.jellyfin.otherAddress" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Andere Adresse eintragen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign in" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enter a different address" } } } }, - "signIn.jellyfin.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Jellyfin-Server" + "signIn.jellyfin.password" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Passwort" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Jellyfin server" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Password" } } } }, - "signIn.jellyfin.useCode": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Stattdessen einen Code bestätigen" + "signIn.jellyfin.passwordNote" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das Passwort wird nur für diese eine Anfrage gehalten. Gespeichert wird allein der Zugangsschlüssel, und der im Schlüsselbund." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Approve a code instead" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The password is held for this one request only. Only the access token is stored, and it goes into the keychain." } } } }, - "signIn.jellyfin.usePassword": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Stattdessen Benutzername und Passwort" + "signIn.jellyfin.privacy" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "So erreicht dein Passwort diese App nie." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Use a username and password instead" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This way your password never reaches this app." } } } }, - "signIn.jellyfin.userName": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Benutzername" + "signIn.jellyfin.quickConnectHint" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öffne Jellyfin auf einem Gerät, an dem du schon angemeldet bist, und gib diesen Code unter „Benutzer → Quick Connect“ ein." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Username" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open Jellyfin on a device you're already signed in on and enter this code under “User → Quick Connect”." } } } }, - "signIn.jellyfin.waitingForApproval": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Warte auf die Bestätigung …" + "signIn.jellyfin.searching" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server wird gesucht …" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Waiting for approval …" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Looking for the server …" } } } }, - "signIn.manualHint": { - "comment": "Hinweis, wenn die Browser-Verknüpfung nicht greift", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Hat das Fenster nicht verknüpft? Öffne plex.tv/link und gib diesen Code ein:" + "signIn.jellyfin.signingIn" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anmeldung läuft …" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Window didn't link? Open plex.tv/link and enter this code:" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Signing in …" } } } }, - "signIn.privacy": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Anmeldung läuft über deinen Server. Dein Passwort erreicht diese App nie." + "signIn.jellyfin.submit" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anmelden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign-in happens on your server. Your password never reaches this app." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in" } } } }, - "signIn.tagline": { - "comment": "Untertitel auf dem Anmeldebildschirm", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Deine Mediathek, schöner." + "signIn.jellyfin.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jellyfin-Server" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Your library, nicer." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jellyfin server" } } } }, - "signIn.timedOut": { - "comment": "Die Anmeldung wurde nicht innerhalb der Gültigkeit des Codes abgeschlossen", - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Anmeldung wurde nicht abgeschlossen. Versuch es noch einmal." + "signIn.jellyfin.useCode" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stattdessen einen Code bestätigen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign-in wasn't completed. Please try again." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Approve a code instead" } } } }, - "signIn.windowFailed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Das Anmeldefenster ließ sich nicht öffnen." + "signIn.jellyfin.usePassword" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stattdessen Benutzername und Passwort" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The sign-in window couldn't be opened." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Use a username and password instead" } } } }, - "signIn.withJellyfin": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mit Jellyfin anmelden" + "signIn.jellyfin.userName" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzername" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign in with Jellyfin" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Username" } } } }, - "signIn.withPlex": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Mit Plex anmelden" + "signIn.jellyfin.waitingForApproval" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Warte auf die Bestätigung …" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Sign in with Plex" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Waiting for approval …" } } } }, - "sort.lastPlayed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zuletzt gesehen" + "signIn.manualHint" : { + "comment" : "Hinweis, wenn die Browser-Verknüpfung nicht greift", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hat das Fenster nicht verknüpft? Öffne plex.tv/link und gib diesen Code ein:" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Last watched" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Window didn't link? Open plex.tv/link and enter this code:" } } } }, - "sort.rating": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bewertung" + "signIn.privacy" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Anmeldung läuft über deinen Server. Dein Passwort erreicht diese App nie." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Rating" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign-in happens on your server. Your password never reaches this app." } } } }, - "sort.recentlyAdded": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Zuletzt hinzugefügt" + "signIn.tagline" : { + "comment" : "Untertitel auf dem Anmeldebildschirm", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deine Mediathek, schöner." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Recently added" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your library, nicer." } } } }, - "sort.releaseDate": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Erscheinungsjahr" + "signIn.timedOut" : { + "comment" : "Die Anmeldung wurde nicht innerhalb der Gültigkeit des Codes abgeschlossen", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Anmeldung wurde nicht abgeschlossen. Versuch es noch einmal." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Release date" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign-in wasn't completed. Please try again." } } } }, - "sort.titleAscending": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Titel (A–Z)" + "signIn.windowFailed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das Anmeldefenster ließ sich nicht öffnen." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Title (A–Z)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The sign-in window couldn't be opened." } } } }, - "sort.titleDescending": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Titel (Z–A)" + "signIn.withJellyfin" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mit Jellyfin anmelden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Title (Z–A)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in with Jellyfin" } } } }, - "technical.audio": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Tonspur" + "signIn.withPlex" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mit Plex anmelden" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Audio" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in with Plex" } } } }, - "technical.bitrate": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bitrate" + "sort.lastPlayed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zuletzt gesehen" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Bitrate" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Last watched" } } } }, - "technical.container": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Container" + "sort.rating" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bewertung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Container" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rating" } } } }, - "technical.directPlayNative": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Direkt (Systemplayer)" + "sort.recentlyAdded" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zuletzt hinzugefügt" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Direct (system player)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recently added" } } } }, - "technical.directPlayVLC": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Direkt (VLC)" + "sort.releaseDate" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erscheinungsjahr" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Direct (VLC)" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Release date" } } } }, - "technical.file": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Datei auf dem Server" + "sort.titleAscending" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Titel (A–Z)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "File on server" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Title (A–Z)" } } } }, - "technical.playbackMethod": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Wiedergabe" + "sort.titleDescending" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Titel (Z–A)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Playback" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Title (Z–A)" } } } }, - "technical.reason": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Grund" + "technical.audio" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tonspur" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Reason" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Audio" } } } }, - "technical.reason.audioCodec %@": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "iOS kann %@-Ton nicht wiedergeben." + "technical.bitrate" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitrate" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "iOS can't play %@ audio." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bitrate" } } } }, - "technical.reason.chosen": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Im Player wurde eine Qualitätsstufe gewählt." + "technical.container" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Container" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "A quality step was chosen in the player." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Container" } } } }, - "technical.reason.container %@": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "iOS öffnet den Container %@ nicht." + "technical.directPlayNative" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direkt (Systemplayer)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "iOS can't open the %@ container." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direct (system player)" } } } }, - "technical.reason.unanalyzed": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Server hat diese Datei noch nicht analysiert." + "technical.directPlayVLC" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direkt (VLC)" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "The server hasn't analyzed this file yet." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direct (VLC)" } } } }, - "technical.reason.videoCodec %@": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "iOS kann %@ nicht dekodieren." + "technical.file" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datei auf dem Server" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "iOS can't decode %@." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "File on server" } } } }, - "technical.resolution": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Auflösung" + "technical.playbackMethod" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiedergabe" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Resolution" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playback" } } } }, - "technical.size": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Dateigröße" + "technical.reason" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Grund" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "File size" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reason" } } } }, - "technical.subtitle": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Untertitel" + "technical.reason.audioCodec %@" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS kann %@-Ton nicht wiedergeben." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Subtitle" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS can't play %@ audio." } } } }, - "technical.title": { - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Technische Angaben" + "technical.reason.chosen" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im Player wurde eine Qualitätsstufe gewählt." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Technical details" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A quality step was chosen in the player." } } } }, - "technical.transcode": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Umgerechnet vom Server" + "technical.reason.container %@" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS öffnet den Container %@ nicht." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Transcoded by server" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS can't open the %@ container." } } } }, - "technical.videoCodec": { - "extractionState": "stale", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bildcodec" + "technical.reason.unanalyzed" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Server hat diese Datei noch nicht analysiert." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Video codec" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The server hasn't analyzed this file yet." } } } }, - "sidebar.edit": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Bearbeiten" + "technical.reason.videoCodec %@" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS kann %@ nicht dekodieren." } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Edit" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "iOS can't decode %@." } } } }, - "sidebar.editHint": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ziehen zum Umsortieren, Haken zum Ein- und Ausblenden." + "technical.resolution" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auflösung" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Drag to reorder, tap the check to show or hide." + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resolution" } } } }, - "sidebar.show": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Einblenden" + "technical.size" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dateigröße" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Show" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "File size" } } } }, - "sidebar.hide": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Ausblenden" + "technical.subtitle" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untertitel" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Hide" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subtitle" } } } }, - "library.search": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Suchen" + "technical.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Technische Angaben" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Search" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Technical details" } } } }, - "season.number": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Staffel %lld" + "technical.transcode" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umgerechnet vom Server" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Season %lld" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Transcoded by server" } } } }, - "episode.number": { - "extractionState": "manual", - "localizations": { - "de": { - "stringUnit": { - "state": "translated", - "value": "Episode %lld" + "technical.videoCodec" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bildcodec" } }, - "en": { - "stringUnit": { - "state": "translated", - "value": "Episode %lld" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Video codec" } } } } }, - "version": "1.1" + "version" : "1.1" } \ No newline at end of file diff --git a/Flixy/Session/FlixySession.swift b/Flixy/Session/FlixySession.swift index d45e2d2..7355715 100644 --- a/Flixy/Session/FlixySession.swift +++ b/Flixy/Session/FlixySession.swift @@ -158,13 +158,25 @@ final class FlixySession { } } - /// Ob der aktive Server Live-TV anbietet, **so wie die App es heute kann**. + /// Ob der aktive Server Live-TV anbietet. /// - /// Nicht `capabilities.contains(.liveTV)`: Jellyfin kann es, der - /// Programmführer der App spricht aber noch unmittelbar mit Plex. Einen + /// Endlich die Fähigkeit selbst. Hier stand `server != nil` — also „nur + /// Plex" —, weil der Programmführer unmittelbar mit Plex sprach; einen /// Eintrag zu zeigen, der zu einem leeren Bildschirm führt, wäre eine - /// Zusage, die niemand einlöst. - var supportsLiveTV: Bool { server != nil } + /// Zusage gewesen, die niemand einlöst. Seit Live-TV über den neutralen + /// Vertrag läuft, löst sie jeder ein, der sie gibt. + var supportsLiveTV: Bool { backend?.capabilities.contains(.liveTV) == true } + + /// Ob er darüber hinaus aufnehmen kann. + /// + /// Getrennt gefragt, weil Plex das eine kann und das andere nicht. + var supportsRecordings: Bool { backend?.capabilities.contains(.liveTVRecordings) == true } + + /// Der Server als Live-TV-Server — sofern er einer ist. + var liveTV: (any LiveTVBackend)? { backend as? any LiveTVBackend } + + /// Der Server als Aufnahme-Server — sofern er einer ist. + var recorder: (any LiveTVRecordingBackend)? { backend as? any LiveTVRecordingBackend } /// Warum gerade nicht abgespielt werden kann. /// diff --git a/Flixy/Views/LiveTV/ChannelSelectionSheet.swift b/Flixy/Views/LiveTV/ChannelSelectionSheet.swift index 2a5f6a4..5e76cb2 100644 --- a/Flixy/Views/LiveTV/ChannelSelectionSheet.swift +++ b/Flixy/Views/LiveTV/ChannelSelectionSheet.swift @@ -1,6 +1,6 @@ import SwiftUI import FlixyDesign -import PlexKit +import MediaKit /// Welche Sender überhaupt angezeigt werden. /// @@ -9,7 +9,7 @@ import PlexKit /// Jeden davon zu zeichnen und sein Programm zu holen kostet Zeit und macht /// die Ansicht unübersichtlich. struct ChannelSelectionSheet: View { - let channels: [PlexChannel] + let channels: [LiveChannel] @Binding var selection: Set @Environment(FlixySession.self) private var session @@ -44,7 +44,7 @@ struct ChannelSelectionSheet: View { } } - private func row(for channel: PlexChannel) -> some View { + private func row(for channel: LiveChannel) -> some View { Button { // Beim ersten Antippen aus „alle" eine echte Auswahl machen: // sonst hakt man einen Sender an und alle anderen bleiben @@ -59,14 +59,14 @@ struct ChannelSelectionSheet: View { } label: { HStack(spacing: FlixySpacing.regular) { FlixyArtwork( - url: session.server?.artworkURL(path: channel.thumb, width: 200, height: 120), + url: session.backend?.artworkURL(path: channel.artworkPath, width: 200, height: 120), aspectRatio: FlixyAspectRatio.channelLogo, fallbackSymbol: "tv", contentMode: .fit ) .frame(width: 48, height: 29) - if let number = channel.channelIdentifier { + if let number = channel.number { Text(number) .font(.system(.caption, design: .monospaced)) .foregroundStyle(Color.flixyTextMuted) @@ -86,7 +86,7 @@ struct ChannelSelectionSheet: View { .buttonStyle(.plain) } - private func isShown(_ channel: PlexChannel) -> Bool { + private func isShown(_ channel: LiveChannel) -> Bool { ChannelSelection.shows(channel, selection: selection) } } @@ -98,11 +98,11 @@ struct ChannelSelectionSheet: View { /// „alle": so sieht man beim ersten Öffnen sein Programm, ohne vorher etwas /// angehakt zu haben. enum ChannelSelection { - static func shows(_ channel: PlexChannel, selection: Set) -> Bool { + static func shows(_ channel: LiveChannel, selection: Set) -> Bool { selection.isEmpty || selection.contains(channel.id) } - static func apply(_ selection: Set, to channels: [PlexChannel]) -> [PlexChannel] { + static func apply(_ selection: Set, to channels: [LiveChannel]) -> [LiveChannel] { guard !selection.isEmpty else { return channels } let kept = channels.filter { selection.contains($0.id) } // Wählt jemand Sender ab, die es nicht mehr gibt, bliebe sonst eine diff --git a/Flixy/Views/LiveTV/LiveTVView.swift b/Flixy/Views/LiveTV/LiveTVView.swift index e9d694a..f5b3820 100644 --- a/Flixy/Views/LiveTV/LiveTVView.swift +++ b/Flixy/Views/LiveTV/LiveTVView.swift @@ -1,7 +1,7 @@ import SwiftUI import FlixyDesign import FlixyPlayback -import PlexKit +import MediaKit /// Live-TV mit Programmführer. struct LiveTVView: View { @@ -11,14 +11,12 @@ struct LiveTVView: View { @Environment(NetworkConditions.self) private var network @State private var availability: LiveTVAvailability? - /// Der Empfänger, über den eingeschaltet wird. - @State private var dvr: PlexDVR? - @State private var channels: [PlexChannel] = [] + @State private var channels: [LiveChannel] = [] /// Woher die Senderliste kam — steht in der leeren Ansicht. @State private var channelSource: String? /// Jede abgeklopfte Adresse mit ihrer Antwort. - @State private var trace: [ChannelProbe] = [] - @State private var programs: [String: [PlexProgram]] = [:] + @State private var trace: [LiveChannelProbe] = [] + @State private var programs: [String: [LiveProgram]] = [:] @State private var isTuning: String? /// Warum das Einschalten nicht geklappt hat — mit jedem versuchten Weg. @State private var tuneFailure: TuneFailure? @@ -34,7 +32,7 @@ struct LiveTVView: View { /// Die Sender nach der Auswahl — überall dieselbe Liste, damit Raster und /// Liste nicht auseinanderlaufen. - private var shownChannels: [PlexChannel] { + private var shownChannels: [LiveChannel] { ChannelSelection.apply(ChannelSelection.decode(storedSelection), to: channels) } @@ -85,7 +83,7 @@ struct LiveTVView: View { programs: programs, tuning: isTuning, artwork: { channel in - session.server?.artworkURL(path: channel.thumb, width: 120, height: 120) + session.backend?.artworkURL(path: channel.artworkPath, width: 120, height: 120) }, onTune: { channel, program in Task { await tune(channel, program: program) } } ) @@ -200,13 +198,12 @@ struct LiveTVView: View { } private func load() async { - guard let server = session.server else { return } + guard let liveTV = session.liveTV else { return } - let availability = await server.liveTVAvailability() + let availability = await liveTV.liveTVAvailability() self.availability = availability - guard case .available(let dvrs) = availability, let dvr = dvrs.first else { return } - self.dvr = dvr + guard case .available = availability else { return } // Sender und Programm kommen zusammen: die Senderliste des Anbieters // antwortet auf manchen Servern gar nicht, und dann tragen die @@ -216,15 +213,21 @@ struct LiveTVView: View { // Sechs Stunden: ein ganzer Fernsehabend. Mehr wäre bei einer Liste // mit fünfhundert Sendern eine Antwort im zweistelligen Megabereich, // und über Mobilfunk wartet man darauf. - let guide = await server.liveTVGuide(dvr: dvr, hours: 6) - channels = guide.channels - programs = guide.programs - channelSource = guide.source - trace = guide.trace + let listing = await liveTV.liveChannels() + channels = listing.channels + channelSource = listing.source + trace = listing.probes + + let now = Date() + programs = (try? await liveTV.livePrograms( + channelIDs: listing.channels.map(\.id), + from: now.addingTimeInterval(-3_600), + to: now.addingTimeInterval(6 * 3_600) + )) ?? [:] } - private func tune(_ channel: PlexChannel, program: PlexProgram? = nil) async { - guard let server = session.server, isTuning == nil else { return } + private func tune(_ channel: LiveChannel, program: LiveProgram? = nil) async { + guard let liveTV = session.liveTV, isTuning == nil else { return } isTuning = channel.id defer { isTuning = nil } @@ -233,12 +236,9 @@ struct LiveTVView: View { let running = program ?? programs[channel.id]?.first { $0.isRunning() } let policy = settings.policy(for: network) - let result = await server.tune( + let result = await liveTV.tune( channel: channel, program: running, - // Der Programmanbieter kennt keinen Weg zum Einschalten — der - // Empfänger schon, und ohne ihn bleibt der halbe Suchraum zu. - dvr: dvr, maximumBitrate: policy.maximumBitrate ) @@ -268,16 +268,16 @@ struct LiveTVView: View { /// Eine Senderzeile mit dem, was gerade und als Nächstes läuft. private struct ChannelRow: View { - let channel: PlexChannel - let programs: [PlexProgram] + let channel: LiveChannel + let programs: [LiveProgram] let isTuning: Bool let onTune: () -> Void @Environment(FlixySession.self) private var session @Environment(\.flixyAccent) private var accent - private var current: PlexProgram? { programs.first { $0.isRunning() } } - private var next: PlexProgram? { programs.first { $0.startsAt > Date() } } + private var current: LiveProgram? { programs.first { $0.isRunning() } } + private var next: LiveProgram? { programs.first { $0.startsAt > Date() } } var body: some View { Button(action: onTune) { @@ -286,7 +286,7 @@ private struct ChannelRow: View { // fast nie quadratisch, und formatfüllend fehlten links und // rechts genau die Teile, an denen man den Sender erkennt. FlixyArtwork( - url: session.server?.artworkURL(path: channel.thumb, width: 200, height: 120), + url: session.backend?.artworkURL(path: channel.artworkPath, width: 200, height: 120), aspectRatio: FlixyAspectRatio.channelLogo, fallbackSymbol: "tv", contentMode: .fit @@ -295,7 +295,7 @@ private struct ChannelRow: View { VStack(alignment: .leading, spacing: 2) { HStack(spacing: FlixySpacing.snug) { - if let number = channel.channelIdentifier { + if let number = channel.number { Text(number) .font(.system(.caption, design: .monospaced)) .foregroundStyle(Color.flixyTextMuted) diff --git a/Flixy/Views/LiveTV/ProgramGuide.swift b/Flixy/Views/LiveTV/ProgramGuide.swift index 214005a..e9f5d41 100644 --- a/Flixy/Views/LiveTV/ProgramGuide.swift +++ b/Flixy/Views/LiveTV/ProgramGuide.swift @@ -1,6 +1,6 @@ import SwiftUI import FlixyDesign -import PlexKit +import MediaKit /// Das Programmraster: Sender als Zeilen, Zeit als Achse. /// @@ -15,8 +15,8 @@ import PlexKit /// waagerechten Versatz von Hand — anders bekommt man zwei Achsen nicht /// gleichzeitig festgenagelt. struct ProgramGuide: View { - let channels: [PlexChannel] - let programs: [String: [PlexProgram]] + let channels: [LiveChannel] + let programs: [String: [LiveProgram]] let tuning: String? /// Die Adresse des Senderlogos. /// @@ -24,8 +24,8 @@ struct ProgramGuide: View { /// das Raster außerhalb der App mit erfundenen Sendern zeichnen und /// ansehen. Die Senderspalte hat einmal gefehlt, und das war ohne einen /// Blick darauf nicht zu finden. - let artwork: (PlexChannel) -> URL? - let onTune: (PlexChannel, PlexProgram?) -> Void + let artwork: (LiveChannel) -> URL? + let onTune: (LiveChannel, LiveProgram?) -> Void @Environment(\.flixyAccent) private var accent @@ -130,7 +130,7 @@ struct ProgramGuide: View { } /// Was auf diesem Sender gerade läuft. - private func running(on channel: PlexChannel) -> PlexProgram? { + private func running(on channel: LiveChannel) -> LiveProgram? { programs[channel.id]?.first { $0.isRunning(at: now) } } @@ -148,7 +148,7 @@ struct ProgramGuide: View { .font(.flixyCaption) .foregroundStyle(Color.flixyTextPrimary) .lineLimit(2) - if let number = channel.channelIdentifier { + if let number = channel.number { Text(number) .font(.system(.caption2, design: .monospaced)) .foregroundStyle(Color.flixyTextMuted) @@ -202,7 +202,7 @@ struct ProgramGuide: View { } } - private func lane(for channel: PlexChannel) -> some View { + private func lane(for channel: LiveChannel) -> some View { let entries = programs[channel.id] ?? [] return ZStack(alignment: .topLeading) { @@ -235,7 +235,7 @@ struct ProgramGuide: View { .frame(height: 1) } - private func block(_ program: PlexProgram, on channel: PlexChannel) -> some View { + private func block(_ program: LiveProgram, on channel: LiveChannel) -> some View { let running = program.isRunning(at: now) return Button { selection = GuideSelection(channel: channel, program: program) } label: { @@ -274,17 +274,17 @@ struct ProgramGuide: View { /// Die angetippte Sendung samt ihrem Sender. private struct GuideSelection: Identifiable { - let channel: PlexChannel - let program: PlexProgram + let channel: LiveChannel + let program: LiveProgram var id: String { "\(channel.id)-\(program.id)" } } /// Was zu einer Sendung im Raster gehört, in voller Länge. private struct ProgramDetailSheet: View { - let channel: PlexChannel + let channel: LiveChannel let artworkURL: URL? - let program: PlexProgram + let program: LiveProgram let isRunning: Bool let onTune: () -> Void diff --git a/Flixy/Views/Navigation/RootView.swift b/Flixy/Views/Navigation/RootView.swift index 0e70834..b7e21e9 100644 --- a/Flixy/Views/Navigation/RootView.swift +++ b/Flixy/Views/Navigation/RootView.swift @@ -180,8 +180,7 @@ struct RootView: View { let fresh = PlayerModel( request: request, backend: session.backend, - // Live-TV spricht als Einziges noch unmittelbar mit Plex. - liveTV: session.server, + liveTV: session.liveTV, downloads: downloads, diagnostics: diagnostics, policy: settings.policy(for: network), diff --git a/Flixy/Views/Player/PlayerModel.swift b/Flixy/Views/Player/PlayerModel.swift index 6dbfa7a..c5011ff 100644 --- a/Flixy/Views/Player/PlayerModel.swift +++ b/Flixy/Views/Player/PlayerModel.swift @@ -122,8 +122,10 @@ final class PlayerModel { /// Programmführer und Tuner sind das Einzige, was hier noch unmittelbar /// mit Plex spricht. Ein Tuner ist ein Stück Hardware, und die fünfhundert /// Zeilen, die es gekostet hat, ihn zu bändigen, gehören in keinen - /// gemeinsamen Vertrag. Bei Jellyfin ist er `nil`. - private let liveTV: PlexServer? + /// gemeinsamen Vertrag — wohl aber in einen **eigenen**. Seit es den + /// gibt, steht hier kein Plex-Server mehr, sondern wer auch immer + /// Live-TV kann. + private let liveTV: (any LiveTVBackend)? private let downloads: DownloadCoordinator private let diagnostics: PlaybackDiagnostics private let policy: PlaybackPolicy @@ -173,7 +175,7 @@ final class PlayerModel { init( request: PlaybackRequest, backend: (any MediaBackend)?, - liveTV: PlexServer?, + liveTV: (any LiveTVBackend)?, downloads: DownloadCoordinator, diagnostics: PlaybackDiagnostics, policy: PlaybackPolicy, @@ -498,27 +500,27 @@ final class PlayerModel { /// wirklich abgelaufen ist — das Raster über alle Sender zu holen ist /// nichts, was man bei jedem Antippen tun will. func refreshLiveProgrammeIfNeeded() async { - guard isLive, let server = liveTV else { return } + guard isLive, let liveTV else { return } if let programmeEndsAt, programmeEndsAt > .now { return } - guard let provider = await server.electronicProgramGuideIdentifier() else { return } let now = Date() - let entries = (try? await server.guide( - providerIdentifier: provider, + // Nur dieser eine Sender. Vorher ging hier das Raster über **alle** + // Sender hinaus, weil der Plex-Weg keinen schmaleren kannte — beim + // neutralen Vertrag ist die Senderliste ein Parameter. + let programs = (try? await liveTV.livePrograms( + channelIDs: [request.ratingKey], from: now, to: now.addingTimeInterval(2 * 3_600) - )) ?? [] + )) ?? [:] - guard let match = entries.first(where: { - $0.channel?.id == request.ratingKey && $0.program.isRunning() - }) else { + guard let match = programs[request.ratingKey]?.first(where: { $0.isRunning() }) else { // Lieber gar nichts als etwas Falsches. subtitle = nil return } - subtitle = match.program.title - programmeEndsAt = match.program.endsAt + subtitle = match.title + programmeEndsAt = match.endsAt } func togglePlayPause() { diff --git a/Packages/FlixyKit/Sources/MediaKit/LiveTV.swift b/Packages/FlixyKit/Sources/MediaKit/LiveTV.swift index 751a764..22c8151 100644 --- a/Packages/FlixyKit/Sources/MediaKit/LiveTV.swift +++ b/Packages/FlixyKit/Sources/MediaKit/LiveTV.swift @@ -126,6 +126,18 @@ public struct LiveProgram: Sendable, Equatable, Identifiable { public func isRunning(at moment: Date = .now) -> Bool { startsAt <= moment && endsAt > moment } + + /// Wie weit sie fortgeschritten ist, 0…1. + /// + /// Gerechnet statt gemeldet: beide Server nennen Anfang und Ende, keiner + /// nennt den Fortschritt. Beim Umschalten ist er die nützlichste Angabe + /// überhaupt — er sagt, ob man noch einsteigt oder nur noch den Abspann + /// sieht. + public func progress(at moment: Date = .now) -> Double { + let total = endsAt.timeIntervalSince(startsAt) + guard total > 0 else { return 0 } + return min(max(moment.timeIntervalSince(startsAt) / total, 0), 1) + } } // MARK: - Ob es überhaupt etwas zu sehen gibt