feat: bold/italic subtitle toggles

close #883
This commit is contained in:
edde746
2026-04-17 15:03:23 +02:00
parent 66b32468eb
commit 91057c12a4
37 changed files with 209 additions and 51 deletions
@@ -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)
}
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -460,7 +460,9 @@
"backgroundOpacity": "Hintergrunddeckkraft",
"backgroundColor": "Hintergrundfarbe",
"position": "Position",
"assOverride": "ASS-Überschreibung"
"assOverride": "ASS-Überschreibung",
"bold": "Fett",
"italic": "Kursiv"
},
"mpvConfig": {
"title": "mpv-Konfiguration",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -460,7 +460,9 @@
"backgroundOpacity": "背景の不透明度",
"backgroundColor": "背景色",
"position": "位置",
"assOverride": "ASSオーバーライド"
"assOverride": "ASSオーバーライド",
"bold": "太字",
"italic": "斜体"
},
"mpvConfig": {
"title": "mpv.conf",
+3 -1
View File
@@ -460,7 +460,9 @@
"backgroundOpacity": "배경 불투명도",
"backgroundColor": "배경색",
"position": "위치",
"assOverride": "ASS 오버라이드"
"assOverride": "ASS 오버라이드",
"bold": "굵게",
"italic": "기울임꼴"
},
"mpvConfig": {
"title": "mpv 설정",
+3 -1
View File
@@ -460,7 +460,9 @@
"backgroundOpacity": "Bakgrunnsopasitet",
"backgroundColor": "Bakgrunnsfarge",
"position": "Posisjon",
"assOverride": "ASS-overstyring"
"assOverride": "ASS-overstyring",
"bold": "Fet",
"italic": "Kursiv"
},
"mpvConfig": {
"title": "mpv.conf",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -460,7 +460,9 @@
"backgroundOpacity": "Прозрачность фона",
"backgroundColor": "Цвет фона",
"position": "Позиция",
"assOverride": "Переопределение ASS"
"assOverride": "Переопределение ASS",
"bold": "Жирный",
"italic": "Курсив"
},
"mpvConfig": {
"title": "mpv.conf",
+2 -2
View File
@@ -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
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+10 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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' => 'アプリについて',
+6 -2
View File
@@ -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' => '소개',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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' => 'О приложении',
+6 -2
View File
@@ -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',
+6 -2
View File
@@ -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' => '关于',
+3 -1
View File
@@ -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",
+3 -1
View File
@@ -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),
+4
View File
@@ -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(),
);
}
+20
View File
@@ -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 {