feat(tvos): AVPlayer Atmos sink wiring + Atmos output diagnostics

Re-enables Audio Passthrough on Apple TV against the MPVKit EAC3-JOC
AVPlayer sink (pin bump to v1.0.8 follows), adds an AVPlayer test
harness + diagnostics screen for #1300, and makes loudnorm yield while
passthrough is active (fixes a latent spdif conflict on desktop too).
This commit is contained in:
edde746
2026-07-02 15:52:10 +02:00
parent 86abf3e9da
commit 6d95e35448
46 changed files with 1408 additions and 73 deletions
+4
View File
@@ -22,6 +22,7 @@
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
B1D51A6A2F00110000000001 /* MpvPlayerCoreBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000002 /* MpvPlayerCoreBase.swift */; };
B1D51A6A2F00110000000005 /* MpvPlayerPluginShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000006 /* MpvPlayerPluginShared.swift */; };
B1D51A6A2F0011000000000A /* AtmosProbePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F0011000000000B /* AtmosProbePlugin.swift */; };
B1D51A6A2F00110000000008 /* ExternalDisplayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000007 /* ExternalDisplayManager.swift */; };
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
/* End PBXBuildFile section */
@@ -75,6 +76,7 @@
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B1D51A6A2F00110000000002 /* MpvPlayerCoreBase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MpvPlayerCoreBase.swift; path = ../shared/apple/MpvPlayer/MpvPlayerCoreBase.swift; sourceTree = SOURCE_ROOT; };
B1D51A6A2F00110000000006 /* MpvPlayerPluginShared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MpvPlayerPluginShared.swift; path = ../shared/apple/MpvPlayer/MpvPlayerPluginShared.swift; sourceTree = SOURCE_ROOT; };
B1D51A6A2F0011000000000B /* AtmosProbePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AtmosProbePlugin.swift; path = ../shared/apple/AtmosProbe/AtmosProbePlugin.swift; sourceTree = SOURCE_ROOT; };
B1D51A6A2F00110000000007 /* ExternalDisplayManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalDisplayManager.swift; sourceTree = "<group>"; };
BB346A1D0705AB171F80B11B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DE48FF2E074644167608B23D /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
@@ -126,6 +128,7 @@
children = (
B1D51A6A2F00110000000002 /* MpvPlayerCoreBase.swift */,
B1D51A6A2F00110000000006 /* MpvPlayerPluginShared.swift */,
B1D51A6A2F0011000000000B /* AtmosProbePlugin.swift */,
B1D51A6A2F00110000000007 /* ExternalDisplayManager.swift */,
6A8A46222EDB370C0057B88C /* MpvPlayerCore.swift */,
6A8A46232EDB370C0057B88C /* MpvPlayerPlugin.swift */,
@@ -417,6 +420,7 @@
files = (
B1D51A6A2F00110000000001 /* MpvPlayerCoreBase.swift in Sources */,
B1D51A6A2F00110000000005 /* MpvPlayerPluginShared.swift in Sources */,
B1D51A6A2F0011000000000A /* AtmosProbePlugin.swift in Sources */,
B1D51A6A2F00110000000008 /* ExternalDisplayManager.swift in Sources */,
6A8A46252EDB370C0057B88C /* MpvPlayerPlugin.swift in Sources */,
6A8A46262EDB370C0057B88C /* MpvPlayerCore.swift in Sources */,
+4
View File
@@ -36,6 +36,10 @@ import MediaPlayer
MpvPlayerPlugin.register(with: registrar)
}
if let registrar = engineBridge.pluginRegistry.registrar(forPlugin: "AtmosProbePlugin") {
AtmosProbePlugin.register(with: registrar)
}
if let registrar = engineBridge.pluginRegistry.registrar(forPlugin: "DeviceAdjustmentChannel") {
registerDeviceAdjustmentChannel(messenger: registrar.messenger())
}
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Използвай видео тунелиране. Изключете, ако HDR възпроизвеждането показва черен екран.",
"audioPassthrough": "Аудио passthrough",
"audioPassthroughDescription": "Изпращай Dolby/DTS звук към ресийвъра или телевизора без прекодиране, запазвайки съраунд звука. Изключете, ако няма звук.",
"audioPassthroughDescriptionAppleTv": "Предава Dolby Digital Plus (вкл. Atmos) на системата като битов поток. DTS и TrueHD продължават да се възпроизвеждат като многоканален PCM. При превъртане може да има кратки прекъсвания на звука.",
"atmosDiagnostics": "Тест на Atmos изхода",
"atmosDiagnosticsDescription": "Диагностика на Dolby Atmos изхода чрез възпроизвеждане на тестови сигнали през системния плейър",
"atmosTestHlsAtmos": "Apple Atmos поток",
"atmosTestHlsAtmosDescription": "Гарантирано работещ Dolby Atmos поток. Ресийвърът трябва да покаже Dolby Atmos.",
"atmosTestHlsControl": "Apple съраунд поток",
"atmosTestHlsControlDescription": "Контролен поток без Atmos. Ресийвърът трябва да покаже съраунд без Atmos.",
"atmosTestRawStream": "Суров EAC3 поток",
"atmosTestRawStreamDescription": "Стриймва тестовия файл точно както Atmos възпроизвеждането в плейъра. Изисква URL на тестовия файл.",
"atmosTestRawFile": "Суров EAC3 файл",
"atmosTestRawFileDescription": "Възпроизвежда тестовия файл с известна дължина. Изисква URL на тестовия файл.",
"atmosTestStop": "Спри теста",
"atmosTestUrl": "URL на тестовия файл",
"atmosTestUrlDescription": "HTTP URL на суров .ec3 Dolby Atmos файл (напр. извлечен с ffmpeg)",
"atmosTestUrlMissing": "Първо задайте URL на тестовия файл",
"atmosTestStatus": "Състояние",
"dvConversionMode": "Dolby Vision конвертиране",
"dvConversionModeDescription": "Изберете как ExoPlayer обработва Dolby Vision Profile 7 файлове.",
"dvConversionAuto": "Автоматично",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Brug videotunneling. Slå fra, hvis HDR-afspilning viser sort video.",
"audioPassthrough": "Lyd-passthrough",
"audioPassthroughDescription": "Send Dolby/DTS-lyd til din receiver eller dit TV uden genkodning, så surroundlyd bevares. Slå fra, hvis du ikke har lyd.",
"audioPassthroughDescriptionAppleTv": "Overlad Dolby Digital Plus (inkl. Atmos) til systemet som bitstream. DTS og TrueHD afspilles stadig som flerkanals PCM. Korte lydhuller kan forekomme ved søgning.",
"atmosDiagnostics": "Atmos-outputtest",
"atmosDiagnosticsDescription": "Diagnosticér Dolby Atmos-output ved at afspille testsignaler gennem systemafspilleren",
"atmosTestHlsAtmos": "Apple Atmos-stream",
"atmosTestHlsAtmosDescription": "Kendt god Dolby Atmos-stream. Receiveren bør vise Dolby Atmos.",
"atmosTestHlsControl": "Apple surround-stream",
"atmosTestHlsControlDescription": "Kontrolstream uden Atmos. Receiveren bør vise surround uden Atmos.",
"atmosTestRawStream": "Rå EAC3-stream",
"atmosTestRawStreamDescription": "Streamer testfilen præcis som Atmos-afspilning i afspilleren. Kræver testfilens URL.",
"atmosTestRawFile": "Rå EAC3-fil",
"atmosTestRawFileDescription": "Afspiller testfilen med kendt længde. Kræver testfilens URL.",
"atmosTestStop": "Stop test",
"atmosTestUrl": "Testfilens URL",
"atmosTestUrlDescription": "HTTP-URL til en rå .ec3 Dolby Atmos-fil (f.eks. udtrukket med ffmpeg)",
"atmosTestUrlMissing": "Angiv testfilens URL først",
"atmosTestStatus": "Status",
"dvConversionMode": "Dolby Vision-konvertering",
"dvConversionModeDescription": "Vælg, hvordan ExoPlayer håndterer Dolby Vision Profile 7-filer.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Video-Tunneling verwenden. Deaktivieren, wenn HDR-Wiedergabe schwarzes Video zeigt.",
"audioPassthrough": "Audio-Durchleitung",
"audioPassthroughDescription": "Dolby/DTS-Audio ohne Neukodierung an deinen Receiver oder Fernseher senden und Surround-Sound erhalten. Deaktivieren, wenn kein Ton zu hören ist.",
"audioPassthroughDescriptionAppleTv": "Übergibt Dolby Digital Plus (inkl. Atmos) als Bitstream an das System. DTS und TrueHD werden weiterhin als Mehrkanal-PCM wiedergegeben. Beim Spulen können kurze Tonaussetzer auftreten.",
"atmosDiagnostics": "Atmos-Ausgabetest",
"atmosDiagnosticsDescription": "Dolby-Atmos-Ausgabe diagnostizieren, indem Testsignale über den Systemplayer abgespielt werden",
"atmosTestHlsAtmos": "Apple-Atmos-Stream",
"atmosTestHlsAtmosDescription": "Garantiert funktionierender Dolby-Atmos-Stream. Der Receiver sollte Dolby Atmos anzeigen.",
"atmosTestHlsControl": "Apple-Surround-Stream",
"atmosTestHlsControlDescription": "Kontrollstream ohne Atmos. Der Receiver sollte Surround ohne Atmos anzeigen.",
"atmosTestRawStream": "Roher EAC3-Stream",
"atmosTestRawStreamDescription": "Streamt die Testdatei genau wie die Atmos-Wiedergabe im Player. Benötigt die URL der Testdatei.",
"atmosTestRawFile": "Rohe EAC3-Datei",
"atmosTestRawFileDescription": "Spielt die Testdatei mit bekannter Länge ab. Benötigt die URL der Testdatei.",
"atmosTestStop": "Test stoppen",
"atmosTestUrl": "URL der Testdatei",
"atmosTestUrlDescription": "HTTP-URL einer rohen .ec3-Dolby-Atmos-Datei (z. B. mit ffmpeg extrahiert)",
"atmosTestUrlMissing": "Zuerst die URL der Testdatei festlegen",
"atmosTestStatus": "Status",
"dvConversionMode": "Dolby-Vision-Konvertierung",
"dvConversionModeDescription": "Wähle, wie ExoPlayer Dolby-Vision-Profil-7-Dateien behandelt.",
"dvConversionAuto": "Automatisch",
+16
View File
@@ -270,6 +270,22 @@
"tunneledPlaybackDescription": "Use video tunneling. Disable if HDR playback shows black video.",
"audioPassthrough": "Audio Passthrough",
"audioPassthroughDescription": "Send Dolby/DTS audio to your receiver or TV without re-encoding, preserving surround sound. Turn off if you have no sound.",
"audioPassthroughDescriptionAppleTv": "Hand Dolby Digital Plus (including Atmos) to the system for bitstream output. DTS and TrueHD still play as multichannel PCM. Brief audio gaps can occur when seeking.",
"atmosDiagnostics": "Atmos Output Test",
"atmosDiagnosticsDescription": "Diagnose Dolby Atmos output by playing test signals through the system player",
"atmosTestHlsAtmos": "Apple Atmos stream",
"atmosTestHlsAtmosDescription": "Known-good Dolby Atmos stream. The receiver should show Dolby Atmos.",
"atmosTestHlsControl": "Apple surround stream",
"atmosTestHlsControlDescription": "Non-Atmos control stream. The receiver should show surround without Atmos.",
"atmosTestRawStream": "Raw EAC3 stream",
"atmosTestRawStreamDescription": "Streams the test file exactly like in-player Atmos playback. Needs the test file URL.",
"atmosTestRawFile": "Raw EAC3 file",
"atmosTestRawFileDescription": "Plays the test file with a known length. Needs the test file URL.",
"atmosTestStop": "Stop test",
"atmosTestUrl": "Test file URL",
"atmosTestUrlDescription": "HTTP URL of a raw .ec3 Dolby Atmos file (e.g. extracted with ffmpeg)",
"atmosTestUrlMissing": "Set the test file URL first",
"atmosTestStatus": "Status",
"dvConversionMode": "Dolby Vision Conversion",
"dvConversionModeDescription": "Choose how ExoPlayer handles Dolby Vision Profile 7 files.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Usar tunelización de video. Desactívala si HDR muestra video negro.",
"audioPassthrough": "Audio Passthrough",
"audioPassthroughDescription": "Envía el audio Dolby/DTS a tu receptor o TV sin recodificar, conservando el sonido envolvente. Desactívalo si no tienes sonido.",
"audioPassthroughDescriptionAppleTv": "Entrega Dolby Digital Plus (incluido Atmos) al sistema como bitstream. DTS y TrueHD se siguen reproduciendo como PCM multicanal. Pueden producirse breves cortes de audio al buscar.",
"atmosDiagnostics": "Prueba de salida Atmos",
"atmosDiagnosticsDescription": "Diagnostica la salida Dolby Atmos reproduciendo señales de prueba con el reproductor del sistema",
"atmosTestHlsAtmos": "Stream Atmos de Apple",
"atmosTestHlsAtmosDescription": "Stream Dolby Atmos de referencia. El receptor debería mostrar Dolby Atmos.",
"atmosTestHlsControl": "Stream surround de Apple",
"atmosTestHlsControlDescription": "Stream de control sin Atmos. El receptor debería mostrar surround sin Atmos.",
"atmosTestRawStream": "Stream EAC3 sin procesar",
"atmosTestRawStreamDescription": "Transmite el archivo de prueba igual que la reproducción Atmos del reproductor. Necesita la URL del archivo de prueba.",
"atmosTestRawFile": "Archivo EAC3 sin procesar",
"atmosTestRawFileDescription": "Reproduce el archivo de prueba con longitud conocida. Necesita la URL del archivo de prueba.",
"atmosTestStop": "Detener prueba",
"atmosTestUrl": "URL del archivo de prueba",
"atmosTestUrlDescription": "URL HTTP de un archivo .ec3 Dolby Atmos sin procesar (p. ej., extraído con ffmpeg)",
"atmosTestUrlMissing": "Configura primero la URL del archivo de prueba",
"atmosTestStatus": "Estado",
"dvConversionMode": "Conversión de Dolby Vision",
"dvConversionModeDescription": "Elige cómo ExoPlayer gestiona archivos Dolby Vision Profile 7.",
"dvConversionAuto": "Automático",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Utiliser le tunneling vidéo. Désactivez si la lecture HDR affiche un écran noir.",
"audioPassthrough": "Audio Pass-Through",
"audioPassthroughDescription": "Envoyez l'audio Dolby/DTS vers votre ampli ou téléviseur sans réencodage, en conservant le son surround. Désactivez si vous n'avez aucun son.",
"audioPassthroughDescriptionAppleTv": "Transmet le Dolby Digital Plus (y compris Atmos) au système en bitstream. Le DTS et le TrueHD restent lus en PCM multicanal. De brèves coupures audio peuvent survenir lors des sauts.",
"atmosDiagnostics": "Test de sortie Atmos",
"atmosDiagnosticsDescription": "Diagnostiquer la sortie Dolby Atmos en lisant des signaux de test via le lecteur système",
"atmosTestHlsAtmos": "Flux Atmos d'Apple",
"atmosTestHlsAtmosDescription": "Flux Dolby Atmos réputé fiable. L'ampli devrait afficher Dolby Atmos.",
"atmosTestHlsControl": "Flux surround d'Apple",
"atmosTestHlsControlDescription": "Flux témoin sans Atmos. L'ampli devrait afficher du surround sans Atmos.",
"atmosTestRawStream": "Flux EAC3 brut",
"atmosTestRawStreamDescription": "Diffuse le fichier de test exactement comme la lecture Atmos du lecteur. Nécessite l'URL du fichier de test.",
"atmosTestRawFile": "Fichier EAC3 brut",
"atmosTestRawFileDescription": "Lit le fichier de test avec une longueur connue. Nécessite l'URL du fichier de test.",
"atmosTestStop": "Arrêter le test",
"atmosTestUrl": "URL du fichier de test",
"atmosTestUrlDescription": "URL HTTP d'un fichier .ec3 Dolby Atmos brut (extrait par ex. avec ffmpeg)",
"atmosTestUrlMissing": "Définissez d'abord l'URL du fichier de test",
"atmosTestStatus": "État",
"dvConversionMode": "Conversion Dolby Vision",
"dvConversionModeDescription": "Choisissez comment ExoPlayer gère les fichiers Dolby Vision Profile 7.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Usa tunneling video. Disattiva se la riproduzione HDR mostra video nero.",
"audioPassthrough": "Audio Passthrough",
"audioPassthroughDescription": "Invia l'audio Dolby/DTS al ricevitore o alla TV senza ricodifica, mantenendo il suono surround. Disattiva se non senti audio.",
"audioPassthroughDescriptionAppleTv": "Consegna Dolby Digital Plus (incluso Atmos) al sistema come bitstream. DTS e TrueHD vengono comunque riprodotti come PCM multicanale. Durante i salti possono verificarsi brevi interruzioni audio.",
"atmosDiagnostics": "Test uscita Atmos",
"atmosDiagnosticsDescription": "Diagnostica l'uscita Dolby Atmos riproducendo segnali di prova con il lettore di sistema",
"atmosTestHlsAtmos": "Stream Atmos di Apple",
"atmosTestHlsAtmosDescription": "Stream Dolby Atmos di riferimento. Il ricevitore dovrebbe mostrare Dolby Atmos.",
"atmosTestHlsControl": "Stream surround di Apple",
"atmosTestHlsControlDescription": "Stream di controllo senza Atmos. Il ricevitore dovrebbe mostrare surround senza Atmos.",
"atmosTestRawStream": "Stream EAC3 grezzo",
"atmosTestRawStreamDescription": "Trasmette il file di prova esattamente come la riproduzione Atmos del lettore. Richiede l'URL del file di prova.",
"atmosTestRawFile": "File EAC3 grezzo",
"atmosTestRawFileDescription": "Riproduce il file di prova con lunghezza nota. Richiede l'URL del file di prova.",
"atmosTestStop": "Interrompi test",
"atmosTestUrl": "URL del file di prova",
"atmosTestUrlDescription": "URL HTTP di un file .ec3 Dolby Atmos grezzo (ad es. estratto con ffmpeg)",
"atmosTestUrlMissing": "Imposta prima l'URL del file di prova",
"atmosTestStatus": "Stato",
"dvConversionMode": "Conversione Dolby Vision",
"dvConversionModeDescription": "Scegli come ExoPlayer gestisce i file Dolby Vision Profile 7.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "動画トンネリングを使用します。HDR再生で画面が黒くなる場合は無効にしてください。",
"audioPassthrough": "オーディオパススルー",
"audioPassthroughDescription": "Dolby/DTS音声を再エンコードせずにレシーバーやテレビに送り、サラウンドを維持します。音が出ない場合は無効にしてください。",
"audioPassthroughDescriptionAppleTv": "Dolby Digital PlusAtmos含む)をビットストリームとしてシステムに渡します。DTSとTrueHDは引き続きマルチチャンネルPCMで再生されます。シーク時に短い音切れが発生することがあります。",
"atmosDiagnostics": "Atmos出力テスト",
"atmosDiagnosticsDescription": "システムプレイヤーでテスト信号を再生してDolby Atmos出力を診断します",
"atmosTestHlsAtmos": "Apple Atmosストリーム",
"atmosTestHlsAtmosDescription": "動作確認済みのDolby Atmosストリーム。レシーバーにDolby Atmosと表示されるはずです。",
"atmosTestHlsControl": "Appleサラウンドストリーム",
"atmosTestHlsControlDescription": "Atmosなしの比較用ストリーム。レシーバーにAtmosなしのサラウンドが表示されるはずです。",
"atmosTestRawStream": "生EAC3ストリーム",
"atmosTestRawStreamDescription": "プレイヤー内のAtmos再生と同じ方式でテストファイルをストリーミングします。テストファイルのURLが必要です。",
"atmosTestRawFile": "生EAC3ファイル",
"atmosTestRawFileDescription": "長さが既知のテストファイルを再生します。テストファイルのURLが必要です。",
"atmosTestStop": "テストを停止",
"atmosTestUrl": "テストファイルのURL",
"atmosTestUrlDescription": "生の.ec3 Dolby AtmosファイルのHTTP URL(例: ffmpegで抽出)",
"atmosTestUrlMissing": "先にテストファイルのURLを設定してください",
"atmosTestStatus": "ステータス",
"dvConversionMode": "Dolby Vision 変換",
"dvConversionModeDescription": "ExoPlayer が Dolby Vision Profile 7 ファイルを処理する方法を選択します。",
"dvConversionAuto": "自動",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "비디오 터널링을 사용합니다. HDR 재생 시 검은 화면이 보이면 비활성화하세요.",
"audioPassthrough": "오디오 패스스루",
"audioPassthroughDescription": "Dolby/DTS 오디오를 재인코딩 없이 리시버나 TV로 전송하여 서라운드 사운드를 유지합니다. 소리가 나지 않으면 비활성화하세요.",
"audioPassthroughDescriptionAppleTv": "Dolby Digital Plus(Atmos 포함)를 비트스트림으로 시스템에 전달합니다. DTS와 TrueHD는 계속 멀티채널 PCM으로 재생됩니다. 탐색 시 짧은 소리 끊김이 발생할 수 있습니다.",
"atmosDiagnostics": "Atmos 출력 테스트",
"atmosDiagnosticsDescription": "시스템 플레이어로 테스트 신호를 재생하여 Dolby Atmos 출력을 진단합니다",
"atmosTestHlsAtmos": "Apple Atmos 스트림",
"atmosTestHlsAtmosDescription": "검증된 Dolby Atmos 스트림입니다. 리시버에 Dolby Atmos가 표시되어야 합니다.",
"atmosTestHlsControl": "Apple 서라운드 스트림",
"atmosTestHlsControlDescription": "Atmos 없는 대조용 스트림입니다. 리시버에 Atmos 없는 서라운드가 표시되어야 합니다.",
"atmosTestRawStream": "원시 EAC3 스트림",
"atmosTestRawStreamDescription": "플레이어 내 Atmos 재생과 동일한 방식으로 테스트 파일을 스트리밍합니다. 테스트 파일 URL이 필요합니다.",
"atmosTestRawFile": "원시 EAC3 파일",
"atmosTestRawFileDescription": "길이가 알려진 테스트 파일을 재생합니다. 테스트 파일 URL이 필요합니다.",
"atmosTestStop": "테스트 중지",
"atmosTestUrl": "테스트 파일 URL",
"atmosTestUrlDescription": "원시 .ec3 Dolby Atmos 파일의 HTTP URL(예: ffmpeg로 추출)",
"atmosTestUrlMissing": "먼저 테스트 파일 URL을 설정하세요",
"atmosTestStatus": "상태",
"dvConversionMode": "Dolby Vision 변환",
"dvConversionModeDescription": "ExoPlayer가 Dolby Vision Profile 7 파일을 처리하는 방식을 선택합니다.",
"dvConversionAuto": "자동",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Bruk videotunneling. Slå av hvis HDR-avspilling viser svart video.",
"audioPassthrough": "Lydgjennomgang",
"audioPassthroughDescription": "Send Dolby/DTS-lyd til mottakeren eller TV-en uten omkoding, slik at surroundlyd bevares. Slå av hvis du ikke har lyd.",
"audioPassthroughDescriptionAppleTv": "Overlater Dolby Digital Plus (inkl. Atmos) til systemet som bitstream. DTS og TrueHD spilles fortsatt av som flerkanals PCM. Korte lydbrudd kan forekomme ved søking.",
"atmosDiagnostics": "Atmos-utgangstest",
"atmosDiagnosticsDescription": "Diagnostiser Dolby Atmos-utgangen ved å spille testsignaler gjennom systemspilleren",
"atmosTestHlsAtmos": "Apple Atmos-strøm",
"atmosTestHlsAtmosDescription": "Kjent god Dolby Atmos-strøm. Mottakeren bør vise Dolby Atmos.",
"atmosTestHlsControl": "Apple surround-strøm",
"atmosTestHlsControlDescription": "Kontrollstrøm uten Atmos. Mottakeren bør vise surround uten Atmos.",
"atmosTestRawStream": "Rå EAC3-strøm",
"atmosTestRawStreamDescription": "Strømmer testfilen akkurat som Atmos-avspilling i spilleren. Krever testfilens URL.",
"atmosTestRawFile": "Rå EAC3-fil",
"atmosTestRawFileDescription": "Spiller av testfilen med kjent lengde. Krever testfilens URL.",
"atmosTestStop": "Stopp test",
"atmosTestUrl": "Testfilens URL",
"atmosTestUrlDescription": "HTTP-URL til en rå .ec3 Dolby Atmos-fil (f.eks. hentet ut med ffmpeg)",
"atmosTestUrlMissing": "Angi testfilens URL først",
"atmosTestStatus": "Status",
"dvConversionMode": "Dolby Vision-konvertering",
"dvConversionModeDescription": "Velg hvordan ExoPlayer håndterer Dolby Vision Profile 7-filer.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Gebruik videotunneling. Schakel uit als HDR-afspelen zwart beeld geeft.",
"audioPassthrough": "Audio-doorvoer",
"audioPassthroughDescription": "Stuur Dolby/DTS-audio zonder hercodering naar je receiver of tv en behoud surroundgeluid. Schakel uit als je geen geluid hebt.",
"audioPassthroughDescriptionAppleTv": "Geeft Dolby Digital Plus (incl. Atmos) als bitstream aan het systeem door. DTS en TrueHD worden nog steeds als meerkanaals PCM afgespeeld. Bij zoeken kunnen korte geluidsonderbrekingen optreden.",
"atmosDiagnostics": "Atmos-uitvoertest",
"atmosDiagnosticsDescription": "Diagnosticeer de Dolby Atmos-uitvoer door testsignalen via de systeemspeler af te spelen",
"atmosTestHlsAtmos": "Apple Atmos-stream",
"atmosTestHlsAtmosDescription": "Bewezen werkende Dolby Atmos-stream. De receiver zou Dolby Atmos moeten tonen.",
"atmosTestHlsControl": "Apple surround-stream",
"atmosTestHlsControlDescription": "Controlestream zonder Atmos. De receiver zou surround zonder Atmos moeten tonen.",
"atmosTestRawStream": "Ruwe EAC3-stream",
"atmosTestRawStreamDescription": "Streamt het testbestand precies zoals Atmos-weergave in de speler. Vereist de URL van het testbestand.",
"atmosTestRawFile": "Ruw EAC3-bestand",
"atmosTestRawFileDescription": "Speelt het testbestand met bekende lengte af. Vereist de URL van het testbestand.",
"atmosTestStop": "Test stoppen",
"atmosTestUrl": "URL van testbestand",
"atmosTestUrlDescription": "HTTP-URL van een ruw .ec3 Dolby Atmos-bestand (bijv. uitgepakt met ffmpeg)",
"atmosTestUrlMissing": "Stel eerst de URL van het testbestand in",
"atmosTestStatus": "Status",
"dvConversionMode": "Dolby Vision-conversie",
"dvConversionModeDescription": "Kies hoe ExoPlayer Dolby Vision Profile 7-bestanden verwerkt.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Użyj tunelowania wideo. Wyłącz, jeśli HDR pokazuje czarny obraz.",
"audioPassthrough": "Bezpośrednie audio",
"audioPassthroughDescription": "Wysyłaj dźwięk Dolby/DTS do amplitunera lub telewizora bez ponownego kodowania, zachowując dźwięk przestrzenny. Wyłącz, jeśli nie ma dźwięku.",
"audioPassthroughDescriptionAppleTv": "Przekazuje Dolby Digital Plus (w tym Atmos) do systemu jako bitstream. DTS i TrueHD nadal odtwarzane są jako wielokanałowe PCM. Podczas przewijania mogą wystąpić krótkie przerwy w dźwięku.",
"atmosDiagnostics": "Test wyjścia Atmos",
"atmosDiagnosticsDescription": "Diagnozuj wyjście Dolby Atmos, odtwarzając sygnały testowe przez odtwarzacz systemowy",
"atmosTestHlsAtmos": "Strumień Atmos Apple",
"atmosTestHlsAtmosDescription": "Sprawdzony strumień Dolby Atmos. Amplituner powinien pokazać Dolby Atmos.",
"atmosTestHlsControl": "Strumień surround Apple",
"atmosTestHlsControlDescription": "Strumień kontrolny bez Atmos. Amplituner powinien pokazać surround bez Atmos.",
"atmosTestRawStream": "Surowy strumień EAC3",
"atmosTestRawStreamDescription": "Strumieniuje plik testowy dokładnie jak odtwarzanie Atmos w odtwarzaczu. Wymaga URL pliku testowego.",
"atmosTestRawFile": "Surowy plik EAC3",
"atmosTestRawFileDescription": "Odtwarza plik testowy o znanej długości. Wymaga URL pliku testowego.",
"atmosTestStop": "Zatrzymaj test",
"atmosTestUrl": "URL pliku testowego",
"atmosTestUrlDescription": "HTTP URL surowego pliku .ec3 Dolby Atmos (np. wyodrębnionego przez ffmpeg)",
"atmosTestUrlMissing": "Najpierw ustaw URL pliku testowego",
"atmosTestStatus": "Stan",
"dvConversionMode": "Konwersja Dolby Vision",
"dvConversionModeDescription": "Wybierz, jak ExoPlayer obsługuje pliki Dolby Vision Profile 7.",
"dvConversionAuto": "Automatycznie",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Usar tunelamento de vídeo. Desative se HDR mostrar vídeo preto.",
"audioPassthrough": "Passagem de Áudio",
"audioPassthroughDescription": "Envie áudio Dolby/DTS para o seu receptor ou TV sem recodificar, preservando o som surround. Desative se não tiver som.",
"audioPassthroughDescriptionAppleTv": "Entrega Dolby Digital Plus (incluindo Atmos) ao sistema como bitstream. DTS e TrueHD continuam sendo reproduzidos como PCM multicanal. Podem ocorrer breves cortes de áudio ao buscar.",
"atmosDiagnostics": "Teste de saída Atmos",
"atmosDiagnosticsDescription": "Diagnostique a saída Dolby Atmos reproduzindo sinais de teste pelo player do sistema",
"atmosTestHlsAtmos": "Stream Atmos da Apple",
"atmosTestHlsAtmosDescription": "Stream Dolby Atmos comprovadamente bom. O receptor deve mostrar Dolby Atmos.",
"atmosTestHlsControl": "Stream surround da Apple",
"atmosTestHlsControlDescription": "Stream de controle sem Atmos. O receptor deve mostrar surround sem Atmos.",
"atmosTestRawStream": "Stream EAC3 bruto",
"atmosTestRawStreamDescription": "Transmite o arquivo de teste exatamente como a reprodução Atmos no player. Requer a URL do arquivo de teste.",
"atmosTestRawFile": "Arquivo EAC3 bruto",
"atmosTestRawFileDescription": "Reproduz o arquivo de teste com duração conhecida. Requer a URL do arquivo de teste.",
"atmosTestStop": "Parar teste",
"atmosTestUrl": "URL do arquivo de teste",
"atmosTestUrlDescription": "URL HTTP de um arquivo .ec3 Dolby Atmos bruto (ex.: extraído com ffmpeg)",
"atmosTestUrlMissing": "Defina primeiro a URL do arquivo de teste",
"atmosTestStatus": "Status",
"dvConversionMode": "Conversão Dolby Vision",
"dvConversionModeDescription": "Escolha como o ExoPlayer lida com arquivos Dolby Vision Profile 7.",
"dvConversionAuto": "Automático",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Использовать видеотуннелирование. Отключите, если HDR показывает черный экран.",
"audioPassthrough": "Сквозной вывод аудио",
"audioPassthroughDescription": "Передавать звук Dolby/DTS на ресивер или телевизор без перекодирования, сохраняя объёмный звук. Отключите, если нет звука.",
"audioPassthroughDescriptionAppleTv": "Передаёт Dolby Digital Plus (включая Atmos) системе в виде битового потока. DTS и TrueHD по-прежнему воспроизводятся как многоканальный PCM. При перемотке возможны короткие пропадания звука.",
"atmosDiagnostics": "Тест вывода Atmos",
"atmosDiagnosticsDescription": "Диагностика вывода Dolby Atmos воспроизведением тестовых сигналов через системный проигрыватель",
"atmosTestHlsAtmos": "Atmos-поток Apple",
"atmosTestHlsAtmosDescription": "Заведомо рабочий поток Dolby Atmos. Ресивер должен показать Dolby Atmos.",
"atmosTestHlsControl": "Surround-поток Apple",
"atmosTestHlsControlDescription": "Контрольный поток без Atmos. Ресивер должен показать объёмный звук без Atmos.",
"atmosTestRawStream": "Сырой поток EAC3",
"atmosTestRawStreamDescription": "Транслирует тестовый файл точно так же, как Atmos-воспроизведение в проигрывателе. Требуется URL тестового файла.",
"atmosTestRawFile": "Сырой файл EAC3",
"atmosTestRawFileDescription": "Воспроизводит тестовый файл с известной длиной. Требуется URL тестового файла.",
"atmosTestStop": "Остановить тест",
"atmosTestUrl": "URL тестового файла",
"atmosTestUrlDescription": "HTTP-URL сырого файла .ec3 Dolby Atmos (например, извлечённого через ffmpeg)",
"atmosTestUrlMissing": "Сначала укажите URL тестового файла",
"atmosTestStatus": "Статус",
"dvConversionMode": "Преобразование Dolby Vision",
"dvConversionModeDescription": "Выберите, как ExoPlayer обрабатывает файлы Dolby Vision Profile 7.",
"dvConversionAuto": "Авто",
+1 -1
View File
@@ -4,7 +4,7 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 16
/// Strings: 20505 (1281 per locale)
/// Strings: 20761 (1297 per locale)
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Използвай видео тунелиране. Изключете, ако HDR възпроизвеждането показва черен екран.';
@override String get audioPassthrough => 'Аудио passthrough';
@override String get audioPassthroughDescription => 'Изпращай Dolby/DTS звук към ресийвъра или телевизора без прекодиране, запазвайки съраунд звука. Изключете, ако няма звук.';
@override String get audioPassthroughDescriptionAppleTv => 'Предава Dolby Digital Plus (вкл. Atmos) на системата като битов поток. DTS и TrueHD продължават да се възпроизвеждат като многоканален PCM. При превъртане може да има кратки прекъсвания на звука.';
@override String get atmosDiagnostics => 'Тест на Atmos изхода';
@override String get atmosDiagnosticsDescription => 'Диагностика на Dolby Atmos изхода чрез възпроизвеждане на тестови сигнали през системния плейър';
@override String get atmosTestHlsAtmos => 'Apple Atmos поток';
@override String get atmosTestHlsAtmosDescription => 'Гарантирано работещ Dolby Atmos поток. Ресийвърът трябва да покаже Dolby Atmos.';
@override String get atmosTestHlsControl => 'Apple съраунд поток';
@override String get atmosTestHlsControlDescription => 'Контролен поток без Atmos. Ресийвърът трябва да покаже съраунд без Atmos.';
@override String get atmosTestRawStream => 'Суров EAC3 поток';
@override String get atmosTestRawStreamDescription => 'Стриймва тестовия файл точно както Atmos възпроизвеждането в плейъра. Изисква URL на тестовия файл.';
@override String get atmosTestRawFile => 'Суров EAC3 файл';
@override String get atmosTestRawFileDescription => 'Възпроизвежда тестовия файл с известна дължина. Изисква URL на тестовия файл.';
@override String get atmosTestStop => 'Спри теста';
@override String get atmosTestUrl => 'URL на тестовия файл';
@override String get atmosTestUrlDescription => 'HTTP URL на суров .ec3 Dolby Atmos файл (напр. извлечен с ffmpeg)';
@override String get atmosTestUrlMissing => 'Първо задайте URL на тестовия файл';
@override String get atmosTestStatus => 'Състояние';
@override String get dvConversionMode => 'Dolby Vision конвертиране';
@override String get dvConversionModeDescription => 'Изберете как ExoPlayer обработва Dolby Vision Profile 7 файлове.';
@override String get dvConversionAuto => 'Автоматично';
@@ -2184,6 +2200,22 @@ extension on TranslationsBg {
'settings.tunneledPlaybackDescription' => 'Използвай видео тунелиране. Изключете, ако HDR възпроизвеждането показва черен екран.',
'settings.audioPassthrough' => 'Аудио passthrough',
'settings.audioPassthroughDescription' => 'Изпращай Dolby/DTS звук към ресийвъра или телевизора без прекодиране, запазвайки съраунд звука. Изключете, ако няма звук.',
'settings.audioPassthroughDescriptionAppleTv' => 'Предава Dolby Digital Plus (вкл. Atmos) на системата като битов поток. DTS и TrueHD продължават да се възпроизвеждат като многоканален PCM. При превъртане може да има кратки прекъсвания на звука.',
'settings.atmosDiagnostics' => 'Тест на Atmos изхода',
'settings.atmosDiagnosticsDescription' => 'Диагностика на Dolby Atmos изхода чрез възпроизвеждане на тестови сигнали през системния плейър',
'settings.atmosTestHlsAtmos' => 'Apple Atmos поток',
'settings.atmosTestHlsAtmosDescription' => 'Гарантирано работещ Dolby Atmos поток. Ресийвърът трябва да покаже Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Apple съраунд поток',
'settings.atmosTestHlsControlDescription' => 'Контролен поток без Atmos. Ресийвърът трябва да покаже съраунд без Atmos.',
'settings.atmosTestRawStream' => 'Суров EAC3 поток',
'settings.atmosTestRawStreamDescription' => 'Стриймва тестовия файл точно както Atmos възпроизвеждането в плейъра. Изисква URL на тестовия файл.',
'settings.atmosTestRawFile' => 'Суров EAC3 файл',
'settings.atmosTestRawFileDescription' => 'Възпроизвежда тестовия файл с известна дължина. Изисква URL на тестовия файл.',
'settings.atmosTestStop' => 'Спри теста',
'settings.atmosTestUrl' => 'URL на тестовия файл',
'settings.atmosTestUrlDescription' => 'HTTP URL на суров .ec3 Dolby Atmos файл (напр. извлечен с ffmpeg)',
'settings.atmosTestUrlMissing' => 'Първо задайте URL на тестовия файл',
'settings.atmosTestStatus' => 'Състояние',
'settings.dvConversionMode' => 'Dolby Vision конвертиране',
'settings.dvConversionModeDescription' => 'Изберете как ExoPlayer обработва Dolby Vision Profile 7 файлове.',
'settings.dvConversionAuto' => 'Автоматично',
@@ -2426,6 +2458,8 @@ extension on TranslationsBg {
'messages.libraryScanFailed' => ({required Object error}) => 'Неуспешно сканиране на библиотеката: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Опресняване на метаданни за "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Опресняването на метаданни е стартирано за "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Неуспешно опресняване на метаданни: ${error}',
'messages.logoutConfirm' => 'Сигурни ли сте, че искате да излезете?',
'messages.noSeasonsFound' => 'Не са намерени сезони',
@@ -2442,8 +2476,6 @@ extension on TranslationsBg {
'messages.serverLimitTitle' => 'Възпроизвеждането е неуспешно',
'messages.serverLimitBody' => 'Грешка на сървъра (HTTP 500). Вероятно лимит за пропускателна способност/транскодиране е отхвърлил тази сесия. Помолете собственика да го коригира.',
'messages.logsUploaded' => 'Логовете са качени',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Неуспешно качване на логовете',
'messages.logId' => 'ID на лога',
'subtitlingStyling.text' => 'Текст',
@@ -2940,6 +2972,8 @@ extension on TranslationsBg {
'companionRemote.session.serverStopped' => 'Сървърът за дистанционно управление е спрян',
'companionRemote.session.serverRunningDescription' => 'Мобилни устройства във вашата мрежа могат да се свързват с това приложение',
'companionRemote.session.serverStoppedDescription' => 'Стартирайте сървъра, за да позволите на мобилни устройства да се свързват',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Използвайте мобилното си устройство, за да управлявате това приложение',
'companionRemote.session.startServer' => 'Стартирай сървър',
'companionRemote.session.stopServer' => 'Спри сървър',
@@ -2956,8 +2990,6 @@ extension on TranslationsBg {
'companionRemote.pairing.validationHostRequired' => 'Моля, въведете адрес на хоста',
'companionRemote.pairing.validationHostFormat' => 'Форматът трябва да е IP:port (напр. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Връзката изтече. Използвайте една и съща мрежа на двете устройства.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Устройството не е намерено. Уверете се, че Plezy работи на хоста.',
'companionRemote.pairing.authFailed' => 'Удостоверяването е неуспешно. Двете устройства трябва да използват същия Plex акаунт.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Неуспешно свързване: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Brug videotunneling. Slå fra, hvis HDR-afspilning viser sort video.';
@override String get audioPassthrough => 'Lyd-passthrough';
@override String get audioPassthroughDescription => 'Send Dolby/DTS-lyd til din receiver eller dit TV uden genkodning, så surroundlyd bevares. Slå fra, hvis du ikke har lyd.';
@override String get audioPassthroughDescriptionAppleTv => 'Overlad Dolby Digital Plus (inkl. Atmos) til systemet som bitstream. DTS og TrueHD afspilles stadig som flerkanals PCM. Korte lydhuller kan forekomme ved søgning.';
@override String get atmosDiagnostics => 'Atmos-outputtest';
@override String get atmosDiagnosticsDescription => 'Diagnosticér Dolby Atmos-output ved at afspille testsignaler gennem systemafspilleren';
@override String get atmosTestHlsAtmos => 'Apple Atmos-stream';
@override String get atmosTestHlsAtmosDescription => 'Kendt god Dolby Atmos-stream. Receiveren bør vise Dolby Atmos.';
@override String get atmosTestHlsControl => 'Apple surround-stream';
@override String get atmosTestHlsControlDescription => 'Kontrolstream uden Atmos. Receiveren bør vise surround uden Atmos.';
@override String get atmosTestRawStream => 'Rå EAC3-stream';
@override String get atmosTestRawStreamDescription => 'Streamer testfilen præcis som Atmos-afspilning i afspilleren. Kræver testfilens URL.';
@override String get atmosTestRawFile => 'Rå EAC3-fil';
@override String get atmosTestRawFileDescription => 'Afspiller testfilen med kendt længde. Kræver testfilens URL.';
@override String get atmosTestStop => 'Stop test';
@override String get atmosTestUrl => 'Testfilens URL';
@override String get atmosTestUrlDescription => 'HTTP-URL til en rå .ec3 Dolby Atmos-fil (f.eks. udtrukket med ffmpeg)';
@override String get atmosTestUrlMissing => 'Angiv testfilens URL først';
@override String get atmosTestStatus => 'Status';
@override String get dvConversionMode => 'Dolby Vision-konvertering';
@override String get dvConversionModeDescription => 'Vælg, hvordan ExoPlayer håndterer Dolby Vision Profile 7-filer.';
@override String get dvConversionAuto => 'Auto';
@@ -2184,6 +2200,22 @@ extension on TranslationsDa {
'settings.tunneledPlaybackDescription' => 'Brug videotunneling. Slå fra, hvis HDR-afspilning viser sort video.',
'settings.audioPassthrough' => 'Lyd-passthrough',
'settings.audioPassthroughDescription' => 'Send Dolby/DTS-lyd til din receiver eller dit TV uden genkodning, så surroundlyd bevares. Slå fra, hvis du ikke har lyd.',
'settings.audioPassthroughDescriptionAppleTv' => 'Overlad Dolby Digital Plus (inkl. Atmos) til systemet som bitstream. DTS og TrueHD afspilles stadig som flerkanals PCM. Korte lydhuller kan forekomme ved søgning.',
'settings.atmosDiagnostics' => 'Atmos-outputtest',
'settings.atmosDiagnosticsDescription' => 'Diagnosticér Dolby Atmos-output ved at afspille testsignaler gennem systemafspilleren',
'settings.atmosTestHlsAtmos' => 'Apple Atmos-stream',
'settings.atmosTestHlsAtmosDescription' => 'Kendt god Dolby Atmos-stream. Receiveren bør vise Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Apple surround-stream',
'settings.atmosTestHlsControlDescription' => 'Kontrolstream uden Atmos. Receiveren bør vise surround uden Atmos.',
'settings.atmosTestRawStream' => 'Rå EAC3-stream',
'settings.atmosTestRawStreamDescription' => 'Streamer testfilen præcis som Atmos-afspilning i afspilleren. Kræver testfilens URL.',
'settings.atmosTestRawFile' => 'Rå EAC3-fil',
'settings.atmosTestRawFileDescription' => 'Afspiller testfilen med kendt længde. Kræver testfilens URL.',
'settings.atmosTestStop' => 'Stop test',
'settings.atmosTestUrl' => 'Testfilens URL',
'settings.atmosTestUrlDescription' => 'HTTP-URL til en rå .ec3 Dolby Atmos-fil (f.eks. udtrukket med ffmpeg)',
'settings.atmosTestUrlMissing' => 'Angiv testfilens URL først',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Dolby Vision-konvertering',
'settings.dvConversionModeDescription' => 'Vælg, hvordan ExoPlayer håndterer Dolby Vision Profile 7-filer.',
'settings.dvConversionAuto' => 'Auto',
@@ -2426,6 +2458,8 @@ extension on TranslationsDa {
'messages.libraryScanFailed' => ({required Object error}) => 'Kunne ikke scanne bibliotek: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Opdaterer metadata for "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Metadataopdatering startet for "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Kunne ikke opdatere metadata: ${error}',
'messages.logoutConfirm' => 'Er du sikker på, at du vil logge ud?',
'messages.noSeasonsFound' => 'Ingen sæsoner fundet',
@@ -2442,8 +2476,6 @@ extension on TranslationsDa {
'messages.serverLimitTitle' => 'Afspilning mislykkedes',
'messages.serverLimitBody' => 'Serverfejl (HTTP 500). En båndbredde-/transkodningsgrænse afviste nok sessionen. Bed ejeren om at justere den.',
'messages.logsUploaded' => 'Logs uploadet',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Kunne ikke uploade logs',
'messages.logId' => 'Log-ID',
'subtitlingStyling.text' => 'Tekst',
@@ -2940,6 +2972,8 @@ extension on TranslationsDa {
'companionRemote.session.serverStopped' => 'Fjernserver stoppet',
'companionRemote.session.serverRunningDescription' => 'Mobile enheder på dit netværk kan oprette forbindelse til denne app',
'companionRemote.session.serverStoppedDescription' => 'Start serveren for at tillade mobilenheder at oprette forbindelse',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Brug din mobilenhed til at styre denne app',
'companionRemote.session.startServer' => 'Start server',
'companionRemote.session.stopServer' => 'Stop server',
@@ -2956,8 +2990,6 @@ extension on TranslationsDa {
'companionRemote.pairing.validationHostRequired' => 'Angiv venligst værtsadresse',
'companionRemote.pairing.validationHostFormat' => 'Format skal være IP:port (f.eks. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Forbindelsen fik timeout. Brug samme netværk på begge enheder.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Enhed ikke fundet. Sørg for, at Plezy kører på værten.',
'companionRemote.pairing.authFailed' => 'Godkendelse mislykkedes. Begge enheder skal bruge samme Plex-konto.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kunne ikke oprette forbindelse: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Video-Tunneling verwenden. Deaktivieren, wenn HDR-Wiedergabe schwarzes Video zeigt.';
@override String get audioPassthrough => 'Audio-Durchleitung';
@override String get audioPassthroughDescription => 'Dolby/DTS-Audio ohne Neukodierung an deinen Receiver oder Fernseher senden und Surround-Sound erhalten. Deaktivieren, wenn kein Ton zu hören ist.';
@override String get audioPassthroughDescriptionAppleTv => 'Übergibt Dolby Digital Plus (inkl. Atmos) als Bitstream an das System. DTS und TrueHD werden weiterhin als Mehrkanal-PCM wiedergegeben. Beim Spulen können kurze Tonaussetzer auftreten.';
@override String get atmosDiagnostics => 'Atmos-Ausgabetest';
@override String get atmosDiagnosticsDescription => 'Dolby-Atmos-Ausgabe diagnostizieren, indem Testsignale über den Systemplayer abgespielt werden';
@override String get atmosTestHlsAtmos => 'Apple-Atmos-Stream';
@override String get atmosTestHlsAtmosDescription => 'Garantiert funktionierender Dolby-Atmos-Stream. Der Receiver sollte Dolby Atmos anzeigen.';
@override String get atmosTestHlsControl => 'Apple-Surround-Stream';
@override String get atmosTestHlsControlDescription => 'Kontrollstream ohne Atmos. Der Receiver sollte Surround ohne Atmos anzeigen.';
@override String get atmosTestRawStream => 'Roher EAC3-Stream';
@override String get atmosTestRawStreamDescription => 'Streamt die Testdatei genau wie die Atmos-Wiedergabe im Player. Benötigt die URL der Testdatei.';
@override String get atmosTestRawFile => 'Rohe EAC3-Datei';
@override String get atmosTestRawFileDescription => 'Spielt die Testdatei mit bekannter Länge ab. Benötigt die URL der Testdatei.';
@override String get atmosTestStop => 'Test stoppen';
@override String get atmosTestUrl => 'URL der Testdatei';
@override String get atmosTestUrlDescription => 'HTTP-URL einer rohen .ec3-Dolby-Atmos-Datei (z. B. mit ffmpeg extrahiert)';
@override String get atmosTestUrlMissing => 'Zuerst die URL der Testdatei festlegen';
@override String get atmosTestStatus => 'Status';
@override String get dvConversionMode => 'Dolby-Vision-Konvertierung';
@override String get dvConversionModeDescription => 'Wähle, wie ExoPlayer Dolby-Vision-Profil-7-Dateien behandelt.';
@override String get dvConversionAuto => 'Automatisch';
@@ -2184,6 +2200,22 @@ extension on TranslationsDe {
'settings.tunneledPlaybackDescription' => 'Video-Tunneling verwenden. Deaktivieren, wenn HDR-Wiedergabe schwarzes Video zeigt.',
'settings.audioPassthrough' => 'Audio-Durchleitung',
'settings.audioPassthroughDescription' => 'Dolby/DTS-Audio ohne Neukodierung an deinen Receiver oder Fernseher senden und Surround-Sound erhalten. Deaktivieren, wenn kein Ton zu hören ist.',
'settings.audioPassthroughDescriptionAppleTv' => 'Übergibt Dolby Digital Plus (inkl. Atmos) als Bitstream an das System. DTS und TrueHD werden weiterhin als Mehrkanal-PCM wiedergegeben. Beim Spulen können kurze Tonaussetzer auftreten.',
'settings.atmosDiagnostics' => 'Atmos-Ausgabetest',
'settings.atmosDiagnosticsDescription' => 'Dolby-Atmos-Ausgabe diagnostizieren, indem Testsignale über den Systemplayer abgespielt werden',
'settings.atmosTestHlsAtmos' => 'Apple-Atmos-Stream',
'settings.atmosTestHlsAtmosDescription' => 'Garantiert funktionierender Dolby-Atmos-Stream. Der Receiver sollte Dolby Atmos anzeigen.',
'settings.atmosTestHlsControl' => 'Apple-Surround-Stream',
'settings.atmosTestHlsControlDescription' => 'Kontrollstream ohne Atmos. Der Receiver sollte Surround ohne Atmos anzeigen.',
'settings.atmosTestRawStream' => 'Roher EAC3-Stream',
'settings.atmosTestRawStreamDescription' => 'Streamt die Testdatei genau wie die Atmos-Wiedergabe im Player. Benötigt die URL der Testdatei.',
'settings.atmosTestRawFile' => 'Rohe EAC3-Datei',
'settings.atmosTestRawFileDescription' => 'Spielt die Testdatei mit bekannter Länge ab. Benötigt die URL der Testdatei.',
'settings.atmosTestStop' => 'Test stoppen',
'settings.atmosTestUrl' => 'URL der Testdatei',
'settings.atmosTestUrlDescription' => 'HTTP-URL einer rohen .ec3-Dolby-Atmos-Datei (z. B. mit ffmpeg extrahiert)',
'settings.atmosTestUrlMissing' => 'Zuerst die URL der Testdatei festlegen',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Dolby-Vision-Konvertierung',
'settings.dvConversionModeDescription' => 'Wähle, wie ExoPlayer Dolby-Vision-Profil-7-Dateien behandelt.',
'settings.dvConversionAuto' => 'Automatisch',
@@ -2426,6 +2458,8 @@ extension on TranslationsDe {
'messages.libraryScanFailed' => ({required Object error}) => 'Fehler beim Scannen der Mediathek: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Metadaten werden aktualisiert für „${title}“...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Metadaten-Aktualisierung gestartet für „${title}',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Metadaten konnten nicht aktualisiert werden: ${error}',
'messages.logoutConfirm' => 'Abmeldung wirklich durchführen?',
'messages.noSeasonsFound' => 'Keine Staffeln gefunden',
@@ -2442,8 +2476,6 @@ extension on TranslationsDe {
'messages.serverLimitTitle' => 'Wiedergabe fehlgeschlagen',
'messages.serverLimitBody' => 'Serverfehler (HTTP 500). Ein Bandbreiten-/Transcoding-Limit lehnte diese Sitzung wohl ab. Bitte den Besitzer um Anpassung.',
'messages.logsUploaded' => 'Protokolle hochgeladen',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Protokolle konnten nicht hochgeladen werden',
'messages.logId' => 'Protokoll-ID',
'subtitlingStyling.text' => 'Text',
@@ -2940,6 +2972,8 @@ extension on TranslationsDe {
'companionRemote.session.serverStopped' => 'Remote-Server gestoppt',
'companionRemote.session.serverRunningDescription' => 'Mobilgeräte in deinem Netzwerk können sich mit dieser App verbinden',
'companionRemote.session.serverStoppedDescription' => 'Starte den Server, um Mobilgeräten die Verbindung zu ermöglichen',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Verwende dein Mobilgerät, um diese App zu steuern',
'companionRemote.session.startServer' => 'Server starten',
'companionRemote.session.stopServer' => 'Server stoppen',
@@ -2956,8 +2990,6 @@ extension on TranslationsDe {
'companionRemote.pairing.validationHostRequired' => 'Bitte Host-Adresse eingeben',
'companionRemote.pairing.validationHostFormat' => 'Format muss IP:Port sein (z.B. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Verbindung hat Zeitlimit überschritten. Nutze auf beiden Geräten dasselbe Netzwerk.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Gerät nicht gefunden. Stelle sicher, dass Plezy auf dem Host läuft.',
'companionRemote.pairing.authFailed' => 'Authentifizierung fehlgeschlagen. Beide Geräte benötigen dasselbe Plex-Konto.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Verbindung fehlgeschlagen: ${error}',
+68 -4
View File
@@ -921,6 +921,54 @@ class TranslationsSettingsEn {
/// en: 'Send Dolby/DTS audio to your receiver or TV without re-encoding, preserving surround sound. Turn off if you have no sound.'
String get audioPassthroughDescription => 'Send Dolby/DTS audio to your receiver or TV without re-encoding, preserving surround sound. Turn off if you have no sound.';
/// en: 'Hand Dolby Digital Plus (including Atmos) to the system for bitstream output. DTS and TrueHD still play as multichannel PCM. Brief audio gaps can occur when seeking.'
String get audioPassthroughDescriptionAppleTv => 'Hand Dolby Digital Plus (including Atmos) to the system for bitstream output. DTS and TrueHD still play as multichannel PCM. Brief audio gaps can occur when seeking.';
/// en: 'Atmos Output Test'
String get atmosDiagnostics => 'Atmos Output Test';
/// en: 'Diagnose Dolby Atmos output by playing test signals through the system player'
String get atmosDiagnosticsDescription => 'Diagnose Dolby Atmos output by playing test signals through the system player';
/// en: 'Apple Atmos stream'
String get atmosTestHlsAtmos => 'Apple Atmos stream';
/// en: 'Known-good Dolby Atmos stream. The receiver should show Dolby Atmos.'
String get atmosTestHlsAtmosDescription => 'Known-good Dolby Atmos stream. The receiver should show Dolby Atmos.';
/// en: 'Apple surround stream'
String get atmosTestHlsControl => 'Apple surround stream';
/// en: 'Non-Atmos control stream. The receiver should show surround without Atmos.'
String get atmosTestHlsControlDescription => 'Non-Atmos control stream. The receiver should show surround without Atmos.';
/// en: 'Raw EAC3 stream'
String get atmosTestRawStream => 'Raw EAC3 stream';
/// en: 'Streams the test file exactly like in-player Atmos playback. Needs the test file URL.'
String get atmosTestRawStreamDescription => 'Streams the test file exactly like in-player Atmos playback. Needs the test file URL.';
/// en: 'Raw EAC3 file'
String get atmosTestRawFile => 'Raw EAC3 file';
/// en: 'Plays the test file with a known length. Needs the test file URL.'
String get atmosTestRawFileDescription => 'Plays the test file with a known length. Needs the test file URL.';
/// en: 'Stop test'
String get atmosTestStop => 'Stop test';
/// en: 'Test file URL'
String get atmosTestUrl => 'Test file URL';
/// en: 'HTTP URL of a raw .ec3 Dolby Atmos file (e.g. extracted with ffmpeg)'
String get atmosTestUrlDescription => 'HTTP URL of a raw .ec3 Dolby Atmos file (e.g. extracted with ffmpeg)';
/// en: 'Set the test file URL first'
String get atmosTestUrlMissing => 'Set the test file URL first';
/// en: 'Status'
String get atmosTestStatus => 'Status';
/// en: 'Dolby Vision Conversion'
String get dvConversionMode => 'Dolby Vision Conversion';
@@ -4785,6 +4833,22 @@ extension on Translations {
'settings.tunneledPlaybackDescription' => 'Use video tunneling. Disable if HDR playback shows black video.',
'settings.audioPassthrough' => 'Audio Passthrough',
'settings.audioPassthroughDescription' => 'Send Dolby/DTS audio to your receiver or TV without re-encoding, preserving surround sound. Turn off if you have no sound.',
'settings.audioPassthroughDescriptionAppleTv' => 'Hand Dolby Digital Plus (including Atmos) to the system for bitstream output. DTS and TrueHD still play as multichannel PCM. Brief audio gaps can occur when seeking.',
'settings.atmosDiagnostics' => 'Atmos Output Test',
'settings.atmosDiagnosticsDescription' => 'Diagnose Dolby Atmos output by playing test signals through the system player',
'settings.atmosTestHlsAtmos' => 'Apple Atmos stream',
'settings.atmosTestHlsAtmosDescription' => 'Known-good Dolby Atmos stream. The receiver should show Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Apple surround stream',
'settings.atmosTestHlsControlDescription' => 'Non-Atmos control stream. The receiver should show surround without Atmos.',
'settings.atmosTestRawStream' => 'Raw EAC3 stream',
'settings.atmosTestRawStreamDescription' => 'Streams the test file exactly like in-player Atmos playback. Needs the test file URL.',
'settings.atmosTestRawFile' => 'Raw EAC3 file',
'settings.atmosTestRawFileDescription' => 'Plays the test file with a known length. Needs the test file URL.',
'settings.atmosTestStop' => 'Stop test',
'settings.atmosTestUrl' => 'Test file URL',
'settings.atmosTestUrlDescription' => 'HTTP URL of a raw .ec3 Dolby Atmos file (e.g. extracted with ffmpeg)',
'settings.atmosTestUrlMissing' => 'Set the test file URL first',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Dolby Vision Conversion',
'settings.dvConversionModeDescription' => 'Choose how ExoPlayer handles Dolby Vision Profile 7 files.',
'settings.dvConversionAuto' => 'Auto',
@@ -5021,6 +5085,8 @@ extension on Translations {
'messages.unableToDetermineLibrarySection' => 'Unable to determine library section for this item',
'messages.logsCleared' => 'Logs cleared',
'messages.logsCopied' => 'Logs copied to clipboard',
_ => null,
} ?? switch (path) {
'messages.noLogsAvailable' => 'No logs available',
'messages.libraryScanning' => ({required Object title}) => 'Scanning "${title}"...',
'messages.libraryScanStarted' => ({required Object title}) => 'Library scan started for "${title}"',
@@ -5037,8 +5103,6 @@ extension on Translations {
'messages.noResultsFound' => 'No results found',
'messages.sleepTimerSet' => ({required Object label}) => 'Sleep timer set for ${label}',
'messages.noItemsAvailable' => 'No items available',
_ => null,
} ?? switch (path) {
'messages.failedToCreatePlayQueueNoItems' => 'Failed to create play queue - no items',
'messages.failedPlayback' => ({required Object action, required Object error}) => 'Failed to ${action}: ${error}',
'messages.switchingToCompatiblePlayer' => 'Switching to compatible player...',
@@ -5535,6 +5599,8 @@ extension on Translations {
'shaders.deleteShaderConfirm' => ({required Object name}) => 'Delete "${name}"?',
'companionRemote.title' => 'Companion Remote',
'companionRemote.connectedTo' => ({required Object name}) => 'Connected to ${name}',
_ => null,
} ?? switch (path) {
'companionRemote.unknownDevice' => 'Unknown Device',
'companionRemote.session.startingServer' => 'Starting remote server...',
'companionRemote.session.failedToCreate' => 'Failed to start remote server:',
@@ -5551,8 +5617,6 @@ extension on Translations {
'companionRemote.pairing.discoveryDescription' => 'Plezy devices with the same Plex account appear here',
'companionRemote.pairing.hostAddressHint' => '192.168.1.100:48632',
'companionRemote.pairing.connecting' => 'Connecting...',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.searchingForDevices' => 'Looking for devices...',
'companionRemote.pairing.noDevicesFound' => 'No devices found on your network',
'companionRemote.pairing.noDevicesHint' => 'Open Plezy on desktop and use the same WiFi',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Usar tunelización de video. Desactívala si HDR muestra video negro.';
@override String get audioPassthrough => 'Audio Passthrough';
@override String get audioPassthroughDescription => 'Envía el audio Dolby/DTS a tu receptor o TV sin recodificar, conservando el sonido envolvente. Desactívalo si no tienes sonido.';
@override String get audioPassthroughDescriptionAppleTv => 'Entrega Dolby Digital Plus (incluido Atmos) al sistema como bitstream. DTS y TrueHD se siguen reproduciendo como PCM multicanal. Pueden producirse breves cortes de audio al buscar.';
@override String get atmosDiagnostics => 'Prueba de salida Atmos';
@override String get atmosDiagnosticsDescription => 'Diagnostica la salida Dolby Atmos reproduciendo señales de prueba con el reproductor del sistema';
@override String get atmosTestHlsAtmos => 'Stream Atmos de Apple';
@override String get atmosTestHlsAtmosDescription => 'Stream Dolby Atmos de referencia. El receptor debería mostrar Dolby Atmos.';
@override String get atmosTestHlsControl => 'Stream surround de Apple';
@override String get atmosTestHlsControlDescription => 'Stream de control sin Atmos. El receptor debería mostrar surround sin Atmos.';
@override String get atmosTestRawStream => 'Stream EAC3 sin procesar';
@override String get atmosTestRawStreamDescription => 'Transmite el archivo de prueba igual que la reproducción Atmos del reproductor. Necesita la URL del archivo de prueba.';
@override String get atmosTestRawFile => 'Archivo EAC3 sin procesar';
@override String get atmosTestRawFileDescription => 'Reproduce el archivo de prueba con longitud conocida. Necesita la URL del archivo de prueba.';
@override String get atmosTestStop => 'Detener prueba';
@override String get atmosTestUrl => 'URL del archivo de prueba';
@override String get atmosTestUrlDescription => 'URL HTTP de un archivo .ec3 Dolby Atmos sin procesar (p. ej., extraído con ffmpeg)';
@override String get atmosTestUrlMissing => 'Configura primero la URL del archivo de prueba';
@override String get atmosTestStatus => 'Estado';
@override String get dvConversionMode => 'Conversión de Dolby Vision';
@override String get dvConversionModeDescription => 'Elige cómo ExoPlayer gestiona archivos Dolby Vision Profile 7.';
@override String get dvConversionAuto => 'Automático';
@@ -2184,6 +2200,22 @@ extension on TranslationsEs {
'settings.tunneledPlaybackDescription' => 'Usar tunelización de video. Desactívala si HDR muestra video negro.',
'settings.audioPassthrough' => 'Audio Passthrough',
'settings.audioPassthroughDescription' => 'Envía el audio Dolby/DTS a tu receptor o TV sin recodificar, conservando el sonido envolvente. Desactívalo si no tienes sonido.',
'settings.audioPassthroughDescriptionAppleTv' => 'Entrega Dolby Digital Plus (incluido Atmos) al sistema como bitstream. DTS y TrueHD se siguen reproduciendo como PCM multicanal. Pueden producirse breves cortes de audio al buscar.',
'settings.atmosDiagnostics' => 'Prueba de salida Atmos',
'settings.atmosDiagnosticsDescription' => 'Diagnostica la salida Dolby Atmos reproduciendo señales de prueba con el reproductor del sistema',
'settings.atmosTestHlsAtmos' => 'Stream Atmos de Apple',
'settings.atmosTestHlsAtmosDescription' => 'Stream Dolby Atmos de referencia. El receptor debería mostrar Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Stream surround de Apple',
'settings.atmosTestHlsControlDescription' => 'Stream de control sin Atmos. El receptor debería mostrar surround sin Atmos.',
'settings.atmosTestRawStream' => 'Stream EAC3 sin procesar',
'settings.atmosTestRawStreamDescription' => 'Transmite el archivo de prueba igual que la reproducción Atmos del reproductor. Necesita la URL del archivo de prueba.',
'settings.atmosTestRawFile' => 'Archivo EAC3 sin procesar',
'settings.atmosTestRawFileDescription' => 'Reproduce el archivo de prueba con longitud conocida. Necesita la URL del archivo de prueba.',
'settings.atmosTestStop' => 'Detener prueba',
'settings.atmosTestUrl' => 'URL del archivo de prueba',
'settings.atmosTestUrlDescription' => 'URL HTTP de un archivo .ec3 Dolby Atmos sin procesar (p. ej., extraído con ffmpeg)',
'settings.atmosTestUrlMissing' => 'Configura primero la URL del archivo de prueba',
'settings.atmosTestStatus' => 'Estado',
'settings.dvConversionMode' => 'Conversión de Dolby Vision',
'settings.dvConversionModeDescription' => 'Elige cómo ExoPlayer gestiona archivos Dolby Vision Profile 7.',
'settings.dvConversionAuto' => 'Automático',
@@ -2426,6 +2458,8 @@ extension on TranslationsEs {
'messages.libraryScanFailed' => ({required Object error}) => 'Error al escanear biblioteca: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Actualizando metadatos de "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Actualización de metadatos iniciada para "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Error al actualizar metadatos: ${error}',
'messages.logoutConfirm' => '¿Estás seguro de que quieres cerrar sesión?',
'messages.noSeasonsFound' => 'No se encontraron temporadas',
@@ -2442,8 +2476,6 @@ extension on TranslationsEs {
'messages.serverLimitTitle' => 'Error de reproducción',
'messages.serverLimitBody' => 'Error del servidor (HTTP 500). Un límite de ancho de banda/transcodificación probablemente rechazó esta sesión. Pide al propietario que lo ajuste.',
'messages.logsUploaded' => 'Registros subidos',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Error al subir registros',
'messages.logId' => 'ID de registro',
'subtitlingStyling.text' => 'Texto',
@@ -2940,6 +2972,8 @@ extension on TranslationsEs {
'companionRemote.session.serverStopped' => 'Servidor remoto detenido',
'companionRemote.session.serverRunningDescription' => 'Los dispositivos móviles de tu red pueden conectarse a esta app',
'companionRemote.session.serverStoppedDescription' => 'Inicia el servidor para permitir que los dispositivos móviles se conecten',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Usa tu dispositivo móvil para controlar esta aplicación',
'companionRemote.session.startServer' => 'Iniciar servidor',
'companionRemote.session.stopServer' => 'Detener servidor',
@@ -2956,8 +2990,6 @@ extension on TranslationsEs {
'companionRemote.pairing.validationHostRequired' => 'Ingresa la dirección del host',
'companionRemote.pairing.validationHostFormat' => 'El formato debe ser IP:puerto (ej. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Tiempo de conexión agotado. Usa la misma red en ambos dispositivos.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Dispositivo no encontrado. Asegúrate de que Plezy esté en ejecución en el host.',
'companionRemote.pairing.authFailed' => 'Autenticación fallida. Ambos dispositivos necesitan la misma cuenta Plex.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Error al conectar: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Utiliser le tunneling vidéo. Désactivez si la lecture HDR affiche un écran noir.';
@override String get audioPassthrough => 'Audio Pass-Through';
@override String get audioPassthroughDescription => 'Envoyez l\'audio Dolby/DTS vers votre ampli ou téléviseur sans réencodage, en conservant le son surround. Désactivez si vous n\'avez aucun son.';
@override String get audioPassthroughDescriptionAppleTv => 'Transmet le Dolby Digital Plus (y compris Atmos) au système en bitstream. Le DTS et le TrueHD restent lus en PCM multicanal. De brèves coupures audio peuvent survenir lors des sauts.';
@override String get atmosDiagnostics => 'Test de sortie Atmos';
@override String get atmosDiagnosticsDescription => 'Diagnostiquer la sortie Dolby Atmos en lisant des signaux de test via le lecteur système';
@override String get atmosTestHlsAtmos => 'Flux Atmos d\'Apple';
@override String get atmosTestHlsAtmosDescription => 'Flux Dolby Atmos réputé fiable. L\'ampli devrait afficher Dolby Atmos.';
@override String get atmosTestHlsControl => 'Flux surround d\'Apple';
@override String get atmosTestHlsControlDescription => 'Flux témoin sans Atmos. L\'ampli devrait afficher du surround sans Atmos.';
@override String get atmosTestRawStream => 'Flux EAC3 brut';
@override String get atmosTestRawStreamDescription => 'Diffuse le fichier de test exactement comme la lecture Atmos du lecteur. Nécessite l\'URL du fichier de test.';
@override String get atmosTestRawFile => 'Fichier EAC3 brut';
@override String get atmosTestRawFileDescription => 'Lit le fichier de test avec une longueur connue. Nécessite l\'URL du fichier de test.';
@override String get atmosTestStop => 'Arrêter le test';
@override String get atmosTestUrl => 'URL du fichier de test';
@override String get atmosTestUrlDescription => 'URL HTTP d\'un fichier .ec3 Dolby Atmos brut (extrait par ex. avec ffmpeg)';
@override String get atmosTestUrlMissing => 'Définissez d\'abord l\'URL du fichier de test';
@override String get atmosTestStatus => 'État';
@override String get dvConversionMode => 'Conversion Dolby Vision';
@override String get dvConversionModeDescription => 'Choisissez comment ExoPlayer gère les fichiers Dolby Vision Profile 7.';
@override String get dvConversionAuto => 'Auto';
@@ -2184,6 +2200,22 @@ extension on TranslationsFr {
'settings.tunneledPlaybackDescription' => 'Utiliser le tunneling vidéo. Désactivez si la lecture HDR affiche un écran noir.',
'settings.audioPassthrough' => 'Audio Pass-Through',
'settings.audioPassthroughDescription' => 'Envoyez l\'audio Dolby/DTS vers votre ampli ou téléviseur sans réencodage, en conservant le son surround. Désactivez si vous n\'avez aucun son.',
'settings.audioPassthroughDescriptionAppleTv' => 'Transmet le Dolby Digital Plus (y compris Atmos) au système en bitstream. Le DTS et le TrueHD restent lus en PCM multicanal. De brèves coupures audio peuvent survenir lors des sauts.',
'settings.atmosDiagnostics' => 'Test de sortie Atmos',
'settings.atmosDiagnosticsDescription' => 'Diagnostiquer la sortie Dolby Atmos en lisant des signaux de test via le lecteur système',
'settings.atmosTestHlsAtmos' => 'Flux Atmos d\'Apple',
'settings.atmosTestHlsAtmosDescription' => 'Flux Dolby Atmos réputé fiable. L\'ampli devrait afficher Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Flux surround d\'Apple',
'settings.atmosTestHlsControlDescription' => 'Flux témoin sans Atmos. L\'ampli devrait afficher du surround sans Atmos.',
'settings.atmosTestRawStream' => 'Flux EAC3 brut',
'settings.atmosTestRawStreamDescription' => 'Diffuse le fichier de test exactement comme la lecture Atmos du lecteur. Nécessite l\'URL du fichier de test.',
'settings.atmosTestRawFile' => 'Fichier EAC3 brut',
'settings.atmosTestRawFileDescription' => 'Lit le fichier de test avec une longueur connue. Nécessite l\'URL du fichier de test.',
'settings.atmosTestStop' => 'Arrêter le test',
'settings.atmosTestUrl' => 'URL du fichier de test',
'settings.atmosTestUrlDescription' => 'URL HTTP d\'un fichier .ec3 Dolby Atmos brut (extrait par ex. avec ffmpeg)',
'settings.atmosTestUrlMissing' => 'Définissez d\'abord l\'URL du fichier de test',
'settings.atmosTestStatus' => 'État',
'settings.dvConversionMode' => 'Conversion Dolby Vision',
'settings.dvConversionModeDescription' => 'Choisissez comment ExoPlayer gère les fichiers Dolby Vision Profile 7.',
'settings.dvConversionAuto' => 'Auto',
@@ -2426,6 +2458,8 @@ extension on TranslationsFr {
'messages.libraryScanFailed' => ({required Object error}) => 'Échec du scan de la bibliothèque: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Actualisation des métadonnées pour "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Actualisation des métadonnées lancée pour "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Échec de l\'actualisation des métadonnées: ${error}',
'messages.logoutConfirm' => 'Êtes-vous sûr de vouloir vous déconnecter ?',
'messages.noSeasonsFound' => 'Aucune saison trouvée',
@@ -2442,8 +2476,6 @@ extension on TranslationsFr {
'messages.serverLimitTitle' => 'Échec de la lecture',
'messages.serverLimitBody' => 'Erreur serveur (HTTP 500). Une limite de bande passante/transcodage a probablement rejeté cette session. Demandez au propriétaire de l\'ajuster.',
'messages.logsUploaded' => 'Logs envoyés',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Échec de l\'envoi des logs',
'messages.logId' => 'ID du log',
'subtitlingStyling.text' => 'Texte',
@@ -2940,6 +2972,8 @@ extension on TranslationsFr {
'companionRemote.session.serverStopped' => 'Serveur distant arrêté',
'companionRemote.session.serverRunningDescription' => 'Les appareils mobiles de votre réseau peuvent se connecter à cette app',
'companionRemote.session.serverStoppedDescription' => 'Démarrez le serveur pour permettre aux appareils mobiles de se connecter',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Utilisez votre appareil mobile pour contrôler cette application',
'companionRemote.session.startServer' => 'Démarrer le serveur',
'companionRemote.session.stopServer' => 'Arrêter le serveur',
@@ -2956,8 +2990,6 @@ extension on TranslationsFr {
'companionRemote.pairing.validationHostRequired' => 'Veuillez entrer l\'adresse de l\'hôte',
'companionRemote.pairing.validationHostFormat' => 'Le format doit être IP:port (ex. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Connexion expirée. Utilisez le même réseau sur les deux appareils.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Appareil introuvable. Assurez-vous que Plezy fonctionne sur l\'hôte.',
'companionRemote.pairing.authFailed' => 'Échec de l\'authentification. Les deux appareils doivent utiliser le même compte Plex.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Échec de la connexion : ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Usa tunneling video. Disattiva se la riproduzione HDR mostra video nero.';
@override String get audioPassthrough => 'Audio Passthrough';
@override String get audioPassthroughDescription => 'Invia l\'audio Dolby/DTS al ricevitore o alla TV senza ricodifica, mantenendo il suono surround. Disattiva se non senti audio.';
@override String get audioPassthroughDescriptionAppleTv => 'Consegna Dolby Digital Plus (incluso Atmos) al sistema come bitstream. DTS e TrueHD vengono comunque riprodotti come PCM multicanale. Durante i salti possono verificarsi brevi interruzioni audio.';
@override String get atmosDiagnostics => 'Test uscita Atmos';
@override String get atmosDiagnosticsDescription => 'Diagnostica l\'uscita Dolby Atmos riproducendo segnali di prova con il lettore di sistema';
@override String get atmosTestHlsAtmos => 'Stream Atmos di Apple';
@override String get atmosTestHlsAtmosDescription => 'Stream Dolby Atmos di riferimento. Il ricevitore dovrebbe mostrare Dolby Atmos.';
@override String get atmosTestHlsControl => 'Stream surround di Apple';
@override String get atmosTestHlsControlDescription => 'Stream di controllo senza Atmos. Il ricevitore dovrebbe mostrare surround senza Atmos.';
@override String get atmosTestRawStream => 'Stream EAC3 grezzo';
@override String get atmosTestRawStreamDescription => 'Trasmette il file di prova esattamente come la riproduzione Atmos del lettore. Richiede l\'URL del file di prova.';
@override String get atmosTestRawFile => 'File EAC3 grezzo';
@override String get atmosTestRawFileDescription => 'Riproduce il file di prova con lunghezza nota. Richiede l\'URL del file di prova.';
@override String get atmosTestStop => 'Interrompi test';
@override String get atmosTestUrl => 'URL del file di prova';
@override String get atmosTestUrlDescription => 'URL HTTP di un file .ec3 Dolby Atmos grezzo (ad es. estratto con ffmpeg)';
@override String get atmosTestUrlMissing => 'Imposta prima l\'URL del file di prova';
@override String get atmosTestStatus => 'Stato';
@override String get dvConversionMode => 'Conversione Dolby Vision';
@override String get dvConversionModeDescription => 'Scegli come ExoPlayer gestisce i file Dolby Vision Profile 7.';
@override String get dvConversionAuto => 'Auto';
@@ -2184,6 +2200,22 @@ extension on TranslationsIt {
'settings.tunneledPlaybackDescription' => 'Usa tunneling video. Disattiva se la riproduzione HDR mostra video nero.',
'settings.audioPassthrough' => 'Audio Passthrough',
'settings.audioPassthroughDescription' => 'Invia l\'audio Dolby/DTS al ricevitore o alla TV senza ricodifica, mantenendo il suono surround. Disattiva se non senti audio.',
'settings.audioPassthroughDescriptionAppleTv' => 'Consegna Dolby Digital Plus (incluso Atmos) al sistema come bitstream. DTS e TrueHD vengono comunque riprodotti come PCM multicanale. Durante i salti possono verificarsi brevi interruzioni audio.',
'settings.atmosDiagnostics' => 'Test uscita Atmos',
'settings.atmosDiagnosticsDescription' => 'Diagnostica l\'uscita Dolby Atmos riproducendo segnali di prova con il lettore di sistema',
'settings.atmosTestHlsAtmos' => 'Stream Atmos di Apple',
'settings.atmosTestHlsAtmosDescription' => 'Stream Dolby Atmos di riferimento. Il ricevitore dovrebbe mostrare Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Stream surround di Apple',
'settings.atmosTestHlsControlDescription' => 'Stream di controllo senza Atmos. Il ricevitore dovrebbe mostrare surround senza Atmos.',
'settings.atmosTestRawStream' => 'Stream EAC3 grezzo',
'settings.atmosTestRawStreamDescription' => 'Trasmette il file di prova esattamente come la riproduzione Atmos del lettore. Richiede l\'URL del file di prova.',
'settings.atmosTestRawFile' => 'File EAC3 grezzo',
'settings.atmosTestRawFileDescription' => 'Riproduce il file di prova con lunghezza nota. Richiede l\'URL del file di prova.',
'settings.atmosTestStop' => 'Interrompi test',
'settings.atmosTestUrl' => 'URL del file di prova',
'settings.atmosTestUrlDescription' => 'URL HTTP di un file .ec3 Dolby Atmos grezzo (ad es. estratto con ffmpeg)',
'settings.atmosTestUrlMissing' => 'Imposta prima l\'URL del file di prova',
'settings.atmosTestStatus' => 'Stato',
'settings.dvConversionMode' => 'Conversione Dolby Vision',
'settings.dvConversionModeDescription' => 'Scegli come ExoPlayer gestisce i file Dolby Vision Profile 7.',
'settings.dvConversionAuto' => 'Auto',
@@ -2426,6 +2458,8 @@ extension on TranslationsIt {
'messages.libraryScanFailed' => ({required Object error}) => 'Impossibile eseguire scansione della libreria: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Aggiornamento metadati per "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Aggiornamento metadati per "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Errore aggiornamento metadati: ${error}',
'messages.logoutConfirm' => 'Sei sicuro di volerti disconnettere?',
'messages.noSeasonsFound' => 'Nessuna stagione trovata',
@@ -2442,8 +2476,6 @@ extension on TranslationsIt {
'messages.serverLimitTitle' => 'Riproduzione non riuscita',
'messages.serverLimitBody' => 'Errore server (HTTP 500). Un limite di banda/transcodifica probabilmente ha rifiutato questa sessione. Chiedi al proprietario di modificarlo.',
'messages.logsUploaded' => 'Log caricati',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Caricamento log fallito',
'messages.logId' => 'ID log',
'subtitlingStyling.text' => 'Testo',
@@ -2940,6 +2972,8 @@ extension on TranslationsIt {
'companionRemote.session.serverStopped' => 'Server remoto arrestato',
'companionRemote.session.serverRunningDescription' => 'I dispositivi mobili sulla tua rete possono connettersi a questa app',
'companionRemote.session.serverStoppedDescription' => 'Avvia il server per consentire ai dispositivi mobili di connettersi',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Usa il tuo dispositivo mobile per controllare questa app',
'companionRemote.session.startServer' => 'Avvia server',
'companionRemote.session.stopServer' => 'Arresta server',
@@ -2956,8 +2990,6 @@ extension on TranslationsIt {
'companionRemote.pairing.validationHostRequired' => 'Inserisci l\'indirizzo host',
'companionRemote.pairing.validationHostFormat' => 'Il formato deve essere IP:porta (es. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Connessione scaduta. Usa la stessa rete su entrambi i dispositivi.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Dispositivo non trovato. Assicurati che Plezy sia in esecuzione sull\'host.',
'companionRemote.pairing.authFailed' => 'Autenticazione non riuscita. Entrambi i dispositivi devono usare lo stesso account Plex.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Connessione fallita: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => '動画トンネリングを使用します。HDR再生で画面が黒くなる場合は無効にしてください。';
@override String get audioPassthrough => 'オーディオパススルー';
@override String get audioPassthroughDescription => 'Dolby/DTS音声を再エンコードせずにレシーバーやテレビに送り、サラウンドを維持します。音が出ない場合は無効にしてください。';
@override String get audioPassthroughDescriptionAppleTv => 'Dolby Digital PlusAtmos含む)をビットストリームとしてシステムに渡します。DTSとTrueHDは引き続きマルチチャンネルPCMで再生されます。シーク時に短い音切れが発生することがあります。';
@override String get atmosDiagnostics => 'Atmos出力テスト';
@override String get atmosDiagnosticsDescription => 'システムプレイヤーでテスト信号を再生してDolby Atmos出力を診断します';
@override String get atmosTestHlsAtmos => 'Apple Atmosストリーム';
@override String get atmosTestHlsAtmosDescription => '動作確認済みのDolby Atmosストリーム。レシーバーにDolby Atmosと表示されるはずです。';
@override String get atmosTestHlsControl => 'Appleサラウンドストリーム';
@override String get atmosTestHlsControlDescription => 'Atmosなしの比較用ストリーム。レシーバーにAtmosなしのサラウンドが表示されるはずです。';
@override String get atmosTestRawStream => '生EAC3ストリーム';
@override String get atmosTestRawStreamDescription => 'プレイヤー内のAtmos再生と同じ方式でテストファイルをストリーミングします。テストファイルのURLが必要です。';
@override String get atmosTestRawFile => '生EAC3ファイル';
@override String get atmosTestRawFileDescription => '長さが既知のテストファイルを再生します。テストファイルのURLが必要です。';
@override String get atmosTestStop => 'テストを停止';
@override String get atmosTestUrl => 'テストファイルのURL';
@override String get atmosTestUrlDescription => '生の.ec3 Dolby AtmosファイルのHTTP URL(例: ffmpegで抽出)';
@override String get atmosTestUrlMissing => '先にテストファイルのURLを設定してください';
@override String get atmosTestStatus => 'ステータス';
@override String get dvConversionMode => 'Dolby Vision 変換';
@override String get dvConversionModeDescription => 'ExoPlayer が Dolby Vision Profile 7 ファイルを処理する方法を選択します。';
@override String get dvConversionAuto => '自動';
@@ -2184,6 +2200,22 @@ extension on TranslationsJa {
'settings.tunneledPlaybackDescription' => '動画トンネリングを使用します。HDR再生で画面が黒くなる場合は無効にしてください。',
'settings.audioPassthrough' => 'オーディオパススルー',
'settings.audioPassthroughDescription' => 'Dolby/DTS音声を再エンコードせずにレシーバーやテレビに送り、サラウンドを維持します。音が出ない場合は無効にしてください。',
'settings.audioPassthroughDescriptionAppleTv' => 'Dolby Digital PlusAtmos含む)をビットストリームとしてシステムに渡します。DTSとTrueHDは引き続きマルチチャンネルPCMで再生されます。シーク時に短い音切れが発生することがあります。',
'settings.atmosDiagnostics' => 'Atmos出力テスト',
'settings.atmosDiagnosticsDescription' => 'システムプレイヤーでテスト信号を再生してDolby Atmos出力を診断します',
'settings.atmosTestHlsAtmos' => 'Apple Atmosストリーム',
'settings.atmosTestHlsAtmosDescription' => '動作確認済みのDolby Atmosストリーム。レシーバーにDolby Atmosと表示されるはずです。',
'settings.atmosTestHlsControl' => 'Appleサラウンドストリーム',
'settings.atmosTestHlsControlDescription' => 'Atmosなしの比較用ストリーム。レシーバーにAtmosなしのサラウンドが表示されるはずです。',
'settings.atmosTestRawStream' => '生EAC3ストリーム',
'settings.atmosTestRawStreamDescription' => 'プレイヤー内のAtmos再生と同じ方式でテストファイルをストリーミングします。テストファイルのURLが必要です。',
'settings.atmosTestRawFile' => '生EAC3ファイル',
'settings.atmosTestRawFileDescription' => '長さが既知のテストファイルを再生します。テストファイルのURLが必要です。',
'settings.atmosTestStop' => 'テストを停止',
'settings.atmosTestUrl' => 'テストファイルのURL',
'settings.atmosTestUrlDescription' => '生の.ec3 Dolby AtmosファイルのHTTP URL(例: ffmpegで抽出)',
'settings.atmosTestUrlMissing' => '先にテストファイルのURLを設定してください',
'settings.atmosTestStatus' => 'ステータス',
'settings.dvConversionMode' => 'Dolby Vision 変換',
'settings.dvConversionModeDescription' => 'ExoPlayer が Dolby Vision Profile 7 ファイルを処理する方法を選択します。',
'settings.dvConversionAuto' => '自動',
@@ -2426,6 +2458,8 @@ extension on TranslationsJa {
'messages.libraryScanFailed' => ({required Object error}) => 'ライブラリのスキャンに失敗しました: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => '"${title}"のメタデータを更新中...',
'messages.metadataRefreshStarted' => ({required Object title}) => '"${title}"のメタデータ更新を開始しました',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'メタデータの更新に失敗しました: ${error}',
'messages.logoutConfirm' => 'ログアウトしてもよろしいですか?',
'messages.noSeasonsFound' => 'シーズンが見つかりません',
@@ -2442,8 +2476,6 @@ extension on TranslationsJa {
'messages.serverLimitTitle' => '再生に失敗しました',
'messages.serverLimitBody' => 'サーバーエラー(HTTP 500)。帯域幅/トランスコード制限により拒否された可能性があります。所有者に調整を依頼してください。',
'messages.logsUploaded' => 'ログをアップロードしました',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'ログのアップロードに失敗しました',
'messages.logId' => 'ログID',
'subtitlingStyling.text' => 'テキスト',
@@ -2940,6 +2972,8 @@ extension on TranslationsJa {
'companionRemote.session.serverStopped' => 'リモートサーバー停止中',
'companionRemote.session.serverRunningDescription' => 'ネットワーク上のモバイルデバイスがこのアプリに接続できます',
'companionRemote.session.serverStoppedDescription' => 'モバイルデバイスの接続を許可するにはサーバーを起動してください',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'モバイルデバイスでこのアプリを操作できます',
'companionRemote.session.startServer' => 'サーバーを起動',
'companionRemote.session.stopServer' => 'サーバーを停止',
@@ -2956,8 +2990,6 @@ extension on TranslationsJa {
'companionRemote.pairing.validationHostRequired' => 'ホストアドレスを入力してください',
'companionRemote.pairing.validationHostFormat' => '形式はIP:ポートである必要があります(例: 192.168.1.100:48632',
'companionRemote.pairing.connectionTimedOut' => '接続がタイムアウトしました。両方のデバイスで同じネットワークを使用してください。',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'デバイスが見つかりません。ホストでPlezyが実行中か確認してください。',
'companionRemote.pairing.authFailed' => '認証に失敗しました。両方のデバイスで同じPlexアカウントが必要です。',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => '接続に失敗しました: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => '비디오 터널링을 사용합니다. HDR 재생 시 검은 화면이 보이면 비활성화하세요.';
@override String get audioPassthrough => '오디오 패스스루';
@override String get audioPassthroughDescription => 'Dolby/DTS 오디오를 재인코딩 없이 리시버나 TV로 전송하여 서라운드 사운드를 유지합니다. 소리가 나지 않으면 비활성화하세요.';
@override String get audioPassthroughDescriptionAppleTv => 'Dolby Digital Plus(Atmos 포함)를 비트스트림으로 시스템에 전달합니다. DTS와 TrueHD는 계속 멀티채널 PCM으로 재생됩니다. 탐색 시 짧은 소리 끊김이 발생할 수 있습니다.';
@override String get atmosDiagnostics => 'Atmos 출력 테스트';
@override String get atmosDiagnosticsDescription => '시스템 플레이어로 테스트 신호를 재생하여 Dolby Atmos 출력을 진단합니다';
@override String get atmosTestHlsAtmos => 'Apple Atmos 스트림';
@override String get atmosTestHlsAtmosDescription => '검증된 Dolby Atmos 스트림입니다. 리시버에 Dolby Atmos가 표시되어야 합니다.';
@override String get atmosTestHlsControl => 'Apple 서라운드 스트림';
@override String get atmosTestHlsControlDescription => 'Atmos 없는 대조용 스트림입니다. 리시버에 Atmos 없는 서라운드가 표시되어야 합니다.';
@override String get atmosTestRawStream => '원시 EAC3 스트림';
@override String get atmosTestRawStreamDescription => '플레이어 내 Atmos 재생과 동일한 방식으로 테스트 파일을 스트리밍합니다. 테스트 파일 URL이 필요합니다.';
@override String get atmosTestRawFile => '원시 EAC3 파일';
@override String get atmosTestRawFileDescription => '길이가 알려진 테스트 파일을 재생합니다. 테스트 파일 URL이 필요합니다.';
@override String get atmosTestStop => '테스트 중지';
@override String get atmosTestUrl => '테스트 파일 URL';
@override String get atmosTestUrlDescription => '원시 .ec3 Dolby Atmos 파일의 HTTP URL(예: ffmpeg로 추출)';
@override String get atmosTestUrlMissing => '먼저 테스트 파일 URL을 설정하세요';
@override String get atmosTestStatus => '상태';
@override String get dvConversionMode => 'Dolby Vision 변환';
@override String get dvConversionModeDescription => 'ExoPlayer가 Dolby Vision Profile 7 파일을 처리하는 방식을 선택합니다.';
@override String get dvConversionAuto => '자동';
@@ -2184,6 +2200,22 @@ extension on TranslationsKo {
'settings.tunneledPlaybackDescription' => '비디오 터널링을 사용합니다. HDR 재생 시 검은 화면이 보이면 비활성화하세요.',
'settings.audioPassthrough' => '오디오 패스스루',
'settings.audioPassthroughDescription' => 'Dolby/DTS 오디오를 재인코딩 없이 리시버나 TV로 전송하여 서라운드 사운드를 유지합니다. 소리가 나지 않으면 비활성화하세요.',
'settings.audioPassthroughDescriptionAppleTv' => 'Dolby Digital Plus(Atmos 포함)를 비트스트림으로 시스템에 전달합니다. DTS와 TrueHD는 계속 멀티채널 PCM으로 재생됩니다. 탐색 시 짧은 소리 끊김이 발생할 수 있습니다.',
'settings.atmosDiagnostics' => 'Atmos 출력 테스트',
'settings.atmosDiagnosticsDescription' => '시스템 플레이어로 테스트 신호를 재생하여 Dolby Atmos 출력을 진단합니다',
'settings.atmosTestHlsAtmos' => 'Apple Atmos 스트림',
'settings.atmosTestHlsAtmosDescription' => '검증된 Dolby Atmos 스트림입니다. 리시버에 Dolby Atmos가 표시되어야 합니다.',
'settings.atmosTestHlsControl' => 'Apple 서라운드 스트림',
'settings.atmosTestHlsControlDescription' => 'Atmos 없는 대조용 스트림입니다. 리시버에 Atmos 없는 서라운드가 표시되어야 합니다.',
'settings.atmosTestRawStream' => '원시 EAC3 스트림',
'settings.atmosTestRawStreamDescription' => '플레이어 내 Atmos 재생과 동일한 방식으로 테스트 파일을 스트리밍합니다. 테스트 파일 URL이 필요합니다.',
'settings.atmosTestRawFile' => '원시 EAC3 파일',
'settings.atmosTestRawFileDescription' => '길이가 알려진 테스트 파일을 재생합니다. 테스트 파일 URL이 필요합니다.',
'settings.atmosTestStop' => '테스트 중지',
'settings.atmosTestUrl' => '테스트 파일 URL',
'settings.atmosTestUrlDescription' => '원시 .ec3 Dolby Atmos 파일의 HTTP URL(예: ffmpeg로 추출)',
'settings.atmosTestUrlMissing' => '먼저 테스트 파일 URL을 설정하세요',
'settings.atmosTestStatus' => '상태',
'settings.dvConversionMode' => 'Dolby Vision 변환',
'settings.dvConversionModeDescription' => 'ExoPlayer가 Dolby Vision Profile 7 파일을 처리하는 방식을 선택합니다.',
'settings.dvConversionAuto' => '자동',
@@ -2426,6 +2458,8 @@ extension on TranslationsKo {
'messages.libraryScanFailed' => ({required Object error}) => '미디어 라이브러리 스캔 실패: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => '"${title}" 메타데이터 새로고침 중...',
'messages.metadataRefreshStarted' => ({required Object title}) => '"${title}" 메타데이터 새로고침 시작됨',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => '메타데이터 새로고침 실패: ${error}',
'messages.logoutConfirm' => '로그아웃 하시겠습니까?',
'messages.noSeasonsFound' => '시즌을 찾을 수 없음',
@@ -2442,8 +2476,6 @@ extension on TranslationsKo {
'messages.serverLimitTitle' => '재생 실패',
'messages.serverLimitBody' => '서버 오류(HTTP 500). 대역폭/트랜스코딩 제한으로 세션이 거부된 것 같습니다. 소유자에게 조정을 요청하세요.',
'messages.logsUploaded' => '로그 업로드 완료',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => '로그 업로드 실패',
'messages.logId' => '로그 ID',
'subtitlingStyling.text' => '텍스트',
@@ -2940,6 +2972,8 @@ extension on TranslationsKo {
'companionRemote.session.serverStopped' => '원격 서버 중지됨',
'companionRemote.session.serverRunningDescription' => '네트워크의 모바일 기기가 이 앱에 연결할 수 있습니다',
'companionRemote.session.serverStoppedDescription' => '모바일 기기의 연결을 허용하려면 서버를 시작하세요',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => '모바일 기기로 이 앱을 제어하세요',
'companionRemote.session.startServer' => '서버 시작',
'companionRemote.session.stopServer' => '서버 중지',
@@ -2956,8 +2990,6 @@ extension on TranslationsKo {
'companionRemote.pairing.validationHostRequired' => '호스트 주소를 입력하세요',
'companionRemote.pairing.validationHostFormat' => '형식은 IP:포트여야 합니다 (예: 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => '연결 시간이 초과되었습니다. 두 기기에서 같은 네트워크를 사용하세요.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => '기기를 찾을 수 없습니다. 호스트에서 Plezy가 실행 중인지 확인하세요.',
'companionRemote.pairing.authFailed' => '인증에 실패했습니다. 두 기기 모두 같은 Plex 계정이 필요합니다.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => '연결 실패: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Bruk videotunneling. Slå av hvis HDR-avspilling viser svart video.';
@override String get audioPassthrough => 'Lydgjennomgang';
@override String get audioPassthroughDescription => 'Send Dolby/DTS-lyd til mottakeren eller TV-en uten omkoding, slik at surroundlyd bevares. Slå av hvis du ikke har lyd.';
@override String get audioPassthroughDescriptionAppleTv => 'Overlater Dolby Digital Plus (inkl. Atmos) til systemet som bitstream. DTS og TrueHD spilles fortsatt av som flerkanals PCM. Korte lydbrudd kan forekomme ved søking.';
@override String get atmosDiagnostics => 'Atmos-utgangstest';
@override String get atmosDiagnosticsDescription => 'Diagnostiser Dolby Atmos-utgangen ved å spille testsignaler gjennom systemspilleren';
@override String get atmosTestHlsAtmos => 'Apple Atmos-strøm';
@override String get atmosTestHlsAtmosDescription => 'Kjent god Dolby Atmos-strøm. Mottakeren bør vise Dolby Atmos.';
@override String get atmosTestHlsControl => 'Apple surround-strøm';
@override String get atmosTestHlsControlDescription => 'Kontrollstrøm uten Atmos. Mottakeren bør vise surround uten Atmos.';
@override String get atmosTestRawStream => 'Rå EAC3-strøm';
@override String get atmosTestRawStreamDescription => 'Strømmer testfilen akkurat som Atmos-avspilling i spilleren. Krever testfilens URL.';
@override String get atmosTestRawFile => 'Rå EAC3-fil';
@override String get atmosTestRawFileDescription => 'Spiller av testfilen med kjent lengde. Krever testfilens URL.';
@override String get atmosTestStop => 'Stopp test';
@override String get atmosTestUrl => 'Testfilens URL';
@override String get atmosTestUrlDescription => 'HTTP-URL til en rå .ec3 Dolby Atmos-fil (f.eks. hentet ut med ffmpeg)';
@override String get atmosTestUrlMissing => 'Angi testfilens URL først';
@override String get atmosTestStatus => 'Status';
@override String get dvConversionMode => 'Dolby Vision-konvertering';
@override String get dvConversionModeDescription => 'Velg hvordan ExoPlayer håndterer Dolby Vision Profile 7-filer.';
@override String get dvConversionAuto => 'Auto';
@@ -2184,6 +2200,22 @@ extension on TranslationsNb {
'settings.tunneledPlaybackDescription' => 'Bruk videotunneling. Slå av hvis HDR-avspilling viser svart video.',
'settings.audioPassthrough' => 'Lydgjennomgang',
'settings.audioPassthroughDescription' => 'Send Dolby/DTS-lyd til mottakeren eller TV-en uten omkoding, slik at surroundlyd bevares. Slå av hvis du ikke har lyd.',
'settings.audioPassthroughDescriptionAppleTv' => 'Overlater Dolby Digital Plus (inkl. Atmos) til systemet som bitstream. DTS og TrueHD spilles fortsatt av som flerkanals PCM. Korte lydbrudd kan forekomme ved søking.',
'settings.atmosDiagnostics' => 'Atmos-utgangstest',
'settings.atmosDiagnosticsDescription' => 'Diagnostiser Dolby Atmos-utgangen ved å spille testsignaler gjennom systemspilleren',
'settings.atmosTestHlsAtmos' => 'Apple Atmos-strøm',
'settings.atmosTestHlsAtmosDescription' => 'Kjent god Dolby Atmos-strøm. Mottakeren bør vise Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Apple surround-strøm',
'settings.atmosTestHlsControlDescription' => 'Kontrollstrøm uten Atmos. Mottakeren bør vise surround uten Atmos.',
'settings.atmosTestRawStream' => 'Rå EAC3-strøm',
'settings.atmosTestRawStreamDescription' => 'Strømmer testfilen akkurat som Atmos-avspilling i spilleren. Krever testfilens URL.',
'settings.atmosTestRawFile' => 'Rå EAC3-fil',
'settings.atmosTestRawFileDescription' => 'Spiller av testfilen med kjent lengde. Krever testfilens URL.',
'settings.atmosTestStop' => 'Stopp test',
'settings.atmosTestUrl' => 'Testfilens URL',
'settings.atmosTestUrlDescription' => 'HTTP-URL til en rå .ec3 Dolby Atmos-fil (f.eks. hentet ut med ffmpeg)',
'settings.atmosTestUrlMissing' => 'Angi testfilens URL først',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Dolby Vision-konvertering',
'settings.dvConversionModeDescription' => 'Velg hvordan ExoPlayer håndterer Dolby Vision Profile 7-filer.',
'settings.dvConversionAuto' => 'Auto',
@@ -2426,6 +2458,8 @@ extension on TranslationsNb {
'messages.libraryScanFailed' => ({required Object error}) => 'Kunne ikke skanne bibliotek: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Oppdaterer metadata for "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Metadataoppdatering startet for "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Kunne ikke oppdatere metadata: ${error}',
'messages.logoutConfirm' => 'Er du sikker på at du vil logge ut?',
'messages.noSeasonsFound' => 'Ingen sesonger funnet',
@@ -2442,8 +2476,6 @@ extension on TranslationsNb {
'messages.serverLimitTitle' => 'Avspilling mislyktes',
'messages.serverLimitBody' => 'Serverfeil (HTTP 500). En båndbredde-/transkodingsgrense avviste trolig økten. Be eieren justere den.',
'messages.logsUploaded' => 'Logger lastet opp',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Kunne ikke laste opp logger',
'messages.logId' => 'Logg-ID',
'subtitlingStyling.text' => 'Tekst',
@@ -2940,6 +2972,8 @@ extension on TranslationsNb {
'companionRemote.session.serverStopped' => 'Fjernserver stoppet',
'companionRemote.session.serverRunningDescription' => 'Mobile enheter på nettverket ditt kan koble til denne appen',
'companionRemote.session.serverStoppedDescription' => 'Start serveren for å la mobilenheter koble til',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Bruk mobilenheten din til å styre denne appen',
'companionRemote.session.startServer' => 'Start server',
'companionRemote.session.stopServer' => 'Stopp server',
@@ -2956,8 +2990,6 @@ extension on TranslationsNb {
'companionRemote.pairing.validationHostRequired' => 'Vennligst oppgi vertsadresse',
'companionRemote.pairing.validationHostFormat' => 'Format må være IP:port (f.eks. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Tilkoblingen fikk tidsavbrudd. Bruk samme nettverk på begge enheter.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Enhet ikke funnet. Sørg for at Plezy kjører på verten.',
'companionRemote.pairing.authFailed' => 'Autentisering mislyktes. Begge enheter må bruke samme Plex-konto.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kunne ikke koble til: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Gebruik videotunneling. Schakel uit als HDR-afspelen zwart beeld geeft.';
@override String get audioPassthrough => 'Audio-doorvoer';
@override String get audioPassthroughDescription => 'Stuur Dolby/DTS-audio zonder hercodering naar je receiver of tv en behoud surroundgeluid. Schakel uit als je geen geluid hebt.';
@override String get audioPassthroughDescriptionAppleTv => 'Geeft Dolby Digital Plus (incl. Atmos) als bitstream aan het systeem door. DTS en TrueHD worden nog steeds als meerkanaals PCM afgespeeld. Bij zoeken kunnen korte geluidsonderbrekingen optreden.';
@override String get atmosDiagnostics => 'Atmos-uitvoertest';
@override String get atmosDiagnosticsDescription => 'Diagnosticeer de Dolby Atmos-uitvoer door testsignalen via de systeemspeler af te spelen';
@override String get atmosTestHlsAtmos => 'Apple Atmos-stream';
@override String get atmosTestHlsAtmosDescription => 'Bewezen werkende Dolby Atmos-stream. De receiver zou Dolby Atmos moeten tonen.';
@override String get atmosTestHlsControl => 'Apple surround-stream';
@override String get atmosTestHlsControlDescription => 'Controlestream zonder Atmos. De receiver zou surround zonder Atmos moeten tonen.';
@override String get atmosTestRawStream => 'Ruwe EAC3-stream';
@override String get atmosTestRawStreamDescription => 'Streamt het testbestand precies zoals Atmos-weergave in de speler. Vereist de URL van het testbestand.';
@override String get atmosTestRawFile => 'Ruw EAC3-bestand';
@override String get atmosTestRawFileDescription => 'Speelt het testbestand met bekende lengte af. Vereist de URL van het testbestand.';
@override String get atmosTestStop => 'Test stoppen';
@override String get atmosTestUrl => 'URL van testbestand';
@override String get atmosTestUrlDescription => 'HTTP-URL van een ruw .ec3 Dolby Atmos-bestand (bijv. uitgepakt met ffmpeg)';
@override String get atmosTestUrlMissing => 'Stel eerst de URL van het testbestand in';
@override String get atmosTestStatus => 'Status';
@override String get dvConversionMode => 'Dolby Vision-conversie';
@override String get dvConversionModeDescription => 'Kies hoe ExoPlayer Dolby Vision Profile 7-bestanden verwerkt.';
@override String get dvConversionAuto => 'Auto';
@@ -2184,6 +2200,22 @@ extension on TranslationsNl {
'settings.tunneledPlaybackDescription' => 'Gebruik videotunneling. Schakel uit als HDR-afspelen zwart beeld geeft.',
'settings.audioPassthrough' => 'Audio-doorvoer',
'settings.audioPassthroughDescription' => 'Stuur Dolby/DTS-audio zonder hercodering naar je receiver of tv en behoud surroundgeluid. Schakel uit als je geen geluid hebt.',
'settings.audioPassthroughDescriptionAppleTv' => 'Geeft Dolby Digital Plus (incl. Atmos) als bitstream aan het systeem door. DTS en TrueHD worden nog steeds als meerkanaals PCM afgespeeld. Bij zoeken kunnen korte geluidsonderbrekingen optreden.',
'settings.atmosDiagnostics' => 'Atmos-uitvoertest',
'settings.atmosDiagnosticsDescription' => 'Diagnosticeer de Dolby Atmos-uitvoer door testsignalen via de systeemspeler af te spelen',
'settings.atmosTestHlsAtmos' => 'Apple Atmos-stream',
'settings.atmosTestHlsAtmosDescription' => 'Bewezen werkende Dolby Atmos-stream. De receiver zou Dolby Atmos moeten tonen.',
'settings.atmosTestHlsControl' => 'Apple surround-stream',
'settings.atmosTestHlsControlDescription' => 'Controlestream zonder Atmos. De receiver zou surround zonder Atmos moeten tonen.',
'settings.atmosTestRawStream' => 'Ruwe EAC3-stream',
'settings.atmosTestRawStreamDescription' => 'Streamt het testbestand precies zoals Atmos-weergave in de speler. Vereist de URL van het testbestand.',
'settings.atmosTestRawFile' => 'Ruw EAC3-bestand',
'settings.atmosTestRawFileDescription' => 'Speelt het testbestand met bekende lengte af. Vereist de URL van het testbestand.',
'settings.atmosTestStop' => 'Test stoppen',
'settings.atmosTestUrl' => 'URL van testbestand',
'settings.atmosTestUrlDescription' => 'HTTP-URL van een ruw .ec3 Dolby Atmos-bestand (bijv. uitgepakt met ffmpeg)',
'settings.atmosTestUrlMissing' => 'Stel eerst de URL van het testbestand in',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Dolby Vision-conversie',
'settings.dvConversionModeDescription' => 'Kies hoe ExoPlayer Dolby Vision Profile 7-bestanden verwerkt.',
'settings.dvConversionAuto' => 'Auto',
@@ -2426,6 +2458,8 @@ extension on TranslationsNl {
'messages.libraryScanFailed' => ({required Object error}) => 'Kon bibliotheek niet scannen: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Metadata vernieuwen voor "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Metadata vernieuwen gestart voor "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Kon metadata niet vernieuwen: ${error}',
'messages.logoutConfirm' => 'Weet je zeker dat je wilt uitloggen?',
'messages.noSeasonsFound' => 'Geen seizoenen gevonden',
@@ -2442,8 +2476,6 @@ extension on TranslationsNl {
'messages.serverLimitTitle' => 'Afspelen mislukt',
'messages.serverLimitBody' => 'Serverfout (HTTP 500). Waarschijnlijk weigerde een bandbreedte-/transcodeerlimiet deze sessie. Vraag de eigenaar dit aan te passen.',
'messages.logsUploaded' => 'Logs geüpload',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Uploaden van logs mislukt',
'messages.logId' => 'Log-ID',
'subtitlingStyling.text' => 'Tekst',
@@ -2940,6 +2972,8 @@ extension on TranslationsNl {
'companionRemote.session.serverStopped' => 'Externe server gestopt',
'companionRemote.session.serverRunningDescription' => 'Mobiele apparaten op je netwerk kunnen met deze app verbinden',
'companionRemote.session.serverStoppedDescription' => 'Start de server om mobiele apparaten te laten verbinden',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Gebruik je mobiele apparaat om deze app te bedienen',
'companionRemote.session.startServer' => 'Server starten',
'companionRemote.session.stopServer' => 'Server stoppen',
@@ -2956,8 +2990,6 @@ extension on TranslationsNl {
'companionRemote.pairing.validationHostRequired' => 'Voer het hostadres in',
'companionRemote.pairing.validationHostFormat' => 'Formaat moet IP:poort zijn (bijv. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Verbinding verlopen. Gebruik hetzelfde netwerk op beide apparaten.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Apparaat niet gevonden. Zorg dat Plezy op de host draait.',
'companionRemote.pairing.authFailed' => 'Authenticatie mislukt. Beide apparaten hebben hetzelfde Plex-account nodig.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kan niet verbinden: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Użyj tunelowania wideo. Wyłącz, jeśli HDR pokazuje czarny obraz.';
@override String get audioPassthrough => 'Bezpośrednie audio';
@override String get audioPassthroughDescription => 'Wysyłaj dźwięk Dolby/DTS do amplitunera lub telewizora bez ponownego kodowania, zachowując dźwięk przestrzenny. Wyłącz, jeśli nie ma dźwięku.';
@override String get audioPassthroughDescriptionAppleTv => 'Przekazuje Dolby Digital Plus (w tym Atmos) do systemu jako bitstream. DTS i TrueHD nadal odtwarzane są jako wielokanałowe PCM. Podczas przewijania mogą wystąpić krótkie przerwy w dźwięku.';
@override String get atmosDiagnostics => 'Test wyjścia Atmos';
@override String get atmosDiagnosticsDescription => 'Diagnozuj wyjście Dolby Atmos, odtwarzając sygnały testowe przez odtwarzacz systemowy';
@override String get atmosTestHlsAtmos => 'Strumień Atmos Apple';
@override String get atmosTestHlsAtmosDescription => 'Sprawdzony strumień Dolby Atmos. Amplituner powinien pokazać Dolby Atmos.';
@override String get atmosTestHlsControl => 'Strumień surround Apple';
@override String get atmosTestHlsControlDescription => 'Strumień kontrolny bez Atmos. Amplituner powinien pokazać surround bez Atmos.';
@override String get atmosTestRawStream => 'Surowy strumień EAC3';
@override String get atmosTestRawStreamDescription => 'Strumieniuje plik testowy dokładnie jak odtwarzanie Atmos w odtwarzaczu. Wymaga URL pliku testowego.';
@override String get atmosTestRawFile => 'Surowy plik EAC3';
@override String get atmosTestRawFileDescription => 'Odtwarza plik testowy o znanej długości. Wymaga URL pliku testowego.';
@override String get atmosTestStop => 'Zatrzymaj test';
@override String get atmosTestUrl => 'URL pliku testowego';
@override String get atmosTestUrlDescription => 'HTTP URL surowego pliku .ec3 Dolby Atmos (np. wyodrębnionego przez ffmpeg)';
@override String get atmosTestUrlMissing => 'Najpierw ustaw URL pliku testowego';
@override String get atmosTestStatus => 'Stan';
@override String get dvConversionMode => 'Konwersja Dolby Vision';
@override String get dvConversionModeDescription => 'Wybierz, jak ExoPlayer obsługuje pliki Dolby Vision Profile 7.';
@override String get dvConversionAuto => 'Automatycznie';
@@ -2184,6 +2200,22 @@ extension on TranslationsPl {
'settings.tunneledPlaybackDescription' => 'Użyj tunelowania wideo. Wyłącz, jeśli HDR pokazuje czarny obraz.',
'settings.audioPassthrough' => 'Bezpośrednie audio',
'settings.audioPassthroughDescription' => 'Wysyłaj dźwięk Dolby/DTS do amplitunera lub telewizora bez ponownego kodowania, zachowując dźwięk przestrzenny. Wyłącz, jeśli nie ma dźwięku.',
'settings.audioPassthroughDescriptionAppleTv' => 'Przekazuje Dolby Digital Plus (w tym Atmos) do systemu jako bitstream. DTS i TrueHD nadal odtwarzane są jako wielokanałowe PCM. Podczas przewijania mogą wystąpić krótkie przerwy w dźwięku.',
'settings.atmosDiagnostics' => 'Test wyjścia Atmos',
'settings.atmosDiagnosticsDescription' => 'Diagnozuj wyjście Dolby Atmos, odtwarzając sygnały testowe przez odtwarzacz systemowy',
'settings.atmosTestHlsAtmos' => 'Strumień Atmos Apple',
'settings.atmosTestHlsAtmosDescription' => 'Sprawdzony strumień Dolby Atmos. Amplituner powinien pokazać Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Strumień surround Apple',
'settings.atmosTestHlsControlDescription' => 'Strumień kontrolny bez Atmos. Amplituner powinien pokazać surround bez Atmos.',
'settings.atmosTestRawStream' => 'Surowy strumień EAC3',
'settings.atmosTestRawStreamDescription' => 'Strumieniuje plik testowy dokładnie jak odtwarzanie Atmos w odtwarzaczu. Wymaga URL pliku testowego.',
'settings.atmosTestRawFile' => 'Surowy plik EAC3',
'settings.atmosTestRawFileDescription' => 'Odtwarza plik testowy o znanej długości. Wymaga URL pliku testowego.',
'settings.atmosTestStop' => 'Zatrzymaj test',
'settings.atmosTestUrl' => 'URL pliku testowego',
'settings.atmosTestUrlDescription' => 'HTTP URL surowego pliku .ec3 Dolby Atmos (np. wyodrębnionego przez ffmpeg)',
'settings.atmosTestUrlMissing' => 'Najpierw ustaw URL pliku testowego',
'settings.atmosTestStatus' => 'Stan',
'settings.dvConversionMode' => 'Konwersja Dolby Vision',
'settings.dvConversionModeDescription' => 'Wybierz, jak ExoPlayer obsługuje pliki Dolby Vision Profile 7.',
'settings.dvConversionAuto' => 'Automatycznie',
@@ -2426,6 +2458,8 @@ extension on TranslationsPl {
'messages.libraryScanFailed' => ({required Object error}) => 'Nie udało się zeskanować biblioteki: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Odświeżanie metadanych "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Rozpoczęto odświeżanie metadanych "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Nie udało się odświeżyć metadanych: ${error}',
'messages.logoutConfirm' => 'Czy na pewno chcesz się wylogować?',
'messages.noSeasonsFound' => 'Nie znaleziono sezonów',
@@ -2442,8 +2476,6 @@ extension on TranslationsPl {
'messages.serverLimitTitle' => 'Odtwarzanie nie powiodło się',
'messages.serverLimitBody' => 'Błąd serwera (HTTP 500). Limit przepustowości/transkodowania prawdopodobnie odrzucił tę sesję. Poproś właściciela o zmianę.',
'messages.logsUploaded' => 'Logi przesłane',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Nie udało się przesłać logów',
'messages.logId' => 'ID logu',
'subtitlingStyling.text' => 'Tekst',
@@ -2940,6 +2972,8 @@ extension on TranslationsPl {
'companionRemote.session.serverStopped' => 'Serwer zdalny zatrzymany',
'companionRemote.session.serverRunningDescription' => 'Urządzenia mobilne w Twojej sieci mogą łączyć się z tą aplikacją',
'companionRemote.session.serverStoppedDescription' => 'Uruchom serwer, aby umożliwić połączenie urządzeń mobilnych',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Użyj urządzenia mobilnego, aby sterować tą aplikacją',
'companionRemote.session.startServer' => 'Uruchom serwer',
'companionRemote.session.stopServer' => 'Zatrzymaj serwer',
@@ -2956,8 +2990,6 @@ extension on TranslationsPl {
'companionRemote.pairing.validationHostRequired' => 'Wprowadź adres hosta',
'companionRemote.pairing.validationHostFormat' => 'Format musi być IP:port (np. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Limit czasu połączenia. Użyj tej samej sieci na obu urządzeniach.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Nie znaleziono urządzenia. Upewnij się, że Plezy działa na hoście.',
'companionRemote.pairing.authFailed' => 'Uwierzytelnianie nie powiodło się. Oba urządzenia muszą używać tego samego konta Plex.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Nie udało się połączyć: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Usar tunelamento de vídeo. Desative se HDR mostrar vídeo preto.';
@override String get audioPassthrough => 'Passagem de Áudio';
@override String get audioPassthroughDescription => 'Envie áudio Dolby/DTS para o seu receptor ou TV sem recodificar, preservando o som surround. Desative se não tiver som.';
@override String get audioPassthroughDescriptionAppleTv => 'Entrega Dolby Digital Plus (incluindo Atmos) ao sistema como bitstream. DTS e TrueHD continuam sendo reproduzidos como PCM multicanal. Podem ocorrer breves cortes de áudio ao buscar.';
@override String get atmosDiagnostics => 'Teste de saída Atmos';
@override String get atmosDiagnosticsDescription => 'Diagnostique a saída Dolby Atmos reproduzindo sinais de teste pelo player do sistema';
@override String get atmosTestHlsAtmos => 'Stream Atmos da Apple';
@override String get atmosTestHlsAtmosDescription => 'Stream Dolby Atmos comprovadamente bom. O receptor deve mostrar Dolby Atmos.';
@override String get atmosTestHlsControl => 'Stream surround da Apple';
@override String get atmosTestHlsControlDescription => 'Stream de controle sem Atmos. O receptor deve mostrar surround sem Atmos.';
@override String get atmosTestRawStream => 'Stream EAC3 bruto';
@override String get atmosTestRawStreamDescription => 'Transmite o arquivo de teste exatamente como a reprodução Atmos no player. Requer a URL do arquivo de teste.';
@override String get atmosTestRawFile => 'Arquivo EAC3 bruto';
@override String get atmosTestRawFileDescription => 'Reproduz o arquivo de teste com duração conhecida. Requer a URL do arquivo de teste.';
@override String get atmosTestStop => 'Parar teste';
@override String get atmosTestUrl => 'URL do arquivo de teste';
@override String get atmosTestUrlDescription => 'URL HTTP de um arquivo .ec3 Dolby Atmos bruto (ex.: extraído com ffmpeg)';
@override String get atmosTestUrlMissing => 'Defina primeiro a URL do arquivo de teste';
@override String get atmosTestStatus => 'Status';
@override String get dvConversionMode => 'Conversão Dolby Vision';
@override String get dvConversionModeDescription => 'Escolha como o ExoPlayer lida com arquivos Dolby Vision Profile 7.';
@override String get dvConversionAuto => 'Automático';
@@ -2184,6 +2200,22 @@ extension on TranslationsPt {
'settings.tunneledPlaybackDescription' => 'Usar tunelamento de vídeo. Desative se HDR mostrar vídeo preto.',
'settings.audioPassthrough' => 'Passagem de Áudio',
'settings.audioPassthroughDescription' => 'Envie áudio Dolby/DTS para o seu receptor ou TV sem recodificar, preservando o som surround. Desative se não tiver som.',
'settings.audioPassthroughDescriptionAppleTv' => 'Entrega Dolby Digital Plus (incluindo Atmos) ao sistema como bitstream. DTS e TrueHD continuam sendo reproduzidos como PCM multicanal. Podem ocorrer breves cortes de áudio ao buscar.',
'settings.atmosDiagnostics' => 'Teste de saída Atmos',
'settings.atmosDiagnosticsDescription' => 'Diagnostique a saída Dolby Atmos reproduzindo sinais de teste pelo player do sistema',
'settings.atmosTestHlsAtmos' => 'Stream Atmos da Apple',
'settings.atmosTestHlsAtmosDescription' => 'Stream Dolby Atmos comprovadamente bom. O receptor deve mostrar Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Stream surround da Apple',
'settings.atmosTestHlsControlDescription' => 'Stream de controle sem Atmos. O receptor deve mostrar surround sem Atmos.',
'settings.atmosTestRawStream' => 'Stream EAC3 bruto',
'settings.atmosTestRawStreamDescription' => 'Transmite o arquivo de teste exatamente como a reprodução Atmos no player. Requer a URL do arquivo de teste.',
'settings.atmosTestRawFile' => 'Arquivo EAC3 bruto',
'settings.atmosTestRawFileDescription' => 'Reproduz o arquivo de teste com duração conhecida. Requer a URL do arquivo de teste.',
'settings.atmosTestStop' => 'Parar teste',
'settings.atmosTestUrl' => 'URL do arquivo de teste',
'settings.atmosTestUrlDescription' => 'URL HTTP de um arquivo .ec3 Dolby Atmos bruto (ex.: extraído com ffmpeg)',
'settings.atmosTestUrlMissing' => 'Defina primeiro a URL do arquivo de teste',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Conversão Dolby Vision',
'settings.dvConversionModeDescription' => 'Escolha como o ExoPlayer lida com arquivos Dolby Vision Profile 7.',
'settings.dvConversionAuto' => 'Automático',
@@ -2426,6 +2458,8 @@ extension on TranslationsPt {
'messages.libraryScanFailed' => ({required Object error}) => 'Falha ao escanear biblioteca: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Atualizando metadados de "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Atualização de metadados iniciada para "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Falha ao atualizar metadados: ${error}',
'messages.logoutConfirm' => 'Tem certeza que deseja sair?',
'messages.noSeasonsFound' => 'Nenhuma temporada encontrada',
@@ -2442,8 +2476,6 @@ extension on TranslationsPt {
'messages.serverLimitTitle' => 'Falha na reprodução',
'messages.serverLimitBody' => 'Erro do servidor (HTTP 500). Um limite de largura de banda/transcodificação provavelmente rejeitou esta sessão. Peça ao dono para ajustar.',
'messages.logsUploaded' => 'Logs enviados',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Falha ao enviar logs',
'messages.logId' => 'ID do Log',
'subtitlingStyling.text' => 'Texto',
@@ -2940,6 +2972,8 @@ extension on TranslationsPt {
'companionRemote.session.serverStopped' => 'Servidor remoto parado',
'companionRemote.session.serverRunningDescription' => 'Dispositivos móveis na sua rede podem se conectar a este app',
'companionRemote.session.serverStoppedDescription' => 'Inicie o servidor para permitir que dispositivos móveis se conectem',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Use o seu dispositivo móvel para controlar esta aplicação',
'companionRemote.session.startServer' => 'Iniciar servidor',
'companionRemote.session.stopServer' => 'Parar servidor',
@@ -2956,8 +2990,6 @@ extension on TranslationsPt {
'companionRemote.pairing.validationHostRequired' => 'Introduza o endereço do host',
'companionRemote.pairing.validationHostFormat' => 'O formato deve ser IP:porta (ex. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Conexão expirou. Use a mesma rede nos dois dispositivos.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Dispositivo não encontrado. Verifique se Plezy está rodando no host.',
'companionRemote.pairing.authFailed' => 'Falha na autenticação. Ambos os dispositivos precisam da mesma conta Plex.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Falha ao conectar: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Использовать видеотуннелирование. Отключите, если HDR показывает черный экран.';
@override String get audioPassthrough => 'Сквозной вывод аудио';
@override String get audioPassthroughDescription => 'Передавать звук Dolby/DTS на ресивер или телевизор без перекодирования, сохраняя объёмный звук. Отключите, если нет звука.';
@override String get audioPassthroughDescriptionAppleTv => 'Передаёт Dolby Digital Plus (включая Atmos) системе в виде битового потока. DTS и TrueHD по-прежнему воспроизводятся как многоканальный PCM. При перемотке возможны короткие пропадания звука.';
@override String get atmosDiagnostics => 'Тест вывода Atmos';
@override String get atmosDiagnosticsDescription => 'Диагностика вывода Dolby Atmos воспроизведением тестовых сигналов через системный проигрыватель';
@override String get atmosTestHlsAtmos => 'Atmos-поток Apple';
@override String get atmosTestHlsAtmosDescription => 'Заведомо рабочий поток Dolby Atmos. Ресивер должен показать Dolby Atmos.';
@override String get atmosTestHlsControl => 'Surround-поток Apple';
@override String get atmosTestHlsControlDescription => 'Контрольный поток без Atmos. Ресивер должен показать объёмный звук без Atmos.';
@override String get atmosTestRawStream => 'Сырой поток EAC3';
@override String get atmosTestRawStreamDescription => 'Транслирует тестовый файл точно так же, как Atmos-воспроизведение в проигрывателе. Требуется URL тестового файла.';
@override String get atmosTestRawFile => 'Сырой файл EAC3';
@override String get atmosTestRawFileDescription => 'Воспроизводит тестовый файл с известной длиной. Требуется URL тестового файла.';
@override String get atmosTestStop => 'Остановить тест';
@override String get atmosTestUrl => 'URL тестового файла';
@override String get atmosTestUrlDescription => 'HTTP-URL сырого файла .ec3 Dolby Atmos (например, извлечённого через ffmpeg)';
@override String get atmosTestUrlMissing => 'Сначала укажите URL тестового файла';
@override String get atmosTestStatus => 'Статус';
@override String get dvConversionMode => 'Преобразование Dolby Vision';
@override String get dvConversionModeDescription => 'Выберите, как ExoPlayer обрабатывает файлы Dolby Vision Profile 7.';
@override String get dvConversionAuto => 'Авто';
@@ -2184,6 +2200,22 @@ extension on TranslationsRu {
'settings.tunneledPlaybackDescription' => 'Использовать видеотуннелирование. Отключите, если HDR показывает черный экран.',
'settings.audioPassthrough' => 'Сквозной вывод аудио',
'settings.audioPassthroughDescription' => 'Передавать звук Dolby/DTS на ресивер или телевизор без перекодирования, сохраняя объёмный звук. Отключите, если нет звука.',
'settings.audioPassthroughDescriptionAppleTv' => 'Передаёт Dolby Digital Plus (включая Atmos) системе в виде битового потока. DTS и TrueHD по-прежнему воспроизводятся как многоканальный PCM. При перемотке возможны короткие пропадания звука.',
'settings.atmosDiagnostics' => 'Тест вывода Atmos',
'settings.atmosDiagnosticsDescription' => 'Диагностика вывода Dolby Atmos воспроизведением тестовых сигналов через системный проигрыватель',
'settings.atmosTestHlsAtmos' => 'Atmos-поток Apple',
'settings.atmosTestHlsAtmosDescription' => 'Заведомо рабочий поток Dolby Atmos. Ресивер должен показать Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Surround-поток Apple',
'settings.atmosTestHlsControlDescription' => 'Контрольный поток без Atmos. Ресивер должен показать объёмный звук без Atmos.',
'settings.atmosTestRawStream' => 'Сырой поток EAC3',
'settings.atmosTestRawStreamDescription' => 'Транслирует тестовый файл точно так же, как Atmos-воспроизведение в проигрывателе. Требуется URL тестового файла.',
'settings.atmosTestRawFile' => 'Сырой файл EAC3',
'settings.atmosTestRawFileDescription' => 'Воспроизводит тестовый файл с известной длиной. Требуется URL тестового файла.',
'settings.atmosTestStop' => 'Остановить тест',
'settings.atmosTestUrl' => 'URL тестового файла',
'settings.atmosTestUrlDescription' => 'HTTP-URL сырого файла .ec3 Dolby Atmos (например, извлечённого через ffmpeg)',
'settings.atmosTestUrlMissing' => 'Сначала укажите URL тестового файла',
'settings.atmosTestStatus' => 'Статус',
'settings.dvConversionMode' => 'Преобразование Dolby Vision',
'settings.dvConversionModeDescription' => 'Выберите, как ExoPlayer обрабатывает файлы Dolby Vision Profile 7.',
'settings.dvConversionAuto' => 'Авто',
@@ -2426,6 +2458,8 @@ extension on TranslationsRu {
'messages.libraryScanFailed' => ({required Object error}) => 'Не удалось отсканировать библиотеку: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Обновление метаданных "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Обновление метаданных начато для "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Не удалось обновить метаданные: ${error}',
'messages.logoutConfirm' => 'Вы уверены, что хотите выйти?',
'messages.noSeasonsFound' => 'Сезоны не найдены',
@@ -2442,8 +2476,6 @@ extension on TranslationsRu {
'messages.serverLimitTitle' => 'Ошибка воспроизведения',
'messages.serverLimitBody' => 'Ошибка сервера (HTTP 500). Лимит пропускной способности/транскодирования, вероятно, отклонил сессию. Попросите владельца изменить настройки.',
'messages.logsUploaded' => 'Логи загружены',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Не удалось загрузить логи',
'messages.logId' => 'ID лога',
'subtitlingStyling.text' => 'Текст',
@@ -2940,6 +2972,8 @@ extension on TranslationsRu {
'companionRemote.session.serverStopped' => 'Удалённый сервер остановлен',
'companionRemote.session.serverRunningDescription' => 'Мобильные устройства в вашей сети могут подключаться к этому приложению',
'companionRemote.session.serverStoppedDescription' => 'Запустите сервер, чтобы разрешить подключение мобильных устройств',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Используйте мобильное устройство для управления этим приложением',
'companionRemote.session.startServer' => 'Запустить сервер',
'companionRemote.session.stopServer' => 'Остановить сервер',
@@ -2956,8 +2990,6 @@ extension on TranslationsRu {
'companionRemote.pairing.validationHostRequired' => 'Введите адрес хоста',
'companionRemote.pairing.validationHostFormat' => 'Формат должен быть IP:порт (например, 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Время подключения истекло. Используйте одну сеть на обоих устройствах.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Устройство не найдено. Убедитесь, что Plezy запущен на хосте.',
'companionRemote.pairing.authFailed' => 'Аутентификация не удалась. На обоих устройствах нужен один аккаунт Plex.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Не удалось подключиться: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => 'Använd videotunnling. Inaktivera om HDR-uppspelning visar svart video.';
@override String get audioPassthrough => 'Ljudgenomkoppling';
@override String get audioPassthroughDescription => 'Skicka Dolby/DTS-ljud till din receiver eller TV utan omkodning och bevara surroundljudet. Stäng av om du inte har något ljud.';
@override String get audioPassthroughDescriptionAppleTv => 'Lämnar Dolby Digital Plus (inkl. Atmos) till systemet som bitstream. DTS och TrueHD spelas fortfarande upp som flerkanals-PCM. Korta ljudavbrott kan förekomma vid sökning.';
@override String get atmosDiagnostics => 'Atmos-utgångstest';
@override String get atmosDiagnosticsDescription => 'Diagnostisera Dolby Atmos-utgången genom att spela testsignaler via systemspelaren';
@override String get atmosTestHlsAtmos => 'Apple Atmos-ström';
@override String get atmosTestHlsAtmosDescription => 'Känd fungerande Dolby Atmos-ström. Receivern bör visa Dolby Atmos.';
@override String get atmosTestHlsControl => 'Apple surround-ström';
@override String get atmosTestHlsControlDescription => 'Kontrollström utan Atmos. Receivern bör visa surround utan Atmos.';
@override String get atmosTestRawStream => 'Rå EAC3-ström';
@override String get atmosTestRawStreamDescription => 'Strömmar testfilen precis som Atmos-uppspelning i spelaren. Kräver testfilens URL.';
@override String get atmosTestRawFile => 'Rå EAC3-fil';
@override String get atmosTestRawFileDescription => 'Spelar upp testfilen med känd längd. Kräver testfilens URL.';
@override String get atmosTestStop => 'Stoppa test';
@override String get atmosTestUrl => 'Testfilens URL';
@override String get atmosTestUrlDescription => 'HTTP-URL till en rå .ec3 Dolby Atmos-fil (t.ex. extraherad med ffmpeg)';
@override String get atmosTestUrlMissing => 'Ange testfilens URL först';
@override String get atmosTestStatus => 'Status';
@override String get dvConversionMode => 'Dolby Vision-konvertering';
@override String get dvConversionModeDescription => 'Välj hur ExoPlayer hanterar Dolby Vision Profile 7-filer.';
@override String get dvConversionAuto => 'Auto';
@@ -2184,6 +2200,22 @@ extension on TranslationsSv {
'settings.tunneledPlaybackDescription' => 'Använd videotunnling. Inaktivera om HDR-uppspelning visar svart video.',
'settings.audioPassthrough' => 'Ljudgenomkoppling',
'settings.audioPassthroughDescription' => 'Skicka Dolby/DTS-ljud till din receiver eller TV utan omkodning och bevara surroundljudet. Stäng av om du inte har något ljud.',
'settings.audioPassthroughDescriptionAppleTv' => 'Lämnar Dolby Digital Plus (inkl. Atmos) till systemet som bitstream. DTS och TrueHD spelas fortfarande upp som flerkanals-PCM. Korta ljudavbrott kan förekomma vid sökning.',
'settings.atmosDiagnostics' => 'Atmos-utgångstest',
'settings.atmosDiagnosticsDescription' => 'Diagnostisera Dolby Atmos-utgången genom att spela testsignaler via systemspelaren',
'settings.atmosTestHlsAtmos' => 'Apple Atmos-ström',
'settings.atmosTestHlsAtmosDescription' => 'Känd fungerande Dolby Atmos-ström. Receivern bör visa Dolby Atmos.',
'settings.atmosTestHlsControl' => 'Apple surround-ström',
'settings.atmosTestHlsControlDescription' => 'Kontrollström utan Atmos. Receivern bör visa surround utan Atmos.',
'settings.atmosTestRawStream' => 'Rå EAC3-ström',
'settings.atmosTestRawStreamDescription' => 'Strömmar testfilen precis som Atmos-uppspelning i spelaren. Kräver testfilens URL.',
'settings.atmosTestRawFile' => 'Rå EAC3-fil',
'settings.atmosTestRawFileDescription' => 'Spelar upp testfilen med känd längd. Kräver testfilens URL.',
'settings.atmosTestStop' => 'Stoppa test',
'settings.atmosTestUrl' => 'Testfilens URL',
'settings.atmosTestUrlDescription' => 'HTTP-URL till en rå .ec3 Dolby Atmos-fil (t.ex. extraherad med ffmpeg)',
'settings.atmosTestUrlMissing' => 'Ange testfilens URL först',
'settings.atmosTestStatus' => 'Status',
'settings.dvConversionMode' => 'Dolby Vision-konvertering',
'settings.dvConversionModeDescription' => 'Välj hur ExoPlayer hanterar Dolby Vision Profile 7-filer.',
'settings.dvConversionAuto' => 'Auto',
@@ -2426,6 +2458,8 @@ extension on TranslationsSv {
'messages.libraryScanFailed' => ({required Object error}) => 'Misslyckades att skanna bibliotek: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => 'Uppdaterar metadata för "${title}"...',
'messages.metadataRefreshStarted' => ({required Object title}) => 'Metadata-uppdatering startad för "${title}"',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => 'Misslyckades att uppdatera metadata: ${error}',
'messages.logoutConfirm' => 'Är du säker på att du vill logga ut?',
'messages.noSeasonsFound' => 'Inga säsonger hittades',
@@ -2442,8 +2476,6 @@ extension on TranslationsSv {
'messages.serverLimitTitle' => 'Uppspelningen misslyckades',
'messages.serverLimitBody' => 'Serverfel (HTTP 500). En bandbredds-/transkodningsgräns avvisade troligen sessionen. Be ägaren justera den.',
'messages.logsUploaded' => 'Loggar uppladdade',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => 'Uppladdning av loggar misslyckades',
'messages.logId' => 'Logg-ID',
'subtitlingStyling.text' => 'Text',
@@ -2940,6 +2972,8 @@ extension on TranslationsSv {
'companionRemote.session.serverStopped' => 'Fjärrserver stoppad',
'companionRemote.session.serverRunningDescription' => 'Mobila enheter i ditt nätverk kan ansluta till den här appen',
'companionRemote.session.serverStoppedDescription' => 'Starta servern för att tillåta mobila enheter att ansluta',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => 'Använd din mobila enhet för att styra denna app',
'companionRemote.session.startServer' => 'Starta server',
'companionRemote.session.stopServer' => 'Stoppa server',
@@ -2956,8 +2990,6 @@ extension on TranslationsSv {
'companionRemote.pairing.validationHostRequired' => 'Ange värdadress',
'companionRemote.pairing.validationHostFormat' => 'Format måste vara IP:port (t.ex. 192.168.1.100:48632)',
'companionRemote.pairing.connectionTimedOut' => 'Anslutningen tog för lång tid. Använd samma nätverk på båda enheter.',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => 'Enhet hittades inte. Kontrollera att Plezy körs på värden.',
'companionRemote.pairing.authFailed' => 'Autentisering misslyckades. Båda enheter behöver samma Plex-konto.',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => 'Kunde inte ansluta: ${error}',
+36 -4
View File
@@ -393,6 +393,22 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn {
@override String get tunneledPlaybackDescription => '使用视频隧道。若 HDR 播放出现黑屏,请禁用。';
@override String get audioPassthrough => '音频直通';
@override String get audioPassthroughDescription => '将 Dolby/DTS 音频不经重新编码直接发送到功放或电视,保留环绕声。如果没有声音,请关闭。';
@override String get audioPassthroughDescriptionAppleTv => '将 Dolby Digital Plus(含 Atmos)以比特流方式交给系统输出。DTS 和 TrueHD 仍以多声道 PCM 播放。快进快退时可能出现短暂声音中断。';
@override String get atmosDiagnostics => 'Atmos 输出测试';
@override String get atmosDiagnosticsDescription => '通过系统播放器播放测试信号,诊断 Dolby Atmos 输出';
@override String get atmosTestHlsAtmos => 'Apple Atmos 流';
@override String get atmosTestHlsAtmosDescription => '已知正常的 Dolby Atmos 流。功放应显示 Dolby Atmos。';
@override String get atmosTestHlsControl => 'Apple 环绕声流';
@override String get atmosTestHlsControlDescription => '不含 Atmos 的对照流。功放应显示不带 Atmos 的环绕声。';
@override String get atmosTestRawStream => '原始 EAC3 流';
@override String get atmosTestRawStreamDescription => '以与播放器内 Atmos 播放完全相同的方式串流测试文件。需要测试文件 URL。';
@override String get atmosTestRawFile => '原始 EAC3 文件';
@override String get atmosTestRawFileDescription => '以已知长度播放测试文件。需要测试文件 URL。';
@override String get atmosTestStop => '停止测试';
@override String get atmosTestUrl => '测试文件 URL';
@override String get atmosTestUrlDescription => '原始 .ec3 Dolby Atmos 文件的 HTTP URL(例如用 ffmpeg 提取)';
@override String get atmosTestUrlMissing => '请先设置测试文件 URL';
@override String get atmosTestStatus => '状态';
@override String get dvConversionMode => 'Dolby Vision 转换';
@override String get dvConversionModeDescription => '选择 ExoPlayer 如何处理 Dolby Vision Profile 7 文件。';
@override String get dvConversionAuto => '自动';
@@ -2184,6 +2200,22 @@ extension on TranslationsZh {
'settings.tunneledPlaybackDescription' => '使用视频隧道。若 HDR 播放出现黑屏,请禁用。',
'settings.audioPassthrough' => '音频直通',
'settings.audioPassthroughDescription' => '将 Dolby/DTS 音频不经重新编码直接发送到功放或电视,保留环绕声。如果没有声音,请关闭。',
'settings.audioPassthroughDescriptionAppleTv' => '将 Dolby Digital Plus(含 Atmos)以比特流方式交给系统输出。DTS 和 TrueHD 仍以多声道 PCM 播放。快进快退时可能出现短暂声音中断。',
'settings.atmosDiagnostics' => 'Atmos 输出测试',
'settings.atmosDiagnosticsDescription' => '通过系统播放器播放测试信号,诊断 Dolby Atmos 输出',
'settings.atmosTestHlsAtmos' => 'Apple Atmos 流',
'settings.atmosTestHlsAtmosDescription' => '已知正常的 Dolby Atmos 流。功放应显示 Dolby Atmos。',
'settings.atmosTestHlsControl' => 'Apple 环绕声流',
'settings.atmosTestHlsControlDescription' => '不含 Atmos 的对照流。功放应显示不带 Atmos 的环绕声。',
'settings.atmosTestRawStream' => '原始 EAC3 流',
'settings.atmosTestRawStreamDescription' => '以与播放器内 Atmos 播放完全相同的方式串流测试文件。需要测试文件 URL。',
'settings.atmosTestRawFile' => '原始 EAC3 文件',
'settings.atmosTestRawFileDescription' => '以已知长度播放测试文件。需要测试文件 URL。',
'settings.atmosTestStop' => '停止测试',
'settings.atmosTestUrl' => '测试文件 URL',
'settings.atmosTestUrlDescription' => '原始 .ec3 Dolby Atmos 文件的 HTTP URL(例如用 ffmpeg 提取)',
'settings.atmosTestUrlMissing' => '请先设置测试文件 URL',
'settings.atmosTestStatus' => '状态',
'settings.dvConversionMode' => 'Dolby Vision 转换',
'settings.dvConversionModeDescription' => '选择 ExoPlayer 如何处理 Dolby Vision Profile 7 文件。',
'settings.dvConversionAuto' => '自动',
@@ -2426,6 +2458,8 @@ extension on TranslationsZh {
'messages.libraryScanFailed' => ({required Object error}) => '无法扫描媒体库: ${error}',
'messages.metadataRefreshing' => ({required Object title}) => '正在刷新 “${title}” 的元数据...',
'messages.metadataRefreshStarted' => ({required Object title}) => '已开始刷新 “${title}” 的元数据',
_ => null,
} ?? switch (path) {
'messages.metadataRefreshFailed' => ({required Object error}) => '无法刷新元数据: ${error}',
'messages.logoutConfirm' => '你确定要登出吗?',
'messages.noSeasonsFound' => '未找到季',
@@ -2442,8 +2476,6 @@ extension on TranslationsZh {
'messages.serverLimitTitle' => '播放失败',
'messages.serverLimitBody' => '服务器错误 (HTTP 500)。带宽/转码限制可能拒绝了此会话。请让所有者调整。',
'messages.logsUploaded' => '日志已上传',
_ => null,
} ?? switch (path) {
'messages.logsUploadFailed' => '上传日志失败',
'messages.logId' => '日志 ID',
'subtitlingStyling.text' => '文本',
@@ -2940,6 +2972,8 @@ extension on TranslationsZh {
'companionRemote.session.serverStopped' => '远程服务器已停止',
'companionRemote.session.serverRunningDescription' => '网络上的移动设备可以连接到此应用',
'companionRemote.session.serverStoppedDescription' => '启动服务器以允许移动设备连接',
_ => null,
} ?? switch (path) {
'companionRemote.session.usePhoneToControl' => '使用移动设备控制此应用',
'companionRemote.session.startServer' => '启动服务器',
'companionRemote.session.stopServer' => '停止服务器',
@@ -2956,8 +2990,6 @@ extension on TranslationsZh {
'companionRemote.pairing.validationHostRequired' => '请输入主机地址',
'companionRemote.pairing.validationHostFormat' => '格式必须为IP:端口(例如 192.168.1.100:48632',
'companionRemote.pairing.connectionTimedOut' => '连接超时。请在两台设备上使用同一网络。',
_ => null,
} ?? switch (path) {
'companionRemote.pairing.sessionNotFound' => '未找到设备。请确认 Plezy 正在主机上运行。',
'companionRemote.pairing.authFailed' => '认证失败。两台设备需要使用同一 Plex 账号。',
'companionRemote.pairing.failedToConnect' => ({required Object error}) => '连接失败:${error}',
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "Använd videotunnling. Inaktivera om HDR-uppspelning visar svart video.",
"audioPassthrough": "Ljudgenomkoppling",
"audioPassthroughDescription": "Skicka Dolby/DTS-ljud till din receiver eller TV utan omkodning och bevara surroundljudet. Stäng av om du inte har något ljud.",
"audioPassthroughDescriptionAppleTv": "Lämnar Dolby Digital Plus (inkl. Atmos) till systemet som bitstream. DTS och TrueHD spelas fortfarande upp som flerkanals-PCM. Korta ljudavbrott kan förekomma vid sökning.",
"atmosDiagnostics": "Atmos-utgångstest",
"atmosDiagnosticsDescription": "Diagnostisera Dolby Atmos-utgången genom att spela testsignaler via systemspelaren",
"atmosTestHlsAtmos": "Apple Atmos-ström",
"atmosTestHlsAtmosDescription": "Känd fungerande Dolby Atmos-ström. Receivern bör visa Dolby Atmos.",
"atmosTestHlsControl": "Apple surround-ström",
"atmosTestHlsControlDescription": "Kontrollström utan Atmos. Receivern bör visa surround utan Atmos.",
"atmosTestRawStream": "Rå EAC3-ström",
"atmosTestRawStreamDescription": "Strömmar testfilen precis som Atmos-uppspelning i spelaren. Kräver testfilens URL.",
"atmosTestRawFile": "Rå EAC3-fil",
"atmosTestRawFileDescription": "Spelar upp testfilen med känd längd. Kräver testfilens URL.",
"atmosTestStop": "Stoppa test",
"atmosTestUrl": "Testfilens URL",
"atmosTestUrlDescription": "HTTP-URL till en rå .ec3 Dolby Atmos-fil (t.ex. extraherad med ffmpeg)",
"atmosTestUrlMissing": "Ange testfilens URL först",
"atmosTestStatus": "Status",
"dvConversionMode": "Dolby Vision-konvertering",
"dvConversionModeDescription": "Välj hur ExoPlayer hanterar Dolby Vision Profile 7-filer.",
"dvConversionAuto": "Auto",
+16
View File
@@ -264,6 +264,22 @@
"tunneledPlaybackDescription": "使用视频隧道。若 HDR 播放出现黑屏,请禁用。",
"audioPassthrough": "音频直通",
"audioPassthroughDescription": "将 Dolby/DTS 音频不经重新编码直接发送到功放或电视,保留环绕声。如果没有声音,请关闭。",
"audioPassthroughDescriptionAppleTv": "将 Dolby Digital Plus(含 Atmos)以比特流方式交给系统输出。DTS 和 TrueHD 仍以多声道 PCM 播放。快进快退时可能出现短暂声音中断。",
"atmosDiagnostics": "Atmos 输出测试",
"atmosDiagnosticsDescription": "通过系统播放器播放测试信号,诊断 Dolby Atmos 输出",
"atmosTestHlsAtmos": "Apple Atmos 流",
"atmosTestHlsAtmosDescription": "已知正常的 Dolby Atmos 流。功放应显示 Dolby Atmos。",
"atmosTestHlsControl": "Apple 环绕声流",
"atmosTestHlsControlDescription": "不含 Atmos 的对照流。功放应显示不带 Atmos 的环绕声。",
"atmosTestRawStream": "原始 EAC3 流",
"atmosTestRawStreamDescription": "以与播放器内 Atmos 播放完全相同的方式串流测试文件。需要测试文件 URL。",
"atmosTestRawFile": "原始 EAC3 文件",
"atmosTestRawFileDescription": "以已知长度播放测试文件。需要测试文件 URL。",
"atmosTestStop": "停止测试",
"atmosTestUrl": "测试文件 URL",
"atmosTestUrlDescription": "原始 .ec3 Dolby Atmos 文件的 HTTP URL(例如用 ffmpeg 提取)",
"atmosTestUrlMissing": "请先设置测试文件 URL",
"atmosTestStatus": "状态",
"dvConversionMode": "Dolby Vision 转换",
"dvConversionModeDescription": "选择 ExoPlayer 如何处理 Dolby Vision Profile 7 文件。",
"dvConversionAuto": "自动",
+16
View File
@@ -363,6 +363,7 @@ class PlayerNative extends PlayerBase {
bool _passthroughRequested = false;
bool _passthroughActive = false;
bool _normalizationRequested = false;
double _currentRate = 1.0;
@override
@@ -383,6 +384,11 @@ class PlayerNative extends PlayerBase {
Future<void> _applyPassthrough(bool enabled) async {
_passthroughActive = enabled;
// loudnorm decodes to PCM, which defeats bitstream passthrough; the
// filter yields while passthrough is active and returns when it ends.
if (enabled && _normalizationRequested) {
await super.setAudioNormalization(false);
}
await setProperty('audio-spdif', enabled ? _passthroughCodecs : '');
// audio-exclusive redirects coreaudio to coreaudio_exclusive on macOS
// (and exclusive WASAPI on Windows); on iOS/tvOS it is set once at
@@ -390,6 +396,16 @@ class PlayerNative extends PlayerBase {
if (!Platform.isIOS) {
await setProperty('audio-exclusive', enabled ? 'yes' : 'no');
}
if (!enabled && _normalizationRequested) {
await super.setAudioNormalization(true);
}
}
@override
Future<void> setAudioNormalization(bool enabled) async {
_normalizationRequested = enabled;
if (enabled && _passthroughActive) return; // deferred until passthrough ends
await super.setAudioNormalization(enabled);
}
@override
@@ -0,0 +1,168 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:material_symbols_icons/symbols.dart';
import '../../i18n/strings.g.dart';
import '../../services/settings_service.dart';
import '../../utils/snackbar_helper.dart';
import '../../widgets/setting_tile.dart';
import '../../widgets/settings_builder.dart';
import '../../widgets/settings_page.dart';
import '../../widgets/settings_section.dart';
import 'settings_utils.dart';
/// #1300 diagnostics: plays known test signals through a bare AVPlayer (via
/// the native AtmosProbe plugin) so a tester can read the receiver's format
/// display per test and isolate where Atmos output breaks.
class AtmosDiagnosticsScreen extends StatefulWidget {
const AtmosDiagnosticsScreen({super.key});
@override
State<AtmosDiagnosticsScreen> createState() => _AtmosDiagnosticsScreenState();
}
class _AtmosDiagnosticsScreenState extends State<AtmosDiagnosticsScreen> {
static const _channel = MethodChannel('plezy/atmos_probe');
Timer? _poll;
Map<Object?, Object?> _status = const {};
String? _activeMode;
@override
void initState() {
super.initState();
_poll = Timer.periodic(const Duration(seconds: 1), (_) => _refreshStatus());
_refreshStatus();
}
@override
void dispose() {
_poll?.cancel();
_channel.invokeMethod('stop').ignore();
super.dispose();
}
Future<void> _refreshStatus() async {
try {
final status = await _channel.invokeMethod<Map<Object?, Object?>>('getStatus');
if (mounted && status != null) setState(() => _status = status);
} on PlatformException {
// native side unavailable (non-Apple build); leave the status empty
}
}
Future<void> _start(String mode) async {
final needsUrl = mode == 'rawEc3' || mode == 'rawEc3Finite';
final url = SettingsService.instance.read(SettingsService.atmosProbeUrl);
if (needsUrl && url.isEmpty) {
showAppSnackBar(context, t.settings.atmosTestUrlMissing);
return;
}
try {
await _channel.invokeMethod('start', {'mode': mode, if (needsUrl) 'url': url});
setState(() => _activeMode = mode);
} on PlatformException catch (e) {
if (mounted) showErrorSnackBar(context, e.message ?? e.code);
}
await _refreshStatus();
}
Future<void> _stop() async {
await _channel.invokeMethod('stop');
setState(() => _activeMode = null);
await _refreshStatus();
}
Widget _testTile({required String mode, required IconData icon, required String title, required String subtitle}) {
final active = _activeMode == mode;
return SettingNavigationTile(
icon: icon,
title: title,
subtitle: subtitle,
trailingIcon: active ? Symbols.graphic_eq_rounded : Symbols.play_arrow_rounded,
onTap: () => _start(mode),
);
}
@override
Widget build(BuildContext context) {
final statusText = _status.entries.map((e) => '${e.key}: ${e.value}').join('\n');
return SettingsPage(
title: Text(t.settings.atmosDiagnostics),
children: [
SettingsGroup(
children: [
_testTile(
mode: 'hlsAtmos',
icon: Symbols.spatial_audio_rounded,
title: t.settings.atmosTestHlsAtmos,
subtitle: t.settings.atmosTestHlsAtmosDescription,
),
_testTile(
mode: 'hlsControl',
icon: Symbols.surround_sound_rounded,
title: t.settings.atmosTestHlsControl,
subtitle: t.settings.atmosTestHlsControlDescription,
),
_testTile(
mode: 'rawEc3',
icon: Symbols.stream_rounded,
title: t.settings.atmosTestRawStream,
subtitle: t.settings.atmosTestRawStreamDescription,
),
_testTile(
mode: 'rawEc3Finite',
icon: Symbols.audio_file_rounded,
title: t.settings.atmosTestRawFile,
subtitle: t.settings.atmosTestRawFileDescription,
),
SettingNavigationTile(
icon: Symbols.stop_circle_rounded,
title: t.settings.atmosTestStop,
trailingIcon: Symbols.stop_rounded,
onTap: _stop,
),
],
),
SettingsGroup(
children: [
SettingValueBuilder<String>(
pref: SettingsService.atmosProbeUrl,
builder: (context, value, _) => SettingNavigationTile(
icon: Symbols.link_rounded,
title: t.settings.atmosTestUrl,
subtitle: value.isEmpty ? t.settings.atmosTestUrlDescription : value,
onTap: () => showTextInputDialog(
context: context,
title: t.settings.atmosTestUrl,
labelText: 'URL',
currentValue: value,
onSave: (v) => SettingsService.instance.write(SettingsService.atmosProbeUrl, v),
),
),
),
],
),
SettingsGroup(
title: t.settings.atmosTestStatus,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: SizedBox(
width: double.infinity,
child: Text(
statusText.isEmpty ? '' : statusText,
style: Theme.of(context).textTheme.bodySmall?.copyWith(fontFamily: 'monospace'),
),
),
),
],
),
const SizedBox(height: 24),
],
);
}
}
@@ -17,6 +17,7 @@ import '../../widgets/setting_tile.dart';
import '../../widgets/settings_builder.dart';
import '../../widgets/settings_page.dart';
import '../../widgets/settings_section.dart';
import 'atmos_diagnostics_screen.dart';
import 'external_player_screen.dart';
import 'mpv_config_screen.dart';
import 'settings_utils.dart';
@@ -81,6 +82,7 @@ class _PlaybackSettingsScreenState extends State<PlaybackSettingsScreen> {
if (showDisplaySwitchDelay) _displaySwitchDelayTile(),
if (exoActive) _tunneledPlaybackTile(),
if (PlatformDetector.supportsAudioPassthrough()) _audioPassthroughTile(),
if (PlatformDetector.isAppleTV()) _atmosDiagnosticsTile(),
if (exoActive) _dvConversionModeTile(),
_bufferSizeTile(),
_defaultQualityTile(),
@@ -325,7 +327,16 @@ class _PlaybackSettingsScreenState extends State<PlaybackSettingsScreen> {
pref: SettingsService.audioPassthrough,
icon: Symbols.surround_sound_rounded,
title: t.settings.audioPassthrough,
subtitle: t.settings.audioPassthroughDescription,
subtitle: PlatformDetector.isAppleTV()
? t.settings.audioPassthroughDescriptionAppleTv
: t.settings.audioPassthroughDescription,
);
Widget _atmosDiagnosticsTile() => SettingNavigationTile(
icon: Symbols.spatial_audio_rounded,
title: t.settings.atmosDiagnostics,
subtitle: t.settings.atmosDiagnosticsDescription,
destinationBuilder: (_) => const AtmosDiagnosticsScreen(),
);
// Visibility for this and the three tiles below is decided by the hoisted
+31
View File
@@ -365,6 +365,37 @@ void _showColorInputDialogTV({
}
/// Shows a text input dialog with regex validation and reset-to-default support.
/// Plain single-field text input dialog (dpad/TV friendly via
/// [FocusableTextField]); the free-form sibling of [showRegexInputDialog].
void showTextInputDialog({
required BuildContext context,
required String title,
required String labelText,
required String currentValue,
required Future<void> Function(String value) onSave,
}) {
final controller = TextEditingController(text: currentValue);
_showSettingsInputDialog(
context: context,
title: title,
contentBuilder: (_, _, _, saveFocusNode) {
return FocusableTextField(
controller: controller,
decoration: InputDecoration(labelText: labelText),
autofocus: true,
textInputAction: TextInputAction.done,
onEditingComplete: () => saveFocusNode.requestFocus(),
);
},
onSave: (_) async {
await onSave(controller.text.trim());
return true;
},
onDispose: controller.dispose,
);
}
void showRegexInputDialog({
required BuildContext context,
required String title,
+2 -1
View File
@@ -815,7 +815,8 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> with WidgetsBindin
);
}
// Audio passthrough (desktop and Android TV; disabled on tvOS)
// Audio passthrough (desktop, Android TV, and Apple TV — where the
// fork's AVPlayer Atmos sink handles EAC3+JOC, #1300)
if (PlatformDetector.supportsAudioPassthrough()) {
await currentPlayer.setAudioPassthrough(settingsService.read(SettingsService.audioPassthrough));
}
+7 -3
View File
@@ -188,8 +188,9 @@ class _UseExternalPlayerPref extends Pref<bool> {
Future<void> writeTo(BaseSharedPreferencesService svc, bool value) => svc.writeBool(key, value);
}
/// Experimental Dolby passthrough. Keep opt-in everywhere, including Apple TV,
/// until the AVFoundation EAC3 path is verified across real receiver setups.
/// Experimental Dolby passthrough. Keep opt-in on Apple TV until the
/// AVPlayer Atmos sink (EAC3+JOC → Dolby MAT, #1300) is verified on real
/// receiver setups; non-JOC content still decodes to multichannel PCM there.
class _AudioPassthroughPref extends Pref<bool> {
const _AudioPassthroughPref() : super('audio_passthrough');
@@ -201,7 +202,7 @@ class _AudioPassthroughPref extends Pref<bool> {
// (Media3 picks bitstream vs PCM via AudioCapabilities), preserving surround.
// Scoped to ExoPlayer — the mpv backend force-sets audio-spdif with no decode
// fallback. (#1458)
// TODO: Default Apple TV to on once EAC3 passthrough is hardware-verified.
// TODO: Default Apple TV to on once the #1300 Atmos sink is hardware-verified.
return Platform.isAndroid && PlatformDetector.isTV() && svc.read(SettingsService.useExoPlayer);
}
@@ -337,6 +338,9 @@ class SettingsService extends BaseSharedPreferencesService {
static const String defaultCreditsPattern = r'(?:^|\b)(?:outro|closing|credits?|ending)(?:\b|$)|^ed(?:\s?\d+)?$';
static const enableDebugLogging = BoolPref('enable_debug_logging', onWrite: setLoggerLevel);
// Source URL for the Apple TV Atmos diagnostics screen; deliberately not
// resettable so a tester keeps it across "Reset All Settings".
static const atmosProbeUrl = StringPref('atmos_probe_url', defaultValue: '');
static const crashReporting = BoolPref('crash_reporting', defaultValue: true);
static const enableHardwareDecoding = BoolPref('enable_hardware_decoding', defaultValue: true);
static const enableHDR = BoolPref('enable_hdr', defaultValue: true);
+4 -2
View File
@@ -211,8 +211,10 @@ class PlatformDetector {
}
static bool supportsAudioPassthrough() {
if (isAppleTV()) return false;
return isDesktopOS() || (Platform.isAndroid && isTV());
// Apple TV: EAC3+JOC rides the AVPlayer Atmos sink in the mpv fork's
// ao_avfoundation; other Dolby content decodes to multichannel PCM.
// Route capability is gated at runtime inside the AO itself.
return isAppleTV() || isDesktopOS() || (Platform.isAndroid && isTV());
}
static bool supportsPictureInPicture() {
@@ -547,7 +547,7 @@ class _VideoSettingsSheetState extends State<VideoSettingsSheet> {
},
),
// Audio Passthrough (desktop and Android TV)
// Audio Passthrough (desktop, Android TV, and Apple TV)
if (PlatformDetector.supportsAudioPassthrough())
_SettingsToggleItem(
pref: SettingsService.audioPassthrough,
@@ -0,0 +1,287 @@
import AVFoundation
import Flutter
import Foundation
/// Diagnostics harness for #1300: plays known assets through a bare AVPlayer
/// so a tester can read the receiver's format display per test.
///
/// Modes:
/// - hlsAtmos: Apple's public fMP4 Atmos example stream (device+AVR+MAT baseline)
/// - hlsControl: Apple's public EC3 5.1 (non-JOC) example stream (control)
/// - rawEc3: raw .ec3 elementary stream via AVAssetResourceLoader with an
/// unbounded content length a faithful rehearsal of the mpv
/// AVPlayer audio sink's feeding model
/// - rawEc3Finite: same loader but passing through the real content length,
/// isolating "loader trick" failures from "raw ES" failures
public class AtmosProbePlugin: NSObject, FlutterPlugin {
private static let hlsAtmosUrl =
"https://devstreaming-cdn.apple.com/videos/streaming/examples/adv_dv_atmos/main.m3u8"
private static let hlsControlUrl =
"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8"
private var player: AVPlayer?
private var loader: RawEc3Loader?
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(
name: "plezy/atmos_probe", binaryMessenger: registrar.messenger())
let instance = AtmosProbePlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "start":
guard let args = call.arguments as? [String: Any],
let mode = args["mode"] as? String
else {
result(FlutterError(code: "bad_args", message: "mode required", details: nil))
return
}
start(mode: mode, url: args["url"] as? String, result: result)
case "stop":
stopPlayback()
result(nil)
case "getStatus":
result(status())
default:
result(FlutterMethodNotImplemented)
}
}
private func start(mode: String, url: String?, result: @escaping FlutterResult) {
stopPlayback()
let item: AVPlayerItem
switch mode {
case "hlsAtmos", "hlsControl":
let raw = mode == "hlsAtmos" ? Self.hlsAtmosUrl : Self.hlsControlUrl
guard let streamUrl = URL(string: raw) else {
result(FlutterError(code: "bad_url", message: raw, details: nil))
return
}
item = AVPlayerItem(url: streamUrl)
case "rawEc3", "rawEc3Finite":
guard let source = url.flatMap(URL.init(string:)) else {
result(FlutterError(code: "bad_url", message: "rawEc3 needs a source url", details: nil))
return
}
let loader = RawEc3Loader(source: source, finiteLength: mode == "rawEc3Finite")
self.loader = loader
item = AVPlayerItem(asset: loader.asset)
item.preferredForwardBufferDuration = 1.0
loader.begin()
default:
result(FlutterError(code: "bad_mode", message: mode, details: nil))
return
}
let player = AVPlayer(playerItem: item)
player.automaticallyWaitsToMinimizeStalling = false
player.allowsExternalPlayback = false
self.player = player
player.play()
result(nil)
}
private func stopPlayback() {
player?.pause()
player?.replaceCurrentItem(with: nil)
player = nil
loader?.cancel()
loader = nil
}
private func status() -> [String: Any] {
var out: [String: Any] = [:]
let session = AVAudioSession.sharedInstance()
out["maxOutputChannels"] = session.maximumOutputNumberOfChannels
out["outputLatencyMs"] = Int(session.outputLatency * 1000)
out["route"] = session.currentRoute.outputs.map { port in
"\(port.portType.rawValue)/\(port.portName)/\(port.channels?.count ?? 0)ch"
}.joined(separator: ", ")
guard let player = player else {
out["state"] = "idle"
return out
}
let item = player.currentItem
out["state"] =
switch player.timeControlStatus {
case .paused: "paused"
case .waitingToPlayAtSpecifiedRate:
"waiting(\(player.reasonForWaitingToPlay?.rawValue ?? "-"))"
case .playing: "playing"
@unknown default: "unknown"
}
out["itemStatus"] =
switch item?.status {
case .readyToPlay: "readyToPlay"
case .failed: "failed"
default: "unknown"
}
if let error = item?.error as NSError? {
out["error"] = "\(error.domain):\(error.code) \(error.localizedDescription)"
}
if let item = item {
out["currentTime"] = CMTimeGetSeconds(item.currentTime())
out["tracks"] = item.tracks.compactMap { track -> String? in
guard let assetTrack = track.assetTrack else { return nil }
let formats = (assetTrack.formatDescriptions as! [CMFormatDescription]).map { desc in
fourCC(CMFormatDescriptionGetMediaSubType(desc))
}.joined(separator: "+")
return "\(assetTrack.mediaType.rawValue):\(formats)"
}.joined(separator: ", ")
}
if let loader = loader {
out["fedBytes"] = loader.bytesReceived
out["loaderRequests"] = loader.requestLog
}
return out
}
private func fourCC(_ code: FourCharCode) -> String {
let bytes = [
UInt8((code >> 24) & 0xFF), UInt8((code >> 16) & 0xFF),
UInt8((code >> 8) & 0xFF), UInt8(code & 0xFF),
]
return String(bytes: bytes, encoding: .ascii) ?? String(code)
}
}
/// Streams an HTTP source into memory and serves it to AVPlayer through an
/// AVAssetResourceLoader on a custom scheme, mirroring the mpv sink's model.
private final class RawEc3Loader: NSObject, AVAssetResourceLoaderDelegate, URLSessionDataDelegate {
let asset: AVURLAsset
private let source: URL
private let finiteLength: Bool
private let queue = DispatchQueue(label: "plezy.atmos.probe.loader")
private var session: URLSession!
private var buffer = Data()
private var contentLength: Int64 = -1
private var finished = false
private var pending: [AVAssetResourceLoadingRequest] = []
private(set) var bytesReceived: Int = 0
private(set) var requestLog: String = ""
init(source: URL, finiteLength: Bool) {
self.source = source
self.finiteLength = finiteLength
self.asset = AVURLAsset(url: URL(string: "plezy-ec3-probe://stream/audio.ec3")!)
super.init()
asset.resourceLoader.setDelegate(self, queue: queue)
}
func begin() {
let config = URLSessionConfiguration.default
session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
session.dataTask(with: source).resume()
}
func cancel() {
session?.invalidateAndCancel()
queue.async {
for request in self.pending where !request.isFinished {
request.finishLoading(with: NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled))
}
self.pending.removeAll()
}
}
// MARK: URLSessionDataDelegate (background queue -> hop to `queue`)
func urlSession(
_ session: URLSession, dataTask: URLSessionDataTask,
didReceive response: URLResponse,
completionHandler: @escaping (URLSession.ResponseDisposition) -> Void
) {
queue.async {
self.contentLength = response.expectedContentLength
self.serve()
}
completionHandler(.allow)
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
queue.async {
self.buffer.append(data)
self.bytesReceived += data.count
self.serve()
}
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
queue.async {
self.finished = true
self.serve()
}
}
// MARK: AVAssetResourceLoaderDelegate (on `queue`)
func resourceLoader(
_ resourceLoader: AVAssetResourceLoader,
shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest
) -> Bool {
if let dataRequest = loadingRequest.dataRequest {
requestLog += "[\(dataRequest.requestedOffset)+\(dataRequest.requestedLength)]"
if requestLog.count > 300 { requestLog = String(requestLog.suffix(300)) }
}
pending.append(loadingRequest)
serve()
return true
}
func resourceLoader(
_ resourceLoader: AVAssetResourceLoader,
didCancel loadingRequest: AVAssetResourceLoadingRequest
) {
pending.removeAll { $0 === loadingRequest }
}
private func serve() {
// content info: unbounded mirrors the mpv sink; finite passes the real
// length through once the HTTP response reveals it
let knownLength: Int64? =
finiteLength
? (contentLength >= 0 ? contentLength : (finished ? Int64(buffer.count) : nil))
: Int64(1) << 40
var index = 0
while index < pending.count {
let request = pending[index]
if let info = request.contentInformationRequest {
guard let length = knownLength else {
index += 1
continue // wait for the HTTP response before answering
}
info.contentType = "public.enhanced-ac3-audio"
info.contentLength = length
info.isByteRangeAccessSupported = true
if request.dataRequest == nil {
request.finishLoading()
pending.remove(at: index)
continue
}
}
guard let dataRequest = request.dataRequest else {
index += 1
continue
}
let offset = dataRequest.currentOffset
let end = dataRequest.requestedOffset + Int64(dataRequest.requestedLength)
if offset < Int64(buffer.count) {
let chunkEnd = min(Int64(buffer.count), end)
dataRequest.respond(with: buffer.subdata(in: Int(offset)..<Int(chunkEnd)))
}
if dataRequest.currentOffset >= end || (finished && dataRequest.currentOffset >= Int64(buffer.count)) {
request.finishLoading()
pending.remove(at: index)
continue
}
index += 1
}
}
}
+4
View File
@@ -13,6 +13,7 @@
35DB0C8FEF635A3BCA0B722A /* PackageInfoPlusPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9426EFA282CDA8E0E98EEE9 /* PackageInfoPlusPlugin.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
5C71F5F7B33075F2B007825B /* MpvPlayerPluginShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73645904F226A24585A092CE /* MpvPlayerPluginShared.swift */; };
7A11A7C50113007825B00A01 /* AtmosProbePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A11A7C50113007825B00A02 /* AtmosProbePlugin.swift */; };
691577F0EB3F4EB1A5160280 /* MpvPlayerCoreBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52A3BDA46E79969EA1DF3AC /* MpvPlayerCoreBase.swift */; };
6F3C0DD6F2F8DA14E7E2F386 /* MpvPlayerCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12B8610AE5D580077264851 /* MpvPlayerCore.swift */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
@@ -81,6 +82,7 @@
67C3193A50DFDECE2B92D075 /* ConnectivityPlusPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ConnectivityPlusPlugin.swift; sourceTree = "<group>"; };
6AEF79DFBD1D80F00AB39CDA /* PathMonitorConnectivityProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PathMonitorConnectivityProvider.swift; sourceTree = "<group>"; };
73645904F226A24585A092CE /* MpvPlayerPluginShared.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MpvPlayerPluginShared.swift; path = ../shared/apple/MpvPlayer/MpvPlayerPluginShared.swift; sourceTree = "<source_root>"; };
7A11A7C50113007825B00A02 /* AtmosProbePlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AtmosProbePlugin.swift; path = ../shared/apple/AtmosProbe/AtmosProbePlugin.swift; sourceTree = "<source_root>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
@@ -249,6 +251,7 @@
children = (
D52A3BDA46E79969EA1DF3AC /* MpvPlayerCoreBase.swift */,
73645904F226A24585A092CE /* MpvPlayerPluginShared.swift */,
7A11A7C50113007825B00A02 /* AtmosProbePlugin.swift */,
A12B8610AE5D580077264851 /* MpvPlayerCore.swift */,
9D7A998830EDC8F77BF521D1 /* MpvPlayerPlugin.swift */,
A2635E12EB9322B151EE5127 /* MpvPipController.swift */,
@@ -477,6 +480,7 @@
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
691577F0EB3F4EB1A5160280 /* MpvPlayerCoreBase.swift in Sources */,
5C71F5F7B33075F2B007825B /* MpvPlayerPluginShared.swift in Sources */,
7A11A7C50113007825B00A01 /* AtmosProbePlugin.swift in Sources */,
6F3C0DD6F2F8DA14E7E2F386 /* MpvPlayerCore.swift in Sources */,
8E5EED3DDAC9455D4DAA9776 /* MpvPlayerPlugin.swift in Sources */,
AA34E3E5872B3792D6959EAA /* MpvPipController.swift in Sources */,
+3
View File
@@ -138,6 +138,9 @@ import wakelock_plus
if let r = self.registrar(forPlugin: "MpvPlayerPlugin") {
MpvPlayerPlugin.register(with: r)
}
if let r = self.registrar(forPlugin: "AtmosProbePlugin") {
AtmosProbePlugin.register(with: r)
}
if let r = self.registrar(forPlugin: "PackageInfoPlusPlugin") {
PackageInfoPlusPlugin.register(with: r)
}