Add chapters, history, bookmarks, live download progress, and i18n

- Chapter navigation with auto-scroll to current chapter and end-of-chapter sleep timer
- Opt-in listening history (local-only) with XML export and per-item quick menu
- Bookmarks with server sync via Audiobookshelf API
- Live MB counter during downloads via URLSessionDownloadTask delegate
- In-progress downloads shown in "Heruntergeladen" with dimmed cover + ring overlay
- Cover image cache (50 MB memory / 500 MB disk URLCache)
- German/English localization (de.lproj, en.lproj)
- Loading spinner now triggers immediately on view switch instead of waiting for the network

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-05-25 18:40:52 +02:00
parent 15d8e71d09
commit fa47cae664
21 changed files with 1751 additions and 119 deletions

View File

@@ -0,0 +1,152 @@
/* German is the default — keys match display values */
/* Navigation / Tabs */
"nav.libraries" = "Bibliotheken";
"nav.offline" = "Offline";
"nav.downloaded" = "Heruntergeladen";
"nav.history" = "Verlauf";
"nav.library" = "Bibliothek";
/* Player */
"player.preparing" = "Wiedergabe wird vorbereitet …";
"player.stop" = "Wiedergabe beenden";
"player.sleep_timer" = "Sleep-Timer";
"player.speed" = "Geschwindigkeit";
"player.chapters_bookmarks" = "Kapitel & Lesezeichen";
"player.history_recent" = "Letzter Verlauf";
"player.history_all" = "Gesamter Verlauf";
/* Sleep Timer */
"sleep.off" = "Aus";
"sleep.10min" = "10 Minuten";
"sleep.20min" = "20 Minuten";
"sleep.30min" = "30 Minuten";
"sleep.1h" = "1 Stunde";
"sleep.end_of_book" = "Bis Ende des Hörbuchs";
"sleep.end_of_episode" = "Bis Ende der Folge";
"sleep.end_of_chapter" = "Bis Ende des Kapitels";
/* Settings */
"settings.title" = "Einstellungen";
"settings.done" = "Fertig";
"settings.connection" = "Verbindung";
"settings.server" = "Server";
"settings.user" = "Benutzer";
"settings.online" = "Online";
"settings.offline" = "Offline";
"settings.queued" = "%lld wartend";
"settings.logout" = "Abmelden / Server wechseln";
"settings.logout_confirm_title" = "Mit Server abmelden?";
"settings.logout_confirm_action" = "Abmelden";
"settings.logout_confirm_message" = "Du wirst zurück zur Login-Maske geschickt. Heruntergeladene Inhalte bleiben.";
"settings.logout_confirm_message_mac" = "Du wirst zur Login-Maske zurückgesetzt. Heruntergeladene Hörbücher bleiben erhalten.";
"settings.cancel" = "Abbrechen";
"settings.connection_footer" = "Abmelden setzt die gespeicherten Anmeldedaten zurück. Heruntergeladene Inhalte bleiben.";
"settings.playback" = "Wiedergabe";
"settings.skip_duration" = "Sprung-Dauer";
"settings.skip_footer" = "Gilt für die Skip-Knöpfe in der Player-Leiste und auf dem Sperrbildschirm.";
"settings.skip_footer_mac" = "Gilt für die Skip-Knöpfe in der Player-Leiste und Medientasten.";
"settings.history_section" = "Hörverlauf";
"settings.history_enable" = "Hörverlauf aktivieren";
"settings.history_entries" = "Einträge";
"settings.history_export" = "Verlauf als XML exportieren";
"settings.history_footer_on" = "Positionen werden vor jedem Sprung aufgezeichnet (max. 200 Einträge). Daten verbleiben lokal auf diesem Gerät.";
"settings.history_footer_off" = "Protokolliert, wo du vor einem Sprung warst, damit du zurücknavigieren kannst. Standardmäßig deaktiviert.";
"settings.history_disable_title" = "Hörverlauf deaktivieren?";
"settings.history_disable_action" = "Verlauf löschen & deaktivieren";
"settings.history_disable_message" = "Der gesamte aufgezeichnete Hörverlauf wird unwiderruflich gelöscht.";
"settings.history_footer_on_mac" = "Positionen werden vor jedem Sprung aufgezeichnet (max. 200 Einträge).";
"settings.history_footer_off_mac" = "Protokolliert Positionen vor Sprüngen, damit du zurücknavigieren kannst.";
"settings.appearance" = "Darstellung";
"settings.library_view" = "Bibliotheks-Ansicht";
"settings.auto_refresh" = "Beim Start automatisch aktualisieren";
"settings.downloads" = "Downloads";
"settings.downloaded_count" = "%lld Einträge";
"settings.downloads_footer" = "Heruntergeladene Hörbücher und Folgen können einzeln über das Kontextmenü gelöscht werden.";
"settings.about" = "Über";
"settings.version" = "Version";
"settings.language" = "Sprache";
"settings.language_de" = "Deutsch";
"settings.language_en" = "Englisch";
/* Playback Details Sheet */
"details.chapters" = "Kapitel";
"details.history" = "Verlauf";
"details.bookmarks" = "Lesezeichen";
"details.chapter_start" = "Kapitelanfang";
"details.chapter_prev" = "Vorheriges Kapitel";
"details.chapter_next" = "Nächstes Kapitel";
"details.chapter_end" = "Kapitelende";
"details.no_chapters" = "Keine Kapitel";
"details.no_chapters_desc" = "Dieses Hörbuch enthält keine Kapitelinformationen.";
"details.no_history" = "Kein Verlauf";
"details.no_history_desc" = "Positionen werden beim Springen aufgezeichnet.";
"details.clear_history" = "Verlauf löschen";
"details.no_bookmarks" = "Keine Lesezeichen";
"details.no_bookmarks_desc" = "Tippe auf \"+\" um die aktuelle Position zu merken.";
"details.add_bookmark" = "Lesezeichen hinzufügen";
"details.bookmark_name_title" = "Lesezeichen hinzufügen";
"details.bookmark_name_placeholder" = "Name";
"details.bookmark_name_message" = "Gib einen Namen für dieses Lesezeichen ein.";
"details.bookmark_add" = "Hinzufügen";
/* Full History View */
"history.title" = "Gesamter Verlauf";
"history.empty" = "Kein Verlauf";
"history.empty_desc" = "Der Hörverlauf ist aktivierbar in den Einstellungen.";
"history.clear" = "Verlauf löschen";
"history.just_now" = "Gerade eben";
"history.minutes_ago" = "vor %lld Min.";
"history.hours_ago" = "vor %lld Std.";
"history.days_ago" = "vor %lld Tag(en)";
"history.not_playing" = "Kein aktives Hörbuch";
"history.other_item" = "(anderes Hörbuch)";
/* Download context menu */
"download.select_episodes" = "Episoden zum Download in der Podcast-Ansicht auswählen";
"download.save_offline" = "Für Offline herunterladen";
"download.cancel" = "Download abbrechen";
"download.delete" = "Heruntergeladene Dateien löschen";
/* Library / Main */
"library.loading" = "Lade Bibliothek …";
"library.error" = "Fehler";
"library.empty" = "Keine Hörbücher";
"library.empty_desc" = "Diese Auswahl enthält noch keine Hörbücher.";
"library.refresh" = "Bibliothek, Cover und Hörfortschritte neu laden";
"library.view_toggle" = "Zwischen Kachel- und Listenansicht wechseln";
"library.view_label" = "Ansicht";
"library.settings" = "Einstellungen";
/* Login */
"login.title" = "ABS Client";
"login.server_placeholder" = "https://mein-server.de";
"login.username" = "Benutzername";
"login.password" = "Passwort";
"login.connect" = "Verbinden";
/* Podcast */
"podcast.episodes" = "Episoden";
"podcast.loading" = "Lade Folgen …";
"podcast.no_date" = "Kein Datum";
/* Sidebar / macOS */
"sidebar.libraries" = "Bibliotheken";
"sidebar.offline" = "Offline";
"sidebar.history" = "Verlauf";
"sidebar.logout" = "Abmelden";
"sidebar.app_title" = "ABS Client";
"sidebar.status_online" = "Online";
"sidebar.status_offline" = "Offline";
/* Status */
"status.online" = "Online Fortschritt wird synchronisiert";
"status.offline_queued" = "Offline %lld Eintrag/Einträge wartend";
"status.syncing" = "%lld Synchronisationen wartend";
"status.logged_in_as" = "Angemeldet als %@";