feat: configurable watch together relay server

This commit is contained in:
edde746
2026-03-28 14:44:30 +01:00
parent 53d50dbc3b
commit 059509354d
36 changed files with 319 additions and 38 deletions
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Tilpas tastaturgenveje",
"videoPlayerNavigation": "Videoafspillernavigation",
"videoPlayerNavigationDescription": "Brug piletaster til at navigere videoafspillerkontroller",
"watchTogetherRelay": "Watch Together-relay",
"watchTogetherRelayDefault": "Standard",
"watchTogetherRelayDescription": "Angiv en brugerdefineret relay-server til Watch Together. Alle deltagere skal bruge den samme server.",
"watchTogetherRelayHint": "https://min-relay.eksempel.dk",
"crashReporting": "Fejlrapportering",
"crashReportingDescription": "Send fejlrapporter for at hjælpe med at forbedre appen",
"debugLogging": "Fejlfindingslogning",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Tastenkürzel anpassen",
"videoPlayerNavigation": "Videoplayer-Navigation",
"videoPlayerNavigationDescription": "Pfeiltasten zur Navigation der Videoplayer-Steuerung verwenden",
"watchTogetherRelay": "Gemeinsam Schauen Relay",
"watchTogetherRelayDefault": "Standard",
"watchTogetherRelayDescription": "Einen benutzerdefinierten Relay-Server für Gemeinsam Schauen festlegen. Alle Teilnehmer müssen denselben Server verwenden.",
"watchTogetherRelayHint": "https://mein-relay.beispiel.de",
"crashReporting": "Absturzberichte",
"crashReportingDescription": "Absturzberichte senden, um die App zu verbessern",
"debugLogging": "Debug-Protokollierung",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Customize keyboard shortcuts",
"videoPlayerNavigation": "Video Player Navigation",
"videoPlayerNavigationDescription": "Use arrow keys to navigate video player controls",
"watchTogetherRelay": "Watch Together Relay",
"watchTogetherRelayDefault": "Default",
"watchTogetherRelayDescription": "Set a custom relay server for Watch Together. All participants must use the same server.",
"watchTogetherRelayHint": "https://my-relay.example.com",
"crashReporting": "Crash Reporting",
"crashReportingDescription": "Send crash reports to help improve the app",
"debugLogging": "Debug Logging",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Personalizar los atajos de teclado",
"videoPlayerNavigation": "Navegación del Reproductor de Video",
"videoPlayerNavigationDescription": "Usar las teclas de flecha para navegar por los controles del reproductor",
"watchTogetherRelay": "Relay de Ver Juntos",
"watchTogetherRelayDefault": "Predeterminado",
"watchTogetherRelayDescription": "Configurar un servidor relay personalizado para Ver Juntos. Todos los participantes deben usar el mismo servidor.",
"watchTogetherRelayHint": "https://mi-relay.ejemplo.com",
"crashReporting": "Informes de Errores",
"crashReportingDescription": "Enviar informes de errores para mejorar la aplicación",
"debugLogging": "Registro de Depuración",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Personnaliser les raccourcis clavier",
"videoPlayerNavigation": "Navigation dans le lecteur vidéo",
"videoPlayerNavigationDescription": "Utilisez les touches fléchées pour naviguer dans les commandes du lecteur vidéo.",
"watchTogetherRelay": "Relais Regarder Ensemble",
"watchTogetherRelayDefault": "Par défaut",
"watchTogetherRelayDescription": "Définir un serveur relais personnalisé pour Regarder Ensemble. Tous les participants doivent utiliser le même serveur.",
"watchTogetherRelayHint": "https://mon-relais.exemple.fr",
"crashReporting": "Rapports de plantage",
"crashReportingDescription": "Envoyer des rapports de plantage pour améliorer l'application",
"debugLogging": "Journalisation de débogage",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Personalizza le scorciatoie da tastiera",
"videoPlayerNavigation": "Navigazione del lettore video",
"videoPlayerNavigationDescription": "Usa i tasti freccia per navigare nei controlli del lettore video",
"watchTogetherRelay": "Relay Guarda Insieme",
"watchTogetherRelayDefault": "Predefinito",
"watchTogetherRelayDescription": "Imposta un server relay personalizzato per Guarda Insieme. Tutti i partecipanti devono utilizzare lo stesso server.",
"watchTogetherRelayHint": "https://mio-relay.esempio.it",
"crashReporting": "Segnalazione errori",
"crashReportingDescription": "Invia segnalazioni di errori per migliorare l'app",
"debugLogging": "Log di debug",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "キーボードショートカットをカスタマイズ",
"videoPlayerNavigation": "動画プレーヤーナビゲーション",
"videoPlayerNavigationDescription": "矢印キーで動画プレーヤーコントロールを操作",
"watchTogetherRelay": "一緒に視聴リレーサーバー",
"watchTogetherRelayDefault": "デフォルト",
"watchTogetherRelayDescription": "一緒に視聴用のカスタムリレーサーバーを設定します。すべての参加者が同じサーバーを使用する必要があります。",
"watchTogetherRelayHint": "https://my-relay.example.com",
"crashReporting": "クラッシュレポート",
"crashReportingDescription": "アプリの改善に役立つクラッシュレポートを送信",
"debugLogging": "デバッグログ",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "사용자 정의 키보드 단축키",
"videoPlayerNavigation": "비디오 플레이어 탐색",
"videoPlayerNavigationDescription": "방향 키를 사용하여 비디오 플레이어 컨트롤 탐색",
"watchTogetherRelay": "함께 보기 릴레이",
"watchTogetherRelayDefault": "기본값",
"watchTogetherRelayDescription": "함께 보기에 사용할 사용자 지정 릴레이 서버를 설정합니다. 모든 참가자가 동일한 서버를 사용해야 합니다.",
"watchTogetherRelayHint": "https://my-relay.example.com",
"crashReporting": "충돌 보고",
"crashReportingDescription": "앱 개선을 위해 충돌 보고서 전송",
"debugLogging": "디버그 로깅",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Tilpass tastatursnarveier",
"videoPlayerNavigation": "Videospillernavigering",
"videoPlayerNavigationDescription": "Bruk piltaster for å navigere videospillerkontroller",
"watchTogetherRelay": "Se Sammen-relay",
"watchTogetherRelayDefault": "Standard",
"watchTogetherRelayDescription": "Angi en egendefinert relay-server for Se Sammen. Alle deltakere må bruke den samme serveren.",
"watchTogetherRelayHint": "https://min-relay.eksempel.no",
"crashReporting": "Krasjrapportering",
"crashReportingDescription": "Send krasjrapporter for å hjelpe med å forbedre appen",
"debugLogging": "Feilsøkingslogging",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Pas toetsenbord sneltoetsen aan",
"videoPlayerNavigation": "Videospeler navigatie",
"videoPlayerNavigationDescription": "Gebruik pijltjestoetsen om door de videospeler bediening te navigeren",
"watchTogetherRelay": "Samen Kijken Relay",
"watchTogetherRelayDefault": "Standaard",
"watchTogetherRelayDescription": "Stel een aangepaste relay-server in voor Samen Kijken. Alle deelnemers moeten dezelfde server gebruiken.",
"watchTogetherRelayHint": "https://mijn-relay.voorbeeld.nl",
"crashReporting": "Crashrapportage",
"crashReportingDescription": "Crashrapporten verzenden om de app te verbeteren",
"debugLogging": "Debug logging",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Dostosuj skróty klawiszowe",
"videoPlayerNavigation": "Nawigacja odtwarzacza wideo",
"videoPlayerNavigationDescription": "Użyj klawiszy strzałek do nawigacji kontrolkami odtwarzacza",
"watchTogetherRelay": "Relay Oglądaj Razem",
"watchTogetherRelayDefault": "Domyślny",
"watchTogetherRelayDescription": "Ustaw niestandardowy serwer relay dla Oglądaj Razem. Wszyscy uczestnicy muszą korzystać z tego samego serwera.",
"watchTogetherRelayHint": "https://moj-relay.przyklad.pl",
"crashReporting": "Raportowanie błędów",
"crashReportingDescription": "Wysyłaj raporty o błędach, aby pomóc ulepszyć aplikację",
"debugLogging": "Logowanie debugowania",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Personalizar atalhos de teclado",
"videoPlayerNavigation": "Navegação do Player de Vídeo",
"videoPlayerNavigationDescription": "Usar teclas de seta para navegar nos controles do player",
"watchTogetherRelay": "Relay do Assistir Juntos",
"watchTogetherRelayDefault": "Padrão",
"watchTogetherRelayDescription": "Definir um servidor relay personalizado para Assistir Juntos. Todos os participantes devem usar o mesmo servidor.",
"watchTogetherRelayHint": "https://meu-relay.exemplo.com.br",
"crashReporting": "Relatório de Erros",
"crashReportingDescription": "Enviar relatórios de erros para ajudar a melhorar o app",
"debugLogging": "Log de Depuração",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Настроить горячие клавиши",
"videoPlayerNavigation": "Навигация видеоплеера",
"videoPlayerNavigationDescription": "Использовать клавиши стрелок для навигации по элементам управления плеером",
"watchTogetherRelay": "Relay совместного просмотра",
"watchTogetherRelayDefault": "По умолчанию",
"watchTogetherRelayDescription": "Указать пользовательский relay-сервер для совместного просмотра. Все участники должны использовать один и тот же сервер.",
"watchTogetherRelayHint": "https://my-relay.example.com",
"crashReporting": "Отчёты об ошибках",
"crashReportingDescription": "Отправлять отчёты об ошибках для улучшения приложения",
"debugLogging": "Журнал отладки",
+2 -2
View File
@@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 15
/// Strings: 12045 (803 per locale)
/// Strings: 12105 (807 per locale)
///
/// Built on 2026-03-27 at 16:34 UTC
/// Built on 2026-03-28 at 13:35 UTC
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsDa implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Tilpas tastaturgenveje';
@override String get videoPlayerNavigation => 'Videoafspillernavigation';
@override String get videoPlayerNavigationDescription => 'Brug piletaster til at navigere videoafspillerkontroller';
@override String get watchTogetherRelay => 'Watch Together-relay';
@override String get watchTogetherRelayDefault => 'Standard';
@override String get watchTogetherRelayDescription => 'Angiv en brugerdefineret relay-server til Watch Together. Alle deltagere skal bruge den samme server.';
@override String get watchTogetherRelayHint => 'https://min-relay.eksempel.dk';
@override String get crashReporting => 'Fejlrapportering';
@override String get crashReportingDescription => 'Send fejlrapporter for at hjælpe med at forbedre appen';
@override String get debugLogging => 'Fejlfindingslogning';
@@ -1440,6 +1444,10 @@ extension on TranslationsDa {
'settings.keyboardShortcutsDescription' => 'Tilpas tastaturgenveje',
'settings.videoPlayerNavigation' => 'Videoafspillernavigation',
'settings.videoPlayerNavigationDescription' => 'Brug piletaster til at navigere videoafspillerkontroller',
'settings.watchTogetherRelay' => 'Watch Together-relay',
'settings.watchTogetherRelayDefault' => 'Standard',
'settings.watchTogetherRelayDescription' => 'Angiv en brugerdefineret relay-server til Watch Together. Alle deltagere skal bruge den samme server.',
'settings.watchTogetherRelayHint' => 'https://min-relay.eksempel.dk',
'settings.crashReporting' => 'Fejlrapportering',
'settings.crashReportingDescription' => 'Send fejlrapporter for at hjælpe med at forbedre appen',
'settings.debugLogging' => 'Fejlfindingslogning',
@@ -1808,12 +1816,12 @@ extension on TranslationsDa {
'liveTv.today' => 'I dag',
'liveTv.midnight' => 'Midnat',
'liveTv.overnight' => 'Nat',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Morgen',
'liveTv.daytime' => 'Dagtid',
'liveTv.evening' => 'Aften',
'liveTv.lateNight' => 'Sen aften',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'Hvad der kører',
'liveTv.watchChannel' => 'Se kanal',
'liveTv.favorites' => 'Favoritter',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsDe implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Tastenkürzel anpassen';
@override String get videoPlayerNavigation => 'Videoplayer-Navigation';
@override String get videoPlayerNavigationDescription => 'Pfeiltasten zur Navigation der Videoplayer-Steuerung verwenden';
@override String get watchTogetherRelay => 'Gemeinsam Schauen Relay';
@override String get watchTogetherRelayDefault => 'Standard';
@override String get watchTogetherRelayDescription => 'Einen benutzerdefinierten Relay-Server für Gemeinsam Schauen festlegen. Alle Teilnehmer müssen denselben Server verwenden.';
@override String get watchTogetherRelayHint => 'https://mein-relay.beispiel.de';
@override String get crashReporting => 'Absturzberichte';
@override String get crashReportingDescription => 'Absturzberichte senden, um die App zu verbessern';
@override String get debugLogging => 'Debug-Protokollierung';
@@ -1440,6 +1444,10 @@ extension on TranslationsDe {
'settings.keyboardShortcutsDescription' => 'Tastenkürzel anpassen',
'settings.videoPlayerNavigation' => 'Videoplayer-Navigation',
'settings.videoPlayerNavigationDescription' => 'Pfeiltasten zur Navigation der Videoplayer-Steuerung verwenden',
'settings.watchTogetherRelay' => 'Gemeinsam Schauen Relay',
'settings.watchTogetherRelayDefault' => 'Standard',
'settings.watchTogetherRelayDescription' => 'Einen benutzerdefinierten Relay-Server für Gemeinsam Schauen festlegen. Alle Teilnehmer müssen denselben Server verwenden.',
'settings.watchTogetherRelayHint' => 'https://mein-relay.beispiel.de',
'settings.crashReporting' => 'Absturzberichte',
'settings.crashReportingDescription' => 'Absturzberichte senden, um die App zu verbessern',
'settings.debugLogging' => 'Debug-Protokollierung',
@@ -1808,12 +1816,12 @@ extension on TranslationsDe {
'liveTv.today' => 'Heute',
'liveTv.midnight' => 'Mitternacht',
'liveTv.overnight' => 'Nacht',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Morgen',
'liveTv.daytime' => 'Tagsüber',
'liveTv.evening' => 'Abend',
'liveTv.lateNight' => 'Spätnacht',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'Jetzt im TV',
'liveTv.watchChannel' => 'Kanal ansehen',
'liveTv.favorites' => 'Favoriten',
+18 -2
View File
@@ -553,6 +553,18 @@ class TranslationsSettingsEn {
/// en: 'Use arrow keys to navigate video player controls'
String get videoPlayerNavigationDescription => 'Use arrow keys to navigate video player controls';
/// en: 'Watch Together Relay'
String get watchTogetherRelay => 'Watch Together Relay';
/// en: 'Default'
String get watchTogetherRelayDefault => 'Default';
/// en: 'Set a custom relay server for Watch Together. All participants must use the same server.'
String get watchTogetherRelayDescription => 'Set a custom relay server for Watch Together. All participants must use the same server.';
/// en: 'https://my-relay.example.com'
String get watchTogetherRelayHint => 'https://my-relay.example.com';
/// en: 'Crash Reporting'
String get crashReporting => 'Crash Reporting';
@@ -3053,6 +3065,10 @@ extension on Translations {
'settings.keyboardShortcutsDescription' => 'Customize keyboard shortcuts',
'settings.videoPlayerNavigation' => 'Video Player Navigation',
'settings.videoPlayerNavigationDescription' => 'Use arrow keys to navigate video player controls',
'settings.watchTogetherRelay' => 'Watch Together Relay',
'settings.watchTogetherRelayDefault' => 'Default',
'settings.watchTogetherRelayDescription' => 'Set a custom relay server for Watch Together. All participants must use the same server.',
'settings.watchTogetherRelayHint' => 'https://my-relay.example.com',
'settings.crashReporting' => 'Crash Reporting',
'settings.crashReportingDescription' => 'Send crash reports to help improve the app',
'settings.debugLogging' => 'Debug Logging',
@@ -3421,12 +3437,12 @@ extension on Translations {
'liveTv.today' => 'Today',
'liveTv.midnight' => 'Midnight',
'liveTv.overnight' => 'Overnight',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Morning',
'liveTv.daytime' => 'Daytime',
'liveTv.evening' => 'Evening',
'liveTv.lateNight' => 'Late Night',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'What\'s On',
'liveTv.watchChannel' => 'Watch Channel',
'liveTv.favorites' => 'Favorites',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsEs implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Personalizar los atajos de teclado';
@override String get videoPlayerNavigation => 'Navegación del Reproductor de Video';
@override String get videoPlayerNavigationDescription => 'Usar las teclas de flecha para navegar por los controles del reproductor';
@override String get watchTogetherRelay => 'Relay de Ver Juntos';
@override String get watchTogetherRelayDefault => 'Predeterminado';
@override String get watchTogetherRelayDescription => 'Configurar un servidor relay personalizado para Ver Juntos. Todos los participantes deben usar el mismo servidor.';
@override String get watchTogetherRelayHint => 'https://mi-relay.ejemplo.com';
@override String get crashReporting => 'Informes de Errores';
@override String get crashReportingDescription => 'Enviar informes de errores para mejorar la aplicación';
@override String get debugLogging => 'Registro de Depuración';
@@ -1440,6 +1444,10 @@ extension on TranslationsEs {
'settings.keyboardShortcutsDescription' => 'Personalizar los atajos de teclado',
'settings.videoPlayerNavigation' => 'Navegación del Reproductor de Video',
'settings.videoPlayerNavigationDescription' => 'Usar las teclas de flecha para navegar por los controles del reproductor',
'settings.watchTogetherRelay' => 'Relay de Ver Juntos',
'settings.watchTogetherRelayDefault' => 'Predeterminado',
'settings.watchTogetherRelayDescription' => 'Configurar un servidor relay personalizado para Ver Juntos. Todos los participantes deben usar el mismo servidor.',
'settings.watchTogetherRelayHint' => 'https://mi-relay.ejemplo.com',
'settings.crashReporting' => 'Informes de Errores',
'settings.crashReportingDescription' => 'Enviar informes de errores para mejorar la aplicación',
'settings.debugLogging' => 'Registro de Depuración',
@@ -1808,12 +1816,12 @@ extension on TranslationsEs {
'liveTv.today' => 'Hoy',
'liveTv.midnight' => 'Medianoche',
'liveTv.overnight' => 'Madrugada',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Mañana',
'liveTv.daytime' => 'Día',
'liveTv.evening' => 'Noche',
'liveTv.lateNight' => 'Trasnoche',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'En emisión',
'liveTv.watchChannel' => 'Ver canal',
'liveTv.favorites' => 'Favoritos',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsFr implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Personnaliser les raccourcis clavier';
@override String get videoPlayerNavigation => 'Navigation dans le lecteur vidéo';
@override String get videoPlayerNavigationDescription => 'Utilisez les touches fléchées pour naviguer dans les commandes du lecteur vidéo.';
@override String get watchTogetherRelay => 'Relais Regarder Ensemble';
@override String get watchTogetherRelayDefault => 'Par défaut';
@override String get watchTogetherRelayDescription => 'Définir un serveur relais personnalisé pour Regarder Ensemble. Tous les participants doivent utiliser le même serveur.';
@override String get watchTogetherRelayHint => 'https://mon-relais.exemple.fr';
@override String get crashReporting => 'Rapports de plantage';
@override String get crashReportingDescription => 'Envoyer des rapports de plantage pour améliorer l\'application';
@override String get debugLogging => 'Journalisation de débogage';
@@ -1440,6 +1444,10 @@ extension on TranslationsFr {
'settings.keyboardShortcutsDescription' => 'Personnaliser les raccourcis clavier',
'settings.videoPlayerNavigation' => 'Navigation dans le lecteur vidéo',
'settings.videoPlayerNavigationDescription' => 'Utilisez les touches fléchées pour naviguer dans les commandes du lecteur vidéo.',
'settings.watchTogetherRelay' => 'Relais Regarder Ensemble',
'settings.watchTogetherRelayDefault' => 'Par défaut',
'settings.watchTogetherRelayDescription' => 'Définir un serveur relais personnalisé pour Regarder Ensemble. Tous les participants doivent utiliser le même serveur.',
'settings.watchTogetherRelayHint' => 'https://mon-relais.exemple.fr',
'settings.crashReporting' => 'Rapports de plantage',
'settings.crashReportingDescription' => 'Envoyer des rapports de plantage pour améliorer l\'application',
'settings.debugLogging' => 'Journalisation de débogage',
@@ -1808,12 +1816,12 @@ extension on TranslationsFr {
'liveTv.today' => 'Aujourd\'hui',
'liveTv.midnight' => 'Minuit',
'liveTv.overnight' => 'Nuit',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Matin',
'liveTv.daytime' => 'Journée',
'liveTv.evening' => 'Soirée',
'liveTv.lateNight' => 'Nuit tardive',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'En ce moment',
'liveTv.watchChannel' => 'Regarder la chaîne',
'liveTv.favorites' => 'Favoris',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsIt implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Personalizza le scorciatoie da tastiera';
@override String get videoPlayerNavigation => 'Navigazione del lettore video';
@override String get videoPlayerNavigationDescription => 'Usa i tasti freccia per navigare nei controlli del lettore video';
@override String get watchTogetherRelay => 'Relay Guarda Insieme';
@override String get watchTogetherRelayDefault => 'Predefinito';
@override String get watchTogetherRelayDescription => 'Imposta un server relay personalizzato per Guarda Insieme. Tutti i partecipanti devono utilizzare lo stesso server.';
@override String get watchTogetherRelayHint => 'https://mio-relay.esempio.it';
@override String get crashReporting => 'Segnalazione errori';
@override String get crashReportingDescription => 'Invia segnalazioni di errori per migliorare l\'app';
@override String get debugLogging => 'Log di debug';
@@ -1440,6 +1444,10 @@ extension on TranslationsIt {
'settings.keyboardShortcutsDescription' => 'Personalizza le scorciatoie da tastiera',
'settings.videoPlayerNavigation' => 'Navigazione del lettore video',
'settings.videoPlayerNavigationDescription' => 'Usa i tasti freccia per navigare nei controlli del lettore video',
'settings.watchTogetherRelay' => 'Relay Guarda Insieme',
'settings.watchTogetherRelayDefault' => 'Predefinito',
'settings.watchTogetherRelayDescription' => 'Imposta un server relay personalizzato per Guarda Insieme. Tutti i partecipanti devono utilizzare lo stesso server.',
'settings.watchTogetherRelayHint' => 'https://mio-relay.esempio.it',
'settings.crashReporting' => 'Segnalazione errori',
'settings.crashReportingDescription' => 'Invia segnalazioni di errori per migliorare l\'app',
'settings.debugLogging' => 'Log di debug',
@@ -1808,12 +1816,12 @@ extension on TranslationsIt {
'liveTv.today' => 'Oggi',
'liveTv.midnight' => 'Mezzanotte',
'liveTv.overnight' => 'Notte',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Mattina',
'liveTv.daytime' => 'Giorno',
'liveTv.evening' => 'Sera',
'liveTv.lateNight' => 'Notte tarda',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'In onda ora',
'liveTv.watchChannel' => 'Guarda canale',
'liveTv.favorites' => 'Preferiti',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsJa implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'キーボードショートカットをカスタマイズ';
@override String get videoPlayerNavigation => '動画プレーヤーナビゲーション';
@override String get videoPlayerNavigationDescription => '矢印キーで動画プレーヤーコントロールを操作';
@override String get watchTogetherRelay => '一緒に視聴リレーサーバー';
@override String get watchTogetherRelayDefault => 'デフォルト';
@override String get watchTogetherRelayDescription => '一緒に視聴用のカスタムリレーサーバーを設定します。すべての参加者が同じサーバーを使用する必要があります。';
@override String get watchTogetherRelayHint => 'https://my-relay.example.com';
@override String get crashReporting => 'クラッシュレポート';
@override String get crashReportingDescription => 'アプリの改善に役立つクラッシュレポートを送信';
@override String get debugLogging => 'デバッグログ';
@@ -1440,6 +1444,10 @@ extension on TranslationsJa {
'settings.keyboardShortcutsDescription' => 'キーボードショートカットをカスタマイズ',
'settings.videoPlayerNavigation' => '動画プレーヤーナビゲーション',
'settings.videoPlayerNavigationDescription' => '矢印キーで動画プレーヤーコントロールを操作',
'settings.watchTogetherRelay' => '一緒に視聴リレーサーバー',
'settings.watchTogetherRelayDefault' => 'デフォルト',
'settings.watchTogetherRelayDescription' => '一緒に視聴用のカスタムリレーサーバーを設定します。すべての参加者が同じサーバーを使用する必要があります。',
'settings.watchTogetherRelayHint' => 'https://my-relay.example.com',
'settings.crashReporting' => 'クラッシュレポート',
'settings.crashReportingDescription' => 'アプリの改善に役立つクラッシュレポートを送信',
'settings.debugLogging' => 'デバッグログ',
@@ -1808,12 +1816,12 @@ extension on TranslationsJa {
'liveTv.today' => '今日',
'liveTv.midnight' => '深夜',
'liveTv.overnight' => '深夜',
_ => null,
} ?? switch (path) {
'liveTv.morning' => '',
'liveTv.daytime' => '',
'liveTv.evening' => '夕方',
'liveTv.lateNight' => '深夜',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => '放送中',
'liveTv.watchChannel' => 'チャンネルを視聴',
'liveTv.favorites' => 'お気に入り',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsKo implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => '사용자 정의 키보드 단축키';
@override String get videoPlayerNavigation => '비디오 플레이어 탐색';
@override String get videoPlayerNavigationDescription => '방향 키를 사용하여 비디오 플레이어 컨트롤 탐색';
@override String get watchTogetherRelay => '함께 보기 릴레이';
@override String get watchTogetherRelayDefault => '기본값';
@override String get watchTogetherRelayDescription => '함께 보기에 사용할 사용자 지정 릴레이 서버를 설정합니다. 모든 참가자가 동일한 서버를 사용해야 합니다.';
@override String get watchTogetherRelayHint => 'https://my-relay.example.com';
@override String get crashReporting => '충돌 보고';
@override String get crashReportingDescription => '앱 개선을 위해 충돌 보고서 전송';
@override String get debugLogging => '디버그 로깅';
@@ -1440,6 +1444,10 @@ extension on TranslationsKo {
'settings.keyboardShortcutsDescription' => '사용자 정의 키보드 단축키',
'settings.videoPlayerNavigation' => '비디오 플레이어 탐색',
'settings.videoPlayerNavigationDescription' => '방향 키를 사용하여 비디오 플레이어 컨트롤 탐색',
'settings.watchTogetherRelay' => '함께 보기 릴레이',
'settings.watchTogetherRelayDefault' => '기본값',
'settings.watchTogetherRelayDescription' => '함께 보기에 사용할 사용자 지정 릴레이 서버를 설정합니다. 모든 참가자가 동일한 서버를 사용해야 합니다.',
'settings.watchTogetherRelayHint' => 'https://my-relay.example.com',
'settings.crashReporting' => '충돌 보고',
'settings.crashReportingDescription' => '앱 개선을 위해 충돌 보고서 전송',
'settings.debugLogging' => '디버그 로깅',
@@ -1808,12 +1816,12 @@ extension on TranslationsKo {
'liveTv.today' => '오늘',
'liveTv.midnight' => '자정',
'liveTv.overnight' => '심야',
_ => null,
} ?? switch (path) {
'liveTv.morning' => '아침',
'liveTv.daytime' => '',
'liveTv.evening' => '저녁',
'liveTv.lateNight' => '심야 방송',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => '지금 방송 중',
'liveTv.watchChannel' => '채널 시청',
'liveTv.favorites' => '즐겨찾기',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsNb implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Tilpass tastatursnarveier';
@override String get videoPlayerNavigation => 'Videospillernavigering';
@override String get videoPlayerNavigationDescription => 'Bruk piltaster for å navigere videospillerkontroller';
@override String get watchTogetherRelay => 'Se Sammen-relay';
@override String get watchTogetherRelayDefault => 'Standard';
@override String get watchTogetherRelayDescription => 'Angi en egendefinert relay-server for Se Sammen. Alle deltakere må bruke den samme serveren.';
@override String get watchTogetherRelayHint => 'https://min-relay.eksempel.no';
@override String get crashReporting => 'Krasjrapportering';
@override String get crashReportingDescription => 'Send krasjrapporter for å hjelpe med å forbedre appen';
@override String get debugLogging => 'Feilsøkingslogging';
@@ -1440,6 +1444,10 @@ extension on TranslationsNb {
'settings.keyboardShortcutsDescription' => 'Tilpass tastatursnarveier',
'settings.videoPlayerNavigation' => 'Videospillernavigering',
'settings.videoPlayerNavigationDescription' => 'Bruk piltaster for å navigere videospillerkontroller',
'settings.watchTogetherRelay' => 'Se Sammen-relay',
'settings.watchTogetherRelayDefault' => 'Standard',
'settings.watchTogetherRelayDescription' => 'Angi en egendefinert relay-server for Se Sammen. Alle deltakere må bruke den samme serveren.',
'settings.watchTogetherRelayHint' => 'https://min-relay.eksempel.no',
'settings.crashReporting' => 'Krasjrapportering',
'settings.crashReportingDescription' => 'Send krasjrapporter for å hjelpe med å forbedre appen',
'settings.debugLogging' => 'Feilsøkingslogging',
@@ -1808,12 +1816,12 @@ extension on TranslationsNb {
'liveTv.today' => 'I dag',
'liveTv.midnight' => 'Midnatt',
'liveTv.overnight' => 'Natt',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Morgen',
'liveTv.daytime' => 'Dagtid',
'liveTv.evening' => 'Kveld',
'liveTv.lateNight' => 'Sen kveld',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'Hva går nå',
'liveTv.watchChannel' => 'Se kanal',
'liveTv.favorites' => 'Favoritter',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsNl implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Pas toetsenbord sneltoetsen aan';
@override String get videoPlayerNavigation => 'Videospeler navigatie';
@override String get videoPlayerNavigationDescription => 'Gebruik pijltjestoetsen om door de videospeler bediening te navigeren';
@override String get watchTogetherRelay => 'Samen Kijken Relay';
@override String get watchTogetherRelayDefault => 'Standaard';
@override String get watchTogetherRelayDescription => 'Stel een aangepaste relay-server in voor Samen Kijken. Alle deelnemers moeten dezelfde server gebruiken.';
@override String get watchTogetherRelayHint => 'https://mijn-relay.voorbeeld.nl';
@override String get crashReporting => 'Crashrapportage';
@override String get crashReportingDescription => 'Crashrapporten verzenden om de app te verbeteren';
@override String get debugLogging => 'Debug logging';
@@ -1440,6 +1444,10 @@ extension on TranslationsNl {
'settings.keyboardShortcutsDescription' => 'Pas toetsenbord sneltoetsen aan',
'settings.videoPlayerNavigation' => 'Videospeler navigatie',
'settings.videoPlayerNavigationDescription' => 'Gebruik pijltjestoetsen om door de videospeler bediening te navigeren',
'settings.watchTogetherRelay' => 'Samen Kijken Relay',
'settings.watchTogetherRelayDefault' => 'Standaard',
'settings.watchTogetherRelayDescription' => 'Stel een aangepaste relay-server in voor Samen Kijken. Alle deelnemers moeten dezelfde server gebruiken.',
'settings.watchTogetherRelayHint' => 'https://mijn-relay.voorbeeld.nl',
'settings.crashReporting' => 'Crashrapportage',
'settings.crashReportingDescription' => 'Crashrapporten verzenden om de app te verbeteren',
'settings.debugLogging' => 'Debug logging',
@@ -1808,12 +1816,12 @@ extension on TranslationsNl {
'liveTv.today' => 'Vandaag',
'liveTv.midnight' => 'Middernacht',
'liveTv.overnight' => 'Nacht',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Ochtend',
'liveTv.daytime' => 'Overdag',
'liveTv.evening' => 'Avond',
'liveTv.lateNight' => 'Late avond',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'Nu op TV',
'liveTv.watchChannel' => 'Kanaal bekijken',
'liveTv.favorites' => 'Favorieten',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsPl implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Dostosuj skróty klawiszowe';
@override String get videoPlayerNavigation => 'Nawigacja odtwarzacza wideo';
@override String get videoPlayerNavigationDescription => 'Użyj klawiszy strzałek do nawigacji kontrolkami odtwarzacza';
@override String get watchTogetherRelay => 'Relay Oglądaj Razem';
@override String get watchTogetherRelayDefault => 'Domyślny';
@override String get watchTogetherRelayDescription => 'Ustaw niestandardowy serwer relay dla Oglądaj Razem. Wszyscy uczestnicy muszą korzystać z tego samego serwera.';
@override String get watchTogetherRelayHint => 'https://moj-relay.przyklad.pl';
@override String get crashReporting => 'Raportowanie błędów';
@override String get crashReportingDescription => 'Wysyłaj raporty o błędach, aby pomóc ulepszyć aplikację';
@override String get debugLogging => 'Logowanie debugowania';
@@ -1440,6 +1444,10 @@ extension on TranslationsPl {
'settings.keyboardShortcutsDescription' => 'Dostosuj skróty klawiszowe',
'settings.videoPlayerNavigation' => 'Nawigacja odtwarzacza wideo',
'settings.videoPlayerNavigationDescription' => 'Użyj klawiszy strzałek do nawigacji kontrolkami odtwarzacza',
'settings.watchTogetherRelay' => 'Relay Oglądaj Razem',
'settings.watchTogetherRelayDefault' => 'Domyślny',
'settings.watchTogetherRelayDescription' => 'Ustaw niestandardowy serwer relay dla Oglądaj Razem. Wszyscy uczestnicy muszą korzystać z tego samego serwera.',
'settings.watchTogetherRelayHint' => 'https://moj-relay.przyklad.pl',
'settings.crashReporting' => 'Raportowanie błędów',
'settings.crashReportingDescription' => 'Wysyłaj raporty o błędach, aby pomóc ulepszyć aplikację',
'settings.debugLogging' => 'Logowanie debugowania',
@@ -1808,12 +1816,12 @@ extension on TranslationsPl {
'liveTv.today' => 'Dzisiaj',
'liveTv.midnight' => 'Północ',
'liveTv.overnight' => 'Nocą',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Rano',
'liveTv.daytime' => 'W ciągu dnia',
'liveTv.evening' => 'Wieczorem',
'liveTv.lateNight' => 'Późna noc',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'Co leci',
'liveTv.watchChannel' => 'Oglądaj kanał',
'liveTv.favorites' => 'Ulubione',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsPt implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Personalizar atalhos de teclado';
@override String get videoPlayerNavigation => 'Navegação do Player de Vídeo';
@override String get videoPlayerNavigationDescription => 'Usar teclas de seta para navegar nos controles do player';
@override String get watchTogetherRelay => 'Relay do Assistir Juntos';
@override String get watchTogetherRelayDefault => 'Padrão';
@override String get watchTogetherRelayDescription => 'Definir um servidor relay personalizado para Assistir Juntos. Todos os participantes devem usar o mesmo servidor.';
@override String get watchTogetherRelayHint => 'https://meu-relay.exemplo.com.br';
@override String get crashReporting => 'Relatório de Erros';
@override String get crashReportingDescription => 'Enviar relatórios de erros para ajudar a melhorar o app';
@override String get debugLogging => 'Log de Depuração';
@@ -1440,6 +1444,10 @@ extension on TranslationsPt {
'settings.keyboardShortcutsDescription' => 'Personalizar atalhos de teclado',
'settings.videoPlayerNavigation' => 'Navegação do Player de Vídeo',
'settings.videoPlayerNavigationDescription' => 'Usar teclas de seta para navegar nos controles do player',
'settings.watchTogetherRelay' => 'Relay do Assistir Juntos',
'settings.watchTogetherRelayDefault' => 'Padrão',
'settings.watchTogetherRelayDescription' => 'Definir um servidor relay personalizado para Assistir Juntos. Todos os participantes devem usar o mesmo servidor.',
'settings.watchTogetherRelayHint' => 'https://meu-relay.exemplo.com.br',
'settings.crashReporting' => 'Relatório de Erros',
'settings.crashReportingDescription' => 'Enviar relatórios de erros para ajudar a melhorar o app',
'settings.debugLogging' => 'Log de Depuração',
@@ -1808,12 +1816,12 @@ extension on TranslationsPt {
'liveTv.today' => 'Hoje',
'liveTv.midnight' => 'Meia-noite',
'liveTv.overnight' => 'Madrugada',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Manhã',
'liveTv.daytime' => 'Dia',
'liveTv.evening' => 'Noite',
'liveTv.lateNight' => 'Madrugada',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'O que Está Passando',
'liveTv.watchChannel' => 'Assistir Canal',
'liveTv.favorites' => 'Favoritos',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsRu implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Настроить горячие клавиши';
@override String get videoPlayerNavigation => 'Навигация видеоплеера';
@override String get videoPlayerNavigationDescription => 'Использовать клавиши стрелок для навигации по элементам управления плеером';
@override String get watchTogetherRelay => 'Relay совместного просмотра';
@override String get watchTogetherRelayDefault => 'По умолчанию';
@override String get watchTogetherRelayDescription => 'Указать пользовательский relay-сервер для совместного просмотра. Все участники должны использовать один и тот же сервер.';
@override String get watchTogetherRelayHint => 'https://my-relay.example.com';
@override String get crashReporting => 'Отчёты об ошибках';
@override String get crashReportingDescription => 'Отправлять отчёты об ошибках для улучшения приложения';
@override String get debugLogging => 'Журнал отладки';
@@ -1440,6 +1444,10 @@ extension on TranslationsRu {
'settings.keyboardShortcutsDescription' => 'Настроить горячие клавиши',
'settings.videoPlayerNavigation' => 'Навигация видеоплеера',
'settings.videoPlayerNavigationDescription' => 'Использовать клавиши стрелок для навигации по элементам управления плеером',
'settings.watchTogetherRelay' => 'Relay совместного просмотра',
'settings.watchTogetherRelayDefault' => 'По умолчанию',
'settings.watchTogetherRelayDescription' => 'Указать пользовательский relay-сервер для совместного просмотра. Все участники должны использовать один и тот же сервер.',
'settings.watchTogetherRelayHint' => 'https://my-relay.example.com',
'settings.crashReporting' => 'Отчёты об ошибках',
'settings.crashReportingDescription' => 'Отправлять отчёты об ошибках для улучшения приложения',
'settings.debugLogging' => 'Журнал отладки',
@@ -1808,12 +1816,12 @@ extension on TranslationsRu {
'liveTv.today' => 'Сегодня',
'liveTv.midnight' => 'Полночь',
'liveTv.overnight' => 'Ночь',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Утро',
'liveTv.daytime' => 'День',
'liveTv.evening' => 'Вечер',
'liveTv.lateNight' => 'Поздний вечер',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'Что идёт',
'liveTv.watchChannel' => 'Смотреть канал',
'liveTv.favorites' => 'Избранное',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsSv implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => 'Anpassa tangentbordsgenvägar';
@override String get videoPlayerNavigation => 'Navigering i videospelaren';
@override String get videoPlayerNavigationDescription => 'Använd piltangenter för att navigera videospelarens kontroller';
@override String get watchTogetherRelay => 'Titta Tillsammans-relay';
@override String get watchTogetherRelayDefault => 'Standard';
@override String get watchTogetherRelayDescription => 'Ange en anpassad relay-server för Titta Tillsammans. Alla deltagare måste använda samma server.';
@override String get watchTogetherRelayHint => 'https://min-relay.exempel.se';
@override String get crashReporting => 'Kraschrapportering';
@override String get crashReportingDescription => 'Skicka kraschrapporter för att förbättra appen';
@override String get debugLogging => 'Felsökningsloggning';
@@ -1440,6 +1444,10 @@ extension on TranslationsSv {
'settings.keyboardShortcutsDescription' => 'Anpassa tangentbordsgenvägar',
'settings.videoPlayerNavigation' => 'Navigering i videospelaren',
'settings.videoPlayerNavigationDescription' => 'Använd piltangenter för att navigera videospelarens kontroller',
'settings.watchTogetherRelay' => 'Titta Tillsammans-relay',
'settings.watchTogetherRelayDefault' => 'Standard',
'settings.watchTogetherRelayDescription' => 'Ange en anpassad relay-server för Titta Tillsammans. Alla deltagare måste använda samma server.',
'settings.watchTogetherRelayHint' => 'https://min-relay.exempel.se',
'settings.crashReporting' => 'Kraschrapportering',
'settings.crashReportingDescription' => 'Skicka kraschrapporter för att förbättra appen',
'settings.debugLogging' => 'Felsökningsloggning',
@@ -1808,12 +1816,12 @@ extension on TranslationsSv {
'liveTv.today' => 'Idag',
'liveTv.midnight' => 'Midnatt',
'liveTv.overnight' => 'Natt',
_ => null,
} ?? switch (path) {
'liveTv.morning' => 'Morgon',
'liveTv.daytime' => 'Dagtid',
'liveTv.evening' => 'Kväll',
'liveTv.lateNight' => 'Sen kväll',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => 'På TV nu',
'liveTv.watchChannel' => 'Titta på kanal',
'liveTv.favorites' => 'Favoriter',
+10 -2
View File
@@ -269,6 +269,10 @@ class _TranslationsSettingsZh implements TranslationsSettingsEn {
@override String get keyboardShortcutsDescription => '自定义键盘快捷键';
@override String get videoPlayerNavigation => '视频播放器导航';
@override String get videoPlayerNavigationDescription => '使用方向键导航视频播放器控件';
@override String get watchTogetherRelay => '一起看中继服务器';
@override String get watchTogetherRelayDefault => '默认';
@override String get watchTogetherRelayDescription => '设置一起看的自定义中继服务器。所有参与者必须使用相同的服务器。';
@override String get watchTogetherRelayHint => 'https://my-relay.example.com';
@override String get crashReporting => '崩溃报告';
@override String get crashReportingDescription => '发送崩溃报告以帮助改进应用';
@override String get debugLogging => '调试日志';
@@ -1440,6 +1444,10 @@ extension on TranslationsZh {
'settings.keyboardShortcutsDescription' => '自定义键盘快捷键',
'settings.videoPlayerNavigation' => '视频播放器导航',
'settings.videoPlayerNavigationDescription' => '使用方向键导航视频播放器控件',
'settings.watchTogetherRelay' => '一起看中继服务器',
'settings.watchTogetherRelayDefault' => '默认',
'settings.watchTogetherRelayDescription' => '设置一起看的自定义中继服务器。所有参与者必须使用相同的服务器。',
'settings.watchTogetherRelayHint' => 'https://my-relay.example.com',
'settings.crashReporting' => '崩溃报告',
'settings.crashReportingDescription' => '发送崩溃报告以帮助改进应用',
'settings.debugLogging' => '调试日志',
@@ -1808,12 +1816,12 @@ extension on TranslationsZh {
'liveTv.today' => '今天',
'liveTv.midnight' => '午夜',
'liveTv.overnight' => '凌晨',
_ => null,
} ?? switch (path) {
'liveTv.morning' => '上午',
'liveTv.daytime' => '白天',
'liveTv.evening' => '晚上',
'liveTv.lateNight' => '深夜',
_ => null,
} ?? switch (path) {
'liveTv.whatsOn' => '正在播出',
'liveTv.watchChannel' => '观看频道',
'liveTv.favorites' => '收藏',
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "Anpassa tangentbordsgenvägar",
"videoPlayerNavigation": "Navigering i videospelaren",
"videoPlayerNavigationDescription": "Använd piltangenter för att navigera videospelarens kontroller",
"watchTogetherRelay": "Titta Tillsammans-relay",
"watchTogetherRelayDefault": "Standard",
"watchTogetherRelayDescription": "Ange en anpassad relay-server för Titta Tillsammans. Alla deltagare måste använda samma server.",
"watchTogetherRelayHint": "https://min-relay.exempel.se",
"crashReporting": "Kraschrapportering",
"crashReportingDescription": "Skicka kraschrapporter för att förbättra appen",
"debugLogging": "Felsökningsloggning",
+4
View File
@@ -150,6 +150,10 @@
"keyboardShortcutsDescription": "自定义键盘快捷键",
"videoPlayerNavigation": "视频播放器导航",
"videoPlayerNavigationDescription": "使用方向键导航视频播放器控件",
"watchTogetherRelay": "一起看中继服务器",
"watchTogetherRelayDefault": "默认",
"watchTogetherRelayDescription": "设置一起看的自定义中继服务器。所有参与者必须使用相同的服务器。",
"watchTogetherRelayHint": "https://my-relay.example.com",
"crashReporting": "崩溃报告",
"crashReportingDescription": "发送崩溃报告以帮助改进应用",
"debugLogging": "调试日志",
+57
View File
@@ -113,6 +113,7 @@ class _SettingsScreenState extends State<SettingsScreen> with FocusableTab {
static const _kResetSettings = 'reset_settings';
static const _kCheckForUpdates = 'check_for_updates';
static const _kAbout = 'about';
static const _kWatchTogetherRelay = 'watch_together_relay';
KeyboardShortcutsService? _keyboardService;
late final bool _keyboardShortcutsSupported = KeyboardShortcutsService.isPlatformSupported();
bool _isLoading = true;
@@ -144,6 +145,7 @@ class _SettingsScreenState extends State<SettingsScreen> with FocusableTab {
bool _useExternalPlayer = false;
bool _confirmExitOnBack = true;
String _selectedExternalPlayerName = '';
String? _customRelayUrl;
// Update checking state
bool _isCheckingForUpdate = false;
@@ -224,6 +226,7 @@ class _SettingsScreenState extends State<SettingsScreen> with FocusableTab {
_useExternalPlayer = _settingsService.getUseExternalPlayer();
_selectedExternalPlayerName = _settingsService.getSelectedExternalPlayer().name;
_confirmExitOnBack = _settingsService.getConfirmExitOnBack();
_customRelayUrl = _settingsService.getCustomRelayUrl();
_isLoading = false;
});
}
@@ -1200,6 +1203,14 @@ class _SettingsScreenState extends State<SettingsScreen> with FocusableTab {
style: Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
),
),
ListTile(
focusNode: _focusTracker.get(_kWatchTogetherRelay),
leading: const AppIcon(Symbols.dns_rounded, fill: 1),
title: Text(t.settings.watchTogetherRelay),
subtitle: Text(t.settings.watchTogetherRelayDescription),
trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1),
onTap: () => _showRelayUrlDialog(),
),
SwitchListTile(
focusNode: _focusTracker.get(_kCrashReporting),
secondary: const AppIcon(Symbols.monitoring_rounded, fill: 1),
@@ -1689,6 +1700,52 @@ class _SettingsScreenState extends State<SettingsScreen> with FocusableTab {
);
}
void _showRelayUrlDialog() {
final controller = TextEditingController(text: _customRelayUrl ?? '');
final saveFocusNode = FocusNode();
showDialog(
context: context,
builder: (BuildContext dialogContext) {
return AlertDialog(
title: Text(t.settings.watchTogetherRelay),
content: TextField(
controller: controller,
decoration: InputDecoration(
labelText: 'URL',
hintText: t.settings.watchTogetherRelayHint,
),
autofocus: true,
textInputAction: TextInputAction.done,
onEditingComplete: () => saveFocusNode.requestFocus(),
),
actions: [
TextButton(
onPressed: () async {
controller.clear();
await _settingsService.setCustomRelayUrl(null);
if (mounted) setState(() => _customRelayUrl = null);
if (dialogContext.mounted) Navigator.pop(dialogContext);
},
child: Text(t.settings.resetToDefault),
),
TextButton(onPressed: () => Navigator.pop(dialogContext), child: Text(t.common.cancel)),
TextButton(
focusNode: saveFocusNode,
onPressed: () async {
final url = controller.text.trim().isEmpty ? null : controller.text.trim();
await _settingsService.setCustomRelayUrl(url);
if (mounted) setState(() => _customRelayUrl = url);
if (dialogContext.mounted) Navigator.pop(dialogContext);
},
child: Text(t.common.save),
),
],
);
},
).then((_) => saveFocusNode.dispose());
}
void _showTextInputDialog({
required String title,
required String currentValue,
+15
View File
@@ -99,6 +99,7 @@ class SettingsService extends BaseSharedPreferencesService {
static const String _keyAudioNormalization = 'audio_normalization';
static const String _keyCustomShaderPresets = 'custom_shader_presets';
static const String _keyLiveTvDefaultFavorites = 'live_tv_default_favorites';
static const String _keyCustomRelayUrl = 'custom_relay_url';
SettingsService._();
@@ -870,6 +871,19 @@ class SettingsService extends BaseSharedPreferencesService {
return prefs.containsKey(_keyCustomDownloadPath);
}
// Custom Relay URL
Future<void> setCustomRelayUrl(String? url) async {
if (url == null || url.trim().isEmpty) {
await prefs.remove(_keyCustomRelayUrl);
} else {
await prefs.setString(_keyCustomRelayUrl, url.trim());
}
}
String? getCustomRelayUrl() {
return prefs.getString(_keyCustomRelayUrl);
}
// Download on WiFi Only
Future<void> setDownloadOnWifiOnly(bool value) async {
await prefs.setBool(_keyDownloadOnWifiOnly, value);
@@ -1309,6 +1323,7 @@ class SettingsService extends BaseSharedPreferencesService {
prefs.remove(_keyAudioPassthrough),
prefs.remove(_keyAudioNormalization),
prefs.remove(_keyBufferSizeMigratedToAuto),
prefs.remove(_keyCustomRelayUrl),
]);
}
@@ -4,6 +4,7 @@ import 'dart:math';
import 'package:flutter/foundation.dart';
import '../../mpv/mpv.dart';
import '../../services/settings_service.dart';
import '../../utils/app_logger.dart';
import '../models/sync_message.dart';
import '../models/watch_session.dart';
@@ -189,7 +190,8 @@ class WatchTogetherProvider with ChangeNotifier {
appLogger.d('WatchTogether: Creating session with control mode: $controlMode');
_peerService = WatchTogetherPeerService();
final customRelayUrl = SettingsService.instanceOrNull?.getCustomRelayUrl();
_peerService = WatchTogetherPeerService(customBaseUrl: customRelayUrl);
_setupPeerServiceListeners();
try {
@@ -236,7 +238,8 @@ class WatchTogetherProvider with ChangeNotifier {
appLogger.d('WatchTogether: Joining session: $sessionId');
_peerService = WatchTogetherPeerService();
final customRelayUrl = SettingsService.instanceOrNull?.getCustomRelayUrl();
_peerService = WatchTogetherPeerService(customBaseUrl: customRelayUrl);
_setupPeerServiceListeners();
_session = WatchSession.joinAsGuest(sessionId: sessionId);
@@ -9,6 +9,7 @@ import 'package:provider/provider.dart';
import '../../i18n/strings.g.dart';
import '../../focus/focusable_button.dart';
import '../../focus/focusable_wrapper.dart';
import '../../services/settings_service.dart';
import '../../utils/app_logger.dart';
import '../../utils/dialogs.dart';
import '../../utils/snackbar_helper.dart';
@@ -80,10 +81,12 @@ class _NotInSessionViewState extends State<_NotInSessionView> {
bool _isCreating = false;
bool _isJoining = false;
bool? _healthOk;
String? _customRelayUrl;
@override
void initState() {
super.initState();
_customRelayUrl = SettingsService.instanceOrNull?.getCustomRelayUrl();
_checkHealth();
}
@@ -91,7 +94,7 @@ class _NotInSessionViewState extends State<_NotInSessionView> {
try {
final client = HttpClient();
client.connectionTimeout = const Duration(seconds: 5);
final request = await client.getUrl(Uri.parse(WatchTogetherPeerService.healthUrl));
final request = await client.getUrl(Uri.parse(WatchTogetherPeerService.healthUrlFor(_customRelayUrl)));
final response = await request.close().namedTimeout(const Duration(seconds: 5), operation: 'WatchTogether health check');
final body = await response.transform(const SystemEncoding().decoder).join();
client.close();
@@ -20,9 +20,24 @@ export '../../services/base_peer_service.dart' show PeerError, PeerErrorType;
/// - Sending/receiving sync messages through the relay server
/// - Reconnection on WebSocket drops
class WatchTogetherPeerService with KeepaliveMixin {
static const String _baseUrl = 'https://ice.plezy.app';
static String get healthUrl => '$_baseUrl/health';
static const String _relayUrl = 'wss://ice.plezy.app/relay';
static const String defaultBaseUrl = 'https://ice.plezy.app';
final String _baseUrl;
static String get healthUrl => '$defaultBaseUrl/health';
static String healthUrlFor(String? customBaseUrl) {
final base = (customBaseUrl != null && customBaseUrl.trim().isNotEmpty) ? customBaseUrl.trim() : defaultBaseUrl;
return '$base/health';
}
String get _relayUrl {
final wsBase = _baseUrl.replaceFirst(RegExp(r'^https://'), 'wss://').replaceFirst(RegExp(r'^http://'), 'ws://');
return '$wsBase/relay';
}
WatchTogetherPeerService({String? customBaseUrl})
: _baseUrl = (customBaseUrl != null && customBaseUrl.trim().isNotEmpty) ? customBaseUrl.trim() : defaultBaseUrl;
WebSocketChannel? _channel;
StreamSubscription? _channelSubscription;