diff --git a/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt b/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt index e7e3a7e9..5abc4399 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerCore.kt @@ -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") } } diff --git a/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerPlugin.kt b/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerPlugin.kt index 3e0cf3ba..6504d295 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerPlugin.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/exoplayer/ExoPlayerPlugin.kt @@ -494,6 +494,8 @@ class ExoPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, val bgColor = call.argument("bgColor") ?: "#000000" val bgOpacity = call.argument("bgOpacity")?.toInt() ?: 0 val subtitlePosition = call.argument("subtitlePosition")?.toInt() ?: 100 + val bold = call.argument("bold") ?: false + val italic = call.argument("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) } diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 14c4b4c2..7948f88c 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -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", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 9ccf81b4..63875de0 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -460,7 +460,9 @@ "backgroundOpacity": "Hintergrunddeckkraft", "backgroundColor": "Hintergrundfarbe", "position": "Position", - "assOverride": "ASS-Überschreibung" + "assOverride": "ASS-Überschreibung", + "bold": "Fett", + "italic": "Kursiv" }, "mpvConfig": { "title": "mpv-Konfiguration", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 00b7f8dd..0869e691 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -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", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 4c6102ef..8a5fe3cd 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -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", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index 6fd0e1be..3da4110d 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -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", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index aa0e5fa3..e5c8efed 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -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", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 0e33bac9..1031151d 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -460,7 +460,9 @@ "backgroundOpacity": "背景の不透明度", "backgroundColor": "背景色", "position": "位置", - "assOverride": "ASSオーバーライド" + "assOverride": "ASSオーバーライド", + "bold": "太字", + "italic": "斜体" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index cbbe8259..34f6f024 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -460,7 +460,9 @@ "backgroundOpacity": "배경 불투명도", "backgroundColor": "배경색", "position": "위치", - "assOverride": "ASS 오버라이드" + "assOverride": "ASS 오버라이드", + "bold": "굵게", + "italic": "기울임꼴" }, "mpvConfig": { "title": "mpv 설정", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index 1da3ffc7..0901d22a 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -460,7 +460,9 @@ "backgroundOpacity": "Bakgrunnsopasitet", "backgroundColor": "Bakgrunnsfarge", "position": "Posisjon", - "assOverride": "ASS-overstyring" + "assOverride": "ASS-overstyring", + "bold": "Fet", + "italic": "Kursiv" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 3e3f173b..252ff45f 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -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", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 776cfc4a..cdbabc9d 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -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", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 3d80899a..5f148b74 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -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", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 8c02d2fc..9985bf93 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -460,7 +460,9 @@ "backgroundOpacity": "Прозрачность фона", "backgroundColor": "Цвет фона", "position": "Позиция", - "assOverride": "Переопределение ASS" + "assOverride": "Переопределение ASS", + "bold": "Жирный", + "italic": "Курсив" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 1123f9f5..e623333a 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 15 -/// Strings: 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 diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 9f9fc1a1..2e720d9f 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -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', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 90dbafd6..af05054f 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -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', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 9df2045b..4f0fd8c5 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -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', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 9e2284d0..ae024e7e 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -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', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index b96a2ad1..7322dc59 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -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', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 3d0982ca..447f9043 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -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', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 9e2e0eac..dcc40b38 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -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' => 'アプリについて', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 4722d0a6..742712cc 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -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' => '소개', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index e10b4e86..39939c98 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -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', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 00bd27f8..e069fba0 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -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', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 7f11d4af..042feeb0 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -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', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 4374b73e..9e8c69df 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -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', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index 0c6a1507..491a7316 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -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' => 'О приложении', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 2d5de287..9050e65b 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -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', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 2a7ffe04..5a2d85bc 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -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' => '关于', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index aaa3dbc2..a8c70e30 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -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", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 59a29336..fa3a0a91 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -460,7 +460,9 @@ "backgroundOpacity": "背景不透明度", "backgroundColor": "背景颜色", "position": "位置", - "assOverride": "ASS 样式覆盖" + "assOverride": "ASS 样式覆盖", + "bold": "粗体", + "italic": "斜体" }, "mpvConfig": { "title": "mpv 配置", diff --git a/lib/mpv/player/platform/player_android.dart b/lib/mpv/player/platform/player_android.dart index 3d361359..0de07964 100644 --- a/lib/mpv/player/platform/player_android.dart +++ b/lib/mpv/player/platform/player_android.dart @@ -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, }); } diff --git a/lib/screens/settings/subtitle_styling_screen.dart b/lib/screens/settings/subtitle_styling_screen.dart index abca9894..9b521974 100644 --- a/lib/screens/settings/subtitle_styling_screen.dart +++ b/lib/screens/settings/subtitle_styling_screen.dart @@ -30,6 +30,8 @@ class _SubtitleStylingScreenState extends State { 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 { _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 { }, ), ), + 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), diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index b7731b1b..7dd8ea9c 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -622,6 +622,8 @@ class VideoPlayerScreenState extends State 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 with WidgetsBindin bgColor: settingsService.getSubtitleBackgroundColor(), bgOpacity: settingsService.getSubtitleBackgroundOpacity(), subtitlePosition: settingsService.getSubtitlePosition(), + bold: settingsService.getSubtitleBold(), + italic: settingsService.getSubtitleItalic(), ); } diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index e6516539..0c7ec1ec 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -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 setSubtitleBold(bool bold) async { + await prefs.setBool(_keySubtitleBold, bold); + } + + bool getSubtitleBold() { + return prefs.getBool(_keySubtitleBold) ?? false; + } + + // Italic subtitles + Future setSubtitleItalic(bool italic) async { + await prefs.setBool(_keySubtitleItalic, italic); + } + + bool getSubtitleItalic() { + return prefs.getBool(_keySubtitleItalic) ?? false; + } + // Keyboard Shortcuts (Legacy String-based) Map getDefaultKeyboardShortcuts() { return {