diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index d595d791..22008855 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -557,7 +557,10 @@ "position": "Позиция", "assOverride": "ASS презаписване", "bold": "Получер", - "italic": "Курсив" + "italic": "Курсив", + "renderResolution": "Резолюция на изобразяване", + "renderResolutionScreen": "Резолюция на екрана", + "renderResolutionVideo": "Резолюция на видеото" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 4ba28d12..4250f8f2 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -557,7 +557,10 @@ "position": "Position", "assOverride": "ASS-tilsidesættelse", "bold": "Fed", - "italic": "Kursiv" + "italic": "Kursiv", + "renderResolution": "Gengivelsesopløsning", + "renderResolutionScreen": "Skærmopløsning", + "renderResolutionVideo": "Videoopløsning" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index e15db119..a1995391 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -557,7 +557,10 @@ "position": "Position", "assOverride": "ASS-Überschreibung", "bold": "Fett", - "italic": "Kursiv" + "italic": "Kursiv", + "renderResolution": "Render-Auflösung", + "renderResolutionScreen": "Bildschirmauflösung", + "renderResolutionVideo": "Videoauflösung" }, "mpvConfig": { "title": "mpv-Konfiguration", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index b0491220..b060b2ec 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -563,7 +563,10 @@ "position": "Position", "assOverride": "ASS Override", "bold": "Bold", - "italic": "Italic" + "italic": "Italic", + "renderResolution": "Render Resolution", + "renderResolutionScreen": "Screen resolution", + "renderResolutionVideo": "Video resolution" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 2f3f46ad..465a47e7 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -557,7 +557,10 @@ "position": "Posición", "assOverride": "Sobreescritura ASS", "bold": "Negrita", - "italic": "Cursiva" + "italic": "Cursiva", + "renderResolution": "Resolución de renderizado", + "renderResolutionScreen": "Resolución de pantalla", + "renderResolutionVideo": "Resolución del vídeo" }, "mpvConfig": { "title": "Configuración de mpv", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index bd76c50a..9f53bcf9 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -557,7 +557,10 @@ "position": "Position", "assOverride": "Remplacement ASS", "bold": "Gras", - "italic": "Italique" + "italic": "Italique", + "renderResolution": "Résolution de rendu", + "renderResolutionScreen": "Résolution de l'écran", + "renderResolutionVideo": "Résolution de la vidéo" }, "mpvConfig": { "title": "Configuration mpv", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index d51a8a86..3fbb242c 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -557,7 +557,10 @@ "position": "Posizione", "assOverride": "Sovrascrittura ASS", "bold": "Grassetto", - "italic": "Corsivo" + "italic": "Corsivo", + "renderResolution": "Risoluzione di rendering", + "renderResolutionScreen": "Risoluzione dello schermo", + "renderResolutionVideo": "Risoluzione del video" }, "mpvConfig": { "title": "Configurazione mpv", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index 9457afd1..34eb4db9 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -557,7 +557,10 @@ "position": "位置", "assOverride": "ASSオーバーライド", "bold": "太字", - "italic": "斜体" + "italic": "斜体", + "renderResolution": "レンダリング解像度", + "renderResolutionScreen": "画面解像度", + "renderResolutionVideo": "動画解像度" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index d4833fa2..c772c47a 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -557,7 +557,10 @@ "position": "위치", "assOverride": "ASS 오버라이드", "bold": "굵게", - "italic": "기울임꼴" + "italic": "기울임꼴", + "renderResolution": "렌더링 해상도", + "renderResolutionScreen": "화면 해상도", + "renderResolutionVideo": "영상 해상도" }, "mpvConfig": { "title": "mpv 설정", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index d7108364..a65082fd 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -557,7 +557,10 @@ "position": "Posisjon", "assOverride": "ASS-overstyring", "bold": "Fet", - "italic": "Kursiv" + "italic": "Kursiv", + "renderResolution": "Gjengivelsesoppløsning", + "renderResolutionScreen": "Skjermoppløsning", + "renderResolutionVideo": "Videooppløsning" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 8e9129d6..7db3d5cf 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -557,7 +557,10 @@ "position": "Positie", "assOverride": "ASS-overschrijving", "bold": "Vet", - "italic": "Cursief" + "italic": "Cursief", + "renderResolution": "Renderresolutie", + "renderResolutionScreen": "Schermresolutie", + "renderResolutionVideo": "Videoresolutie" }, "mpvConfig": { "title": "mpv-configuratie", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 83f6851e..7dbc18bd 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -557,7 +557,10 @@ "position": "Pozycja", "assOverride": "Nadpisywanie ASS", "bold": "Pogrubienie", - "italic": "Kursywa" + "italic": "Kursywa", + "renderResolution": "Rozdzielczość renderowania", + "renderResolutionScreen": "Rozdzielczość ekranu", + "renderResolutionVideo": "Rozdzielczość wideo" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 81d7737b..d3f30c0d 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -557,7 +557,10 @@ "position": "Posição", "assOverride": "Substituição ASS", "bold": "Negrito", - "italic": "Itálico" + "italic": "Itálico", + "renderResolution": "Resolução de renderização", + "renderResolutionScreen": "Resolução da tela", + "renderResolutionVideo": "Resolução do vídeo" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index f09718a7..0f1de4b2 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -557,7 +557,10 @@ "position": "Позиция", "assOverride": "Переопределение ASS", "bold": "Жирный", - "italic": "Курсив" + "italic": "Курсив", + "renderResolution": "Разрешение отрисовки", + "renderResolutionScreen": "Разрешение экрана", + "renderResolutionVideo": "Разрешение видео" }, "mpvConfig": { "title": "mpv.conf", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index d5b63de9..976bfac5 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 16 -/// Strings: 20297 (1268 per locale) +/// Strings: 20345 (1271 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index 195578e7..2cd7168d 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingBg extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS презаписване'; @override String get bold => 'Получер'; @override String get italic => 'Курсив'; + @override String get renderResolution => 'Резолюция на изобразяване'; + @override String get renderResolutionScreen => 'Резолюция на екрана'; + @override String get renderResolutionVideo => 'Резолюция на видеото'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsBg { 'subtitlingStyling.assOverride' => 'ASS презаписване', 'subtitlingStyling.bold' => 'Получер', 'subtitlingStyling.italic' => 'Курсив', + 'subtitlingStyling.renderResolution' => 'Резолюция на изобразяване', + 'subtitlingStyling.renderResolutionScreen' => 'Резолюция на екрана', + 'subtitlingStyling.renderResolutionVideo' => 'Резолюция на видеото', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Разширени настройки на видео плейъра', 'mpvConfig.presets' => 'Пресети', @@ -2940,11 +2946,11 @@ extension on TranslationsBg { 'companionRemote.remote.retryNow' => 'Опитай сега', 'companionRemote.remote.tabRemote' => 'Дистанционно', 'companionRemote.remote.tabPlay' => 'Пускане', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Още', 'companionRemote.remote.menu' => 'Меню', 'companionRemote.remote.tabNavigation' => 'Навигация с Tab', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Открий', 'companionRemote.remote.tabLibraries' => 'Библиотеки', 'companionRemote.remote.tabSearch' => 'Търсене', diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index c9668506..7481fe29 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingDa extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS-tilsidesættelse'; @override String get bold => 'Fed'; @override String get italic => 'Kursiv'; + @override String get renderResolution => 'Gengivelsesopløsning'; + @override String get renderResolutionScreen => 'Skærmopløsning'; + @override String get renderResolutionVideo => 'Videoopløsning'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsDa { 'subtitlingStyling.assOverride' => 'ASS-tilsidesættelse', 'subtitlingStyling.bold' => 'Fed', 'subtitlingStyling.italic' => 'Kursiv', + 'subtitlingStyling.renderResolution' => 'Gengivelsesopløsning', + 'subtitlingStyling.renderResolutionScreen' => 'Skærmopløsning', + 'subtitlingStyling.renderResolutionVideo' => 'Videoopløsning', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Avancerede videoafspillerindstillinger', 'mpvConfig.presets' => 'Forudindstillinger', @@ -2940,11 +2946,11 @@ extension on TranslationsDa { 'companionRemote.remote.retryNow' => 'Prøv igen nu', 'companionRemote.remote.tabRemote' => 'Fjernbetjening', 'companionRemote.remote.tabPlay' => 'Afspil', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mere', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Fanenavigation', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Opdag', 'companionRemote.remote.tabLibraries' => 'Biblioteker', 'companionRemote.remote.tabSearch' => 'Søg', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index c4e081a5..cbc0b4f5 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingDe extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS-Überschreibung'; @override String get bold => 'Fett'; @override String get italic => 'Kursiv'; + @override String get renderResolution => 'Render-Auflösung'; + @override String get renderResolutionScreen => 'Bildschirmauflösung'; + @override String get renderResolutionVideo => 'Videoauflösung'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsDe { 'subtitlingStyling.assOverride' => 'ASS-Überschreibung', 'subtitlingStyling.bold' => 'Fett', 'subtitlingStyling.italic' => 'Kursiv', + 'subtitlingStyling.renderResolution' => 'Render-Auflösung', + 'subtitlingStyling.renderResolutionScreen' => 'Bildschirmauflösung', + 'subtitlingStyling.renderResolutionVideo' => 'Videoauflösung', 'mpvConfig.title' => 'mpv-Konfiguration', 'mpvConfig.description' => 'Erweiterte Videoplayer-Einstellungen', 'mpvConfig.presets' => 'Voreinstellungen', @@ -2940,11 +2946,11 @@ extension on TranslationsDe { 'companionRemote.remote.retryNow' => 'Jetzt wiederholen', 'companionRemote.remote.tabRemote' => 'Fernbedienung', 'companionRemote.remote.tabPlay' => 'Wiedergabe', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mehr', 'companionRemote.remote.menu' => 'Menü', 'companionRemote.remote.tabNavigation' => 'Tab-Navigation', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Entdecken', 'companionRemote.remote.tabLibraries' => 'Mediatheken', 'companionRemote.remote.tabSearch' => 'Suche', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index c28fc612..496863de 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -1731,6 +1731,15 @@ class TranslationsSubtitlingStylingEn { /// en: 'Italic' String get italic => 'Italic'; + + /// en: 'Render Resolution' + String get renderResolution => 'Render Resolution'; + + /// en: 'Screen resolution' + String get renderResolutionScreen => 'Screen resolution'; + + /// en: 'Video resolution' + String get renderResolutionVideo => 'Video resolution'; } // Path: mpvConfig @@ -5016,6 +5025,9 @@ extension on Translations { 'subtitlingStyling.assOverride' => 'ASS Override', 'subtitlingStyling.bold' => 'Bold', 'subtitlingStyling.italic' => 'Italic', + 'subtitlingStyling.renderResolution' => 'Render Resolution', + 'subtitlingStyling.renderResolutionScreen' => 'Screen resolution', + 'subtitlingStyling.renderResolutionVideo' => 'Video resolution', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Advanced video player settings', 'mpvConfig.presets' => 'Presets', @@ -5509,11 +5521,11 @@ extension on Translations { 'companionRemote.pairing.validationHostRequired' => 'Please enter host address', 'companionRemote.pairing.validationHostFormat' => 'Format must be IP:port (e.g., 192.168.1.100:48632)', 'companionRemote.pairing.connectionTimedOut' => 'Connection timed out. Use the same network on both devices.', + _ => null, + } ?? switch (path) { 'companionRemote.pairing.sessionNotFound' => 'Device not found. Make sure Plezy is running on the host.', 'companionRemote.pairing.authFailed' => 'Authentication failed. Both devices need the same Plex account.', 'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Failed to connect: ${error}', - _ => null, - } ?? switch (path) { 'companionRemote.remote.disconnectConfirm' => 'Do you want to disconnect from the remote session?', 'companionRemote.remote.reconnecting' => 'Reconnecting...', 'companionRemote.remote.attemptOf' => ({required Object current}) => 'Attempt ${current} of 5', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 87f07921..c2ec7fea 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingEs extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'Sobreescritura ASS'; @override String get bold => 'Negrita'; @override String get italic => 'Cursiva'; + @override String get renderResolution => 'Resolución de renderizado'; + @override String get renderResolutionScreen => 'Resolución de pantalla'; + @override String get renderResolutionVideo => 'Resolución del vídeo'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsEs { 'subtitlingStyling.assOverride' => 'Sobreescritura ASS', 'subtitlingStyling.bold' => 'Negrita', 'subtitlingStyling.italic' => 'Cursiva', + 'subtitlingStyling.renderResolution' => 'Resolución de renderizado', + 'subtitlingStyling.renderResolutionScreen' => 'Resolución de pantalla', + 'subtitlingStyling.renderResolutionVideo' => 'Resolución del vídeo', 'mpvConfig.title' => 'Configuración de mpv', 'mpvConfig.description' => 'Ajustes avanzados del reproductor de video', 'mpvConfig.presets' => 'Ajustes preestablecidos', @@ -2940,11 +2946,11 @@ extension on TranslationsEs { 'companionRemote.remote.retryNow' => 'Reintentar ahora', 'companionRemote.remote.tabRemote' => 'Remoto', 'companionRemote.remote.tabPlay' => 'Reproducir', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Más', 'companionRemote.remote.menu' => 'Menú', 'companionRemote.remote.tabNavigation' => 'Navegación por pestañas', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Descubrir', 'companionRemote.remote.tabLibraries' => 'Bibliotecas', 'companionRemote.remote.tabSearch' => 'Buscar', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 315e2df6..44747fc6 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingFr extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'Remplacement ASS'; @override String get bold => 'Gras'; @override String get italic => 'Italique'; + @override String get renderResolution => 'Résolution de rendu'; + @override String get renderResolutionScreen => 'Résolution de l\'écran'; + @override String get renderResolutionVideo => 'Résolution de la vidéo'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsFr { 'subtitlingStyling.assOverride' => 'Remplacement ASS', 'subtitlingStyling.bold' => 'Gras', 'subtitlingStyling.italic' => 'Italique', + 'subtitlingStyling.renderResolution' => 'Résolution de rendu', + 'subtitlingStyling.renderResolutionScreen' => 'Résolution de l\'écran', + 'subtitlingStyling.renderResolutionVideo' => 'Résolution de la vidéo', 'mpvConfig.title' => 'Configuration mpv', 'mpvConfig.description' => 'Paramètres avancés du lecteur vidéo', 'mpvConfig.presets' => 'Préréglages', @@ -2940,11 +2946,11 @@ extension on TranslationsFr { 'companionRemote.remote.retryNow' => 'Réessayer maintenant', 'companionRemote.remote.tabRemote' => 'Télécommande', 'companionRemote.remote.tabPlay' => 'Lecture', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Plus', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Navigation par onglets', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Découvrir', 'companionRemote.remote.tabLibraries' => 'Bibliothèques', 'companionRemote.remote.tabSearch' => 'Rechercher', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index 19a43c03..a5ac0f71 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingIt extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'Sovrascrittura ASS'; @override String get bold => 'Grassetto'; @override String get italic => 'Corsivo'; + @override String get renderResolution => 'Risoluzione di rendering'; + @override String get renderResolutionScreen => 'Risoluzione dello schermo'; + @override String get renderResolutionVideo => 'Risoluzione del video'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsIt { 'subtitlingStyling.assOverride' => 'Sovrascrittura ASS', 'subtitlingStyling.bold' => 'Grassetto', 'subtitlingStyling.italic' => 'Corsivo', + 'subtitlingStyling.renderResolution' => 'Risoluzione di rendering', + 'subtitlingStyling.renderResolutionScreen' => 'Risoluzione dello schermo', + 'subtitlingStyling.renderResolutionVideo' => 'Risoluzione del video', 'mpvConfig.title' => 'Configurazione mpv', 'mpvConfig.description' => 'Impostazioni avanzate del lettore video', 'mpvConfig.presets' => 'Preset', @@ -2940,11 +2946,11 @@ extension on TranslationsIt { 'companionRemote.remote.retryNow' => 'Riprova ora', 'companionRemote.remote.tabRemote' => 'Telecomando', 'companionRemote.remote.tabPlay' => 'Riproduci', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Altro', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Navigazione schede', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Esplora', 'companionRemote.remote.tabLibraries' => 'Librerie', 'companionRemote.remote.tabSearch' => 'Cerca', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index 54b92d2f..28908f07 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingJa extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASSオーバーライド'; @override String get bold => '太字'; @override String get italic => '斜体'; + @override String get renderResolution => 'レンダリング解像度'; + @override String get renderResolutionScreen => '画面解像度'; + @override String get renderResolutionVideo => '動画解像度'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsJa { 'subtitlingStyling.assOverride' => 'ASSオーバーライド', 'subtitlingStyling.bold' => '太字', 'subtitlingStyling.italic' => '斜体', + 'subtitlingStyling.renderResolution' => 'レンダリング解像度', + 'subtitlingStyling.renderResolutionScreen' => '画面解像度', + 'subtitlingStyling.renderResolutionVideo' => '動画解像度', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => '高度な動画プレーヤー設定', 'mpvConfig.presets' => 'プリセット', @@ -2940,11 +2946,11 @@ extension on TranslationsJa { 'companionRemote.remote.retryNow' => '今すぐ再試行', 'companionRemote.remote.tabRemote' => 'リモート', 'companionRemote.remote.tabPlay' => '再生', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'その他', 'companionRemote.remote.menu' => 'メニュー', 'companionRemote.remote.tabNavigation' => 'タブナビゲーション', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => '探す', 'companionRemote.remote.tabLibraries' => 'ライブラリ', 'companionRemote.remote.tabSearch' => '検索', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 0ef9c2fc..a5f2f452 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingKo extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS 오버라이드'; @override String get bold => '굵게'; @override String get italic => '기울임꼴'; + @override String get renderResolution => '렌더링 해상도'; + @override String get renderResolutionScreen => '화면 해상도'; + @override String get renderResolutionVideo => '영상 해상도'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsKo { 'subtitlingStyling.assOverride' => 'ASS 오버라이드', 'subtitlingStyling.bold' => '굵게', 'subtitlingStyling.italic' => '기울임꼴', + 'subtitlingStyling.renderResolution' => '렌더링 해상도', + 'subtitlingStyling.renderResolutionScreen' => '화면 해상도', + 'subtitlingStyling.renderResolutionVideo' => '영상 해상도', 'mpvConfig.title' => 'mpv 설정', 'mpvConfig.description' => '고급 비디오 플레이어 설정', 'mpvConfig.presets' => '사전 설정', @@ -2940,11 +2946,11 @@ extension on TranslationsKo { 'companionRemote.remote.retryNow' => '지금 재시도', 'companionRemote.remote.tabRemote' => '리모컨', 'companionRemote.remote.tabPlay' => '재생', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => '더 보기', 'companionRemote.remote.menu' => '메뉴', 'companionRemote.remote.tabNavigation' => '탭 탐색', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => '발견', 'companionRemote.remote.tabLibraries' => '미디어 라이브러리', 'companionRemote.remote.tabSearch' => '검색', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 2174b9fd..92115ced 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingNb extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS-overstyring'; @override String get bold => 'Fet'; @override String get italic => 'Kursiv'; + @override String get renderResolution => 'Gjengivelsesoppløsning'; + @override String get renderResolutionScreen => 'Skjermoppløsning'; + @override String get renderResolutionVideo => 'Videooppløsning'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsNb { 'subtitlingStyling.assOverride' => 'ASS-overstyring', 'subtitlingStyling.bold' => 'Fet', 'subtitlingStyling.italic' => 'Kursiv', + 'subtitlingStyling.renderResolution' => 'Gjengivelsesoppløsning', + 'subtitlingStyling.renderResolutionScreen' => 'Skjermoppløsning', + 'subtitlingStyling.renderResolutionVideo' => 'Videooppløsning', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Avanserte videospillerinnstillinger', 'mpvConfig.presets' => 'Forhåndsinnstillinger', @@ -2940,11 +2946,11 @@ extension on TranslationsNb { 'companionRemote.remote.retryNow' => 'Prøv nå', 'companionRemote.remote.tabRemote' => 'Fjernkontroll', 'companionRemote.remote.tabPlay' => 'Spill av', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mer', 'companionRemote.remote.menu' => 'Meny', 'companionRemote.remote.tabNavigation' => 'Fanenavigering', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Oppdag', 'companionRemote.remote.tabLibraries' => 'Biblioteker', 'companionRemote.remote.tabSearch' => 'Søk', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index e978c392..0967c020 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingNl extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS-overschrijving'; @override String get bold => 'Vet'; @override String get italic => 'Cursief'; + @override String get renderResolution => 'Renderresolutie'; + @override String get renderResolutionScreen => 'Schermresolutie'; + @override String get renderResolutionVideo => 'Videoresolutie'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsNl { 'subtitlingStyling.assOverride' => 'ASS-overschrijving', 'subtitlingStyling.bold' => 'Vet', 'subtitlingStyling.italic' => 'Cursief', + 'subtitlingStyling.renderResolution' => 'Renderresolutie', + 'subtitlingStyling.renderResolutionScreen' => 'Schermresolutie', + 'subtitlingStyling.renderResolutionVideo' => 'Videoresolutie', 'mpvConfig.title' => 'mpv-configuratie', 'mpvConfig.description' => 'Geavanceerde videospeler-instellingen', 'mpvConfig.presets' => 'Voorinstellingen', @@ -2940,11 +2946,11 @@ extension on TranslationsNl { 'companionRemote.remote.retryNow' => 'Nu opnieuw proberen', 'companionRemote.remote.tabRemote' => 'Afstandsbediening', 'companionRemote.remote.tabPlay' => 'Afspelen', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Meer', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Tabnavigatie', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Ontdekken', 'companionRemote.remote.tabLibraries' => 'Bibliotheken', 'companionRemote.remote.tabSearch' => 'Zoeken', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index f71be480..cc91feed 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingPl extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'Nadpisywanie ASS'; @override String get bold => 'Pogrubienie'; @override String get italic => 'Kursywa'; + @override String get renderResolution => 'Rozdzielczość renderowania'; + @override String get renderResolutionScreen => 'Rozdzielczość ekranu'; + @override String get renderResolutionVideo => 'Rozdzielczość wideo'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsPl { 'subtitlingStyling.assOverride' => 'Nadpisywanie ASS', 'subtitlingStyling.bold' => 'Pogrubienie', 'subtitlingStyling.italic' => 'Kursywa', + 'subtitlingStyling.renderResolution' => 'Rozdzielczość renderowania', + 'subtitlingStyling.renderResolutionScreen' => 'Rozdzielczość ekranu', + 'subtitlingStyling.renderResolutionVideo' => 'Rozdzielczość wideo', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Zaawansowane ustawienia odtwarzacza wideo', 'mpvConfig.presets' => 'Presety', @@ -2940,11 +2946,11 @@ extension on TranslationsPl { 'companionRemote.remote.retryNow' => 'Ponów teraz', 'companionRemote.remote.tabRemote' => 'Pilot', 'companionRemote.remote.tabPlay' => 'Odtwórz', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Więcej', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Nawigacja', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Odkryj', 'companionRemote.remote.tabLibraries' => 'Biblioteki', 'companionRemote.remote.tabSearch' => 'Szukaj', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 72221645..0c546b71 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingPt extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'Substituição ASS'; @override String get bold => 'Negrito'; @override String get italic => 'Itálico'; + @override String get renderResolution => 'Resolução de renderização'; + @override String get renderResolutionScreen => 'Resolução da tela'; + @override String get renderResolutionVideo => 'Resolução do vídeo'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsPt { 'subtitlingStyling.assOverride' => 'Substituição ASS', 'subtitlingStyling.bold' => 'Negrito', 'subtitlingStyling.italic' => 'Itálico', + 'subtitlingStyling.renderResolution' => 'Resolução de renderização', + 'subtitlingStyling.renderResolutionScreen' => 'Resolução da tela', + 'subtitlingStyling.renderResolutionVideo' => 'Resolução do vídeo', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Configurações avançadas do player de vídeo', 'mpvConfig.presets' => 'Predefinições', @@ -2940,11 +2946,11 @@ extension on TranslationsPt { 'companionRemote.remote.retryNow' => 'Tentar Agora', 'companionRemote.remote.tabRemote' => 'Remoto', 'companionRemote.remote.tabPlay' => 'Reproduzir', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mais', 'companionRemote.remote.menu' => 'Menu', 'companionRemote.remote.tabNavigation' => 'Navegação', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Descobrir', 'companionRemote.remote.tabLibraries' => 'Bibliotecas', 'companionRemote.remote.tabSearch' => 'Buscar', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index a07c0d3b..a0bcba7d 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingRu extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'Переопределение ASS'; @override String get bold => 'Жирный'; @override String get italic => 'Курсив'; + @override String get renderResolution => 'Разрешение отрисовки'; + @override String get renderResolutionScreen => 'Разрешение экрана'; + @override String get renderResolutionVideo => 'Разрешение видео'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsRu { 'subtitlingStyling.assOverride' => 'Переопределение ASS', 'subtitlingStyling.bold' => 'Жирный', 'subtitlingStyling.italic' => 'Курсив', + 'subtitlingStyling.renderResolution' => 'Разрешение отрисовки', + 'subtitlingStyling.renderResolutionScreen' => 'Разрешение экрана', + 'subtitlingStyling.renderResolutionVideo' => 'Разрешение видео', 'mpvConfig.title' => 'mpv.conf', 'mpvConfig.description' => 'Расширенные настройки видеоплеера', 'mpvConfig.presets' => 'Пресеты', @@ -2940,11 +2946,11 @@ extension on TranslationsRu { 'companionRemote.remote.retryNow' => 'Повторить сейчас', 'companionRemote.remote.tabRemote' => 'Пульт', 'companionRemote.remote.tabPlay' => 'Воспроизведение', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Ещё', 'companionRemote.remote.menu' => 'Меню', 'companionRemote.remote.tabNavigation' => 'Навигация', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Обзор', 'companionRemote.remote.tabLibraries' => 'Библиотеки', 'companionRemote.remote.tabSearch' => 'Поиск', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 2df2b1bf..529fd6ef 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingSv extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS-åsidosättning'; @override String get bold => 'Fet'; @override String get italic => 'Kursiv'; + @override String get renderResolution => 'Renderingsupplösning'; + @override String get renderResolutionScreen => 'Skärmupplösning'; + @override String get renderResolutionVideo => 'Videoupplösning'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsSv { 'subtitlingStyling.assOverride' => 'ASS-åsidosättning', 'subtitlingStyling.bold' => 'Fet', 'subtitlingStyling.italic' => 'Kursiv', + 'subtitlingStyling.renderResolution' => 'Renderingsupplösning', + 'subtitlingStyling.renderResolutionScreen' => 'Skärmupplösning', + 'subtitlingStyling.renderResolutionVideo' => 'Videoupplösning', 'mpvConfig.title' => 'mpv-konfiguration', 'mpvConfig.description' => 'Avancerade videospelares inställningar', 'mpvConfig.presets' => 'Förval', @@ -2940,11 +2946,11 @@ extension on TranslationsSv { 'companionRemote.remote.retryNow' => 'Försök nu', 'companionRemote.remote.tabRemote' => 'Fjärrkontroll', 'companionRemote.remote.tabPlay' => 'Spela', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => 'Mer', 'companionRemote.remote.menu' => 'Meny', 'companionRemote.remote.tabNavigation' => 'Fliknavigering', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => 'Upptäck', 'companionRemote.remote.tabLibraries' => 'Bibliotek', 'companionRemote.remote.tabSearch' => 'Sök', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index c56c64e5..609f1ffa 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -730,6 +730,9 @@ class _TranslationsSubtitlingStylingZh extends TranslationsSubtitlingStylingEn { @override String get assOverride => 'ASS 样式覆盖'; @override String get bold => '粗体'; @override String get italic => '斜体'; + @override String get renderResolution => '渲染分辨率'; + @override String get renderResolutionScreen => '屏幕分辨率'; + @override String get renderResolutionVideo => '视频分辨率'; } // Path: mpvConfig @@ -2441,6 +2444,9 @@ extension on TranslationsZh { 'subtitlingStyling.assOverride' => 'ASS 样式覆盖', 'subtitlingStyling.bold' => '粗体', 'subtitlingStyling.italic' => '斜体', + 'subtitlingStyling.renderResolution' => '渲染分辨率', + 'subtitlingStyling.renderResolutionScreen' => '屏幕分辨率', + 'subtitlingStyling.renderResolutionVideo' => '视频分辨率', 'mpvConfig.title' => 'mpv 配置', 'mpvConfig.description' => '高级视频播放器设置', 'mpvConfig.presets' => '预设', @@ -2940,11 +2946,11 @@ extension on TranslationsZh { 'companionRemote.remote.retryNow' => '立即重试', 'companionRemote.remote.tabRemote' => '遥控', 'companionRemote.remote.tabPlay' => '播放', + _ => null, + } ?? switch (path) { 'companionRemote.remote.tabMore' => '更多', 'companionRemote.remote.menu' => '菜单', 'companionRemote.remote.tabNavigation' => '标签导航', - _ => null, - } ?? switch (path) { 'companionRemote.remote.tabDiscover' => '发现', 'companionRemote.remote.tabLibraries' => '媒体库', 'companionRemote.remote.tabSearch' => '搜索', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index 60b8ab10..ba101598 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -557,7 +557,10 @@ "position": "Position", "assOverride": "ASS-åsidosättning", "bold": "Fet", - "italic": "Kursiv" + "italic": "Kursiv", + "renderResolution": "Renderingsupplösning", + "renderResolutionScreen": "Skärmupplösning", + "renderResolutionVideo": "Videoupplösning" }, "mpvConfig": { "title": "mpv-konfiguration", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 07449425..ca58d201 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -557,7 +557,10 @@ "position": "位置", "assOverride": "ASS 样式覆盖", "bold": "粗体", - "italic": "斜体" + "italic": "斜体", + "renderResolution": "渲染分辨率", + "renderResolutionScreen": "屏幕分辨率", + "renderResolutionVideo": "视频分辨率" }, "mpvConfig": { "title": "mpv 配置", diff --git a/lib/screens/settings/subtitle_styling_screen.dart b/lib/screens/settings/subtitle_styling_screen.dart index cd67ee3b..5789960c 100644 --- a/lib/screens/settings/subtitle_styling_screen.dart +++ b/lib/screens/settings/subtitle_styling_screen.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -27,6 +29,13 @@ class SubtitleStylingScreen extends StatelessWidget { return '$value%'; } + String _renderResolutionLabel(SubtitleRenderResolution value) { + return switch (value) { + SubtitleRenderResolution.screen => t.subtitlingStyling.renderResolutionScreen, + SubtitleRenderResolution.video => t.subtitlingStyling.renderResolutionVideo, + }; + } + @override Widget build(BuildContext context) { return SettingsPage( @@ -42,6 +51,19 @@ class SubtitleStylingScreen extends StatelessWidget { decode: (v) => v, encode: (v) => v, ), + // avfoundation VO (iOS/tvOS) only. + if (Platform.isIOS) + SettingSelectionTile( + pref: SettingsService.subtitleRenderResolution, + icon: Symbols.aspect_ratio_rounded, + title: t.subtitlingStyling.renderResolution, + subtitleBuilder: _renderResolutionLabel, + options: SubtitleRenderResolution.values + .map((v) => DialogOption(value: v, title: _renderResolutionLabel(v))) + .toList(), + decode: (v) => v, + encode: (v) => v, + ), SettingNumberTile( pref: SettingsService.subtitleFontSize, icon: Symbols.format_size_rounded, diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index 0cbd016d..9ff4c9a4 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -796,6 +796,15 @@ class VideoPlayerScreenState extends State with WidgetsBindin if (Platform.isIOS) { await currentPlayer.setProperty('audio-exclusive', 'yes'); + + // Rasterize subtitles at the video's resolution instead of the + // display's; the OSD layer upscales them with the video. + await currentPlayer.setProperty( + 'avfoundation-osd-video-res', + settingsService.read(SettingsService.subtitleRenderResolution) == SubtitleRenderResolution.video + ? 'yes' + : 'no', + ); } // Audio passthrough (desktop only - sends bitstream to receiver) diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 556e60f9..d939f9a2 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -40,6 +40,11 @@ enum ContinueWatchingAction { play, details } enum SubAssOverride { no, yes, scale, force, strip } +/// Resolution ASS/image subtitles are rasterized at on the avfoundation VO +/// (iOS/tvOS): the display's, or the video's (much cheaper on 4K displays; +/// subs can't carry more detail than the video they're typeset against). +enum SubtitleRenderResolution { screen, video } + enum DvConversionModePreference { auto, disabled, dv81, hevcStrip } extension DvConversionModePreferenceNativeValue on DvConversionModePreference { @@ -311,6 +316,11 @@ class SettingsService extends BaseSharedPreferencesService { values: SubAssOverride.values, defaultValue: SubAssOverride.no, ); + static const subtitleRenderResolution = EnumPref( + 'subtitle_render_resolution', + values: SubtitleRenderResolution.values, + defaultValue: SubtitleRenderResolution.screen, + ); static const subtitleBold = BoolPref('subtitle_bold'); static const subtitleItalic = BoolPref('subtitle_italic'); static const cleanedOldImageCache = BoolPref('cleaned_old_image_cache');