feat: match/unmatch metadata

This commit is contained in:
edde746
2026-04-23 19:02:14 +02:00
parent 4a5cb224b1
commit 431c20f817
37 changed files with 1238 additions and 2 deletions
+91
View File
@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dpad_navigator.dart';
/// A [TextField] wrapper that exposes D-pad navigation callbacks with
/// caret-aware edge escapes — so LEFT at the start of the field and RIGHT
/// at the end escape to neighbouring focus targets instead of bouncing
/// against the caret boundary, while UP/DOWN always escape.
///
/// Collapsed selection only: if text is selected, LEFT/RIGHT fall through
/// to the TextField's default caret movement.
class FocusableTextField extends StatelessWidget {
final TextEditingController controller;
final FocusNode? focusNode;
final InputDecoration? decoration;
final TextInputType? keyboardType;
final TextInputAction? textInputAction;
final List<TextInputFormatter>? inputFormatters;
final ValueChanged<String>? onChanged;
final ValueChanged<String>? onSubmitted;
final bool autofocus;
final VoidCallback? onNavigateLeft;
final VoidCallback? onNavigateRight;
final VoidCallback? onNavigateUp;
final VoidCallback? onNavigateDown;
const FocusableTextField({
super.key,
required this.controller,
this.focusNode,
this.decoration,
this.keyboardType,
this.textInputAction,
this.inputFormatters,
this.onChanged,
this.onSubmitted,
this.autofocus = false,
this.onNavigateLeft,
this.onNavigateRight,
this.onNavigateUp,
this.onNavigateDown,
});
KeyEventResult _handleKey(FocusNode _, KeyEvent event) {
if (!event.isActionable) return KeyEventResult.ignored;
final key = event.logicalKey;
if (key.isUpKey && onNavigateUp != null) {
onNavigateUp!();
return KeyEventResult.handled;
}
if (key.isDownKey && onNavigateDown != null) {
onNavigateDown!();
return KeyEventResult.handled;
}
final sel = controller.selection;
if (sel.isCollapsed) {
if (key.isLeftKey && sel.baseOffset == 0 && onNavigateLeft != null) {
onNavigateLeft!();
return KeyEventResult.handled;
}
if (key.isRightKey && sel.baseOffset == controller.text.length && onNavigateRight != null) {
onNavigateRight!();
return KeyEventResult.handled;
}
}
return KeyEventResult.ignored;
}
@override
Widget build(BuildContext context) {
return Focus(
onKeyEvent: _handleKey,
child: TextField(
controller: controller,
focusNode: focusNode,
decoration: decoration,
keyboardType: keyboardType,
textInputAction: textInputAction,
inputFormatters: inputFormatters,
onChanged: onChanged,
onSubmitted: onSubmitted,
autofocus: autofocus,
),
);
}
}
+14
View File
@@ -986,6 +986,20 @@
"style": "Stil", "style": "Stil",
"mood": "Stemning" "mood": "Stemning"
}, },
"matchScreen": {
"match": "Match...",
"fixMatch": "Ret match...",
"unmatch": "Fjern match",
"unmatchConfirm": "Ryd det aktuelle match for dette element? Plex behandler det som ikke matchet, indtil du matcher det igen.",
"unmatchSuccess": "Match fjernet",
"unmatchFailed": "Kunne ikke fjerne match",
"matchApplied": "Match anvendt",
"matchFailed": "Kunne ikke anvende match",
"titleHint": "Titel",
"yearHint": "År",
"search": "Søg",
"noMatchesFound": "Ingen match fundet"
},
"serverTasks": { "serverTasks": {
"title": "Serveropgaver", "title": "Serveropgaver",
"failedToLoad": "Kunne ikke indlæse opgaver", "failedToLoad": "Kunne ikke indlæse opgaver",
+14
View File
@@ -986,6 +986,20 @@
"style": "Stil", "style": "Stil",
"mood": "Stimmung" "mood": "Stimmung"
}, },
"matchScreen": {
"match": "Zuordnen...",
"fixMatch": "Zuordnung korrigieren...",
"unmatch": "Zuordnung aufheben",
"unmatchConfirm": "Die aktuelle Zuordnung dieses Eintrags entfernen? Plex behandelt ihn als nicht zugeordnet, bis du ihn erneut zuordnest.",
"unmatchSuccess": "Zuordnung aufgehoben",
"unmatchFailed": "Zuordnung konnte nicht aufgehoben werden",
"matchApplied": "Zuordnung angewendet",
"matchFailed": "Zuordnung konnte nicht angewendet werden",
"titleHint": "Titel",
"yearHint": "Jahr",
"search": "Suchen",
"noMatchesFound": "Keine Treffer gefunden"
},
"serverTasks": { "serverTasks": {
"title": "Serveraufgaben", "title": "Serveraufgaben",
"failedToLoad": "Aufgaben konnten nicht geladen werden", "failedToLoad": "Aufgaben konnten nicht geladen werden",
+14
View File
@@ -986,6 +986,20 @@
"style": "Style", "style": "Style",
"mood": "Mood" "mood": "Mood"
}, },
"matchScreen": {
"match": "Match...",
"fixMatch": "Fix Match...",
"unmatch": "Unmatch",
"unmatchConfirm": "Clear the current match for this item? Plex will treat it as unmatched until you match it again.",
"unmatchSuccess": "Item unmatched",
"unmatchFailed": "Failed to unmatch item",
"matchApplied": "Match applied",
"matchFailed": "Failed to apply match",
"titleHint": "Title",
"yearHint": "Year",
"search": "Search",
"noMatchesFound": "No matches found"
},
"serverTasks": { "serverTasks": {
"title": "Server Tasks", "title": "Server Tasks",
"failedToLoad": "Failed to load tasks", "failedToLoad": "Failed to load tasks",
+14
View File
@@ -986,6 +986,20 @@
"style": "Estilo", "style": "Estilo",
"mood": "Estado de ánimo" "mood": "Estado de ánimo"
}, },
"matchScreen": {
"match": "Emparejar...",
"fixMatch": "Corregir coincidencia...",
"unmatch": "Desvincular",
"unmatchConfirm": "¿Quitar la coincidencia actual de este elemento? Plex lo tratará como sin coincidencia hasta que vuelvas a emparejarlo.",
"unmatchSuccess": "Elemento desvinculado",
"unmatchFailed": "No se pudo desvincular el elemento",
"matchApplied": "Coincidencia aplicada",
"matchFailed": "No se pudo aplicar la coincidencia",
"titleHint": "Título",
"yearHint": "Año",
"search": "Buscar",
"noMatchesFound": "No se encontraron coincidencias"
},
"serverTasks": { "serverTasks": {
"title": "Tareas del servidor", "title": "Tareas del servidor",
"failedToLoad": "Error al cargar tareas", "failedToLoad": "Error al cargar tareas",
+14
View File
@@ -986,6 +986,20 @@
"style": "Style", "style": "Style",
"mood": "Ambiance" "mood": "Ambiance"
}, },
"matchScreen": {
"match": "Associer...",
"fixMatch": "Corriger l'association...",
"unmatch": "Dissocier",
"unmatchConfirm": "Effacer l'association actuelle de cet élément ? Plex le traitera comme non associé jusqu'à ce que vous l'associiez de nouveau.",
"unmatchSuccess": "Association supprimée",
"unmatchFailed": "Échec de la dissociation",
"matchApplied": "Association appliquée",
"matchFailed": "Échec de l'application",
"titleHint": "Titre",
"yearHint": "Année",
"search": "Rechercher",
"noMatchesFound": "Aucune correspondance"
},
"serverTasks": { "serverTasks": {
"title": "Tâches du serveur", "title": "Tâches du serveur",
"failedToLoad": "Échec du chargement des tâches", "failedToLoad": "Échec du chargement des tâches",
+14
View File
@@ -986,6 +986,20 @@
"style": "Stile", "style": "Stile",
"mood": "Atmosfera" "mood": "Atmosfera"
}, },
"matchScreen": {
"match": "Abbina...",
"fixMatch": "Correggi abbinamento...",
"unmatch": "Rimuovi abbinamento",
"unmatchConfirm": "Cancellare l'abbinamento corrente di questo elemento? Plex lo tratterà come non abbinato finché non lo abbinerai di nuovo.",
"unmatchSuccess": "Abbinamento rimosso",
"unmatchFailed": "Rimozione dell'abbinamento non riuscita",
"matchApplied": "Abbinamento applicato",
"matchFailed": "Applicazione dell'abbinamento non riuscita",
"titleHint": "Titolo",
"yearHint": "Anno",
"search": "Cerca",
"noMatchesFound": "Nessun risultato"
},
"serverTasks": { "serverTasks": {
"title": "Attività del server", "title": "Attività del server",
"failedToLoad": "Impossibile caricare le attività", "failedToLoad": "Impossibile caricare le attività",
+14
View File
@@ -986,6 +986,20 @@
"style": "スタイル", "style": "スタイル",
"mood": "ムード" "mood": "ムード"
}, },
"matchScreen": {
"match": "マッチ...",
"fixMatch": "マッチを修正...",
"unmatch": "マッチ解除",
"unmatchConfirm": "このアイテムの現在のマッチを解除しますか?再度マッチするまで、Plex は未マッチとして扱います。",
"unmatchSuccess": "マッチを解除しました",
"unmatchFailed": "マッチの解除に失敗しました",
"matchApplied": "マッチを適用しました",
"matchFailed": "マッチの適用に失敗しました",
"titleHint": "タイトル",
"yearHint": "年",
"search": "検索",
"noMatchesFound": "一致する項目がありません"
},
"serverTasks": { "serverTasks": {
"title": "サーバータスク", "title": "サーバータスク",
"failedToLoad": "タスクの読み込みに失敗しました", "failedToLoad": "タスクの読み込みに失敗しました",
+14
View File
@@ -986,6 +986,20 @@
"style": "스타일", "style": "스타일",
"mood": "분위기" "mood": "분위기"
}, },
"matchScreen": {
"match": "일치...",
"fixMatch": "일치 수정...",
"unmatch": "일치 해제",
"unmatchConfirm": "이 항목의 현재 일치를 해제하시겠습니까? 다시 일치시킬 때까지 Plex는 일치되지 않은 것으로 처리합니다.",
"unmatchSuccess": "일치 해제됨",
"unmatchFailed": "일치 해제에 실패했습니다",
"matchApplied": "일치 적용됨",
"matchFailed": "일치 적용에 실패했습니다",
"titleHint": "제목",
"yearHint": "연도",
"search": "검색",
"noMatchesFound": "일치하는 항목이 없습니다"
},
"serverTasks": { "serverTasks": {
"title": "서버 작업", "title": "서버 작업",
"failedToLoad": "작업을 불러올 수 없습니다", "failedToLoad": "작업을 불러올 수 없습니다",
+14
View File
@@ -986,6 +986,20 @@
"style": "Stil", "style": "Stil",
"mood": "Stemning" "mood": "Stemning"
}, },
"matchScreen": {
"match": "Match...",
"fixMatch": "Rett match...",
"unmatch": "Fjern match",
"unmatchConfirm": "Fjerne gjeldende match for dette elementet? Plex behandler det som umatchet til du matcher det igjen.",
"unmatchSuccess": "Match fjernet",
"unmatchFailed": "Kunne ikke fjerne match",
"matchApplied": "Match anvendt",
"matchFailed": "Kunne ikke anvende match",
"titleHint": "Tittel",
"yearHint": "År",
"search": "Søk",
"noMatchesFound": "Ingen treff funnet"
},
"serverTasks": { "serverTasks": {
"title": "Serveroppgaver", "title": "Serveroppgaver",
"failedToLoad": "Kunne ikke laste oppgaver", "failedToLoad": "Kunne ikke laste oppgaver",
+14
View File
@@ -986,6 +986,20 @@
"style": "Stijl", "style": "Stijl",
"mood": "Stemming" "mood": "Stemming"
}, },
"matchScreen": {
"match": "Koppelen...",
"fixMatch": "Koppeling herstellen...",
"unmatch": "Ontkoppelen",
"unmatchConfirm": "De huidige koppeling voor dit item wissen? Plex behandelt het als ongekoppeld totdat je het opnieuw koppelt.",
"unmatchSuccess": "Item ontkoppeld",
"unmatchFailed": "Kon item niet ontkoppelen",
"matchApplied": "Koppeling toegepast",
"matchFailed": "Koppeling kon niet worden toegepast",
"titleHint": "Titel",
"yearHint": "Jaar",
"search": "Zoeken",
"noMatchesFound": "Geen overeenkomsten gevonden"
},
"serverTasks": { "serverTasks": {
"title": "Servertaken", "title": "Servertaken",
"failedToLoad": "Taken konden niet worden geladen", "failedToLoad": "Taken konden niet worden geladen",
+14
View File
@@ -986,6 +986,20 @@
"style": "Styl", "style": "Styl",
"mood": "Nastrój" "mood": "Nastrój"
}, },
"matchScreen": {
"match": "Dopasuj...",
"fixMatch": "Popraw dopasowanie...",
"unmatch": "Usuń dopasowanie",
"unmatchConfirm": "Usunąć obecne dopasowanie tego elementu? Plex będzie traktował go jako niedopasowany, dopóki nie dopasujesz go ponownie.",
"unmatchSuccess": "Dopasowanie usunięte",
"unmatchFailed": "Nie udało się usunąć dopasowania",
"matchApplied": "Dopasowanie zastosowane",
"matchFailed": "Nie udało się zastosować dopasowania",
"titleHint": "Tytuł",
"yearHint": "Rok",
"search": "Szukaj",
"noMatchesFound": "Nie znaleziono dopasowań"
},
"serverTasks": { "serverTasks": {
"title": "Zadania serwera", "title": "Zadania serwera",
"failedToLoad": "Nie udało się załadować zadań", "failedToLoad": "Nie udało się załadować zadań",
+14
View File
@@ -986,6 +986,20 @@
"style": "Estilo", "style": "Estilo",
"mood": "Humor" "mood": "Humor"
}, },
"matchScreen": {
"match": "Associar...",
"fixMatch": "Corrigir correspondência...",
"unmatch": "Desassociar",
"unmatchConfirm": "Limpar a correspondência atual deste item? O Plex vai tratá-lo como não correspondido até que o associe novamente.",
"unmatchSuccess": "Item desassociado",
"unmatchFailed": "Falha ao desassociar item",
"matchApplied": "Correspondência aplicada",
"matchFailed": "Falha ao aplicar correspondência",
"titleHint": "Título",
"yearHint": "Ano",
"search": "Pesquisar",
"noMatchesFound": "Nenhuma correspondência encontrada"
},
"serverTasks": { "serverTasks": {
"title": "Tarefas do servidor", "title": "Tarefas do servidor",
"failedToLoad": "Falha ao carregar tarefas", "failedToLoad": "Falha ao carregar tarefas",
+14
View File
@@ -986,6 +986,20 @@
"style": "Стиль", "style": "Стиль",
"mood": "Настроение" "mood": "Настроение"
}, },
"matchScreen": {
"match": "Сопоставить...",
"fixMatch": "Исправить сопоставление...",
"unmatch": "Сбросить сопоставление",
"unmatchConfirm": "Сбросить текущее сопоставление этого элемента? Plex будет считать его несопоставленным, пока вы не сопоставите его снова.",
"unmatchSuccess": "Сопоставление сброшено",
"unmatchFailed": "Не удалось сбросить сопоставление",
"matchApplied": "Сопоставление применено",
"matchFailed": "Не удалось применить сопоставление",
"titleHint": "Название",
"yearHint": "Год",
"search": "Поиск",
"noMatchesFound": "Совпадений не найдено"
},
"serverTasks": { "serverTasks": {
"title": "Задачи сервера", "title": "Задачи сервера",
"failedToLoad": "Не удалось загрузить задачи", "failedToLoad": "Не удалось загрузить задачи",
+2 -2
View File
@@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang` /// To regenerate, run: `dart run slang`
/// ///
/// Locales: 15 /// Locales: 15
/// Strings: 13755 (917 per locale) /// Strings: 13935 (929 per locale)
/// ///
/// Built on 2026-04-23 at 15:55 UTC /// Built on 2026-04-23 at 16:38 UTC
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: type=lint, unused_import // ignore_for_file: type=lint, unused_import
+34
View File
@@ -74,6 +74,7 @@ class TranslationsDa with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsDa videoSettings = _TranslationsVideoSettingsDa._(_root); @override late final _TranslationsVideoSettingsDa videoSettings = _TranslationsVideoSettingsDa._(_root);
@override late final _TranslationsExternalPlayerDa externalPlayer = _TranslationsExternalPlayerDa._(_root); @override late final _TranslationsExternalPlayerDa externalPlayer = _TranslationsExternalPlayerDa._(_root);
@override late final _TranslationsMetadataEditDa metadataEdit = _TranslationsMetadataEditDa._(_root); @override late final _TranslationsMetadataEditDa metadataEdit = _TranslationsMetadataEditDa._(_root);
@override late final _TranslationsMatchScreenDa matchScreen = _TranslationsMatchScreenDa._(_root);
@override late final _TranslationsServerTasksDa serverTasks = _TranslationsServerTasksDa._(_root); @override late final _TranslationsServerTasksDa serverTasks = _TranslationsServerTasksDa._(_root);
@override late final _TranslationsTraktDa trakt = _TranslationsTraktDa._(_root); @override late final _TranslationsTraktDa trakt = _TranslationsTraktDa._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditDa implements TranslationsMetadataEditEn {
@override String get mood => 'Stemning'; @override String get mood => 'Stemning';
} }
// Path: matchScreen
class _TranslationsMatchScreenDa implements TranslationsMatchScreenEn {
_TranslationsMatchScreenDa._(this._root);
final TranslationsDa _root; // ignore: unused_field
// Translations
@override String get match => 'Match...';
@override String get fixMatch => 'Ret match...';
@override String get unmatch => 'Fjern match';
@override String get unmatchConfirm => 'Ryd det aktuelle match for dette element? Plex behandler det som ikke matchet, indtil du matcher det igen.';
@override String get unmatchSuccess => 'Match fjernet';
@override String get unmatchFailed => 'Kunne ikke fjerne match';
@override String get matchApplied => 'Match anvendt';
@override String get matchFailed => 'Kunne ikke anvende match';
@override String get titleHint => 'Titel';
@override String get yearHint => 'År';
@override String get search => 'Søg';
@override String get noMatchesFound => 'Ingen match fundet';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksDa implements TranslationsServerTasksEn { class _TranslationsServerTasksDa implements TranslationsServerTasksEn {
_TranslationsServerTasksDa._(this._root); _TranslationsServerTasksDa._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsDa {
'metadataEdit.label' => 'Etiket', 'metadataEdit.label' => 'Etiket',
'metadataEdit.style' => 'Stil', 'metadataEdit.style' => 'Stil',
'metadataEdit.mood' => 'Stemning', 'metadataEdit.mood' => 'Stemning',
'matchScreen.match' => 'Match...',
'matchScreen.fixMatch' => 'Ret match...',
'matchScreen.unmatch' => 'Fjern match',
'matchScreen.unmatchConfirm' => 'Ryd det aktuelle match for dette element? Plex behandler det som ikke matchet, indtil du matcher det igen.',
'matchScreen.unmatchSuccess' => 'Match fjernet',
'matchScreen.unmatchFailed' => 'Kunne ikke fjerne match',
'matchScreen.matchApplied' => 'Match anvendt',
'matchScreen.matchFailed' => 'Kunne ikke anvende match',
'matchScreen.titleHint' => 'Titel',
'matchScreen.yearHint' => 'År',
'matchScreen.search' => 'Søg',
'matchScreen.noMatchesFound' => 'Ingen match fundet',
'serverTasks.title' => 'Serveropgaver', 'serverTasks.title' => 'Serveropgaver',
'serverTasks.failedToLoad' => 'Kunne ikke indlæse opgaver', 'serverTasks.failedToLoad' => 'Kunne ikke indlæse opgaver',
'serverTasks.noTasks' => 'Ingen opgaver kører', 'serverTasks.noTasks' => 'Ingen opgaver kører',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsDe with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsDe videoSettings = _TranslationsVideoSettingsDe._(_root); @override late final _TranslationsVideoSettingsDe videoSettings = _TranslationsVideoSettingsDe._(_root);
@override late final _TranslationsExternalPlayerDe externalPlayer = _TranslationsExternalPlayerDe._(_root); @override late final _TranslationsExternalPlayerDe externalPlayer = _TranslationsExternalPlayerDe._(_root);
@override late final _TranslationsMetadataEditDe metadataEdit = _TranslationsMetadataEditDe._(_root); @override late final _TranslationsMetadataEditDe metadataEdit = _TranslationsMetadataEditDe._(_root);
@override late final _TranslationsMatchScreenDe matchScreen = _TranslationsMatchScreenDe._(_root);
@override late final _TranslationsServerTasksDe serverTasks = _TranslationsServerTasksDe._(_root); @override late final _TranslationsServerTasksDe serverTasks = _TranslationsServerTasksDe._(_root);
@override late final _TranslationsTraktDe trakt = _TranslationsTraktDe._(_root); @override late final _TranslationsTraktDe trakt = _TranslationsTraktDe._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditDe implements TranslationsMetadataEditEn {
@override String get mood => 'Stimmung'; @override String get mood => 'Stimmung';
} }
// Path: matchScreen
class _TranslationsMatchScreenDe implements TranslationsMatchScreenEn {
_TranslationsMatchScreenDe._(this._root);
final TranslationsDe _root; // ignore: unused_field
// Translations
@override String get match => 'Zuordnen...';
@override String get fixMatch => 'Zuordnung korrigieren...';
@override String get unmatch => 'Zuordnung aufheben';
@override String get unmatchConfirm => 'Die aktuelle Zuordnung dieses Eintrags entfernen? Plex behandelt ihn als nicht zugeordnet, bis du ihn erneut zuordnest.';
@override String get unmatchSuccess => 'Zuordnung aufgehoben';
@override String get unmatchFailed => 'Zuordnung konnte nicht aufgehoben werden';
@override String get matchApplied => 'Zuordnung angewendet';
@override String get matchFailed => 'Zuordnung konnte nicht angewendet werden';
@override String get titleHint => 'Titel';
@override String get yearHint => 'Jahr';
@override String get search => 'Suchen';
@override String get noMatchesFound => 'Keine Treffer gefunden';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksDe implements TranslationsServerTasksEn { class _TranslationsServerTasksDe implements TranslationsServerTasksEn {
_TranslationsServerTasksDe._(this._root); _TranslationsServerTasksDe._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsDe {
'metadataEdit.label' => 'Label', 'metadataEdit.label' => 'Label',
'metadataEdit.style' => 'Stil', 'metadataEdit.style' => 'Stil',
'metadataEdit.mood' => 'Stimmung', 'metadataEdit.mood' => 'Stimmung',
'matchScreen.match' => 'Zuordnen...',
'matchScreen.fixMatch' => 'Zuordnung korrigieren...',
'matchScreen.unmatch' => 'Zuordnung aufheben',
'matchScreen.unmatchConfirm' => 'Die aktuelle Zuordnung dieses Eintrags entfernen? Plex behandelt ihn als nicht zugeordnet, bis du ihn erneut zuordnest.',
'matchScreen.unmatchSuccess' => 'Zuordnung aufgehoben',
'matchScreen.unmatchFailed' => 'Zuordnung konnte nicht aufgehoben werden',
'matchScreen.matchApplied' => 'Zuordnung angewendet',
'matchScreen.matchFailed' => 'Zuordnung konnte nicht angewendet werden',
'matchScreen.titleHint' => 'Titel',
'matchScreen.yearHint' => 'Jahr',
'matchScreen.search' => 'Suchen',
'matchScreen.noMatchesFound' => 'Keine Treffer gefunden',
'serverTasks.title' => 'Serveraufgaben', 'serverTasks.title' => 'Serveraufgaben',
'serverTasks.failedToLoad' => 'Aufgaben konnten nicht geladen werden', 'serverTasks.failedToLoad' => 'Aufgaben konnten nicht geladen werden',
'serverTasks.noTasks' => 'Keine laufenden Aufgaben', 'serverTasks.noTasks' => 'Keine laufenden Aufgaben',
+58
View File
@@ -77,6 +77,7 @@ class Translations with BaseTranslations<AppLocale, Translations> {
late final TranslationsVideoSettingsEn videoSettings = TranslationsVideoSettingsEn._(_root); late final TranslationsVideoSettingsEn videoSettings = TranslationsVideoSettingsEn._(_root);
late final TranslationsExternalPlayerEn externalPlayer = TranslationsExternalPlayerEn._(_root); late final TranslationsExternalPlayerEn externalPlayer = TranslationsExternalPlayerEn._(_root);
late final TranslationsMetadataEditEn metadataEdit = TranslationsMetadataEditEn._(_root); late final TranslationsMetadataEditEn metadataEdit = TranslationsMetadataEditEn._(_root);
late final TranslationsMatchScreenEn matchScreen = TranslationsMatchScreenEn._(_root);
late final TranslationsServerTasksEn serverTasks = TranslationsServerTasksEn._(_root); late final TranslationsServerTasksEn serverTasks = TranslationsServerTasksEn._(_root);
late final TranslationsTraktEn trakt = TranslationsTraktEn._(_root); late final TranslationsTraktEn trakt = TranslationsTraktEn._(_root);
} }
@@ -2843,6 +2844,51 @@ class TranslationsMetadataEditEn {
String get mood => 'Mood'; String get mood => 'Mood';
} }
// Path: matchScreen
class TranslationsMatchScreenEn {
TranslationsMatchScreenEn._(this._root);
final Translations _root; // ignore: unused_field
// Translations
/// en: 'Match...'
String get match => 'Match...';
/// en: 'Fix Match...'
String get fixMatch => 'Fix Match...';
/// en: 'Unmatch'
String get unmatch => 'Unmatch';
/// en: 'Clear the current match for this item? Plex will treat it as unmatched until you match it again.'
String get unmatchConfirm => 'Clear the current match for this item? Plex will treat it as unmatched until you match it again.';
/// en: 'Item unmatched'
String get unmatchSuccess => 'Item unmatched';
/// en: 'Failed to unmatch item'
String get unmatchFailed => 'Failed to unmatch item';
/// en: 'Match applied'
String get matchApplied => 'Match applied';
/// en: 'Failed to apply match'
String get matchFailed => 'Failed to apply match';
/// en: 'Title'
String get titleHint => 'Title';
/// en: 'Year'
String get yearHint => 'Year';
/// en: 'Search'
String get search => 'Search';
/// en: 'No matches found'
String get noMatchesFound => 'No matches found';
}
// Path: serverTasks // Path: serverTasks
class TranslationsServerTasksEn { class TranslationsServerTasksEn {
TranslationsServerTasksEn._(this._root); TranslationsServerTasksEn._(this._root);
@@ -4166,6 +4212,18 @@ extension on Translations {
'metadataEdit.label' => 'Label', 'metadataEdit.label' => 'Label',
'metadataEdit.style' => 'Style', 'metadataEdit.style' => 'Style',
'metadataEdit.mood' => 'Mood', 'metadataEdit.mood' => 'Mood',
'matchScreen.match' => 'Match...',
'matchScreen.fixMatch' => 'Fix Match...',
'matchScreen.unmatch' => 'Unmatch',
'matchScreen.unmatchConfirm' => 'Clear the current match for this item? Plex will treat it as unmatched until you match it again.',
'matchScreen.unmatchSuccess' => 'Item unmatched',
'matchScreen.unmatchFailed' => 'Failed to unmatch item',
'matchScreen.matchApplied' => 'Match applied',
'matchScreen.matchFailed' => 'Failed to apply match',
'matchScreen.titleHint' => 'Title',
'matchScreen.yearHint' => 'Year',
'matchScreen.search' => 'Search',
'matchScreen.noMatchesFound' => 'No matches found',
'serverTasks.title' => 'Server Tasks', 'serverTasks.title' => 'Server Tasks',
'serverTasks.failedToLoad' => 'Failed to load tasks', 'serverTasks.failedToLoad' => 'Failed to load tasks',
'serverTasks.noTasks' => 'No tasks running', 'serverTasks.noTasks' => 'No tasks running',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsEs with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsEs videoSettings = _TranslationsVideoSettingsEs._(_root); @override late final _TranslationsVideoSettingsEs videoSettings = _TranslationsVideoSettingsEs._(_root);
@override late final _TranslationsExternalPlayerEs externalPlayer = _TranslationsExternalPlayerEs._(_root); @override late final _TranslationsExternalPlayerEs externalPlayer = _TranslationsExternalPlayerEs._(_root);
@override late final _TranslationsMetadataEditEs metadataEdit = _TranslationsMetadataEditEs._(_root); @override late final _TranslationsMetadataEditEs metadataEdit = _TranslationsMetadataEditEs._(_root);
@override late final _TranslationsMatchScreenEs matchScreen = _TranslationsMatchScreenEs._(_root);
@override late final _TranslationsServerTasksEs serverTasks = _TranslationsServerTasksEs._(_root); @override late final _TranslationsServerTasksEs serverTasks = _TranslationsServerTasksEs._(_root);
@override late final _TranslationsTraktEs trakt = _TranslationsTraktEs._(_root); @override late final _TranslationsTraktEs trakt = _TranslationsTraktEs._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditEs implements TranslationsMetadataEditEn {
@override String get mood => 'Estado de ánimo'; @override String get mood => 'Estado de ánimo';
} }
// Path: matchScreen
class _TranslationsMatchScreenEs implements TranslationsMatchScreenEn {
_TranslationsMatchScreenEs._(this._root);
final TranslationsEs _root; // ignore: unused_field
// Translations
@override String get match => 'Emparejar...';
@override String get fixMatch => 'Corregir coincidencia...';
@override String get unmatch => 'Desvincular';
@override String get unmatchConfirm => '¿Quitar la coincidencia actual de este elemento? Plex lo tratará como sin coincidencia hasta que vuelvas a emparejarlo.';
@override String get unmatchSuccess => 'Elemento desvinculado';
@override String get unmatchFailed => 'No se pudo desvincular el elemento';
@override String get matchApplied => 'Coincidencia aplicada';
@override String get matchFailed => 'No se pudo aplicar la coincidencia';
@override String get titleHint => 'Título';
@override String get yearHint => 'Año';
@override String get search => 'Buscar';
@override String get noMatchesFound => 'No se encontraron coincidencias';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksEs implements TranslationsServerTasksEn { class _TranslationsServerTasksEs implements TranslationsServerTasksEn {
_TranslationsServerTasksEs._(this._root); _TranslationsServerTasksEs._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsEs {
'metadataEdit.label' => 'Etiqueta', 'metadataEdit.label' => 'Etiqueta',
'metadataEdit.style' => 'Estilo', 'metadataEdit.style' => 'Estilo',
'metadataEdit.mood' => 'Estado de ánimo', 'metadataEdit.mood' => 'Estado de ánimo',
'matchScreen.match' => 'Emparejar...',
'matchScreen.fixMatch' => 'Corregir coincidencia...',
'matchScreen.unmatch' => 'Desvincular',
'matchScreen.unmatchConfirm' => '¿Quitar la coincidencia actual de este elemento? Plex lo tratará como sin coincidencia hasta que vuelvas a emparejarlo.',
'matchScreen.unmatchSuccess' => 'Elemento desvinculado',
'matchScreen.unmatchFailed' => 'No se pudo desvincular el elemento',
'matchScreen.matchApplied' => 'Coincidencia aplicada',
'matchScreen.matchFailed' => 'No se pudo aplicar la coincidencia',
'matchScreen.titleHint' => 'Título',
'matchScreen.yearHint' => 'Año',
'matchScreen.search' => 'Buscar',
'matchScreen.noMatchesFound' => 'No se encontraron coincidencias',
'serverTasks.title' => 'Tareas del servidor', 'serverTasks.title' => 'Tareas del servidor',
'serverTasks.failedToLoad' => 'Error al cargar tareas', 'serverTasks.failedToLoad' => 'Error al cargar tareas',
'serverTasks.noTasks' => 'No hay tareas en ejecución', 'serverTasks.noTasks' => 'No hay tareas en ejecución',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsFr with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsFr videoSettings = _TranslationsVideoSettingsFr._(_root); @override late final _TranslationsVideoSettingsFr videoSettings = _TranslationsVideoSettingsFr._(_root);
@override late final _TranslationsExternalPlayerFr externalPlayer = _TranslationsExternalPlayerFr._(_root); @override late final _TranslationsExternalPlayerFr externalPlayer = _TranslationsExternalPlayerFr._(_root);
@override late final _TranslationsMetadataEditFr metadataEdit = _TranslationsMetadataEditFr._(_root); @override late final _TranslationsMetadataEditFr metadataEdit = _TranslationsMetadataEditFr._(_root);
@override late final _TranslationsMatchScreenFr matchScreen = _TranslationsMatchScreenFr._(_root);
@override late final _TranslationsServerTasksFr serverTasks = _TranslationsServerTasksFr._(_root); @override late final _TranslationsServerTasksFr serverTasks = _TranslationsServerTasksFr._(_root);
@override late final _TranslationsTraktFr trakt = _TranslationsTraktFr._(_root); @override late final _TranslationsTraktFr trakt = _TranslationsTraktFr._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditFr implements TranslationsMetadataEditEn {
@override String get mood => 'Ambiance'; @override String get mood => 'Ambiance';
} }
// Path: matchScreen
class _TranslationsMatchScreenFr implements TranslationsMatchScreenEn {
_TranslationsMatchScreenFr._(this._root);
final TranslationsFr _root; // ignore: unused_field
// Translations
@override String get match => 'Associer...';
@override String get fixMatch => 'Corriger l\'association...';
@override String get unmatch => 'Dissocier';
@override String get unmatchConfirm => 'Effacer l\'association actuelle de cet élément ? Plex le traitera comme non associé jusqu\'à ce que vous l\'associiez de nouveau.';
@override String get unmatchSuccess => 'Association supprimée';
@override String get unmatchFailed => 'Échec de la dissociation';
@override String get matchApplied => 'Association appliquée';
@override String get matchFailed => 'Échec de l\'application';
@override String get titleHint => 'Titre';
@override String get yearHint => 'Année';
@override String get search => 'Rechercher';
@override String get noMatchesFound => 'Aucune correspondance';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksFr implements TranslationsServerTasksEn { class _TranslationsServerTasksFr implements TranslationsServerTasksEn {
_TranslationsServerTasksFr._(this._root); _TranslationsServerTasksFr._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsFr {
'metadataEdit.label' => 'Label', 'metadataEdit.label' => 'Label',
'metadataEdit.style' => 'Style', 'metadataEdit.style' => 'Style',
'metadataEdit.mood' => 'Ambiance', 'metadataEdit.mood' => 'Ambiance',
'matchScreen.match' => 'Associer...',
'matchScreen.fixMatch' => 'Corriger l\'association...',
'matchScreen.unmatch' => 'Dissocier',
'matchScreen.unmatchConfirm' => 'Effacer l\'association actuelle de cet élément ? Plex le traitera comme non associé jusqu\'à ce que vous l\'associiez de nouveau.',
'matchScreen.unmatchSuccess' => 'Association supprimée',
'matchScreen.unmatchFailed' => 'Échec de la dissociation',
'matchScreen.matchApplied' => 'Association appliquée',
'matchScreen.matchFailed' => 'Échec de l\'application',
'matchScreen.titleHint' => 'Titre',
'matchScreen.yearHint' => 'Année',
'matchScreen.search' => 'Rechercher',
'matchScreen.noMatchesFound' => 'Aucune correspondance',
'serverTasks.title' => 'Tâches du serveur', 'serverTasks.title' => 'Tâches du serveur',
'serverTasks.failedToLoad' => 'Échec du chargement des tâches', 'serverTasks.failedToLoad' => 'Échec du chargement des tâches',
'serverTasks.noTasks' => 'Aucune tâche en cours', 'serverTasks.noTasks' => 'Aucune tâche en cours',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsIt with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsIt videoSettings = _TranslationsVideoSettingsIt._(_root); @override late final _TranslationsVideoSettingsIt videoSettings = _TranslationsVideoSettingsIt._(_root);
@override late final _TranslationsExternalPlayerIt externalPlayer = _TranslationsExternalPlayerIt._(_root); @override late final _TranslationsExternalPlayerIt externalPlayer = _TranslationsExternalPlayerIt._(_root);
@override late final _TranslationsMetadataEditIt metadataEdit = _TranslationsMetadataEditIt._(_root); @override late final _TranslationsMetadataEditIt metadataEdit = _TranslationsMetadataEditIt._(_root);
@override late final _TranslationsMatchScreenIt matchScreen = _TranslationsMatchScreenIt._(_root);
@override late final _TranslationsServerTasksIt serverTasks = _TranslationsServerTasksIt._(_root); @override late final _TranslationsServerTasksIt serverTasks = _TranslationsServerTasksIt._(_root);
@override late final _TranslationsTraktIt trakt = _TranslationsTraktIt._(_root); @override late final _TranslationsTraktIt trakt = _TranslationsTraktIt._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditIt implements TranslationsMetadataEditEn {
@override String get mood => 'Atmosfera'; @override String get mood => 'Atmosfera';
} }
// Path: matchScreen
class _TranslationsMatchScreenIt implements TranslationsMatchScreenEn {
_TranslationsMatchScreenIt._(this._root);
final TranslationsIt _root; // ignore: unused_field
// Translations
@override String get match => 'Abbina...';
@override String get fixMatch => 'Correggi abbinamento...';
@override String get unmatch => 'Rimuovi abbinamento';
@override String get unmatchConfirm => 'Cancellare l\'abbinamento corrente di questo elemento? Plex lo tratterà come non abbinato finché non lo abbinerai di nuovo.';
@override String get unmatchSuccess => 'Abbinamento rimosso';
@override String get unmatchFailed => 'Rimozione dell\'abbinamento non riuscita';
@override String get matchApplied => 'Abbinamento applicato';
@override String get matchFailed => 'Applicazione dell\'abbinamento non riuscita';
@override String get titleHint => 'Titolo';
@override String get yearHint => 'Anno';
@override String get search => 'Cerca';
@override String get noMatchesFound => 'Nessun risultato';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksIt implements TranslationsServerTasksEn { class _TranslationsServerTasksIt implements TranslationsServerTasksEn {
_TranslationsServerTasksIt._(this._root); _TranslationsServerTasksIt._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsIt {
'metadataEdit.label' => 'Etichetta', 'metadataEdit.label' => 'Etichetta',
'metadataEdit.style' => 'Stile', 'metadataEdit.style' => 'Stile',
'metadataEdit.mood' => 'Atmosfera', 'metadataEdit.mood' => 'Atmosfera',
'matchScreen.match' => 'Abbina...',
'matchScreen.fixMatch' => 'Correggi abbinamento...',
'matchScreen.unmatch' => 'Rimuovi abbinamento',
'matchScreen.unmatchConfirm' => 'Cancellare l\'abbinamento corrente di questo elemento? Plex lo tratterà come non abbinato finché non lo abbinerai di nuovo.',
'matchScreen.unmatchSuccess' => 'Abbinamento rimosso',
'matchScreen.unmatchFailed' => 'Rimozione dell\'abbinamento non riuscita',
'matchScreen.matchApplied' => 'Abbinamento applicato',
'matchScreen.matchFailed' => 'Applicazione dell\'abbinamento non riuscita',
'matchScreen.titleHint' => 'Titolo',
'matchScreen.yearHint' => 'Anno',
'matchScreen.search' => 'Cerca',
'matchScreen.noMatchesFound' => 'Nessun risultato',
'serverTasks.title' => 'Attività del server', 'serverTasks.title' => 'Attività del server',
'serverTasks.failedToLoad' => 'Impossibile caricare le attività', 'serverTasks.failedToLoad' => 'Impossibile caricare le attività',
'serverTasks.noTasks' => 'Nessuna attività in corso', 'serverTasks.noTasks' => 'Nessuna attività in corso',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsJa with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsJa videoSettings = _TranslationsVideoSettingsJa._(_root); @override late final _TranslationsVideoSettingsJa videoSettings = _TranslationsVideoSettingsJa._(_root);
@override late final _TranslationsExternalPlayerJa externalPlayer = _TranslationsExternalPlayerJa._(_root); @override late final _TranslationsExternalPlayerJa externalPlayer = _TranslationsExternalPlayerJa._(_root);
@override late final _TranslationsMetadataEditJa metadataEdit = _TranslationsMetadataEditJa._(_root); @override late final _TranslationsMetadataEditJa metadataEdit = _TranslationsMetadataEditJa._(_root);
@override late final _TranslationsMatchScreenJa matchScreen = _TranslationsMatchScreenJa._(_root);
@override late final _TranslationsServerTasksJa serverTasks = _TranslationsServerTasksJa._(_root); @override late final _TranslationsServerTasksJa serverTasks = _TranslationsServerTasksJa._(_root);
@override late final _TranslationsTraktJa trakt = _TranslationsTraktJa._(_root); @override late final _TranslationsTraktJa trakt = _TranslationsTraktJa._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditJa implements TranslationsMetadataEditEn {
@override String get mood => 'ムード'; @override String get mood => 'ムード';
} }
// Path: matchScreen
class _TranslationsMatchScreenJa implements TranslationsMatchScreenEn {
_TranslationsMatchScreenJa._(this._root);
final TranslationsJa _root; // ignore: unused_field
// Translations
@override String get match => 'マッチ...';
@override String get fixMatch => 'マッチを修正...';
@override String get unmatch => 'マッチ解除';
@override String get unmatchConfirm => 'このアイテムの現在のマッチを解除しますか?再度マッチするまで、Plex は未マッチとして扱います。';
@override String get unmatchSuccess => 'マッチを解除しました';
@override String get unmatchFailed => 'マッチの解除に失敗しました';
@override String get matchApplied => 'マッチを適用しました';
@override String get matchFailed => 'マッチの適用に失敗しました';
@override String get titleHint => 'タイトル';
@override String get yearHint => '';
@override String get search => '検索';
@override String get noMatchesFound => '一致する項目がありません';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksJa implements TranslationsServerTasksEn { class _TranslationsServerTasksJa implements TranslationsServerTasksEn {
_TranslationsServerTasksJa._(this._root); _TranslationsServerTasksJa._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsJa {
'metadataEdit.label' => 'ラベル', 'metadataEdit.label' => 'ラベル',
'metadataEdit.style' => 'スタイル', 'metadataEdit.style' => 'スタイル',
'metadataEdit.mood' => 'ムード', 'metadataEdit.mood' => 'ムード',
'matchScreen.match' => 'マッチ...',
'matchScreen.fixMatch' => 'マッチを修正...',
'matchScreen.unmatch' => 'マッチ解除',
'matchScreen.unmatchConfirm' => 'このアイテムの現在のマッチを解除しますか?再度マッチするまで、Plex は未マッチとして扱います。',
'matchScreen.unmatchSuccess' => 'マッチを解除しました',
'matchScreen.unmatchFailed' => 'マッチの解除に失敗しました',
'matchScreen.matchApplied' => 'マッチを適用しました',
'matchScreen.matchFailed' => 'マッチの適用に失敗しました',
'matchScreen.titleHint' => 'タイトル',
'matchScreen.yearHint' => '',
'matchScreen.search' => '検索',
'matchScreen.noMatchesFound' => '一致する項目がありません',
'serverTasks.title' => 'サーバータスク', 'serverTasks.title' => 'サーバータスク',
'serverTasks.failedToLoad' => 'タスクの読み込みに失敗しました', 'serverTasks.failedToLoad' => 'タスクの読み込みに失敗しました',
'serverTasks.noTasks' => '実行中のタスクはありません', 'serverTasks.noTasks' => '実行中のタスクはありません',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsKo with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsKo videoSettings = _TranslationsVideoSettingsKo._(_root); @override late final _TranslationsVideoSettingsKo videoSettings = _TranslationsVideoSettingsKo._(_root);
@override late final _TranslationsExternalPlayerKo externalPlayer = _TranslationsExternalPlayerKo._(_root); @override late final _TranslationsExternalPlayerKo externalPlayer = _TranslationsExternalPlayerKo._(_root);
@override late final _TranslationsMetadataEditKo metadataEdit = _TranslationsMetadataEditKo._(_root); @override late final _TranslationsMetadataEditKo metadataEdit = _TranslationsMetadataEditKo._(_root);
@override late final _TranslationsMatchScreenKo matchScreen = _TranslationsMatchScreenKo._(_root);
@override late final _TranslationsServerTasksKo serverTasks = _TranslationsServerTasksKo._(_root); @override late final _TranslationsServerTasksKo serverTasks = _TranslationsServerTasksKo._(_root);
@override late final _TranslationsTraktKo trakt = _TranslationsTraktKo._(_root); @override late final _TranslationsTraktKo trakt = _TranslationsTraktKo._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditKo implements TranslationsMetadataEditEn {
@override String get mood => '분위기'; @override String get mood => '분위기';
} }
// Path: matchScreen
class _TranslationsMatchScreenKo implements TranslationsMatchScreenEn {
_TranslationsMatchScreenKo._(this._root);
final TranslationsKo _root; // ignore: unused_field
// Translations
@override String get match => '일치...';
@override String get fixMatch => '일치 수정...';
@override String get unmatch => '일치 해제';
@override String get unmatchConfirm => '이 항목의 현재 일치를 해제하시겠습니까? 다시 일치시킬 때까지 Plex는 일치되지 않은 것으로 처리합니다.';
@override String get unmatchSuccess => '일치 해제됨';
@override String get unmatchFailed => '일치 해제에 실패했습니다';
@override String get matchApplied => '일치 적용됨';
@override String get matchFailed => '일치 적용에 실패했습니다';
@override String get titleHint => '제목';
@override String get yearHint => '연도';
@override String get search => '검색';
@override String get noMatchesFound => '일치하는 항목이 없습니다';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksKo implements TranslationsServerTasksEn { class _TranslationsServerTasksKo implements TranslationsServerTasksEn {
_TranslationsServerTasksKo._(this._root); _TranslationsServerTasksKo._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsKo {
'metadataEdit.label' => '라벨', 'metadataEdit.label' => '라벨',
'metadataEdit.style' => '스타일', 'metadataEdit.style' => '스타일',
'metadataEdit.mood' => '분위기', 'metadataEdit.mood' => '분위기',
'matchScreen.match' => '일치...',
'matchScreen.fixMatch' => '일치 수정...',
'matchScreen.unmatch' => '일치 해제',
'matchScreen.unmatchConfirm' => '이 항목의 현재 일치를 해제하시겠습니까? 다시 일치시킬 때까지 Plex는 일치되지 않은 것으로 처리합니다.',
'matchScreen.unmatchSuccess' => '일치 해제됨',
'matchScreen.unmatchFailed' => '일치 해제에 실패했습니다',
'matchScreen.matchApplied' => '일치 적용됨',
'matchScreen.matchFailed' => '일치 적용에 실패했습니다',
'matchScreen.titleHint' => '제목',
'matchScreen.yearHint' => '연도',
'matchScreen.search' => '검색',
'matchScreen.noMatchesFound' => '일치하는 항목이 없습니다',
'serverTasks.title' => '서버 작업', 'serverTasks.title' => '서버 작업',
'serverTasks.failedToLoad' => '작업을 불러올 수 없습니다', 'serverTasks.failedToLoad' => '작업을 불러올 수 없습니다',
'serverTasks.noTasks' => '실행 중인 작업 없음', 'serverTasks.noTasks' => '실행 중인 작업 없음',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsNb with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsNb videoSettings = _TranslationsVideoSettingsNb._(_root); @override late final _TranslationsVideoSettingsNb videoSettings = _TranslationsVideoSettingsNb._(_root);
@override late final _TranslationsExternalPlayerNb externalPlayer = _TranslationsExternalPlayerNb._(_root); @override late final _TranslationsExternalPlayerNb externalPlayer = _TranslationsExternalPlayerNb._(_root);
@override late final _TranslationsMetadataEditNb metadataEdit = _TranslationsMetadataEditNb._(_root); @override late final _TranslationsMetadataEditNb metadataEdit = _TranslationsMetadataEditNb._(_root);
@override late final _TranslationsMatchScreenNb matchScreen = _TranslationsMatchScreenNb._(_root);
@override late final _TranslationsServerTasksNb serverTasks = _TranslationsServerTasksNb._(_root); @override late final _TranslationsServerTasksNb serverTasks = _TranslationsServerTasksNb._(_root);
@override late final _TranslationsTraktNb trakt = _TranslationsTraktNb._(_root); @override late final _TranslationsTraktNb trakt = _TranslationsTraktNb._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditNb implements TranslationsMetadataEditEn {
@override String get mood => 'Stemning'; @override String get mood => 'Stemning';
} }
// Path: matchScreen
class _TranslationsMatchScreenNb implements TranslationsMatchScreenEn {
_TranslationsMatchScreenNb._(this._root);
final TranslationsNb _root; // ignore: unused_field
// Translations
@override String get match => 'Match...';
@override String get fixMatch => 'Rett match...';
@override String get unmatch => 'Fjern match';
@override String get unmatchConfirm => 'Fjerne gjeldende match for dette elementet? Plex behandler det som umatchet til du matcher det igjen.';
@override String get unmatchSuccess => 'Match fjernet';
@override String get unmatchFailed => 'Kunne ikke fjerne match';
@override String get matchApplied => 'Match anvendt';
@override String get matchFailed => 'Kunne ikke anvende match';
@override String get titleHint => 'Tittel';
@override String get yearHint => 'År';
@override String get search => 'Søk';
@override String get noMatchesFound => 'Ingen treff funnet';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksNb implements TranslationsServerTasksEn { class _TranslationsServerTasksNb implements TranslationsServerTasksEn {
_TranslationsServerTasksNb._(this._root); _TranslationsServerTasksNb._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsNb {
'metadataEdit.label' => 'Etikett', 'metadataEdit.label' => 'Etikett',
'metadataEdit.style' => 'Stil', 'metadataEdit.style' => 'Stil',
'metadataEdit.mood' => 'Stemning', 'metadataEdit.mood' => 'Stemning',
'matchScreen.match' => 'Match...',
'matchScreen.fixMatch' => 'Rett match...',
'matchScreen.unmatch' => 'Fjern match',
'matchScreen.unmatchConfirm' => 'Fjerne gjeldende match for dette elementet? Plex behandler det som umatchet til du matcher det igjen.',
'matchScreen.unmatchSuccess' => 'Match fjernet',
'matchScreen.unmatchFailed' => 'Kunne ikke fjerne match',
'matchScreen.matchApplied' => 'Match anvendt',
'matchScreen.matchFailed' => 'Kunne ikke anvende match',
'matchScreen.titleHint' => 'Tittel',
'matchScreen.yearHint' => 'År',
'matchScreen.search' => 'Søk',
'matchScreen.noMatchesFound' => 'Ingen treff funnet',
'serverTasks.title' => 'Serveroppgaver', 'serverTasks.title' => 'Serveroppgaver',
'serverTasks.failedToLoad' => 'Kunne ikke laste oppgaver', 'serverTasks.failedToLoad' => 'Kunne ikke laste oppgaver',
'serverTasks.noTasks' => 'Ingen oppgaver kjører', 'serverTasks.noTasks' => 'Ingen oppgaver kjører',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsNl with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsNl videoSettings = _TranslationsVideoSettingsNl._(_root); @override late final _TranslationsVideoSettingsNl videoSettings = _TranslationsVideoSettingsNl._(_root);
@override late final _TranslationsExternalPlayerNl externalPlayer = _TranslationsExternalPlayerNl._(_root); @override late final _TranslationsExternalPlayerNl externalPlayer = _TranslationsExternalPlayerNl._(_root);
@override late final _TranslationsMetadataEditNl metadataEdit = _TranslationsMetadataEditNl._(_root); @override late final _TranslationsMetadataEditNl metadataEdit = _TranslationsMetadataEditNl._(_root);
@override late final _TranslationsMatchScreenNl matchScreen = _TranslationsMatchScreenNl._(_root);
@override late final _TranslationsServerTasksNl serverTasks = _TranslationsServerTasksNl._(_root); @override late final _TranslationsServerTasksNl serverTasks = _TranslationsServerTasksNl._(_root);
@override late final _TranslationsTraktNl trakt = _TranslationsTraktNl._(_root); @override late final _TranslationsTraktNl trakt = _TranslationsTraktNl._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditNl implements TranslationsMetadataEditEn {
@override String get mood => 'Stemming'; @override String get mood => 'Stemming';
} }
// Path: matchScreen
class _TranslationsMatchScreenNl implements TranslationsMatchScreenEn {
_TranslationsMatchScreenNl._(this._root);
final TranslationsNl _root; // ignore: unused_field
// Translations
@override String get match => 'Koppelen...';
@override String get fixMatch => 'Koppeling herstellen...';
@override String get unmatch => 'Ontkoppelen';
@override String get unmatchConfirm => 'De huidige koppeling voor dit item wissen? Plex behandelt het als ongekoppeld totdat je het opnieuw koppelt.';
@override String get unmatchSuccess => 'Item ontkoppeld';
@override String get unmatchFailed => 'Kon item niet ontkoppelen';
@override String get matchApplied => 'Koppeling toegepast';
@override String get matchFailed => 'Koppeling kon niet worden toegepast';
@override String get titleHint => 'Titel';
@override String get yearHint => 'Jaar';
@override String get search => 'Zoeken';
@override String get noMatchesFound => 'Geen overeenkomsten gevonden';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksNl implements TranslationsServerTasksEn { class _TranslationsServerTasksNl implements TranslationsServerTasksEn {
_TranslationsServerTasksNl._(this._root); _TranslationsServerTasksNl._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsNl {
'metadataEdit.label' => 'Label', 'metadataEdit.label' => 'Label',
'metadataEdit.style' => 'Stijl', 'metadataEdit.style' => 'Stijl',
'metadataEdit.mood' => 'Stemming', 'metadataEdit.mood' => 'Stemming',
'matchScreen.match' => 'Koppelen...',
'matchScreen.fixMatch' => 'Koppeling herstellen...',
'matchScreen.unmatch' => 'Ontkoppelen',
'matchScreen.unmatchConfirm' => 'De huidige koppeling voor dit item wissen? Plex behandelt het als ongekoppeld totdat je het opnieuw koppelt.',
'matchScreen.unmatchSuccess' => 'Item ontkoppeld',
'matchScreen.unmatchFailed' => 'Kon item niet ontkoppelen',
'matchScreen.matchApplied' => 'Koppeling toegepast',
'matchScreen.matchFailed' => 'Koppeling kon niet worden toegepast',
'matchScreen.titleHint' => 'Titel',
'matchScreen.yearHint' => 'Jaar',
'matchScreen.search' => 'Zoeken',
'matchScreen.noMatchesFound' => 'Geen overeenkomsten gevonden',
'serverTasks.title' => 'Servertaken', 'serverTasks.title' => 'Servertaken',
'serverTasks.failedToLoad' => 'Taken konden niet worden geladen', 'serverTasks.failedToLoad' => 'Taken konden niet worden geladen',
'serverTasks.noTasks' => 'Geen actieve taken', 'serverTasks.noTasks' => 'Geen actieve taken',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsPl with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsPl videoSettings = _TranslationsVideoSettingsPl._(_root); @override late final _TranslationsVideoSettingsPl videoSettings = _TranslationsVideoSettingsPl._(_root);
@override late final _TranslationsExternalPlayerPl externalPlayer = _TranslationsExternalPlayerPl._(_root); @override late final _TranslationsExternalPlayerPl externalPlayer = _TranslationsExternalPlayerPl._(_root);
@override late final _TranslationsMetadataEditPl metadataEdit = _TranslationsMetadataEditPl._(_root); @override late final _TranslationsMetadataEditPl metadataEdit = _TranslationsMetadataEditPl._(_root);
@override late final _TranslationsMatchScreenPl matchScreen = _TranslationsMatchScreenPl._(_root);
@override late final _TranslationsServerTasksPl serverTasks = _TranslationsServerTasksPl._(_root); @override late final _TranslationsServerTasksPl serverTasks = _TranslationsServerTasksPl._(_root);
@override late final _TranslationsTraktPl trakt = _TranslationsTraktPl._(_root); @override late final _TranslationsTraktPl trakt = _TranslationsTraktPl._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditPl implements TranslationsMetadataEditEn {
@override String get mood => 'Nastrój'; @override String get mood => 'Nastrój';
} }
// Path: matchScreen
class _TranslationsMatchScreenPl implements TranslationsMatchScreenEn {
_TranslationsMatchScreenPl._(this._root);
final TranslationsPl _root; // ignore: unused_field
// Translations
@override String get match => 'Dopasuj...';
@override String get fixMatch => 'Popraw dopasowanie...';
@override String get unmatch => 'Usuń dopasowanie';
@override String get unmatchConfirm => 'Usunąć obecne dopasowanie tego elementu? Plex będzie traktował go jako niedopasowany, dopóki nie dopasujesz go ponownie.';
@override String get unmatchSuccess => 'Dopasowanie usunięte';
@override String get unmatchFailed => 'Nie udało się usunąć dopasowania';
@override String get matchApplied => 'Dopasowanie zastosowane';
@override String get matchFailed => 'Nie udało się zastosować dopasowania';
@override String get titleHint => 'Tytuł';
@override String get yearHint => 'Rok';
@override String get search => 'Szukaj';
@override String get noMatchesFound => 'Nie znaleziono dopasowań';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksPl implements TranslationsServerTasksEn { class _TranslationsServerTasksPl implements TranslationsServerTasksEn {
_TranslationsServerTasksPl._(this._root); _TranslationsServerTasksPl._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsPl {
'metadataEdit.label' => 'Etykieta', 'metadataEdit.label' => 'Etykieta',
'metadataEdit.style' => 'Styl', 'metadataEdit.style' => 'Styl',
'metadataEdit.mood' => 'Nastrój', 'metadataEdit.mood' => 'Nastrój',
'matchScreen.match' => 'Dopasuj...',
'matchScreen.fixMatch' => 'Popraw dopasowanie...',
'matchScreen.unmatch' => 'Usuń dopasowanie',
'matchScreen.unmatchConfirm' => 'Usunąć obecne dopasowanie tego elementu? Plex będzie traktował go jako niedopasowany, dopóki nie dopasujesz go ponownie.',
'matchScreen.unmatchSuccess' => 'Dopasowanie usunięte',
'matchScreen.unmatchFailed' => 'Nie udało się usunąć dopasowania',
'matchScreen.matchApplied' => 'Dopasowanie zastosowane',
'matchScreen.matchFailed' => 'Nie udało się zastosować dopasowania',
'matchScreen.titleHint' => 'Tytuł',
'matchScreen.yearHint' => 'Rok',
'matchScreen.search' => 'Szukaj',
'matchScreen.noMatchesFound' => 'Nie znaleziono dopasowań',
'serverTasks.title' => 'Zadania serwera', 'serverTasks.title' => 'Zadania serwera',
'serverTasks.failedToLoad' => 'Nie udało się załadować zadań', 'serverTasks.failedToLoad' => 'Nie udało się załadować zadań',
'serverTasks.noTasks' => 'Brak uruchomionych zadań', 'serverTasks.noTasks' => 'Brak uruchomionych zadań',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsPt with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsPt videoSettings = _TranslationsVideoSettingsPt._(_root); @override late final _TranslationsVideoSettingsPt videoSettings = _TranslationsVideoSettingsPt._(_root);
@override late final _TranslationsExternalPlayerPt externalPlayer = _TranslationsExternalPlayerPt._(_root); @override late final _TranslationsExternalPlayerPt externalPlayer = _TranslationsExternalPlayerPt._(_root);
@override late final _TranslationsMetadataEditPt metadataEdit = _TranslationsMetadataEditPt._(_root); @override late final _TranslationsMetadataEditPt metadataEdit = _TranslationsMetadataEditPt._(_root);
@override late final _TranslationsMatchScreenPt matchScreen = _TranslationsMatchScreenPt._(_root);
@override late final _TranslationsServerTasksPt serverTasks = _TranslationsServerTasksPt._(_root); @override late final _TranslationsServerTasksPt serverTasks = _TranslationsServerTasksPt._(_root);
@override late final _TranslationsTraktPt trakt = _TranslationsTraktPt._(_root); @override late final _TranslationsTraktPt trakt = _TranslationsTraktPt._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditPt implements TranslationsMetadataEditEn {
@override String get mood => 'Humor'; @override String get mood => 'Humor';
} }
// Path: matchScreen
class _TranslationsMatchScreenPt implements TranslationsMatchScreenEn {
_TranslationsMatchScreenPt._(this._root);
final TranslationsPt _root; // ignore: unused_field
// Translations
@override String get match => 'Associar...';
@override String get fixMatch => 'Corrigir correspondência...';
@override String get unmatch => 'Desassociar';
@override String get unmatchConfirm => 'Limpar a correspondência atual deste item? O Plex vai tratá-lo como não correspondido até que o associe novamente.';
@override String get unmatchSuccess => 'Item desassociado';
@override String get unmatchFailed => 'Falha ao desassociar item';
@override String get matchApplied => 'Correspondência aplicada';
@override String get matchFailed => 'Falha ao aplicar correspondência';
@override String get titleHint => 'Título';
@override String get yearHint => 'Ano';
@override String get search => 'Pesquisar';
@override String get noMatchesFound => 'Nenhuma correspondência encontrada';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksPt implements TranslationsServerTasksEn { class _TranslationsServerTasksPt implements TranslationsServerTasksEn {
_TranslationsServerTasksPt._(this._root); _TranslationsServerTasksPt._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsPt {
'metadataEdit.label' => 'Rótulo', 'metadataEdit.label' => 'Rótulo',
'metadataEdit.style' => 'Estilo', 'metadataEdit.style' => 'Estilo',
'metadataEdit.mood' => 'Humor', 'metadataEdit.mood' => 'Humor',
'matchScreen.match' => 'Associar...',
'matchScreen.fixMatch' => 'Corrigir correspondência...',
'matchScreen.unmatch' => 'Desassociar',
'matchScreen.unmatchConfirm' => 'Limpar a correspondência atual deste item? O Plex vai tratá-lo como não correspondido até que o associe novamente.',
'matchScreen.unmatchSuccess' => 'Item desassociado',
'matchScreen.unmatchFailed' => 'Falha ao desassociar item',
'matchScreen.matchApplied' => 'Correspondência aplicada',
'matchScreen.matchFailed' => 'Falha ao aplicar correspondência',
'matchScreen.titleHint' => 'Título',
'matchScreen.yearHint' => 'Ano',
'matchScreen.search' => 'Pesquisar',
'matchScreen.noMatchesFound' => 'Nenhuma correspondência encontrada',
'serverTasks.title' => 'Tarefas do servidor', 'serverTasks.title' => 'Tarefas do servidor',
'serverTasks.failedToLoad' => 'Falha ao carregar tarefas', 'serverTasks.failedToLoad' => 'Falha ao carregar tarefas',
'serverTasks.noTasks' => 'Nenhuma tarefa em execução', 'serverTasks.noTasks' => 'Nenhuma tarefa em execução',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsRu with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsRu videoSettings = _TranslationsVideoSettingsRu._(_root); @override late final _TranslationsVideoSettingsRu videoSettings = _TranslationsVideoSettingsRu._(_root);
@override late final _TranslationsExternalPlayerRu externalPlayer = _TranslationsExternalPlayerRu._(_root); @override late final _TranslationsExternalPlayerRu externalPlayer = _TranslationsExternalPlayerRu._(_root);
@override late final _TranslationsMetadataEditRu metadataEdit = _TranslationsMetadataEditRu._(_root); @override late final _TranslationsMetadataEditRu metadataEdit = _TranslationsMetadataEditRu._(_root);
@override late final _TranslationsMatchScreenRu matchScreen = _TranslationsMatchScreenRu._(_root);
@override late final _TranslationsServerTasksRu serverTasks = _TranslationsServerTasksRu._(_root); @override late final _TranslationsServerTasksRu serverTasks = _TranslationsServerTasksRu._(_root);
@override late final _TranslationsTraktRu trakt = _TranslationsTraktRu._(_root); @override late final _TranslationsTraktRu trakt = _TranslationsTraktRu._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditRu implements TranslationsMetadataEditEn {
@override String get mood => 'Настроение'; @override String get mood => 'Настроение';
} }
// Path: matchScreen
class _TranslationsMatchScreenRu implements TranslationsMatchScreenEn {
_TranslationsMatchScreenRu._(this._root);
final TranslationsRu _root; // ignore: unused_field
// Translations
@override String get match => 'Сопоставить...';
@override String get fixMatch => 'Исправить сопоставление...';
@override String get unmatch => 'Сбросить сопоставление';
@override String get unmatchConfirm => 'Сбросить текущее сопоставление этого элемента? Plex будет считать его несопоставленным, пока вы не сопоставите его снова.';
@override String get unmatchSuccess => 'Сопоставление сброшено';
@override String get unmatchFailed => 'Не удалось сбросить сопоставление';
@override String get matchApplied => 'Сопоставление применено';
@override String get matchFailed => 'Не удалось применить сопоставление';
@override String get titleHint => 'Название';
@override String get yearHint => 'Год';
@override String get search => 'Поиск';
@override String get noMatchesFound => 'Совпадений не найдено';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksRu implements TranslationsServerTasksEn { class _TranslationsServerTasksRu implements TranslationsServerTasksEn {
_TranslationsServerTasksRu._(this._root); _TranslationsServerTasksRu._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsRu {
'metadataEdit.label' => 'Метка', 'metadataEdit.label' => 'Метка',
'metadataEdit.style' => 'Стиль', 'metadataEdit.style' => 'Стиль',
'metadataEdit.mood' => 'Настроение', 'metadataEdit.mood' => 'Настроение',
'matchScreen.match' => 'Сопоставить...',
'matchScreen.fixMatch' => 'Исправить сопоставление...',
'matchScreen.unmatch' => 'Сбросить сопоставление',
'matchScreen.unmatchConfirm' => 'Сбросить текущее сопоставление этого элемента? Plex будет считать его несопоставленным, пока вы не сопоставите его снова.',
'matchScreen.unmatchSuccess' => 'Сопоставление сброшено',
'matchScreen.unmatchFailed' => 'Не удалось сбросить сопоставление',
'matchScreen.matchApplied' => 'Сопоставление применено',
'matchScreen.matchFailed' => 'Не удалось применить сопоставление',
'matchScreen.titleHint' => 'Название',
'matchScreen.yearHint' => 'Год',
'matchScreen.search' => 'Поиск',
'matchScreen.noMatchesFound' => 'Совпадений не найдено',
'serverTasks.title' => 'Задачи сервера', 'serverTasks.title' => 'Задачи сервера',
'serverTasks.failedToLoad' => 'Не удалось загрузить задачи', 'serverTasks.failedToLoad' => 'Не удалось загрузить задачи',
'serverTasks.noTasks' => 'Нет выполняемых задач', 'serverTasks.noTasks' => 'Нет выполняемых задач',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsSv with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsSv videoSettings = _TranslationsVideoSettingsSv._(_root); @override late final _TranslationsVideoSettingsSv videoSettings = _TranslationsVideoSettingsSv._(_root);
@override late final _TranslationsExternalPlayerSv externalPlayer = _TranslationsExternalPlayerSv._(_root); @override late final _TranslationsExternalPlayerSv externalPlayer = _TranslationsExternalPlayerSv._(_root);
@override late final _TranslationsMetadataEditSv metadataEdit = _TranslationsMetadataEditSv._(_root); @override late final _TranslationsMetadataEditSv metadataEdit = _TranslationsMetadataEditSv._(_root);
@override late final _TranslationsMatchScreenSv matchScreen = _TranslationsMatchScreenSv._(_root);
@override late final _TranslationsServerTasksSv serverTasks = _TranslationsServerTasksSv._(_root); @override late final _TranslationsServerTasksSv serverTasks = _TranslationsServerTasksSv._(_root);
@override late final _TranslationsTraktSv trakt = _TranslationsTraktSv._(_root); @override late final _TranslationsTraktSv trakt = _TranslationsTraktSv._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditSv implements TranslationsMetadataEditEn {
@override String get mood => 'Stämning'; @override String get mood => 'Stämning';
} }
// Path: matchScreen
class _TranslationsMatchScreenSv implements TranslationsMatchScreenEn {
_TranslationsMatchScreenSv._(this._root);
final TranslationsSv _root; // ignore: unused_field
// Translations
@override String get match => 'Matcha...';
@override String get fixMatch => 'Rätta matchning...';
@override String get unmatch => 'Ta bort matchning';
@override String get unmatchConfirm => 'Ta bort den aktuella matchningen för det här objektet? Plex behandlar det som omatchat tills du matchar det igen.';
@override String get unmatchSuccess => 'Matchning borttagen';
@override String get unmatchFailed => 'Det gick inte att ta bort matchningen';
@override String get matchApplied => 'Matchning tillämpad';
@override String get matchFailed => 'Det gick inte att tillämpa matchningen';
@override String get titleHint => 'Titel';
@override String get yearHint => 'År';
@override String get search => 'Sök';
@override String get noMatchesFound => 'Inga matchningar hittades';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksSv implements TranslationsServerTasksEn { class _TranslationsServerTasksSv implements TranslationsServerTasksEn {
_TranslationsServerTasksSv._(this._root); _TranslationsServerTasksSv._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsSv {
'metadataEdit.label' => 'Etikett', 'metadataEdit.label' => 'Etikett',
'metadataEdit.style' => 'Stil', 'metadataEdit.style' => 'Stil',
'metadataEdit.mood' => 'Stämning', 'metadataEdit.mood' => 'Stämning',
'matchScreen.match' => 'Matcha...',
'matchScreen.fixMatch' => 'Rätta matchning...',
'matchScreen.unmatch' => 'Ta bort matchning',
'matchScreen.unmatchConfirm' => 'Ta bort den aktuella matchningen för det här objektet? Plex behandlar det som omatchat tills du matchar det igen.',
'matchScreen.unmatchSuccess' => 'Matchning borttagen',
'matchScreen.unmatchFailed' => 'Det gick inte att ta bort matchningen',
'matchScreen.matchApplied' => 'Matchning tillämpad',
'matchScreen.matchFailed' => 'Det gick inte att tillämpa matchningen',
'matchScreen.titleHint' => 'Titel',
'matchScreen.yearHint' => 'År',
'matchScreen.search' => 'Sök',
'matchScreen.noMatchesFound' => 'Inga matchningar hittades',
'serverTasks.title' => 'Serveruppgifter', 'serverTasks.title' => 'Serveruppgifter',
'serverTasks.failedToLoad' => 'Kunde inte ladda uppgifter', 'serverTasks.failedToLoad' => 'Kunde inte ladda uppgifter',
'serverTasks.noTasks' => 'Inga pågående uppgifter', 'serverTasks.noTasks' => 'Inga pågående uppgifter',
+34
View File
@@ -74,6 +74,7 @@ class TranslationsZh with BaseTranslations<AppLocale, Translations> implements T
@override late final _TranslationsVideoSettingsZh videoSettings = _TranslationsVideoSettingsZh._(_root); @override late final _TranslationsVideoSettingsZh videoSettings = _TranslationsVideoSettingsZh._(_root);
@override late final _TranslationsExternalPlayerZh externalPlayer = _TranslationsExternalPlayerZh._(_root); @override late final _TranslationsExternalPlayerZh externalPlayer = _TranslationsExternalPlayerZh._(_root);
@override late final _TranslationsMetadataEditZh metadataEdit = _TranslationsMetadataEditZh._(_root); @override late final _TranslationsMetadataEditZh metadataEdit = _TranslationsMetadataEditZh._(_root);
@override late final _TranslationsMatchScreenZh matchScreen = _TranslationsMatchScreenZh._(_root);
@override late final _TranslationsServerTasksZh serverTasks = _TranslationsServerTasksZh._(_root); @override late final _TranslationsServerTasksZh serverTasks = _TranslationsServerTasksZh._(_root);
@override late final _TranslationsTraktZh trakt = _TranslationsTraktZh._(_root); @override late final _TranslationsTraktZh trakt = _TranslationsTraktZh._(_root);
} }
@@ -1224,6 +1225,27 @@ class _TranslationsMetadataEditZh implements TranslationsMetadataEditEn {
@override String get mood => '氛围'; @override String get mood => '氛围';
} }
// Path: matchScreen
class _TranslationsMatchScreenZh implements TranslationsMatchScreenEn {
_TranslationsMatchScreenZh._(this._root);
final TranslationsZh _root; // ignore: unused_field
// Translations
@override String get match => '匹配...';
@override String get fixMatch => '修正匹配...';
@override String get unmatch => '取消匹配';
@override String get unmatchConfirm => '清除此项目的当前匹配吗?在重新匹配之前,Plex 会将其视为未匹配。';
@override String get unmatchSuccess => '已取消匹配';
@override String get unmatchFailed => '无法取消匹配';
@override String get matchApplied => '匹配已应用';
@override String get matchFailed => '应用匹配失败';
@override String get titleHint => '标题';
@override String get yearHint => '年份';
@override String get search => '搜索';
@override String get noMatchesFound => '未找到匹配项';
}
// Path: serverTasks // Path: serverTasks
class _TranslationsServerTasksZh implements TranslationsServerTasksEn { class _TranslationsServerTasksZh implements TranslationsServerTasksEn {
_TranslationsServerTasksZh._(this._root); _TranslationsServerTasksZh._(this._root);
@@ -2325,6 +2347,18 @@ extension on TranslationsZh {
'metadataEdit.label' => '标记', 'metadataEdit.label' => '标记',
'metadataEdit.style' => '风格', 'metadataEdit.style' => '风格',
'metadataEdit.mood' => '氛围', 'metadataEdit.mood' => '氛围',
'matchScreen.match' => '匹配...',
'matchScreen.fixMatch' => '修正匹配...',
'matchScreen.unmatch' => '取消匹配',
'matchScreen.unmatchConfirm' => '清除此项目的当前匹配吗?在重新匹配之前,Plex 会将其视为未匹配。',
'matchScreen.unmatchSuccess' => '已取消匹配',
'matchScreen.unmatchFailed' => '无法取消匹配',
'matchScreen.matchApplied' => '匹配已应用',
'matchScreen.matchFailed' => '应用匹配失败',
'matchScreen.titleHint' => '标题',
'matchScreen.yearHint' => '年份',
'matchScreen.search' => '搜索',
'matchScreen.noMatchesFound' => '未找到匹配项',
'serverTasks.title' => '服务器任务', 'serverTasks.title' => '服务器任务',
'serverTasks.failedToLoad' => '加载任务失败', 'serverTasks.failedToLoad' => '加载任务失败',
'serverTasks.noTasks' => '没有正在运行的任务', 'serverTasks.noTasks' => '没有正在运行的任务',
+14
View File
@@ -986,6 +986,20 @@
"style": "Stil", "style": "Stil",
"mood": "Stämning" "mood": "Stämning"
}, },
"matchScreen": {
"match": "Matcha...",
"fixMatch": "Rätta matchning...",
"unmatch": "Ta bort matchning",
"unmatchConfirm": "Ta bort den aktuella matchningen för det här objektet? Plex behandlar det som omatchat tills du matchar det igen.",
"unmatchSuccess": "Matchning borttagen",
"unmatchFailed": "Det gick inte att ta bort matchningen",
"matchApplied": "Matchning tillämpad",
"matchFailed": "Det gick inte att tillämpa matchningen",
"titleHint": "Titel",
"yearHint": "År",
"search": "Sök",
"noMatchesFound": "Inga matchningar hittades"
},
"serverTasks": { "serverTasks": {
"title": "Serveruppgifter", "title": "Serveruppgifter",
"failedToLoad": "Kunde inte ladda uppgifter", "failedToLoad": "Kunde inte ladda uppgifter",
+14
View File
@@ -986,6 +986,20 @@
"style": "风格", "style": "风格",
"mood": "氛围" "mood": "氛围"
}, },
"matchScreen": {
"match": "匹配...",
"fixMatch": "修正匹配...",
"unmatch": "取消匹配",
"unmatchConfirm": "清除此项目的当前匹配吗?在重新匹配之前,Plex 会将其视为未匹配。",
"unmatchSuccess": "已取消匹配",
"unmatchFailed": "无法取消匹配",
"matchApplied": "匹配已应用",
"matchFailed": "应用匹配失败",
"titleHint": "标题",
"yearHint": "年份",
"search": "搜索",
"noMatchesFound": "未找到匹配项"
},
"serverTasks": { "serverTasks": {
"title": "服务器任务", "title": "服务器任务",
"failedToLoad": "加载任务失败", "failedToLoad": "加载任务失败",
+36
View File
@@ -0,0 +1,36 @@
import '../utils/json_utils.dart';
class PlexMatchResult {
final String guid;
final String name;
final int? year;
final int? score;
final String? thumb;
final String? summary;
final String? type;
final bool matched;
PlexMatchResult({
required this.guid,
required this.name,
this.year,
this.score,
this.thumb,
this.summary,
this.type,
this.matched = false,
});
factory PlexMatchResult.fromJson(Map<String, dynamic> json) {
return PlexMatchResult(
guid: json['guid']?.toString() ?? '',
name: json['name']?.toString() ?? '',
year: flexibleInt(json['year']),
score: flexibleInt(json['score']),
thumb: json['thumb']?.toString(),
summary: json['summary']?.toString(),
type: json['type']?.toString(),
matched: flexibleBool(json['matched']),
);
}
}
+8
View File
@@ -55,6 +55,10 @@ enum PlexMediaType {
}; };
} }
/// Shared suffix of both unmatched-agent URL schemes: legacy
/// `com.plexapp.agents.none://` and new-style `tv.plex.agents.none://`.
const _unmatchedAgentMarker = 'agents.none://';
@JsonSerializable() @JsonSerializable()
class PlexMetadata with MultiServerFields { class PlexMetadata with MultiServerFields {
@JsonKey(readValue: _readRatingKey) @JsonKey(readValue: _readRatingKey)
@@ -160,6 +164,10 @@ class PlexMetadata with MultiServerFields {
/// These have keys like `/library/sections/5/all` instead of `/library/metadata/12345`. /// These have keys like `/library/sections/5/all` instead of `/library/metadata/12345`.
bool get isLibrarySection => key != null && key!.startsWith('/library/sections/'); bool get isLibrarySection => key != null && key!.startsWith('/library/sections/');
/// Whether this item has no metadata agent match. Unmatched items get a
/// synthetic `*.agents.none://` guid from the server.
bool get isUnmatched => guid == null || guid!.isEmpty || guid!.contains(_unmatchedAgentMarker);
/// Extract the library section ID from a library-section item's key. /// Extract the library section ID from a library-section item's key.
/// Returns null if this is not a library section item. /// Returns null if this is not a library section item.
String? get librarySectionKey { String? get librarySectionKey {
+249
View File
@@ -0,0 +1,249 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:material_symbols_icons/symbols.dart';
import '../focus/focusable_button.dart';
import '../focus/focusable_text_field.dart';
import '../focus/input_mode_tracker.dart';
import '../i18n/strings.g.dart';
import '../models/plex_match_result.dart';
import '../models/plex_metadata.dart';
import '../services/plex_client.dart';
import '../utils/provider_extensions.dart';
import '../utils/snackbar_helper.dart';
import '../widgets/app_icon.dart';
import '../widgets/focusable_list_tile.dart';
import '../widgets/focused_scroll_scaffold.dart';
import '../widgets/pill_input_decoration.dart';
import '../widgets/plex_optimized_image.dart';
/// Fix / apply a metadata match on a movie or show.
///
/// On success, pops `true` so the caller can refresh its view.
class MatchScreen extends StatefulWidget {
final PlexMetadata metadata;
const MatchScreen({super.key, required this.metadata});
@override
State<MatchScreen> createState() => _MatchScreenState();
}
class _MatchScreenState extends State<MatchScreen> {
late final PlexClient _client;
late final TextEditingController _nameController;
late final TextEditingController _yearController;
final _nameFocus = FocusNode();
final _yearFocus = FocusNode();
final _searchFocus = FocusNode();
List<PlexMatchResult>? _results;
bool _isSearching = false;
String? _applyingGuid;
bool get _isApplying => _applyingGuid != null;
@override
void initState() {
super.initState();
_client = context.getClientWithFallback(widget.metadata.serverId);
_nameController = TextEditingController(text: widget.metadata.title);
_yearController = TextEditingController(text: widget.metadata.year?.toString() ?? '');
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
if (InputModeTracker.isKeyboardMode(context)) {
_nameFocus.requestFocus();
}
_search();
});
}
@override
void dispose() {
_nameController.dispose();
_yearController.dispose();
_nameFocus.dispose();
_yearFocus.dispose();
_searchFocus.dispose();
super.dispose();
}
Future<void> _search() async {
if (_isSearching) return;
setState(() => _isSearching = true);
final results = await _client.findMatches(
widget.metadata.ratingKey,
title: _nameController.text.trim(),
year: _yearController.text.trim(),
);
if (!mounted) return;
setState(() {
_results = results;
_isSearching = false;
});
}
Future<void> _applyMatch(PlexMatchResult result) async {
if (_isApplying) return;
setState(() => _applyingGuid = result.guid);
final success = await _client.applyMatch(
widget.metadata.ratingKey,
guid: result.guid,
name: result.name,
year: result.year?.toString(),
);
if (!mounted) return;
setState(() => _applyingGuid = null);
if (success) {
showSuccessSnackBar(context, t.matchScreen.matchApplied);
Navigator.pop(context, true);
} else {
showErrorSnackBar(context, t.matchScreen.matchFailed);
}
}
@override
Widget build(BuildContext context) {
return FocusedScrollScaffold(
title: Text(widget.metadata.isUnmatched ? t.matchScreen.match : t.matchScreen.fixMatch),
slivers: [
SliverPadding(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),
sliver: SliverToBoxAdapter(child: _buildSearchForm(context)),
),
if (_isSearching || _results == null)
const SliverFillRemaining(hasScrollBody: false, child: Center(child: CircularProgressIndicator()))
else if (_results!.isEmpty)
SliverFillRemaining(
hasScrollBody: false,
child: Center(
child: Text(
t.matchScreen.noMatchesFound,
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center,
),
),
)
else
SliverPadding(
padding: const EdgeInsets.fromLTRB(8, 0, 8, 24),
sliver: SliverList.builder(
itemCount: _results!.length,
itemBuilder: (context, index) => _buildResultTile(_results![index]),
),
),
],
);
}
Widget _buildSearchForm(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Row(
children: [
Expanded(
child: FocusableTextField(
controller: _nameController,
focusNode: _nameFocus,
decoration: pillInputDecoration(
context,
hintText: t.matchScreen.titleHint,
prefixIcon: const AppIcon(Symbols.search_rounded),
),
textInputAction: TextInputAction.next,
onSubmitted: (_) => _yearFocus.requestFocus(),
onNavigateRight: _yearFocus.requestFocus,
onNavigateDown: _searchFocus.requestFocus,
),
),
const SizedBox(width: 12),
SizedBox(
width: 140,
child: FocusableTextField(
controller: _yearController,
focusNode: _yearFocus,
decoration: pillInputDecoration(context, hintText: t.matchScreen.yearHint),
keyboardType: TextInputType.number,
inputFormatters: [FilteringTextInputFormatter.digitsOnly, LengthLimitingTextInputFormatter(4)],
textInputAction: TextInputAction.search,
onSubmitted: (_) => _search(),
onNavigateLeft: _nameFocus.requestFocus,
onNavigateDown: _searchFocus.requestFocus,
),
),
],
),
const SizedBox(height: 12),
FocusableButton(
focusNode: _searchFocus,
useBackgroundFocus: true,
onPressed: _isSearching ? null : _search,
child: FilledButton.icon(
onPressed: _isSearching ? null : _search,
icon: const AppIcon(Symbols.search_rounded),
label: Text(t.matchScreen.search),
style: FilledButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 14),
shape: const StadiumBorder(),
),
),
),
],
);
}
Widget _buildResultTile(PlexMatchResult result) {
final isApplyingThis = _isApplying && _applyingGuid == result.guid;
final yearLabel = result.year?.toString() ?? '';
final titleText = yearLabel.isEmpty ? result.name : '${result.name} (${result.year})';
return Padding(
padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 4),
child: FocusableListTile(
enabled: !_isApplying,
onTap: () => _applyMatch(result),
leading: SizedBox(
width: 48,
height: 72,
child: ClipRRect(
borderRadius: BorderRadius.circular(4),
child: PlexOptimizedImage(
client: _client,
imagePath: result.thumb,
fit: BoxFit.cover,
fallbackIcon: Symbols.movie_rounded,
),
),
),
title: Text(titleText, style: const TextStyle(fontWeight: FontWeight.w600)),
subtitle: result.summary != null && result.summary!.isNotEmpty
? Text(result.summary!, maxLines: 2, overflow: TextOverflow.ellipsis)
: null,
trailing: isApplyingThis
? const SizedBox(width: 24, height: 24, child: CircularProgressIndicator(strokeWidth: 2))
: result.score != null
? _ScoreChip(score: result.score!)
: null,
),
);
}
}
class _ScoreChip extends StatelessWidget {
final int score;
const _ScoreChip({required this.score});
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: BoxDecoration(color: colorScheme.secondaryContainer, borderRadius: BorderRadius.circular(100)),
child: Text(
'$score',
style: TextStyle(color: colorScheme.onSecondaryContainer, fontWeight: FontWeight.w600),
),
);
}
}
+55
View File
@@ -22,6 +22,7 @@ import '../models/plex_library.dart';
import '../models/plex_media_info.dart'; import '../models/plex_media_info.dart';
import '../models/plex_subtitle_search_result.dart'; import '../models/plex_subtitle_search_result.dart';
import '../models/plex_media_version.dart'; import '../models/plex_media_version.dart';
import '../models/plex_match_result.dart';
import '../models/plex_metadata.dart'; import '../models/plex_metadata.dart';
import '../utils/content_utils.dart'; import '../utils/content_utils.dart';
import '../models/plex_playlist.dart'; import '../models/plex_playlist.dart';
@@ -1988,6 +1989,60 @@ class PlexClient {
); );
} }
/// Search for match candidates for a media item.
Future<List<PlexMatchResult>> findMatches(
String ratingKey, {
String? title,
String? year,
String? agent,
String? language,
}) async {
final queryParams = <String, dynamic>{'manual': 1};
if (title != null && title.isNotEmpty) queryParams['title'] = title;
if (year != null && year.isNotEmpty) queryParams['year'] = year;
if (agent != null && agent.isNotEmpty) queryParams['agent'] = agent;
if (language != null && language.isNotEmpty) queryParams['language'] = language;
return _wrapListApiCall<PlexMatchResult>(
() => _getWithFailover('/library/metadata/$ratingKey/matches', queryParameters: queryParams),
(response) {
final container = _getMediaContainer(response);
if (container == null || container['SearchResult'] == null) return [];
return (container['SearchResult'] as List)
.map((json) => PlexMatchResult.fromJson(json as Map<String, dynamic>))
.toList();
},
'Failed to search for matches',
);
}
/// Apply a chosen match to a media item.
Future<bool> applyMatch(String ratingKey, {required String guid, String? name, String? year}) async {
final queryParams = <String, dynamic>{'guid': guid};
if (name != null && name.isNotEmpty) queryParams['name'] = name;
if (year != null && year.isNotEmpty) queryParams['year'] = year;
final result = await _wrapBoolApiCall(
() => _http.put('/library/metadata/$ratingKey/match', queryParameters: queryParams),
'Failed to apply match',
);
if (result) {
await _cache.deleteForItem(serverId, ratingKey);
}
return result;
}
Future<bool> unmatchItem(String ratingKey) async {
final result = await _wrapBoolApiCall(
() => _http.put('/library/metadata/$ratingKey/unmatch'),
'Failed to unmatch item',
);
if (result) {
await _cache.deleteForItem(serverId, ratingKey);
}
return result;
}
/// Get available artwork (posters or backgrounds) for a media item /// Get available artwork (posters or backgrounds) for a media item
Future<List<Map<String, dynamic>>> getAvailableArtwork(String ratingKey, String element) async { Future<List<Map<String, dynamic>>> getAvailableArtwork(String ratingKey, String element) async {
try { try {
+53
View File
@@ -27,6 +27,7 @@ import '../utils/focus_utils.dart';
import '../services/external_player_service.dart'; import '../services/external_player_service.dart';
import '../focus/focusable_button.dart'; import '../focus/focusable_button.dart';
import '../focus/dpad_navigator.dart'; import '../focus/dpad_navigator.dart';
import '../screens/match_screen.dart';
import '../screens/media_detail_screen.dart'; import '../screens/media_detail_screen.dart';
import '../screens/metadata_edit_screen.dart'; import '../screens/metadata_edit_screen.dart';
import '../utils/smart_deletion_handler.dart'; import '../utils/smart_deletion_handler.dart';
@@ -241,6 +242,19 @@ class MediaContextMenuState extends State<MediaContextMenu> {
); );
} }
if (isAdmin && (mediaType == PlexMediaType.movie || mediaType == PlexMediaType.show)) {
menuActions.add(
_MenuAction(
value: 'match',
icon: Symbols.search_rounded,
label: metadata.isUnmatched ? t.matchScreen.match : t.matchScreen.fixMatch,
),
);
if (!metadata.isUnmatched) {
menuActions.add(_MenuAction(value: 'unmatch', icon: Symbols.link_off_rounded, label: t.matchScreen.unmatch));
}
}
// Remove from Collection (only when viewing items within a collection) // Remove from Collection (only when viewing items within a collection)
if (widget.collectionId != null) { if (widget.collectionId != null) {
menuActions.add( menuActions.add(
@@ -507,6 +521,18 @@ class MediaContextMenuState extends State<MediaContextMenu> {
} }
break; break;
case 'match':
didNavigate = true;
if (context.mounted) {
await Navigator.push(context, MaterialPageRoute(builder: (context) => MatchScreen(metadata: metadata!)));
widget.onRefresh?.call(metadata!.ratingKey);
}
break;
case 'unmatch':
await _handleUnmatch(context, metadata!);
break;
case 'remove_from_collection': case 'remove_from_collection':
await _handleRemoveFromCollection(context, metadata!); await _handleRemoveFromCollection(context, metadata!);
break; break;
@@ -626,6 +652,33 @@ class MediaContextMenuState extends State<MediaContextMenu> {
} }
} }
Future<void> _handleUnmatch(BuildContext context, PlexMetadata metadata) async {
final confirmed = await showConfirmDialog(
context,
title: t.matchScreen.unmatch,
message: t.matchScreen.unmatchConfirm,
confirmText: t.matchScreen.unmatch,
isDestructive: true,
);
if (!confirmed || !context.mounted) return;
final client = _getClientForItem();
try {
final success = await client.unmatchItem(metadata.ratingKey);
if (!context.mounted) return;
if (success) {
showSuccessSnackBar(context, t.matchScreen.unmatchSuccess);
widget.onRefresh?.call(metadata.ratingKey);
} else {
showErrorSnackBar(context, t.matchScreen.unmatchFailed);
}
} catch (e) {
if (context.mounted) {
showErrorSnackBar(context, t.messages.errorLoading(error: e.toString()));
}
}
}
/// Navigate to a related item (series or season) /// Navigate to a related item (series or season)
Future<void> _navigateToRelated( Future<void> _navigateToRelated(
BuildContext context, BuildContext context,