From 94f2daa22e4d2ee84a629d69be867fd386bc716f Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Thu, 18 Jun 2026 11:15:26 +0200 Subject: [PATCH] feat: add episode action setting close #1351 --- lib/i18n/bg.i18n.json | 3 ++ lib/i18n/da.i18n.json | 3 ++ lib/i18n/de.i18n.json | 3 ++ lib/i18n/en.i18n.json | 3 ++ lib/i18n/es.i18n.json | 3 ++ lib/i18n/fr.i18n.json | 3 ++ lib/i18n/it.i18n.json | 3 ++ lib/i18n/ja.i18n.json | 3 ++ lib/i18n/ko.i18n.json | 3 ++ lib/i18n/nb.i18n.json | 3 ++ lib/i18n/nl.i18n.json | 3 ++ lib/i18n/pl.i18n.json | 3 ++ lib/i18n/pt.i18n.json | 3 ++ lib/i18n/ru.i18n.json | 3 ++ lib/i18n/strings.g.dart | 2 +- lib/i18n/strings_bg.g.dart | 14 ++++-- lib/i18n/strings_da.g.dart | 14 ++++-- lib/i18n/strings_de.g.dart | 14 ++++-- lib/i18n/strings_en.g.dart | 20 +++++++-- lib/i18n/strings_es.g.dart | 14 ++++-- lib/i18n/strings_fr.g.dart | 14 ++++-- lib/i18n/strings_it.g.dart | 14 ++++-- lib/i18n/strings_ja.g.dart | 14 ++++-- lib/i18n/strings_ko.g.dart | 14 ++++-- lib/i18n/strings_nb.g.dart | 14 ++++-- lib/i18n/strings_nl.g.dart | 14 ++++-- lib/i18n/strings_pl.g.dart | 14 ++++-- lib/i18n/strings_pt.g.dart | 14 ++++-- lib/i18n/strings_ru.g.dart | 14 ++++-- lib/i18n/strings_sv.g.dart | 14 ++++-- lib/i18n/strings_zh.g.dart | 14 ++++-- lib/i18n/sv.i18n.json | 3 ++ lib/i18n/zh.i18n.json | 3 ++ .../settings/appearance_settings_screen.dart | 13 ++++++ lib/services/settings_service.dart | 8 ++++ lib/utils/media_navigation_helper.dart | 34 ++++++++++----- test/services/settings_service_test.dart | 14 ++++++ test/utils/media_navigation_helper_test.dart | 43 +++++++++++++++++++ 38 files changed, 317 insertions(+), 75 deletions(-) diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index 1cf576cf..094cf0ea 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Действие за продължаване на гледането", "continueWatchingPlay": "Пусни", "continueWatchingDetails": "Отвори подробности", + "episodeAction": "Действие за епизод", + "episodePlay": "Пусни", + "episodeDetails": "Отвори подробности", "useGlobalHubs": "Използвай начално оформление", "useGlobalHubsDescription": "Показвай обединени начални хъбове. В противен случай използвай препоръките на библиотеката.", "showServerNameOnHubs": "Показвай името на сървъра в хъбовете", diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index eac7d4d8..63ad826c 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Handling for Fortsæt med at se", "continueWatchingPlay": "Afspil", "continueWatchingDetails": "Åbn detaljer", + "episodeAction": "Handling for afsnit", + "episodePlay": "Afspil", + "episodeDetails": "Åbn detaljer", "useGlobalHubs": "Brug startlayout", "useGlobalHubsDescription": "Vis samlet startsideindhold. Brug ellers biblioteksanbefalinger.", "showServerNameOnHubs": "Vis servernavn på hubbe", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 0f49129e..d182a8db 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Aktion für Weiterschauen", "continueWatchingPlay": "Abspielen", "continueWatchingDetails": "Details öffnen", + "episodeAction": "Episodenaktion", + "episodePlay": "Abspielen", + "episodeDetails": "Details öffnen", "useGlobalHubs": "Startlayout verwenden", "useGlobalHubsDescription": "Einheitliche Start-Hubs anzeigen. Sonst Bibliotheksempfehlungen verwenden.", "showServerNameOnHubs": "Servername bei Hubs anzeigen", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index e932c475..629dca14 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Continue Watching Action", "continueWatchingPlay": "Play", "continueWatchingDetails": "Open Details", + "episodeAction": "Episode Action", + "episodePlay": "Play", + "episodeDetails": "Open Details", "useGlobalHubs": "Use Home Layout", "useGlobalHubsDescription": "Show unified home hubs. Otherwise use library recommendations.", "showServerNameOnHubs": "Show Server Name on Hubs", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index ad0ae504..27bd4aa7 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Acción de Seguir viendo", "continueWatchingPlay": "Reproducir", "continueWatchingDetails": "Abrir detalles", + "episodeAction": "Acción de episodio", + "episodePlay": "Reproducir", + "episodeDetails": "Abrir detalles", "useGlobalHubs": "Usar diseño de inicio", "useGlobalHubsDescription": "Mostrar hubs de inicio unificados. Si no, usar recomendaciones de biblioteca.", "showServerNameOnHubs": "Mostrar Nombre del Servidor en los Hubs", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 82605563..cc025fa2 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Action Continuer à regarder", "continueWatchingPlay": "Lire", "continueWatchingDetails": "Ouvrir les détails", + "episodeAction": "Action des épisodes", + "episodePlay": "Lire", + "episodeDetails": "Ouvrir les détails", "useGlobalHubs": "Utiliser la mise en page d'accueil", "useGlobalHubsDescription": "Afficher des hubs d'accueil unifiés. Sinon, utiliser les recommandations de bibliothèque.", "showServerNameOnHubs": "Afficher le nom du serveur sur les hubs", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index d3a81ce4..bbe381e3 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Azione Continua a guardare", "continueWatchingPlay": "Riproduci", "continueWatchingDetails": "Apri dettagli", + "episodeAction": "Azione episodio", + "episodePlay": "Riproduci", + "episodeDetails": "Apri dettagli", "useGlobalHubs": "Usa layout home", "useGlobalHubsDescription": "Mostra hub Home unificati. Altrimenti usa i consigli della libreria.", "showServerNameOnHubs": "Mostra nome server sugli hub", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 4a17a0f2..578c754c 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "視聴中の操作", "continueWatchingPlay": "再生", "continueWatchingDetails": "詳細を開く", + "episodeAction": "エピソードの操作", + "episodePlay": "再生", + "episodeDetails": "詳細を開く", "useGlobalHubs": "ホームレイアウトを使用", "useGlobalHubsDescription": "統合ホームハブを表示します。オフの場合はライブラリのおすすめを使用します。", "showServerNameOnHubs": "ハブにサーバー名を表示", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index f5472a9c..ebd026b0 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "계속 보기 동작", "continueWatchingPlay": "재생", "continueWatchingDetails": "상세 정보 열기", + "episodeAction": "에피소드 동작", + "episodePlay": "재생", + "episodeDetails": "상세 정보 열기", "useGlobalHubs": "홈 레이아웃 사용", "useGlobalHubsDescription": "통합 홈 허브를 표시합니다. 끄면 라이브러리 추천을 사용합니다.", "showServerNameOnHubs": "허브에 서버 이름 표시", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 3e024d5b..f923b560 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Handling for Fortsett å se", "continueWatchingPlay": "Spill av", "continueWatchingDetails": "Åpne detaljer", + "episodeAction": "Handling for episoder", + "episodePlay": "Spill av", + "episodeDetails": "Åpne detaljer", "useGlobalHubs": "Bruk startoppsett", "useGlobalHubsDescription": "Vis samlet startinnhold. Ellers brukes bibliotekanbefalinger.", "showServerNameOnHubs": "Vis servernavn på huber", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 8619dbda..6f6255e4 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Actie voor Doorgaan met kijken", "continueWatchingPlay": "Afspelen", "continueWatchingDetails": "Details openen", + "episodeAction": "Afleveringsactie", + "episodePlay": "Afspelen", + "episodeDetails": "Details openen", "useGlobalHubs": "Startlayout gebruiken", "useGlobalHubsDescription": "Toon gecombineerde home-hubs. Anders bibliotheekaanbevelingen gebruiken.", "showServerNameOnHubs": "Servernaam tonen bij hubs", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index ecdaa9ed..d9ec853b 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Akcja Kontynuuj oglądanie", "continueWatchingPlay": "Odtwórz", "continueWatchingDetails": "Otwórz szczegóły", + "episodeAction": "Akcja odcinka", + "episodePlay": "Odtwórz", + "episodeDetails": "Otwórz szczegóły", "useGlobalHubs": "Użyj układu strony głównej", "useGlobalHubsDescription": "Pokaż ujednolicone huby ekranu głównego. W przeciwnym razie użyj rekomendacji bibliotek.", "showServerNameOnHubs": "Pokaż nazwę serwera w hubach", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index fba39390..a793c0b7 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Ação de Continuar Assistindo", "continueWatchingPlay": "Reproduzir", "continueWatchingDetails": "Abrir detalhes", + "episodeAction": "Ação de Episódio", + "episodePlay": "Reproduzir", + "episodeDetails": "Abrir detalhes", "useGlobalHubs": "Usar layout inicial", "useGlobalHubsDescription": "Mostrar hubs iniciais unificados. Caso contrário, usar recomendações da biblioteca.", "showServerNameOnHubs": "Mostrar Nome do Servidor nos Hubs", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 8e8f9316..03243fd1 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Действие для «Продолжить просмотр»", "continueWatchingPlay": "Воспроизвести", "continueWatchingDetails": "Открыть сведения", + "episodeAction": "Действие для эпизодов", + "episodePlay": "Воспроизвести", + "episodeDetails": "Открыть сведения", "useGlobalHubs": "Использовать макет главной", "useGlobalHubsDescription": "Показывать единые разделы главной. Иначе использовать рекомендации библиотек.", "showServerNameOnHubs": "Показывать имя сервера в хабах", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 5fa5c305..b23881de 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 16 -/// Strings: 20361 (1272 per locale) +/// Strings: 20409 (1275 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index fa7971b6..d55d297d 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Действие за продължаване на гледането'; @override String get continueWatchingPlay => 'Пусни'; @override String get continueWatchingDetails => 'Отвори подробности'; + @override String get episodeAction => 'Действие за епизод'; + @override String get episodePlay => 'Пусни'; + @override String get episodeDetails => 'Отвори подробности'; @override String get useGlobalHubs => 'Използвай начално оформление'; @override String get useGlobalHubsDescription => 'Показвай обединени начални хъбове. В противен случай използвай препоръките на библиотеката.'; @override String get showServerNameOnHubs => 'Показвай името на сървъра в хъбовете'; @@ -2029,6 +2032,9 @@ extension on TranslationsBg { 'settings.continueWatchingAction' => 'Действие за продължаване на гледането', 'settings.continueWatchingPlay' => 'Пусни', 'settings.continueWatchingDetails' => 'Отвори подробности', + 'settings.episodeAction' => 'Действие за епизод', + 'settings.episodePlay' => 'Пусни', + 'settings.episodeDetails' => 'Отвори подробности', 'settings.useGlobalHubs' => 'Използвай начално оформление', 'settings.useGlobalHubsDescription' => 'Показвай обединени начални хъбове. В противен случай използвай препоръките на библиотеката.', 'settings.showServerNameOnHubs' => 'Показвай името на сървъра в хъбовете', @@ -2430,11 +2436,11 @@ extension on TranslationsBg { 'messages.logsUploaded' => 'Логовете са качени', 'messages.logsUploadFailed' => 'Неуспешно качване на логовете', 'messages.logId' => 'ID на лога', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Текст', 'subtitlingStyling.border' => 'Рамка', 'subtitlingStyling.background' => 'Фон', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Размер на шрифта', 'subtitlingStyling.textColor' => 'Цвят на текста', 'subtitlingStyling.borderSize' => 'Размер на рамката', @@ -2944,11 +2950,11 @@ extension on TranslationsBg { 'companionRemote.remote.disconnectConfirm' => 'Искате ли да прекъснете връзката с дистанционната сесия?', 'companionRemote.remote.reconnecting' => 'Повторно свързване...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Опит ${current} от 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Опитай сега', 'companionRemote.remote.tabRemote' => 'Дистанционно', 'companionRemote.remote.tabPlay' => 'Пускане', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Още', 'companionRemote.remote.menu' => 'Меню', 'companionRemote.remote.tabNavigation' => 'Навигация с Tab', diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 9be5e956..767d1ca4 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Handling for Fortsæt med at se'; @override String get continueWatchingPlay => 'Afspil'; @override String get continueWatchingDetails => 'Åbn detaljer'; + @override String get episodeAction => 'Handling for afsnit'; + @override String get episodePlay => 'Afspil'; + @override String get episodeDetails => 'Åbn detaljer'; @override String get useGlobalHubs => 'Brug startlayout'; @override String get useGlobalHubsDescription => 'Vis samlet startsideindhold. Brug ellers biblioteksanbefalinger.'; @override String get showServerNameOnHubs => 'Vis servernavn på hubbe'; @@ -2029,6 +2032,9 @@ extension on TranslationsDa { 'settings.continueWatchingAction' => 'Handling for Fortsæt med at se', 'settings.continueWatchingPlay' => 'Afspil', 'settings.continueWatchingDetails' => 'Åbn detaljer', + 'settings.episodeAction' => 'Handling for afsnit', + 'settings.episodePlay' => 'Afspil', + 'settings.episodeDetails' => 'Åbn detaljer', 'settings.useGlobalHubs' => 'Brug startlayout', 'settings.useGlobalHubsDescription' => 'Vis samlet startsideindhold. Brug ellers biblioteksanbefalinger.', 'settings.showServerNameOnHubs' => 'Vis servernavn på hubbe', @@ -2430,11 +2436,11 @@ extension on TranslationsDa { 'messages.logsUploaded' => 'Logs uploadet', 'messages.logsUploadFailed' => 'Kunne ikke uploade logs', 'messages.logId' => 'Log-ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Kant', 'subtitlingStyling.background' => 'Baggrund', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Skriftstørrelse', 'subtitlingStyling.textColor' => 'Tekstfarve', 'subtitlingStyling.borderSize' => 'Kantstørrelse', @@ -2944,11 +2950,11 @@ extension on TranslationsDa { 'companionRemote.remote.disconnectConfirm' => 'Vil du afbryde fra fjernsessionen?', 'companionRemote.remote.reconnecting' => 'Genopretter forbindelse...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Forsøg ${current} af 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Prøv igen nu', 'companionRemote.remote.tabRemote' => 'Fjernbetjening', 'companionRemote.remote.tabPlay' => 'Afspil', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mere', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Fanenavigation', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index f79643d5..81cda90a 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Aktion für Weiterschauen'; @override String get continueWatchingPlay => 'Abspielen'; @override String get continueWatchingDetails => 'Details öffnen'; + @override String get episodeAction => 'Episodenaktion'; + @override String get episodePlay => 'Abspielen'; + @override String get episodeDetails => 'Details öffnen'; @override String get useGlobalHubs => 'Startlayout verwenden'; @override String get useGlobalHubsDescription => 'Einheitliche Start-Hubs anzeigen. Sonst Bibliotheksempfehlungen verwenden.'; @override String get showServerNameOnHubs => 'Servername bei Hubs anzeigen'; @@ -2029,6 +2032,9 @@ extension on TranslationsDe { 'settings.continueWatchingAction' => 'Aktion für Weiterschauen', 'settings.continueWatchingPlay' => 'Abspielen', 'settings.continueWatchingDetails' => 'Details öffnen', + 'settings.episodeAction' => 'Episodenaktion', + 'settings.episodePlay' => 'Abspielen', + 'settings.episodeDetails' => 'Details öffnen', 'settings.useGlobalHubs' => 'Startlayout verwenden', 'settings.useGlobalHubsDescription' => 'Einheitliche Start-Hubs anzeigen. Sonst Bibliotheksempfehlungen verwenden.', 'settings.showServerNameOnHubs' => 'Servername bei Hubs anzeigen', @@ -2430,11 +2436,11 @@ extension on TranslationsDe { 'messages.logsUploaded' => 'Protokolle hochgeladen', 'messages.logsUploadFailed' => 'Protokolle konnten nicht hochgeladen werden', 'messages.logId' => 'Protokoll-ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Text', 'subtitlingStyling.border' => 'Rahmen', 'subtitlingStyling.background' => 'Hintergrund', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Schriftgröße', 'subtitlingStyling.textColor' => 'Textfarbe', 'subtitlingStyling.borderSize' => 'Rahmengröße', @@ -2944,11 +2950,11 @@ extension on TranslationsDe { 'companionRemote.remote.disconnectConfirm' => 'Möchtest du die Verbindung zur Fernsteuerungssitzung trennen?', 'companionRemote.remote.reconnecting' => 'Verbindung wird wiederhergestellt...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Versuch ${current} von 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Jetzt wiederholen', 'companionRemote.remote.tabRemote' => 'Fernbedienung', 'companionRemote.remote.tabPlay' => 'Wiedergabe', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mehr', 'companionRemote.remote.menu' => 'Menü', 'companionRemote.remote.tabNavigation' => 'Tab-Navigation', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index bc1e87ae..e785b75b 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -465,6 +465,15 @@ class TranslationsSettingsEn { /// en: 'Open Details' String get continueWatchingDetails => 'Open Details'; + /// en: 'Episode Action' + String get episodeAction => 'Episode Action'; + + /// en: 'Play' + String get episodePlay => 'Play'; + + /// en: 'Open Details' + String get episodeDetails => 'Open Details'; + /// en: 'Use Home Layout' String get useGlobalHubs => 'Use Home Layout'; @@ -4606,6 +4615,9 @@ extension on Translations { 'settings.continueWatchingAction' => 'Continue Watching Action', 'settings.continueWatchingPlay' => 'Play', 'settings.continueWatchingDetails' => 'Open Details', + 'settings.episodeAction' => 'Episode Action', + 'settings.episodePlay' => 'Play', + 'settings.episodeDetails' => 'Open Details', 'settings.useGlobalHubs' => 'Use Home Layout', 'settings.useGlobalHubsDescription' => 'Show unified home hubs. Otherwise use library recommendations.', 'settings.showServerNameOnHubs' => 'Show Server Name on Hubs', @@ -5007,11 +5019,11 @@ extension on Translations { 'messages.noItemsAvailable' => 'No items available', 'messages.failedToCreatePlayQueueNoItems' => 'Failed to create play queue - no items', 'messages.failedPlayback' => ({required Object action, required Object error}) => 'Failed to ${action}: ${error}', + _ => null, + } ?? switch (path) { 'messages.switchingToCompatiblePlayer' => 'Switching to compatible player...', 'messages.serverLimitTitle' => 'Playback failed', 'messages.serverLimitBody' => 'Server error (HTTP 500). A bandwidth/transcoding limit likely rejected this session. Ask the owner to adjust it.', - _ => null, - } ?? switch (path) { 'messages.logsUploaded' => 'Logs uploaded', 'messages.logsUploadFailed' => 'Failed to upload logs', 'messages.logId' => 'Log ID', @@ -5521,11 +5533,11 @@ extension on Translations { 'companionRemote.pairing.availableDevices' => 'Available Devices', 'companionRemote.pairing.manualConnection' => 'Manual Connection', 'companionRemote.pairing.cryptoInitFailed' => 'Couldn\'t start secure connection. Sign in to Plex first.', + _ => null, + } ?? switch (path) { 'companionRemote.pairing.validationHostRequired' => 'Please enter host address', 'companionRemote.pairing.validationHostFormat' => 'Format must be IP:port (e.g., 192.168.1.100:48632)', 'companionRemote.pairing.connectionTimedOut' => 'Connection timed out. Use the same network on both devices.', - _ => null, - } ?? switch (path) { 'companionRemote.pairing.sessionNotFound' => 'Device not found. Make sure Plezy is running on the host.', 'companionRemote.pairing.authFailed' => 'Authentication failed. Both devices need the same Plex account.', 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Failed to connect: ${error}', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index fd40caf9..540cf4b3 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Acción de Seguir viendo'; @override String get continueWatchingPlay => 'Reproducir'; @override String get continueWatchingDetails => 'Abrir detalles'; + @override String get episodeAction => 'Acción de episodio'; + @override String get episodePlay => 'Reproducir'; + @override String get episodeDetails => 'Abrir detalles'; @override String get useGlobalHubs => 'Usar diseño de inicio'; @override String get useGlobalHubsDescription => 'Mostrar hubs de inicio unificados. Si no, usar recomendaciones de biblioteca.'; @override String get showServerNameOnHubs => 'Mostrar Nombre del Servidor en los Hubs'; @@ -2029,6 +2032,9 @@ extension on TranslationsEs { 'settings.continueWatchingAction' => 'Acción de Seguir viendo', 'settings.continueWatchingPlay' => 'Reproducir', 'settings.continueWatchingDetails' => 'Abrir detalles', + 'settings.episodeAction' => 'Acción de episodio', + 'settings.episodePlay' => 'Reproducir', + 'settings.episodeDetails' => 'Abrir detalles', 'settings.useGlobalHubs' => 'Usar diseño de inicio', 'settings.useGlobalHubsDescription' => 'Mostrar hubs de inicio unificados. Si no, usar recomendaciones de biblioteca.', 'settings.showServerNameOnHubs' => 'Mostrar Nombre del Servidor en los Hubs', @@ -2430,11 +2436,11 @@ extension on TranslationsEs { 'messages.logsUploaded' => 'Registros subidos', 'messages.logsUploadFailed' => 'Error al subir registros', 'messages.logId' => 'ID de registro', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Texto', 'subtitlingStyling.border' => 'Borde', 'subtitlingStyling.background' => 'Fondo', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Tamaño de Fuente', 'subtitlingStyling.textColor' => 'Color de Texto', 'subtitlingStyling.borderSize' => 'Tamaño de Borde', @@ -2944,11 +2950,11 @@ extension on TranslationsEs { 'companionRemote.remote.disconnectConfirm' => '¿Quieres desconectarte de la sesión remota?', 'companionRemote.remote.reconnecting' => 'Reconectando...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Intento ${current} de 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Reintentar ahora', 'companionRemote.remote.tabRemote' => 'Remoto', 'companionRemote.remote.tabPlay' => 'Reproducir', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Más', 'companionRemote.remote.menu' => 'Menú', 'companionRemote.remote.tabNavigation' => 'Navegación por pestañas', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index dc026b26..a1414842 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Action Continuer à regarder'; @override String get continueWatchingPlay => 'Lire'; @override String get continueWatchingDetails => 'Ouvrir les détails'; + @override String get episodeAction => 'Action des épisodes'; + @override String get episodePlay => 'Lire'; + @override String get episodeDetails => 'Ouvrir les détails'; @override String get useGlobalHubs => 'Utiliser la mise en page d\'accueil'; @override String get useGlobalHubsDescription => 'Afficher des hubs d\'accueil unifiés. Sinon, utiliser les recommandations de bibliothèque.'; @override String get showServerNameOnHubs => 'Afficher le nom du serveur sur les hubs'; @@ -2029,6 +2032,9 @@ extension on TranslationsFr { 'settings.continueWatchingAction' => 'Action Continuer à regarder', 'settings.continueWatchingPlay' => 'Lire', 'settings.continueWatchingDetails' => 'Ouvrir les détails', + 'settings.episodeAction' => 'Action des épisodes', + 'settings.episodePlay' => 'Lire', + 'settings.episodeDetails' => 'Ouvrir les détails', 'settings.useGlobalHubs' => 'Utiliser la mise en page d\'accueil', 'settings.useGlobalHubsDescription' => 'Afficher des hubs d\'accueil unifiés. Sinon, utiliser les recommandations de bibliothèque.', 'settings.showServerNameOnHubs' => 'Afficher le nom du serveur sur les hubs', @@ -2430,11 +2436,11 @@ extension on TranslationsFr { 'messages.logsUploaded' => 'Logs envoyés', 'messages.logsUploadFailed' => 'Échec de l\'envoi des logs', 'messages.logId' => 'ID du log', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Texte', 'subtitlingStyling.border' => 'Bordure', 'subtitlingStyling.background' => 'Arrière-plan', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Taille de la police', 'subtitlingStyling.textColor' => 'Couleur du texte', 'subtitlingStyling.borderSize' => 'Taille de la bordure', @@ -2944,11 +2950,11 @@ extension on TranslationsFr { 'companionRemote.remote.disconnectConfirm' => 'Voulez-vous vous déconnecter de la session distante ?', 'companionRemote.remote.reconnecting' => 'Reconnexion...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentative ${current} sur 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Réessayer maintenant', 'companionRemote.remote.tabRemote' => 'Télécommande', 'companionRemote.remote.tabPlay' => 'Lecture', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Plus', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Navigation par onglets', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index b8de7a55..392d6544 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Azione Continua a guardare'; @override String get continueWatchingPlay => 'Riproduci'; @override String get continueWatchingDetails => 'Apri dettagli'; + @override String get episodeAction => 'Azione episodio'; + @override String get episodePlay => 'Riproduci'; + @override String get episodeDetails => 'Apri dettagli'; @override String get useGlobalHubs => 'Usa layout home'; @override String get useGlobalHubsDescription => 'Mostra hub Home unificati. Altrimenti usa i consigli della libreria.'; @override String get showServerNameOnHubs => 'Mostra nome server sugli hub'; @@ -2029,6 +2032,9 @@ extension on TranslationsIt { 'settings.continueWatchingAction' => 'Azione Continua a guardare', 'settings.continueWatchingPlay' => 'Riproduci', 'settings.continueWatchingDetails' => 'Apri dettagli', + 'settings.episodeAction' => 'Azione episodio', + 'settings.episodePlay' => 'Riproduci', + 'settings.episodeDetails' => 'Apri dettagli', 'settings.useGlobalHubs' => 'Usa layout home', 'settings.useGlobalHubsDescription' => 'Mostra hub Home unificati. Altrimenti usa i consigli della libreria.', 'settings.showServerNameOnHubs' => 'Mostra nome server sugli hub', @@ -2430,11 +2436,11 @@ extension on TranslationsIt { 'messages.logsUploaded' => 'Log caricati', 'messages.logsUploadFailed' => 'Caricamento log fallito', 'messages.logId' => 'ID log', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Testo', 'subtitlingStyling.border' => 'Bordo', 'subtitlingStyling.background' => 'Sfondo', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Dimensione', 'subtitlingStyling.textColor' => 'Colore testo', 'subtitlingStyling.borderSize' => 'Dimensione bordo', @@ -2944,11 +2950,11 @@ extension on TranslationsIt { 'companionRemote.remote.disconnectConfirm' => 'Vuoi disconnetterti dalla sessione remota?', 'companionRemote.remote.reconnecting' => 'Riconnessione...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentativo ${current} di 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Riprova ora', 'companionRemote.remote.tabRemote' => 'Telecomando', 'companionRemote.remote.tabPlay' => 'Riproduci', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Altro', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Navigazione schede', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 2018d73d..b9d1c793 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String get continueWatchingAction => '視聴中の操作'; @override String get continueWatchingPlay => '再生'; @override String get continueWatchingDetails => '詳細を開く'; + @override String get episodeAction => 'エピソードの操作'; + @override String get episodePlay => '再生'; + @override String get episodeDetails => '詳細を開く'; @override String get useGlobalHubs => 'ホームレイアウトを使用'; @override String get useGlobalHubsDescription => '統合ホームハブを表示します。オフの場合はライブラリのおすすめを使用します。'; @override String get showServerNameOnHubs => 'ハブにサーバー名を表示'; @@ -2029,6 +2032,9 @@ extension on TranslationsJa { 'settings.continueWatchingAction' => '視聴中の操作', 'settings.continueWatchingPlay' => '再生', 'settings.continueWatchingDetails' => '詳細を開く', + 'settings.episodeAction' => 'エピソードの操作', + 'settings.episodePlay' => '再生', + 'settings.episodeDetails' => '詳細を開く', 'settings.useGlobalHubs' => 'ホームレイアウトを使用', 'settings.useGlobalHubsDescription' => '統合ホームハブを表示します。オフの場合はライブラリのおすすめを使用します。', 'settings.showServerNameOnHubs' => 'ハブにサーバー名を表示', @@ -2430,11 +2436,11 @@ extension on TranslationsJa { 'messages.logsUploaded' => 'ログをアップロードしました', 'messages.logsUploadFailed' => 'ログのアップロードに失敗しました', 'messages.logId' => 'ログID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'テキスト', 'subtitlingStyling.border' => '枠線', 'subtitlingStyling.background' => '背景', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'フォントサイズ', 'subtitlingStyling.textColor' => 'テキストの色', 'subtitlingStyling.borderSize' => '枠線サイズ', @@ -2944,11 +2950,11 @@ extension on TranslationsJa { 'companionRemote.remote.disconnectConfirm' => 'リモートセッションから切断しますか?', 'companionRemote.remote.reconnecting' => '再接続中...', 'companionRemote.remote.attemptOf' => ({required Object current}) => '試行 ${current}/5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => '今すぐ再試行', 'companionRemote.remote.tabRemote' => 'リモート', 'companionRemote.remote.tabPlay' => '再生', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'その他', 'companionRemote.remote.menu' => 'メニュー', 'companionRemote.remote.tabNavigation' => 'タブナビゲーション', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 763c1637..b2f23748 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String get continueWatchingAction => '계속 보기 동작'; @override String get continueWatchingPlay => '재생'; @override String get continueWatchingDetails => '상세 정보 열기'; + @override String get episodeAction => '에피소드 동작'; + @override String get episodePlay => '재생'; + @override String get episodeDetails => '상세 정보 열기'; @override String get useGlobalHubs => '홈 레이아웃 사용'; @override String get useGlobalHubsDescription => '통합 홈 허브를 표시합니다. 끄면 라이브러리 추천을 사용합니다.'; @override String get showServerNameOnHubs => '허브에 서버 이름 표시'; @@ -2029,6 +2032,9 @@ extension on TranslationsKo { 'settings.continueWatchingAction' => '계속 보기 동작', 'settings.continueWatchingPlay' => '재생', 'settings.continueWatchingDetails' => '상세 정보 열기', + 'settings.episodeAction' => '에피소드 동작', + 'settings.episodePlay' => '재생', + 'settings.episodeDetails' => '상세 정보 열기', 'settings.useGlobalHubs' => '홈 레이아웃 사용', 'settings.useGlobalHubsDescription' => '통합 홈 허브를 표시합니다. 끄면 라이브러리 추천을 사용합니다.', 'settings.showServerNameOnHubs' => '허브에 서버 이름 표시', @@ -2430,11 +2436,11 @@ extension on TranslationsKo { 'messages.logsUploaded' => '로그 업로드 완료', 'messages.logsUploadFailed' => '로그 업로드 실패', 'messages.logId' => '로그 ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => '텍스트', 'subtitlingStyling.border' => '테두리', 'subtitlingStyling.background' => '배경', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => '글자 크기', 'subtitlingStyling.textColor' => '텍스트 색상', 'subtitlingStyling.borderSize' => '테두리 크기', @@ -2944,11 +2950,11 @@ extension on TranslationsKo { 'companionRemote.remote.disconnectConfirm' => '원격 세션 연결을 해제하시겠습니까?', 'companionRemote.remote.reconnecting' => '재연결 중...', 'companionRemote.remote.attemptOf' => ({required Object current}) => '${current}/5 시도 중', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => '지금 재시도', 'companionRemote.remote.tabRemote' => '리모컨', 'companionRemote.remote.tabPlay' => '재생', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => '더 보기', 'companionRemote.remote.menu' => '메뉴', 'companionRemote.remote.tabNavigation' => '탭 탐색', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 5a3721cb..c57907b3 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Handling for Fortsett å se'; @override String get continueWatchingPlay => 'Spill av'; @override String get continueWatchingDetails => 'Åpne detaljer'; + @override String get episodeAction => 'Handling for episoder'; + @override String get episodePlay => 'Spill av'; + @override String get episodeDetails => 'Åpne detaljer'; @override String get useGlobalHubs => 'Bruk startoppsett'; @override String get useGlobalHubsDescription => 'Vis samlet startinnhold. Ellers brukes bibliotekanbefalinger.'; @override String get showServerNameOnHubs => 'Vis servernavn på huber'; @@ -2029,6 +2032,9 @@ extension on TranslationsNb { 'settings.continueWatchingAction' => 'Handling for Fortsett å se', 'settings.continueWatchingPlay' => 'Spill av', 'settings.continueWatchingDetails' => 'Åpne detaljer', + 'settings.episodeAction' => 'Handling for episoder', + 'settings.episodePlay' => 'Spill av', + 'settings.episodeDetails' => 'Åpne detaljer', 'settings.useGlobalHubs' => 'Bruk startoppsett', 'settings.useGlobalHubsDescription' => 'Vis samlet startinnhold. Ellers brukes bibliotekanbefalinger.', 'settings.showServerNameOnHubs' => 'Vis servernavn på huber', @@ -2430,11 +2436,11 @@ extension on TranslationsNb { 'messages.logsUploaded' => 'Logger lastet opp', 'messages.logsUploadFailed' => 'Kunne ikke laste opp logger', 'messages.logId' => 'Logg-ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Kantlinje', 'subtitlingStyling.background' => 'Bakgrunn', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Skriftstørrelse', 'subtitlingStyling.textColor' => 'Tekstfarge', 'subtitlingStyling.borderSize' => 'Kantstørrelse', @@ -2944,11 +2950,11 @@ extension on TranslationsNb { 'companionRemote.remote.disconnectConfirm' => 'Vil du koble fra fjernøkten?', 'companionRemote.remote.reconnecting' => 'Kobler til på nytt...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Forsøk ${current} av 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Prøv nå', 'companionRemote.remote.tabRemote' => 'Fjernkontroll', 'companionRemote.remote.tabPlay' => 'Spill av', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mer', 'companionRemote.remote.menu' => 'Meny', 'companionRemote.remote.tabNavigation' => 'Fanenavigering', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 7de73c43..c8736a5a 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Actie voor Doorgaan met kijken'; @override String get continueWatchingPlay => 'Afspelen'; @override String get continueWatchingDetails => 'Details openen'; + @override String get episodeAction => 'Afleveringsactie'; + @override String get episodePlay => 'Afspelen'; + @override String get episodeDetails => 'Details openen'; @override String get useGlobalHubs => 'Startlayout gebruiken'; @override String get useGlobalHubsDescription => 'Toon gecombineerde home-hubs. Anders bibliotheekaanbevelingen gebruiken.'; @override String get showServerNameOnHubs => 'Servernaam tonen bij hubs'; @@ -2029,6 +2032,9 @@ extension on TranslationsNl { 'settings.continueWatchingAction' => 'Actie voor Doorgaan met kijken', 'settings.continueWatchingPlay' => 'Afspelen', 'settings.continueWatchingDetails' => 'Details openen', + 'settings.episodeAction' => 'Afleveringsactie', + 'settings.episodePlay' => 'Afspelen', + 'settings.episodeDetails' => 'Details openen', 'settings.useGlobalHubs' => 'Startlayout gebruiken', 'settings.useGlobalHubsDescription' => 'Toon gecombineerde home-hubs. Anders bibliotheekaanbevelingen gebruiken.', 'settings.showServerNameOnHubs' => 'Servernaam tonen bij hubs', @@ -2430,11 +2436,11 @@ extension on TranslationsNl { 'messages.logsUploaded' => 'Logs geüpload', 'messages.logsUploadFailed' => 'Uploaden van logs mislukt', 'messages.logId' => 'Log-ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Rand', 'subtitlingStyling.background' => 'Achtergrond', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Lettergrootte', 'subtitlingStyling.textColor' => 'Tekstkleur', 'subtitlingStyling.borderSize' => 'Rand grootte', @@ -2944,11 +2950,11 @@ extension on TranslationsNl { 'companionRemote.remote.disconnectConfirm' => 'Wil je de verbinding met de externe sessie verbreken?', 'companionRemote.remote.reconnecting' => 'Opnieuw verbinden...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Poging ${current} van 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Nu opnieuw proberen', 'companionRemote.remote.tabRemote' => 'Afstandsbediening', 'companionRemote.remote.tabPlay' => 'Afspelen', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Meer', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Tabnavigatie', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 338a24ac..094cf224 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Akcja Kontynuuj oglądanie'; @override String get continueWatchingPlay => 'Odtwórz'; @override String get continueWatchingDetails => 'Otwórz szczegóły'; + @override String get episodeAction => 'Akcja odcinka'; + @override String get episodePlay => 'Odtwórz'; + @override String get episodeDetails => 'Otwórz szczegóły'; @override String get useGlobalHubs => 'Użyj układu strony głównej'; @override String get useGlobalHubsDescription => 'Pokaż ujednolicone huby ekranu głównego. W przeciwnym razie użyj rekomendacji bibliotek.'; @override String get showServerNameOnHubs => 'Pokaż nazwę serwera w hubach'; @@ -2029,6 +2032,9 @@ extension on TranslationsPl { 'settings.continueWatchingAction' => 'Akcja Kontynuuj oglądanie', 'settings.continueWatchingPlay' => 'Odtwórz', 'settings.continueWatchingDetails' => 'Otwórz szczegóły', + 'settings.episodeAction' => 'Akcja odcinka', + 'settings.episodePlay' => 'Odtwórz', + 'settings.episodeDetails' => 'Otwórz szczegóły', 'settings.useGlobalHubs' => 'Użyj układu strony głównej', 'settings.useGlobalHubsDescription' => 'Pokaż ujednolicone huby ekranu głównego. W przeciwnym razie użyj rekomendacji bibliotek.', 'settings.showServerNameOnHubs' => 'Pokaż nazwę serwera w hubach', @@ -2430,11 +2436,11 @@ extension on TranslationsPl { 'messages.logsUploaded' => 'Logi przesłane', 'messages.logsUploadFailed' => 'Nie udało się przesłać logów', 'messages.logId' => 'ID logu', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Tekst', 'subtitlingStyling.border' => 'Obramowanie', 'subtitlingStyling.background' => 'Tło', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Rozmiar czcionki', 'subtitlingStyling.textColor' => 'Kolor tekstu', 'subtitlingStyling.borderSize' => 'Rozmiar obramowania', @@ -2944,11 +2950,11 @@ extension on TranslationsPl { 'companionRemote.remote.disconnectConfirm' => 'Czy chcesz się rozłączyć od sesji zdalnej?', 'companionRemote.remote.reconnecting' => 'Ponowne łączenie...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Próba ${current} z 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Ponów teraz', 'companionRemote.remote.tabRemote' => 'Pilot', 'companionRemote.remote.tabPlay' => 'Odtwórz', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Więcej', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Nawigacja', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 07683f88..42a85cca 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Ação de Continuar Assistindo'; @override String get continueWatchingPlay => 'Reproduzir'; @override String get continueWatchingDetails => 'Abrir detalhes'; + @override String get episodeAction => 'Ação de Episódio'; + @override String get episodePlay => 'Reproduzir'; + @override String get episodeDetails => 'Abrir detalhes'; @override String get useGlobalHubs => 'Usar layout inicial'; @override String get useGlobalHubsDescription => 'Mostrar hubs iniciais unificados. Caso contrário, usar recomendações da biblioteca.'; @override String get showServerNameOnHubs => 'Mostrar Nome do Servidor nos Hubs'; @@ -2029,6 +2032,9 @@ extension on TranslationsPt { 'settings.continueWatchingAction' => 'Ação de Continuar Assistindo', 'settings.continueWatchingPlay' => 'Reproduzir', 'settings.continueWatchingDetails' => 'Abrir detalhes', + 'settings.episodeAction' => 'Ação de Episódio', + 'settings.episodePlay' => 'Reproduzir', + 'settings.episodeDetails' => 'Abrir detalhes', 'settings.useGlobalHubs' => 'Usar layout inicial', 'settings.useGlobalHubsDescription' => 'Mostrar hubs iniciais unificados. Caso contrário, usar recomendações da biblioteca.', 'settings.showServerNameOnHubs' => 'Mostrar Nome do Servidor nos Hubs', @@ -2430,11 +2436,11 @@ extension on TranslationsPt { 'messages.logsUploaded' => 'Logs enviados', 'messages.logsUploadFailed' => 'Falha ao enviar logs', 'messages.logId' => 'ID do Log', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Texto', 'subtitlingStyling.border' => 'Borda', 'subtitlingStyling.background' => 'Fundo', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Tamanho da Fonte', 'subtitlingStyling.textColor' => 'Cor do Texto', 'subtitlingStyling.borderSize' => 'Tamanho da Borda', @@ -2944,11 +2950,11 @@ extension on TranslationsPt { 'companionRemote.remote.disconnectConfirm' => 'Deseja desconectar da sessão remota?', 'companionRemote.remote.reconnecting' => 'Reconectando...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Tentativa ${current} de 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Tentar Agora', 'companionRemote.remote.tabRemote' => 'Remoto', 'companionRemote.remote.tabPlay' => 'Reproduzir', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mais', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Navegação', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index f25f3461..dd4523b7 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Действие для «Продолжить просмотр»'; @override String get continueWatchingPlay => 'Воспроизвести'; @override String get continueWatchingDetails => 'Открыть сведения'; + @override String get episodeAction => 'Действие для эпизодов'; + @override String get episodePlay => 'Воспроизвести'; + @override String get episodeDetails => 'Открыть сведения'; @override String get useGlobalHubs => 'Использовать макет главной'; @override String get useGlobalHubsDescription => 'Показывать единые разделы главной. Иначе использовать рекомендации библиотек.'; @override String get showServerNameOnHubs => 'Показывать имя сервера в хабах'; @@ -2029,6 +2032,9 @@ extension on TranslationsRu { 'settings.continueWatchingAction' => 'Действие для «Продолжить просмотр»', 'settings.continueWatchingPlay' => 'Воспроизвести', 'settings.continueWatchingDetails' => 'Открыть сведения', + 'settings.episodeAction' => 'Действие для эпизодов', + 'settings.episodePlay' => 'Воспроизвести', + 'settings.episodeDetails' => 'Открыть сведения', 'settings.useGlobalHubs' => 'Использовать макет главной', 'settings.useGlobalHubsDescription' => 'Показывать единые разделы главной. Иначе использовать рекомендации библиотек.', 'settings.showServerNameOnHubs' => 'Показывать имя сервера в хабах', @@ -2430,11 +2436,11 @@ extension on TranslationsRu { 'messages.logsUploaded' => 'Логи загружены', 'messages.logsUploadFailed' => 'Не удалось загрузить логи', 'messages.logId' => 'ID лога', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Текст', 'subtitlingStyling.border' => 'Обводка', 'subtitlingStyling.background' => 'Фон', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Размер шрифта', 'subtitlingStyling.textColor' => 'Цвет текста', 'subtitlingStyling.borderSize' => 'Размер обводки', @@ -2944,11 +2950,11 @@ extension on TranslationsRu { 'companionRemote.remote.disconnectConfirm' => 'Отключиться от удалённой сессии?', 'companionRemote.remote.reconnecting' => 'Переподключение...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Попытка ${current} из 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Повторить сейчас', 'companionRemote.remote.tabRemote' => 'Пульт', 'companionRemote.remote.tabPlay' => 'Воспроизведение', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Ещё', 'companionRemote.remote.menu' => 'Меню', 'companionRemote.remote.tabNavigation' => 'Навигация', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 3f2539b2..4b8a682a 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String get continueWatchingAction => 'Åtgärd för Fortsätt titta'; @override String get continueWatchingPlay => 'Spela'; @override String get continueWatchingDetails => 'Öppna detaljer'; + @override String get episodeAction => 'Åtgärd för avsnitt'; + @override String get episodePlay => 'Spela'; + @override String get episodeDetails => 'Öppna detaljer'; @override String get useGlobalHubs => 'Använd startlayout'; @override String get useGlobalHubsDescription => 'Visa enhetliga startsideshubbar. Annars används biblioteksrekommendationer.'; @override String get showServerNameOnHubs => 'Visa servernamn på hubbar'; @@ -2029,6 +2032,9 @@ extension on TranslationsSv { 'settings.continueWatchingAction' => 'Åtgärd för Fortsätt titta', 'settings.continueWatchingPlay' => 'Spela', 'settings.continueWatchingDetails' => 'Öppna detaljer', + 'settings.episodeAction' => 'Åtgärd för avsnitt', + 'settings.episodePlay' => 'Spela', + 'settings.episodeDetails' => 'Öppna detaljer', 'settings.useGlobalHubs' => 'Använd startlayout', 'settings.useGlobalHubsDescription' => 'Visa enhetliga startsideshubbar. Annars används biblioteksrekommendationer.', 'settings.showServerNameOnHubs' => 'Visa servernamn på hubbar', @@ -2430,11 +2436,11 @@ extension on TranslationsSv { 'messages.logsUploaded' => 'Loggar uppladdade', 'messages.logsUploadFailed' => 'Uppladdning av loggar misslyckades', 'messages.logId' => 'Logg-ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => 'Text', 'subtitlingStyling.border' => 'Kantlinje', 'subtitlingStyling.background' => 'Bakgrund', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => 'Teckenstorlek', 'subtitlingStyling.textColor' => 'Textfärg', 'subtitlingStyling.borderSize' => 'Kantstorlek', @@ -2944,11 +2950,11 @@ extension on TranslationsSv { 'companionRemote.remote.disconnectConfirm' => 'Vill du koppla från fjärrsessionen?', 'companionRemote.remote.reconnecting' => 'Återansluter...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Försök ${current} av 5', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => 'Försök nu', 'companionRemote.remote.tabRemote' => 'Fjärrkontroll', 'companionRemote.remote.tabPlay' => 'Spela', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mer', 'companionRemote.remote.menu' => 'Meny', 'companionRemote.remote.tabNavigation' => 'Fliknavigering', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 8f04845f..f1185de1 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -247,6 +247,9 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String get continueWatchingAction => '继续观看操作'; @override String get continueWatchingPlay => '播放'; @override String get continueWatchingDetails => '打开详情'; + @override String get episodeAction => '剧集操作'; + @override String get episodePlay => '播放'; + @override String get episodeDetails => '打开详情'; @override String get useGlobalHubs => '使用主页布局'; @override String get useGlobalHubsDescription => '显示统一主页中心。否则使用资料库推荐。'; @override String get showServerNameOnHubs => '在推荐栏显示服务器名称'; @@ -2029,6 +2032,9 @@ extension on TranslationsZh { 'settings.continueWatchingAction' => '继续观看操作', 'settings.continueWatchingPlay' => '播放', 'settings.continueWatchingDetails' => '打开详情', + 'settings.episodeAction' => '剧集操作', + 'settings.episodePlay' => '播放', + 'settings.episodeDetails' => '打开详情', 'settings.useGlobalHubs' => '使用主页布局', 'settings.useGlobalHubsDescription' => '显示统一主页中心。否则使用资料库推荐。', 'settings.showServerNameOnHubs' => '在推荐栏显示服务器名称', @@ -2430,11 +2436,11 @@ extension on TranslationsZh { 'messages.logsUploaded' => '日志已上传', 'messages.logsUploadFailed' => '上传日志失败', 'messages.logId' => '日志 ID', + _ => null, + } ?? switch (path) { 'subtitlingStyling.text' => '文本', 'subtitlingStyling.border' => '边框', 'subtitlingStyling.background' => '背景', - _ => null, - } ?? switch (path) { 'subtitlingStyling.fontSize' => '字号', 'subtitlingStyling.textColor' => '文本颜色', 'subtitlingStyling.borderSize' => '边框大小', @@ -2944,11 +2950,11 @@ extension on TranslationsZh { 'companionRemote.remote.disconnectConfirm' => '是否要断开远程会话的连接?', 'companionRemote.remote.reconnecting' => '重新连接中...', 'companionRemote.remote.attemptOf' => ({required Object current}) => '第 ${current} 次尝试,共 5 次', + _ => null, + } ?? switch (path) { 'companionRemote.remote.retryNow' => '立即重试', 'companionRemote.remote.tabRemote' => '遥控', 'companionRemote.remote.tabPlay' => '播放', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabMore' => '更多', 'companionRemote.remote.menu' => '菜单', 'companionRemote.remote.tabNavigation' => '标签导航', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 918a688c..76352341 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "Åtgärd för Fortsätt titta", "continueWatchingPlay": "Spela", "continueWatchingDetails": "Öppna detaljer", + "episodeAction": "Åtgärd för avsnitt", + "episodePlay": "Spela", + "episodeDetails": "Öppna detaljer", "useGlobalHubs": "Använd startlayout", "useGlobalHubsDescription": "Visa enhetliga startsideshubbar. Annars används biblioteksrekommendationer.", "showServerNameOnHubs": "Visa servernamn på hubbar", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 87be9a1c..1ce0d177 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -118,6 +118,9 @@ "continueWatchingAction": "继续观看操作", "continueWatchingPlay": "播放", "continueWatchingDetails": "打开详情", + "episodeAction": "剧集操作", + "episodePlay": "播放", + "episodeDetails": "打开详情", "useGlobalHubs": "使用主页布局", "useGlobalHubsDescription": "显示统一主页中心。否则使用资料库推荐。", "showServerNameOnHubs": "在推荐栏显示服务器名称", diff --git a/lib/screens/settings/appearance_settings_screen.dart b/lib/screens/settings/appearance_settings_screen.dart index 9b5a4aff..298c3b45 100644 --- a/lib/screens/settings/appearance_settings_screen.dart +++ b/lib/screens/settings/appearance_settings_screen.dart @@ -157,6 +157,7 @@ class AppearanceSettingsScreen extends StatelessWidget { title: t.settings.hideSpoilers, subtitle: t.settings.hideSpoilersDescription, ), + _episodeActionSelector(), _requireProfileSelection(), SettingSwitchTile( pref: SettingsService.autoHidePerformanceOverlay, @@ -278,6 +279,18 @@ class AppearanceSettingsScreen extends StatelessWidget { encode: (v) => v, ); + Widget _episodeActionSelector() => SettingSegmentedTile( + pref: SettingsService.episodeAction, + icon: Symbols.tv_rounded, + title: t.settings.episodeAction, + segments: [ + ButtonSegment(value: EpisodeAction.play, label: Text(t.settings.episodePlay)), + ButtonSegment(value: EpisodeAction.details, label: Text(t.settings.episodeDetails)), + ], + decode: (v) => v, + encode: (v) => v, + ); + // Sections offered as a startup destination, in display order. Live TV is // always listed; if no server provides it, startup falls back to Home. static const _startupSectionOptions = [ diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index e8dc4dde..3bdb55b5 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -38,6 +38,8 @@ enum EpisodePosterMode { seriesPoster, seasonPoster, episodeThumbnail } enum ContinueWatchingAction { play, details } +enum EpisodeAction { play, details } + enum SubAssOverride { no, yes, scale, force, strip } /// Resolution ASS/image subtitles are rasterized at on the avfoundation VO @@ -458,6 +460,11 @@ class SettingsService extends BaseSharedPreferencesService { values: ContinueWatchingAction.values, defaultValue: ContinueWatchingAction.play, ); + static const episodeAction = EnumPref( + 'episode_action', + values: EpisodeAction.values, + defaultValue: EpisodeAction.play, + ); static const mpvConfigText = _MpvConfigTextPref(); static final keyboardShortcuts = JsonPref>( @@ -755,6 +762,7 @@ class SettingsService extends BaseSharedPreferencesService { viewMode, showHeroSection, continueWatchingAction, + episodeAction, seekTimeSmall, seekTimeLarge, sleepTimerDuration, diff --git a/lib/utils/media_navigation_helper.dart b/lib/utils/media_navigation_helper.dart index 588275a4..b4ed25ea 100644 --- a/lib/utils/media_navigation_helper.dart +++ b/lib/utils/media_navigation_helper.dart @@ -111,13 +111,22 @@ MediaDetailNavigationTarget mediaDetailNavigationTargetFor(MediaItem item, {Medi return MediaDetailNavigationTarget(metadata: metadataOverride ?? item); } +bool shouldOpenEpisodeDetailsForActivation({ + required bool playDirectly, + required ContinueWatchingAction continueWatchingAction, + required EpisodeAction episodeAction, +}) { + if (playDirectly) return continueWatchingAction == ContinueWatchingAction.details; + return episodeAction == EpisodeAction.details; +} + /// Navigates to the appropriate screen based on the item type. /// /// Accepts a [MediaItem] or a [MediaPlaylist] (typed as [Object] because Dart /// has no nominal union type). /// -/// For episodes, starts playback directly via video player unless [playDirectly] -/// is paired with the Continue Watching details setting. +/// For episodes, normal card activation follows the Episode Action setting; +/// [playDirectly] surfaces instead follow the Continue Watching action setting. /// For movies, starts playback directly if [playDirectly] is true and the /// Continue Watching details setting is disabled; otherwise navigates to media /// detail screen. @@ -132,9 +141,9 @@ MediaDetailNavigationTarget mediaDetailNavigationTargetFor(MediaItem item, {Medi /// /// Set [isOffline] to true for downloaded content without server access. /// -/// Set [playDirectly] to true for Continue Watching activation; the user's -/// Continue Watching action setting decides whether resumable movies/episodes -/// play immediately or open details first. +/// Set [playDirectly] to true for Continue Watching / Next Up / On Deck +/// activation; those surfaces use the Continue Watching action setting instead +/// of the normal Episode Action setting. /// /// Returns a [MediaNavigationResult] indicating what action was taken: /// - [MediaNavigationResult.navigated]: Navigation completed, item refresh handled @@ -156,10 +165,15 @@ Future navigateToMediaItem( return MediaNavigationResult.unsupported; } final mi = item; - final shouldOpenContinueWatchingDetails = - playDirectly && - (SettingsService.instanceOrNull?.read(SettingsService.continueWatchingAction) ?? ContinueWatchingAction.play) == - ContinueWatchingAction.details; + final settings = SettingsService.instanceOrNull; + final continueWatchingAction = settings?.read(SettingsService.continueWatchingAction) ?? ContinueWatchingAction.play; + final episodeAction = settings?.read(SettingsService.episodeAction) ?? EpisodeAction.play; + final shouldOpenContinueWatchingDetails = playDirectly && continueWatchingAction == ContinueWatchingAction.details; + final shouldOpenEpisodeDetails = shouldOpenEpisodeDetailsForActivation( + playDirectly: playDirectly, + continueWatchingAction: continueWatchingAction, + episodeAction: episodeAction, + ); // Handle library section items (shared whole-library entries) — Plex-only; // [PlexLibrarySection.isLibrarySection] reads the stashed `key` from `raw`. @@ -193,7 +207,7 @@ Future navigateToMediaItem( case MediaKind.clip: case MediaKind.episode: - if (shouldOpenContinueWatchingDetails && mi.kind == MediaKind.episode) { + if (mi.kind == MediaKind.episode && shouldOpenEpisodeDetails) { return navigateToMediaItemDetails(context, mi, onRefresh: onRefresh, isOffline: isOffline); } final result = await navigateToVideoPlayer(context, metadata: mi, isOffline: isOffline); diff --git a/test/services/settings_service_test.dart b/test/services/settings_service_test.dart index fa299a59..66accfde 100644 --- a/test/services/settings_service_test.dart +++ b/test/services/settings_service_test.dart @@ -87,6 +87,20 @@ void main() { }); }); + group('SettingsService episode action', () { + test('defaults to play and resets to play', () async { + final settings = await SettingsService.getInstance(); + + expect(settings.read(SettingsService.episodeAction), EpisodeAction.play); + + await settings.write(SettingsService.episodeAction, EpisodeAction.details); + expect(settings.read(SettingsService.episodeAction), EpisodeAction.details); + + await settings.resetAllSettings(); + expect(settings.read(SettingsService.episodeAction), EpisodeAction.play); + }); + }); + group('SettingsService platform gates', () { test('audio passthrough stays available on desktop but not Apple TV', () { expect(PlatformDetector.supportsAudioPassthrough(), isTrue); diff --git a/test/utils/media_navigation_helper_test.dart b/test/utils/media_navigation_helper_test.dart index 9ad51578..5c80c29d 100644 --- a/test/utils/media_navigation_helper_test.dart +++ b/test/utils/media_navigation_helper_test.dart @@ -2,6 +2,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/media/media_backend.dart'; import 'package:plezy/media/media_item.dart'; import 'package:plezy/media/media_kind.dart'; +import 'package:plezy/services/settings_service.dart'; import 'package:plezy/utils/media_navigation_helper.dart'; void main() { @@ -57,4 +58,46 @@ void main() { expect(target.initialSeasonId, isNull); expect(target.initialEpisodeId, isNull); }); + + group('episode activation details decision', () { + test('normal activation uses the episode action setting', () { + expect( + shouldOpenEpisodeDetailsForActivation( + playDirectly: false, + continueWatchingAction: ContinueWatchingAction.details, + episodeAction: EpisodeAction.play, + ), + isFalse, + ); + + expect( + shouldOpenEpisodeDetailsForActivation( + playDirectly: false, + continueWatchingAction: ContinueWatchingAction.play, + episodeAction: EpisodeAction.details, + ), + isTrue, + ); + }); + + test('play-direct activation uses only the continue watching action setting', () { + expect( + shouldOpenEpisodeDetailsForActivation( + playDirectly: true, + continueWatchingAction: ContinueWatchingAction.play, + episodeAction: EpisodeAction.details, + ), + isFalse, + ); + + expect( + shouldOpenEpisodeDetailsForActivation( + playDirectly: true, + continueWatchingAction: ContinueWatchingAction.details, + episodeAction: EpisodeAction.play, + ), + isTrue, + ); + }); + }); }