From d2b01100a5b85e26248977010a00937abf60154d Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Fri, 17 Apr 2026 19:40:47 +0200 Subject: [PATCH] feat: force TV mode setting close #885 --- lib/i18n/da.i18n.json | 2 ++ lib/i18n/de.i18n.json | 2 ++ lib/i18n/en.i18n.json | 2 ++ lib/i18n/es.i18n.json | 2 ++ lib/i18n/fr.i18n.json | 2 ++ lib/i18n/it.i18n.json | 2 ++ lib/i18n/ja.i18n.json | 2 ++ lib/i18n/ko.i18n.json | 2 ++ lib/i18n/nb.i18n.json | 2 ++ lib/i18n/nl.i18n.json | 2 ++ lib/i18n/pl.i18n.json | 2 ++ lib/i18n/pt.i18n.json | 2 ++ lib/i18n/ru.i18n.json | 2 ++ lib/i18n/strings.g.dart | 4 ++-- lib/i18n/strings_da.g.dart | 8 +++++-- lib/i18n/strings_de.g.dart | 8 +++++-- lib/i18n/strings_en.g.dart | 12 ++++++++-- lib/i18n/strings_es.g.dart | 8 +++++-- lib/i18n/strings_fr.g.dart | 8 +++++-- lib/i18n/strings_it.g.dart | 8 +++++-- lib/i18n/strings_ja.g.dart | 8 +++++-- lib/i18n/strings_ko.g.dart | 8 +++++-- lib/i18n/strings_nb.g.dart | 8 +++++-- lib/i18n/strings_nl.g.dart | 8 +++++-- lib/i18n/strings_pl.g.dart | 8 +++++-- lib/i18n/strings_pt.g.dart | 8 +++++-- lib/i18n/strings_ru.g.dart | 8 +++++-- lib/i18n/strings_sv.g.dart | 8 +++++-- lib/i18n/strings_zh.g.dart | 8 +++++-- lib/i18n/sv.i18n.json | 2 ++ lib/i18n/zh.i18n.json | 2 ++ lib/main.dart | 2 +- .../settings/appearance_settings_screen.dart | 20 ++++++++++++++++ lib/services/settings_service.dart | 9 +++++++ lib/utils/platform_detector.dart | 24 +++++++++++++++---- 35 files changed, 175 insertions(+), 38 deletions(-) diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 7948f88c..f24ece28 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Vis profilvalg hver gang appen åbnes", "confirmExitOnBack": "Bekræft før lukning", "confirmExitOnBackDescription": "Vis bekræftelsesdialog ved tryk på tilbage for at lukke appen", + "forceTvMode": "Gennemtving TV-tilstand", + "forceTvModeDescription": "Brug TV-layoutet uanset automatisk registrering. Nyttigt på Android TV-enheder, der ikke rapporterer leanback-funktionen. Genstarter appen ved ændring.", "autoHidePerformanceOverlay": "Skjul ydelses-overlay automatisk", "autoHidePerformanceOverlayDescription": "Fade ydelses-overlayet med afspilningskontrollerne", "showNavBarLabels": "Vis navigationsbarlabels", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 63875de0..84632d96 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Profilauswahl bei jedem Öffnen der App anzeigen", "confirmExitOnBack": "Vor dem Beenden bestätigen", "confirmExitOnBackDescription": "Bestätigungsdialog anzeigen, wenn Zurück zum Beenden der App gedrückt wird", + "forceTvMode": "TV-Modus erzwingen", + "forceTvModeDescription": "TV-Layout unabhängig von der automatischen Erkennung verwenden. Nützlich für Android-TV-Geräte, die das Leanback-Feature nicht melden. Startet die App bei Änderung neu.", "autoHidePerformanceOverlay": "Leistungsoverlay automatisch ausblenden", "autoHidePerformanceOverlayDescription": "Leistungsoverlay mit den Wiedergabesteuerungen ein-/ausblenden", "showNavBarLabels": "Navigationsleisten-Beschriftungen anzeigen", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 0869e691..bc48f4b9 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -227,6 +227,8 @@ "requireProfileSelectionOnOpenDescription": "Show profile selection every time the app is opened", "confirmExitOnBack": "Confirm before exiting", "confirmExitOnBackDescription": "Show a confirmation dialog when pressing back to exit the app", + "forceTvMode": "Force TV mode", + "forceTvModeDescription": "Use the TV layout regardless of auto-detection. Useful on Android TV devices that don't report the leanback feature. Restarts the app on change.", "autoHidePerformanceOverlay": "Auto-Hide Performance Overlay", "autoHidePerformanceOverlayDescription": "Fade the performance overlay with the playback controls", "showNavBarLabels": "Show Navigation Bar Labels", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 8a5fe3cd..47a4b08c 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Mostrar selección de perfil cada vez que se abre la aplicación", "confirmExitOnBack": "Confirmar antes de salir", "confirmExitOnBackDescription": "Mostrar un diálogo de confirmación al presionar atrás para salir de la app", + "forceTvMode": "Forzar modo TV", + "forceTvModeDescription": "Usar el diseño de TV independientemente de la detección automática. Útil en dispositivos Android TV que no informan la característica leanback. Reinicia la app al cambiar.", "autoHidePerformanceOverlay": "Ocultar superposición de rendimiento automáticamente", "autoHidePerformanceOverlayDescription": "Desvanecer la superposición de rendimiento con los controles de reproducción", "showNavBarLabels": "Mostrar etiquetas de la barra de navegación", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 3da4110d..a08bd412 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Afficher la sélection de profil à chaque ouverture de l'application", "confirmExitOnBack": "Confirmer avant de quitter", "confirmExitOnBackDescription": "Afficher une boîte de dialogue de confirmation en appuyant sur retour pour quitter", + "forceTvMode": "Forcer le mode TV", + "forceTvModeDescription": "Utiliser la mise en page TV quelle que soit la détection automatique. Utile sur les appareils Android TV qui ne signalent pas la fonctionnalité leanback. Redémarre l'application lors du changement.", "autoHidePerformanceOverlay": "Masquer auto. superposition performances", "autoHidePerformanceOverlayDescription": "Faire apparaître/disparaître la superposition avec les contrôles de lecture", "showNavBarLabels": "Afficher les libellés de la barre de navigation", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index e5c8efed..c0779676 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Mostra la selezione del profilo ogni volta che l'app viene aperta", "confirmExitOnBack": "Conferma prima di uscire", "confirmExitOnBackDescription": "Mostra una finestra di conferma quando si preme indietro per uscire dall'app", + "forceTvMode": "Forza modalità TV", + "forceTvModeDescription": "Usa il layout TV indipendentemente dal rilevamento automatico. Utile sui dispositivi Android TV che non segnalano la funzionalità leanback. Riavvia l'app al cambiamento.", "autoHidePerformanceOverlay": "Nascondi automaticamente overlay prestazioni", "autoHidePerformanceOverlayDescription": "Dissolvi l'overlay prestazioni con i controlli di riproduzione", "showNavBarLabels": "Mostra etichette barra di navigazione", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 1031151d..d196b918 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "アプリを開くたびにプロフィール選択を表示", "confirmExitOnBack": "終了前に確認", "confirmExitOnBackDescription": "戻るボタンでアプリを終了する際に確認ダイアログを表示", + "forceTvMode": "TVモードを強制", + "forceTvModeDescription": "自動検出に関係なくTVレイアウトを使用します。leanback機能を報告しないAndroid TVデバイスで便利です。変更するとアプリが再起動されます。", "autoHidePerformanceOverlay": "パフォーマンスオーバーレイを自動非表示", "autoHidePerformanceOverlayDescription": "再生コントロールと一緒にパフォーマンスオーバーレイをフェードする", "showNavBarLabels": "ナビゲーションバーラベルを表示", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 34f6f024..1924b080 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "앱을 열 때마다 프로필 선택 화면을 표시합니다", "confirmExitOnBack": "종료 전 확인", "confirmExitOnBackDescription": "뒤로 버튼을 눌러 앱을 종료할 때 확인 대화상자를 표시합니다", + "forceTvMode": "TV 모드 강제 사용", + "forceTvModeDescription": "자동 감지와 관계없이 TV 레이아웃을 사용합니다. leanback 기능을 보고하지 않는 Android TV 기기에 유용합니다. 변경 시 앱이 다시 시작됩니다.", "autoHidePerformanceOverlay": "성능 오버레이 자동 숨기기", "autoHidePerformanceOverlayDescription": "재생 컨트롤과 함께 성능 오버레이를 페이드 처리", "showNavBarLabels": "내비게이션 바 라벨 표시", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 0901d22a..eb3c1425 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Vis profilvalg hver gang appen åpnes", "confirmExitOnBack": "Bekreft før avslutning", "confirmExitOnBackDescription": "Vis en bekreftelsesdialog når du trykker tilbake for å avslutte appen", + "forceTvMode": "Tving TV-modus", + "forceTvModeDescription": "Bruk TV-oppsettet uavhengig av automatisk gjenkjenning. Nyttig på Android TV-enheter som ikke rapporterer leanback-funksjonen. Starter appen på nytt ved endring.", "autoHidePerformanceOverlay": "Skjul ytelsesoverlegg automatisk", "autoHidePerformanceOverlayDescription": "Fade ytelsesoverlegget med avspillingskontrollene", "showNavBarLabels": "Vis navigasjonsfeltlabeler", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 252ff45f..78372dd7 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Toon profielselectie telkens wanneer de app wordt geopend", "confirmExitOnBack": "Bevestigen voor afsluiten", "confirmExitOnBackDescription": "Toon een bevestigingsvenster bij het drukken op terug om de app af te sluiten", + "forceTvMode": "TV-modus forceren", + "forceTvModeDescription": "Gebruik de TV-indeling ongeacht automatische detectie. Handig op Android TV-apparaten die de leanback-functie niet melden. Start de app opnieuw bij wijziging.", "autoHidePerformanceOverlay": "Prestatie-overlay automatisch verbergen", "autoHidePerformanceOverlayDescription": "Laat de prestatie-overlay meevervagen met de afspeelknoppen", "showNavBarLabels": "Navigatiebalk labels tonen", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index cdbabc9d..e3b05acc 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Pokaż wybór profilu za każdym razem, gdy aplikacja jest otwierana", "confirmExitOnBack": "Potwierdź przed wyjściem", "confirmExitOnBackDescription": "Pokaż dialog potwierdzenia przy naciśnięciu wstecz, aby wyjść z aplikacji", + "forceTvMode": "Wymuś tryb TV", + "forceTvModeDescription": "Użyj układu TV niezależnie od automatycznego wykrywania. Przydatne na urządzeniach Android TV, które nie zgłaszają funkcji leanback. Po zmianie aplikacja zostanie zrestartowana.", "autoHidePerformanceOverlay": "Automatycznie ukrywaj nakładkę wydajności", "autoHidePerformanceOverlayDescription": "Wygaszaj nakładkę wydajności wraz z kontrolkami odtwarzania", "showNavBarLabels": "Pokaż etykiety paska nawigacji", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 5f148b74..376aab49 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Mostrar seleção de perfil toda vez que o app for aberto", "confirmExitOnBack": "Confirmar antes de sair", "confirmExitOnBackDescription": "Mostrar diálogo de confirmação ao pressionar voltar para sair do app", + "forceTvMode": "Forçar modo TV", + "forceTvModeDescription": "Usar o layout de TV independentemente da detecção automática. Útil em dispositivos Android TV que não reportam o recurso leanback. Reinicia o app ao alterar.", "autoHidePerformanceOverlay": "Ocultar overlay de desempenho automaticamente", "autoHidePerformanceOverlayDescription": "Desvanecer o overlay de desempenho com os controles de reprodução", "showNavBarLabels": "Mostrar Rótulos da Barra de Navegação", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 9985bf93..ea5df4d6 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Показывать выбор профиля при каждом открытии приложения", "confirmExitOnBack": "Подтверждать выход", "confirmExitOnBackDescription": "Показывать диалог подтверждения при нажатии «назад» для выхода из приложения", + "forceTvMode": "Принудительный режим ТВ", + "forceTvModeDescription": "Использовать макет ТВ независимо от автоматического определения. Полезно на устройствах Android TV, которые не сообщают о функции leanback. Приложение перезапустится при изменении.", "autoHidePerformanceOverlay": "Автоскрытие оверлея производительности", "autoHidePerformanceOverlayDescription": "Скрывать оверлей производительности вместе с элементами управления воспроизведением", "showNavBarLabels": "Показывать подписи панели навигации", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index e623333a..b011efb0 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: 13290 (886 per locale) +/// Strings: 13320 (888 per locale) /// -/// Built on 2026-04-17 at 12:37 UTC +/// Built on 2026-04-17 at 17:39 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 2e720d9f..a4bb5ea3 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsDa implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Vis profilvalg hver gang appen åbnes'; @override String get confirmExitOnBack => 'Bekræft før lukning'; @override String get confirmExitOnBackDescription => 'Vis bekræftelsesdialog ved tryk på tilbage for at lukke appen'; + @override String get forceTvMode => 'Gennemtving TV-tilstand'; + @override String get forceTvModeDescription => 'Brug TV-layoutet uanset automatisk registrering. Nyttigt på Android TV-enheder, der ikke rapporterer leanback-funktionen. Genstarter appen ved ændring.'; @override String get autoHidePerformanceOverlay => 'Skjul ydelses-overlay automatisk'; @override String get autoHidePerformanceOverlayDescription => 'Fade ydelses-overlayet med afspilningskontrollerne'; @override String get showNavBarLabels => 'Vis navigationsbarlabels'; @@ -1598,6 +1600,8 @@ extension on TranslationsDa { 'settings.requireProfileSelectionOnOpenDescription' => 'Vis profilvalg hver gang appen åbnes', 'settings.confirmExitOnBack' => 'Bekræft før lukning', 'settings.confirmExitOnBackDescription' => 'Vis bekræftelsesdialog ved tryk på tilbage for at lukke appen', + 'settings.forceTvMode' => 'Gennemtving TV-tilstand', + 'settings.forceTvModeDescription' => 'Brug TV-layoutet uanset automatisk registrering. Nyttigt på Android TV-enheder, der ikke rapporterer leanback-funktionen. Genstarter appen ved ændring.', 'settings.autoHidePerformanceOverlay' => 'Skjul ydelses-overlay automatisk', 'settings.autoHidePerformanceOverlayDescription' => 'Fade ydelses-overlayet med afspilningskontrollerne', 'settings.showNavBarLabels' => 'Vis navigationsbarlabels', @@ -1893,10 +1897,10 @@ extension on TranslationsDa { 'libraries.tabs.collections' => 'Samlinger', 'libraries.tabs.playlists' => 'Playlister', 'libraries.groupings.title' => 'Gruppering', - 'libraries.groupings.all' => 'Alle', - 'libraries.groupings.movies' => 'Film', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Alle', + 'libraries.groupings.movies' => 'Film', 'libraries.groupings.shows' => 'TV-serier', 'libraries.groupings.seasons' => 'Sæsoner', 'libraries.groupings.episodes' => 'Episoder', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index af05054f..25fdb214 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsDe implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Profilauswahl bei jedem Öffnen der App anzeigen'; @override String get confirmExitOnBack => 'Vor dem Beenden bestätigen'; @override String get confirmExitOnBackDescription => 'Bestätigungsdialog anzeigen, wenn Zurück zum Beenden der App gedrückt wird'; + @override String get forceTvMode => 'TV-Modus erzwingen'; + @override String get forceTvModeDescription => 'TV-Layout unabhängig von der automatischen Erkennung verwenden. Nützlich für Android-TV-Geräte, die das Leanback-Feature nicht melden. Startet die App bei Änderung neu.'; @override String get autoHidePerformanceOverlay => 'Leistungsoverlay automatisch ausblenden'; @override String get autoHidePerformanceOverlayDescription => 'Leistungsoverlay mit den Wiedergabesteuerungen ein-/ausblenden'; @override String get showNavBarLabels => 'Navigationsleisten-Beschriftungen anzeigen'; @@ -1598,6 +1600,8 @@ extension on TranslationsDe { 'settings.requireProfileSelectionOnOpenDescription' => 'Profilauswahl bei jedem Öffnen der App anzeigen', 'settings.confirmExitOnBack' => 'Vor dem Beenden bestätigen', 'settings.confirmExitOnBackDescription' => 'Bestätigungsdialog anzeigen, wenn Zurück zum Beenden der App gedrückt wird', + 'settings.forceTvMode' => 'TV-Modus erzwingen', + 'settings.forceTvModeDescription' => 'TV-Layout unabhängig von der automatischen Erkennung verwenden. Nützlich für Android-TV-Geräte, die das Leanback-Feature nicht melden. Startet die App bei Änderung neu.', 'settings.autoHidePerformanceOverlay' => 'Leistungsoverlay automatisch ausblenden', 'settings.autoHidePerformanceOverlayDescription' => 'Leistungsoverlay mit den Wiedergabesteuerungen ein-/ausblenden', 'settings.showNavBarLabels' => 'Navigationsleisten-Beschriftungen anzeigen', @@ -1893,10 +1897,10 @@ extension on TranslationsDe { 'libraries.tabs.collections' => 'Sammlungen', 'libraries.tabs.playlists' => 'Wiedergabelisten', 'libraries.groupings.title' => 'Gruppierung', - 'libraries.groupings.all' => 'Alle', - 'libraries.groupings.movies' => 'Filme', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Alle', + 'libraries.groupings.movies' => 'Filme', 'libraries.groupings.shows' => 'Serien', 'libraries.groupings.seasons' => 'Staffeln', 'libraries.groupings.episodes' => 'Episoden', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 4f0fd8c5..da45f951 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -784,6 +784,12 @@ class TranslationsSettingsEn { /// en: 'Show a confirmation dialog when pressing back to exit the app' String get confirmExitOnBackDescription => 'Show a confirmation dialog when pressing back to exit the app'; + /// en: 'Force TV mode' + String get forceTvMode => 'Force TV mode'; + + /// en: 'Use the TV layout regardless of auto-detection. Useful on Android TV devices that don't report the leanback feature. Restarts the app on change.' + String get forceTvModeDescription => 'Use the TV layout regardless of auto-detection. Useful on Android TV devices that don\'t report the leanback feature. Restarts the app on change.'; + /// en: 'Auto-Hide Performance Overlay' String get autoHidePerformanceOverlay => 'Auto-Hide Performance Overlay'; @@ -3379,6 +3385,8 @@ extension on Translations { 'settings.requireProfileSelectionOnOpenDescription' => 'Show profile selection every time the app is opened', 'settings.confirmExitOnBack' => 'Confirm before exiting', 'settings.confirmExitOnBackDescription' => 'Show a confirmation dialog when pressing back to exit the app', + 'settings.forceTvMode' => 'Force TV mode', + 'settings.forceTvModeDescription' => 'Use the TV layout regardless of auto-detection. Useful on Android TV devices that don\'t report the leanback feature. Restarts the app on change.', 'settings.autoHidePerformanceOverlay' => 'Auto-Hide Performance Overlay', 'settings.autoHidePerformanceOverlayDescription' => 'Fade the performance overlay with the playback controls', 'settings.showNavBarLabels' => 'Show Navigation Bar Labels', @@ -3672,10 +3680,10 @@ extension on Translations { 'libraries.tabs.collections' => 'Collections', 'libraries.tabs.playlists' => 'Playlists', 'libraries.groupings.title' => 'Grouping', - 'libraries.groupings.all' => 'All', - 'libraries.groupings.movies' => 'Movies', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'All', + 'libraries.groupings.movies' => 'Movies', 'libraries.groupings.shows' => 'TV Shows', 'libraries.groupings.seasons' => 'Seasons', 'libraries.groupings.episodes' => 'Episodes', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index ae024e7e..b7dadf62 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsEs implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Mostrar selección de perfil cada vez que se abre la aplicación'; @override String get confirmExitOnBack => 'Confirmar antes de salir'; @override String get confirmExitOnBackDescription => 'Mostrar un diálogo de confirmación al presionar atrás para salir de la app'; + @override String get forceTvMode => 'Forzar modo TV'; + @override String get forceTvModeDescription => 'Usar el diseño de TV independientemente de la detección automática. Útil en dispositivos Android TV que no informan la característica leanback. Reinicia la app al cambiar.'; @override String get autoHidePerformanceOverlay => 'Ocultar superposición de rendimiento automáticamente'; @override String get autoHidePerformanceOverlayDescription => 'Desvanecer la superposición de rendimiento con los controles de reproducción'; @override String get showNavBarLabels => 'Mostrar etiquetas de la barra de navegación'; @@ -1598,6 +1600,8 @@ extension on TranslationsEs { 'settings.requireProfileSelectionOnOpenDescription' => 'Mostrar selección de perfil cada vez que se abre la aplicación', 'settings.confirmExitOnBack' => 'Confirmar antes de salir', 'settings.confirmExitOnBackDescription' => 'Mostrar un diálogo de confirmación al presionar atrás para salir de la app', + 'settings.forceTvMode' => 'Forzar modo TV', + 'settings.forceTvModeDescription' => 'Usar el diseño de TV independientemente de la detección automática. Útil en dispositivos Android TV que no informan la característica leanback. Reinicia la app al cambiar.', 'settings.autoHidePerformanceOverlay' => 'Ocultar superposición de rendimiento automáticamente', 'settings.autoHidePerformanceOverlayDescription' => 'Desvanecer la superposición de rendimiento con los controles de reproducción', 'settings.showNavBarLabels' => 'Mostrar etiquetas de la barra de navegación', @@ -1893,10 +1897,10 @@ extension on TranslationsEs { 'libraries.tabs.collections' => 'Colecciones', 'libraries.tabs.playlists' => 'Listas', 'libraries.groupings.title' => 'Agrupación', - 'libraries.groupings.all' => 'Todo', - 'libraries.groupings.movies' => 'Películas', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Todo', + 'libraries.groupings.movies' => 'Películas', 'libraries.groupings.shows' => 'Series', 'libraries.groupings.seasons' => 'Temporadas', 'libraries.groupings.episodes' => 'Episodios', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 7322dc59..f7dd0c46 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsFr implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Afficher la sélection de profil à chaque ouverture de l\'application'; @override String get confirmExitOnBack => 'Confirmer avant de quitter'; @override String get confirmExitOnBackDescription => 'Afficher une boîte de dialogue de confirmation en appuyant sur retour pour quitter'; + @override String get forceTvMode => 'Forcer le mode TV'; + @override String get forceTvModeDescription => 'Utiliser la mise en page TV quelle que soit la détection automatique. Utile sur les appareils Android TV qui ne signalent pas la fonctionnalité leanback. Redémarre l\'application lors du changement.'; @override String get autoHidePerformanceOverlay => 'Masquer auto. superposition performances'; @override String get autoHidePerformanceOverlayDescription => 'Faire apparaître/disparaître la superposition avec les contrôles de lecture'; @override String get showNavBarLabels => 'Afficher les libellés de la barre de navigation'; @@ -1598,6 +1600,8 @@ extension on TranslationsFr { 'settings.requireProfileSelectionOnOpenDescription' => 'Afficher la sélection de profil à chaque ouverture de l\'application', 'settings.confirmExitOnBack' => 'Confirmer avant de quitter', 'settings.confirmExitOnBackDescription' => 'Afficher une boîte de dialogue de confirmation en appuyant sur retour pour quitter', + 'settings.forceTvMode' => 'Forcer le mode TV', + 'settings.forceTvModeDescription' => 'Utiliser la mise en page TV quelle que soit la détection automatique. Utile sur les appareils Android TV qui ne signalent pas la fonctionnalité leanback. Redémarre l\'application lors du changement.', 'settings.autoHidePerformanceOverlay' => 'Masquer auto. superposition performances', 'settings.autoHidePerformanceOverlayDescription' => 'Faire apparaître/disparaître la superposition avec les contrôles de lecture', 'settings.showNavBarLabels' => 'Afficher les libellés de la barre de navigation', @@ -1893,10 +1897,10 @@ extension on TranslationsFr { 'libraries.tabs.collections' => 'Collections', 'libraries.tabs.playlists' => 'Playlists', 'libraries.groupings.title' => 'Regroupement', - 'libraries.groupings.all' => 'Tous', - 'libraries.groupings.movies' => 'Films', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Tous', + 'libraries.groupings.movies' => 'Films', 'libraries.groupings.shows' => 'Show TV', 'libraries.groupings.seasons' => 'Saisons', 'libraries.groupings.episodes' => 'Épisodes', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 447f9043..ea648aec 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsIt implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Mostra la selezione del profilo ogni volta che l\'app viene aperta'; @override String get confirmExitOnBack => 'Conferma prima di uscire'; @override String get confirmExitOnBackDescription => 'Mostra una finestra di conferma quando si preme indietro per uscire dall\'app'; + @override String get forceTvMode => 'Forza modalità TV'; + @override String get forceTvModeDescription => 'Usa il layout TV indipendentemente dal rilevamento automatico. Utile sui dispositivi Android TV che non segnalano la funzionalità leanback. Riavvia l\'app al cambiamento.'; @override String get autoHidePerformanceOverlay => 'Nascondi automaticamente overlay prestazioni'; @override String get autoHidePerformanceOverlayDescription => 'Dissolvi l\'overlay prestazioni con i controlli di riproduzione'; @override String get showNavBarLabels => 'Mostra etichette barra di navigazione'; @@ -1598,6 +1600,8 @@ extension on TranslationsIt { 'settings.requireProfileSelectionOnOpenDescription' => 'Mostra la selezione del profilo ogni volta che l\'app viene aperta', 'settings.confirmExitOnBack' => 'Conferma prima di uscire', 'settings.confirmExitOnBackDescription' => 'Mostra una finestra di conferma quando si preme indietro per uscire dall\'app', + 'settings.forceTvMode' => 'Forza modalità TV', + 'settings.forceTvModeDescription' => 'Usa il layout TV indipendentemente dal rilevamento automatico. Utile sui dispositivi Android TV che non segnalano la funzionalità leanback. Riavvia l\'app al cambiamento.', 'settings.autoHidePerformanceOverlay' => 'Nascondi automaticamente overlay prestazioni', 'settings.autoHidePerformanceOverlayDescription' => 'Dissolvi l\'overlay prestazioni con i controlli di riproduzione', 'settings.showNavBarLabels' => 'Mostra etichette barra di navigazione', @@ -1893,10 +1897,10 @@ extension on TranslationsIt { 'libraries.tabs.collections' => 'Raccolte', 'libraries.tabs.playlists' => 'Playlist', 'libraries.groupings.title' => 'Raggruppamento', - 'libraries.groupings.all' => 'Tutti', - 'libraries.groupings.movies' => 'Film', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Tutti', + 'libraries.groupings.movies' => 'Film', 'libraries.groupings.shows' => 'Serie TV', 'libraries.groupings.seasons' => 'Stagioni', 'libraries.groupings.episodes' => 'Episodi', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index dcc40b38..68b5ff8a 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsJa implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'アプリを開くたびにプロフィール選択を表示'; @override String get confirmExitOnBack => '終了前に確認'; @override String get confirmExitOnBackDescription => '戻るボタンでアプリを終了する際に確認ダイアログを表示'; + @override String get forceTvMode => 'TVモードを強制'; + @override String get forceTvModeDescription => '自動検出に関係なくTVレイアウトを使用します。leanback機能を報告しないAndroid TVデバイスで便利です。変更するとアプリが再起動されます。'; @override String get autoHidePerformanceOverlay => 'パフォーマンスオーバーレイを自動非表示'; @override String get autoHidePerformanceOverlayDescription => '再生コントロールと一緒にパフォーマンスオーバーレイをフェードする'; @override String get showNavBarLabels => 'ナビゲーションバーラベルを表示'; @@ -1598,6 +1600,8 @@ extension on TranslationsJa { 'settings.requireProfileSelectionOnOpenDescription' => 'アプリを開くたびにプロフィール選択を表示', 'settings.confirmExitOnBack' => '終了前に確認', 'settings.confirmExitOnBackDescription' => '戻るボタンでアプリを終了する際に確認ダイアログを表示', + 'settings.forceTvMode' => 'TVモードを強制', + 'settings.forceTvModeDescription' => '自動検出に関係なくTVレイアウトを使用します。leanback機能を報告しないAndroid TVデバイスで便利です。変更するとアプリが再起動されます。', 'settings.autoHidePerformanceOverlay' => 'パフォーマンスオーバーレイを自動非表示', 'settings.autoHidePerformanceOverlayDescription' => '再生コントロールと一緒にパフォーマンスオーバーレイをフェードする', 'settings.showNavBarLabels' => 'ナビゲーションバーラベルを表示', @@ -1893,10 +1897,10 @@ extension on TranslationsJa { 'libraries.tabs.collections' => 'コレクション', 'libraries.tabs.playlists' => 'プレイリスト', 'libraries.groupings.title' => 'グループ', - 'libraries.groupings.all' => 'すべて', - 'libraries.groupings.movies' => '映画', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'すべて', + 'libraries.groupings.movies' => '映画', 'libraries.groupings.shows' => 'テレビ番組', 'libraries.groupings.seasons' => 'シーズン', 'libraries.groupings.episodes' => 'エピソード', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 742712cc..99a1a65a 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsKo implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => '앱을 열 때마다 프로필 선택 화면을 표시합니다'; @override String get confirmExitOnBack => '종료 전 확인'; @override String get confirmExitOnBackDescription => '뒤로 버튼을 눌러 앱을 종료할 때 확인 대화상자를 표시합니다'; + @override String get forceTvMode => 'TV 모드 강제 사용'; + @override String get forceTvModeDescription => '자동 감지와 관계없이 TV 레이아웃을 사용합니다. leanback 기능을 보고하지 않는 Android TV 기기에 유용합니다. 변경 시 앱이 다시 시작됩니다.'; @override String get autoHidePerformanceOverlay => '성능 오버레이 자동 숨기기'; @override String get autoHidePerformanceOverlayDescription => '재생 컨트롤과 함께 성능 오버레이를 페이드 처리'; @override String get showNavBarLabels => '내비게이션 바 라벨 표시'; @@ -1598,6 +1600,8 @@ extension on TranslationsKo { 'settings.requireProfileSelectionOnOpenDescription' => '앱을 열 때마다 프로필 선택 화면을 표시합니다', 'settings.confirmExitOnBack' => '종료 전 확인', 'settings.confirmExitOnBackDescription' => '뒤로 버튼을 눌러 앱을 종료할 때 확인 대화상자를 표시합니다', + 'settings.forceTvMode' => 'TV 모드 강제 사용', + 'settings.forceTvModeDescription' => '자동 감지와 관계없이 TV 레이아웃을 사용합니다. leanback 기능을 보고하지 않는 Android TV 기기에 유용합니다. 변경 시 앱이 다시 시작됩니다.', 'settings.autoHidePerformanceOverlay' => '성능 오버레이 자동 숨기기', 'settings.autoHidePerformanceOverlayDescription' => '재생 컨트롤과 함께 성능 오버레이를 페이드 처리', 'settings.showNavBarLabels' => '내비게이션 바 라벨 표시', @@ -1893,10 +1897,10 @@ extension on TranslationsKo { 'libraries.tabs.collections' => '컬렉션', 'libraries.tabs.playlists' => '재생 목록', 'libraries.groupings.title' => '그룹', - 'libraries.groupings.all' => '전체', - 'libraries.groupings.movies' => '영화', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => '전체', + 'libraries.groupings.movies' => '영화', 'libraries.groupings.shows' => 'TV 프로그램', 'libraries.groupings.seasons' => '시즌', 'libraries.groupings.episodes' => '화', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 39939c98..bb006669 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsNb implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Vis profilvalg hver gang appen åpnes'; @override String get confirmExitOnBack => 'Bekreft før avslutning'; @override String get confirmExitOnBackDescription => 'Vis en bekreftelsesdialog når du trykker tilbake for å avslutte appen'; + @override String get forceTvMode => 'Tving TV-modus'; + @override String get forceTvModeDescription => 'Bruk TV-oppsettet uavhengig av automatisk gjenkjenning. Nyttig på Android TV-enheter som ikke rapporterer leanback-funksjonen. Starter appen på nytt ved endring.'; @override String get autoHidePerformanceOverlay => 'Skjul ytelsesoverlegg automatisk'; @override String get autoHidePerformanceOverlayDescription => 'Fade ytelsesoverlegget med avspillingskontrollene'; @override String get showNavBarLabels => 'Vis navigasjonsfeltlabeler'; @@ -1598,6 +1600,8 @@ extension on TranslationsNb { 'settings.requireProfileSelectionOnOpenDescription' => 'Vis profilvalg hver gang appen åpnes', 'settings.confirmExitOnBack' => 'Bekreft før avslutning', 'settings.confirmExitOnBackDescription' => 'Vis en bekreftelsesdialog når du trykker tilbake for å avslutte appen', + 'settings.forceTvMode' => 'Tving TV-modus', + 'settings.forceTvModeDescription' => 'Bruk TV-oppsettet uavhengig av automatisk gjenkjenning. Nyttig på Android TV-enheter som ikke rapporterer leanback-funksjonen. Starter appen på nytt ved endring.', 'settings.autoHidePerformanceOverlay' => 'Skjul ytelsesoverlegg automatisk', 'settings.autoHidePerformanceOverlayDescription' => 'Fade ytelsesoverlegget med avspillingskontrollene', 'settings.showNavBarLabels' => 'Vis navigasjonsfeltlabeler', @@ -1893,10 +1897,10 @@ extension on TranslationsNb { 'libraries.tabs.collections' => 'Samlinger', 'libraries.tabs.playlists' => 'Spillelister', 'libraries.groupings.title' => 'Gruppering', - 'libraries.groupings.all' => 'Alle', - 'libraries.groupings.movies' => 'Filmer', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Alle', + 'libraries.groupings.movies' => 'Filmer', 'libraries.groupings.shows' => 'TV-serier', 'libraries.groupings.seasons' => 'Sesonger', 'libraries.groupings.episodes' => 'Episoder', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index e069fba0..7d87a5d1 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsNl implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Toon profielselectie telkens wanneer de app wordt geopend'; @override String get confirmExitOnBack => 'Bevestigen voor afsluiten'; @override String get confirmExitOnBackDescription => 'Toon een bevestigingsvenster bij het drukken op terug om de app af te sluiten'; + @override String get forceTvMode => 'TV-modus forceren'; + @override String get forceTvModeDescription => 'Gebruik de TV-indeling ongeacht automatische detectie. Handig op Android TV-apparaten die de leanback-functie niet melden. Start de app opnieuw bij wijziging.'; @override String get autoHidePerformanceOverlay => 'Prestatie-overlay automatisch verbergen'; @override String get autoHidePerformanceOverlayDescription => 'Laat de prestatie-overlay meevervagen met de afspeelknoppen'; @override String get showNavBarLabels => 'Navigatiebalk labels tonen'; @@ -1598,6 +1600,8 @@ extension on TranslationsNl { 'settings.requireProfileSelectionOnOpenDescription' => 'Toon profielselectie telkens wanneer de app wordt geopend', 'settings.confirmExitOnBack' => 'Bevestigen voor afsluiten', 'settings.confirmExitOnBackDescription' => 'Toon een bevestigingsvenster bij het drukken op terug om de app af te sluiten', + 'settings.forceTvMode' => 'TV-modus forceren', + 'settings.forceTvModeDescription' => 'Gebruik de TV-indeling ongeacht automatische detectie. Handig op Android TV-apparaten die de leanback-functie niet melden. Start de app opnieuw bij wijziging.', 'settings.autoHidePerformanceOverlay' => 'Prestatie-overlay automatisch verbergen', 'settings.autoHidePerformanceOverlayDescription' => 'Laat de prestatie-overlay meevervagen met de afspeelknoppen', 'settings.showNavBarLabels' => 'Navigatiebalk labels tonen', @@ -1893,10 +1897,10 @@ extension on TranslationsNl { 'libraries.tabs.collections' => 'Collecties', 'libraries.tabs.playlists' => 'Afspeellijsten', 'libraries.groupings.title' => 'Groepering', - 'libraries.groupings.all' => 'Alles', - 'libraries.groupings.movies' => 'Films', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Alles', + 'libraries.groupings.movies' => 'Films', 'libraries.groupings.shows' => 'Series', 'libraries.groupings.seasons' => 'Seizoenen', 'libraries.groupings.episodes' => 'Afleveringen', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 042feeb0..a0cc0d3d 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsPl implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Pokaż wybór profilu za każdym razem, gdy aplikacja jest otwierana'; @override String get confirmExitOnBack => 'Potwierdź przed wyjściem'; @override String get confirmExitOnBackDescription => 'Pokaż dialog potwierdzenia przy naciśnięciu wstecz, aby wyjść z aplikacji'; + @override String get forceTvMode => 'Wymuś tryb TV'; + @override String get forceTvModeDescription => 'Użyj układu TV niezależnie od automatycznego wykrywania. Przydatne na urządzeniach Android TV, które nie zgłaszają funkcji leanback. Po zmianie aplikacja zostanie zrestartowana.'; @override String get autoHidePerformanceOverlay => 'Automatycznie ukrywaj nakładkę wydajności'; @override String get autoHidePerformanceOverlayDescription => 'Wygaszaj nakładkę wydajności wraz z kontrolkami odtwarzania'; @override String get showNavBarLabels => 'Pokaż etykiety paska nawigacji'; @@ -1598,6 +1600,8 @@ extension on TranslationsPl { 'settings.requireProfileSelectionOnOpenDescription' => 'Pokaż wybór profilu za każdym razem, gdy aplikacja jest otwierana', 'settings.confirmExitOnBack' => 'Potwierdź przed wyjściem', 'settings.confirmExitOnBackDescription' => 'Pokaż dialog potwierdzenia przy naciśnięciu wstecz, aby wyjść z aplikacji', + 'settings.forceTvMode' => 'Wymuś tryb TV', + 'settings.forceTvModeDescription' => 'Użyj układu TV niezależnie od automatycznego wykrywania. Przydatne na urządzeniach Android TV, które nie zgłaszają funkcji leanback. Po zmianie aplikacja zostanie zrestartowana.', 'settings.autoHidePerformanceOverlay' => 'Automatycznie ukrywaj nakładkę wydajności', 'settings.autoHidePerformanceOverlayDescription' => 'Wygaszaj nakładkę wydajności wraz z kontrolkami odtwarzania', 'settings.showNavBarLabels' => 'Pokaż etykiety paska nawigacji', @@ -1893,10 +1897,10 @@ extension on TranslationsPl { 'libraries.tabs.collections' => 'Kolekcje', 'libraries.tabs.playlists' => 'Playlisty', 'libraries.groupings.title' => 'Grupowanie', - 'libraries.groupings.all' => 'Wszystkie', - 'libraries.groupings.movies' => 'Filmy', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Wszystkie', + 'libraries.groupings.movies' => 'Filmy', 'libraries.groupings.shows' => 'Seriale TV', 'libraries.groupings.seasons' => 'Sezony', 'libraries.groupings.episodes' => 'Odcinki', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 9e8c69df..486ed4db 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsPt implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Mostrar seleção de perfil toda vez que o app for aberto'; @override String get confirmExitOnBack => 'Confirmar antes de sair'; @override String get confirmExitOnBackDescription => 'Mostrar diálogo de confirmação ao pressionar voltar para sair do app'; + @override String get forceTvMode => 'Forçar modo TV'; + @override String get forceTvModeDescription => 'Usar o layout de TV independentemente da detecção automática. Útil em dispositivos Android TV que não reportam o recurso leanback. Reinicia o app ao alterar.'; @override String get autoHidePerformanceOverlay => 'Ocultar overlay de desempenho automaticamente'; @override String get autoHidePerformanceOverlayDescription => 'Desvanecer o overlay de desempenho com os controles de reprodução'; @override String get showNavBarLabels => 'Mostrar Rótulos da Barra de Navegação'; @@ -1598,6 +1600,8 @@ extension on TranslationsPt { 'settings.requireProfileSelectionOnOpenDescription' => 'Mostrar seleção de perfil toda vez que o app for aberto', 'settings.confirmExitOnBack' => 'Confirmar antes de sair', 'settings.confirmExitOnBackDescription' => 'Mostrar diálogo de confirmação ao pressionar voltar para sair do app', + 'settings.forceTvMode' => 'Forçar modo TV', + 'settings.forceTvModeDescription' => 'Usar o layout de TV independentemente da detecção automática. Útil em dispositivos Android TV que não reportam o recurso leanback. Reinicia o app ao alterar.', 'settings.autoHidePerformanceOverlay' => 'Ocultar overlay de desempenho automaticamente', 'settings.autoHidePerformanceOverlayDescription' => 'Desvanecer o overlay de desempenho com os controles de reprodução', 'settings.showNavBarLabels' => 'Mostrar Rótulos da Barra de Navegação', @@ -1893,10 +1897,10 @@ extension on TranslationsPt { 'libraries.tabs.collections' => 'Coleções', 'libraries.tabs.playlists' => 'Playlists', 'libraries.groupings.title' => 'Agrupamento', - 'libraries.groupings.all' => 'Todos', - 'libraries.groupings.movies' => 'Filmes', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Todos', + 'libraries.groupings.movies' => 'Filmes', 'libraries.groupings.shows' => 'Séries de TV', 'libraries.groupings.seasons' => 'Temporadas', 'libraries.groupings.episodes' => 'Episódios', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index 491a7316..9f49d4c5 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsRu implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Показывать выбор профиля при каждом открытии приложения'; @override String get confirmExitOnBack => 'Подтверждать выход'; @override String get confirmExitOnBackDescription => 'Показывать диалог подтверждения при нажатии «назад» для выхода из приложения'; + @override String get forceTvMode => 'Принудительный режим ТВ'; + @override String get forceTvModeDescription => 'Использовать макет ТВ независимо от автоматического определения. Полезно на устройствах Android TV, которые не сообщают о функции leanback. Приложение перезапустится при изменении.'; @override String get autoHidePerformanceOverlay => 'Автоскрытие оверлея производительности'; @override String get autoHidePerformanceOverlayDescription => 'Скрывать оверлей производительности вместе с элементами управления воспроизведением'; @override String get showNavBarLabels => 'Показывать подписи панели навигации'; @@ -1598,6 +1600,8 @@ extension on TranslationsRu { 'settings.requireProfileSelectionOnOpenDescription' => 'Показывать выбор профиля при каждом открытии приложения', 'settings.confirmExitOnBack' => 'Подтверждать выход', 'settings.confirmExitOnBackDescription' => 'Показывать диалог подтверждения при нажатии «назад» для выхода из приложения', + 'settings.forceTvMode' => 'Принудительный режим ТВ', + 'settings.forceTvModeDescription' => 'Использовать макет ТВ независимо от автоматического определения. Полезно на устройствах Android TV, которые не сообщают о функции leanback. Приложение перезапустится при изменении.', 'settings.autoHidePerformanceOverlay' => 'Автоскрытие оверлея производительности', 'settings.autoHidePerformanceOverlayDescription' => 'Скрывать оверлей производительности вместе с элементами управления воспроизведением', 'settings.showNavBarLabels' => 'Показывать подписи панели навигации', @@ -1893,10 +1897,10 @@ extension on TranslationsRu { 'libraries.tabs.collections' => 'Коллекции', 'libraries.tabs.playlists' => 'Плейлисты', 'libraries.groupings.title' => 'Группировка', - 'libraries.groupings.all' => 'Все', - 'libraries.groupings.movies' => 'Фильмы', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Все', + 'libraries.groupings.movies' => 'Фильмы', 'libraries.groupings.shows' => 'Сериалы', 'libraries.groupings.seasons' => 'Сезоны', 'libraries.groupings.episodes' => 'Эпизоды', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 9050e65b..b8922e56 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsSv implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => 'Visa profilval varje gång appen öppnas'; @override String get confirmExitOnBack => 'Bekräfta innan avslut'; @override String get confirmExitOnBackDescription => 'Visa en bekräftelsedialog när du trycker tillbaka för att avsluta appen'; + @override String get forceTvMode => 'Tvinga TV-läge'; + @override String get forceTvModeDescription => 'Använd TV-layouten oavsett automatisk identifiering. Användbart på Android TV-enheter som inte rapporterar leanback-funktionen. Startar om appen vid ändring.'; @override String get autoHidePerformanceOverlay => 'Dölj prestandaöverlagring automatiskt'; @override String get autoHidePerformanceOverlayDescription => 'Tona prestandaöverlagringen med uppspelningskontrollerna'; @override String get showNavBarLabels => 'Visa navigeringsfältets etiketter'; @@ -1598,6 +1600,8 @@ extension on TranslationsSv { 'settings.requireProfileSelectionOnOpenDescription' => 'Visa profilval varje gång appen öppnas', 'settings.confirmExitOnBack' => 'Bekräfta innan avslut', 'settings.confirmExitOnBackDescription' => 'Visa en bekräftelsedialog när du trycker tillbaka för att avsluta appen', + 'settings.forceTvMode' => 'Tvinga TV-läge', + 'settings.forceTvModeDescription' => 'Använd TV-layouten oavsett automatisk identifiering. Användbart på Android TV-enheter som inte rapporterar leanback-funktionen. Startar om appen vid ändring.', 'settings.autoHidePerformanceOverlay' => 'Dölj prestandaöverlagring automatiskt', 'settings.autoHidePerformanceOverlayDescription' => 'Tona prestandaöverlagringen med uppspelningskontrollerna', 'settings.showNavBarLabels' => 'Visa navigeringsfältets etiketter', @@ -1893,10 +1897,10 @@ extension on TranslationsSv { 'libraries.tabs.collections' => 'Samlingar', 'libraries.tabs.playlists' => 'Spellistor', 'libraries.groupings.title' => 'Gruppering', - 'libraries.groupings.all' => 'Alla', - 'libraries.groupings.movies' => 'Filmer', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => 'Alla', + 'libraries.groupings.movies' => 'Filmer', 'libraries.groupings.shows' => 'Serier', 'libraries.groupings.seasons' => 'Säsonger', 'libraries.groupings.episodes' => 'Avsnitt', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 5a2d85bc..8a32fa0d 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -344,6 +344,8 @@ class _TranslationsSettingsZh implements TranslationsSettingsEn { @override String get requireProfileSelectionOnOpenDescription => '每次打开应用时显示配置文件选择'; @override String get confirmExitOnBack => '退出前确认'; @override String get confirmExitOnBackDescription => '按返回键退出应用时显示确认对话框'; + @override String get forceTvMode => '强制 TV 模式'; + @override String get forceTvModeDescription => '无论自动检测结果如何都使用 TV 布局。适用于未报告 leanback 功能的 Android TV 设备。更改后将重启应用。'; @override String get autoHidePerformanceOverlay => '自动隐藏性能叠加层'; @override String get autoHidePerformanceOverlayDescription => '性能叠加层随播放控件一起淡入淡出'; @override String get showNavBarLabels => '显示导航栏标签'; @@ -1598,6 +1600,8 @@ extension on TranslationsZh { 'settings.requireProfileSelectionOnOpenDescription' => '每次打开应用时显示配置文件选择', 'settings.confirmExitOnBack' => '退出前确认', 'settings.confirmExitOnBackDescription' => '按返回键退出应用时显示确认对话框', + 'settings.forceTvMode' => '强制 TV 模式', + 'settings.forceTvModeDescription' => '无论自动检测结果如何都使用 TV 布局。适用于未报告 leanback 功能的 Android TV 设备。更改后将重启应用。', 'settings.autoHidePerformanceOverlay' => '自动隐藏性能叠加层', 'settings.autoHidePerformanceOverlayDescription' => '性能叠加层随播放控件一起淡入淡出', 'settings.showNavBarLabels' => '显示导航栏标签', @@ -1893,10 +1897,10 @@ extension on TranslationsZh { 'libraries.tabs.collections' => '合集', 'libraries.tabs.playlists' => '播放列表', 'libraries.groupings.title' => '分组', - 'libraries.groupings.all' => '全部', - 'libraries.groupings.movies' => '电影', _ => null, } ?? switch (path) { + 'libraries.groupings.all' => '全部', + 'libraries.groupings.movies' => '电影', 'libraries.groupings.shows' => '剧集', 'libraries.groupings.seasons' => '季', 'libraries.groupings.episodes' => '集', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index a8c70e30..5fc4e522 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "Visa profilval varje gång appen öppnas", "confirmExitOnBack": "Bekräfta innan avslut", "confirmExitOnBackDescription": "Visa en bekräftelsedialog när du trycker tillbaka för att avsluta appen", + "forceTvMode": "Tvinga TV-läge", + "forceTvModeDescription": "Använd TV-layouten oavsett automatisk identifiering. Användbart på Android TV-enheter som inte rapporterar leanback-funktionen. Startar om appen vid ändring.", "autoHidePerformanceOverlay": "Dölj prestandaöverlagring automatiskt", "autoHidePerformanceOverlayDescription": "Tona prestandaöverlagringen med uppspelningskontrollerna", "showNavBarLabels": "Visa navigeringsfältets etiketter", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index fa3a0a91..53f41740 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -225,6 +225,8 @@ "requireProfileSelectionOnOpenDescription": "每次打开应用时显示配置文件选择", "confirmExitOnBack": "退出前确认", "confirmExitOnBackDescription": "按返回键退出应用时显示确认对话框", + "forceTvMode": "强制 TV 模式", + "forceTvModeDescription": "无论自动检测结果如何都使用 TV 布局。适用于未报告 leanback 功能的 Android TV 设备。更改后将重启应用。", "autoHidePerformanceOverlay": "自动隐藏性能叠加层", "autoHidePerformanceOverlayDescription": "性能叠加层随播放控件一起淡入淡出", "showNavBarLabels": "显示导航栏标签", diff --git a/lib/main.dart b/lib/main.dart index 81a44fd7..f98ab627 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -136,7 +136,7 @@ Future _bootstrapApp() async { // Initialize TV detection and PiP service for Android if (Platform.isAndroid) { - futures.add(TvDetectionService.getInstance()); + futures.add(TvDetectionService.getInstance(forceTv: settings.getForceTvMode())); // Initialize PiP service to listen for PiP state changes PipService(); } diff --git a/lib/screens/settings/appearance_settings_screen.dart b/lib/screens/settings/appearance_settings_screen.dart index 817c9011..a4228122 100644 --- a/lib/screens/settings/appearance_settings_screen.dart +++ b/lib/screens/settings/appearance_settings_screen.dart @@ -1,3 +1,5 @@ +import 'dart:io' show Platform; + import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; @@ -26,6 +28,7 @@ class _AppearanceSettingsScreenState extends State { bool _isLoading = true; bool _requireProfileSelectionOnOpen = false; bool _confirmExitOnBack = true; + bool _forceTvMode = false; @override void initState() { @@ -39,6 +42,7 @@ class _AppearanceSettingsScreenState extends State { setState(() { _requireProfileSelectionOnOpen = _settingsService.getRequireProfileSelectionOnOpen(); _confirmExitOnBack = _settingsService.getConfirmExitOnBack(); + _forceTvMode = _settingsService.getForceTvMode(); _isLoading = false; }); } @@ -73,6 +77,7 @@ class _AppearanceSettingsScreenState extends State { // --- Navigation --- SettingsSectionHeader(t.settings.navigation), + if (Platform.isAndroid) _buildForceTvMode(), if (PlatformDetector.shouldUseSideNavigation(context)) _buildAlwaysKeepSidebarOpen(), if (!PlatformDetector.shouldUseSideNavigation(context)) _buildShowNavBarLabels(), _buildShowUnwatchedCount(), @@ -368,6 +373,21 @@ class _AppearanceSettingsScreenState extends State { ); } + Widget _buildForceTvMode() { + return SwitchListTile( + secondary: const AppIcon(Symbols.tv_rounded, fill: 1), + title: Text(t.settings.forceTvMode), + subtitle: Text(t.settings.forceTvModeDescription), + value: _forceTvMode, + onChanged: (value) async { + setState(() => _forceTvMode = value); + await _settingsService.setForceTvMode(value); + TvDetectionService.setForceTVSync(value); + if (mounted) _restartApp(); + }, + ); + } + Widget _buildAutoHidePerformanceOverlay() { return Consumer( builder: (context, settingsProvider, child) { diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 0c7ec1ec..fe58dc63 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -112,6 +112,7 @@ class SettingsService extends BaseSharedPreferencesService { static const String _keySelectedExternalPlayer = 'selected_external_player'; static const String _keyCustomExternalPlayers = 'custom_external_players'; static const String _keyConfirmExitOnBack = 'confirm_exit_on_back'; + static const String _keyForceTvMode = 'force_tv_mode'; static const String _keyAmbientLighting = 'ambient_lighting'; static const String _keyAudioPassthrough = 'audio_passthrough'; static const String _keyAudioNormalization = 'audio_normalization'; @@ -1374,6 +1375,13 @@ class SettingsService extends BaseSharedPreferencesService { return prefs.getBool(_keyConfirmExitOnBack) ?? true; // Default: enabled } + // Force TV Mode (Android) + Future setForceTvMode(bool value) async { + await prefs.setBool(_keyForceTvMode, value); + } + + bool getForceTvMode() => prefs.getBool(_keyForceTvMode) ?? false; + // Ambient Lighting Future setAmbientLighting(bool enabled) async { await prefs.setBool(_keyAmbientLighting, enabled); @@ -1463,6 +1471,7 @@ class SettingsService extends BaseSharedPreferencesService { prefs.remove(_keySelectedExternalPlayer), prefs.remove(_keyCustomExternalPlayers), prefs.remove(_keyConfirmExitOnBack), + prefs.remove(_keyForceTvMode), prefs.remove(_keyAmbientLighting), prefs.remove(_keyAudioPassthrough), prefs.remove(_keyAudioNormalization), diff --git a/lib/utils/platform_detector.dart b/lib/utils/platform_detector.dart index 8bfc40ed..5015f3d8 100644 --- a/lib/utils/platform_detector.dart +++ b/lib/utils/platform_detector.dart @@ -7,36 +7,50 @@ import 'package:flutter/material.dart'; /// Service for detecting if the app is running on Android TV class TvDetectionService { static TvDetectionService? _instance; + bool _detected = false; + bool _forceTv = false; bool _isTV = false; bool _initialized = false; TvDetectionService._(); - /// Get the singleton instance, initializing if needed - static Future getInstance() async { + /// Get the singleton instance, initializing if needed. + /// Pass [forceTv] to combine a user override with the system-feature check. + static Future getInstance({bool forceTv = false}) async { if (_instance == null) { _instance = TvDetectionService._(); - await _instance!._detect(); + await _instance!._detect(forceTv); } return _instance!; } - Future _detect() async { + Future _detect(bool forceTv) async { if (_initialized) return; if (Platform.isAndroid) { final deviceInfo = DeviceInfoPlugin(); final androidInfo = await deviceInfo.androidInfo; // Check for android.software.leanback feature (standard Android TV detection) - _isTV = androidInfo.systemFeatures.contains('android.software.leanback'); + _detected = androidInfo.systemFeatures.contains('android.software.leanback'); } + _forceTv = forceTv; + _isTV = _detected || _forceTv; _initialized = true; } bool get isTV => _isTV; + /// Update the user force-TV override and recompute the effective flag. + void setForceTv(bool value) { + _forceTv = value; + _isTV = _detected || _forceTv; + } + /// Synchronous access after initialization (returns false if not initialized) static bool isTVSync() => _instance?._isTV ?? false; + + /// Convenience setter that forwards to the singleton if available. + static void setForceTVSync(bool value) => _instance?.setForceTv(value); } /// Utility class for platform detection