feat(playback): embedded mpv pre-0.22 hardening, Linux parity, and localization (#1122)

* fix(playback): harden embedded mpv session handling and support detection

- guard the session controller against late startup rejections clobbering
  a newer session during fast channel zapping
- exclude the refresh timestamp from the session-update dedup key so idle
  sessions stop re-emitting IPC updates every 500 ms
- macOS: reconcile async loadfile replies by request id so a rejected
  seek/aid/speed on a live stream no longer flips the session to error
- append --ozone-platform=x11 on Linux in main.ts so direct binary and
  AppImage launches match the packaged .desktop launcher behavior
- return a sandbox-specific unsupported reason in Flatpak/Snap instead of
  asking the user to install mpv inside the sandbox
- update the stale "macOS only" embedded MPV claim in CLAUDE.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(playback): populate Linux audio tracks and fix ARM Linux packaging

- Linux poller now reads track-list/count each tick and walks the scalar
  track-list/N/* sub-properties when the count changes, so the audio-track
  menu is no longer empty; selection reconciles from the aid property
- afterPack replaces the x64 embedded_mpv.node with an
  embedded-mpv-unavailable.txt marker in arm64/armv7l Linux packages, and
  package-layout verification rejects foreign-architecture addons while
  requiring the marker
- extend native source invariants for the non-fatal async-reply rule
  (macOS) and the Linux track-list polling contract
- document the Linux track-list mechanics and ARM packaging behavior in
  docs/architecture/embedded-mpv-native.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(playback): embedded mpv player UX polish and full localization

- click on the video toggles pause (same action as Space) with a 250 ms
  grace period so double-click fullscreen cancels the pending pause; no
  DOM overlay is drawn — the dock transport icon is the feedback
- timeline scrubbing previews the drag position locally and commits a
  single seek on release instead of one IPC seek per drag pixel
- translate all player UI strings (controls, tooltips, aria-labels,
  status and recording messages) via new EMBEDDED_MPV.PLAYER.* keys,
  synced across en + 17 locales through the i18n-fill workflow
- replace the legacy @Output() EventEmitter with the signal output() API

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(playback): react to language changes and respect ozone platform hint

Address review feedback on #1122:
- add a translationsTick signal (onLangChange/onTranslationChange/
  onDefaultLangChange) read by every computed() and template helper that
  calls translate.instant(), so labels re-evaluate on a runtime language
  switch and when the translation file finishes loading after mount
- suppress the Linux --ozone-platform=x11 fallback when the user set
  ELECTRON_OZONE_PLATFORM_HINT, matching the existing respect for an
  explicit --ozone-platform switch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5 authored and GitHub committed 2026-07-04 14:22:48 +02:00
1 parent 3659de796c
commit 8eb0fe3261
38 files changed
+1823 -107

No files matched your search

@@ -1,6 +1,7 @@
import { Component, signal } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { ResolvedPortalPlayback } from '@iptvnator/shared/interfaces';
import {
EmbeddedMpvOverlayVisibilityService,
@@ -31,7 +32,7 @@ describe('EmbeddedMpvPlayerComponent recording status message', () => {
} as unknown as typeof window.electron;
await TestBed.configureTestingModule({
imports: [EmbeddedMpvPlayerHostComponent],
imports: [EmbeddedMpvPlayerHostComponent, TranslateModule.forRoot()],
providers: [
{
provide: EmbeddedMpvOverlayVisibilityService,
@@ -44,6 +45,17 @@ describe('EmbeddedMpvPlayerComponent recording status message', () => {
})
.compileComponents();
const translate = TestBed.inject(TranslateService);
translate.setTranslation('en', {
EMBEDDED_MPV: {
PLAYER: {
SAVED_TO: 'Saved to {{path}}',
RECORDING_SAVED: 'Recording saved',
},
},
});
translate.use('en');
fixture = TestBed.createComponent(EmbeddedMpvPlayerHostComponent);
fixture.detectChanges();
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "إلغاء كتم الصوت",
"VOLUME": "مستوى الصوت"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "إعادة المحاولة",
"STALLED": "يستغرق بدء هذا البث وقتًا أطول من المتوقع.",
"PLAYBACK_FAILED": "فشل التشغيل عبر MPV المضمّن.",
"CHECKING_SUPPORT": "جارٍ التحقق من دعم MPV المضمّن...",
"NOT_AVAILABLE": "MPV المضمّن غير متاح في هذه البيئة.",
"LOADING_STREAM": "جارٍ تحميل البث…",
"PLAY": "تشغيل",
"PAUSE": "إيقاف مؤقت",
"PREVIOUS_EPISODE": "الحلقة السابقة",
"NEXT_EPISODE": "الحلقة التالية",
"BACK_10_SECONDS": "رجوع 10 ثوانٍ",
"FORWARD_10_SECONDS": "تقديم 10 ثوانٍ",
"LIVE_STREAM": "بث مباشر",
"MUTE": "كتم الصوت",
"UNMUTE": "إلغاء كتم الصوت",
"MUTED": "الصوت مكتوم",
"VOLUME": "مستوى الصوت",
"VOLUME_LABEL": "مستوى الصوت {{percent}}%",
"AUDIO_TRACKS": "مسارات الصوت",
"SUBTITLES": "الترجمات",
"SUBTITLES_OFF": "إيقاف",
"TRACK_DEFAULT": "افتراضي",
"AUDIO_TRACK_FALLBACK": "صوت {{index}}",
"SUBTITLE_TRACK_FALLBACK": "ترجمة {{index}}",
"PLAYBACK_SPEED": "سرعة التشغيل",
"SPEED_TOOLTIP": "السرعة: {{speed}}",
"ASPECT_RATIO": "نسبة العرض إلى الارتفاع",
"ASPECT_TOOLTIP": "النسبة: {{aspect}}",
"ASPECT_DEFAULT": "افتراضي",
"START_RECORDING": "بدء التسجيل",
"STOP_RECORDING": "إيقاف التسجيل",
"RECORDING": "جارٍ التسجيل",
"RECORDING_SAVED": "تم حفظ التسجيل",
"RECORDING_FAILED": "فشل التسجيل",
"RECORDING_FAILED_TO_START": "فشل بدء التسجيل.",
"RECORDING_FAILED_TO_STOP": "فشل إيقاف التسجيل.",
"SAVED_TO": "تم الحفظ في {{path}}",
"ENTER_FULLSCREEN": "ملء الشاشة",
"EXIT_FULLSCREEN": "الخروج من ملء الشاشة"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "رجّع الصوت",
"VOLUME": "الصوت"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "حاول مرة أخرى",
"STALLED": "هاد البث كياخد وقت كثر من المتوقع باش يبدا.",
"PLAYBACK_FAILED": "فشل التشغيل بـ MPV المدمج.",
"CHECKING_SUPPORT": "جاري التحقق من دعم MPV المدمج...",
"NOT_AVAILABLE": "MPV المدمج ما متوفرش فهاد البيئة.",
"LOADING_STREAM": "جاري تشريج البث…",
"PLAY": "شغل",
"PAUSE": "وقّف",
"PREVIOUS_EPISODE": "الحلقة السابقة",
"NEXT_EPISODE": "الحلقة الجاية",
"BACK_10_SECONDS": "رجع 10 ثواني",
"FORWARD_10_SECONDS": "قدّم 10 ثواني",
"LIVE_STREAM": "بث مباشر",
"MUTE": "كتم الصوت",
"UNMUTE": "رجّع الصوت",
"MUTED": "الصوت مكتوم",
"VOLUME": "الصوت",
"VOLUME_LABEL": "الصوت {{percent}}%",
"AUDIO_TRACKS": "مسارات الصوت",
"SUBTITLES": "الترجمة",
"SUBTITLES_OFF": "معطلة",
"TRACK_DEFAULT": "افتراضي",
"AUDIO_TRACK_FALLBACK": "صوت {{index}}",
"SUBTITLE_TRACK_FALLBACK": "ترجمة {{index}}",
"PLAYBACK_SPEED": "سرعة التشغيل",
"SPEED_TOOLTIP": "السرعة: {{speed}}",
"ASPECT_RATIO": "نسبة الأبعاد",
"ASPECT_TOOLTIP": "الأبعاد: {{aspect}}",
"ASPECT_DEFAULT": "افتراضي",
"START_RECORDING": "بدا التسجيل",
"STOP_RECORDING": "وقّف التسجيل",
"RECORDING": "جاري التسجيل",
"RECORDING_SAVED": "التسجيل تحفظ",
"RECORDING_FAILED": "فشل التسجيل",
"RECORDING_FAILED_TO_START": "التسجيل ما قدرش يبدا.",
"RECORDING_FAILED_TO_STOP": "التسجيل ما قدرش يتوقف.",
"SAVED_TO": "تحفظ في {{path}}",
"ENTER_FULLSCREEN": "دخل لملء الشاشة",
"EXIT_FULLSCREEN": "خرج من ملء الشاشة"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Уключыць гук",
"VOLUME": "Гучнасць"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Паўтарыць",
"STALLED": "Гэты паток запускаецца даўжэй, чым чакалася.",
"PLAYBACK_FAILED": "Не ўдалося прайграць праз убудаваны MPV.",
"CHECKING_SUPPORT": "Праверка падтрымкі ўбудаванага MPV...",
"NOT_AVAILABLE": "Убудаваны MPV недаступны ў гэтым асяроддзі.",
"LOADING_STREAM": "Загрузка патоку…",
"PLAY": "Прайграць",
"PAUSE": "Паўза",
"PREVIOUS_EPISODE": "Папярэдні эпізод",
"NEXT_EPISODE": "Наступны эпізод",
"BACK_10_SECONDS": "Назад на 10 секунд",
"FORWARD_10_SECONDS": "Наперад на 10 секунд",
"LIVE_STREAM": "Прамая трансляцыя",
"MUTE": "Адключыць гук",
"UNMUTE": "Уключыць гук",
"MUTED": "Гук адключаны",
"VOLUME": "Гучнасць",
"VOLUME_LABEL": "Гучнасць {{percent}}%",
"AUDIO_TRACKS": "Аўдыядарожкі",
"SUBTITLES": "Субтытры",
"SUBTITLES_OFF": "Выкл.",
"TRACK_DEFAULT": "Па змаўчанні",
"AUDIO_TRACK_FALLBACK": "Аўдыя {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Субтытры {{index}}",
"PLAYBACK_SPEED": "Хуткасць прайгравання",
"SPEED_TOOLTIP": "Хуткасць: {{speed}}",
"ASPECT_RATIO": "Суадносіны бакоў",
"ASPECT_TOOLTIP": "Суадносіны: {{aspect}}",
"ASPECT_DEFAULT": "Па змаўчанні",
"START_RECORDING": "Пачаць запіс",
"STOP_RECORDING": "Спыніць запіс",
"RECORDING": "Ідзе запіс",
"RECORDING_SAVED": "Запіс захаваны",
"RECORDING_FAILED": "Памылка запісу",
"RECORDING_FAILED_TO_START": "Не ўдалося пачаць запіс.",
"RECORDING_FAILED_TO_STOP": "Не ўдалося спыніць запіс.",
"SAVED_TO": "Захавана ў {{path}}",
"ENTER_FULLSCREEN": "Увайсці ў поўнаэкранны рэжым",
"EXIT_FULLSCREEN": "Выйсці з поўнаэкраннага рэжыму"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Stummschaltung aufheben",
"VOLUME": "Lautstärke"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Erneut versuchen",
"STALLED": "Der Start dieses Streams dauert länger als erwartet.",
"PLAYBACK_FAILED": "Die Wiedergabe mit eingebettetem MPV ist fehlgeschlagen.",
"CHECKING_SUPPORT": "Unterstützung für eingebettetes MPV wird geprüft...",
"NOT_AVAILABLE": "Eingebettetes MPV ist in dieser Umgebung nicht verfügbar.",
"LOADING_STREAM": "Stream wird geladen…",
"PLAY": "Wiedergabe",
"PAUSE": "Pause",
"PREVIOUS_EPISODE": "Vorherige Folge",
"NEXT_EPISODE": "Nächste Folge",
"BACK_10_SECONDS": "10 Sekunden zurück",
"FORWARD_10_SECONDS": "10 Sekunden vor",
"LIVE_STREAM": "Live-Stream",
"MUTE": "Stummschalten",
"UNMUTE": "Stummschaltung aufheben",
"MUTED": "Stummgeschaltet",
"VOLUME": "Lautstärke",
"VOLUME_LABEL": "Lautstärke {{percent}} %",
"AUDIO_TRACKS": "Tonspuren",
"SUBTITLES": "Untertitel",
"SUBTITLES_OFF": "Aus",
"TRACK_DEFAULT": "Standard",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Untertitel {{index}}",
"PLAYBACK_SPEED": "Wiedergabegeschwindigkeit",
"SPEED_TOOLTIP": "Geschwindigkeit: {{speed}}",
"ASPECT_RATIO": "Seitenverhältnis",
"ASPECT_TOOLTIP": "Seitenverhältnis: {{aspect}}",
"ASPECT_DEFAULT": "Standard",
"START_RECORDING": "Aufnahme starten",
"STOP_RECORDING": "Aufnahme stoppen",
"RECORDING": "Aufnahme",
"RECORDING_SAVED": "Aufnahme gespeichert",
"RECORDING_FAILED": "Aufnahme fehlgeschlagen",
"RECORDING_FAILED_TO_START": "Aufnahme konnte nicht gestartet werden.",
"RECORDING_FAILED_TO_STOP": "Aufnahme konnte nicht gestoppt werden.",
"SAVED_TO": "Gespeichert unter {{path}}",
"ENTER_FULLSCREEN": "Vollbild aktivieren",
"EXIT_FULLSCREEN": "Vollbild beenden"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Κατάργηση σίγασης",
"VOLUME": "Ένταση"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Επανάληψη",
"STALLED": "Η έναρξη αυτής της ροής καθυστερεί περισσότερο από το αναμενόμενο.",
"PLAYBACK_FAILED": "Η αναπαραγωγή με το ενσωματωμένο MPV απέτυχε.",
"CHECKING_SUPPORT": "Έλεγχος υποστήριξης ενσωματωμένου MPV...",
"NOT_AVAILABLE": "Το ενσωματωμένο MPV δεν είναι διαθέσιμο σε αυτό το περιβάλλον.",
"LOADING_STREAM": "Φόρτωση ροής…",
"PLAY": "Αναπαραγωγή",
"PAUSE": "Παύση",
"PREVIOUS_EPISODE": "Προηγούμενο επεισόδιο",
"NEXT_EPISODE": "Επόμενο επεισόδιο",
"BACK_10_SECONDS": "Πίσω 10 δευτερόλεπτα",
"FORWARD_10_SECONDS": "Μπροστά 10 δευτερόλεπτα",
"LIVE_STREAM": "Ζωντανή ροή",
"MUTE": "Σίγαση",
"UNMUTE": "Κατάργηση σίγασης",
"MUTED": "Σε σίγαση",
"VOLUME": "Ένταση",
"VOLUME_LABEL": "Ένταση {{percent}}%",
"AUDIO_TRACKS": "Κομμάτια ήχου",
"SUBTITLES": "Υπότιτλοι",
"SUBTITLES_OFF": "Ανενεργοί",
"TRACK_DEFAULT": "Προεπιλογή",
"AUDIO_TRACK_FALLBACK": "Ήχος {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Υπότιτλος {{index}}",
"PLAYBACK_SPEED": "Ταχύτητα αναπαραγωγής",
"SPEED_TOOLTIP": "Ταχύτητα: {{speed}}",
"ASPECT_RATIO": "Αναλογία εικόνας",
"ASPECT_TOOLTIP": "Αναλογία: {{aspect}}",
"ASPECT_DEFAULT": "Προεπιλογή",
"START_RECORDING": "Έναρξη εγγραφής",
"STOP_RECORDING": "Διακοπή εγγραφής",
"RECORDING": "Εγγραφή",
"RECORDING_SAVED": "Η εγγραφή αποθηκεύτηκε",
"RECORDING_FAILED": "Η εγγραφή απέτυχε",
"RECORDING_FAILED_TO_START": "Η έναρξη της εγγραφής απέτυχε.",
"RECORDING_FAILED_TO_STOP": "Η διακοπή της εγγραφής απέτυχε.",
"SAVED_TO": "Αποθηκεύτηκε στο {{path}}",
"ENTER_FULLSCREEN": "Μετάβαση σε πλήρη οθόνη",
"EXIT_FULLSCREEN": "Έξοδος από πλήρη οθόνη"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Unmute",
"VOLUME": "Volume"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Retry",
"STALLED": "This stream is taking longer than expected to start.",
"PLAYBACK_FAILED": "Embedded MPV playback failed.",
"CHECKING_SUPPORT": "Checking embedded MPV support...",
"NOT_AVAILABLE": "Embedded MPV is not available in this environment.",
"LOADING_STREAM": "Loading stream…",
"PLAY": "Play",
"PAUSE": "Pause",
"PREVIOUS_EPISODE": "Previous episode",
"NEXT_EPISODE": "Next episode",
"BACK_10_SECONDS": "Back 10 seconds",
"FORWARD_10_SECONDS": "Forward 10 seconds",
"LIVE_STREAM": "Live stream",
"MUTE": "Mute",
"UNMUTE": "Unmute",
"MUTED": "Muted",
"VOLUME": "Volume",
"VOLUME_LABEL": "Volume {{percent}}%",
"AUDIO_TRACKS": "Audio tracks",
"SUBTITLES": "Subtitles",
"SUBTITLES_OFF": "Off",
"TRACK_DEFAULT": "Default",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Subtitle {{index}}",
"PLAYBACK_SPEED": "Playback speed",
"SPEED_TOOLTIP": "Speed: {{speed}}",
"ASPECT_RATIO": "Aspect ratio",
"ASPECT_TOOLTIP": "Aspect: {{aspect}}",
"ASPECT_DEFAULT": "Default",
"START_RECORDING": "Start recording",
"STOP_RECORDING": "Stop recording",
"RECORDING": "Recording",
"RECORDING_SAVED": "Recording saved",
"RECORDING_FAILED": "Recording failed",
"RECORDING_FAILED_TO_START": "Recording failed to start.",
"RECORDING_FAILED_TO_STOP": "Recording failed to stop.",
"SAVED_TO": "Saved to {{path}}",
"ENTER_FULLSCREEN": "Enter fullscreen",
"EXIT_FULLSCREEN": "Exit fullscreen"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Activar sonido",
"VOLUME": "Volumen"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Reintentar",
"STALLED": "Este stream está tardando más de lo esperado en iniciarse.",
"PLAYBACK_FAILED": "Falló la reproducción de MPV integrado.",
"CHECKING_SUPPORT": "Comprobando compatibilidad con MPV integrado...",
"NOT_AVAILABLE": "MPV integrado no está disponible en este entorno.",
"LOADING_STREAM": "Cargando stream…",
"PLAY": "Reproducir",
"PAUSE": "Pausar",
"PREVIOUS_EPISODE": "Episodio anterior",
"NEXT_EPISODE": "Siguiente episodio",
"BACK_10_SECONDS": "Retroceder 10 segundos",
"FORWARD_10_SECONDS": "Avanzar 10 segundos",
"LIVE_STREAM": "Transmisión en vivo",
"MUTE": "Silenciar",
"UNMUTE": "Activar sonido",
"MUTED": "Silenciado",
"VOLUME": "Volumen",
"VOLUME_LABEL": "Volumen {{percent}}%",
"AUDIO_TRACKS": "Pistas de audio",
"SUBTITLES": "Subtítulos",
"SUBTITLES_OFF": "Desactivados",
"TRACK_DEFAULT": "Predeterminada",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Subtítulo {{index}}",
"PLAYBACK_SPEED": "Velocidad de reproducción",
"SPEED_TOOLTIP": "Velocidad: {{speed}}",
"ASPECT_RATIO": "Relación de aspecto",
"ASPECT_TOOLTIP": "Aspecto: {{aspect}}",
"ASPECT_DEFAULT": "Predeterminada",
"START_RECORDING": "Iniciar grabación",
"STOP_RECORDING": "Detener grabación",
"RECORDING": "Grabando",
"RECORDING_SAVED": "Grabación guardada",
"RECORDING_FAILED": "Error de grabación",
"RECORDING_FAILED_TO_START": "No se pudo iniciar la grabación.",
"RECORDING_FAILED_TO_STOP": "No se pudo detener la grabación.",
"SAVED_TO": "Guardada en {{path}}",
"ENTER_FULLSCREEN": "Entrar en pantalla completa",
"EXIT_FULLSCREEN": "Salir de pantalla completa"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Activer le son",
"VOLUME": "Volume"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Réessayer",
"STALLED": "Ce flux met plus de temps que prévu à démarrer.",
"PLAYBACK_FAILED": "Échec de la lecture avec MPV intégré.",
"CHECKING_SUPPORT": "Vérification de la prise en charge de MPV intégré...",
"NOT_AVAILABLE": "MPV intégré n'est pas disponible dans cet environnement.",
"LOADING_STREAM": "Chargement du flux…",
"PLAY": "Lecture",
"PAUSE": "Pause",
"PREVIOUS_EPISODE": "Épisode précédent",
"NEXT_EPISODE": "Épisode suivant",
"BACK_10_SECONDS": "Reculer de 10 secondes",
"FORWARD_10_SECONDS": "Avancer de 10 secondes",
"LIVE_STREAM": "Diffusion en direct",
"MUTE": "Muet",
"UNMUTE": "Activer le son",
"MUTED": "Son coupé",
"VOLUME": "Volume",
"VOLUME_LABEL": "Volume {{percent}} %",
"AUDIO_TRACKS": "Pistes audio",
"SUBTITLES": "Sous-titres",
"SUBTITLES_OFF": "Désactivés",
"TRACK_DEFAULT": "Par défaut",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Sous-titre {{index}}",
"PLAYBACK_SPEED": "Vitesse de lecture",
"SPEED_TOOLTIP": "Vitesse : {{speed}}",
"ASPECT_RATIO": "Format d'image",
"ASPECT_TOOLTIP": "Format : {{aspect}}",
"ASPECT_DEFAULT": "Par défaut",
"START_RECORDING": "Démarrer l'enregistrement",
"STOP_RECORDING": "Arrêter l'enregistrement",
"RECORDING": "Enregistrement",
"RECORDING_SAVED": "Enregistrement sauvegardé",
"RECORDING_FAILED": "Échec de l'enregistrement",
"RECORDING_FAILED_TO_START": "L'enregistrement n'a pas pu démarrer.",
"RECORDING_FAILED_TO_STOP": "L'enregistrement n'a pas pu s'arrêter.",
"SAVED_TO": "Enregistré dans {{path}}",
"ENTER_FULLSCREEN": "Passer en plein écran",
"EXIT_FULLSCREEN": "Quitter le plein écran"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Attiva audio",
"VOLUME": "Volume"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Riprova",
"STALLED": "L'avvio di questo stream sta richiedendo più tempo del previsto.",
"PLAYBACK_FAILED": "Riproduzione con MPV integrato non riuscita.",
"CHECKING_SUPPORT": "Verifica del supporto per MPV integrato...",
"NOT_AVAILABLE": "MPV integrato non è disponibile in questo ambiente.",
"LOADING_STREAM": "Caricamento stream…",
"PLAY": "Riproduci",
"PAUSE": "Pausa",
"PREVIOUS_EPISODE": "Episodio precedente",
"NEXT_EPISODE": "Episodio successivo",
"BACK_10_SECONDS": "Indietro di 10 secondi",
"FORWARD_10_SECONDS": "Avanti di 10 secondi",
"LIVE_STREAM": "Stream in diretta",
"MUTE": "Disattiva audio",
"UNMUTE": "Attiva audio",
"MUTED": "Audio disattivato",
"VOLUME": "Volume",
"VOLUME_LABEL": "Volume {{percent}}%",
"AUDIO_TRACKS": "Tracce audio",
"SUBTITLES": "Sottotitoli",
"SUBTITLES_OFF": "Disattivati",
"TRACK_DEFAULT": "Predefinita",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Sottotitoli {{index}}",
"PLAYBACK_SPEED": "Velocità di riproduzione",
"SPEED_TOOLTIP": "Velocità: {{speed}}",
"ASPECT_RATIO": "Proporzioni",
"ASPECT_TOOLTIP": "Proporzioni: {{aspect}}",
"ASPECT_DEFAULT": "Predefinite",
"START_RECORDING": "Avvia registrazione",
"STOP_RECORDING": "Interrompi registrazione",
"RECORDING": "Registrazione in corso",
"RECORDING_SAVED": "Registrazione salvata",
"RECORDING_FAILED": "Registrazione non riuscita",
"RECORDING_FAILED_TO_START": "Impossibile avviare la registrazione.",
"RECORDING_FAILED_TO_STOP": "Impossibile interrompere la registrazione.",
"SAVED_TO": "Salvato in {{path}}",
"ENTER_FULLSCREEN": "Attiva schermo intero",
"EXIT_FULLSCREEN": "Esci dallo schermo intero"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "ミュート解除",
"VOLUME": "音量"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "再試行",
"STALLED": "このストリームの開始に予想より時間がかかっています。",
"PLAYBACK_FAILED": "組み込みMPVでの再生に失敗しました。",
"CHECKING_SUPPORT": "組み込みMPVのサポートを確認中...",
"NOT_AVAILABLE": "この環境では組み込みMPVは利用できません。",
"LOADING_STREAM": "ストリームを読み込み中…",
"PLAY": "再生",
"PAUSE": "一時停止",
"PREVIOUS_EPISODE": "前のエピソード",
"NEXT_EPISODE": "次のエピソード",
"BACK_10_SECONDS": "10秒戻る",
"FORWARD_10_SECONDS": "10秒進む",
"LIVE_STREAM": "ライブストリーム",
"MUTE": "ミュート",
"UNMUTE": "ミュート解除",
"MUTED": "ミュート中",
"VOLUME": "音量",
"VOLUME_LABEL": "音量 {{percent}}%",
"AUDIO_TRACKS": "音声トラック",
"SUBTITLES": "字幕",
"SUBTITLES_OFF": "オフ",
"TRACK_DEFAULT": "デフォルト",
"AUDIO_TRACK_FALLBACK": "音声 {{index}}",
"SUBTITLE_TRACK_FALLBACK": "字幕 {{index}}",
"PLAYBACK_SPEED": "再生速度",
"SPEED_TOOLTIP": "速度:{{speed}}",
"ASPECT_RATIO": "アスペクト比",
"ASPECT_TOOLTIP": "アスペクト比:{{aspect}}",
"ASPECT_DEFAULT": "デフォルト",
"START_RECORDING": "録画を開始",
"STOP_RECORDING": "録画を停止",
"RECORDING": "録画中",
"RECORDING_SAVED": "録画を保存しました",
"RECORDING_FAILED": "録画に失敗しました",
"RECORDING_FAILED_TO_START": "録画を開始できませんでした。",
"RECORDING_FAILED_TO_STOP": "録画を停止できませんでした。",
"SAVED_TO": "{{path}}に保存しました",
"ENTER_FULLSCREEN": "全画面表示",
"EXIT_FULLSCREEN": "全画面表示を終了"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "음소거 해제",
"VOLUME": "볼륨"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "다시 시도",
"STALLED": "이 스트림의 시작이 예상보다 오래 걸리고 있습니다.",
"PLAYBACK_FAILED": "내장 MPV 재생에 실패했습니다.",
"CHECKING_SUPPORT": "내장 MPV 지원을 확인하는 중...",
"NOT_AVAILABLE": "이 환경에서는 내장 MPV를 사용할 수 없습니다.",
"LOADING_STREAM": "스트림을 불러오는 중…",
"PLAY": "재생",
"PAUSE": "일시정지",
"PREVIOUS_EPISODE": "이전 에피소드",
"NEXT_EPISODE": "다음 에피소드",
"BACK_10_SECONDS": "10초 뒤로",
"FORWARD_10_SECONDS": "10초 앞으로",
"LIVE_STREAM": "라이브 스트림",
"MUTE": "음소거",
"UNMUTE": "음소거 해제",
"MUTED": "음소거됨",
"VOLUME": "볼륨",
"VOLUME_LABEL": "볼륨 {{percent}}%",
"AUDIO_TRACKS": "오디오 트랙",
"SUBTITLES": "자막",
"SUBTITLES_OFF": "끄기",
"TRACK_DEFAULT": "기본",
"AUDIO_TRACK_FALLBACK": "오디오 {{index}}",
"SUBTITLE_TRACK_FALLBACK": "자막 {{index}}",
"PLAYBACK_SPEED": "재생 속도",
"SPEED_TOOLTIP": "속도: {{speed}}",
"ASPECT_RATIO": "화면 비율",
"ASPECT_TOOLTIP": "비율: {{aspect}}",
"ASPECT_DEFAULT": "기본",
"START_RECORDING": "녹화 시작",
"STOP_RECORDING": "녹화 중지",
"RECORDING": "녹화 중",
"RECORDING_SAVED": "녹화가 저장되었습니다",
"RECORDING_FAILED": "녹화 실패",
"RECORDING_FAILED_TO_START": "녹화를 시작하지 못했습니다.",
"RECORDING_FAILED_TO_STOP": "녹화를 중지하지 못했습니다.",
"SAVED_TO": "{{path}}에 저장되었습니다",
"ENTER_FULLSCREEN": "전체 화면",
"EXIT_FULLSCREEN": "전체 화면 종료"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Dempen opheffen",
"VOLUME": "Volume"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Opnieuw proberen",
"STALLED": "Deze stream doet er langer over dan verwacht om te starten.",
"PLAYBACK_FAILED": "Afspelen via Embedded MPV is mislukt.",
"CHECKING_SUPPORT": "Ondersteuning voor Embedded MPV controleren...",
"NOT_AVAILABLE": "Embedded MPV is niet beschikbaar in deze omgeving.",
"LOADING_STREAM": "Stream laden…",
"PLAY": "Afspelen",
"PAUSE": "Pauzeren",
"PREVIOUS_EPISODE": "Vorige aflevering",
"NEXT_EPISODE": "Volgende aflevering",
"BACK_10_SECONDS": "10 seconden terug",
"FORWARD_10_SECONDS": "10 seconden vooruit",
"LIVE_STREAM": "Live stream",
"MUTE": "Dempen",
"UNMUTE": "Dempen opheffen",
"MUTED": "Gedempt",
"VOLUME": "Volume",
"VOLUME_LABEL": "Volume {{percent}}%",
"AUDIO_TRACKS": "Audiosporen",
"SUBTITLES": "Ondertiteling",
"SUBTITLES_OFF": "Uit",
"TRACK_DEFAULT": "Standaard",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Ondertitel {{index}}",
"PLAYBACK_SPEED": "Afspeelsnelheid",
"SPEED_TOOLTIP": "Snelheid: {{speed}}",
"ASPECT_RATIO": "Beeldverhouding",
"ASPECT_TOOLTIP": "Beeldverhouding: {{aspect}}",
"ASPECT_DEFAULT": "Standaard",
"START_RECORDING": "Opname starten",
"STOP_RECORDING": "Opname stoppen",
"RECORDING": "Opname",
"RECORDING_SAVED": "Opname opgeslagen",
"RECORDING_FAILED": "Opname mislukt",
"RECORDING_FAILED_TO_START": "Opname kon niet worden gestart.",
"RECORDING_FAILED_TO_STOP": "Opname kon niet worden gestopt.",
"SAVED_TO": "Opgeslagen in {{path}}",
"ENTER_FULLSCREEN": "Volledig scherm openen",
"EXIT_FULLSCREEN": "Volledig scherm sluiten"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Wyłącz wyciszenie",
"VOLUME": "Głośność"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Spróbuj ponownie",
"STALLED": "Uruchamianie tego strumienia trwa dłużej niż zwykle.",
"PLAYBACK_FAILED": "Odtwarzanie we wbudowanym MPV nie powiodło się.",
"CHECKING_SUPPORT": "Sprawdzanie obsługi wbudowanego MPV...",
"NOT_AVAILABLE": "Wbudowane MPV nie jest dostępne w tym środowisku.",
"LOADING_STREAM": "Ładowanie strumienia…",
"PLAY": "Odtwórz",
"PAUSE": "Wstrzymaj",
"PREVIOUS_EPISODE": "Poprzedni odcinek",
"NEXT_EPISODE": "Następny odcinek",
"BACK_10_SECONDS": "Cofnij o 10 sekund",
"FORWARD_10_SECONDS": "Do przodu o 10 sekund",
"LIVE_STREAM": "Transmisja na żywo",
"MUTE": "Wycisz",
"UNMUTE": "Wyłącz wyciszenie",
"MUTED": "Wyciszono",
"VOLUME": "Głośność",
"VOLUME_LABEL": "Głośność {{percent}}%",
"AUDIO_TRACKS": "Ścieżki audio",
"SUBTITLES": "Napisy",
"SUBTITLES_OFF": "Wyłączone",
"TRACK_DEFAULT": "Domyślna",
"AUDIO_TRACK_FALLBACK": "Audio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Napisy {{index}}",
"PLAYBACK_SPEED": "Prędkość odtwarzania",
"SPEED_TOOLTIP": "Prędkość: {{speed}}",
"ASPECT_RATIO": "Proporcje obrazu",
"ASPECT_TOOLTIP": "Proporcje: {{aspect}}",
"ASPECT_DEFAULT": "Domyślne",
"START_RECORDING": "Rozpocznij nagrywanie",
"STOP_RECORDING": "Zatrzymaj nagrywanie",
"RECORDING": "Nagrywanie",
"RECORDING_SAVED": "Nagranie zapisane",
"RECORDING_FAILED": "Nagrywanie nie powiodło się",
"RECORDING_FAILED_TO_START": "Nie udało się rozpocząć nagrywania.",
"RECORDING_FAILED_TO_STOP": "Nie udało się zatrzymać nagrywania.",
"SAVED_TO": "Zapisano w {{path}}",
"ENTER_FULLSCREEN": "Włącz pełny ekran",
"EXIT_FULLSCREEN": "Wyłącz pełny ekran"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Ativar som",
"VOLUME": "Volume"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Tentar novamente",
"STALLED": "Este stream está demorando mais do que o esperado para iniciar.",
"PLAYBACK_FAILED": "Falha na reprodução do MPV integrado.",
"CHECKING_SUPPORT": "Verificando suporte ao MPV integrado...",
"NOT_AVAILABLE": "O MPV integrado não está disponível neste ambiente.",
"LOADING_STREAM": "Carregando stream…",
"PLAY": "Reproduzir",
"PAUSE": "Pausar",
"PREVIOUS_EPISODE": "Episódio anterior",
"NEXT_EPISODE": "Próximo episódio",
"BACK_10_SECONDS": "Voltar 10 segundos",
"FORWARD_10_SECONDS": "Avançar 10 segundos",
"LIVE_STREAM": "Transmissão ao vivo",
"MUTE": "Silenciar",
"UNMUTE": "Ativar som",
"MUTED": "Silenciado",
"VOLUME": "Volume",
"VOLUME_LABEL": "Volume {{percent}}%",
"AUDIO_TRACKS": "Faixas de áudio",
"SUBTITLES": "Legendas",
"SUBTITLES_OFF": "Desativadas",
"TRACK_DEFAULT": "Padrão",
"AUDIO_TRACK_FALLBACK": "Áudio {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Legenda {{index}}",
"PLAYBACK_SPEED": "Velocidade de reprodução",
"SPEED_TOOLTIP": "Velocidade: {{speed}}",
"ASPECT_RATIO": "Proporção da imagem",
"ASPECT_TOOLTIP": "Proporção: {{aspect}}",
"ASPECT_DEFAULT": "Padrão",
"START_RECORDING": "Iniciar gravação",
"STOP_RECORDING": "Parar gravação",
"RECORDING": "Gravando",
"RECORDING_SAVED": "Gravação salva",
"RECORDING_FAILED": "Falha na gravação",
"RECORDING_FAILED_TO_START": "Falha ao iniciar a gravação.",
"RECORDING_FAILED_TO_STOP": "Falha ao parar a gravação.",
"SAVED_TO": "Salvo em {{path}}",
"ENTER_FULLSCREEN": "Entrar em tela cheia",
"EXIT_FULLSCREEN": "Sair da tela cheia"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Включить звук",
"VOLUME": "Громкость"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Повторить",
"STALLED": "Запуск этого потока занимает больше времени, чем ожидалось.",
"PLAYBACK_FAILED": "Не удалось воспроизвести через встроенный MPV.",
"CHECKING_SUPPORT": "Проверка поддержки встроенного MPV...",
"NOT_AVAILABLE": "Встроенный MPV недоступен в этой среде.",
"LOADING_STREAM": "Загрузка потока…",
"PLAY": "Воспроизвести",
"PAUSE": "Пауза",
"PREVIOUS_EPISODE": "Предыдущий эпизод",
"NEXT_EPISODE": "Следующий эпизод",
"BACK_10_SECONDS": "Назад на 10 секунд",
"FORWARD_10_SECONDS": "Вперёд на 10 секунд",
"LIVE_STREAM": "Прямой эфир",
"MUTE": "Отключить звук",
"UNMUTE": "Включить звук",
"MUTED": "Звук отключён",
"VOLUME": "Громкость",
"VOLUME_LABEL": "Громкость {{percent}}%",
"AUDIO_TRACKS": "Аудиодорожки",
"SUBTITLES": "Субтитры",
"SUBTITLES_OFF": "Выкл.",
"TRACK_DEFAULT": "По умолчанию",
"AUDIO_TRACK_FALLBACK": "Аудио {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Субтитры {{index}}",
"PLAYBACK_SPEED": "Скорость воспроизведения",
"SPEED_TOOLTIP": "Скорость: {{speed}}",
"ASPECT_RATIO": "Соотношение сторон",
"ASPECT_TOOLTIP": "Соотношение: {{aspect}}",
"ASPECT_DEFAULT": "По умолчанию",
"START_RECORDING": "Начать запись",
"STOP_RECORDING": "Остановить запись",
"RECORDING": "Идёт запись",
"RECORDING_SAVED": "Запись сохранена",
"RECORDING_FAILED": "Ошибка записи",
"RECORDING_FAILED_TO_START": "Не удалось начать запись.",
"RECORDING_FAILED_TO_STOP": "Не удалось остановить запись.",
"SAVED_TO": "Сохранено в {{path}}",
"ENTER_FULLSCREEN": "Во весь экран",
"EXIT_FULLSCREEN": "Выйти из полноэкранного режима"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "Контейнер потока, вероятно, не поддерживается встроенным браузерным плеером",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "Sesi aç",
"VOLUME": "Ses seviyesi"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "Tekrar dene",
"STALLED": "Bu yayının başlaması beklenenden uzun sürüyor.",
"PLAYBACK_FAILED": "Gömülü MPV oynatması başarısız oldu.",
"CHECKING_SUPPORT": "Gömülü MPV desteği denetleniyor...",
"NOT_AVAILABLE": "Gömülü MPV bu ortamda kullanılamıyor.",
"LOADING_STREAM": "Yayın yükleniyor…",
"PLAY": "Oynat",
"PAUSE": "Duraklat",
"PREVIOUS_EPISODE": "Önceki bölüm",
"NEXT_EPISODE": "Sonraki bölüm",
"BACK_10_SECONDS": "10 saniye geri",
"FORWARD_10_SECONDS": "10 saniye ileri",
"LIVE_STREAM": "Canlı yayın",
"MUTE": "Sesi kapat",
"UNMUTE": "Sesi aç",
"MUTED": "Ses kapalı",
"VOLUME": "Ses seviyesi",
"VOLUME_LABEL": "Ses seviyesi %{{percent}}",
"AUDIO_TRACKS": "Ses parçaları",
"SUBTITLES": "Altyazılar",
"SUBTITLES_OFF": "Kapalı",
"TRACK_DEFAULT": "Varsayılan",
"AUDIO_TRACK_FALLBACK": "Ses {{index}}",
"SUBTITLE_TRACK_FALLBACK": "Altyazı {{index}}",
"PLAYBACK_SPEED": "Oynatma hızı",
"SPEED_TOOLTIP": "Hız: {{speed}}",
"ASPECT_RATIO": "En boy oranı",
"ASPECT_TOOLTIP": "En boy oranı: {{aspect}}",
"ASPECT_DEFAULT": "Varsayılan",
"START_RECORDING": "Kaydı başlat",
"STOP_RECORDING": "Kaydı durdur",
"RECORDING": "Kaydediliyor",
"RECORDING_SAVED": "Kayıt kaydedildi",
"RECORDING_FAILED": "Kayıt başarısız oldu",
"RECORDING_FAILED_TO_START": "Kayıt başlatılamadı.",
"RECORDING_FAILED_TO_STOP": "Kayıt durdurulamadı.",
"SAVED_TO": "{{path}} konumuna kaydedildi",
"ENTER_FULLSCREEN": "Tam ekrana geç",
"EXIT_FULLSCREEN": "Tam ekrandan çık"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "取消静音",
"VOLUME": "音量"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "重试",
"STALLED": "该流的启动时间超出预期。",
"PLAYBACK_FAILED": "嵌入式 MPV 播放失败。",
"CHECKING_SUPPORT": "正在检查嵌入式 MPV 支持…",
"NOT_AVAILABLE": "嵌入式 MPV 在当前环境中不可用。",
"LOADING_STREAM": "正在加载流…",
"PLAY": "播放",
"PAUSE": "暂停",
"PREVIOUS_EPISODE": "上一集",
"NEXT_EPISODE": "下一集",
"BACK_10_SECONDS": "快退 10 秒",
"FORWARD_10_SECONDS": "快进 10 秒",
"LIVE_STREAM": "直播",
"MUTE": "静音",
"UNMUTE": "取消静音",
"MUTED": "已静音",
"VOLUME": "音量",
"VOLUME_LABEL": "音量 {{percent}}%",
"AUDIO_TRACKS": "音轨",
"SUBTITLES": "字幕",
"SUBTITLES_OFF": "关闭",
"TRACK_DEFAULT": "默认",
"AUDIO_TRACK_FALLBACK": "音轨 {{index}}",
"SUBTITLE_TRACK_FALLBACK": "字幕 {{index}}",
"PLAYBACK_SPEED": "播放速度",
"SPEED_TOOLTIP": "速度:{{speed}}",
"ASPECT_RATIO": "宽高比",
"ASPECT_TOOLTIP": "宽高比:{{aspect}}",
"ASPECT_DEFAULT": "默认",
"START_RECORDING": "开始录制",
"STOP_RECORDING": "停止录制",
"RECORDING": "正在录制",
"RECORDING_SAVED": "录制已保存",
"RECORDING_FAILED": "录制失败",
"RECORDING_FAILED_TO_START": "录制启动失败。",
"RECORDING_FAILED_TO_STOP": "录制停止失败。",
"SAVED_TO": "已保存至 {{path}}",
"ENTER_FULLSCREEN": "进入全屏",
"EXIT_FULLSCREEN": "退出全屏"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",
+43
View File
@@ -428,6 +428,49 @@
"UNMUTE": "取消靜音",
"VOLUME": "音量"
},
"EMBEDDED_MPV": {
"PLAYER": {
"RETRY": "重試",
"STALLED": "此串流的啟動時間比預期長。",
"PLAYBACK_FAILED": "內嵌 MPV 播放失敗。",
"CHECKING_SUPPORT": "正在檢查內嵌 MPV 支援…",
"NOT_AVAILABLE": "內嵌 MPV 在此環境中無法使用。",
"LOADING_STREAM": "正在載入串流…",
"PLAY": "播放",
"PAUSE": "暫停",
"PREVIOUS_EPISODE": "上一集",
"NEXT_EPISODE": "下一集",
"BACK_10_SECONDS": "倒轉 10 秒",
"FORWARD_10_SECONDS": "快轉 10 秒",
"LIVE_STREAM": "現場直播",
"MUTE": "靜音",
"UNMUTE": "取消靜音",
"MUTED": "已靜音",
"VOLUME": "音量",
"VOLUME_LABEL": "音量 {{percent}}%",
"AUDIO_TRACKS": "音軌",
"SUBTITLES": "字幕",
"SUBTITLES_OFF": "關閉",
"TRACK_DEFAULT": "預設",
"AUDIO_TRACK_FALLBACK": "音軌 {{index}}",
"SUBTITLE_TRACK_FALLBACK": "字幕 {{index}}",
"PLAYBACK_SPEED": "播放速度",
"SPEED_TOOLTIP": "速度:{{speed}}",
"ASPECT_RATIO": "長寬比",
"ASPECT_TOOLTIP": "長寬比:{{aspect}}",
"ASPECT_DEFAULT": "預設",
"START_RECORDING": "開始錄製",
"STOP_RECORDING": "停止錄製",
"RECORDING": "錄製中",
"RECORDING_SAVED": "錄製已儲存",
"RECORDING_FAILED": "錄製失敗",
"RECORDING_FAILED_TO_START": "無法開始錄製。",
"RECORDING_FAILED_TO_STOP": "無法停止錄製。",
"SAVED_TO": "已儲存至 {{path}}",
"ENTER_FULLSCREEN": "進入全螢幕",
"EXIT_FULLSCREEN": "離開全螢幕"
}
},
"PLAYBACK_DIAGNOSTICS": {
"UNSUPPORTED_CONTAINER": {
"TITLE": "This stream container is likely unsupported by the browser player",