diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 56c21476..53c88248 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minutter", "rememberTrackSelections": "Husk sporvalg per serie/film", "rememberTrackSelectionsDescription": "Gem automatisk lyd- og undertekstsprogpræferencer når du skifter spor under afspilning", + "showChapterMarkersOnTimeline": "Vis kapitelmarkører på tidslinjen", + "showChapterMarkersOnTimelineDescription": "Opdel tidslinjen ved kapitelgrænser", "clickVideoTogglesPlayback": "Klik på video skifter afspil/pause", "clickVideoTogglesPlaybackDescription": "Når aktiveret, afspiller/pauser klik på videoen. Ellers vises/skjules betjeningselementer.", "videoPlayerControls": "Videoafspillerkontroller", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 35405586..ba8f9a95 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} Minuten", "rememberTrackSelections": "Spurauswahl pro Serie/Film merken", "rememberTrackSelectionsDescription": "Audio- und Untertitelsprache automatisch speichern, wenn während der Wiedergabe geändert", + "showChapterMarkersOnTimeline": "Kapitelmarkierungen auf der Zeitleiste anzeigen", + "showChapterMarkersOnTimelineDescription": "Die Zeitleiste an Kapitelgrenzen unterteilen", "clickVideoTogglesPlayback": "Klicken Sie auf das Video, um die Wiedergabe zu starten oder zu pausieren.", "clickVideoTogglesPlaybackDescription": "Wenn diese Option aktiviert ist, wird durch Klicken auf den Videoplayer die Wiedergabe gestartet oder pausiert. Andernfalls werden durch Klicken die Wiedergabesteuerungen ein- oder ausgeblendet.", "videoPlayerControls": "Videoplayer-Steuerung", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 33a042ae..5f4180d3 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minutes", "rememberTrackSelections": "Remember track selections per show/movie", "rememberTrackSelectionsDescription": "Automatically save audio and subtitle language preferences when you change tracks during playback", + "showChapterMarkersOnTimeline": "Show chapter markers on seek bar", + "showChapterMarkersOnTimelineDescription": "Segment the seek bar at chapter boundaries", "clickVideoTogglesPlayback": "Click on video to toggle play/pause", "clickVideoTogglesPlaybackDescription": "If enabled, clicking on the video player will play/pause the video. Otherwise, clicking will show/hide the playback controls.", "videoPlayerControls": "Video Player Controls", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 8ba3e935..16f803c2 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minutos", "rememberTrackSelections": "Recordar selección de pistas por serie/película", "rememberTrackSelectionsDescription": "Guardar automáticamente las preferencias de idioma de audio y subtítulos al cambiarlas durante la reproducción", + "showChapterMarkersOnTimeline": "Mostrar marcadores de capítulos en la barra de progreso", + "showChapterMarkersOnTimelineDescription": "Dividir la barra de progreso en los límites de capítulos", "clickVideoTogglesPlayback": "Clic en el video para reproducir/pausar", "clickVideoTogglesPlaybackDescription": "Si está habilitado, hacer clic en el reproductor de video reproducirá/pausará el video. De lo contrario, mostrará/ocultará los controles.", "videoPlayerControls": "Controles del Reproductor de Video", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index aa8fb682..94ea0650 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minutes", "rememberTrackSelections": "Mémoriser les sélections de pistes par émission/film", "rememberTrackSelectionsDescription": "Enregistrer automatiquement les préférences linguistiques pour l'audio et les sous-titres lorsque vous changez de piste pendant la lecture", + "showChapterMarkersOnTimeline": "Afficher les marqueurs de chapitres sur la barre de lecture", + "showChapterMarkersOnTimelineDescription": "Segmenter la barre de lecture aux limites des chapitres", "clickVideoTogglesPlayback": "Cliquez sur la vidéo pour basculer entre lecture et pause.", "clickVideoTogglesPlaybackDescription": "Si cette option est activée, cliquer sur le lecteur vidéo lancera ou mettra en pause la vidéo. Sinon, le clic affichera ou masquera les commandes de lecture.", "videoPlayerControls": "Commandes du lecteur vidéo", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index 49bee4e3..c0d45d2b 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minuti", "rememberTrackSelections": "Ricorda selezioni tracce per serie/film", "rememberTrackSelectionsDescription": "Salva automaticamente le preferenze delle lingue audio e sottotitoli quando cambi tracce durante la riproduzione", + "showChapterMarkersOnTimeline": "Mostra i marcatori dei capitoli sulla barra di avanzamento", + "showChapterMarkersOnTimelineDescription": "Segmenta la barra di avanzamento ai confini dei capitoli", "clickVideoTogglesPlayback": "Fai clic sul video per avviare o mettere in pausa la riproduzione.", "clickVideoTogglesPlaybackDescription": "Se questa opzione è abilitata, facendo clic sul lettore video la riproduzione verrà avviata o messa in pausa. In caso contrario, facendo clic verranno mostrati o nascosti i controlli di riproduzione.", "videoPlayerControls": "Controlli del lettore video", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 1851afb4..21c8de44 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes}分", "rememberTrackSelections": "番組/映画ごとにトラック選択を記憶", "rememberTrackSelectionsDescription": "再生中にトラックを変更すると、音声と字幕の言語設定を自動保存", + "showChapterMarkersOnTimeline": "シークバーにチャプターマーカーを表示", + "showChapterMarkersOnTimelineDescription": "チャプターの境界でシークバーを区切る", "clickVideoTogglesPlayback": "動画クリックで再生/一時停止を切替", "clickVideoTogglesPlaybackDescription": "有効にすると、動画プレーヤーをクリックで再生/一時停止。それ以外は再生コントロールの表示/非表示。", "videoPlayerControls": "動画プレーヤーコントロール", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 310c1efb..0c04baa3 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes}분", "rememberTrackSelections": "에피소드/영화별 트랙 선택 기억", "rememberTrackSelectionsDescription": "재생 중 트랙을 변경할 때 오디오 및 자막 언어 설정을 자동으로 저장합니다", + "showChapterMarkersOnTimeline": "탐색 막대에 챕터 마커 표시", + "showChapterMarkersOnTimelineDescription": "챕터 경계에서 탐색 막대 구분", "clickVideoTogglesPlayback": "비디오를 클릭하여 재생/일시정지를 전환하세요.", "clickVideoTogglesPlaybackDescription": "이 옵션이 활성화되어 있으면 비디오 플레이어를 클릭할 때 재생 또는 일시정지가 됩니다. 그렇지 않으면 클릭 시 재생 컨트롤이 표시되거나 숨겨집니다.", "videoPlayerControls": "비디오 플레이어 컨트롤", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index c31bb4aa..6636700c 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minutter", "rememberTrackSelections": "Husk sporvalg per serie/film", "rememberTrackSelectionsDescription": "Lagre automatisk lyd- og undertekstspråkpreferanser når du bytter spor under avspilling", + "showChapterMarkersOnTimeline": "Vis kapittelmarkører på tidslinjen", + "showChapterMarkersOnTimelineDescription": "Del tidslinjen ved kapittelgrenser", "clickVideoTogglesPlayback": "Klikk på video for å veksle avspilling", "clickVideoTogglesPlaybackDescription": "Hvis aktivert, vil klikk på videospilleren spille av/pause videoen. Ellers vil klikk vise/skjule avspillingskontrollene.", "videoPlayerControls": "Videospillerkontroller", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index a78eb7e6..ae340ac8 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "bij ${minutes} minuten", "rememberTrackSelections": "Onthoud track selecties per serie/film", "rememberTrackSelectionsDescription": "Bewaar automatisch audio- en ondertiteltaalvoorkeuren wanneer je tracks wijzigt tijdens afspelen", + "showChapterMarkersOnTimeline": "Hoofdstukmarkeringen op tijdlijn tonen", + "showChapterMarkersOnTimelineDescription": "Verdeel de tijdlijn bij hoofdstukgrenzen", "clickVideoTogglesPlayback": "Klik op de video om afspelen/pauzeren te wisselen.", "clickVideoTogglesPlaybackDescription": "Als deze optie is ingeschakeld, wordt de video afgespeeld of gepauzeerd wanneer je op de videospeler klikt. Anders worden bij een klik de afspeelbedieningen weergegeven of verborgen.", "videoPlayerControls": "Videospeler bediening", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index fad8aca2..ded8fe63 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minut", "rememberTrackSelections": "Zapamiętaj wybór ścieżek per serial/film", "rememberTrackSelectionsDescription": "Automatycznie zapisuj preferencje języka audio i napisów przy zmianie ścieżek podczas odtwarzania", + "showChapterMarkersOnTimeline": "Pokaż znaczniki rozdziałów na pasku przewijania", + "showChapterMarkersOnTimelineDescription": "Podziel pasek przewijania na granicach rozdziałów", "clickVideoTogglesPlayback": "Kliknięcie wideo przełącza odtwarzanie/pauzę", "clickVideoTogglesPlaybackDescription": "Gdy włączone, kliknięcie na odtwarzacz wideo odtwarza/wstrzymuje. W przeciwnym razie pokazuje/ukrywa kontrolki.", "videoPlayerControls": "Kontrolki odtwarzacza wideo", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 63738001..8d38a31b 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minutos", "rememberTrackSelections": "Lembrar seleção de faixas por série/filme", "rememberTrackSelectionsDescription": "Salvar automaticamente preferências de idioma de áudio e legenda ao trocar faixas durante a reprodução", + "showChapterMarkersOnTimeline": "Mostrar marcadores de capítulos na barra de reprodução", + "showChapterMarkersOnTimelineDescription": "Segmentar a barra de reprodução nos limites dos capítulos", "clickVideoTogglesPlayback": "Clicar no vídeo para alternar reprodução/pausa", "clickVideoTogglesPlaybackDescription": "Se ativado, clicar no player reproduz/pausa o vídeo. Caso contrário, clicar mostra/oculta os controles.", "videoPlayerControls": "Controles do Player de Vídeo", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 71c2b639..335c6bc7 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} минут", "rememberTrackSelections": "Запоминать выбор дорожек для каждого сериала/фильма", "rememberTrackSelectionsDescription": "Автоматически сохранять предпочтения языка аудио и субтитров при переключении дорожек во время воспроизведения", + "showChapterMarkersOnTimeline": "Показывать маркеры глав на шкале перемотки", + "showChapterMarkersOnTimelineDescription": "Разделять шкалу перемотки по границам глав", "clickVideoTogglesPlayback": "Клик по видео для переключения воспроизведения/паузы", "clickVideoTogglesPlaybackDescription": "Если включено, клик по видеоплееру воспроизводит/ставит на паузу. В противном случае показывает/скрывает элементы управления.", "videoPlayerControls": "Элементы управления плеером", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 78a1097c..28c91b1a 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 15 -/// Strings: 16965 (1131 per locale) +/// Strings: 16995 (1133 per locale) /// -/// Built on 2026-05-04 at 07:36 UTC +/// Built on 2026-05-06 at 03:11 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 415ffde0..df1c82ac 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minutter'; @override String get rememberTrackSelections => 'Husk sporvalg per serie/film'; @override String get rememberTrackSelectionsDescription => 'Gem automatisk lyd- og undertekstsprogpræferencer når du skifter spor under afspilning'; + @override String get showChapterMarkersOnTimeline => 'Vis kapitelmarkører på tidslinjen'; + @override String get showChapterMarkersOnTimelineDescription => 'Opdel tidslinjen ved kapitelgrænser'; @override String get clickVideoTogglesPlayback => 'Klik på video skifter afspil/pause'; @override String get clickVideoTogglesPlaybackDescription => 'Når aktiveret, afspiller/pauser klik på videoen. Ellers vises/skjules betjeningselementer.'; @override String get videoPlayerControls => 'Videoafspillerkontroller'; @@ -1890,6 +1892,8 @@ extension on TranslationsDa { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minutter', 'settings.rememberTrackSelections' => 'Husk sporvalg per serie/film', 'settings.rememberTrackSelectionsDescription' => 'Gem automatisk lyd- og undertekstsprogpræferencer når du skifter spor under afspilning', + 'settings.showChapterMarkersOnTimeline' => 'Vis kapitelmarkører på tidslinjen', + 'settings.showChapterMarkersOnTimelineDescription' => 'Opdel tidslinjen ved kapitelgrænser', 'settings.clickVideoTogglesPlayback' => 'Klik på video skifter afspil/pause', 'settings.clickVideoTogglesPlaybackDescription' => 'Når aktiveret, afspiller/pauser klik på videoen. Ellers vises/skjules betjeningselementer.', 'settings.videoPlayerControls' => 'Videoafspillerkontroller', @@ -2260,10 +2264,10 @@ extension on TranslationsDa { 'profiles.pinManagedByPlex' => 'PIN administreres af Plex. Rediger på plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Ingen PIN-kode angivet. For at kræve en, redigér Home-brugeren på plex.tv.', 'profiles.setPin' => 'Angiv PIN', - 'profiles.connectionsLabel' => 'Forbindelser', - 'profiles.add' => 'Tilføj', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Forbindelser', + 'profiles.add' => 'Tilføj', 'profiles.deleteProfileButton' => 'Slet profil', 'profiles.noConnectionsHint' => 'Ingen forbindelser — tilføj en for at bruge denne profil.', 'profiles.plexHomeAccount' => 'Plex Home-konto', @@ -2774,10 +2778,10 @@ extension on TranslationsDa { 'metadataEdit.episodeOrdering' => 'Episoderækkefølge', 'metadataEdit.tmdbAiring' => 'The Movie Database (Sendt)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Sendt)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolut)', - 'metadataEdit.metadataLanguage' => 'Metadatasprog', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolut)', + 'metadataEdit.metadataLanguage' => 'Metadatasprog', 'metadataEdit.useOriginalTitle' => 'Brug originaltitel', 'metadataEdit.preferredAudioLanguage' => 'Foretrukket lydsprog', 'metadataEdit.preferredSubtitleLanguage' => 'Foretrukket undertekstsprog', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index a5abdd59..32d76911 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} Minuten'; @override String get rememberTrackSelections => 'Spurauswahl pro Serie/Film merken'; @override String get rememberTrackSelectionsDescription => 'Audio- und Untertitelsprache automatisch speichern, wenn während der Wiedergabe geändert'; + @override String get showChapterMarkersOnTimeline => 'Kapitelmarkierungen auf der Zeitleiste anzeigen'; + @override String get showChapterMarkersOnTimelineDescription => 'Die Zeitleiste an Kapitelgrenzen unterteilen'; @override String get clickVideoTogglesPlayback => 'Klicken Sie auf das Video, um die Wiedergabe zu starten oder zu pausieren.'; @override String get clickVideoTogglesPlaybackDescription => 'Wenn diese Option aktiviert ist, wird durch Klicken auf den Videoplayer die Wiedergabe gestartet oder pausiert. Andernfalls werden durch Klicken die Wiedergabesteuerungen ein- oder ausgeblendet.'; @override String get videoPlayerControls => 'Videoplayer-Steuerung'; @@ -1890,6 +1892,8 @@ extension on TranslationsDe { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} Minuten', 'settings.rememberTrackSelections' => 'Spurauswahl pro Serie/Film merken', 'settings.rememberTrackSelectionsDescription' => 'Audio- und Untertitelsprache automatisch speichern, wenn während der Wiedergabe geändert', + 'settings.showChapterMarkersOnTimeline' => 'Kapitelmarkierungen auf der Zeitleiste anzeigen', + 'settings.showChapterMarkersOnTimelineDescription' => 'Die Zeitleiste an Kapitelgrenzen unterteilen', 'settings.clickVideoTogglesPlayback' => 'Klicken Sie auf das Video, um die Wiedergabe zu starten oder zu pausieren.', 'settings.clickVideoTogglesPlaybackDescription' => 'Wenn diese Option aktiviert ist, wird durch Klicken auf den Videoplayer die Wiedergabe gestartet oder pausiert. Andernfalls werden durch Klicken die Wiedergabesteuerungen ein- oder ausgeblendet.', 'settings.videoPlayerControls' => 'Videoplayer-Steuerung', @@ -2260,10 +2264,10 @@ extension on TranslationsDe { 'profiles.pinManagedByPlex' => 'PIN wird von Plex verwaltet. Auf plex.tv bearbeiten.', 'profiles.noPinSetEditOnPlex' => 'Keine PIN festgelegt. Um eine zu verlangen, bearbeite den Home-Benutzer auf plex.tv.', 'profiles.setPin' => 'PIN festlegen', - 'profiles.connectionsLabel' => 'Verbindungen', - 'profiles.add' => 'Hinzufügen', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Verbindungen', + 'profiles.add' => 'Hinzufügen', 'profiles.deleteProfileButton' => 'Profil löschen', 'profiles.noConnectionsHint' => 'Keine Verbindungen — füge eine hinzu, um dieses Profil zu nutzen.', 'profiles.plexHomeAccount' => 'Plex Home-Konto', @@ -2774,10 +2778,10 @@ extension on TranslationsDe { 'metadataEdit.episodeOrdering' => 'Episodenreihenfolge', 'metadataEdit.tmdbAiring' => 'The Movie Database (Ausgestrahlt)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Ausgestrahlt)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolut)', - 'metadataEdit.metadataLanguage' => 'Metadaten-Sprache', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolut)', + 'metadataEdit.metadataLanguage' => 'Metadaten-Sprache', 'metadataEdit.useOriginalTitle' => 'Originaltitel verwenden', 'metadataEdit.preferredAudioLanguage' => 'Bevorzugte Audiosprache', 'metadataEdit.preferredSubtitleLanguage' => 'Bevorzugte Untertitelsprache', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 675c903d..c3e77162 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -559,6 +559,12 @@ class TranslationsSettingsEn { /// en: 'Automatically save audio and subtitle language preferences when you change tracks during playback' String get rememberTrackSelectionsDescription => 'Automatically save audio and subtitle language preferences when you change tracks during playback'; + /// en: 'Show chapter markers on seek bar' + String get showChapterMarkersOnTimeline => 'Show chapter markers on seek bar'; + + /// en: 'Segment the seek bar at chapter boundaries' + String get showChapterMarkersOnTimelineDescription => 'Segment the seek bar at chapter boundaries'; + /// en: 'Click on video to toggle play/pause' String get clickVideoTogglesPlayback => 'Click on video to toggle play/pause'; @@ -4158,6 +4164,8 @@ extension on Translations { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minutes', 'settings.rememberTrackSelections' => 'Remember track selections per show/movie', 'settings.rememberTrackSelectionsDescription' => 'Automatically save audio and subtitle language preferences when you change tracks during playback', + 'settings.showChapterMarkersOnTimeline' => 'Show chapter markers on seek bar', + 'settings.showChapterMarkersOnTimelineDescription' => 'Segment the seek bar at chapter boundaries', 'settings.clickVideoTogglesPlayback' => 'Click on video to toggle play/pause', 'settings.clickVideoTogglesPlaybackDescription' => 'If enabled, clicking on the video player will play/pause the video. Otherwise, clicking will show/hide the playback controls.', 'settings.videoPlayerControls' => 'Video Player Controls', @@ -4528,10 +4536,10 @@ extension on Translations { 'profiles.pinManagedByPlex' => 'PIN managed by Plex. Edit on plex.tv.', 'profiles.noPinSetEditOnPlex' => 'No PIN set. To require one, edit the home user on plex.tv.', 'profiles.setPin' => 'Set PIN', - 'profiles.connectionsLabel' => 'Connections', - 'profiles.add' => 'Add', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Connections', + 'profiles.add' => 'Add', 'profiles.deleteProfileButton' => 'Delete profile', 'profiles.noConnectionsHint' => 'No connections — add one to use this profile.', 'profiles.plexHomeAccount' => 'Plex Home account', @@ -5042,10 +5050,10 @@ extension on Translations { 'metadataEdit.episodeOrdering' => 'Episode Ordering', 'metadataEdit.tmdbAiring' => 'The Movie Database (Aired)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Aired)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolute)', - 'metadataEdit.metadataLanguage' => 'Metadata Language', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolute)', + 'metadataEdit.metadataLanguage' => 'Metadata Language', 'metadataEdit.useOriginalTitle' => 'Use Original Title', 'metadataEdit.preferredAudioLanguage' => 'Preferred Audio Language', 'metadataEdit.preferredSubtitleLanguage' => 'Preferred Subtitle Language', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index bded60ae..8e2b8238 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minutos'; @override String get rememberTrackSelections => 'Recordar selección de pistas por serie/película'; @override String get rememberTrackSelectionsDescription => 'Guardar automáticamente las preferencias de idioma de audio y subtítulos al cambiarlas durante la reproducción'; + @override String get showChapterMarkersOnTimeline => 'Mostrar marcadores de capítulos en la barra de progreso'; + @override String get showChapterMarkersOnTimelineDescription => 'Dividir la barra de progreso en los límites de capítulos'; @override String get clickVideoTogglesPlayback => 'Clic en el video para reproducir/pausar'; @override String get clickVideoTogglesPlaybackDescription => 'Si está habilitado, hacer clic en el reproductor de video reproducirá/pausará el video. De lo contrario, mostrará/ocultará los controles.'; @override String get videoPlayerControls => 'Controles del Reproductor de Video'; @@ -1890,6 +1892,8 @@ extension on TranslationsEs { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minutos', 'settings.rememberTrackSelections' => 'Recordar selección de pistas por serie/película', 'settings.rememberTrackSelectionsDescription' => 'Guardar automáticamente las preferencias de idioma de audio y subtítulos al cambiarlas durante la reproducción', + 'settings.showChapterMarkersOnTimeline' => 'Mostrar marcadores de capítulos en la barra de progreso', + 'settings.showChapterMarkersOnTimelineDescription' => 'Dividir la barra de progreso en los límites de capítulos', 'settings.clickVideoTogglesPlayback' => 'Clic en el video para reproducir/pausar', 'settings.clickVideoTogglesPlaybackDescription' => 'Si está habilitado, hacer clic en el reproductor de video reproducirá/pausará el video. De lo contrario, mostrará/ocultará los controles.', 'settings.videoPlayerControls' => 'Controles del Reproductor de Video', @@ -2260,10 +2264,10 @@ extension on TranslationsEs { 'profiles.pinManagedByPlex' => 'PIN gestionado por Plex. Edita en plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Sin PIN establecido. Para requerir uno, edita el usuario Home en plex.tv.', 'profiles.setPin' => 'Establecer PIN', - 'profiles.connectionsLabel' => 'Conexiones', - 'profiles.add' => 'Añadir', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Conexiones', + 'profiles.add' => 'Añadir', 'profiles.deleteProfileButton' => 'Eliminar perfil', 'profiles.noConnectionsHint' => 'Sin conexiones — añade una para usar este perfil.', 'profiles.plexHomeAccount' => 'Cuenta Plex Home', @@ -2774,10 +2778,10 @@ extension on TranslationsEs { 'metadataEdit.episodeOrdering' => 'Orden de episodios', 'metadataEdit.tmdbAiring' => 'The Movie Database (Emisión)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Emisión)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absoluto)', - 'metadataEdit.metadataLanguage' => 'Idioma de metadatos', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absoluto)', + 'metadataEdit.metadataLanguage' => 'Idioma de metadatos', 'metadataEdit.useOriginalTitle' => 'Usar título original', 'metadataEdit.preferredAudioLanguage' => 'Idioma de audio preferido', 'metadataEdit.preferredSubtitleLanguage' => 'Idioma de subtítulos preferido', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 3efc4243..8c246bd5 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minutes'; @override String get rememberTrackSelections => 'Mémoriser les sélections de pistes par émission/film'; @override String get rememberTrackSelectionsDescription => 'Enregistrer automatiquement les préférences linguistiques pour l\'audio et les sous-titres lorsque vous changez de piste pendant la lecture'; + @override String get showChapterMarkersOnTimeline => 'Afficher les marqueurs de chapitres sur la barre de lecture'; + @override String get showChapterMarkersOnTimelineDescription => 'Segmenter la barre de lecture aux limites des chapitres'; @override String get clickVideoTogglesPlayback => 'Cliquez sur la vidéo pour basculer entre lecture et pause.'; @override String get clickVideoTogglesPlaybackDescription => 'Si cette option est activée, cliquer sur le lecteur vidéo lancera ou mettra en pause la vidéo. Sinon, le clic affichera ou masquera les commandes de lecture.'; @override String get videoPlayerControls => 'Commandes du lecteur vidéo'; @@ -1890,6 +1892,8 @@ extension on TranslationsFr { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minutes', 'settings.rememberTrackSelections' => 'Mémoriser les sélections de pistes par émission/film', 'settings.rememberTrackSelectionsDescription' => 'Enregistrer automatiquement les préférences linguistiques pour l\'audio et les sous-titres lorsque vous changez de piste pendant la lecture', + 'settings.showChapterMarkersOnTimeline' => 'Afficher les marqueurs de chapitres sur la barre de lecture', + 'settings.showChapterMarkersOnTimelineDescription' => 'Segmenter la barre de lecture aux limites des chapitres', 'settings.clickVideoTogglesPlayback' => 'Cliquez sur la vidéo pour basculer entre lecture et pause.', 'settings.clickVideoTogglesPlaybackDescription' => 'Si cette option est activée, cliquer sur le lecteur vidéo lancera ou mettra en pause la vidéo. Sinon, le clic affichera ou masquera les commandes de lecture.', 'settings.videoPlayerControls' => 'Commandes du lecteur vidéo', @@ -2260,10 +2264,10 @@ extension on TranslationsFr { 'profiles.pinManagedByPlex' => 'PIN géré par Plex. Modifier sur plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Aucun PIN défini. Pour en exiger un, modifiez l\'utilisateur Home sur plex.tv.', 'profiles.setPin' => 'Définir un PIN', - 'profiles.connectionsLabel' => 'Connexions', - 'profiles.add' => 'Ajouter', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Connexions', + 'profiles.add' => 'Ajouter', 'profiles.deleteProfileButton' => 'Supprimer le profil', 'profiles.noConnectionsHint' => 'Aucune connexion — ajoutez-en une pour utiliser ce profil.', 'profiles.plexHomeAccount' => 'Compte Plex Home', @@ -2774,10 +2778,10 @@ extension on TranslationsFr { 'metadataEdit.episodeOrdering' => 'Ordre des épisodes', 'metadataEdit.tmdbAiring' => 'The Movie Database (Diffusion)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Diffusion)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolu)', - 'metadataEdit.metadataLanguage' => 'Langue des métadonnées', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolu)', + 'metadataEdit.metadataLanguage' => 'Langue des métadonnées', 'metadataEdit.useOriginalTitle' => 'Utiliser le titre original', 'metadataEdit.preferredAudioLanguage' => 'Langue audio préférée', 'metadataEdit.preferredSubtitleLanguage' => 'Langue de sous-titres préférée', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 6f1f04e0..79175f0e 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minuti'; @override String get rememberTrackSelections => 'Ricorda selezioni tracce per serie/film'; @override String get rememberTrackSelectionsDescription => 'Salva automaticamente le preferenze delle lingue audio e sottotitoli quando cambi tracce durante la riproduzione'; + @override String get showChapterMarkersOnTimeline => 'Mostra i marcatori dei capitoli sulla barra di avanzamento'; + @override String get showChapterMarkersOnTimelineDescription => 'Segmenta la barra di avanzamento ai confini dei capitoli'; @override String get clickVideoTogglesPlayback => 'Fai clic sul video per avviare o mettere in pausa la riproduzione.'; @override String get clickVideoTogglesPlaybackDescription => 'Se questa opzione è abilitata, facendo clic sul lettore video la riproduzione verrà avviata o messa in pausa. In caso contrario, facendo clic verranno mostrati o nascosti i controlli di riproduzione.'; @override String get videoPlayerControls => 'Controlli del lettore video'; @@ -1890,6 +1892,8 @@ extension on TranslationsIt { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minuti', 'settings.rememberTrackSelections' => 'Ricorda selezioni tracce per serie/film', 'settings.rememberTrackSelectionsDescription' => 'Salva automaticamente le preferenze delle lingue audio e sottotitoli quando cambi tracce durante la riproduzione', + 'settings.showChapterMarkersOnTimeline' => 'Mostra i marcatori dei capitoli sulla barra di avanzamento', + 'settings.showChapterMarkersOnTimelineDescription' => 'Segmenta la barra di avanzamento ai confini dei capitoli', 'settings.clickVideoTogglesPlayback' => 'Fai clic sul video per avviare o mettere in pausa la riproduzione.', 'settings.clickVideoTogglesPlaybackDescription' => 'Se questa opzione è abilitata, facendo clic sul lettore video la riproduzione verrà avviata o messa in pausa. In caso contrario, facendo clic verranno mostrati o nascosti i controlli di riproduzione.', 'settings.videoPlayerControls' => 'Controlli del lettore video', @@ -2260,10 +2264,10 @@ extension on TranslationsIt { 'profiles.pinManagedByPlex' => 'PIN gestito da Plex. Modifica su plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Nessun PIN impostato. Per richiederne uno, modifica l\'utente Home su plex.tv.', 'profiles.setPin' => 'Imposta PIN', - 'profiles.connectionsLabel' => 'Connessioni', - 'profiles.add' => 'Aggiungi', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Connessioni', + 'profiles.add' => 'Aggiungi', 'profiles.deleteProfileButton' => 'Elimina profilo', 'profiles.noConnectionsHint' => 'Nessuna connessione — aggiungine una per usare questo profilo.', 'profiles.plexHomeAccount' => 'Account Plex Home', @@ -2774,10 +2778,10 @@ extension on TranslationsIt { 'metadataEdit.episodeOrdering' => 'Ordine episodi', 'metadataEdit.tmdbAiring' => 'The Movie Database (In onda)', 'metadataEdit.tvdbAiring' => 'TheTVDB (In onda)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Assoluto)', - 'metadataEdit.metadataLanguage' => 'Lingua metadati', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Assoluto)', + 'metadataEdit.metadataLanguage' => 'Lingua metadati', 'metadataEdit.useOriginalTitle' => 'Usa titolo originale', 'metadataEdit.preferredAudioLanguage' => 'Lingua audio preferita', 'metadataEdit.preferredSubtitleLanguage' => 'Lingua sottotitoli preferita', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index ead12b3d..5d403292 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes}分'; @override String get rememberTrackSelections => '番組/映画ごとにトラック選択を記憶'; @override String get rememberTrackSelectionsDescription => '再生中にトラックを変更すると、音声と字幕の言語設定を自動保存'; + @override String get showChapterMarkersOnTimeline => 'シークバーにチャプターマーカーを表示'; + @override String get showChapterMarkersOnTimelineDescription => 'チャプターの境界でシークバーを区切る'; @override String get clickVideoTogglesPlayback => '動画クリックで再生/一時停止を切替'; @override String get clickVideoTogglesPlaybackDescription => '有効にすると、動画プレーヤーをクリックで再生/一時停止。それ以外は再生コントロールの表示/非表示。'; @override String get videoPlayerControls => '動画プレーヤーコントロール'; @@ -1890,6 +1892,8 @@ extension on TranslationsJa { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes}分', 'settings.rememberTrackSelections' => '番組/映画ごとにトラック選択を記憶', 'settings.rememberTrackSelectionsDescription' => '再生中にトラックを変更すると、音声と字幕の言語設定を自動保存', + 'settings.showChapterMarkersOnTimeline' => 'シークバーにチャプターマーカーを表示', + 'settings.showChapterMarkersOnTimelineDescription' => 'チャプターの境界でシークバーを区切る', 'settings.clickVideoTogglesPlayback' => '動画クリックで再生/一時停止を切替', 'settings.clickVideoTogglesPlaybackDescription' => '有効にすると、動画プレーヤーをクリックで再生/一時停止。それ以外は再生コントロールの表示/非表示。', 'settings.videoPlayerControls' => '動画プレーヤーコントロール', @@ -2260,10 +2264,10 @@ extension on TranslationsJa { 'profiles.pinManagedByPlex' => 'PINはPlexで管理されています。plex.tvで編集してください。', 'profiles.noPinSetEditOnPlex' => 'PINが設定されていません。要求するには、plex.tvでHomeユーザーを編集してください。', 'profiles.setPin' => 'PINを設定', - 'profiles.connectionsLabel' => '接続', - 'profiles.add' => '追加', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => '接続', + 'profiles.add' => '追加', 'profiles.deleteProfileButton' => 'プロファイルを削除', 'profiles.noConnectionsHint' => '接続がありません — このプロファイルを使うには1つ追加してください。', 'profiles.plexHomeAccount' => 'Plex Homeアカウント', @@ -2774,10 +2778,10 @@ extension on TranslationsJa { 'metadataEdit.episodeOrdering' => 'エピソードの順序', 'metadataEdit.tmdbAiring' => 'The Movie Database(放送順)', 'metadataEdit.tvdbAiring' => 'TheTVDB(放送順)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB(絶対順)', - 'metadataEdit.metadataLanguage' => 'メタデータの言語', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB(絶対順)', + 'metadataEdit.metadataLanguage' => 'メタデータの言語', 'metadataEdit.useOriginalTitle' => '原題を使用', 'metadataEdit.preferredAudioLanguage' => '優先音声言語', 'metadataEdit.preferredSubtitleLanguage' => '優先字幕言語', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 8730ae9e..98b9672b 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes}분'; @override String get rememberTrackSelections => '에피소드/영화별 트랙 선택 기억'; @override String get rememberTrackSelectionsDescription => '재생 중 트랙을 변경할 때 오디오 및 자막 언어 설정을 자동으로 저장합니다'; + @override String get showChapterMarkersOnTimeline => '탐색 막대에 챕터 마커 표시'; + @override String get showChapterMarkersOnTimelineDescription => '챕터 경계에서 탐색 막대 구분'; @override String get clickVideoTogglesPlayback => '비디오를 클릭하여 재생/일시정지를 전환하세요.'; @override String get clickVideoTogglesPlaybackDescription => '이 옵션이 활성화되어 있으면 비디오 플레이어를 클릭할 때 재생 또는 일시정지가 됩니다. 그렇지 않으면 클릭 시 재생 컨트롤이 표시되거나 숨겨집니다.'; @override String get videoPlayerControls => '비디오 플레이어 컨트롤'; @@ -1890,6 +1892,8 @@ extension on TranslationsKo { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes}분', 'settings.rememberTrackSelections' => '에피소드/영화별 트랙 선택 기억', 'settings.rememberTrackSelectionsDescription' => '재생 중 트랙을 변경할 때 오디오 및 자막 언어 설정을 자동으로 저장합니다', + 'settings.showChapterMarkersOnTimeline' => '탐색 막대에 챕터 마커 표시', + 'settings.showChapterMarkersOnTimelineDescription' => '챕터 경계에서 탐색 막대 구분', 'settings.clickVideoTogglesPlayback' => '비디오를 클릭하여 재생/일시정지를 전환하세요.', 'settings.clickVideoTogglesPlaybackDescription' => '이 옵션이 활성화되어 있으면 비디오 플레이어를 클릭할 때 재생 또는 일시정지가 됩니다. 그렇지 않으면 클릭 시 재생 컨트롤이 표시되거나 숨겨집니다.', 'settings.videoPlayerControls' => '비디오 플레이어 컨트롤', @@ -2260,10 +2264,10 @@ extension on TranslationsKo { 'profiles.pinManagedByPlex' => 'PIN은 Plex에서 관리됩니다. plex.tv에서 편집하세요.', 'profiles.noPinSetEditOnPlex' => '설정된 PIN이 없습니다. 요구하려면 plex.tv에서 Home 사용자를 편집하세요.', 'profiles.setPin' => 'PIN 설정', - 'profiles.connectionsLabel' => '연결', - 'profiles.add' => '추가', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => '연결', + 'profiles.add' => '추가', 'profiles.deleteProfileButton' => '프로필 삭제', 'profiles.noConnectionsHint' => '연결이 없습니다 — 이 프로필을 사용하려면 하나 추가하세요.', 'profiles.plexHomeAccount' => 'Plex Home 계정', @@ -2774,10 +2778,10 @@ extension on TranslationsKo { 'metadataEdit.episodeOrdering' => '에피소드 순서', 'metadataEdit.tmdbAiring' => 'The Movie Database (방영순)', 'metadataEdit.tvdbAiring' => 'TheTVDB (방영순)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (절대순)', - 'metadataEdit.metadataLanguage' => '메타데이터 언어', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (절대순)', + 'metadataEdit.metadataLanguage' => '메타데이터 언어', 'metadataEdit.useOriginalTitle' => '원제 사용', 'metadataEdit.preferredAudioLanguage' => '선호 오디오 언어', 'metadataEdit.preferredSubtitleLanguage' => '선호 자막 언어', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 8a76b0e7..9d9da7ee 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minutter'; @override String get rememberTrackSelections => 'Husk sporvalg per serie/film'; @override String get rememberTrackSelectionsDescription => 'Lagre automatisk lyd- og undertekstspråkpreferanser når du bytter spor under avspilling'; + @override String get showChapterMarkersOnTimeline => 'Vis kapittelmarkører på tidslinjen'; + @override String get showChapterMarkersOnTimelineDescription => 'Del tidslinjen ved kapittelgrenser'; @override String get clickVideoTogglesPlayback => 'Klikk på video for å veksle avspilling'; @override String get clickVideoTogglesPlaybackDescription => 'Hvis aktivert, vil klikk på videospilleren spille av/pause videoen. Ellers vil klikk vise/skjule avspillingskontrollene.'; @override String get videoPlayerControls => 'Videospillerkontroller'; @@ -1890,6 +1892,8 @@ extension on TranslationsNb { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minutter', 'settings.rememberTrackSelections' => 'Husk sporvalg per serie/film', 'settings.rememberTrackSelectionsDescription' => 'Lagre automatisk lyd- og undertekstspråkpreferanser når du bytter spor under avspilling', + 'settings.showChapterMarkersOnTimeline' => 'Vis kapittelmarkører på tidslinjen', + 'settings.showChapterMarkersOnTimelineDescription' => 'Del tidslinjen ved kapittelgrenser', 'settings.clickVideoTogglesPlayback' => 'Klikk på video for å veksle avspilling', 'settings.clickVideoTogglesPlaybackDescription' => 'Hvis aktivert, vil klikk på videospilleren spille av/pause videoen. Ellers vil klikk vise/skjule avspillingskontrollene.', 'settings.videoPlayerControls' => 'Videospillerkontroller', @@ -2260,10 +2264,10 @@ extension on TranslationsNb { 'profiles.pinManagedByPlex' => 'PIN administreres av Plex. Rediger på plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Ingen PIN er satt. For å kreve én, rediger Home-brukeren på plex.tv.', 'profiles.setPin' => 'Sett PIN', - 'profiles.connectionsLabel' => 'Tilkoblinger', - 'profiles.add' => 'Legg til', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Tilkoblinger', + 'profiles.add' => 'Legg til', 'profiles.deleteProfileButton' => 'Slett profil', 'profiles.noConnectionsHint' => 'Ingen tilkoblinger — legg til én for å bruke denne profilen.', 'profiles.plexHomeAccount' => 'Plex Home-konto', @@ -2774,10 +2778,10 @@ extension on TranslationsNb { 'metadataEdit.episodeOrdering' => 'Episoderekkefølge', 'metadataEdit.tmdbAiring' => 'The Movie Database (Sendt)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Sendt)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolutt)', - 'metadataEdit.metadataLanguage' => 'Metadataspråk', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolutt)', + 'metadataEdit.metadataLanguage' => 'Metadataspråk', 'metadataEdit.useOriginalTitle' => 'Bruk originaltittel', 'metadataEdit.preferredAudioLanguage' => 'Foretrukket lydspråk', 'metadataEdit.preferredSubtitleLanguage' => 'Foretrukket undertekstspråk', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 361e5608..022352f2 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => 'bij ${minutes} minuten'; @override String get rememberTrackSelections => 'Onthoud track selecties per serie/film'; @override String get rememberTrackSelectionsDescription => 'Bewaar automatisch audio- en ondertiteltaalvoorkeuren wanneer je tracks wijzigt tijdens afspelen'; + @override String get showChapterMarkersOnTimeline => 'Hoofdstukmarkeringen op tijdlijn tonen'; + @override String get showChapterMarkersOnTimelineDescription => 'Verdeel de tijdlijn bij hoofdstukgrenzen'; @override String get clickVideoTogglesPlayback => 'Klik op de video om afspelen/pauzeren te wisselen.'; @override String get clickVideoTogglesPlaybackDescription => 'Als deze optie is ingeschakeld, wordt de video afgespeeld of gepauzeerd wanneer je op de videospeler klikt. Anders worden bij een klik de afspeelbedieningen weergegeven of verborgen.'; @override String get videoPlayerControls => 'Videospeler bediening'; @@ -1890,6 +1892,8 @@ extension on TranslationsNl { 'settings.minutesUnit' => ({required Object minutes}) => 'bij ${minutes} minuten', 'settings.rememberTrackSelections' => 'Onthoud track selecties per serie/film', 'settings.rememberTrackSelectionsDescription' => 'Bewaar automatisch audio- en ondertiteltaalvoorkeuren wanneer je tracks wijzigt tijdens afspelen', + 'settings.showChapterMarkersOnTimeline' => 'Hoofdstukmarkeringen op tijdlijn tonen', + 'settings.showChapterMarkersOnTimelineDescription' => 'Verdeel de tijdlijn bij hoofdstukgrenzen', 'settings.clickVideoTogglesPlayback' => 'Klik op de video om afspelen/pauzeren te wisselen.', 'settings.clickVideoTogglesPlaybackDescription' => 'Als deze optie is ingeschakeld, wordt de video afgespeeld of gepauzeerd wanneer je op de videospeler klikt. Anders worden bij een klik de afspeelbedieningen weergegeven of verborgen.', 'settings.videoPlayerControls' => 'Videospeler bediening', @@ -2260,10 +2264,10 @@ extension on TranslationsNl { 'profiles.pinManagedByPlex' => 'PIN wordt beheerd door Plex. Bewerk op plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Geen PIN ingesteld. Bewerk de Home-gebruiker op plex.tv om er één te vereisen.', 'profiles.setPin' => 'PIN instellen', - 'profiles.connectionsLabel' => 'Verbindingen', - 'profiles.add' => 'Toevoegen', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Verbindingen', + 'profiles.add' => 'Toevoegen', 'profiles.deleteProfileButton' => 'Profiel verwijderen', 'profiles.noConnectionsHint' => 'Geen verbindingen — voeg er één toe om dit profiel te gebruiken.', 'profiles.plexHomeAccount' => 'Plex Home-account', @@ -2774,10 +2778,10 @@ extension on TranslationsNl { 'metadataEdit.episodeOrdering' => 'Afleveringsvolgorde', 'metadataEdit.tmdbAiring' => 'The Movie Database (Uitgezonden)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Uitgezonden)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absoluut)', - 'metadataEdit.metadataLanguage' => 'Metadatataal', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absoluut)', + 'metadataEdit.metadataLanguage' => 'Metadatataal', 'metadataEdit.useOriginalTitle' => 'Oorspronkelijke titel gebruiken', 'metadataEdit.preferredAudioLanguage' => 'Voorkeurstaal audio', 'metadataEdit.preferredSubtitleLanguage' => 'Voorkeurstaal ondertiteling', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index e5047d0a..53420428 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minut'; @override String get rememberTrackSelections => 'Zapamiętaj wybór ścieżek per serial/film'; @override String get rememberTrackSelectionsDescription => 'Automatycznie zapisuj preferencje języka audio i napisów przy zmianie ścieżek podczas odtwarzania'; + @override String get showChapterMarkersOnTimeline => 'Pokaż znaczniki rozdziałów na pasku przewijania'; + @override String get showChapterMarkersOnTimelineDescription => 'Podziel pasek przewijania na granicach rozdziałów'; @override String get clickVideoTogglesPlayback => 'Kliknięcie wideo przełącza odtwarzanie/pauzę'; @override String get clickVideoTogglesPlaybackDescription => 'Gdy włączone, kliknięcie na odtwarzacz wideo odtwarza/wstrzymuje. W przeciwnym razie pokazuje/ukrywa kontrolki.'; @override String get videoPlayerControls => 'Kontrolki odtwarzacza wideo'; @@ -1890,6 +1892,8 @@ extension on TranslationsPl { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minut', 'settings.rememberTrackSelections' => 'Zapamiętaj wybór ścieżek per serial/film', 'settings.rememberTrackSelectionsDescription' => 'Automatycznie zapisuj preferencje języka audio i napisów przy zmianie ścieżek podczas odtwarzania', + 'settings.showChapterMarkersOnTimeline' => 'Pokaż znaczniki rozdziałów na pasku przewijania', + 'settings.showChapterMarkersOnTimelineDescription' => 'Podziel pasek przewijania na granicach rozdziałów', 'settings.clickVideoTogglesPlayback' => 'Kliknięcie wideo przełącza odtwarzanie/pauzę', 'settings.clickVideoTogglesPlaybackDescription' => 'Gdy włączone, kliknięcie na odtwarzacz wideo odtwarza/wstrzymuje. W przeciwnym razie pokazuje/ukrywa kontrolki.', 'settings.videoPlayerControls' => 'Kontrolki odtwarzacza wideo', @@ -2260,10 +2264,10 @@ extension on TranslationsPl { 'profiles.pinManagedByPlex' => 'PIN zarządzany przez Plex. Edytuj na plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Nie ustawiono PIN-u. Aby go wymagać, edytuj użytkownika Home na plex.tv.', 'profiles.setPin' => 'Ustaw PIN', - 'profiles.connectionsLabel' => 'Połączenia', - 'profiles.add' => 'Dodaj', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Połączenia', + 'profiles.add' => 'Dodaj', 'profiles.deleteProfileButton' => 'Usuń profil', 'profiles.noConnectionsHint' => 'Brak połączeń — dodaj jedno, aby używać tego profilu.', 'profiles.plexHomeAccount' => 'Konto Plex Home', @@ -2774,10 +2778,10 @@ extension on TranslationsPl { 'metadataEdit.episodeOrdering' => 'Kolejność odcinków', 'metadataEdit.tmdbAiring' => 'The Movie Database (Emisja)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Emisja)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolutna)', - 'metadataEdit.metadataLanguage' => 'Język metadanych', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolutna)', + 'metadataEdit.metadataLanguage' => 'Język metadanych', 'metadataEdit.useOriginalTitle' => 'Użyj oryginalnego tytułu', 'metadataEdit.preferredAudioLanguage' => 'Preferowany język audio', 'metadataEdit.preferredSubtitleLanguage' => 'Preferowany język napisów', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 470f6abf..c5c3bf1a 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minutos'; @override String get rememberTrackSelections => 'Lembrar seleção de faixas por série/filme'; @override String get rememberTrackSelectionsDescription => 'Salvar automaticamente preferências de idioma de áudio e legenda ao trocar faixas durante a reprodução'; + @override String get showChapterMarkersOnTimeline => 'Mostrar marcadores de capítulos na barra de reprodução'; + @override String get showChapterMarkersOnTimelineDescription => 'Segmentar a barra de reprodução nos limites dos capítulos'; @override String get clickVideoTogglesPlayback => 'Clicar no vídeo para alternar reprodução/pausa'; @override String get clickVideoTogglesPlaybackDescription => 'Se ativado, clicar no player reproduz/pausa o vídeo. Caso contrário, clicar mostra/oculta os controles.'; @override String get videoPlayerControls => 'Controles do Player de Vídeo'; @@ -1890,6 +1892,8 @@ extension on TranslationsPt { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minutos', 'settings.rememberTrackSelections' => 'Lembrar seleção de faixas por série/filme', 'settings.rememberTrackSelectionsDescription' => 'Salvar automaticamente preferências de idioma de áudio e legenda ao trocar faixas durante a reprodução', + 'settings.showChapterMarkersOnTimeline' => 'Mostrar marcadores de capítulos na barra de reprodução', + 'settings.showChapterMarkersOnTimelineDescription' => 'Segmentar a barra de reprodução nos limites dos capítulos', 'settings.clickVideoTogglesPlayback' => 'Clicar no vídeo para alternar reprodução/pausa', 'settings.clickVideoTogglesPlaybackDescription' => 'Se ativado, clicar no player reproduz/pausa o vídeo. Caso contrário, clicar mostra/oculta os controles.', 'settings.videoPlayerControls' => 'Controles do Player de Vídeo', @@ -2260,10 +2264,10 @@ extension on TranslationsPt { 'profiles.pinManagedByPlex' => 'PIN gerenciado pelo Plex. Edite em plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Nenhum PIN definido. Para exigir um, edite o usuário Home em plex.tv.', 'profiles.setPin' => 'Definir PIN', - 'profiles.connectionsLabel' => 'Conexões', - 'profiles.add' => 'Adicionar', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Conexões', + 'profiles.add' => 'Adicionar', 'profiles.deleteProfileButton' => 'Excluir perfil', 'profiles.noConnectionsHint' => 'Sem conexões — adicione uma para usar este perfil.', 'profiles.plexHomeAccount' => 'Conta Plex Home', @@ -2774,10 +2778,10 @@ extension on TranslationsPt { 'metadataEdit.episodeOrdering' => 'Ordenação de Episódios', 'metadataEdit.tmdbAiring' => 'The Movie Database (Exibição)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Exibição)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absoluto)', - 'metadataEdit.metadataLanguage' => 'Idioma dos Metadados', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absoluto)', + 'metadataEdit.metadataLanguage' => 'Idioma dos Metadados', 'metadataEdit.useOriginalTitle' => 'Usar Título Original', 'metadataEdit.preferredAudioLanguage' => 'Idioma de Áudio Preferido', 'metadataEdit.preferredSubtitleLanguage' => 'Idioma de Legenda Preferido', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index 96aabf79..18b4881f 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} минут'; @override String get rememberTrackSelections => 'Запоминать выбор дорожек для каждого сериала/фильма'; @override String get rememberTrackSelectionsDescription => 'Автоматически сохранять предпочтения языка аудио и субтитров при переключении дорожек во время воспроизведения'; + @override String get showChapterMarkersOnTimeline => 'Показывать маркеры глав на шкале перемотки'; + @override String get showChapterMarkersOnTimelineDescription => 'Разделять шкалу перемотки по границам глав'; @override String get clickVideoTogglesPlayback => 'Клик по видео для переключения воспроизведения/паузы'; @override String get clickVideoTogglesPlaybackDescription => 'Если включено, клик по видеоплееру воспроизводит/ставит на паузу. В противном случае показывает/скрывает элементы управления.'; @override String get videoPlayerControls => 'Элементы управления плеером'; @@ -1890,6 +1892,8 @@ extension on TranslationsRu { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} минут', 'settings.rememberTrackSelections' => 'Запоминать выбор дорожек для каждого сериала/фильма', 'settings.rememberTrackSelectionsDescription' => 'Автоматически сохранять предпочтения языка аудио и субтитров при переключении дорожек во время воспроизведения', + 'settings.showChapterMarkersOnTimeline' => 'Показывать маркеры глав на шкале перемотки', + 'settings.showChapterMarkersOnTimelineDescription' => 'Разделять шкалу перемотки по границам глав', 'settings.clickVideoTogglesPlayback' => 'Клик по видео для переключения воспроизведения/паузы', 'settings.clickVideoTogglesPlaybackDescription' => 'Если включено, клик по видеоплееру воспроизводит/ставит на паузу. В противном случае показывает/скрывает элементы управления.', 'settings.videoPlayerControls' => 'Элементы управления плеером', @@ -2260,10 +2264,10 @@ extension on TranslationsRu { 'profiles.pinManagedByPlex' => 'PIN управляется Plex. Редактируйте на plex.tv.', 'profiles.noPinSetEditOnPlex' => 'PIN не установлен. Чтобы требовать его, отредактируйте пользователя Home на plex.tv.', 'profiles.setPin' => 'Установить PIN', - 'profiles.connectionsLabel' => 'Соединения', - 'profiles.add' => 'Добавить', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Соединения', + 'profiles.add' => 'Добавить', 'profiles.deleteProfileButton' => 'Удалить профиль', 'profiles.noConnectionsHint' => 'Нет соединений — добавьте одно, чтобы использовать этот профиль.', 'profiles.plexHomeAccount' => 'Аккаунт Plex Home', @@ -2774,10 +2778,10 @@ extension on TranslationsRu { 'metadataEdit.episodeOrdering' => 'Порядок эпизодов', 'metadataEdit.tmdbAiring' => 'The Movie Database (Эфирный)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Эфирный)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Абсолютный)', - 'metadataEdit.metadataLanguage' => 'Язык метаданных', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Абсолютный)', + 'metadataEdit.metadataLanguage' => 'Язык метаданных', 'metadataEdit.useOriginalTitle' => 'Использовать оригинальное название', 'metadataEdit.preferredAudioLanguage' => 'Предпочитаемый язык аудио', 'metadataEdit.preferredSubtitleLanguage' => 'Предпочитаемый язык субтитров', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 50dd5e3b..349be3d8 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} minuter'; @override String get rememberTrackSelections => 'Kom ihåg spårval per serie/film'; @override String get rememberTrackSelectionsDescription => 'Spara automatiskt ljud- och undertextspråkpreferenser när du ändrar spår under uppspelning'; + @override String get showChapterMarkersOnTimeline => 'Visa kapitelmarkörer på tidslinjen'; + @override String get showChapterMarkersOnTimelineDescription => 'Dela upp tidslinjen vid kapitelgränser'; @override String get clickVideoTogglesPlayback => 'Klicka på videon för att växla mellan spela upp och pausa.'; @override String get clickVideoTogglesPlaybackDescription => 'Om detta är aktiverat kommer ett klick på videospelaren att starta eller pausa videon. Annars visas eller döljs uppspelningskontrollerna när du klickar.'; @override String get videoPlayerControls => 'Videospelar-kontroller'; @@ -1890,6 +1892,8 @@ extension on TranslationsSv { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} minuter', 'settings.rememberTrackSelections' => 'Kom ihåg spårval per serie/film', 'settings.rememberTrackSelectionsDescription' => 'Spara automatiskt ljud- och undertextspråkpreferenser när du ändrar spår under uppspelning', + 'settings.showChapterMarkersOnTimeline' => 'Visa kapitelmarkörer på tidslinjen', + 'settings.showChapterMarkersOnTimelineDescription' => 'Dela upp tidslinjen vid kapitelgränser', 'settings.clickVideoTogglesPlayback' => 'Klicka på videon för att växla mellan spela upp och pausa.', 'settings.clickVideoTogglesPlaybackDescription' => 'Om detta är aktiverat kommer ett klick på videospelaren att starta eller pausa videon. Annars visas eller döljs uppspelningskontrollerna när du klickar.', 'settings.videoPlayerControls' => 'Videospelar-kontroller', @@ -2260,10 +2264,10 @@ extension on TranslationsSv { 'profiles.pinManagedByPlex' => 'PIN hanteras av Plex. Redigera på plex.tv.', 'profiles.noPinSetEditOnPlex' => 'Ingen PIN angiven. För att kräva en, redigera Home-användaren på plex.tv.', 'profiles.setPin' => 'Ange PIN', - 'profiles.connectionsLabel' => 'Anslutningar', - 'profiles.add' => 'Lägg till', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => 'Anslutningar', + 'profiles.add' => 'Lägg till', 'profiles.deleteProfileButton' => 'Ta bort profil', 'profiles.noConnectionsHint' => 'Inga anslutningar — lägg till en för att använda den här profilen.', 'profiles.plexHomeAccount' => 'Plex Home-konto', @@ -2774,10 +2778,10 @@ extension on TranslationsSv { 'metadataEdit.episodeOrdering' => 'Avsnittsordning', 'metadataEdit.tmdbAiring' => 'The Movie Database (Sändning)', 'metadataEdit.tvdbAiring' => 'TheTVDB (Sändning)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolut)', - 'metadataEdit.metadataLanguage' => 'Metadataspråk', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB (Absolut)', + 'metadataEdit.metadataLanguage' => 'Metadataspråk', 'metadataEdit.useOriginalTitle' => 'Använd originaltitel', 'metadataEdit.preferredAudioLanguage' => 'Föredraget ljudspråk', 'metadataEdit.preferredSubtitleLanguage' => 'Föredraget undertextspråk', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 094d7f91..e0414fce 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -277,6 +277,8 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String minutesUnit({required Object minutes}) => '${minutes} 分钟'; @override String get rememberTrackSelections => '记住每个剧集/电影的音轨选择'; @override String get rememberTrackSelectionsDescription => '在播放过程中更改音轨时自动保存音频和字幕语言偏好'; + @override String get showChapterMarkersOnTimeline => '在进度条上显示章节标记'; + @override String get showChapterMarkersOnTimelineDescription => '按章节边界分段显示进度条'; @override String get clickVideoTogglesPlayback => '点击视频可切换播放/暂停'; @override String get clickVideoTogglesPlaybackDescription => '如果启用此选项,点击视频播放器将播放或暂停视频。否则,点击将显示或隐藏播放控件'; @override String get videoPlayerControls => '视频播放器控制'; @@ -1890,6 +1892,8 @@ extension on TranslationsZh { 'settings.minutesUnit' => ({required Object minutes}) => '${minutes} 分钟', 'settings.rememberTrackSelections' => '记住每个剧集/电影的音轨选择', 'settings.rememberTrackSelectionsDescription' => '在播放过程中更改音轨时自动保存音频和字幕语言偏好', + 'settings.showChapterMarkersOnTimeline' => '在进度条上显示章节标记', + 'settings.showChapterMarkersOnTimelineDescription' => '按章节边界分段显示进度条', 'settings.clickVideoTogglesPlayback' => '点击视频可切换播放/暂停', 'settings.clickVideoTogglesPlaybackDescription' => '如果启用此选项,点击视频播放器将播放或暂停视频。否则,点击将显示或隐藏播放控件', 'settings.videoPlayerControls' => '视频播放器控制', @@ -2260,10 +2264,10 @@ extension on TranslationsZh { 'profiles.pinManagedByPlex' => 'PIN 由 Plex 管理。在 plex.tv 上编辑。', 'profiles.noPinSetEditOnPlex' => '未设置 PIN。如需要求 PIN,请在 plex.tv 上编辑 Home 用户。', 'profiles.setPin' => '设置 PIN', - 'profiles.connectionsLabel' => '连接', - 'profiles.add' => '添加', _ => null, } ?? switch (path) { + 'profiles.connectionsLabel' => '连接', + 'profiles.add' => '添加', 'profiles.deleteProfileButton' => '删除配置文件', 'profiles.noConnectionsHint' => '没有连接 — 添加一个以使用此配置文件。', 'profiles.plexHomeAccount' => 'Plex Home 账户', @@ -2774,10 +2778,10 @@ extension on TranslationsZh { 'metadataEdit.episodeOrdering' => '剧集排列顺序', 'metadataEdit.tmdbAiring' => 'The Movie Database(播出顺序)', 'metadataEdit.tvdbAiring' => 'TheTVDB(播出顺序)', - 'metadataEdit.tvdbAbsolute' => 'TheTVDB(绝对顺序)', - 'metadataEdit.metadataLanguage' => '元数据语言', _ => null, } ?? switch (path) { + 'metadataEdit.tvdbAbsolute' => 'TheTVDB(绝对顺序)', + 'metadataEdit.metadataLanguage' => '元数据语言', 'metadataEdit.useOriginalTitle' => '使用原始标题', 'metadataEdit.preferredAudioLanguage' => '首选音频语言', 'metadataEdit.preferredSubtitleLanguage' => '首选字幕语言', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index e07ae06d..fe6de38e 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} minuter", "rememberTrackSelections": "Kom ihåg spårval per serie/film", "rememberTrackSelectionsDescription": "Spara automatiskt ljud- och undertextspråkpreferenser när du ändrar spår under uppspelning", + "showChapterMarkersOnTimeline": "Visa kapitelmarkörer på tidslinjen", + "showChapterMarkersOnTimelineDescription": "Dela upp tidslinjen vid kapitelgränser", "clickVideoTogglesPlayback": "Klicka på videon för att växla mellan spela upp och pausa.", "clickVideoTogglesPlaybackDescription": "Om detta är aktiverat kommer ett klick på videospelaren att starta eller pausa videon. Annars visas eller döljs uppspelningskontrollerna när du klickar.", "videoPlayerControls": "Videospelar-kontroller", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index c509a369..e3301b67 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -150,6 +150,8 @@ "minutesUnit": "${minutes} 分钟", "rememberTrackSelections": "记住每个剧集/电影的音轨选择", "rememberTrackSelectionsDescription": "在播放过程中更改音轨时自动保存音频和字幕语言偏好", + "showChapterMarkersOnTimeline": "在进度条上显示章节标记", + "showChapterMarkersOnTimelineDescription": "按章节边界分段显示进度条", "clickVideoTogglesPlayback": "点击视频可切换播放/暂停", "clickVideoTogglesPlaybackDescription": "如果启用此选项,点击视频播放器将播放或暂停视频。否则,点击将显示或隐藏播放控件", "videoPlayerControls": "视频播放器控制", diff --git a/lib/screens/settings/playback_settings_screen.dart b/lib/screens/settings/playback_settings_screen.dart index 522ae835..71addc7b 100644 --- a/lib/screens/settings/playback_settings_screen.dart +++ b/lib/screens/settings/playback_settings_screen.dart @@ -146,6 +146,12 @@ class _PlaybackSettingsScreenState extends State { title: t.settings.rememberTrackSelections, subtitle: t.settings.rememberTrackSelectionsDescription, ), + SettingSwitchTile( + pref: SettingsService.showChapterMarkersOnTimeline, + icon: Symbols.bookmarks_rounded, + title: t.settings.showChapterMarkersOnTimeline, + subtitle: t.settings.showChapterMarkersOnTimelineDescription, + ), if (!isMobile) SettingSwitchTile( pref: SettingsService.clickVideoTogglesPlayback, diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 6d5ab70c..7fd01d21 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -287,6 +287,7 @@ class SettingsService extends BaseSharedPreferencesService { static const subtitleBold = BoolPref('subtitle_bold'); static const subtitleItalic = BoolPref('subtitle_italic'); static const rememberTrackSelections = BoolPref('remember_track_selections', defaultValue: true); + static const showChapterMarkersOnTimeline = BoolPref('show_chapter_markers_on_timeline', defaultValue: true); static const clickVideoTogglesPlayback = BoolPref('click_video_toggles_playback'); static const autoSkipIntro = BoolPref('auto_skip_intro'); static const autoSkipCredits = BoolPref('auto_skip_credits'); diff --git a/lib/widgets/video_controls/desktop_video_controls.dart b/lib/widgets/video_controls/desktop_video_controls.dart index 4ae1aaeb..26f65e67 100644 --- a/lib/widgets/video_controls/desktop_video_controls.dart +++ b/lib/widgets/video_controls/desktop_video_controls.dart @@ -36,6 +36,7 @@ class DesktopVideoControls extends StatefulWidget { final VoidCallback? onPrevious; final List chapters; final bool chaptersLoaded; + final bool showChapterMarkersOnTimeline; final int seekTimeSmall; final VoidCallback onSeekToPreviousChapter; final VoidCallback onSeekToNextChapter; @@ -107,6 +108,7 @@ class DesktopVideoControls extends StatefulWidget { this.onPrevious, required this.chapters, required this.chaptersLoaded, + this.showChapterMarkersOnTimeline = true, required this.seekTimeSmall, required this.onSeekToPreviousChapter, required this.onSeekToNextChapter, @@ -699,6 +701,7 @@ class DesktopVideoControlsState extends State { player: widget.player, chapters: widget.chapters, chaptersLoaded: widget.chaptersLoaded, + showChapterMarkersOnTimeline: widget.showChapterMarkersOnTimeline, onSeek: widget.onSeek, onSeekEnd: widget.onSeekEnd, horizontalLayout: true, diff --git a/lib/widgets/video_controls/mobile_video_controls.dart b/lib/widgets/video_controls/mobile_video_controls.dart index e023127f..5c464c9b 100644 --- a/lib/widgets/video_controls/mobile_video_controls.dart +++ b/lib/widgets/video_controls/mobile_video_controls.dart @@ -31,6 +31,7 @@ class MobileVideoControls extends StatefulWidget { final MediaItem metadata; final List chapters; final bool chaptersLoaded; + final bool showChapterMarkersOnTimeline; final int seekTimeSmall; final Widget trackChapterControls; final Function(Duration) onSeek; @@ -85,6 +86,7 @@ class MobileVideoControls extends StatefulWidget { required this.metadata, required this.chapters, required this.chaptersLoaded, + this.showChapterMarkersOnTimeline = true, required this.seekTimeSmall, required this.trackChapterControls, required this.onSeek, @@ -421,6 +423,7 @@ class _MobileVideoControlsState extends State with SingleTi player: widget.player, chapters: widget.chapters, chaptersLoaded: widget.chaptersLoaded, + showChapterMarkersOnTimeline: widget.showChapterMarkersOnTimeline, onSeek: widget.onSeek, onSeekEnd: widget.onSeekEnd, horizontalLayout: false, diff --git a/lib/widgets/video_controls/parts/navigation.dart b/lib/widgets/video_controls/parts/navigation.dart index e319ed9c..355db5e9 100644 --- a/lib/widgets/video_controls/parts/navigation.dart +++ b/lib/widgets/video_controls/parts/navigation.dart @@ -20,6 +20,7 @@ extension _PlexVideoControlsNavigationMethods on _PlexVideoControlsState { onPrevious: widget.onPrevious, chapters: _chapters, chaptersLoaded: _chaptersLoaded, + showChapterMarkersOnTimeline: _showChapterMarkersOnTimeline, seekTimeSmall: _seekTimeSmall, onSeekToPreviousChapter: _seekToPreviousChapter, onSeekToNextChapter: _seekToNextChapter, diff --git a/lib/widgets/video_controls/video_controls.dart b/lib/widgets/video_controls/video_controls.dart index 3d39a12a..02cff92f 100644 --- a/lib/widgets/video_controls/video_controls.dart +++ b/lib/widgets/video_controls/video_controls.dart @@ -361,6 +361,7 @@ class _PlexVideoControlsState extends State with WindowListen bool _showLockIcon = false; // Whether to show the lock overlay icon Timer? _lockIconTimer; bool get _clickVideoTogglesPlayback => _settings.read(SettingsService.clickVideoTogglesPlayback); + bool get _showChapterMarkersOnTimeline => _settings.read(SettingsService.showChapterMarkersOnTimeline); bool _isContentStripVisible = false; // Whether the swipe-up content strip is showing int _trafficLightVisibilityGeneration = 0; @@ -456,6 +457,7 @@ class _PlexVideoControlsState extends State with WindowListen SettingsService.showPerformanceOverlay, SettingsService.autoHidePerformanceOverlay, SettingsService.clickVideoTogglesPlayback, + SettingsService.showChapterMarkersOnTimeline, ]); _startHideTimer(); _initKeyboardService(); @@ -678,6 +680,7 @@ class _PlexVideoControlsState extends State with WindowListen metadata: widget.metadata, chapters: _chapters, chaptersLoaded: _chaptersLoaded, + showChapterMarkersOnTimeline: _showChapterMarkersOnTimeline, seekTimeSmall: _seekTimeSmall, trackChapterControls: _buildTrackChapterControlsWidget( hideChaptersAndQueue: hasStripContent, diff --git a/lib/widgets/video_controls/widgets/timeline_slider.dart b/lib/widgets/video_controls/widgets/timeline_slider.dart index 2efc07e7..f7a0d6c9 100644 --- a/lib/widgets/video_controls/widgets/timeline_slider.dart +++ b/lib/widgets/video_controls/widgets/timeline_slider.dart @@ -18,6 +18,7 @@ class TimelineSlider extends StatefulWidget { final List bufferRanges; final List chapters; final bool chaptersLoaded; + final bool showChapterMarkersOnTimeline; final ValueChanged onSeek; final ValueChanged onSeekEnd; @@ -50,6 +51,7 @@ class TimelineSlider extends StatefulWidget { this.bufferRanges = const [], required this.chapters, required this.chaptersLoaded, + this.showChapterMarkersOnTimeline = true, required this.onSeek, required this.onSeekEnd, this.focusNode, @@ -177,7 +179,9 @@ class _TimelineSliderState extends State { painter: BufferRangePainter( ranges: widget.bufferRanges, duration: widget.duration, - chapters: widget.chaptersLoaded ? widget.chapters : const [], + chapters: widget.chaptersLoaded && widget.showChapterMarkersOnTimeline + ? widget.chapters + : const [], ), ), ), diff --git a/lib/widgets/video_controls/widgets/video_timeline_bar.dart b/lib/widgets/video_controls/widgets/video_timeline_bar.dart index 2c1565c9..15bbf1a0 100644 --- a/lib/widgets/video_controls/widgets/video_timeline_bar.dart +++ b/lib/widgets/video_controls/widgets/video_timeline_bar.dart @@ -15,6 +15,7 @@ class VideoTimelineBar extends StatelessWidget { final Player player; final List chapters; final bool chaptersLoaded; + final bool showChapterMarkersOnTimeline; final ValueChanged onSeek; final ValueChanged onSeekEnd; @@ -49,6 +50,7 @@ class VideoTimelineBar extends StatelessWidget { required this.player, required this.chapters, required this.chaptersLoaded, + this.showChapterMarkersOnTimeline = true, required this.onSeek, required this.onSeekEnd, this.horizontalLayout = true, @@ -161,6 +163,7 @@ class VideoTimelineBar extends StatelessWidget { bufferRanges: bufferRanges, chapters: chapters, chaptersLoaded: chaptersLoaded, + showChapterMarkersOnTimeline: showChapterMarkersOnTimeline, onSeek: onSeek, onSeekEnd: onSeekEnd, focusNode: focusNode, diff --git a/test/widgets/video_controls_test.dart b/test/widgets/video_controls_test.dart index 33f9c18a..b0676ca5 100644 --- a/test/widgets/video_controls_test.dart +++ b/test/widgets/video_controls_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/media/media_source_info.dart'; import 'package:plezy/media/media_version.dart'; import 'package:plezy/widgets/video_controls/video_controls.dart'; +import 'package:plezy/widgets/video_controls/painters/buffer_range_painter.dart'; import 'package:plezy/widgets/video_controls/widgets/mobile_skip_zones.dart'; import 'package:plezy/widgets/video_controls/widgets/timeline_slider.dart'; @@ -111,5 +112,32 @@ void main() { expect(keyEvents, 1); expect(seekEvents, 0); }); + + testWidgets('does not pass chapters to painter when timeline markers are hidden', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SizedBox( + width: 400, + child: TimelineSlider( + position: const Duration(minutes: 1), + duration: const Duration(minutes: 10), + chapters: [MediaChapter(id: 1, startTimeOffset: 300000)], + chaptersLoaded: true, + showChapterMarkersOnTimeline: false, + onSeek: (_) {}, + onSeekEnd: (_) {}, + ), + ), + ), + ), + ); + + final customPaint = tester.widget( + find.byWidgetPredicate((widget) => widget is CustomPaint && widget.painter is BufferRangePainter), + ); + + expect((customPaint.painter! as BufferRangePainter).chapters, isEmpty); + }); }); }