@@ -5,6 +5,7 @@ import android.app.ActivityManager
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.PixelFormat
|
||||
import android.graphics.Typeface
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
@@ -1437,7 +1438,9 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
||||
borderColor: String,
|
||||
bgColor: String,
|
||||
bgOpacity: Int,
|
||||
subtitlePosition: Int = 100
|
||||
subtitlePosition: Int = 100,
|
||||
bold: Boolean = false,
|
||||
italic: Boolean = false
|
||||
) {
|
||||
activity.runOnUiThread {
|
||||
// 1. Non-ASS subtitles: CaptionStyleCompat on SubtitleView
|
||||
@@ -1450,13 +1453,22 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
||||
val edgeType = if (borderSize > 0) CaptionStyleCompat.EDGE_TYPE_OUTLINE
|
||||
else CaptionStyleCompat.EDGE_TYPE_NONE
|
||||
|
||||
val typefaceStyle = when {
|
||||
bold && italic -> Typeface.BOLD_ITALIC
|
||||
bold -> Typeface.BOLD
|
||||
italic -> Typeface.ITALIC
|
||||
else -> Typeface.NORMAL
|
||||
}
|
||||
val typeface = if (typefaceStyle != Typeface.NORMAL)
|
||||
Typeface.create(Typeface.DEFAULT, typefaceStyle) else null
|
||||
|
||||
val style = CaptionStyleCompat(
|
||||
fgColor,
|
||||
bgColorInt,
|
||||
Color.TRANSPARENT,
|
||||
edgeType,
|
||||
edgeColor,
|
||||
null
|
||||
typeface
|
||||
)
|
||||
subtitleView?.setStyle(style)
|
||||
// Font size: MPV sub-font-size is scaled pixels at 720p height
|
||||
@@ -1493,7 +1505,7 @@ class ExoPlayerCore(private val activity: Activity) : Player.Listener {
|
||||
Log.w(TAG, "Failed to set ASS font scale: ${e.message}")
|
||||
}
|
||||
|
||||
Log.d(TAG, "setSubtitleStyle: fontSize=$fontSize, textColor=$textColor, borderSize=$borderSize, bgOpacity=$bgOpacity, position=$subtitlePosition, assScale=$scale")
|
||||
Log.d(TAG, "setSubtitleStyle: fontSize=$fontSize, textColor=$textColor, borderSize=$borderSize, bgOpacity=$bgOpacity, position=$subtitlePosition, bold=$bold, italic=$italic, assScale=$scale")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -494,6 +494,8 @@ class ExoPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
|
||||
val bgColor = call.argument<String>("bgColor") ?: "#000000"
|
||||
val bgOpacity = call.argument<Number>("bgOpacity")?.toInt() ?: 0
|
||||
val subtitlePosition = call.argument<Number>("subtitlePosition")?.toInt() ?: 100
|
||||
val bold = call.argument<Boolean>("bold") ?: false
|
||||
val italic = call.argument<Boolean>("italic") ?: false
|
||||
|
||||
if (usingMpvFallback) {
|
||||
// MPV fallback handles styling via setProperty, no-op here
|
||||
@@ -501,7 +503,7 @@ class ExoPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
|
||||
return
|
||||
}
|
||||
|
||||
playerCore?.setSubtitleStyle(fontSize, textColor, borderSize, borderColor, bgColor, bgOpacity, subtitlePosition)
|
||||
playerCore?.setSubtitleStyle(fontSize, textColor, borderSize, borderColor, bgColor, bgOpacity, subtitlePosition, bold, italic)
|
||||
result.success(null)
|
||||
}
|
||||
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Baggrundsgennemsigtighed",
|
||||
"backgroundColor": "Baggrundsfarve",
|
||||
"position": "Position",
|
||||
"assOverride": "ASS-tilsidesættelse"
|
||||
"assOverride": "ASS-tilsidesættelse",
|
||||
"bold": "Fed",
|
||||
"italic": "Kursiv"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Hintergrunddeckkraft",
|
||||
"backgroundColor": "Hintergrundfarbe",
|
||||
"position": "Position",
|
||||
"assOverride": "ASS-Überschreibung"
|
||||
"assOverride": "ASS-Überschreibung",
|
||||
"bold": "Fett",
|
||||
"italic": "Kursiv"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv-Konfiguration",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Background Opacity",
|
||||
"backgroundColor": "Background Color",
|
||||
"position": "Position",
|
||||
"assOverride": "ASS Override"
|
||||
"assOverride": "ASS Override",
|
||||
"bold": "Bold",
|
||||
"italic": "Italic"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Opacidad de Fondo",
|
||||
"backgroundColor": "Color de Fondo",
|
||||
"position": "Posición",
|
||||
"assOverride": "Sobreescritura ASS"
|
||||
"assOverride": "Sobreescritura ASS",
|
||||
"bold": "Negrita",
|
||||
"italic": "Cursiva"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "Configuración de mpv",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Opacité d'arrière-plan",
|
||||
"backgroundColor": "Couleur d'arrière-plan",
|
||||
"position": "Position",
|
||||
"assOverride": "Remplacement ASS"
|
||||
"assOverride": "Remplacement ASS",
|
||||
"bold": "Gras",
|
||||
"italic": "Italique"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "Configuration mpv",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Opacità sfondo",
|
||||
"backgroundColor": "Colore sfondo",
|
||||
"position": "Posizione",
|
||||
"assOverride": "Sovrascrittura ASS"
|
||||
"assOverride": "Sovrascrittura ASS",
|
||||
"bold": "Grassetto",
|
||||
"italic": "Corsivo"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "Configurazione mpv",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "背景の不透明度",
|
||||
"backgroundColor": "背景色",
|
||||
"position": "位置",
|
||||
"assOverride": "ASSオーバーライド"
|
||||
"assOverride": "ASSオーバーライド",
|
||||
"bold": "太字",
|
||||
"italic": "斜体"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "배경 불투명도",
|
||||
"backgroundColor": "배경색",
|
||||
"position": "위치",
|
||||
"assOverride": "ASS 오버라이드"
|
||||
"assOverride": "ASS 오버라이드",
|
||||
"bold": "굵게",
|
||||
"italic": "기울임꼴"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv 설정",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Bakgrunnsopasitet",
|
||||
"backgroundColor": "Bakgrunnsfarge",
|
||||
"position": "Posisjon",
|
||||
"assOverride": "ASS-overstyring"
|
||||
"assOverride": "ASS-overstyring",
|
||||
"bold": "Fet",
|
||||
"italic": "Kursiv"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Achtergrond transparantie",
|
||||
"backgroundColor": "Achtergrondkleur",
|
||||
"position": "Positie",
|
||||
"assOverride": "ASS-overschrijving"
|
||||
"assOverride": "ASS-overschrijving",
|
||||
"bold": "Vet",
|
||||
"italic": "Cursief"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv-configuratie",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Przezroczystość tła",
|
||||
"backgroundColor": "Kolor tła",
|
||||
"position": "Pozycja",
|
||||
"assOverride": "Nadpisywanie ASS"
|
||||
"assOverride": "Nadpisywanie ASS",
|
||||
"bold": "Pogrubienie",
|
||||
"italic": "Kursywa"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Opacidade do Fundo",
|
||||
"backgroundColor": "Cor de Fundo",
|
||||
"position": "Posição",
|
||||
"assOverride": "Substituição ASS"
|
||||
"assOverride": "Substituição ASS",
|
||||
"bold": "Negrito",
|
||||
"italic": "Itálico"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Прозрачность фона",
|
||||
"backgroundColor": "Цвет фона",
|
||||
"position": "Позиция",
|
||||
"assOverride": "Переопределение ASS"
|
||||
"assOverride": "Переопределение ASS",
|
||||
"bold": "Жирный",
|
||||
"italic": "Курсив"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv.conf",
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
/// To regenerate, run: `dart run slang`
|
||||
///
|
||||
/// Locales: 15
|
||||
/// Strings: 13260 (884 per locale)
|
||||
/// Strings: 13290 (886 per locale)
|
||||
///
|
||||
/// Built on 2026-04-17 at 10:54 UTC
|
||||
/// Built on 2026-04-17 at 12:37 UTC
|
||||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint, unused_import
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingDa implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Baggrundsfarve';
|
||||
@override String get position => 'Position';
|
||||
@override String get assOverride => 'ASS-tilsidesættelse';
|
||||
@override String get bold => 'Fed';
|
||||
@override String get italic => 'Kursiv';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsDa {
|
||||
'subtitlingStyling.backgroundColor' => 'Baggrundsfarve',
|
||||
'subtitlingStyling.position' => 'Position',
|
||||
'subtitlingStyling.assOverride' => 'ASS-tilsidesættelse',
|
||||
'subtitlingStyling.bold' => 'Fed',
|
||||
'subtitlingStyling.italic' => 'Kursiv',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => 'Avancerede videoafspillerindstillinger',
|
||||
'mpvConfig.presets' => 'Forudindstillinger',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsDa {
|
||||
'libraries.groupings.title' => 'Gruppering',
|
||||
'libraries.groupings.all' => 'Alle',
|
||||
'libraries.groupings.movies' => 'Film',
|
||||
'libraries.groupings.shows' => 'TV-serier',
|
||||
'libraries.groupings.seasons' => 'Sæsoner',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'TV-serier',
|
||||
'libraries.groupings.seasons' => 'Sæsoner',
|
||||
'libraries.groupings.episodes' => 'Episoder',
|
||||
'libraries.groupings.folders' => 'Mapper',
|
||||
'about.title' => 'Om',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingDe implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Hintergrundfarbe';
|
||||
@override String get position => 'Position';
|
||||
@override String get assOverride => 'ASS-Überschreibung';
|
||||
@override String get bold => 'Fett';
|
||||
@override String get italic => 'Kursiv';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsDe {
|
||||
'subtitlingStyling.backgroundColor' => 'Hintergrundfarbe',
|
||||
'subtitlingStyling.position' => 'Position',
|
||||
'subtitlingStyling.assOverride' => 'ASS-Überschreibung',
|
||||
'subtitlingStyling.bold' => 'Fett',
|
||||
'subtitlingStyling.italic' => 'Kursiv',
|
||||
'mpvConfig.title' => 'mpv-Konfiguration',
|
||||
'mpvConfig.description' => 'Erweiterte Videoplayer-Einstellungen',
|
||||
'mpvConfig.presets' => 'Voreinstellungen',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsDe {
|
||||
'libraries.groupings.title' => 'Gruppierung',
|
||||
'libraries.groupings.all' => 'Alle',
|
||||
'libraries.groupings.movies' => 'Filme',
|
||||
'libraries.groupings.shows' => 'Serien',
|
||||
'libraries.groupings.seasons' => 'Staffeln',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Serien',
|
||||
'libraries.groupings.seasons' => 'Staffeln',
|
||||
'libraries.groupings.episodes' => 'Episoden',
|
||||
'libraries.groupings.folders' => 'Ordner',
|
||||
'about.title' => 'Über',
|
||||
|
||||
@@ -1429,6 +1429,12 @@ class TranslationsSubtitlingStylingEn {
|
||||
|
||||
/// en: 'ASS Override'
|
||||
String get assOverride => 'ASS Override';
|
||||
|
||||
/// en: 'Bold'
|
||||
String get bold => 'Bold';
|
||||
|
||||
/// en: 'Italic'
|
||||
String get italic => 'Italic';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -3583,6 +3589,8 @@ extension on Translations {
|
||||
'subtitlingStyling.backgroundColor' => 'Background Color',
|
||||
'subtitlingStyling.position' => 'Position',
|
||||
'subtitlingStyling.assOverride' => 'ASS Override',
|
||||
'subtitlingStyling.bold' => 'Bold',
|
||||
'subtitlingStyling.italic' => 'Italic',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => 'Advanced video player settings',
|
||||
'mpvConfig.presets' => 'Presets',
|
||||
@@ -3666,10 +3674,10 @@ extension on Translations {
|
||||
'libraries.groupings.title' => 'Grouping',
|
||||
'libraries.groupings.all' => 'All',
|
||||
'libraries.groupings.movies' => 'Movies',
|
||||
'libraries.groupings.shows' => 'TV Shows',
|
||||
'libraries.groupings.seasons' => 'Seasons',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'TV Shows',
|
||||
'libraries.groupings.seasons' => 'Seasons',
|
||||
'libraries.groupings.episodes' => 'Episodes',
|
||||
'libraries.groupings.folders' => 'Folders',
|
||||
'about.title' => 'About',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingEs implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Color de Fondo';
|
||||
@override String get position => 'Posición';
|
||||
@override String get assOverride => 'Sobreescritura ASS';
|
||||
@override String get bold => 'Negrita';
|
||||
@override String get italic => 'Cursiva';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsEs {
|
||||
'subtitlingStyling.backgroundColor' => 'Color de Fondo',
|
||||
'subtitlingStyling.position' => 'Posición',
|
||||
'subtitlingStyling.assOverride' => 'Sobreescritura ASS',
|
||||
'subtitlingStyling.bold' => 'Negrita',
|
||||
'subtitlingStyling.italic' => 'Cursiva',
|
||||
'mpvConfig.title' => 'Configuración de mpv',
|
||||
'mpvConfig.description' => 'Ajustes avanzados del reproductor de video',
|
||||
'mpvConfig.presets' => 'Ajustes preestablecidos',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsEs {
|
||||
'libraries.groupings.title' => 'Agrupación',
|
||||
'libraries.groupings.all' => 'Todo',
|
||||
'libraries.groupings.movies' => 'Películas',
|
||||
'libraries.groupings.shows' => 'Series',
|
||||
'libraries.groupings.seasons' => 'Temporadas',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Series',
|
||||
'libraries.groupings.seasons' => 'Temporadas',
|
||||
'libraries.groupings.episodes' => 'Episodios',
|
||||
'libraries.groupings.folders' => 'Carpetas',
|
||||
'about.title' => 'Acerca de',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingFr implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Couleur d\'arrière-plan';
|
||||
@override String get position => 'Position';
|
||||
@override String get assOverride => 'Remplacement ASS';
|
||||
@override String get bold => 'Gras';
|
||||
@override String get italic => 'Italique';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsFr {
|
||||
'subtitlingStyling.backgroundColor' => 'Couleur d\'arrière-plan',
|
||||
'subtitlingStyling.position' => 'Position',
|
||||
'subtitlingStyling.assOverride' => 'Remplacement ASS',
|
||||
'subtitlingStyling.bold' => 'Gras',
|
||||
'subtitlingStyling.italic' => 'Italique',
|
||||
'mpvConfig.title' => 'Configuration mpv',
|
||||
'mpvConfig.description' => 'Paramètres avancés du lecteur vidéo',
|
||||
'mpvConfig.presets' => 'Préréglages',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsFr {
|
||||
'libraries.groupings.title' => 'Regroupement',
|
||||
'libraries.groupings.all' => 'Tous',
|
||||
'libraries.groupings.movies' => 'Films',
|
||||
'libraries.groupings.shows' => 'Show TV',
|
||||
'libraries.groupings.seasons' => 'Saisons',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Show TV',
|
||||
'libraries.groupings.seasons' => 'Saisons',
|
||||
'libraries.groupings.episodes' => 'Épisodes',
|
||||
'libraries.groupings.folders' => 'Dossiers',
|
||||
'about.title' => 'À propos',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingIt implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Colore sfondo';
|
||||
@override String get position => 'Posizione';
|
||||
@override String get assOverride => 'Sovrascrittura ASS';
|
||||
@override String get bold => 'Grassetto';
|
||||
@override String get italic => 'Corsivo';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsIt {
|
||||
'subtitlingStyling.backgroundColor' => 'Colore sfondo',
|
||||
'subtitlingStyling.position' => 'Posizione',
|
||||
'subtitlingStyling.assOverride' => 'Sovrascrittura ASS',
|
||||
'subtitlingStyling.bold' => 'Grassetto',
|
||||
'subtitlingStyling.italic' => 'Corsivo',
|
||||
'mpvConfig.title' => 'Configurazione mpv',
|
||||
'mpvConfig.description' => 'Impostazioni avanzate del lettore video',
|
||||
'mpvConfig.presets' => 'Preset',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsIt {
|
||||
'libraries.groupings.title' => 'Raggruppamento',
|
||||
'libraries.groupings.all' => 'Tutti',
|
||||
'libraries.groupings.movies' => 'Film',
|
||||
'libraries.groupings.shows' => 'Serie TV',
|
||||
'libraries.groupings.seasons' => 'Stagioni',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Serie TV',
|
||||
'libraries.groupings.seasons' => 'Stagioni',
|
||||
'libraries.groupings.episodes' => 'Episodi',
|
||||
'libraries.groupings.folders' => 'Cartelle',
|
||||
'about.title' => 'Informazioni',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingJa implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => '背景色';
|
||||
@override String get position => '位置';
|
||||
@override String get assOverride => 'ASSオーバーライド';
|
||||
@override String get bold => '太字';
|
||||
@override String get italic => '斜体';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsJa {
|
||||
'subtitlingStyling.backgroundColor' => '背景色',
|
||||
'subtitlingStyling.position' => '位置',
|
||||
'subtitlingStyling.assOverride' => 'ASSオーバーライド',
|
||||
'subtitlingStyling.bold' => '太字',
|
||||
'subtitlingStyling.italic' => '斜体',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => '高度な動画プレーヤー設定',
|
||||
'mpvConfig.presets' => 'プリセット',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsJa {
|
||||
'libraries.groupings.title' => 'グループ',
|
||||
'libraries.groupings.all' => 'すべて',
|
||||
'libraries.groupings.movies' => '映画',
|
||||
'libraries.groupings.shows' => 'テレビ番組',
|
||||
'libraries.groupings.seasons' => 'シーズン',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'テレビ番組',
|
||||
'libraries.groupings.seasons' => 'シーズン',
|
||||
'libraries.groupings.episodes' => 'エピソード',
|
||||
'libraries.groupings.folders' => 'フォルダ',
|
||||
'about.title' => 'アプリについて',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingKo implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => '배경색';
|
||||
@override String get position => '위치';
|
||||
@override String get assOverride => 'ASS 오버라이드';
|
||||
@override String get bold => '굵게';
|
||||
@override String get italic => '기울임꼴';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsKo {
|
||||
'subtitlingStyling.backgroundColor' => '배경색',
|
||||
'subtitlingStyling.position' => '위치',
|
||||
'subtitlingStyling.assOverride' => 'ASS 오버라이드',
|
||||
'subtitlingStyling.bold' => '굵게',
|
||||
'subtitlingStyling.italic' => '기울임꼴',
|
||||
'mpvConfig.title' => 'mpv 설정',
|
||||
'mpvConfig.description' => '고급 비디오 플레이어 설정',
|
||||
'mpvConfig.presets' => '사전 설정',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsKo {
|
||||
'libraries.groupings.title' => '그룹',
|
||||
'libraries.groupings.all' => '전체',
|
||||
'libraries.groupings.movies' => '영화',
|
||||
'libraries.groupings.shows' => 'TV 프로그램',
|
||||
'libraries.groupings.seasons' => '시즌',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'TV 프로그램',
|
||||
'libraries.groupings.seasons' => '시즌',
|
||||
'libraries.groupings.episodes' => '화',
|
||||
'libraries.groupings.folders' => '폴더',
|
||||
'about.title' => '소개',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingNb implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Bakgrunnsfarge';
|
||||
@override String get position => 'Posisjon';
|
||||
@override String get assOverride => 'ASS-overstyring';
|
||||
@override String get bold => 'Fet';
|
||||
@override String get italic => 'Kursiv';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsNb {
|
||||
'subtitlingStyling.backgroundColor' => 'Bakgrunnsfarge',
|
||||
'subtitlingStyling.position' => 'Posisjon',
|
||||
'subtitlingStyling.assOverride' => 'ASS-overstyring',
|
||||
'subtitlingStyling.bold' => 'Fet',
|
||||
'subtitlingStyling.italic' => 'Kursiv',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => 'Avanserte videospillerinnstillinger',
|
||||
'mpvConfig.presets' => 'Forhåndsinnstillinger',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsNb {
|
||||
'libraries.groupings.title' => 'Gruppering',
|
||||
'libraries.groupings.all' => 'Alle',
|
||||
'libraries.groupings.movies' => 'Filmer',
|
||||
'libraries.groupings.shows' => 'TV-serier',
|
||||
'libraries.groupings.seasons' => 'Sesonger',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'TV-serier',
|
||||
'libraries.groupings.seasons' => 'Sesonger',
|
||||
'libraries.groupings.episodes' => 'Episoder',
|
||||
'libraries.groupings.folders' => 'Mapper',
|
||||
'about.title' => 'Om',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingNl implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Achtergrondkleur';
|
||||
@override String get position => 'Positie';
|
||||
@override String get assOverride => 'ASS-overschrijving';
|
||||
@override String get bold => 'Vet';
|
||||
@override String get italic => 'Cursief';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsNl {
|
||||
'subtitlingStyling.backgroundColor' => 'Achtergrondkleur',
|
||||
'subtitlingStyling.position' => 'Positie',
|
||||
'subtitlingStyling.assOverride' => 'ASS-overschrijving',
|
||||
'subtitlingStyling.bold' => 'Vet',
|
||||
'subtitlingStyling.italic' => 'Cursief',
|
||||
'mpvConfig.title' => 'mpv-configuratie',
|
||||
'mpvConfig.description' => 'Geavanceerde videospeler-instellingen',
|
||||
'mpvConfig.presets' => 'Voorinstellingen',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsNl {
|
||||
'libraries.groupings.title' => 'Groepering',
|
||||
'libraries.groupings.all' => 'Alles',
|
||||
'libraries.groupings.movies' => 'Films',
|
||||
'libraries.groupings.shows' => 'Series',
|
||||
'libraries.groupings.seasons' => 'Seizoenen',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Series',
|
||||
'libraries.groupings.seasons' => 'Seizoenen',
|
||||
'libraries.groupings.episodes' => 'Afleveringen',
|
||||
'libraries.groupings.folders' => 'Mappen',
|
||||
'about.title' => 'Over',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingPl implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Kolor tła';
|
||||
@override String get position => 'Pozycja';
|
||||
@override String get assOverride => 'Nadpisywanie ASS';
|
||||
@override String get bold => 'Pogrubienie';
|
||||
@override String get italic => 'Kursywa';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsPl {
|
||||
'subtitlingStyling.backgroundColor' => 'Kolor tła',
|
||||
'subtitlingStyling.position' => 'Pozycja',
|
||||
'subtitlingStyling.assOverride' => 'Nadpisywanie ASS',
|
||||
'subtitlingStyling.bold' => 'Pogrubienie',
|
||||
'subtitlingStyling.italic' => 'Kursywa',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => 'Zaawansowane ustawienia odtwarzacza wideo',
|
||||
'mpvConfig.presets' => 'Presety',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsPl {
|
||||
'libraries.groupings.title' => 'Grupowanie',
|
||||
'libraries.groupings.all' => 'Wszystkie',
|
||||
'libraries.groupings.movies' => 'Filmy',
|
||||
'libraries.groupings.shows' => 'Seriale TV',
|
||||
'libraries.groupings.seasons' => 'Sezony',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Seriale TV',
|
||||
'libraries.groupings.seasons' => 'Sezony',
|
||||
'libraries.groupings.episodes' => 'Odcinki',
|
||||
'libraries.groupings.folders' => 'Foldery',
|
||||
'about.title' => 'O aplikacji',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingPt implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Cor de Fundo';
|
||||
@override String get position => 'Posição';
|
||||
@override String get assOverride => 'Substituição ASS';
|
||||
@override String get bold => 'Negrito';
|
||||
@override String get italic => 'Itálico';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsPt {
|
||||
'subtitlingStyling.backgroundColor' => 'Cor de Fundo',
|
||||
'subtitlingStyling.position' => 'Posição',
|
||||
'subtitlingStyling.assOverride' => 'Substituição ASS',
|
||||
'subtitlingStyling.bold' => 'Negrito',
|
||||
'subtitlingStyling.italic' => 'Itálico',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => 'Configurações avançadas do player de vídeo',
|
||||
'mpvConfig.presets' => 'Predefinições',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsPt {
|
||||
'libraries.groupings.title' => 'Agrupamento',
|
||||
'libraries.groupings.all' => 'Todos',
|
||||
'libraries.groupings.movies' => 'Filmes',
|
||||
'libraries.groupings.shows' => 'Séries de TV',
|
||||
'libraries.groupings.seasons' => 'Temporadas',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Séries de TV',
|
||||
'libraries.groupings.seasons' => 'Temporadas',
|
||||
'libraries.groupings.episodes' => 'Episódios',
|
||||
'libraries.groupings.folders' => 'Pastas',
|
||||
'about.title' => 'Sobre',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingRu implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Цвет фона';
|
||||
@override String get position => 'Позиция';
|
||||
@override String get assOverride => 'Переопределение ASS';
|
||||
@override String get bold => 'Жирный';
|
||||
@override String get italic => 'Курсив';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsRu {
|
||||
'subtitlingStyling.backgroundColor' => 'Цвет фона',
|
||||
'subtitlingStyling.position' => 'Позиция',
|
||||
'subtitlingStyling.assOverride' => 'Переопределение ASS',
|
||||
'subtitlingStyling.bold' => 'Жирный',
|
||||
'subtitlingStyling.italic' => 'Курсив',
|
||||
'mpvConfig.title' => 'mpv.conf',
|
||||
'mpvConfig.description' => 'Расширенные настройки видеоплеера',
|
||||
'mpvConfig.presets' => 'Пресеты',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsRu {
|
||||
'libraries.groupings.title' => 'Группировка',
|
||||
'libraries.groupings.all' => 'Все',
|
||||
'libraries.groupings.movies' => 'Фильмы',
|
||||
'libraries.groupings.shows' => 'Сериалы',
|
||||
'libraries.groupings.seasons' => 'Сезоны',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Сериалы',
|
||||
'libraries.groupings.seasons' => 'Сезоны',
|
||||
'libraries.groupings.episodes' => 'Эпизоды',
|
||||
'libraries.groupings.folders' => 'Папки',
|
||||
'about.title' => 'О приложении',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingSv implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => 'Bakgrundsfärg';
|
||||
@override String get position => 'Position';
|
||||
@override String get assOverride => 'ASS-åsidosättning';
|
||||
@override String get bold => 'Fet';
|
||||
@override String get italic => 'Kursiv';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsSv {
|
||||
'subtitlingStyling.backgroundColor' => 'Bakgrundsfärg',
|
||||
'subtitlingStyling.position' => 'Position',
|
||||
'subtitlingStyling.assOverride' => 'ASS-åsidosättning',
|
||||
'subtitlingStyling.bold' => 'Fet',
|
||||
'subtitlingStyling.italic' => 'Kursiv',
|
||||
'mpvConfig.title' => 'mpv-konfiguration',
|
||||
'mpvConfig.description' => 'Avancerade videospelares inställningar',
|
||||
'mpvConfig.presets' => 'Förval',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsSv {
|
||||
'libraries.groupings.title' => 'Gruppering',
|
||||
'libraries.groupings.all' => 'Alla',
|
||||
'libraries.groupings.movies' => 'Filmer',
|
||||
'libraries.groupings.shows' => 'Serier',
|
||||
'libraries.groupings.seasons' => 'Säsonger',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => 'Serier',
|
||||
'libraries.groupings.seasons' => 'Säsonger',
|
||||
'libraries.groupings.episodes' => 'Avsnitt',
|
||||
'libraries.groupings.folders' => 'Mappar',
|
||||
'about.title' => 'Om',
|
||||
|
||||
@@ -622,6 +622,8 @@ class _TranslationsSubtitlingStylingZh implements TranslationsSubtitlingStylingE
|
||||
@override String get backgroundColor => '背景颜色';
|
||||
@override String get position => '位置';
|
||||
@override String get assOverride => 'ASS 样式覆盖';
|
||||
@override String get bold => '粗体';
|
||||
@override String get italic => '斜体';
|
||||
}
|
||||
|
||||
// Path: mpvConfig
|
||||
@@ -1808,6 +1810,8 @@ extension on TranslationsZh {
|
||||
'subtitlingStyling.backgroundColor' => '背景颜色',
|
||||
'subtitlingStyling.position' => '位置',
|
||||
'subtitlingStyling.assOverride' => 'ASS 样式覆盖',
|
||||
'subtitlingStyling.bold' => '粗体',
|
||||
'subtitlingStyling.italic' => '斜体',
|
||||
'mpvConfig.title' => 'mpv 配置',
|
||||
'mpvConfig.description' => '高级视频播放器设置',
|
||||
'mpvConfig.presets' => '预设',
|
||||
@@ -1891,10 +1895,10 @@ extension on TranslationsZh {
|
||||
'libraries.groupings.title' => '分组',
|
||||
'libraries.groupings.all' => '全部',
|
||||
'libraries.groupings.movies' => '电影',
|
||||
'libraries.groupings.shows' => '剧集',
|
||||
'libraries.groupings.seasons' => '季',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'libraries.groupings.shows' => '剧集',
|
||||
'libraries.groupings.seasons' => '季',
|
||||
'libraries.groupings.episodes' => '集',
|
||||
'libraries.groupings.folders' => '文件夹',
|
||||
'about.title' => '关于',
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "Bakgrundsopacitet",
|
||||
"backgroundColor": "Bakgrundsfärg",
|
||||
"position": "Position",
|
||||
"assOverride": "ASS-åsidosättning"
|
||||
"assOverride": "ASS-åsidosättning",
|
||||
"bold": "Fet",
|
||||
"italic": "Kursiv"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv-konfiguration",
|
||||
|
||||
@@ -460,7 +460,9 @@
|
||||
"backgroundOpacity": "背景不透明度",
|
||||
"backgroundColor": "背景颜色",
|
||||
"position": "位置",
|
||||
"assOverride": "ASS 样式覆盖"
|
||||
"assOverride": "ASS 样式覆盖",
|
||||
"bold": "粗体",
|
||||
"italic": "斜体"
|
||||
},
|
||||
"mpvConfig": {
|
||||
"title": "mpv 配置",
|
||||
|
||||
@@ -358,6 +358,8 @@ class PlayerAndroid extends PlayerBase {
|
||||
required String bgColor,
|
||||
required int bgOpacity,
|
||||
int subtitlePosition = 100,
|
||||
bool bold = false,
|
||||
bool italic = false,
|
||||
}) async {
|
||||
if (disposed || !initialized) return;
|
||||
await invoke('setSubtitleStyle', {
|
||||
@@ -368,6 +370,8 @@ class PlayerAndroid extends PlayerBase {
|
||||
'bgColor': bgColor,
|
||||
'bgOpacity': bgOpacity,
|
||||
'subtitlePosition': subtitlePosition,
|
||||
'bold': bold,
|
||||
'italic': italic,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ class _SubtitleStylingScreenState extends State<SubtitleStylingScreen> {
|
||||
int _backgroundOpacity = 0;
|
||||
int _subtitlePosition = 100;
|
||||
SubAssOverride _assOverride = SubAssOverride.no;
|
||||
bool _bold = false;
|
||||
bool _italic = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -50,6 +52,8 @@ class _SubtitleStylingScreenState extends State<SubtitleStylingScreen> {
|
||||
_backgroundOpacity = _settingsService.getSubtitleBackgroundOpacity();
|
||||
_subtitlePosition = _settingsService.getSubtitlePosition();
|
||||
_assOverride = _settingsService.getSubAssOverride();
|
||||
_bold = _settingsService.getSubtitleBold();
|
||||
_italic = _settingsService.getSubtitleItalic();
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
@@ -256,6 +260,24 @@ class _SubtitleStylingScreenState extends State<SubtitleStylingScreen> {
|
||||
},
|
||||
),
|
||||
),
|
||||
SwitchListTile(
|
||||
secondary: const AppIcon(Symbols.format_bold_rounded, fill: 1),
|
||||
title: Text(t.subtitlingStyling.bold),
|
||||
value: _bold,
|
||||
onChanged: (value) async {
|
||||
setState(() => _bold = value);
|
||||
await _settingsService.setSubtitleBold(value);
|
||||
},
|
||||
),
|
||||
SwitchListTile(
|
||||
secondary: const AppIcon(Symbols.format_italic_rounded, fill: 1),
|
||||
title: Text(t.subtitlingStyling.italic),
|
||||
value: _italic,
|
||||
onChanged: (value) async {
|
||||
setState(() => _italic = value);
|
||||
await _settingsService.setSubtitleItalic(value);
|
||||
},
|
||||
),
|
||||
|
||||
// --- Border ---
|
||||
SettingsSectionHeader(t.subtitlingStyling.border),
|
||||
|
||||
@@ -622,6 +622,8 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> with WidgetsBindin
|
||||
await player!.setProperty('sub-color', settingsService.getSubtitleTextColor());
|
||||
await player!.setProperty('sub-border-size', settingsService.getSubtitleBorderSize().toString());
|
||||
await player!.setProperty('sub-border-color', settingsService.getSubtitleBorderColor());
|
||||
await player!.setProperty('sub-bold', settingsService.getSubtitleBold() ? 'yes' : 'no');
|
||||
await player!.setProperty('sub-italic', settingsService.getSubtitleItalic() ? 'yes' : 'no');
|
||||
final bgOpacity = (settingsService.getSubtitleBackgroundOpacity() * 255 / 100).toInt();
|
||||
final bgColor = settingsService.getSubtitleBackgroundColor().replaceFirst('#', '');
|
||||
await player!.setProperty(
|
||||
@@ -1391,6 +1393,8 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> with WidgetsBindin
|
||||
bgColor: settingsService.getSubtitleBackgroundColor(),
|
||||
bgOpacity: settingsService.getSubtitleBackgroundOpacity(),
|
||||
subtitlePosition: settingsService.getSubtitlePosition(),
|
||||
bold: settingsService.getSubtitleBold(),
|
||||
italic: settingsService.getSubtitleItalic(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,8 @@ class SettingsService extends BaseSharedPreferencesService {
|
||||
static const String _keySubtitleBackgroundOpacity = 'subtitle_background_opacity';
|
||||
static const String _keySubtitlePosition = 'subtitle_position';
|
||||
static const String _keySubAssOverride = 'sub_ass_override';
|
||||
static const String _keySubtitleBold = 'subtitle_bold';
|
||||
static const String _keySubtitleItalic = 'subtitle_italic';
|
||||
static const String _keyAppLocale = 'app_locale';
|
||||
static const String _keyRememberTrackSelections = 'remember_track_selections';
|
||||
static const String _keyClickVideoTogglesPlayback = 'click_video_toggles_playback';
|
||||
@@ -465,6 +467,24 @@ class SettingsService extends BaseSharedPreferencesService {
|
||||
return _getEnumValue(_keySubAssOverride, SubAssOverride.values, SubAssOverride.no);
|
||||
}
|
||||
|
||||
// Bold subtitles
|
||||
Future<void> setSubtitleBold(bool bold) async {
|
||||
await prefs.setBool(_keySubtitleBold, bold);
|
||||
}
|
||||
|
||||
bool getSubtitleBold() {
|
||||
return prefs.getBool(_keySubtitleBold) ?? false;
|
||||
}
|
||||
|
||||
// Italic subtitles
|
||||
Future<void> setSubtitleItalic(bool italic) async {
|
||||
await prefs.setBool(_keySubtitleItalic, italic);
|
||||
}
|
||||
|
||||
bool getSubtitleItalic() {
|
||||
return prefs.getBool(_keySubtitleItalic) ?? false;
|
||||
}
|
||||
|
||||
// Keyboard Shortcuts (Legacy String-based)
|
||||
Map<String, String> getDefaultKeyboardShortcuts() {
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user