refactor: restyle subtitle styling and external player settings screens
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -439,6 +439,9 @@
|
||||
},
|
||||
"subtitlingStyling": {
|
||||
"stylingOptions": "スタイルオプション",
|
||||
"text": "テキスト",
|
||||
"border": "枠線",
|
||||
"background": "背景",
|
||||
"fontSize": "フォントサイズ",
|
||||
"textColor": "テキストの色",
|
||||
"borderSize": "枠線サイズ",
|
||||
@@ -847,6 +850,7 @@
|
||||
"useExternalPlayer": "外部プレーヤーを使用",
|
||||
"useExternalPlayerDescription": "内蔵プレーヤーの代わりに外部アプリで動画を開く",
|
||||
"selectPlayer": "プレーヤーを選択",
|
||||
"customPlayers": "カスタムプレーヤー",
|
||||
"systemDefault": "システムデフォルト",
|
||||
"addCustomPlayer": "カスタムプレーヤーを追加",
|
||||
"playerName": "プレーヤー名",
|
||||
|
||||
@@ -439,6 +439,9 @@
|
||||
},
|
||||
"subtitlingStyling": {
|
||||
"stylingOptions": "스타일 옵션",
|
||||
"text": "텍스트",
|
||||
"border": "테두리",
|
||||
"background": "배경",
|
||||
"fontSize": "글자 크기",
|
||||
"textColor": "텍스트 색상",
|
||||
"borderSize": "테두리 크기",
|
||||
@@ -847,6 +850,7 @@
|
||||
"useExternalPlayer": "외부 플레이어 사용",
|
||||
"useExternalPlayerDescription": "내장 플레이어 대신 외부 앱에서 동영상 열기",
|
||||
"selectPlayer": "플레이어 선택",
|
||||
"customPlayers": "사용자 정의 플레이어",
|
||||
"systemDefault": "시스템 기본값",
|
||||
"addCustomPlayer": "사용자 정의 플레이어 추가",
|
||||
"playerName": "플레이어 이름",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -439,6 +439,9 @@
|
||||
},
|
||||
"subtitlingStyling": {
|
||||
"stylingOptions": "Параметры стиля",
|
||||
"text": "Текст",
|
||||
"border": "Обводка",
|
||||
"background": "Фон",
|
||||
"fontSize": "Размер шрифта",
|
||||
"textColor": "Цвет текста",
|
||||
"borderSize": "Размер обводки",
|
||||
@@ -847,6 +850,7 @@
|
||||
"useExternalPlayer": "Использовать внешний плеер",
|
||||
"useExternalPlayerDescription": "Открывать видео во внешнем приложении вместо встроенного плеера",
|
||||
"selectPlayer": "Выбрать плеер",
|
||||
"customPlayers": "Свои плееры",
|
||||
"systemDefault": "Системный по умолчанию",
|
||||
"addCustomPlayer": "Добавить свой плеер",
|
||||
"playerName": "Название плеера",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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' => 'プレーヤー名',
|
||||
|
||||
@@ -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' => '플레이어 이름',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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' => 'Название плеера',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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' => '播放器名称',
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -439,6 +439,9 @@
|
||||
},
|
||||
"subtitlingStyling": {
|
||||
"stylingOptions": "样式选项",
|
||||
"text": "文本",
|
||||
"border": "边框",
|
||||
"background": "背景",
|
||||
"fontSize": "字号",
|
||||
"textColor": "文本颜色",
|
||||
"borderSize": "边框大小",
|
||||
@@ -847,6 +850,7 @@
|
||||
"useExternalPlayer": "使用外部播放器",
|
||||
"useExternalPlayerDescription": "在外部应用中打开视频,而不是使用内置播放器",
|
||||
"selectPlayer": "选择播放器",
|
||||
"customPlayers": "自定义播放器",
|
||||
"systemDefault": "系统默认",
|
||||
"addCustomPlayer": "添加自定义播放器",
|
||||
"playerName": "播放器名称",
|
||||
|
||||
@@ -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<ExternalPlayerScreen> {
|
||||
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),
|
||||
]),
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -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<SubtitleStylingScreen> 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<double> onChanged;
|
||||
final ValueChanged<double>? 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<SubtitleStylingScreen> {
|
||||
late SettingsService _settingsService;
|
||||
bool _isLoading = true;
|
||||
@@ -158,72 +64,6 @@ class _SubtitleStylingScreenState extends State<SubtitleStylingScreen> {
|
||||
.toUpperCase();
|
||||
}
|
||||
|
||||
void _showTvSpinnerDialog({
|
||||
required String title,
|
||||
required int currentValue,
|
||||
required int min,
|
||||
required int max,
|
||||
int step = 1,
|
||||
String? suffix,
|
||||
required ValueChanged<int> 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<void> _showColorPicker(String title, String currentColor, Function(String) onColorSelected) async {
|
||||
Color initialColor = _hexToColor(currentColor);
|
||||
|
||||
@@ -298,240 +138,176 @@ class _SubtitleStylingScreenState extends State<SubtitleStylingScreen> {
|
||||
).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),
|
||||
]),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user