From d1d45c49981bdb4e9870a09f71559f97484bbef7 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:25:02 +0200 Subject: [PATCH] refactor: restyle subtitle styling and external player settings screens --- lib/i18n/da.i18n.json | 4 + lib/i18n/de.i18n.json | 4 + lib/i18n/en.i18n.json | 4 + lib/i18n/es.i18n.json | 4 + lib/i18n/fr.i18n.json | 4 + lib/i18n/it.i18n.json | 4 + lib/i18n/ja.i18n.json | 4 + lib/i18n/ko.i18n.json | 4 + lib/i18n/nb.i18n.json | 4 + lib/i18n/nl.i18n.json | 4 + lib/i18n/pl.i18n.json | 4 + lib/i18n/pt.i18n.json | 4 + lib/i18n/ru.i18n.json | 4 + lib/i18n/strings.g.dart | 4 +- lib/i18n/strings_da.g.dart | 12 +- lib/i18n/strings_de.g.dart | 12 +- lib/i18n/strings_en.g.dart | 20 +- lib/i18n/strings_es.g.dart | 12 +- lib/i18n/strings_fr.g.dart | 12 +- lib/i18n/strings_it.g.dart | 12 +- lib/i18n/strings_ja.g.dart | 12 +- lib/i18n/strings_ko.g.dart | 12 +- lib/i18n/strings_nb.g.dart | 12 +- lib/i18n/strings_nl.g.dart | 12 +- lib/i18n/strings_pl.g.dart | 12 +- lib/i18n/strings_pt.g.dart | 12 +- lib/i18n/strings_ru.g.dart | 12 +- lib/i18n/strings_sv.g.dart | 12 +- lib/i18n/strings_zh.g.dart | 12 +- lib/i18n/sv.i18n.json | 4 + lib/i18n/zh.i18n.json | 4 + .../settings/external_player_screen.dart | 71 +-- .../settings/subtitle_styling_screen.dart | 520 +++++------------- 33 files changed, 393 insertions(+), 450 deletions(-) diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index a7bcde2f..9f485d40 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Stilindstillinger", + "text": "Tekst", + "border": "Kant", + "background": "Baggrund", "fontSize": "Skriftstørrelse", "textColor": "Tekstfarve", "borderSize": "Kantstørrelse", @@ -847,6 +850,7 @@ "useExternalPlayer": "Brug ekstern afspiller", "useExternalPlayerDescription": "Åbn videoer i en ekstern app i stedet for den indbyggede afspiller", "selectPlayer": "Vælg afspiller", + "customPlayers": "Brugerdefinerede afspillere", "systemDefault": "Systemstandard", "addCustomPlayer": "Tilføj brugerdefineret afspiller", "playerName": "Afspillernavn", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index db8efa62..3efd312a 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Stiloptionen", + "text": "Text", + "border": "Rahmen", + "background": "Hintergrund", "fontSize": "Schriftgröße", "textColor": "Textfarbe", "borderSize": "Rahmengröße", @@ -847,6 +850,7 @@ "useExternalPlayer": "Externen Player verwenden", "useExternalPlayerDescription": "Videos in einer externen App statt im integrierten Player öffnen", "selectPlayer": "Player auswählen", + "customPlayers": "Benutzerdefinierte Player", "systemDefault": "Systemstandard", "addCustomPlayer": "Benutzerdefinierten Player hinzufügen", "playerName": "Playername", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 90b16080..73e0195f 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Styling Options", + "text": "Text", + "border": "Border", + "background": "Background", "fontSize": "Font Size", "textColor": "Text Color", "borderSize": "Border Size", @@ -847,6 +850,7 @@ "useExternalPlayer": "Use External Player", "useExternalPlayerDescription": "Open videos in an external app instead of the built-in player", "selectPlayer": "Select Player", + "customPlayers": "Custom Players", "systemDefault": "System Default", "addCustomPlayer": "Add Custom Player", "playerName": "Player Name", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 854cddaf..97c5fc4a 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Opciones de Estilo", + "text": "Texto", + "border": "Borde", + "background": "Fondo", "fontSize": "Tamaño de Fuente", "textColor": "Color de Texto", "borderSize": "Tamaño de Borde", @@ -847,6 +850,7 @@ "useExternalPlayer": "Usar reproductor externo", "useExternalPlayerDescription": "Abrir vídeos en una app externa en lugar del reproductor integrado", "selectPlayer": "Seleccionar reproductor", + "customPlayers": "Reproductores personalizados", "systemDefault": "Predeterminado del sistema", "addCustomPlayer": "Añadir reproductor personalizado", "playerName": "Nombre del reproductor", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 6eaea742..9ef429bc 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Options de style", + "text": "Texte", + "border": "Bordure", + "background": "Arrière-plan", "fontSize": "Taille de la police", "textColor": "Couleur du texte", "borderSize": "Taille de la bordure", @@ -847,6 +850,7 @@ "useExternalPlayer": "Utiliser un lecteur externe", "useExternalPlayerDescription": "Ouvrir les vidéos dans une application externe au lieu du lecteur intégré", "selectPlayer": "Sélectionner le lecteur", + "customPlayers": "Lecteurs personnalisés", "systemDefault": "Par défaut du système", "addCustomPlayer": "Ajouter un lecteur personnalisé", "playerName": "Nom du lecteur", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index e2abd694..a22d2aba 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Opzioni stile", + "text": "Testo", + "border": "Bordo", + "background": "Sfondo", "fontSize": "Dimensione", "textColor": "Colore testo", "borderSize": "Dimensione bordo", @@ -847,6 +850,7 @@ "useExternalPlayer": "Usa lettore esterno", "useExternalPlayerDescription": "Apri i video in un'app esterna invece del lettore integrato", "selectPlayer": "Seleziona lettore", + "customPlayers": "Lettori personalizzati", "systemDefault": "Predefinito di sistema", "addCustomPlayer": "Aggiungi lettore personalizzato", "playerName": "Nome lettore", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 8879952f..170c1028 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "スタイルオプション", + "text": "テキスト", + "border": "枠線", + "background": "背景", "fontSize": "フォントサイズ", "textColor": "テキストの色", "borderSize": "枠線サイズ", @@ -847,6 +850,7 @@ "useExternalPlayer": "外部プレーヤーを使用", "useExternalPlayerDescription": "内蔵プレーヤーの代わりに外部アプリで動画を開く", "selectPlayer": "プレーヤーを選択", + "customPlayers": "カスタムプレーヤー", "systemDefault": "システムデフォルト", "addCustomPlayer": "カスタムプレーヤーを追加", "playerName": "プレーヤー名", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 38c7b822..321ea23e 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "스타일 옵션", + "text": "텍스트", + "border": "테두리", + "background": "배경", "fontSize": "글자 크기", "textColor": "텍스트 색상", "borderSize": "테두리 크기", @@ -847,6 +850,7 @@ "useExternalPlayer": "외부 플레이어 사용", "useExternalPlayerDescription": "내장 플레이어 대신 외부 앱에서 동영상 열기", "selectPlayer": "플레이어 선택", + "customPlayers": "사용자 정의 플레이어", "systemDefault": "시스템 기본값", "addCustomPlayer": "사용자 정의 플레이어 추가", "playerName": "플레이어 이름", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 112b5db5..2a75132a 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Stilalternativer", + "text": "Tekst", + "border": "Kantlinje", + "background": "Bakgrunn", "fontSize": "Skriftstørrelse", "textColor": "Tekstfarge", "borderSize": "Kantstørrelse", @@ -847,6 +850,7 @@ "useExternalPlayer": "Bruk ekstern spiller", "useExternalPlayerDescription": "Åpne videoer i en ekstern app i stedet for den innebygde spilleren", "selectPlayer": "Velg spiller", + "customPlayers": "Egendefinerte spillere", "systemDefault": "Systemstandard", "addCustomPlayer": "Legg til egendefinert spiller", "playerName": "Spillernavn", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 2e8c07c3..1bb952e5 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Opmaak opties", + "text": "Tekst", + "border": "Rand", + "background": "Achtergrond", "fontSize": "Lettergrootte", "textColor": "Tekstkleur", "borderSize": "Rand grootte", @@ -847,6 +850,7 @@ "useExternalPlayer": "Externe speler gebruiken", "useExternalPlayerDescription": "Open video's in een externe app in plaats van de ingebouwde speler", "selectPlayer": "Speler selecteren", + "customPlayers": "Aangepaste spelers", "systemDefault": "Systeemstandaard", "addCustomPlayer": "Aangepaste speler toevoegen", "playerName": "Spelernaam", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index a92f75f1..5a98dbe6 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Opcje stylu", + "text": "Tekst", + "border": "Obramowanie", + "background": "Tło", "fontSize": "Rozmiar czcionki", "textColor": "Kolor tekstu", "borderSize": "Rozmiar obramowania", @@ -847,6 +850,7 @@ "useExternalPlayer": "Użyj zewnętrznego odtwarzacza", "useExternalPlayerDescription": "Otwieraj wideo w zewnętrznej aplikacji zamiast wbudowanego odtwarzacza", "selectPlayer": "Wybierz odtwarzacz", + "customPlayers": "Niestandardowe odtwarzacze", "systemDefault": "Domyślny systemowy", "addCustomPlayer": "Dodaj niestandardowy odtwarzacz", "playerName": "Nazwa odtwarzacza", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 3a6b034c..ba748a1e 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Opções de Estilo", + "text": "Texto", + "border": "Borda", + "background": "Fundo", "fontSize": "Tamanho da Fonte", "textColor": "Cor do Texto", "borderSize": "Tamanho da Borda", @@ -847,6 +850,7 @@ "useExternalPlayer": "Usar Player Externo", "useExternalPlayerDescription": "Abrir vídeos em um app externo em vez do player integrado", "selectPlayer": "Selecionar Player", + "customPlayers": "Players Personalizados", "systemDefault": "Padrão do Sistema", "addCustomPlayer": "Adicionar Player Personalizado", "playerName": "Nome do Player", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 88968489..2a89d694 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Параметры стиля", + "text": "Текст", + "border": "Обводка", + "background": "Фон", "fontSize": "Размер шрифта", "textColor": "Цвет текста", "borderSize": "Размер обводки", @@ -847,6 +850,7 @@ "useExternalPlayer": "Использовать внешний плеер", "useExternalPlayerDescription": "Открывать видео во внешнем приложении вместо встроенного плеера", "selectPlayer": "Выбрать плеер", + "customPlayers": "Свои плееры", "systemDefault": "Системный по умолчанию", "addCustomPlayer": "Добавить свой плеер", "playerName": "Название плеера", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index a7f9a27b..bc0e369a 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: 12690 (846 per locale) +/// Strings: 12750 (850 per locale) /// -/// Built on 2026-04-02 at 13:51 UTC +/// Built on 2026-04-03 at 15:21 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 a7ccb5db..e4262070 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingDa implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Stilindstillinger'; + @override String get text => 'Tekst'; + @override String get border => 'Kant'; + @override String get background => 'Baggrund'; @override String get fontSize => 'Skriftstørrelse'; @override String get textColor => 'Tekstfarve'; @override String get borderSize => 'Kantstørrelse'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerDa implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Brug ekstern afspiller'; @override String get useExternalPlayerDescription => 'Åbn videoer i en ekstern app i stedet for den indbyggede afspiller'; @override String get selectPlayer => 'Vælg afspiller'; + @override String get customPlayers => 'Brugerdefinerede afspillere'; @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Tilføj brugerdefineret afspiller'; @override String get playerName => 'Afspillernavn'; @@ -1748,6 +1752,9 @@ extension on TranslationsDa { 'messages.logsUploadFailed' => 'Kunne ikke uploade logs', 'messages.logId' => 'Log-ID', 'subtitlingStyling.stylingOptions' => 'Stilindstillinger', + 'subtitlingStyling.text' => 'Tekst', + 'subtitlingStyling.border' => 'Kant', + 'subtitlingStyling.background' => 'Baggrund', 'subtitlingStyling.fontSize' => 'Skriftstørrelse', 'subtitlingStyling.textColor' => 'Tekstfarve', 'subtitlingStyling.borderSize' => 'Kantstørrelse', @@ -1852,11 +1859,11 @@ extension on TranslationsDa { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Kunne ikke indlæse servere: ${error}', 'hubDetail.title' => 'Titel', 'hubDetail.releaseYear' => 'Udgivelsesår', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Tilføjelsesdato', 'hubDetail.rating' => 'Bedømmelse', 'hubDetail.noItemsFound' => 'Ingen elementer fundet', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Ryd logs', 'logs.copyLogs' => 'Kopiér logs', 'logs.uploadLogs' => 'Upload logs', @@ -2108,6 +2115,7 @@ extension on TranslationsDa { 'externalPlayer.useExternalPlayer' => 'Brug ekstern afspiller', 'externalPlayer.useExternalPlayerDescription' => 'Åbn videoer i en ekstern app i stedet for den indbyggede afspiller', 'externalPlayer.selectPlayer' => 'Vælg afspiller', + 'externalPlayer.customPlayers' => 'Brugerdefinerede afspillere', 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Tilføj brugerdefineret afspiller', 'externalPlayer.playerName' => 'Afspillernavn', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index dfb6f97e..22850e3e 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingDe implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Stiloptionen'; + @override String get text => 'Text'; + @override String get border => 'Rahmen'; + @override String get background => 'Hintergrund'; @override String get fontSize => 'Schriftgröße'; @override String get textColor => 'Textfarbe'; @override String get borderSize => 'Rahmengröße'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerDe implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Externen Player verwenden'; @override String get useExternalPlayerDescription => 'Videos in einer externen App statt im integrierten Player öffnen'; @override String get selectPlayer => 'Player auswählen'; + @override String get customPlayers => 'Benutzerdefinierte Player'; @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Benutzerdefinierten Player hinzufügen'; @override String get playerName => 'Playername'; @@ -1748,6 +1752,9 @@ extension on TranslationsDe { 'messages.logsUploadFailed' => 'Protokolle konnten nicht hochgeladen werden', 'messages.logId' => 'Protokoll-ID', 'subtitlingStyling.stylingOptions' => 'Stiloptionen', + 'subtitlingStyling.text' => 'Text', + 'subtitlingStyling.border' => 'Rahmen', + 'subtitlingStyling.background' => 'Hintergrund', 'subtitlingStyling.fontSize' => 'Schriftgröße', 'subtitlingStyling.textColor' => 'Textfarbe', 'subtitlingStyling.borderSize' => 'Rahmengröße', @@ -1852,11 +1859,11 @@ extension on TranslationsDe { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Server konnten nicht geladen werden: ${error}', 'hubDetail.title' => 'Titel', 'hubDetail.releaseYear' => 'Erscheinungsjahr', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Hinzugefügt am', 'hubDetail.rating' => 'Bewertung', 'hubDetail.noItemsFound' => 'Keine Elemente gefunden', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Protokolle löschen', 'logs.copyLogs' => 'Protokolle kopieren', 'logs.uploadLogs' => 'Protokolle hochladen', @@ -2108,6 +2115,7 @@ extension on TranslationsDe { 'externalPlayer.useExternalPlayer' => 'Externen Player verwenden', 'externalPlayer.useExternalPlayerDescription' => 'Videos in einer externen App statt im integrierten Player öffnen', 'externalPlayer.selectPlayer' => 'Player auswählen', + 'externalPlayer.customPlayers' => 'Benutzerdefinierte Player', 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Benutzerdefinierten Player hinzufügen', 'externalPlayer.playerName' => 'Playername', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 41117b9a..87f7db7c 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -1364,6 +1364,15 @@ class TranslationsSubtitlingStylingEn { /// en: 'Styling Options' String get stylingOptions => 'Styling Options'; + /// en: 'Text' + String get text => 'Text'; + + /// en: 'Border' + String get border => 'Border'; + + /// en: 'Background' + String get background => 'Background'; + /// en: 'Font Size' String get fontSize => 'Font Size'; @@ -2385,6 +2394,9 @@ class TranslationsExternalPlayerEn { /// en: 'Select Player' String get selectPlayer => 'Select Player'; + /// en: 'Custom Players' + String get customPlayers => 'Custom Players'; + /// en: 'System Default' String get systemDefault => 'System Default'; @@ -3447,6 +3459,9 @@ extension on Translations { 'messages.logsUploadFailed' => 'Failed to upload logs', 'messages.logId' => 'Log ID', 'subtitlingStyling.stylingOptions' => 'Styling Options', + 'subtitlingStyling.text' => 'Text', + 'subtitlingStyling.border' => 'Border', + 'subtitlingStyling.background' => 'Background', 'subtitlingStyling.fontSize' => 'Font Size', 'subtitlingStyling.textColor' => 'Text Color', 'subtitlingStyling.borderSize' => 'Border Size', @@ -3551,11 +3566,11 @@ extension on Translations { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Failed to load servers: ${error}', 'hubDetail.title' => 'Title', 'hubDetail.releaseYear' => 'Release Year', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Date Added', 'hubDetail.rating' => 'Rating', 'hubDetail.noItemsFound' => 'No items found', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Clear Logs', 'logs.copyLogs' => 'Copy Logs', 'logs.uploadLogs' => 'Upload Logs', @@ -3807,6 +3822,7 @@ extension on Translations { 'externalPlayer.useExternalPlayer' => 'Use External Player', 'externalPlayer.useExternalPlayerDescription' => 'Open videos in an external app instead of the built-in player', 'externalPlayer.selectPlayer' => 'Select Player', + 'externalPlayer.customPlayers' => 'Custom Players', 'externalPlayer.systemDefault' => 'System Default', 'externalPlayer.addCustomPlayer' => 'Add Custom Player', 'externalPlayer.playerName' => 'Player Name', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 0dcf34f0..53c6b4bb 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingEs implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Opciones de Estilo'; + @override String get text => 'Texto'; + @override String get border => 'Borde'; + @override String get background => 'Fondo'; @override String get fontSize => 'Tamaño de Fuente'; @override String get textColor => 'Color de Texto'; @override String get borderSize => 'Tamaño de Borde'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerEs implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Usar reproductor externo'; @override String get useExternalPlayerDescription => 'Abrir vídeos en una app externa en lugar del reproductor integrado'; @override String get selectPlayer => 'Seleccionar reproductor'; + @override String get customPlayers => 'Reproductores personalizados'; @override String get systemDefault => 'Predeterminado del sistema'; @override String get addCustomPlayer => 'Añadir reproductor personalizado'; @override String get playerName => 'Nombre del reproductor'; @@ -1748,6 +1752,9 @@ extension on TranslationsEs { 'messages.logsUploadFailed' => 'Error al subir registros', 'messages.logId' => 'ID de registro', 'subtitlingStyling.stylingOptions' => 'Opciones de Estilo', + 'subtitlingStyling.text' => 'Texto', + 'subtitlingStyling.border' => 'Borde', + 'subtitlingStyling.background' => 'Fondo', 'subtitlingStyling.fontSize' => 'Tamaño de Fuente', 'subtitlingStyling.textColor' => 'Color de Texto', 'subtitlingStyling.borderSize' => 'Tamaño de Borde', @@ -1852,11 +1859,11 @@ extension on TranslationsEs { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Error al cargar servidores: ${error}', 'hubDetail.title' => 'Título', 'hubDetail.releaseYear' => 'Año de lanzamiento', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Añadido el', 'hubDetail.rating' => 'Calificación', 'hubDetail.noItemsFound' => 'No se encontraron elementos', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Borrar Logs', 'logs.copyLogs' => 'Copiar Logs', 'logs.uploadLogs' => 'Subir registros', @@ -2108,6 +2115,7 @@ extension on TranslationsEs { 'externalPlayer.useExternalPlayer' => 'Usar reproductor externo', 'externalPlayer.useExternalPlayerDescription' => 'Abrir vídeos en una app externa en lugar del reproductor integrado', 'externalPlayer.selectPlayer' => 'Seleccionar reproductor', + 'externalPlayer.customPlayers' => 'Reproductores personalizados', 'externalPlayer.systemDefault' => 'Predeterminado del sistema', 'externalPlayer.addCustomPlayer' => 'Añadir reproductor personalizado', 'externalPlayer.playerName' => 'Nombre del reproductor', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index da0aa84f..a0145bef 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingFr implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Options de style'; + @override String get text => 'Texte'; + @override String get border => 'Bordure'; + @override String get background => 'Arrière-plan'; @override String get fontSize => 'Taille de la police'; @override String get textColor => 'Couleur du texte'; @override String get borderSize => 'Taille de la bordure'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerFr implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Utiliser un lecteur externe'; @override String get useExternalPlayerDescription => 'Ouvrir les vidéos dans une application externe au lieu du lecteur intégré'; @override String get selectPlayer => 'Sélectionner le lecteur'; + @override String get customPlayers => 'Lecteurs personnalisés'; @override String get systemDefault => 'Par défaut du système'; @override String get addCustomPlayer => 'Ajouter un lecteur personnalisé'; @override String get playerName => 'Nom du lecteur'; @@ -1748,6 +1752,9 @@ extension on TranslationsFr { 'messages.logsUploadFailed' => 'Échec de l\'envoi des logs', 'messages.logId' => 'ID du log', 'subtitlingStyling.stylingOptions' => 'Options de style', + 'subtitlingStyling.text' => 'Texte', + 'subtitlingStyling.border' => 'Bordure', + 'subtitlingStyling.background' => 'Arrière-plan', 'subtitlingStyling.fontSize' => 'Taille de la police', 'subtitlingStyling.textColor' => 'Couleur du texte', 'subtitlingStyling.borderSize' => 'Taille de la bordure', @@ -1852,11 +1859,11 @@ extension on TranslationsFr { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Échec du chargement des serveurs: ${error}', 'hubDetail.title' => 'Titre', 'hubDetail.releaseYear' => 'Année de sortie', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Date d\'ajout', 'hubDetail.rating' => 'Évaluation', 'hubDetail.noItemsFound' => 'Aucun élément trouvé', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Effacer les logs', 'logs.copyLogs' => 'Copier les logs', 'logs.uploadLogs' => 'Envoyer les logs', @@ -2108,6 +2115,7 @@ extension on TranslationsFr { 'externalPlayer.useExternalPlayer' => 'Utiliser un lecteur externe', 'externalPlayer.useExternalPlayerDescription' => 'Ouvrir les vidéos dans une application externe au lieu du lecteur intégré', 'externalPlayer.selectPlayer' => 'Sélectionner le lecteur', + 'externalPlayer.customPlayers' => 'Lecteurs personnalisés', 'externalPlayer.systemDefault' => 'Par défaut du système', 'externalPlayer.addCustomPlayer' => 'Ajouter un lecteur personnalisé', 'externalPlayer.playerName' => 'Nom du lecteur', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 507fa717..4744d359 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingIt implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Opzioni stile'; + @override String get text => 'Testo'; + @override String get border => 'Bordo'; + @override String get background => 'Sfondo'; @override String get fontSize => 'Dimensione'; @override String get textColor => 'Colore testo'; @override String get borderSize => 'Dimensione bordo'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerIt implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Usa lettore esterno'; @override String get useExternalPlayerDescription => 'Apri i video in un\'app esterna invece del lettore integrato'; @override String get selectPlayer => 'Seleziona lettore'; + @override String get customPlayers => 'Lettori personalizzati'; @override String get systemDefault => 'Predefinito di sistema'; @override String get addCustomPlayer => 'Aggiungi lettore personalizzato'; @override String get playerName => 'Nome lettore'; @@ -1748,6 +1752,9 @@ extension on TranslationsIt { 'messages.logsUploadFailed' => 'Caricamento log fallito', 'messages.logId' => 'ID log', 'subtitlingStyling.stylingOptions' => 'Opzioni stile', + 'subtitlingStyling.text' => 'Testo', + 'subtitlingStyling.border' => 'Bordo', + 'subtitlingStyling.background' => 'Sfondo', 'subtitlingStyling.fontSize' => 'Dimensione', 'subtitlingStyling.textColor' => 'Colore testo', 'subtitlingStyling.borderSize' => 'Dimensione bordo', @@ -1852,11 +1859,11 @@ extension on TranslationsIt { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Impossibile caricare i server: ${error}', 'hubDetail.title' => 'Titolo', 'hubDetail.releaseYear' => 'Anno rilascio', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Data aggiunta', 'hubDetail.rating' => 'Valutazione', 'hubDetail.noItemsFound' => 'Nessun elemento trovato', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Cancella log', 'logs.copyLogs' => 'Copia log', 'logs.uploadLogs' => 'Carica log', @@ -2108,6 +2115,7 @@ extension on TranslationsIt { 'externalPlayer.useExternalPlayer' => 'Usa lettore esterno', 'externalPlayer.useExternalPlayerDescription' => 'Apri i video in un\'app esterna invece del lettore integrato', 'externalPlayer.selectPlayer' => 'Seleziona lettore', + 'externalPlayer.customPlayers' => 'Lettori personalizzati', 'externalPlayer.systemDefault' => 'Predefinito di sistema', 'externalPlayer.addCustomPlayer' => 'Aggiungi lettore personalizzato', 'externalPlayer.playerName' => 'Nome lettore', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 3c18d7e8..3967366e 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingJa implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'スタイルオプション'; + @override String get text => 'テキスト'; + @override String get border => '枠線'; + @override String get background => '背景'; @override String get fontSize => 'フォントサイズ'; @override String get textColor => 'テキストの色'; @override String get borderSize => '枠線サイズ'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerJa implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => '外部プレーヤーを使用'; @override String get useExternalPlayerDescription => '内蔵プレーヤーの代わりに外部アプリで動画を開く'; @override String get selectPlayer => 'プレーヤーを選択'; + @override String get customPlayers => 'カスタムプレーヤー'; @override String get systemDefault => 'システムデフォルト'; @override String get addCustomPlayer => 'カスタムプレーヤーを追加'; @override String get playerName => 'プレーヤー名'; @@ -1748,6 +1752,9 @@ extension on TranslationsJa { 'messages.logsUploadFailed' => 'ログのアップロードに失敗しました', 'messages.logId' => 'ログID', 'subtitlingStyling.stylingOptions' => 'スタイルオプション', + 'subtitlingStyling.text' => 'テキスト', + 'subtitlingStyling.border' => '枠線', + 'subtitlingStyling.background' => '背景', 'subtitlingStyling.fontSize' => 'フォントサイズ', 'subtitlingStyling.textColor' => 'テキストの色', 'subtitlingStyling.borderSize' => '枠線サイズ', @@ -1852,11 +1859,11 @@ extension on TranslationsJa { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'サーバーの読み込みに失敗しました: ${error}', 'hubDetail.title' => 'タイトル', 'hubDetail.releaseYear' => '公開年', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => '追加日', 'hubDetail.rating' => '評価', 'hubDetail.noItemsFound' => 'アイテムが見つかりません', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'ログをクリア', 'logs.copyLogs' => 'ログをコピー', 'logs.uploadLogs' => 'ログをアップロード', @@ -2108,6 +2115,7 @@ extension on TranslationsJa { 'externalPlayer.useExternalPlayer' => '外部プレーヤーを使用', 'externalPlayer.useExternalPlayerDescription' => '内蔵プレーヤーの代わりに外部アプリで動画を開く', 'externalPlayer.selectPlayer' => 'プレーヤーを選択', + 'externalPlayer.customPlayers' => 'カスタムプレーヤー', 'externalPlayer.systemDefault' => 'システムデフォルト', 'externalPlayer.addCustomPlayer' => 'カスタムプレーヤーを追加', 'externalPlayer.playerName' => 'プレーヤー名', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 2e033e7d..f8834cfb 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingKo implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => '스타일 옵션'; + @override String get text => '텍스트'; + @override String get border => '테두리'; + @override String get background => '배경'; @override String get fontSize => '글자 크기'; @override String get textColor => '텍스트 색상'; @override String get borderSize => '테두리 크기'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerKo implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => '외부 플레이어 사용'; @override String get useExternalPlayerDescription => '내장 플레이어 대신 외부 앱에서 동영상 열기'; @override String get selectPlayer => '플레이어 선택'; + @override String get customPlayers => '사용자 정의 플레이어'; @override String get systemDefault => '시스템 기본값'; @override String get addCustomPlayer => '사용자 정의 플레이어 추가'; @override String get playerName => '플레이어 이름'; @@ -1748,6 +1752,9 @@ extension on TranslationsKo { 'messages.logsUploadFailed' => '로그 업로드 실패', 'messages.logId' => '로그 ID', 'subtitlingStyling.stylingOptions' => '스타일 옵션', + 'subtitlingStyling.text' => '텍스트', + 'subtitlingStyling.border' => '테두리', + 'subtitlingStyling.background' => '배경', 'subtitlingStyling.fontSize' => '글자 크기', 'subtitlingStyling.textColor' => '텍스트 색상', 'subtitlingStyling.borderSize' => '테두리 크기', @@ -1852,11 +1859,11 @@ extension on TranslationsKo { 'serverSelection.failedToLoadServers' => ({required Object error}) => '서버를 로드할 수 없습니다: ${error}', 'hubDetail.title' => '제목', 'hubDetail.releaseYear' => '출시 연도', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => '추가 날짜', 'hubDetail.rating' => '평점', 'hubDetail.noItemsFound' => '항목이 없습니다', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => '로그 지우기', 'logs.copyLogs' => '로그 복사', 'logs.uploadLogs' => '로그 업로드', @@ -2108,6 +2115,7 @@ extension on TranslationsKo { 'externalPlayer.useExternalPlayer' => '외부 플레이어 사용', 'externalPlayer.useExternalPlayerDescription' => '내장 플레이어 대신 외부 앱에서 동영상 열기', 'externalPlayer.selectPlayer' => '플레이어 선택', + 'externalPlayer.customPlayers' => '사용자 정의 플레이어', 'externalPlayer.systemDefault' => '시스템 기본값', 'externalPlayer.addCustomPlayer' => '사용자 정의 플레이어 추가', 'externalPlayer.playerName' => '플레이어 이름', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 722d8190..59b642b5 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingNb implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Stilalternativer'; + @override String get text => 'Tekst'; + @override String get border => 'Kantlinje'; + @override String get background => 'Bakgrunn'; @override String get fontSize => 'Skriftstørrelse'; @override String get textColor => 'Tekstfarge'; @override String get borderSize => 'Kantstørrelse'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerNb implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Bruk ekstern spiller'; @override String get useExternalPlayerDescription => 'Åpne videoer i en ekstern app i stedet for den innebygde spilleren'; @override String get selectPlayer => 'Velg spiller'; + @override String get customPlayers => 'Egendefinerte spillere'; @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Legg til egendefinert spiller'; @override String get playerName => 'Spillernavn'; @@ -1748,6 +1752,9 @@ extension on TranslationsNb { 'messages.logsUploadFailed' => 'Kunne ikke laste opp logger', 'messages.logId' => 'Logg-ID', 'subtitlingStyling.stylingOptions' => 'Stilalternativer', + 'subtitlingStyling.text' => 'Tekst', + 'subtitlingStyling.border' => 'Kantlinje', + 'subtitlingStyling.background' => 'Bakgrunn', 'subtitlingStyling.fontSize' => 'Skriftstørrelse', 'subtitlingStyling.textColor' => 'Tekstfarge', 'subtitlingStyling.borderSize' => 'Kantstørrelse', @@ -1852,11 +1859,11 @@ extension on TranslationsNb { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Kunne ikke laste servere: ${error}', 'hubDetail.title' => 'Tittel', 'hubDetail.releaseYear' => 'Utgivelsesår', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Dato lagt til', 'hubDetail.rating' => 'Vurdering', 'hubDetail.noItemsFound' => 'Ingen elementer funnet', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Tøm logger', 'logs.copyLogs' => 'Kopier logger', 'logs.uploadLogs' => 'Last opp logger', @@ -2108,6 +2115,7 @@ extension on TranslationsNb { 'externalPlayer.useExternalPlayer' => 'Bruk ekstern spiller', 'externalPlayer.useExternalPlayerDescription' => 'Åpne videoer i en ekstern app i stedet for den innebygde spilleren', 'externalPlayer.selectPlayer' => 'Velg spiller', + 'externalPlayer.customPlayers' => 'Egendefinerte spillere', 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Legg til egendefinert spiller', 'externalPlayer.playerName' => 'Spillernavn', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 427fa529..8c3b8e87 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingNl implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Opmaak opties'; + @override String get text => 'Tekst'; + @override String get border => 'Rand'; + @override String get background => 'Achtergrond'; @override String get fontSize => 'Lettergrootte'; @override String get textColor => 'Tekstkleur'; @override String get borderSize => 'Rand grootte'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerNl implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Externe speler gebruiken'; @override String get useExternalPlayerDescription => 'Open video\'s in een externe app in plaats van de ingebouwde speler'; @override String get selectPlayer => 'Speler selecteren'; + @override String get customPlayers => 'Aangepaste spelers'; @override String get systemDefault => 'Systeemstandaard'; @override String get addCustomPlayer => 'Aangepaste speler toevoegen'; @override String get playerName => 'Spelernaam'; @@ -1748,6 +1752,9 @@ extension on TranslationsNl { 'messages.logsUploadFailed' => 'Uploaden van logs mislukt', 'messages.logId' => 'Log-ID', 'subtitlingStyling.stylingOptions' => 'Opmaak opties', + 'subtitlingStyling.text' => 'Tekst', + 'subtitlingStyling.border' => 'Rand', + 'subtitlingStyling.background' => 'Achtergrond', 'subtitlingStyling.fontSize' => 'Lettergrootte', 'subtitlingStyling.textColor' => 'Tekstkleur', 'subtitlingStyling.borderSize' => 'Rand grootte', @@ -1852,11 +1859,11 @@ extension on TranslationsNl { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Kon servers niet laden: ${error}', 'hubDetail.title' => 'Titel', 'hubDetail.releaseYear' => 'Uitgavejaar', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Datum toegevoegd', 'hubDetail.rating' => 'Beoordeling', 'hubDetail.noItemsFound' => 'Geen items gevonden', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Wis logs', 'logs.copyLogs' => 'Kopieer logs', 'logs.uploadLogs' => 'Logs uploaden', @@ -2108,6 +2115,7 @@ extension on TranslationsNl { 'externalPlayer.useExternalPlayer' => 'Externe speler gebruiken', 'externalPlayer.useExternalPlayerDescription' => 'Open video\'s in een externe app in plaats van de ingebouwde speler', 'externalPlayer.selectPlayer' => 'Speler selecteren', + 'externalPlayer.customPlayers' => 'Aangepaste spelers', 'externalPlayer.systemDefault' => 'Systeemstandaard', 'externalPlayer.addCustomPlayer' => 'Aangepaste speler toevoegen', 'externalPlayer.playerName' => 'Spelernaam', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 07a79309..598b5382 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingPl implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Opcje stylu'; + @override String get text => 'Tekst'; + @override String get border => 'Obramowanie'; + @override String get background => 'Tło'; @override String get fontSize => 'Rozmiar czcionki'; @override String get textColor => 'Kolor tekstu'; @override String get borderSize => 'Rozmiar obramowania'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerPl implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Użyj zewnętrznego odtwarzacza'; @override String get useExternalPlayerDescription => 'Otwieraj wideo w zewnętrznej aplikacji zamiast wbudowanego odtwarzacza'; @override String get selectPlayer => 'Wybierz odtwarzacz'; + @override String get customPlayers => 'Niestandardowe odtwarzacze'; @override String get systemDefault => 'Domyślny systemowy'; @override String get addCustomPlayer => 'Dodaj niestandardowy odtwarzacz'; @override String get playerName => 'Nazwa odtwarzacza'; @@ -1748,6 +1752,9 @@ extension on TranslationsPl { 'messages.logsUploadFailed' => 'Nie udało się przesłać logów', 'messages.logId' => 'ID logu', 'subtitlingStyling.stylingOptions' => 'Opcje stylu', + 'subtitlingStyling.text' => 'Tekst', + 'subtitlingStyling.border' => 'Obramowanie', + 'subtitlingStyling.background' => 'Tło', 'subtitlingStyling.fontSize' => 'Rozmiar czcionki', 'subtitlingStyling.textColor' => 'Kolor tekstu', 'subtitlingStyling.borderSize' => 'Rozmiar obramowania', @@ -1852,11 +1859,11 @@ extension on TranslationsPl { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Nie udało się załadować serwerów: ${error}', 'hubDetail.title' => 'Tytuł', 'hubDetail.releaseYear' => 'Rok premiery', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Data dodania', 'hubDetail.rating' => 'Ocena', 'hubDetail.noItemsFound' => 'Nie znaleziono elementów', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Wyczyść logi', 'logs.copyLogs' => 'Kopiuj logi', 'logs.uploadLogs' => 'Prześlij logi', @@ -2108,6 +2115,7 @@ extension on TranslationsPl { 'externalPlayer.useExternalPlayer' => 'Użyj zewnętrznego odtwarzacza', 'externalPlayer.useExternalPlayerDescription' => 'Otwieraj wideo w zewnętrznej aplikacji zamiast wbudowanego odtwarzacza', 'externalPlayer.selectPlayer' => 'Wybierz odtwarzacz', + 'externalPlayer.customPlayers' => 'Niestandardowe odtwarzacze', 'externalPlayer.systemDefault' => 'Domyślny systemowy', 'externalPlayer.addCustomPlayer' => 'Dodaj niestandardowy odtwarzacz', 'externalPlayer.playerName' => 'Nazwa odtwarzacza', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 9bdcddc2..94fc5205 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingPt implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Opções de Estilo'; + @override String get text => 'Texto'; + @override String get border => 'Borda'; + @override String get background => 'Fundo'; @override String get fontSize => 'Tamanho da Fonte'; @override String get textColor => 'Cor do Texto'; @override String get borderSize => 'Tamanho da Borda'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerPt implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Usar Player Externo'; @override String get useExternalPlayerDescription => 'Abrir vídeos em um app externo em vez do player integrado'; @override String get selectPlayer => 'Selecionar Player'; + @override String get customPlayers => 'Players Personalizados'; @override String get systemDefault => 'Padrão do Sistema'; @override String get addCustomPlayer => 'Adicionar Player Personalizado'; @override String get playerName => 'Nome do Player'; @@ -1748,6 +1752,9 @@ extension on TranslationsPt { 'messages.logsUploadFailed' => 'Falha ao enviar logs', 'messages.logId' => 'ID do Log', 'subtitlingStyling.stylingOptions' => 'Opções de Estilo', + 'subtitlingStyling.text' => 'Texto', + 'subtitlingStyling.border' => 'Borda', + 'subtitlingStyling.background' => 'Fundo', 'subtitlingStyling.fontSize' => 'Tamanho da Fonte', 'subtitlingStyling.textColor' => 'Cor do Texto', 'subtitlingStyling.borderSize' => 'Tamanho da Borda', @@ -1852,11 +1859,11 @@ extension on TranslationsPt { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Falha ao carregar servidores: ${error}', 'hubDetail.title' => 'Título', 'hubDetail.releaseYear' => 'Ano de Lançamento', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Data de Adição', 'hubDetail.rating' => 'Avaliação', 'hubDetail.noItemsFound' => 'Nenhum item encontrado', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Limpar Logs', 'logs.copyLogs' => 'Copiar Logs', 'logs.uploadLogs' => 'Enviar Logs', @@ -2108,6 +2115,7 @@ extension on TranslationsPt { 'externalPlayer.useExternalPlayer' => 'Usar Player Externo', 'externalPlayer.useExternalPlayerDescription' => 'Abrir vídeos em um app externo em vez do player integrado', 'externalPlayer.selectPlayer' => 'Selecionar Player', + 'externalPlayer.customPlayers' => 'Players Personalizados', 'externalPlayer.systemDefault' => 'Padrão do Sistema', 'externalPlayer.addCustomPlayer' => 'Adicionar Player Personalizado', 'externalPlayer.playerName' => 'Nome do Player', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index 99e90719..610c565b 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingRu implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Параметры стиля'; + @override String get text => 'Текст'; + @override String get border => 'Обводка'; + @override String get background => 'Фон'; @override String get fontSize => 'Размер шрифта'; @override String get textColor => 'Цвет текста'; @override String get borderSize => 'Размер обводки'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerRu implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Использовать внешний плеер'; @override String get useExternalPlayerDescription => 'Открывать видео во внешнем приложении вместо встроенного плеера'; @override String get selectPlayer => 'Выбрать плеер'; + @override String get customPlayers => 'Свои плееры'; @override String get systemDefault => 'Системный по умолчанию'; @override String get addCustomPlayer => 'Добавить свой плеер'; @override String get playerName => 'Название плеера'; @@ -1748,6 +1752,9 @@ extension on TranslationsRu { 'messages.logsUploadFailed' => 'Не удалось загрузить логи', 'messages.logId' => 'ID лога', 'subtitlingStyling.stylingOptions' => 'Параметры стиля', + 'subtitlingStyling.text' => 'Текст', + 'subtitlingStyling.border' => 'Обводка', + 'subtitlingStyling.background' => 'Фон', 'subtitlingStyling.fontSize' => 'Размер шрифта', 'subtitlingStyling.textColor' => 'Цвет текста', 'subtitlingStyling.borderSize' => 'Размер обводки', @@ -1852,11 +1859,11 @@ extension on TranslationsRu { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Не удалось загрузить серверы: ${error}', 'hubDetail.title' => 'Название', 'hubDetail.releaseYear' => 'Год выпуска', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Дата добавления', 'hubDetail.rating' => 'Рейтинг', 'hubDetail.noItemsFound' => 'Элементы не найдены', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Очистить логи', 'logs.copyLogs' => 'Скопировать логи', 'logs.uploadLogs' => 'Загрузить логи', @@ -2108,6 +2115,7 @@ extension on TranslationsRu { 'externalPlayer.useExternalPlayer' => 'Использовать внешний плеер', 'externalPlayer.useExternalPlayerDescription' => 'Открывать видео во внешнем приложении вместо встроенного плеера', 'externalPlayer.selectPlayer' => 'Выбрать плеер', + 'externalPlayer.customPlayers' => 'Свои плееры', 'externalPlayer.systemDefault' => 'Системный по умолчанию', 'externalPlayer.addCustomPlayer' => 'Добавить свой плеер', 'externalPlayer.playerName' => 'Название плеера', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 281a887e..f5eb8a9d 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingSv implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => 'Stilalternativ'; + @override String get text => 'Text'; + @override String get border => 'Kantlinje'; + @override String get background => 'Bakgrund'; @override String get fontSize => 'Teckenstorlek'; @override String get textColor => 'Textfärg'; @override String get borderSize => 'Kantstorlek'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerSv implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => 'Använd extern spelare'; @override String get useExternalPlayerDescription => 'Öppna videor i en extern app istället för den inbyggda spelaren'; @override String get selectPlayer => 'Välj spelare'; + @override String get customPlayers => 'Anpassade spelare'; @override String get systemDefault => 'Systemstandard'; @override String get addCustomPlayer => 'Lägg till anpassad spelare'; @override String get playerName => 'Spelarnamn'; @@ -1748,6 +1752,9 @@ extension on TranslationsSv { 'messages.logsUploadFailed' => 'Uppladdning av loggar misslyckades', 'messages.logId' => 'Logg-ID', 'subtitlingStyling.stylingOptions' => 'Stilalternativ', + 'subtitlingStyling.text' => 'Text', + 'subtitlingStyling.border' => 'Kantlinje', + 'subtitlingStyling.background' => 'Bakgrund', 'subtitlingStyling.fontSize' => 'Teckenstorlek', 'subtitlingStyling.textColor' => 'Textfärg', 'subtitlingStyling.borderSize' => 'Kantstorlek', @@ -1852,11 +1859,11 @@ extension on TranslationsSv { 'serverSelection.failedToLoadServers' => ({required Object error}) => 'Misslyckades att ladda servrar: ${error}', 'hubDetail.title' => 'Titel', 'hubDetail.releaseYear' => 'Utgivningsår', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => 'Datum tillagd', 'hubDetail.rating' => 'Betyg', 'hubDetail.noItemsFound' => 'Inga objekt hittades', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => 'Rensa loggar', 'logs.copyLogs' => 'Kopiera loggar', 'logs.uploadLogs' => 'Ladda upp loggar', @@ -2108,6 +2115,7 @@ extension on TranslationsSv { 'externalPlayer.useExternalPlayer' => 'Använd extern spelare', 'externalPlayer.useExternalPlayerDescription' => 'Öppna videor i en extern app istället för den inbyggda spelaren', 'externalPlayer.selectPlayer' => 'Välj spelare', + 'externalPlayer.customPlayers' => 'Anpassade spelare', 'externalPlayer.systemDefault' => 'Systemstandard', 'externalPlayer.addCustomPlayer' => 'Lägg till anpassad spelare', 'externalPlayer.playerName' => 'Spelarnamn', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index f0246122..5c6e13d6 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -600,6 +600,9 @@ class _TranslationsSubtitlingStylingZh implements TranslationsSubtitlingStylingE // Translations @override String get stylingOptions => '样式选项'; + @override String get text => '文本'; + @override String get border => '边框'; + @override String get background => '背景'; @override String get fontSize => '字号'; @override String get textColor => '文本颜色'; @override String get borderSize => '边框大小'; @@ -1063,6 +1066,7 @@ class _TranslationsExternalPlayerZh implements TranslationsExternalPlayerEn { @override String get useExternalPlayer => '使用外部播放器'; @override String get useExternalPlayerDescription => '在外部应用中打开视频,而不是使用内置播放器'; @override String get selectPlayer => '选择播放器'; + @override String get customPlayers => '自定义播放器'; @override String get systemDefault => '系统默认'; @override String get addCustomPlayer => '添加自定义播放器'; @override String get playerName => '播放器名称'; @@ -1748,6 +1752,9 @@ extension on TranslationsZh { 'messages.logsUploadFailed' => '上传日志失败', 'messages.logId' => '日志 ID', 'subtitlingStyling.stylingOptions' => '样式选项', + 'subtitlingStyling.text' => '文本', + 'subtitlingStyling.border' => '边框', + 'subtitlingStyling.background' => '背景', 'subtitlingStyling.fontSize' => '字号', 'subtitlingStyling.textColor' => '文本颜色', 'subtitlingStyling.borderSize' => '边框大小', @@ -1852,11 +1859,11 @@ extension on TranslationsZh { 'serverSelection.failedToLoadServers' => ({required Object error}) => '无法加载服务器: ${error}', 'hubDetail.title' => '标题', 'hubDetail.releaseYear' => '发行年份', + _ => null, + } ?? switch (path) { 'hubDetail.dateAdded' => '添加日期', 'hubDetail.rating' => '评分', 'hubDetail.noItemsFound' => '未找到项目', - _ => null, - } ?? switch (path) { 'logs.clearLogs' => '清除日志', 'logs.copyLogs' => '复制日志', 'logs.uploadLogs' => '上传日志', @@ -2108,6 +2115,7 @@ extension on TranslationsZh { 'externalPlayer.useExternalPlayer' => '使用外部播放器', 'externalPlayer.useExternalPlayerDescription' => '在外部应用中打开视频,而不是使用内置播放器', 'externalPlayer.selectPlayer' => '选择播放器', + 'externalPlayer.customPlayers' => '自定义播放器', 'externalPlayer.systemDefault' => '系统默认', 'externalPlayer.addCustomPlayer' => '添加自定义播放器', 'externalPlayer.playerName' => '播放器名称', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 688137ec..a4322ebf 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "Stilalternativ", + "text": "Text", + "border": "Kantlinje", + "background": "Bakgrund", "fontSize": "Teckenstorlek", "textColor": "Textfärg", "borderSize": "Kantstorlek", @@ -847,6 +850,7 @@ "useExternalPlayer": "Använd extern spelare", "useExternalPlayerDescription": "Öppna videor i en extern app istället för den inbyggda spelaren", "selectPlayer": "Välj spelare", + "customPlayers": "Anpassade spelare", "systemDefault": "Systemstandard", "addCustomPlayer": "Lägg till anpassad spelare", "playerName": "Spelarnamn", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 6e341b7d..38d0d701 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -439,6 +439,9 @@ }, "subtitlingStyling": { "stylingOptions": "样式选项", + "text": "文本", + "border": "边框", + "background": "背景", "fontSize": "字号", "textColor": "文本颜色", "borderSize": "边框大小", @@ -847,6 +850,7 @@ "useExternalPlayer": "使用外部播放器", "useExternalPlayerDescription": "在外部应用中打开视频,而不是使用内置播放器", "selectPlayer": "选择播放器", + "customPlayers": "自定义播放器", "systemDefault": "系统默认", "addCustomPlayer": "添加自定义播放器", "playerName": "播放器名称", diff --git a/lib/screens/settings/external_player_screen.dart b/lib/screens/settings/external_player_screen.dart index 0b0640be..79b0d883 100644 --- a/lib/screens/settings/external_player_screen.dart +++ b/lib/screens/settings/external_player_screen.dart @@ -9,6 +9,7 @@ import '../../i18n/strings.g.dart'; import '../../models/external_player_models.dart'; import '../../services/settings_service.dart'; import '../../widgets/focused_scroll_scaffold.dart'; +import '../../widgets/settings_section.dart'; class ExternalPlayerScreen extends StatefulWidget { const ExternalPlayerScreen({super.key}); @@ -57,53 +58,31 @@ class _ExternalPlayerScreenState extends State { return FocusedScrollScaffold( title: Text(t.externalPlayer.title), slivers: [ - SliverPadding( - padding: const EdgeInsets.all(16), - sliver: SliverList( - delegate: SliverChildListDelegate([ - Card( - child: SwitchListTile( - secondary: const AppIcon(Symbols.open_in_new_rounded, fill: 1), - title: Text(t.externalPlayer.useExternalPlayer), - subtitle: Text(t.externalPlayer.useExternalPlayerDescription), - value: _useExternalPlayer, - onChanged: (value) async { - setState(() => _useExternalPlayer = value); - await _settingsService.setUseExternalPlayer(value); - }, - ), + SliverList( + delegate: SliverChildListDelegate([ + SwitchListTile( + secondary: const AppIcon(Symbols.open_in_new_rounded, fill: 1), + title: Text(t.externalPlayer.useExternalPlayer), + subtitle: Text(t.externalPlayer.useExternalPlayerDescription), + value: _useExternalPlayer, + onChanged: (value) async { + setState(() => _useExternalPlayer = value); + await _settingsService.setUseExternalPlayer(value); + }, + ), + if (_useExternalPlayer) ...[ + SettingsSectionHeader(t.externalPlayer.selectPlayer), + ...knownPlayers.map((player) => _buildPlayerTile(player)), + SettingsSectionHeader(t.externalPlayer.customPlayers), + ..._customPlayers.map((player) => _buildPlayerTile(player, isCustom: true)), + ListTile( + leading: const AppIcon(Symbols.add_rounded, fill: 1), + title: Text(t.externalPlayer.addCustomPlayer), + onTap: _showAddCustomPlayerDialog, ), - if (_useExternalPlayer) ...[ - const SizedBox(height: 16), - Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(16), - child: Text( - t.externalPlayer.selectPlayer, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), - ), - ), - // Known players - ...knownPlayers.map((player) => _buildPlayerTile(player)), - // Custom players - if (_customPlayers.isNotEmpty) const Divider(), - ..._customPlayers.map((player) => _buildPlayerTile(player, isCustom: true)), - // Add custom player button - const Divider(), - ListTile( - leading: const AppIcon(Symbols.add_rounded, fill: 1), - title: Text(t.externalPlayer.addCustomPlayer), - onTap: _showAddCustomPlayerDialog, - ), - ], - ), - ), - ], - ]), - ), + ], + const SizedBox(height: 24), + ]), ), ], ); diff --git a/lib/screens/settings/subtitle_styling_screen.dart b/lib/screens/settings/subtitle_styling_screen.dart index 87c31f99..1addb09a 100644 --- a/lib/screens/settings/subtitle_styling_screen.dart +++ b/lib/screens/settings/subtitle_styling_screen.dart @@ -3,12 +3,13 @@ import 'package:plezy/widgets/app_icon.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:flex_color_picker/flex_color_picker.dart'; import '../../focus/focusable_button.dart'; +import '../../focus/input_mode_tracker.dart'; import '../../i18n/strings.g.dart'; import '../../services/settings_service.dart'; -import '../../focus/input_mode_tracker.dart'; import '../../widgets/focused_scroll_scaffold.dart'; +import '../../widgets/settings_section.dart'; import '../../widgets/tv_color_picker.dart'; -import '../../widgets/tv_number_spinner.dart'; +import 'settings_utils.dart'; class SubtitleStylingScreen extends StatefulWidget { const SubtitleStylingScreen({super.key}); @@ -17,101 +18,6 @@ class SubtitleStylingScreen extends StatefulWidget { State createState() => _SubtitleStylingScreenState(); } -// Composable widget for slider sections -class _StylingSliderSection extends StatelessWidget { - final String label; - final int value; - final double min; - final double max; - final int divisions; - final ValueChanged onChanged; - final ValueChanged? onChangeEnd; - final String Function(int)? valueFormatter; - - const _StylingSliderSection({ - required this.label, - required this.value, - required this.min, - required this.max, - required this.divisions, - required this.onChanged, - this.onChangeEnd, - this.valueFormatter, - }); - - @override - Widget build(BuildContext context) { - final formattedValue = valueFormatter?.call(value) ?? value.toString(); - return Padding( - padding: const EdgeInsets.fromLTRB(16, 16, 16, 8), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [Text(label), Text(formattedValue)]), - const SizedBox(height: 8), - Row( - children: [ - Text( - valueFormatter?.call(min.toInt()) ?? min.toInt().toString(), - style: const TextStyle(fontSize: 12, color: Colors.grey), - ), - Expanded( - child: Slider( - value: value.toDouble(), - min: min, - max: max, - divisions: divisions, - label: formattedValue, - onChanged: onChanged, - onChangeEnd: onChangeEnd, - ), - ), - Text( - valueFormatter?.call(max.toInt()) ?? max.toInt().toString(), - style: const TextStyle(fontSize: 12, color: Colors.grey), - ), - ], - ), - ], - ), - ); - } -} - -// Composable widget for color picker tiles -class _ColorSettingTile extends StatelessWidget { - final String label; - final String currentColor; - final VoidCallback onTap; - final Color Function(String) hexToColor; - - const _ColorSettingTile({ - required this.label, - required this.currentColor, - required this.onTap, - required this.hexToColor, - }); - - @override - Widget build(BuildContext context) { - return ListTile( - leading: Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: hexToColor(currentColor), - border: const Border.fromBorderSide(BorderSide(color: Colors.grey)), - borderRadius: const BorderRadius.all(Radius.circular(4)), - ), - ), - title: Text(label), - subtitle: Text(currentColor), - trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), - onTap: onTap, - ); - } -} - class _SubtitleStylingScreenState extends State { late SettingsService _settingsService; bool _isLoading = true; @@ -158,72 +64,6 @@ class _SubtitleStylingScreenState extends State { .toUpperCase(); } - void _showTvSpinnerDialog({ - required String title, - required int currentValue, - required int min, - required int max, - int step = 1, - String? suffix, - required ValueChanged onSave, - }) { - int spinnerValue = currentValue; - final saveFocusNode = FocusNode(); - - showDialog( - context: context, - builder: (BuildContext dialogContext) { - return StatefulBuilder( - builder: (context, setDialogState) { - return AlertDialog( - title: Text(title), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TvNumberSpinner( - value: spinnerValue, - min: min, - max: max, - step: step, - suffix: suffix, - autofocus: true, - onChanged: (value) { - setDialogState(() { - spinnerValue = value; - }); - }, - onConfirm: () => saveFocusNode.requestFocus(), - onCancel: () => Navigator.pop(dialogContext), - ), - ], - ), - actions: [ - FocusableButton( - onPressed: () => Navigator.pop(dialogContext), - child: TextButton(onPressed: () => Navigator.pop(dialogContext), child: Text(t.common.cancel)), - ), - FocusableButton( - focusNode: saveFocusNode, - onPressed: () { - onSave(spinnerValue); - Navigator.pop(dialogContext); - }, - child: TextButton( - onPressed: () { - onSave(spinnerValue); - Navigator.pop(dialogContext); - }, - child: Text(t.common.save), - ), - ), - ], - ); - }, - ); - }, - ).then((_) => saveFocusNode.dispose()); - } - Future _showColorPicker(String title, String currentColor, Function(String) onColorSelected) async { Color initialColor = _hexToColor(currentColor); @@ -298,240 +138,176 @@ class _SubtitleStylingScreenState extends State { ).then((_) => saveFocusNode.dispose()); } - @override - Widget build(BuildContext context) { - return FocusedScrollScaffold( - title: Text(t.screens.subtitleStyling), - slivers: _isLoading - ? [const SliverFillRemaining(child: Center(child: CircularProgressIndicator()))] - : [ - SliverPadding( - padding: const EdgeInsets.all(16), - sliver: SliverList( - delegate: SliverChildListDelegate([_buildStylingCard(), const SizedBox(height: 24)]), - ), - ), - ], - ); + void _openColorPicker(String title, String currentColor, Function(String) onColorSelected) { + if (InputModeTracker.isKeyboardMode(context)) { + _showTvColorPicker(title, currentColor, onColorSelected); + } else { + _showColorPicker(title, currentColor, onColorSelected); + } } - Widget _buildStylingCard() { - final useDpadControls = InputModeTracker.isKeyboardMode(context); + String _formatPosition(int value) { + if (value == 0) return 'Top'; + if (value == 100) return 'Bottom'; + return '$value%'; + } - return Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.all(16), - child: Text( - t.subtitlingStyling.stylingOptions, - style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), - ), - ), - // Font Size Slider - if (useDpadControls) + @override + Widget build(BuildContext context) { + if (_isLoading) { + return FocusedScrollScaffold( + title: Text(t.screens.subtitleStyling), + slivers: [const SliverFillRemaining(child: Center(child: CircularProgressIndicator()))], + ); + } + + return FocusedScrollScaffold( + title: Text(t.screens.subtitleStyling), + slivers: [ + SliverList( + delegate: SliverChildListDelegate([ + // --- Text --- + SettingsSectionHeader(t.subtitlingStyling.text), ListTile( + leading: const AppIcon(Symbols.format_size_rounded, fill: 1), title: Text(t.subtitlingStyling.fontSize), - trailing: Text('$_fontSize'), - onTap: () => _showTvSpinnerDialog( + subtitle: Text('$_fontSize'), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => showNumericInputDialog( + context: context, title: t.subtitlingStyling.fontSize, - currentValue: _fontSize, + labelText: t.subtitlingStyling.fontSize, + suffixText: '', min: 10, max: 80, - onSave: (value) { + currentValue: _fontSize, + onSave: (value) async { setState(() => _fontSize = value); - _settingsService.setSubtitleFontSize(value); + await _settingsService.setSubtitleFontSize(value); }, ), - ) - else - _StylingSliderSection( - label: t.subtitlingStyling.fontSize, - value: _fontSize, - min: 10, - max: 80, - divisions: 70, - onChanged: (value) { - setState(() { - _fontSize = value.toInt(); - }); - }, - onChangeEnd: (value) { - _settingsService.setSubtitleFontSize(_fontSize); - }, ), - const Divider(), - // Subtitle Position Slider - if (useDpadControls) ListTile( - title: Text(t.subtitlingStyling.position), - trailing: Text(() { - if (_subtitlePosition == 0) return 'Top'; - if (_subtitlePosition == 100) return 'Bottom'; - return '$_subtitlePosition%'; - }()), - onTap: () => _showTvSpinnerDialog( - title: t.subtitlingStyling.position, - currentValue: _subtitlePosition, - min: 0, - max: 100, - step: 5, - onSave: (value) { - setState(() => _subtitlePosition = value); - _settingsService.setSubtitlePosition(value); - }, + leading: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: _hexToColor(_textColor), + border: const Border.fromBorderSide(BorderSide(color: Colors.grey)), + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), ), - ) - else - _StylingSliderSection( - label: t.subtitlingStyling.position, - value: _subtitlePosition, - min: 0, - max: 100, - divisions: 20, - valueFormatter: (value) { - if (value == 0) return 'Top'; - if (value == 100) return 'Bottom'; - return '$value%'; - }, - onChanged: (value) { - setState(() { - _subtitlePosition = value.toInt(); - }); - }, - onChangeEnd: (value) { - _settingsService.setSubtitlePosition(_subtitlePosition); - }, - ), - const Divider(), - // Text Color - _ColorSettingTile( - label: t.subtitlingStyling.textColor, - currentColor: _textColor, - hexToColor: _hexToColor, - onTap: () { - void onColorSelected(String color) { + title: Text(t.subtitlingStyling.textColor), + subtitle: Text(_textColor), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => _openColorPicker(t.subtitlingStyling.textColor, _textColor, (color) { setState(() => _textColor = color); _settingsService.setSubtitleTextColor(color); - } - - if (useDpadControls) { - _showTvColorPicker(t.subtitlingStyling.textColor, _textColor, onColorSelected); - } else { - _showColorPicker(t.subtitlingStyling.textColor, _textColor, onColorSelected); - } - }, - ), - const Divider(), - // Border Size Slider - if (useDpadControls) - ListTile( - title: Text(t.subtitlingStyling.borderSize), - trailing: Text('$_borderSize'), - onTap: () => _showTvSpinnerDialog( - title: t.subtitlingStyling.borderSize, - currentValue: _borderSize, - min: 0, - max: 5, - onSave: (value) { - setState(() => _borderSize = value); - _settingsService.setSubtitleBorderSize(value); - }, - ), - ) - else - _StylingSliderSection( - label: t.subtitlingStyling.borderSize, - value: _borderSize, - min: 0, - max: 5, - divisions: 5, - onChanged: (value) { - setState(() { - _borderSize = value.toInt(); - }); - }, - onChangeEnd: (value) { - _settingsService.setSubtitleBorderSize(_borderSize); - }, + }), ), - const Divider(), - // Border Color - _ColorSettingTile( - label: t.subtitlingStyling.borderColor, - currentColor: _borderColor, - hexToColor: _hexToColor, - onTap: () { - void onColorSelected(String color) { - setState(() => _borderColor = color); - _settingsService.setSubtitleBorderColor(color); - } - - if (useDpadControls) { - _showTvColorPicker(t.subtitlingStyling.borderColor, _borderColor, onColorSelected); - } else { - _showColorPicker(t.subtitlingStyling.borderColor, _borderColor, onColorSelected); - } - }, - ), - const Divider(), - // Background Opacity Slider - if (useDpadControls) ListTile( - title: Text(t.subtitlingStyling.backgroundOpacity), - trailing: Text('$_backgroundOpacity%'), - onTap: () => _showTvSpinnerDialog( - title: t.subtitlingStyling.backgroundOpacity, - currentValue: _backgroundOpacity, + leading: const AppIcon(Symbols.vertical_align_bottom_rounded, fill: 1), + title: Text(t.subtitlingStyling.position), + subtitle: Text(_formatPosition(_subtitlePosition)), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => showNumericInputDialog( + context: context, + title: t.subtitlingStyling.position, + labelText: t.subtitlingStyling.position, + suffixText: '%', min: 0, max: 100, - step: 5, - suffix: '%', - onSave: (value) { - setState(() => _backgroundOpacity = value); - _settingsService.setSubtitleBackgroundOpacity(value); + currentValue: _subtitlePosition, + onSave: (value) async { + setState(() => _subtitlePosition = value); + await _settingsService.setSubtitlePosition(value); }, ), - ) - else - _StylingSliderSection( - label: t.subtitlingStyling.backgroundOpacity, - value: _backgroundOpacity, - min: 0, - max: 100, - divisions: 20, - valueFormatter: (value) => '$value%', - onChanged: (value) { - setState(() { - _backgroundOpacity = value.toInt(); - }); - }, - onChangeEnd: (value) { - _settingsService.setSubtitleBackgroundOpacity(_backgroundOpacity); - }, ), - const Divider(), - // Background Color - _ColorSettingTile( - label: t.subtitlingStyling.backgroundColor, - currentColor: _backgroundColor, - hexToColor: _hexToColor, - onTap: () { - void onColorSelected(String color) { + + // --- Border --- + SettingsSectionHeader(t.subtitlingStyling.border), + ListTile( + leading: const AppIcon(Symbols.border_style_rounded, fill: 1), + title: Text(t.subtitlingStyling.borderSize), + subtitle: Text('$_borderSize'), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => showNumericInputDialog( + context: context, + title: t.subtitlingStyling.borderSize, + labelText: t.subtitlingStyling.borderSize, + suffixText: '', + min: 0, + max: 5, + currentValue: _borderSize, + onSave: (value) async { + setState(() => _borderSize = value); + await _settingsService.setSubtitleBorderSize(value); + }, + ), + ), + ListTile( + leading: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: _hexToColor(_borderColor), + border: const Border.fromBorderSide(BorderSide(color: Colors.grey)), + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), + ), + title: Text(t.subtitlingStyling.borderColor), + subtitle: Text(_borderColor), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => _openColorPicker(t.subtitlingStyling.borderColor, _borderColor, (color) { + setState(() => _borderColor = color); + _settingsService.setSubtitleBorderColor(color); + }), + ), + + // --- Background --- + SettingsSectionHeader(t.subtitlingStyling.background), + ListTile( + leading: const AppIcon(Symbols.opacity_rounded, fill: 1), + title: Text(t.subtitlingStyling.backgroundOpacity), + subtitle: Text('$_backgroundOpacity%'), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => showNumericInputDialog( + context: context, + title: t.subtitlingStyling.backgroundOpacity, + labelText: t.subtitlingStyling.backgroundOpacity, + suffixText: '%', + min: 0, + max: 100, + currentValue: _backgroundOpacity, + onSave: (value) async { + setState(() => _backgroundOpacity = value); + await _settingsService.setSubtitleBackgroundOpacity(value); + }, + ), + ), + ListTile( + leading: Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: _hexToColor(_backgroundColor), + border: const Border.fromBorderSide(BorderSide(color: Colors.grey)), + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), + ), + title: Text(t.subtitlingStyling.backgroundColor), + subtitle: Text(_backgroundColor), + trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), + onTap: () => _openColorPicker(t.subtitlingStyling.backgroundColor, _backgroundColor, (color) { setState(() => _backgroundColor = color); _settingsService.setSubtitleBackgroundColor(color); - } - - if (useDpadControls) { - _showTvColorPicker(t.subtitlingStyling.backgroundColor, _backgroundColor, onColorSelected); - } else { - _showColorPicker(t.subtitlingStyling.backgroundColor, _backgroundColor, onColorSelected); - } - }, - ), - ], - ), + }), + ), + const SizedBox(height: 24), + ]), + ), + ], ); } }