From f94b8c658616434debe82929a68af1db70496ada Mon Sep 17 00:00:00 2001
From: edde746 <86283021+edde746@users.noreply.github.com>
Date: Fri, 10 Jul 2026 07:09:29 +0200
Subject: [PATCH] feat(settings): Services hub, Seerr sign-in, and all-locale
strings
---
assets/seerr_mark.svg | 1 +
lib/i18n/bg.i18n.json | 96 +++-
lib/i18n/da.i18n.json | 96 +++-
lib/i18n/de.i18n.json | 96 +++-
lib/i18n/en.i18n.json | 96 +++-
lib/i18n/es.i18n.json | 96 +++-
lib/i18n/fr.i18n.json | 96 +++-
lib/i18n/it.i18n.json | 96 +++-
lib/i18n/ja.i18n.json | 95 +++-
lib/i18n/ko.i18n.json | 95 +++-
lib/i18n/nb.i18n.json | 96 +++-
lib/i18n/nl.i18n.json | 96 +++-
lib/i18n/pl.i18n.json | 98 +++-
lib/i18n/pt.i18n.json | 96 +++-
lib/i18n/ru.i18n.json | 98 +++-
lib/i18n/strings.g.dart | 2 +-
lib/i18n/strings_bg.g.dart | 303 +++++++++---
lib/i18n/strings_da.g.dart | 303 +++++++++---
lib/i18n/strings_de.g.dart | 303 +++++++++---
lib/i18n/strings_en.g.dart | 448 +++++++++++++++---
lib/i18n/strings_es.g.dart | 303 +++++++++---
lib/i18n/strings_fr.g.dart | 303 +++++++++---
lib/i18n/strings_it.g.dart | 303 +++++++++---
lib/i18n/strings_ja.g.dart | 302 +++++++++---
lib/i18n/strings_ko.g.dart | 302 +++++++++---
lib/i18n/strings_nb.g.dart | 303 +++++++++---
lib/i18n/strings_nl.g.dart | 303 +++++++++---
lib/i18n/strings_pl.g.dart | 305 +++++++++---
lib/i18n/strings_pt.g.dart | 303 +++++++++---
lib/i18n/strings_ru.g.dart | 305 +++++++++---
lib/i18n/strings_sv.g.dart | 303 +++++++++---
lib/i18n/strings_zh.g.dart | 302 +++++++++---
lib/i18n/sv.i18n.json | 96 +++-
lib/i18n/zh.i18n.json | 95 +++-
.../settings/seerr_connect_screen.dart | 368 ++++++++++++++
.../settings/seerr_settings_screen.dart | 87 ++++
...een.dart => services_settings_screen.dart} | 78 +--
lib/screens/settings/settings_screen.dart | 28 +-
.../tracker_account_settings_body.dart | 2 +-
.../settings/tracker_connect_launcher.dart | 2 +-
.../tracker_library_filter_screen.dart | 26 +-
.../settings/tracker_settings_screen.dart | 22 +-
lib/widgets/catalog_source_logo.dart | 38 ++
lib/widgets/device_code_dialog.dart | 10 +-
lib/widgets/oauth_proxy_dialog.dart | 10 +-
lib/widgets/rating_bottom_sheet.dart | 10 +-
pubspec.yaml | 1 +
47 files changed, 5968 insertions(+), 1248 deletions(-)
create mode 100644 assets/seerr_mark.svg
create mode 100644 lib/screens/settings/seerr_connect_screen.dart
create mode 100644 lib/screens/settings/seerr_settings_screen.dart
rename lib/screens/settings/{trackers_settings_screen.dart => services_settings_screen.dart} (62%)
create mode 100644 lib/widgets/catalog_source_logo.dart
diff --git a/assets/seerr_mark.svg b/assets/seerr_mark.svg
new file mode 100644
index 00000000..18ffdc3c
--- /dev/null
+++ b/assets/seerr_mark.svg
@@ -0,0 +1 @@
+
diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json
index 63641104..cee2e960 100644
--- a/lib/i18n/bg.i18n.json
+++ b/lib/i18n/bg.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Показвай какво гледате в Discord",
"trakt": "Trakt",
"traktDescription": "Синхронизирай историята на гледане с Trakt",
- "trackers": "Тракери",
- "trackersDescription": "Синхронизирай прогреса с Trakt, MyAnimeList, AniList и Simkl",
+ "services": "Услуги",
+ "servicesDescription": "Свържи Trakt, MyAnimeList, Seerr и още",
"companionRemoteServer": "Сървър за дистанционно управление",
"companionRemoteServerDescription": "Позволи на мобилни устройства във вашата мрежа да управляват това приложение",
"autoPip": "Автоматичен режим картина в картината",
@@ -416,7 +416,7 @@
"setScore": "Задай оценка",
"saved": "Запазено",
"notAvailable": "Няма намерено съвпадение",
- "noConnectedTrackers": "Свържете тракер в Настройки, за да оценявате там."
+ "noConnectedServices": "Свържи услуга в Настройки, за да оценяваш там."
},
"accessibility": {
"mediaCardMovie": "${title}, филм",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Библиотеки",
"downloads": "Изтегляния",
- "liveTv": "Телевизия на живо"
+ "liveTv": "Телевизия на живо",
+ "explore": "Разгледай"
+ },
+ "explore": {
+ "title": "Разгледай",
+ "selectSource": "Избери източник",
+ "rows": {
+ "watchlist": "Списък за гледане",
+ "recommendedMovies": "Препоръчани филми",
+ "recommendedShows": "Препоръчани сериали",
+ "trendingMovies": "Актуални филми",
+ "trendingShows": "Актуални сериали",
+ "popularMovies": "Популярни филми",
+ "popularShows": "Популярни сериали",
+ "suggestedAnime": "Препоръчани аниме",
+ "airingAnime": "Топ излъчвани аниме",
+ "popularAnime": "Най-популярни аниме",
+ "trending": "Актуални",
+ "upcomingMovies": "Предстоящи филми",
+ "upcomingShows": "Предстоящи сериали"
+ },
+ "status": {
+ "airing": "Излъчва се",
+ "ended": "Приключил",
+ "canceled": "Отменен",
+ "upcoming": "Предстоящ"
+ },
+ "episodeCount": {
+ "one": "${n} епизод",
+ "other": "${n} епизода"
+ },
+ "cast": "Актьори",
+ "characters": "Герои",
+ "addToWatchlist": "Добави в списъка за гледане",
+ "removeFromWatchlist": "Премахни от списъка за гледане",
+ "watchlistUpdateFailed": "Неуспешно обновяване на списъка за гледане",
+ "notInLibrary": "Не е в твоята библиотека",
+ "inTheseLibraries": "В тези библиотеки",
+ "availableOn": "Налично на ${server}",
+ "checkingLibrary": "Проверка на твоята библиотека...",
+ "emptyTitle": "Тук все още няма нищо",
+ "emptyMessage": "Редовете от ${source} ще се появят тук, когато има съдържание.",
+ "searchHint": "Търсене в ${source}",
+ "searchEmpty": "Няма резултати за \"${query}\"",
+ "searchPrompt": "Търси филми и сериали в ${source}.",
+ "searchFailed": "Търсенето се провали. Провери връзката си и опитай отново."
},
"liveTv": {
"title": "Телевизия на живо",
@@ -1384,9 +1429,41 @@
"watchedSync": "Синхронизирай статус гледано",
"watchedSyncDescription": "Когато маркирате елементи като гледани в Plezy, маркирай ги и в Trakt."
},
- "trackers": {
- "title": "Тракери",
- "hubSubtitle": "Синхронизирай прогреса на гледане с Trakt и други услуги.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Свързване със Seerr",
+ "serverUrl": "URL на сървъра",
+ "serverUrlHelper": "Адресът на твоята Seerr инстанция",
+ "checkServer": "Продължи",
+ "signInWithJellyfin": "Вход с Jellyfin",
+ "signInWithEmby": "Вход с Emby",
+ "signInWithLocal": "Използвай локален акаунт",
+ "email": "Имейл",
+ "noSignInMethods": "Тази Seerr инстанция не предлага метод за вход, който Plezy поддържа.",
+ "instance": "Инстанция",
+ "disconnectConfirm": "Да се прекъсне ли Seerr?",
+ "disconnectConfirmBody": "Plezy ще забрави тази Seerr инстанция. Можете да се свържете отново по всяко време.",
+ "request": "Заяви",
+ "request4k": "Заяви в 4K",
+ "seasons": "Сезони",
+ "allSeasons": "Всички сезони",
+ "advancedOptions": "Разширени",
+ "destinationServer": "Целеви сървър",
+ "qualityProfile": "Профил за качество",
+ "rootFolder": "Основна папка",
+ "languageProfile": "Езиков профил",
+ "requestSubmitted": "Заявката е изпратена",
+ "requestFailed": "Заявката се провали: ${error}",
+ "requestsLoadFailed": "Неуспешно зареждане на опциите за заявка",
+ "nothingToRequest": "Всичко вече е налично или заявено.",
+ "statusAvailable": "Налично",
+ "statusPartiallyAvailable": "Частично налично",
+ "statusRequested": "Заявено",
+ "statusProcessing": "Обработва се"
+ },
+ "services": {
+ "title": "Услуги",
+ "hubSubtitle": "Синхронизирай прогреса на гледане и заявявай нови заглавия.",
"notConnected": "Не е свързан",
"connectedAs": "Свързан като @${username}",
"scrobble": "Проследявай прогреса автоматично",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Да се прекъсне ли ${service}?",
"disconnectConfirmBody": "Plezy ще спре да обновява ${service}. Можете да се свържете отново по всяко време.",
"connectFailed": "Неуспешно свързване с ${service}. Опитайте отново.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Активиране на Plezy в ${service}",
diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json
index 0cf7e4e5..6d414970 100644
--- a/lib/i18n/da.i18n.json
+++ b/lib/i18n/da.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Vis hvad du ser på Discord",
"trakt": "Trakt",
"traktDescription": "Synkroniser visningshistorik med Trakt",
- "trackers": "Trackere",
- "trackersDescription": "Synkroniser fremgang til Trakt, MyAnimeList, AniList og Simkl",
+ "services": "Tjenester",
+ "servicesDescription": "Forbind Trakt, MyAnimeList, Seerr og mere",
"companionRemoteServer": "Companion Remote Server",
"companionRemoteServerDescription": "Tillad mobilenheder på dit netværk at styre denne app",
"autoPip": "Auto billede-i-billede",
@@ -416,7 +416,7 @@
"setScore": "Angiv en score",
"saved": "Gemt",
"notAvailable": "Intet match fundet",
- "noConnectedTrackers": "Forbind en tracker i Indstillinger for at bedømme der."
+ "noConnectedServices": "Forbind en tjeneste i Indstillinger for at bedømme der."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Biblioteker",
"downloads": "Downloads",
- "liveTv": "Live TV"
+ "liveTv": "Live TV",
+ "explore": "Udforsk"
+ },
+ "explore": {
+ "title": "Udforsk",
+ "selectSource": "Vælg kilde",
+ "rows": {
+ "watchlist": "Ønskeliste",
+ "recommendedMovies": "Anbefalede film",
+ "recommendedShows": "Anbefalede serier",
+ "trendingMovies": "Trending film",
+ "trendingShows": "Trending serier",
+ "popularMovies": "Populære film",
+ "popularShows": "Populære serier",
+ "suggestedAnime": "Foreslået anime",
+ "airingAnime": "Top igangværende anime",
+ "popularAnime": "Mest populære anime",
+ "trending": "Trending",
+ "upcomingMovies": "Kommende film",
+ "upcomingShows": "Kommende serier"
+ },
+ "status": {
+ "airing": "Sendes",
+ "ended": "Afsluttet",
+ "canceled": "Aflyst",
+ "upcoming": "Kommende"
+ },
+ "episodeCount": {
+ "one": "${n} afsnit",
+ "other": "${n} afsnit"
+ },
+ "cast": "Rollebesætning",
+ "characters": "Figurer",
+ "addToWatchlist": "Føj til ønskeliste",
+ "removeFromWatchlist": "Fjern fra ønskeliste",
+ "watchlistUpdateFailed": "Kunne ikke opdatere ønskelisten",
+ "notInLibrary": "Ikke i dit bibliotek",
+ "inTheseLibraries": "I disse biblioteker",
+ "availableOn": "Tilgængelig på ${server}",
+ "checkingLibrary": "Tjekker dit bibliotek...",
+ "emptyTitle": "Der er ikke noget her endnu",
+ "emptyMessage": "Rækker fra ${source} vises her, når de har indhold.",
+ "searchHint": "Søg i ${source}",
+ "searchEmpty": "Ingen resultater for \"${query}\"",
+ "searchPrompt": "Søg efter film og serier på ${source}.",
+ "searchFailed": "Søgningen mislykkedes. Tjek din forbindelse, og prøv igen."
},
"liveTv": {
"title": "Live TV",
@@ -1384,9 +1429,41 @@
"watchedSync": "Synkroniser sét-status",
"watchedSyncDescription": "Når du markerer ting som sét i Plezy, markeres de også på Trakt."
},
- "trackers": {
- "title": "Trackere",
- "hubSubtitle": "Synkroniser afspilningsfremskridt med Trakt og andre tjenester.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Forbind Seerr",
+ "serverUrl": "Server-URL",
+ "serverUrlHelper": "Adressen på din Seerr-instans",
+ "checkServer": "Fortsæt",
+ "signInWithJellyfin": "Log ind med Jellyfin",
+ "signInWithEmby": "Log ind med Emby",
+ "signInWithLocal": "Brug en lokal konto",
+ "email": "E-mail",
+ "noSignInMethods": "Denne Seerr-instans tilbyder ingen loginmetode, som Plezy understøtter.",
+ "instance": "Instans",
+ "disconnectConfirm": "Afbryd Seerr?",
+ "disconnectConfirmBody": "Plezy glemmer denne Seerr-instans. Tilslut igen når som helst.",
+ "request": "Anmod",
+ "request4k": "Anmod i 4K",
+ "seasons": "Sæsoner",
+ "allSeasons": "Alle sæsoner",
+ "advancedOptions": "Avanceret",
+ "destinationServer": "Destinationsserver",
+ "qualityProfile": "Kvalitetsprofil",
+ "rootFolder": "Rodmappe",
+ "languageProfile": "Sprogprofil",
+ "requestSubmitted": "Anmodning sendt",
+ "requestFailed": "Anmodning mislykkedes: ${error}",
+ "requestsLoadFailed": "Kunne ikke indlæse anmodningsmuligheder",
+ "nothingToRequest": "Alt er allerede tilgængeligt eller anmodet.",
+ "statusAvailable": "Tilgængelig",
+ "statusPartiallyAvailable": "Delvist tilgængelig",
+ "statusRequested": "Anmodet",
+ "statusProcessing": "Behandler"
+ },
+ "services": {
+ "title": "Tjenester",
+ "hubSubtitle": "Synkroniser dit visningsfremskridt, og anmod om nye titler.",
"notConnected": "Ikke forbundet",
"connectedAs": "Forbundet som @${username}",
"scrobble": "Registrer fremgang automatisk",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Afbryd ${service}?",
"disconnectConfirmBody": "Plezy stopper med at opdatere ${service}. Tilslut igen når som helst.",
"connectFailed": "Kunne ikke forbinde til ${service}. Prøv igen.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Aktiver Plezy på ${service}",
diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json
index 13a6b087..187c15d5 100644
--- a/lib/i18n/de.i18n.json
+++ b/lib/i18n/de.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Zeige auf Discord, was du gerade schaust",
"trakt": "Trakt",
"traktDescription": "Wiedergabeverlauf mit Trakt synchronisieren",
- "trackers": "Tracker",
- "trackersDescription": "Fortschritt mit Trakt, MyAnimeList, AniList und Simkl synchronisieren",
+ "services": "Dienste",
+ "servicesDescription": "Trakt, MyAnimeList, Seerr und mehr verbinden",
"companionRemoteServer": "Companion Remote Server",
"companionRemoteServerDescription": "Mobilgeräten in deinem Netzwerk erlauben, diese App zu steuern",
"autoPip": "Automatisches Bild-in-Bild",
@@ -416,7 +416,7 @@
"setScore": "Eine Wertung festlegen",
"saved": "Gespeichert",
"notAvailable": "Keine Übereinstimmung gefunden",
- "noConnectedTrackers": "Verbinde einen Tracker in den Einstellungen, um dort zu bewerten."
+ "noConnectedServices": "Verbinde einen Dienst in den Einstellungen, um dort zu bewerten."
},
"accessibility": {
"mediaCardMovie": "${title}, Film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Medien",
"downloads": "Downloads",
- "liveTv": "Live-TV"
+ "liveTv": "Live-TV",
+ "explore": "Erkunden"
+ },
+ "explore": {
+ "title": "Erkunden",
+ "selectSource": "Quelle auswählen",
+ "rows": {
+ "watchlist": "Merkliste",
+ "recommendedMovies": "Empfohlene Filme",
+ "recommendedShows": "Empfohlene Serien",
+ "trendingMovies": "Angesagte Filme",
+ "trendingShows": "Angesagte Serien",
+ "popularMovies": "Beliebte Filme",
+ "popularShows": "Beliebte Serien",
+ "suggestedAnime": "Vorgeschlagene Anime",
+ "airingAnime": "Top laufende Anime",
+ "popularAnime": "Beliebteste Anime",
+ "trending": "Angesagt",
+ "upcomingMovies": "Kommende Filme",
+ "upcomingShows": "Kommende Serien"
+ },
+ "status": {
+ "airing": "Laufend",
+ "ended": "Beendet",
+ "canceled": "Abgesetzt",
+ "upcoming": "Demnächst"
+ },
+ "episodeCount": {
+ "one": "${n} Folge",
+ "other": "${n} Folgen"
+ },
+ "cast": "Besetzung",
+ "characters": "Charaktere",
+ "addToWatchlist": "Zur Merkliste hinzufügen",
+ "removeFromWatchlist": "Von Merkliste entfernen",
+ "watchlistUpdateFailed": "Merkliste konnte nicht aktualisiert werden",
+ "notInLibrary": "Nicht in deiner Mediathek",
+ "inTheseLibraries": "In diesen Mediatheken",
+ "availableOn": "Verfügbar auf ${server}",
+ "checkingLibrary": "Deine Mediathek wird überprüft...",
+ "emptyTitle": "Hier ist noch nichts",
+ "emptyMessage": "Zeilen aus ${source} erscheinen hier, sobald sie Inhalte enthalten.",
+ "searchHint": "${source} durchsuchen",
+ "searchEmpty": "Keine Ergebnisse für \"${query}\"",
+ "searchPrompt": "Suche nach Filmen und Serien auf ${source}.",
+ "searchFailed": "Suche fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut."
},
"liveTv": {
"title": "Live-TV",
@@ -1384,9 +1429,41 @@
"watchedSync": "Gesehen-Status synchronisieren",
"watchedSyncDescription": "Wenn du Inhalte in Plezy als gesehen markierst, werden sie auch auf Trakt markiert."
},
- "trackers": {
- "title": "Tracker",
- "hubSubtitle": "Wiedergabefortschritt mit Trakt und anderen Diensten synchronisieren.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Seerr verbinden",
+ "serverUrl": "Server-URL",
+ "serverUrlHelper": "Die Adresse deiner Seerr-Instanz",
+ "checkServer": "Weiter",
+ "signInWithJellyfin": "Mit Jellyfin anmelden",
+ "signInWithEmby": "Mit Emby anmelden",
+ "signInWithLocal": "Lokales Konto verwenden",
+ "email": "E-Mail",
+ "noSignInMethods": "Diese Seerr-Instanz bietet keine von Plezy unterstützte Anmeldemethode.",
+ "instance": "Instanz",
+ "disconnectConfirm": "Seerr trennen?",
+ "disconnectConfirmBody": "Plezy vergisst diese Seerr-Instanz. Jederzeit erneut verbinden.",
+ "request": "Anfragen",
+ "request4k": "In 4K anfragen",
+ "seasons": "Staffeln",
+ "allSeasons": "Alle Staffeln",
+ "advancedOptions": "Erweitert",
+ "destinationServer": "Zielserver",
+ "qualityProfile": "Qualitätsprofil",
+ "rootFolder": "Stammordner",
+ "languageProfile": "Sprachprofil",
+ "requestSubmitted": "Anfrage gesendet",
+ "requestFailed": "Anfrage fehlgeschlagen: ${error}",
+ "requestsLoadFailed": "Anfrageoptionen konnten nicht geladen werden",
+ "nothingToRequest": "Alles ist bereits verfügbar oder angefragt.",
+ "statusAvailable": "Verfügbar",
+ "statusPartiallyAvailable": "Teilweise verfügbar",
+ "statusRequested": "Angefragt",
+ "statusProcessing": "Wird verarbeitet"
+ },
+ "services": {
+ "title": "Dienste",
+ "hubSubtitle": "Wiedergabefortschritt synchronisieren und neue Titel anfragen.",
"notConnected": "Nicht verbunden",
"connectedAs": "Verbunden als @${username}",
"scrobble": "Fortschritt automatisch verfolgen",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "${service} trennen?",
"disconnectConfirmBody": "Plezy aktualisiert ${service} nicht mehr. Jederzeit erneut verbinden.",
"connectFailed": "Verbindung zu ${service} fehlgeschlagen. Versuche es erneut.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Plezy auf ${service} aktivieren",
diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json
index 0770a903..3d0021fd 100644
--- a/lib/i18n/en.i18n.json
+++ b/lib/i18n/en.i18n.json
@@ -253,8 +253,8 @@
"discordRichPresenceDescription": "Show what you're watching on Discord",
"trakt": "Trakt",
"traktDescription": "Sync watch history with Trakt",
- "trackers": "Trackers",
- "trackersDescription": "Sync progress to Trakt, MyAnimeList, AniList, and Simkl",
+ "services": "Services",
+ "servicesDescription": "Connect Trakt, MyAnimeList, Seerr, and more",
"manageLibrariesDescription": "Reorder and hide libraries",
"companionRemoteServer": "Companion Remote Server",
"companionRemoteServerDescription": "Allow mobile devices on your network to control this app",
@@ -425,7 +425,7 @@
"favorited": "Favorited",
"saved": "Saved",
"notAvailable": "No match found",
- "noConnectedTrackers": "Connect a tracker in Settings to rate there."
+ "noConnectedServices": "Connect a service in Settings to rate there."
},
"accessibility": {
"mediaCardMovie": "${title}, movie",
@@ -854,7 +854,52 @@
"navigation": {
"libraries": "Libraries",
"downloads": "Downloads",
- "liveTv": "Live TV"
+ "liveTv": "Live TV",
+ "explore": "Explore"
+ },
+ "explore": {
+ "title": "Explore",
+ "selectSource": "Select source",
+ "rows": {
+ "watchlist": "Watchlist",
+ "recommendedMovies": "Recommended Movies",
+ "recommendedShows": "Recommended Shows",
+ "trendingMovies": "Trending Movies",
+ "trendingShows": "Trending Shows",
+ "popularMovies": "Popular Movies",
+ "popularShows": "Popular Shows",
+ "suggestedAnime": "Suggested Anime",
+ "airingAnime": "Top Airing Anime",
+ "popularAnime": "Most Popular Anime",
+ "trending": "Trending",
+ "upcomingMovies": "Upcoming Movies",
+ "upcomingShows": "Upcoming Shows"
+ },
+ "status": {
+ "airing": "Airing",
+ "ended": "Ended",
+ "canceled": "Canceled",
+ "upcoming": "Upcoming"
+ },
+ "episodeCount": {
+ "one": "${n} episode",
+ "other": "${n} episodes"
+ },
+ "cast": "Cast",
+ "characters": "Characters",
+ "addToWatchlist": "Add to Watchlist",
+ "removeFromWatchlist": "Remove from Watchlist",
+ "watchlistUpdateFailed": "Couldn't update watchlist",
+ "notInLibrary": "Not in your library",
+ "inTheseLibraries": "In these libraries",
+ "availableOn": "Available on ${server}",
+ "checkingLibrary": "Checking your library...",
+ "emptyTitle": "Nothing here yet",
+ "emptyMessage": "Rows from ${source} will appear here once they have content.",
+ "searchHint": "Search ${source}",
+ "searchEmpty": "No results for \"${query}\"",
+ "searchPrompt": "Search for movies and shows on ${source}.",
+ "searchFailed": "Search failed. Check your connection and try again."
},
"liveTv": {
"title": "Live TV",
@@ -1399,9 +1444,41 @@
"watchedSync": "Sync watched status",
"watchedSyncDescription": "When you mark items watched in Plezy, mark them on Trakt."
},
- "trackers": {
- "title": "Trackers",
- "hubSubtitle": "Sync watch progress with Trakt and other services.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Connect Seerr",
+ "serverUrl": "Server URL",
+ "serverUrlHelper": "The address of your Seerr instance",
+ "checkServer": "Continue",
+ "signInWithJellyfin": "Sign in with Jellyfin",
+ "signInWithEmby": "Sign in with Emby",
+ "signInWithLocal": "Use a local account",
+ "email": "Email",
+ "noSignInMethods": "This Seerr instance offers no sign-in method Plezy supports.",
+ "instance": "Instance",
+ "disconnectConfirm": "Disconnect Seerr?",
+ "disconnectConfirmBody": "Plezy will forget this Seerr instance. Reconnect any time.",
+ "request": "Request",
+ "request4k": "Request in 4K",
+ "seasons": "Seasons",
+ "allSeasons": "All seasons",
+ "advancedOptions": "Advanced",
+ "destinationServer": "Destination server",
+ "qualityProfile": "Quality profile",
+ "rootFolder": "Root folder",
+ "languageProfile": "Language profile",
+ "requestSubmitted": "Request submitted",
+ "requestFailed": "Request failed: ${error}",
+ "requestsLoadFailed": "Couldn't load request options",
+ "nothingToRequest": "Everything is already available or requested.",
+ "statusAvailable": "Available",
+ "statusPartiallyAvailable": "Partially available",
+ "statusRequested": "Requested",
+ "statusProcessing": "Processing"
+ },
+ "services": {
+ "title": "Services",
+ "hubSubtitle": "Sync watch progress and request new titles.",
"notConnected": "Not connected",
"connectedAs": "Connected as @${username}",
"scrobble": "Track progress automatically",
@@ -1409,10 +1486,11 @@
"disconnectConfirm": "Disconnect ${service}?",
"disconnectConfirmBody": "Plezy will stop updating ${service}. Reconnect any time.",
"connectFailed": "Couldn't connect to ${service}. Try again.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Activate Plezy on ${service}",
diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json
index 30330f9c..c5879599 100644
--- a/lib/i18n/es.i18n.json
+++ b/lib/i18n/es.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Mostrar lo que estás viendo en Discord",
"trakt": "Trakt",
"traktDescription": "Sincronizar historial de visualización con Trakt",
- "trackers": "Rastreadores",
- "trackersDescription": "Sincronizar progreso con Trakt, MyAnimeList, AniList y Simkl",
+ "services": "Servicios",
+ "servicesDescription": "Conecta Trakt, MyAnimeList, Seerr y más",
"companionRemoteServer": "Servidor de control remoto",
"companionRemoteServerDescription": "Permitir que dispositivos móviles en tu red controlen esta aplicación",
"autoPip": "Imagen en imagen automática",
@@ -416,7 +416,7 @@
"setScore": "Establecer puntuación",
"saved": "Guardado",
"notAvailable": "No se encontró coincidencia",
- "noConnectedTrackers": "Conecta un tracker en Ajustes para calificar allí."
+ "noConnectedServices": "Conecta un servicio en Configuración para calificar ahí."
},
"accessibility": {
"mediaCardMovie": "${title}, película",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Medios",
"downloads": "Descargas",
- "liveTv": "TV en vivo"
+ "liveTv": "TV en vivo",
+ "explore": "Explorar"
+ },
+ "explore": {
+ "title": "Explorar",
+ "selectSource": "Seleccionar fuente",
+ "rows": {
+ "watchlist": "Lista de seguimiento",
+ "recommendedMovies": "Películas recomendadas",
+ "recommendedShows": "Series recomendadas",
+ "trendingMovies": "Películas en tendencia",
+ "trendingShows": "Series en tendencia",
+ "popularMovies": "Películas populares",
+ "popularShows": "Series populares",
+ "suggestedAnime": "Anime sugerido",
+ "airingAnime": "Mejor anime en emisión",
+ "popularAnime": "Anime más popular",
+ "trending": "Tendencias",
+ "upcomingMovies": "Próximas películas",
+ "upcomingShows": "Próximas series"
+ },
+ "status": {
+ "airing": "En emisión",
+ "ended": "Finalizada",
+ "canceled": "Cancelada",
+ "upcoming": "Próximamente"
+ },
+ "episodeCount": {
+ "one": "${n} episodio",
+ "other": "${n} episodios"
+ },
+ "cast": "Reparto",
+ "characters": "Personajes",
+ "addToWatchlist": "Añadir a la lista de seguimiento",
+ "removeFromWatchlist": "Quitar de la lista de seguimiento",
+ "watchlistUpdateFailed": "No se pudo actualizar la lista de seguimiento",
+ "notInLibrary": "No está en tu biblioteca",
+ "inTheseLibraries": "En estas bibliotecas",
+ "availableOn": "Disponible en ${server}",
+ "checkingLibrary": "Comprobando tu biblioteca...",
+ "emptyTitle": "Aquí no hay nada todavía",
+ "emptyMessage": "Las filas de ${source} aparecerán aquí cuando tengan contenido.",
+ "searchHint": "Buscar en ${source}",
+ "searchEmpty": "Sin resultados para \"${query}\"",
+ "searchPrompt": "Busca películas y series en ${source}.",
+ "searchFailed": "La búsqueda falló. Comprueba tu conexión e inténtalo de nuevo."
},
"liveTv": {
"title": "TV en vivo",
@@ -1384,9 +1429,41 @@
"watchedSync": "Sincronizar estado de visto",
"watchedSyncDescription": "Cuando marques elementos como vistos en Plezy, también se marcarán en Trakt."
},
- "trackers": {
- "title": "Rastreadores",
- "hubSubtitle": "Sincroniza el progreso de visualización con Trakt y otros servicios.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Conectar Seerr",
+ "serverUrl": "URL del servidor",
+ "serverUrlHelper": "La dirección de tu instancia de Seerr",
+ "checkServer": "Continuar",
+ "signInWithJellyfin": "Iniciar sesión con Jellyfin",
+ "signInWithEmby": "Iniciar sesión con Emby",
+ "signInWithLocal": "Usar una cuenta local",
+ "email": "Correo electrónico",
+ "noSignInMethods": "Esta instancia de Seerr no ofrece ningún método de inicio de sesión compatible con Plezy.",
+ "instance": "Instancia",
+ "disconnectConfirm": "¿Desconectar Seerr?",
+ "disconnectConfirmBody": "Plezy olvidará esta instancia de Seerr. Reconecta cuando quieras.",
+ "request": "Solicitar",
+ "request4k": "Solicitar en 4K",
+ "seasons": "Temporadas",
+ "allSeasons": "Todas las temporadas",
+ "advancedOptions": "Avanzado",
+ "destinationServer": "Servidor de destino",
+ "qualityProfile": "Perfil de calidad",
+ "rootFolder": "Carpeta raíz",
+ "languageProfile": "Perfil de idioma",
+ "requestSubmitted": "Solicitud enviada",
+ "requestFailed": "La solicitud falló: ${error}",
+ "requestsLoadFailed": "No se pudieron cargar las opciones de solicitud",
+ "nothingToRequest": "Todo ya está disponible o solicitado.",
+ "statusAvailable": "Disponible",
+ "statusPartiallyAvailable": "Parcialmente disponible",
+ "statusRequested": "Solicitado",
+ "statusProcessing": "Procesando"
+ },
+ "services": {
+ "title": "Servicios",
+ "hubSubtitle": "Sincroniza tu progreso de visualización y solicita nuevos títulos.",
"notConnected": "No conectado",
"connectedAs": "Conectado como @${username}",
"scrobble": "Registrar progreso automáticamente",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "¿Desconectar ${service}?",
"disconnectConfirmBody": "Plezy dejará de actualizar ${service}. Reconecta cuando quieras.",
"connectFailed": "No se pudo conectar a ${service}. Inténtalo de nuevo.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Activar Plezy en ${service}",
diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json
index cae0cf4f..02e1ad1a 100644
--- a/lib/i18n/fr.i18n.json
+++ b/lib/i18n/fr.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Montrez ce que vous regardez sur Discord",
"trakt": "Trakt",
"traktDescription": "Synchroniser l'historique de visionnage avec Trakt",
- "trackers": "Trackers",
- "trackersDescription": "Synchroniser la progression avec Trakt, MyAnimeList, AniList et Simkl",
+ "services": "Services",
+ "servicesDescription": "Connectez Trakt, MyAnimeList, Seerr et plus",
"companionRemoteServer": "Serveur de télécommande",
"companionRemoteServerDescription": "Autoriser les appareils mobiles de votre réseau à contrôler cette application",
"autoPip": "Image dans l'image automatique",
@@ -416,7 +416,7 @@
"setScore": "Définir une note",
"saved": "Enregistré",
"notAvailable": "Aucune correspondance trouvée",
- "noConnectedTrackers": "Connectez un tracker dans Paramètres pour y noter."
+ "noConnectedServices": "Connectez un service dans les Réglages pour noter ici."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Medias",
"downloads": "Téléch.",
- "liveTv": "TV direct"
+ "liveTv": "TV direct",
+ "explore": "Explorer"
+ },
+ "explore": {
+ "title": "Explorer",
+ "selectSource": "Sélectionner la source",
+ "rows": {
+ "watchlist": "Liste de suivi",
+ "recommendedMovies": "Films recommandés",
+ "recommendedShows": "Show TV recommandés",
+ "trendingMovies": "Films tendance",
+ "trendingShows": "Show TV tendance",
+ "popularMovies": "Films populaires",
+ "popularShows": "Show TV populaires",
+ "suggestedAnime": "Anime suggérés",
+ "airingAnime": "Meilleurs anime en diffusion",
+ "popularAnime": "Anime les plus populaires",
+ "trending": "Tendances",
+ "upcomingMovies": "Films à venir",
+ "upcomingShows": "Show TV à venir"
+ },
+ "status": {
+ "airing": "En cours",
+ "ended": "Terminée",
+ "canceled": "Annulée",
+ "upcoming": "À venir"
+ },
+ "episodeCount": {
+ "one": "${n} épisode",
+ "other": "${n} épisodes"
+ },
+ "cast": "Cast",
+ "characters": "Personnages",
+ "addToWatchlist": "Ajouter à la liste de suivi",
+ "removeFromWatchlist": "Retirer de la liste de suivi",
+ "watchlistUpdateFailed": "Impossible de mettre à jour la liste de suivi",
+ "notInLibrary": "Absent de votre bibliothèque",
+ "inTheseLibraries": "Dans ces bibliothèques",
+ "availableOn": "Disponible sur ${server}",
+ "checkingLibrary": "Vérification de votre bibliothèque...",
+ "emptyTitle": "Rien ici pour l'instant",
+ "emptyMessage": "Les rangées de ${source} apparaîtront ici une fois qu'elles auront du contenu.",
+ "searchHint": "Rechercher dans ${source}",
+ "searchEmpty": "Aucun résultat pour \"${query}\"",
+ "searchPrompt": "Recherchez des films et des séries sur ${source}.",
+ "searchFailed": "Échec de la recherche. Vérifiez votre connexion et réessayez."
},
"liveTv": {
"title": "TV en direct",
@@ -1384,9 +1429,41 @@
"watchedSync": "Synchroniser le statut « vu »",
"watchedSyncDescription": "Lorsque vous marquez un élément comme vu dans Plezy, il l'est aussi sur Trakt."
},
- "trackers": {
- "title": "Trackers",
- "hubSubtitle": "Synchronisez la progression de visionnage avec Trakt et d'autres services.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Connecter Seerr",
+ "serverUrl": "URL du serveur",
+ "serverUrlHelper": "L'adresse de votre instance Seerr",
+ "checkServer": "Continuer",
+ "signInWithJellyfin": "Se connecter avec Jellyfin",
+ "signInWithEmby": "Se connecter avec Emby",
+ "signInWithLocal": "Utiliser un compte local",
+ "email": "E-mail",
+ "noSignInMethods": "Cette instance Seerr ne propose aucune méthode de connexion prise en charge par Plezy.",
+ "instance": "Instance",
+ "disconnectConfirm": "Déconnecter Seerr ?",
+ "disconnectConfirmBody": "Plezy oubliera cette instance Seerr. Reconnectez à tout moment.",
+ "request": "Demander",
+ "request4k": "Demander en 4K",
+ "seasons": "Saisons",
+ "allSeasons": "Toutes les saisons",
+ "advancedOptions": "Avancé",
+ "destinationServer": "Serveur de destination",
+ "qualityProfile": "Profil de qualité",
+ "rootFolder": "Dossier racine",
+ "languageProfile": "Profil de langue",
+ "requestSubmitted": "Demande envoyée",
+ "requestFailed": "Échec de la demande : ${error}",
+ "requestsLoadFailed": "Impossible de charger les options de demande",
+ "nothingToRequest": "Tout est déjà disponible ou demandé.",
+ "statusAvailable": "Disponible",
+ "statusPartiallyAvailable": "Partiellement disponible",
+ "statusRequested": "Demandé",
+ "statusProcessing": "En cours de traitement"
+ },
+ "services": {
+ "title": "Services",
+ "hubSubtitle": "Synchronisez votre progression et demandez de nouveaux titres.",
"notConnected": "Non connecté",
"connectedAs": "Connecté en tant que @${username}",
"scrobble": "Suivre la progression automatiquement",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Déconnecter ${service} ?",
"disconnectConfirmBody": "Plezy cessera de mettre à jour ${service}. Reconnectez à tout moment.",
"connectFailed": "Échec de la connexion à ${service}. Réessayez.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Activer Plezy sur ${service}",
diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json
index c80ab341..382ca06f 100644
--- a/lib/i18n/it.i18n.json
+++ b/lib/i18n/it.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Mostra su Discord cosa stai guardando",
"trakt": "Trakt",
"traktDescription": "Sincronizza la cronologia di visione con Trakt",
- "trackers": "Tracker",
- "trackersDescription": "Sincronizza i progressi con Trakt, MyAnimeList, AniList e Simkl",
+ "services": "Servizi",
+ "servicesDescription": "Connetti Trakt, MyAnimeList, Seerr e altro",
"companionRemoteServer": "Server telecomando",
"companionRemoteServerDescription": "Consenti ai dispositivi mobili nella tua rete di controllare questa app",
"autoPip": "Picture-in-Picture automatico",
@@ -416,7 +416,7 @@
"setScore": "Imposta un punteggio",
"saved": "Salvato",
"notAvailable": "Nessuna corrispondenza trovata",
- "noConnectedTrackers": "Collega un tracker in Impostazioni per valutarlo lì."
+ "noConnectedServices": "Connetti un servizio nelle Impostazioni per valutare lì."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Librerie",
"downloads": "Download",
- "liveTv": "TV Live"
+ "liveTv": "TV Live",
+ "explore": "Scopri"
+ },
+ "explore": {
+ "title": "Scopri",
+ "selectSource": "Seleziona fonte",
+ "rows": {
+ "watchlist": "Watchlist",
+ "recommendedMovies": "Film consigliati",
+ "recommendedShows": "Serie TV consigliate",
+ "trendingMovies": "Film di tendenza",
+ "trendingShows": "Serie TV di tendenza",
+ "popularMovies": "Film popolari",
+ "popularShows": "Serie TV popolari",
+ "suggestedAnime": "Anime suggeriti",
+ "airingAnime": "Migliori anime in onda",
+ "popularAnime": "Anime più popolari",
+ "trending": "Di tendenza",
+ "upcomingMovies": "Film in arrivo",
+ "upcomingShows": "Serie TV in arrivo"
+ },
+ "searchHint": "Cerca su ${source}",
+ "searchEmpty": "Nessun risultato per \"${query}\"",
+ "searchPrompt": "Cerca film e serie TV su ${source}.",
+ "searchFailed": "Ricerca fallita. Controlla la connessione e riprova.",
+ "status": {
+ "airing": "In onda",
+ "ended": "Conclusa",
+ "canceled": "Cancellata",
+ "upcoming": "In arrivo"
+ },
+ "episodeCount": {
+ "one": "${n} episodio",
+ "other": "${n} episodi"
+ },
+ "cast": "Attori",
+ "characters": "Personaggi",
+ "addToWatchlist": "Aggiungi alla Watchlist",
+ "removeFromWatchlist": "Rimuovi dalla Watchlist",
+ "watchlistUpdateFailed": "Impossibile aggiornare la Watchlist",
+ "notInLibrary": "Non è nella tua libreria",
+ "inTheseLibraries": "In queste librerie",
+ "availableOn": "Disponibile su ${server}",
+ "checkingLibrary": "Controllo della tua libreria...",
+ "emptyTitle": "Ancora niente qui",
+ "emptyMessage": "Le righe da ${source} appariranno qui una volta che avranno dei contenuti."
},
"liveTv": {
"title": "TV in diretta",
@@ -1384,9 +1429,41 @@
"watchedSync": "Sincronizza stato visualizzato",
"watchedSyncDescription": "Quando segni elementi come visti in Plezy, vengono segnati anche su Trakt."
},
- "trackers": {
- "title": "Tracker",
- "hubSubtitle": "Sincronizza l'avanzamento di visione con Trakt e altri servizi.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Connetti Seerr",
+ "serverUrl": "URL del server",
+ "serverUrlHelper": "L'indirizzo della tua istanza Seerr",
+ "checkServer": "Continua",
+ "signInWithJellyfin": "Accedi con Jellyfin",
+ "signInWithEmby": "Accedi con Emby",
+ "signInWithLocal": "Usa un account locale",
+ "email": "Email",
+ "noSignInMethods": "Questa istanza Seerr non offre alcun metodo di accesso supportato da Plezy.",
+ "instance": "Istanza",
+ "disconnectConfirm": "Disconnettere Seerr?",
+ "disconnectConfirmBody": "Plezy dimenticherà questa istanza Seerr. Riconnetti quando vuoi.",
+ "request": "Richiedi",
+ "request4k": "Richiedi in 4K",
+ "seasons": "Stagioni",
+ "allSeasons": "Tutte le stagioni",
+ "advancedOptions": "Avanzate",
+ "destinationServer": "Server di destinazione",
+ "qualityProfile": "Profilo qualità",
+ "rootFolder": "Cartella radice",
+ "languageProfile": "Profilo lingua",
+ "requestSubmitted": "Richiesta inviata",
+ "requestFailed": "Richiesta non riuscita: ${error}",
+ "requestsLoadFailed": "Impossibile caricare le opzioni di richiesta",
+ "nothingToRequest": "Tutto è già disponibile o richiesto.",
+ "statusAvailable": "Disponibile",
+ "statusPartiallyAvailable": "Parzialmente disponibile",
+ "statusRequested": "Richiesto",
+ "statusProcessing": "In elaborazione"
+ },
+ "services": {
+ "title": "Servizi",
+ "hubSubtitle": "Sincronizza i progressi di visione e richiedi nuovi titoli.",
"notConnected": "Non connesso",
"connectedAs": "Connesso come @${username}",
"scrobble": "Traccia i progressi automaticamente",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Disconnettere ${service}?",
"disconnectConfirmBody": "Plezy smetterà di aggiornare ${service}. Riconnetti quando vuoi.",
"connectFailed": "Impossibile connettersi a ${service}. Riprova.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Attiva Plezy su ${service}",
diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json
index 56d29cd1..5712a85e 100644
--- a/lib/i18n/ja.i18n.json
+++ b/lib/i18n/ja.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Discordで視聴中の内容を表示",
"trakt": "Trakt",
"traktDescription": "視聴履歴を Trakt と同期",
- "trackers": "トラッカー",
- "trackersDescription": "進捗を Trakt、MyAnimeList、AniList、Simkl と同期",
+ "services": "サービス",
+ "servicesDescription": "Trakt、MyAnimeList、Seerr などを接続",
"companionRemoteServer": "コンパニオンリモートサーバー",
"companionRemoteServerDescription": "ネットワーク上のモバイルデバイスからこのアプリを操作できるようにする",
"autoPip": "自動ピクチャーインピクチャー",
@@ -416,7 +416,7 @@
"setScore": "スコアを設定",
"saved": "保存済み",
"notAvailable": "一致なし",
- "noConnectedTrackers": "設定でトラッカーを接続すると、そこで評価できます。"
+ "noConnectedServices": "評価するには、設定でサービスを接続してください。"
},
"accessibility": {
"mediaCardMovie": "${title}、映画",
@@ -842,7 +842,51 @@
"navigation": {
"libraries": "ライブラリ",
"downloads": "ダウンロード",
- "liveTv": "ライブTV"
+ "liveTv": "ライブTV",
+ "explore": "探索"
+ },
+ "explore": {
+ "title": "探索",
+ "selectSource": "ソースを選択",
+ "rows": {
+ "watchlist": "ウォッチリスト",
+ "recommendedMovies": "おすすめの映画",
+ "recommendedShows": "おすすめのテレビ番組",
+ "trendingMovies": "トレンドの映画",
+ "trendingShows": "トレンドのテレビ番組",
+ "popularMovies": "人気の映画",
+ "popularShows": "人気のテレビ番組",
+ "suggestedAnime": "おすすめのアニメ",
+ "airingAnime": "放送中の注目アニメ",
+ "popularAnime": "人気のアニメ",
+ "trending": "トレンド",
+ "upcomingMovies": "近日公開の映画",
+ "upcomingShows": "放送予定の番組"
+ },
+ "searchHint": "${source} で検索",
+ "searchEmpty": "「${query}」の結果が見つかりません",
+ "searchPrompt": "${source} で映画やテレビ番組を検索します。",
+ "searchFailed": "検索に失敗しました。接続を確認してもう一度お試しください。",
+ "status": {
+ "airing": "放送中",
+ "ended": "放送終了",
+ "canceled": "打ち切り",
+ "upcoming": "放送予定"
+ },
+ "episodeCount": {
+ "other": "${n} 話"
+ },
+ "cast": "キャスト",
+ "characters": "キャラクター",
+ "addToWatchlist": "ウォッチリストに追加",
+ "removeFromWatchlist": "ウォッチリストから削除",
+ "watchlistUpdateFailed": "ウォッチリストを更新できませんでした",
+ "notInLibrary": "ライブラリにありません",
+ "inTheseLibraries": "これらのライブラリにあります",
+ "availableOn": "${server}で視聴可能",
+ "checkingLibrary": "ライブラリを確認中...",
+ "emptyTitle": "まだ何もありません",
+ "emptyMessage": "${source}にコンテンツが追加されると、ここに表示されます。"
},
"liveTv": {
"title": "ライブTV",
@@ -1383,9 +1427,41 @@
"watchedSync": "視聴済みステータスを同期",
"watchedSyncDescription": "Plezy で項目を視聴済みにすると、Trakt でも視聴済みになります。"
},
- "trackers": {
- "title": "トラッカー",
- "hubSubtitle": "視聴進捗をTraktや他のサービスと同期します。",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Seerrに接続",
+ "serverUrl": "サーバー URL",
+ "serverUrlHelper": "Seerr インスタンスのアドレス",
+ "checkServer": "続ける",
+ "signInWithJellyfin": "Jellyfinでサインイン",
+ "signInWithEmby": "Embyでサインイン",
+ "signInWithLocal": "ローカルアカウントを使う",
+ "email": "メールアドレス",
+ "noSignInMethods": "この Seerr インスタンスには Plezy が対応しているサインイン方法がありません。",
+ "instance": "インスタンス",
+ "disconnectConfirm": "Seerr の接続を解除しますか?",
+ "disconnectConfirmBody": "Plezy はこの Seerr インスタンスの情報を削除します。いつでも再接続できます。",
+ "request": "リクエスト",
+ "request4k": "4K でリクエスト",
+ "seasons": "シーズン",
+ "allSeasons": "全シーズン",
+ "advancedOptions": "詳細",
+ "destinationServer": "宛先サーバー",
+ "qualityProfile": "画質プロファイル",
+ "rootFolder": "ルートフォルダ",
+ "languageProfile": "言語プロファイル",
+ "requestSubmitted": "リクエストを送信しました",
+ "requestFailed": "リクエストに失敗しました: ${error}",
+ "requestsLoadFailed": "リクエストオプションを読み込めませんでした",
+ "nothingToRequest": "すべてすでに利用可能またはリクエスト済みです。",
+ "statusAvailable": "利用可能",
+ "statusPartiallyAvailable": "一部利用可能",
+ "statusRequested": "リクエスト済み",
+ "statusProcessing": "処理中"
+ },
+ "services": {
+ "title": "サービス",
+ "hubSubtitle": "視聴の進捗を同期して、新しいタイトルをリクエストします。",
"notConnected": "未接続",
"connectedAs": "@${username} として接続済み",
"scrobble": "進捗を自動で記録",
@@ -1393,10 +1469,11 @@
"disconnectConfirm": "${service} の接続を解除しますか?",
"disconnectConfirmBody": "Plezyは${service}の更新を停止します。いつでも再接続できます。",
"connectFailed": "${service} に接続できませんでした。もう一度お試しください。",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "${service} で Plezy を有効化",
diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json
index 01f27493..a04ea8e8 100644
--- a/lib/i18n/ko.i18n.json
+++ b/lib/i18n/ko.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Discord에서 시청 중인 콘텐츠 표시",
"trakt": "Trakt",
"traktDescription": "Trakt와 시청 기록 동기화",
- "trackers": "트래커",
- "trackersDescription": "Trakt, MyAnimeList, AniList 및 Simkl에 진행률 동기화",
+ "services": "서비스",
+ "servicesDescription": "Trakt, MyAnimeList, Seerr 등 연결",
"companionRemoteServer": "컴패니언 리모트 서버",
"companionRemoteServerDescription": "네트워크의 모바일 기기가 이 앱을 제어할 수 있도록 허용",
"autoPip": "자동 PIP 모드",
@@ -416,7 +416,7 @@
"setScore": "점수 설정",
"saved": "저장됨",
"notAvailable": "일치 항목 없음",
- "noConnectedTrackers": "설정에서 트래커를 연결하면 거기에도 평가할 수 있습니다."
+ "noConnectedServices": "평가하려면 설정에서 서비스를 연결하세요."
},
"accessibility": {
"mediaCardMovie": "${title}, 영화",
@@ -842,7 +842,51 @@
"navigation": {
"libraries": "미디어 라이브러리",
"downloads": "다운로드",
- "liveTv": "실시간 TV"
+ "liveTv": "실시간 TV",
+ "explore": "탐색"
+ },
+ "explore": {
+ "title": "탐색",
+ "selectSource": "소스 선택",
+ "rows": {
+ "watchlist": "관심 목록",
+ "recommendedMovies": "추천 영화",
+ "recommendedShows": "추천 TV 프로그램",
+ "trendingMovies": "지금 뜨는 영화",
+ "trendingShows": "지금 뜨는 TV 프로그램",
+ "popularMovies": "인기 영화",
+ "popularShows": "인기 TV 프로그램",
+ "suggestedAnime": "추천 애니메이션",
+ "airingAnime": "방영 중인 인기 애니메이션",
+ "popularAnime": "가장 인기 있는 애니메이션",
+ "trending": "지금 뜨는 콘텐츠",
+ "upcomingMovies": "개봉 예정 영화",
+ "upcomingShows": "방영 예정 TV 프로그램"
+ },
+ "searchHint": "${source}에서 검색",
+ "searchEmpty": "「${query}」에 대한 결과가 없습니다",
+ "searchPrompt": "${source}에서 영화와 TV 프로그램을 검색하세요.",
+ "searchFailed": "검색에 실패했습니다. 연결을 확인하고 다시 시도하세요.",
+ "status": {
+ "airing": "방영 중",
+ "ended": "종영",
+ "canceled": "취소됨",
+ "upcoming": "방영 예정"
+ },
+ "episodeCount": {
+ "other": "${n}화"
+ },
+ "cast": "출연진",
+ "characters": "캐릭터",
+ "addToWatchlist": "관심 목록에 추가",
+ "removeFromWatchlist": "관심 목록에서 제거",
+ "watchlistUpdateFailed": "관심 목록을 업데이트하지 못했습니다",
+ "notInLibrary": "라이브러리에 없음",
+ "inTheseLibraries": "이 라이브러리에 있음",
+ "availableOn": "${server}에서 이용 가능",
+ "checkingLibrary": "라이브러리 확인 중...",
+ "emptyTitle": "아직 아무것도 없습니다",
+ "emptyMessage": "${source}에 콘텐츠가 추가되면 여기에 표시됩니다."
},
"liveTv": {
"title": "실시간 TV",
@@ -1383,9 +1427,41 @@
"watchedSync": "시청 상태 동기화",
"watchedSyncDescription": "Plezy에서 시청 완료로 표시한 항목이 Trakt에도 시청 완료로 표시됩니다."
},
- "trackers": {
- "title": "트래커",
- "hubSubtitle": "시청 진행률을 Trakt 및 다른 서비스와 동기화합니다.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Seerr에 연결",
+ "serverUrl": "서버 URL",
+ "serverUrlHelper": "Seerr 인스턴스의 주소",
+ "checkServer": "계속",
+ "signInWithJellyfin": "Jellyfin으로 로그인",
+ "signInWithEmby": "Emby로 로그인",
+ "signInWithLocal": "로컬 계정 사용",
+ "email": "이메일",
+ "noSignInMethods": "이 Seerr 인스턴스에는 Plezy가 지원하는 로그인 방법이 없습니다.",
+ "instance": "인스턴스",
+ "disconnectConfirm": "Seerr 연결을 해제하시겠습니까?",
+ "disconnectConfirmBody": "Plezy가 이 Seerr 인스턴스를 삭제합니다. 언제든 다시 연결할 수 있습니다.",
+ "request": "요청",
+ "request4k": "4K로 요청",
+ "seasons": "시즌",
+ "allSeasons": "모든 시즌",
+ "advancedOptions": "고급",
+ "destinationServer": "대상 서버",
+ "qualityProfile": "화질 프로파일",
+ "rootFolder": "루트 폴더",
+ "languageProfile": "언어 프로파일",
+ "requestSubmitted": "요청을 제출했습니다",
+ "requestFailed": "요청 실패: ${error}",
+ "requestsLoadFailed": "요청 옵션을 불러올 수 없습니다",
+ "nothingToRequest": "모두 이미 사용 가능하거나 요청되었습니다.",
+ "statusAvailable": "사용 가능",
+ "statusPartiallyAvailable": "일부 사용 가능",
+ "statusRequested": "요청됨",
+ "statusProcessing": "처리 중"
+ },
+ "services": {
+ "title": "서비스",
+ "hubSubtitle": "시청 진행률을 동기화하고 새 작품을 요청하세요.",
"notConnected": "연결되지 않음",
"connectedAs": "@${username} 로 연결됨",
"scrobble": "진행률 자동 추적",
@@ -1393,10 +1469,11 @@
"disconnectConfirm": "${service} 연결을 해제하시겠습니까?",
"disconnectConfirmBody": "Plezy가 ${service} 업데이트를 중지합니다. 언제든 다시 연결할 수 있습니다.",
"connectFailed": "${service}에 연결할 수 없습니다. 다시 시도하세요.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "${service}에서 Plezy 활성화",
diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json
index 8d6672b6..461242e3 100644
--- a/lib/i18n/nb.i18n.json
+++ b/lib/i18n/nb.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Vis hva du ser på Discord",
"trakt": "Trakt",
"traktDescription": "Synkroniser visningshistorikk med Trakt",
- "trackers": "Trackere",
- "trackersDescription": "Synkroniser fremdrift til Trakt, MyAnimeList, AniList og Simkl",
+ "services": "Tjenester",
+ "servicesDescription": "Koble til Trakt, MyAnimeList, Seerr og mer",
"companionRemoteServer": "Companion Remote-server",
"companionRemoteServerDescription": "Tillat mobilenheter på nettverket ditt å styre denne appen",
"autoPip": "Auto bilde-i-bilde",
@@ -416,7 +416,7 @@
"setScore": "Sett en poengsum",
"saved": "Lagret",
"notAvailable": "Ingen treff",
- "noConnectedTrackers": "Koble til en sporer i Innstillinger for å vurdere der."
+ "noConnectedServices": "Koble til en tjeneste i Innstillinger for å vurdere her."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Biblioteker",
"downloads": "Nedlastinger",
- "liveTv": "Direkte-TV"
+ "liveTv": "Direkte-TV",
+ "explore": "Utforsk"
+ },
+ "explore": {
+ "title": "Utforsk",
+ "selectSource": "Velg kilde",
+ "rows": {
+ "watchlist": "Ønskeliste",
+ "recommendedMovies": "Anbefalte filmer",
+ "recommendedShows": "Anbefalte serier",
+ "trendingMovies": "Trending filmer",
+ "trendingShows": "Trending serier",
+ "popularMovies": "Populære filmer",
+ "popularShows": "Populære serier",
+ "suggestedAnime": "Foreslått anime",
+ "airingAnime": "Topp pågående anime",
+ "popularAnime": "Mest populære anime",
+ "trending": "Trending",
+ "upcomingMovies": "Kommende filmer",
+ "upcomingShows": "Kommende serier"
+ },
+ "searchHint": "Søk i ${source}",
+ "searchEmpty": "Ingen treff for \"${query}\"",
+ "searchPrompt": "Søk etter filmer og serier på ${source}.",
+ "searchFailed": "Søk mislyktes. Sjekk tilkoblingen og prøv igjen.",
+ "status": {
+ "airing": "Sendes",
+ "ended": "Avsluttet",
+ "canceled": "Avlyst",
+ "upcoming": "Kommende"
+ },
+ "episodeCount": {
+ "one": "${n} episode",
+ "other": "${n} episoder"
+ },
+ "cast": "Skuespillere",
+ "characters": "Figurer",
+ "addToWatchlist": "Legg til i ønskeliste",
+ "removeFromWatchlist": "Fjern fra ønskeliste",
+ "watchlistUpdateFailed": "Kunne ikke oppdatere ønskelisten",
+ "notInLibrary": "Ikke i biblioteket ditt",
+ "inTheseLibraries": "I disse bibliotekene",
+ "availableOn": "Tilgjengelig på ${server}",
+ "checkingLibrary": "Sjekker biblioteket ditt...",
+ "emptyTitle": "Ingenting her ennå",
+ "emptyMessage": "Rader fra ${source} vises her når de har innhold."
},
"liveTv": {
"title": "Direkte-TV",
@@ -1384,9 +1429,41 @@
"watchedSync": "Synkroniser sett-status",
"watchedSyncDescription": "Når du markerer noe som sett i Plezy, markeres det også på Trakt."
},
- "trackers": {
- "title": "Trackere",
- "hubSubtitle": "Synkroniser seerfremdrift med Trakt og andre tjenester.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Koble til Seerr",
+ "serverUrl": "Server-URL",
+ "serverUrlHelper": "Adressen til Seerr-instansen din",
+ "checkServer": "Fortsett",
+ "signInWithJellyfin": "Logg inn med Jellyfin",
+ "signInWithEmby": "Logg inn med Emby",
+ "signInWithLocal": "Bruk en lokal konto",
+ "email": "E-post",
+ "noSignInMethods": "Denne Seerr-instansen tilbyr ingen innloggingsmetode som Plezy støtter.",
+ "instance": "Instans",
+ "disconnectConfirm": "Koble fra Seerr?",
+ "disconnectConfirmBody": "Plezy glemmer denne Seerr-instansen. Koble til igjen når som helst.",
+ "request": "Forespør",
+ "request4k": "Forespør i 4K",
+ "seasons": "Sesonger",
+ "allSeasons": "Alle sesonger",
+ "advancedOptions": "Avansert",
+ "destinationServer": "Målserver",
+ "qualityProfile": "Kvalitetsprofil",
+ "rootFolder": "Rotmappe",
+ "languageProfile": "Språkprofil",
+ "requestSubmitted": "Forespørsel sendt",
+ "requestFailed": "Forespørsel mislyktes: ${error}",
+ "requestsLoadFailed": "Kunne ikke laste forespørselsalternativer",
+ "nothingToRequest": "Alt er allerede tilgjengelig eller forespurt.",
+ "statusAvailable": "Tilgjengelig",
+ "statusPartiallyAvailable": "Delvis tilgjengelig",
+ "statusRequested": "Forespurt",
+ "statusProcessing": "Behandler"
+ },
+ "services": {
+ "title": "Tjenester",
+ "hubSubtitle": "Synkroniser fremdrift og forespør nye titler.",
"notConnected": "Ikke tilkoblet",
"connectedAs": "Tilkoblet som @${username}",
"scrobble": "Registrer fremdrift automatisk",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Koble fra ${service}?",
"disconnectConfirmBody": "Plezy slutter å oppdatere ${service}. Koble til igjen når som helst.",
"connectFailed": "Kunne ikke koble til ${service}. Prøv igjen.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Aktiver Plezy på ${service}",
diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json
index 43730ef6..fafddf55 100644
--- a/lib/i18n/nl.i18n.json
+++ b/lib/i18n/nl.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Toon op Discord wat je aan het kijken bent",
"trakt": "Trakt",
"traktDescription": "Kijkgeschiedenis synchroniseren met Trakt",
- "trackers": "Trackers",
- "trackersDescription": "Voortgang synchroniseren met Trakt, MyAnimeList, AniList en Simkl",
+ "services": "Services",
+ "servicesDescription": "Verbind Trakt, MyAnimeList, Seerr en meer",
"companionRemoteServer": "Companion Remote-server",
"companionRemoteServerDescription": "Sta mobiele apparaten op je netwerk toe om deze app te bedienen",
"autoPip": "Automatische beeld-in-beeld",
@@ -416,7 +416,7 @@
"setScore": "Score instellen",
"saved": "Opgeslagen",
"notAvailable": "Geen match gevonden",
- "noConnectedTrackers": "Verbind een tracker in Instellingen om daar te beoordelen."
+ "noConnectedServices": "Verbind een service in Instellingen om daar te beoordelen."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Media",
"downloads": "Downloads",
- "liveTv": "Live TV"
+ "liveTv": "Live TV",
+ "explore": "Verkennen"
+ },
+ "explore": {
+ "title": "Verkennen",
+ "selectSource": "Bron kiezen",
+ "rows": {
+ "watchlist": "Kijklijst",
+ "recommendedMovies": "Aanbevolen films",
+ "recommendedShows": "Aanbevolen series",
+ "trendingMovies": "Trending films",
+ "trendingShows": "Trending series",
+ "popularMovies": "Populaire films",
+ "popularShows": "Populaire series",
+ "suggestedAnime": "Voorgestelde anime",
+ "airingAnime": "Top lopende anime",
+ "popularAnime": "Populairste anime",
+ "trending": "Trending",
+ "upcomingMovies": "Aankomende films",
+ "upcomingShows": "Aankomende series"
+ },
+ "searchHint": "Zoeken in ${source}",
+ "searchEmpty": "Geen resultaten voor \"${query}\"",
+ "searchPrompt": "Zoek naar films en series op ${source}.",
+ "searchFailed": "Zoeken mislukt. Controleer je verbinding en probeer opnieuw.",
+ "status": {
+ "airing": "Lopend",
+ "ended": "Afgelopen",
+ "canceled": "Geannuleerd",
+ "upcoming": "Binnenkort"
+ },
+ "episodeCount": {
+ "one": "${n} aflevering",
+ "other": "${n} afleveringen"
+ },
+ "cast": "Acteurs",
+ "characters": "Personages",
+ "addToWatchlist": "Toevoegen aan kijklijst",
+ "removeFromWatchlist": "Verwijderen uit kijklijst",
+ "watchlistUpdateFailed": "Kon kijklijst niet bijwerken",
+ "notInLibrary": "Niet in je bibliotheek",
+ "inTheseLibraries": "In deze bibliotheken",
+ "availableOn": "Beschikbaar op ${server}",
+ "checkingLibrary": "Je bibliotheek controleren...",
+ "emptyTitle": "Hier is nog niets",
+ "emptyMessage": "Rijen van ${source} verschijnen hier zodra ze inhoud hebben."
},
"liveTv": {
"title": "Live TV",
@@ -1384,9 +1429,41 @@
"watchedSync": "Bekeken-status synchroniseren",
"watchedSyncDescription": "Wanneer je items als bekeken markeert in Plezy, worden ze ook op Trakt gemarkeerd."
},
- "trackers": {
- "title": "Trackers",
- "hubSubtitle": "Synchroniseer kijkvoortgang met Trakt en andere diensten.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Verbinden met Seerr",
+ "serverUrl": "Server-URL",
+ "serverUrlHelper": "Het adres van je Seerr-instantie",
+ "checkServer": "Doorgaan",
+ "signInWithJellyfin": "Inloggen met Jellyfin",
+ "signInWithEmby": "Inloggen met Emby",
+ "signInWithLocal": "Een lokaal account gebruiken",
+ "email": "E-mail",
+ "noSignInMethods": "Deze Seerr-instantie biedt geen inlogmethode die Plezy ondersteunt.",
+ "instance": "Instantie",
+ "disconnectConfirm": "Seerr loskoppelen?",
+ "disconnectConfirmBody": "Plezy vergeet deze Seerr-instantie. Je kunt altijd opnieuw verbinden.",
+ "request": "Aanvragen",
+ "request4k": "Aanvragen in 4K",
+ "seasons": "Seizoenen",
+ "allSeasons": "Alle seizoenen",
+ "advancedOptions": "Geavanceerd",
+ "destinationServer": "Doelserver",
+ "qualityProfile": "Kwaliteitsprofiel",
+ "rootFolder": "Hoofdmap",
+ "languageProfile": "Taalprofiel",
+ "requestSubmitted": "Aanvraag verzonden",
+ "requestFailed": "Aanvraag mislukt: ${error}",
+ "requestsLoadFailed": "Kan aanvraagopties niet laden",
+ "nothingToRequest": "Alles is al beschikbaar of aangevraagd.",
+ "statusAvailable": "Beschikbaar",
+ "statusPartiallyAvailable": "Gedeeltelijk beschikbaar",
+ "statusRequested": "Aangevraagd",
+ "statusProcessing": "Verwerken"
+ },
+ "services": {
+ "title": "Services",
+ "hubSubtitle": "Synchroniseer kijkvoortgang en vraag nieuwe titels aan.",
"notConnected": "Niet verbonden",
"connectedAs": "Verbonden als @${username}",
"scrobble": "Voortgang automatisch volgen",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "${service} loskoppelen?",
"disconnectConfirmBody": "Plezy stopt met ${service} bijwerken. Je kunt altijd opnieuw verbinden.",
"connectFailed": "Kan niet verbinden met ${service}. Probeer opnieuw.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Plezy activeren op ${service}",
diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json
index b7d48cbd..f0968f1e 100644
--- a/lib/i18n/pl.i18n.json
+++ b/lib/i18n/pl.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Pokaż, co oglądasz na Discordzie",
"trakt": "Trakt",
"traktDescription": "Synchronizuj historię oglądania z Trakt",
- "trackers": "Trackery",
- "trackersDescription": "Synchronizuj postęp z Trakt, MyAnimeList, AniList i Simkl",
+ "services": "Usługi",
+ "servicesDescription": "Połącz Trakt, MyAnimeList, Seerr i inne",
"companionRemoteServer": "Serwer zdalnego sterowania",
"companionRemoteServerDescription": "Pozwól urządzeniom mobilnym w sieci sterować tą aplikacją",
"autoPip": "Automatyczny obraz w obrazie",
@@ -416,7 +416,7 @@
"setScore": "Ustaw ocenę",
"saved": "Zapisano",
"notAvailable": "Nie znaleziono dopasowania",
- "noConnectedTrackers": "Połącz tracker w Ustawieniach, aby tam oceniać."
+ "noConnectedServices": "Połącz usługę w Ustawieniach, aby tam oceniać."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,54 @@
"navigation": {
"libraries": "Biblioteki",
"downloads": "Pobrania",
- "liveTv": "TV na żywo"
+ "liveTv": "TV na żywo",
+ "explore": "Przeglądaj"
+ },
+ "explore": {
+ "title": "Przeglądaj",
+ "selectSource": "Wybierz źródło",
+ "rows": {
+ "watchlist": "Lista do obejrzenia",
+ "recommendedMovies": "Rekomendowane filmy",
+ "recommendedShows": "Rekomendowane seriale",
+ "trendingMovies": "Filmy na czasie",
+ "trendingShows": "Seriale na czasie",
+ "popularMovies": "Popularne filmy",
+ "popularShows": "Popularne seriale",
+ "suggestedAnime": "Sugerowane anime",
+ "airingAnime": "Najlepsze emitowane anime",
+ "popularAnime": "Najpopularniejsze anime",
+ "trending": "Na czasie",
+ "upcomingMovies": "Nadchodzące filmy",
+ "upcomingShows": "Nadchodzące seriale"
+ },
+ "status": {
+ "airing": "W emisji",
+ "ended": "Zakończony",
+ "canceled": "Anulowany",
+ "upcoming": "Nadchodzący"
+ },
+ "episodeCount": {
+ "one": "${n} odcinek",
+ "few": "${n} odcinki",
+ "many": "${n} odcinków",
+ "other": "${n} odcinka"
+ },
+ "cast": "Obsada",
+ "characters": "Postacie",
+ "addToWatchlist": "Dodaj do listy do obejrzenia",
+ "removeFromWatchlist": "Usuń z listy do obejrzenia",
+ "watchlistUpdateFailed": "Nie udało się zaktualizować listy do obejrzenia",
+ "notInLibrary": "Nie ma tego w Twojej bibliotece",
+ "inTheseLibraries": "W tych bibliotekach",
+ "availableOn": "Dostępne na ${server}",
+ "checkingLibrary": "Sprawdzanie Twojej biblioteki...",
+ "emptyTitle": "Jeszcze nic tu nie ma",
+ "emptyMessage": "Wiersze z ${source} pojawią się tutaj, gdy będą zawierać treści.",
+ "searchHint": "Szukaj w ${source}",
+ "searchEmpty": "Brak wyników dla \"${query}\"",
+ "searchPrompt": "Szukaj filmów i seriali w ${source}.",
+ "searchFailed": "Wyszukiwanie nie powiodło się. Sprawdź połączenie i spróbuj ponownie."
},
"liveTv": {
"title": "TV na żywo",
@@ -1386,9 +1433,41 @@
"watchedSync": "Synchronizuj status obejrzane",
"watchedSyncDescription": "Gdy oznaczysz pozycje jako obejrzane w Plezy, zostaną też oznaczone w Trakt."
},
- "trackers": {
- "title": "Trackery",
- "hubSubtitle": "Synchronizuj postęp oglądania z Trakt i innymi usługami.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Połącz Seerr",
+ "serverUrl": "Adres URL serwera",
+ "serverUrlHelper": "Adres Twojej instancji Seerr",
+ "checkServer": "Kontynuuj",
+ "signInWithJellyfin": "Zaloguj się przez Jellyfin",
+ "signInWithEmby": "Zaloguj się przez Emby",
+ "signInWithLocal": "Użyj konta lokalnego",
+ "email": "E-mail",
+ "noSignInMethods": "Ta instancja Seerr nie oferuje metody logowania obsługiwanej przez Plezy.",
+ "instance": "Instancja",
+ "disconnectConfirm": "Odłączyć Seerr?",
+ "disconnectConfirmBody": "Plezy zapomni tę instancję Seerr. Połącz ponownie w dowolnym momencie.",
+ "request": "Zamów",
+ "request4k": "Zamów w 4K",
+ "seasons": "Sezony",
+ "allSeasons": "Wszystkie sezony",
+ "advancedOptions": "Zaawansowane",
+ "destinationServer": "Serwer docelowy",
+ "qualityProfile": "Profil jakości",
+ "rootFolder": "Folder główny",
+ "languageProfile": "Profil językowy",
+ "requestSubmitted": "Zamówienie wysłane",
+ "requestFailed": "Zamówienie nie powiodło się: ${error}",
+ "requestsLoadFailed": "Nie udało się wczytać opcji zamówienia",
+ "nothingToRequest": "Wszystko jest już dostępne lub zamówione.",
+ "statusAvailable": "Dostępne",
+ "statusPartiallyAvailable": "Częściowo dostępne",
+ "statusRequested": "Zamówione",
+ "statusProcessing": "Przetwarzanie"
+ },
+ "services": {
+ "title": "Usługi",
+ "hubSubtitle": "Synchronizuj postęp oglądania i zamawiaj nowe tytuły.",
"notConnected": "Nie połączono",
"connectedAs": "Połączono jako @${username}",
"scrobble": "Automatycznie śledź postęp",
@@ -1396,10 +1475,11 @@
"disconnectConfirm": "Odłączyć ${service}?",
"disconnectConfirmBody": "Plezy przestanie aktualizować ${service}. Połącz ponownie w dowolnym momencie.",
"connectFailed": "Nie udało się połączyć z ${service}. Spróbuj ponownie.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Aktywuj Plezy w ${service}",
diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json
index 822e7e62..a13ca51a 100644
--- a/lib/i18n/pt.i18n.json
+++ b/lib/i18n/pt.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Mostrar o que você está assistindo no Discord",
"trakt": "Trakt",
"traktDescription": "Sincronizar histórico de exibição com Trakt",
- "trackers": "Rastreadores",
- "trackersDescription": "Sincronizar progresso com Trakt, MyAnimeList, AniList e Simkl",
+ "services": "Serviços",
+ "servicesDescription": "Conecte Trakt, MyAnimeList, Seerr e mais",
"companionRemoteServer": "Servidor de controlo remoto",
"companionRemoteServerDescription": "Permitir que dispositivos móveis na sua rede controlem esta aplicação",
"autoPip": "Picture-in-Picture Automático",
@@ -416,7 +416,7 @@
"setScore": "Definir pontuação",
"saved": "Salvo",
"notAvailable": "Nenhuma correspondência encontrada",
- "noConnectedTrackers": "Conecte um rastreador em Configurações para avaliar lá."
+ "noConnectedServices": "Conecte um serviço nas Configurações para avaliar por lá."
},
"accessibility": {
"mediaCardMovie": "${title}, filme",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Bibliotecas",
"downloads": "Downloads",
- "liveTv": "TV ao Vivo"
+ "liveTv": "TV ao Vivo",
+ "explore": "Explorar"
+ },
+ "explore": {
+ "title": "Explorar",
+ "selectSource": "Selecionar fonte",
+ "rows": {
+ "watchlist": "Lista para ver",
+ "recommendedMovies": "Filmes recomendados",
+ "recommendedShows": "Séries recomendadas",
+ "trendingMovies": "Filmes em alta",
+ "trendingShows": "Séries em alta",
+ "popularMovies": "Filmes populares",
+ "popularShows": "Séries populares",
+ "suggestedAnime": "Anime sugerido",
+ "airingAnime": "Melhor anime em exibição",
+ "popularAnime": "Anime mais popular",
+ "trending": "Em alta",
+ "upcomingMovies": "Próximos filmes",
+ "upcomingShows": "Próximas séries"
+ },
+ "status": {
+ "airing": "Em exibição",
+ "ended": "Finalizada",
+ "canceled": "Cancelada",
+ "upcoming": "Em breve"
+ },
+ "episodeCount": {
+ "one": "${n} episódio",
+ "other": "${n} episódios"
+ },
+ "cast": "Elenco",
+ "characters": "Personagens",
+ "addToWatchlist": "Adicionar à lista para ver",
+ "removeFromWatchlist": "Remover da lista para ver",
+ "watchlistUpdateFailed": "Não foi possível atualizar a lista para ver",
+ "notInLibrary": "Não está na sua biblioteca",
+ "inTheseLibraries": "Nestas bibliotecas",
+ "availableOn": "Disponível em ${server}",
+ "checkingLibrary": "Verificando a sua biblioteca...",
+ "emptyTitle": "Ainda não há nada aqui",
+ "emptyMessage": "As linhas de ${source} aparecerão aqui quando tiverem conteúdo.",
+ "searchHint": "Buscar em ${source}",
+ "searchEmpty": "Nenhum resultado para \"${query}\"",
+ "searchPrompt": "Busque filmes e séries em ${source}.",
+ "searchFailed": "Falha na busca. Verifique sua conexão e tente novamente."
},
"liveTv": {
"title": "TV ao Vivo",
@@ -1384,9 +1429,41 @@
"watchedSync": "Sincronizar status de assistido",
"watchedSyncDescription": "Ao marcar itens como assistidos no Plezy, eles também serão marcados no Trakt."
},
- "trackers": {
- "title": "Rastreadores",
- "hubSubtitle": "Sincronize o progresso assistido com Trakt e outros serviços.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Conectar Seerr",
+ "serverUrl": "URL do servidor",
+ "serverUrlHelper": "O endereço da sua instância do Seerr",
+ "checkServer": "Continuar",
+ "signInWithJellyfin": "Entrar com Jellyfin",
+ "signInWithEmby": "Entrar com Emby",
+ "signInWithLocal": "Usar uma conta local",
+ "email": "E-mail",
+ "noSignInMethods": "Esta instância do Seerr não oferece nenhum método de login compatível com o Plezy.",
+ "instance": "Instância",
+ "disconnectConfirm": "Desconectar Seerr?",
+ "disconnectConfirmBody": "O Plezy esquecerá esta instância do Seerr. Reconecte quando quiser.",
+ "request": "Solicitar",
+ "request4k": "Solicitar em 4K",
+ "seasons": "Temporadas",
+ "allSeasons": "Todas as temporadas",
+ "advancedOptions": "Avançado",
+ "destinationServer": "Servidor de destino",
+ "qualityProfile": "Perfil de qualidade",
+ "rootFolder": "Pasta raiz",
+ "languageProfile": "Perfil de idioma",
+ "requestSubmitted": "Solicitação enviada",
+ "requestFailed": "Falha na solicitação: ${error}",
+ "requestsLoadFailed": "Não foi possível carregar as opções de solicitação",
+ "nothingToRequest": "Tudo já está disponível ou solicitado.",
+ "statusAvailable": "Disponível",
+ "statusPartiallyAvailable": "Parcialmente disponível",
+ "statusRequested": "Solicitado",
+ "statusProcessing": "Processando"
+ },
+ "services": {
+ "title": "Serviços",
+ "hubSubtitle": "Sincronize o progresso de exibição e solicite novos títulos.",
"notConnected": "Não conectado",
"connectedAs": "Conectado como @${username}",
"scrobble": "Registrar progresso automaticamente",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Desconectar ${service}?",
"disconnectConfirmBody": "Plezy deixará de atualizar ${service}. Reconecte quando quiser.",
"connectFailed": "Não foi possível conectar ao ${service}. Tente novamente.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Ativar Plezy no ${service}",
diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json
index e0057752..ef7f05be 100644
--- a/lib/i18n/ru.i18n.json
+++ b/lib/i18n/ru.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Показывать, что вы смотрите, в Discord",
"trakt": "Trakt",
"traktDescription": "Синхронизировать историю просмотров с Trakt",
- "trackers": "Трекеры",
- "trackersDescription": "Синхронизировать прогресс с Trakt, MyAnimeList, AniList и Simkl",
+ "services": "Сервисы",
+ "servicesDescription": "Подключите Trakt, MyAnimeList, Seerr и другие",
"companionRemoteServer": "Сервер удалённого управления",
"companionRemoteServerDescription": "Разрешить мобильным устройствам в сети управлять этим приложением",
"autoPip": "Автоматический «картинка в картинке»",
@@ -416,7 +416,7 @@
"setScore": "Установить оценку",
"saved": "Сохранено",
"notAvailable": "Совпадений не найдено",
- "noConnectedTrackers": "Подключите трекер в настройках, чтобы оценивать там."
+ "noConnectedServices": "Подключите сервис в настройках, чтобы оценивать здесь."
},
"accessibility": {
"mediaCardMovie": "${title}, фильм",
@@ -842,7 +842,54 @@
"navigation": {
"libraries": "Библиотеки",
"downloads": "Загрузки",
- "liveTv": "ТВ в прямом эфире"
+ "liveTv": "ТВ в прямом эфире",
+ "explore": "Исследовать"
+ },
+ "explore": {
+ "title": "Исследовать",
+ "selectSource": "Выбрать источник",
+ "rows": {
+ "watchlist": "Список для просмотра",
+ "recommendedMovies": "Рекомендуемые фильмы",
+ "recommendedShows": "Рекомендуемые сериалы",
+ "trendingMovies": "Фильмы в тренде",
+ "trendingShows": "Сериалы в тренде",
+ "popularMovies": "Популярные фильмы",
+ "popularShows": "Популярные сериалы",
+ "suggestedAnime": "Рекомендуемые аниме",
+ "airingAnime": "Топ выходящих аниме",
+ "popularAnime": "Самые популярные аниме",
+ "trending": "В тренде",
+ "upcomingMovies": "Ожидаемые фильмы",
+ "upcomingShows": "Ожидаемые сериалы"
+ },
+ "status": {
+ "airing": "Выходит",
+ "ended": "Завершён",
+ "canceled": "Отменён",
+ "upcoming": "Скоро"
+ },
+ "episodeCount": {
+ "one": "${n} эпизод",
+ "few": "${n} эпизода",
+ "many": "${n} эпизодов",
+ "other": "${n} эпизода"
+ },
+ "cast": "В ролях",
+ "characters": "Персонажи",
+ "addToWatchlist": "Добавить в список для просмотра",
+ "removeFromWatchlist": "Удалить из списка для просмотра",
+ "watchlistUpdateFailed": "Не удалось обновить список для просмотра",
+ "notInLibrary": "Нет в вашей библиотеке",
+ "inTheseLibraries": "В этих библиотеках",
+ "availableOn": "Доступно на ${server}",
+ "checkingLibrary": "Проверка вашей библиотеки...",
+ "emptyTitle": "Здесь пока ничего нет",
+ "emptyMessage": "Строки из ${source} появятся здесь, когда в них будет контент.",
+ "searchHint": "Поиск в ${source}",
+ "searchEmpty": "Нет результатов по запросу \"${query}\"",
+ "searchPrompt": "Ищите фильмы и сериалы в ${source}.",
+ "searchFailed": "Ошибка поиска. Проверьте подключение и повторите попытку."
},
"liveTv": {
"title": "ТВ в прямом эфире",
@@ -1386,9 +1433,41 @@
"watchedSync": "Синхронизация статуса просмотра",
"watchedSyncDescription": "Когда вы отмечаете элементы как просмотренные в Plezy, они отмечаются и в Trakt."
},
- "trackers": {
- "title": "Трекеры",
- "hubSubtitle": "Синхронизируйте прогресс просмотра с Trakt и другими сервисами.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Подключить Seerr",
+ "serverUrl": "URL сервера",
+ "serverUrlHelper": "Адрес вашего экземпляра Seerr",
+ "checkServer": "Продолжить",
+ "signInWithJellyfin": "Войти через Jellyfin",
+ "signInWithEmby": "Войти через Emby",
+ "signInWithLocal": "Использовать локальную учётную запись",
+ "email": "Эл. почта",
+ "noSignInMethods": "Этот экземпляр Seerr не предлагает способа входа, поддерживаемого Plezy.",
+ "instance": "Экземпляр",
+ "disconnectConfirm": "Отключить Seerr?",
+ "disconnectConfirmBody": "Plezy забудет этот экземпляр Seerr. Подключитесь снова в любое время.",
+ "request": "Запросить",
+ "request4k": "Запросить в 4K",
+ "seasons": "Сезоны",
+ "allSeasons": "Все сезоны",
+ "advancedOptions": "Дополнительно",
+ "destinationServer": "Целевой сервер",
+ "qualityProfile": "Профиль качества",
+ "rootFolder": "Корневая папка",
+ "languageProfile": "Языковой профиль",
+ "requestSubmitted": "Запрос отправлен",
+ "requestFailed": "Ошибка запроса: ${error}",
+ "requestsLoadFailed": "Не удалось загрузить параметры запроса",
+ "nothingToRequest": "Всё уже доступно или запрошено.",
+ "statusAvailable": "Доступно",
+ "statusPartiallyAvailable": "Частично доступно",
+ "statusRequested": "Запрошено",
+ "statusProcessing": "Обработка"
+ },
+ "services": {
+ "title": "Сервисы",
+ "hubSubtitle": "Синхронизируйте прогресс просмотра и запрашивайте новые тайтлы.",
"notConnected": "Не подключено",
"connectedAs": "Подключено как @${username}",
"scrobble": "Автоматически отслеживать прогресс",
@@ -1396,10 +1475,11 @@
"disconnectConfirm": "Отключить ${service}?",
"disconnectConfirmBody": "Plezy перестанет обновлять ${service}. Подключите снова в любое время.",
"connectFailed": "Не удалось подключиться к ${service}. Попробуйте ещё раз.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Активируйте Plezy в ${service}",
diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart
index d22cc91b..cad77199 100644
--- a/lib/i18n/strings.g.dart
+++ b/lib/i18n/strings.g.dart
@@ -4,7 +4,7 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 16
-/// Strings: 21376 (1336 per locale)
+/// Strings: 22465 (1404 per locale)
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import
diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart
index 4c793b03..b361cb6b 100644
--- a/lib/i18n/strings_bg.g.dart
+++ b/lib/i18n/strings_bg.g.dart
@@ -69,6 +69,7 @@ class TranslationsBg extends Translations with BaseTranslations 'Показвай какво гледате в Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Синхронизирай историята на гледане с Trakt';
- @override String get trackers => 'Тракери';
- @override String get trackersDescription => 'Синхронизирай прогреса с Trakt, MyAnimeList, AniList и Simkl';
+ @override String get services => 'Услуги';
+ @override String get servicesDescription => 'Свържи Trakt, MyAnimeList, Seerr и още';
@override String get companionRemoteServer => 'Сървър за дистанционно управление';
@override String get companionRemoteServerDescription => 'Позволи на мобилни устройства във вашата мрежа да управляват това приложение';
@override String get autoPip => 'Автоматичен режим картина в картината';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetBg extends TranslationsRateSheetEn {
@override String get setScore => 'Задай оценка';
@override String get saved => 'Запазено';
@override String get notAvailable => 'Няма намерено съвпадение';
- @override String get noConnectedTrackers => 'Свържете тракер в Настройки, за да оценявате там.';
+ @override String get noConnectedServices => 'Свържи услуга в Настройки, за да оценяваш там.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationBg extends TranslationsNavigationEn {
@override String get libraries => 'Библиотеки';
@override String get downloads => 'Изтегляния';
@override String get liveTv => 'Телевизия на живо';
+ @override String get explore => 'Разгледай';
+}
+
+// Path: explore
+class _TranslationsExploreBg extends TranslationsExploreEn {
+ _TranslationsExploreBg._(TranslationsBg root) : this._root = root, super.internal(root);
+
+ final TranslationsBg _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Разгледай';
+ @override String get selectSource => 'Избери източник';
+ @override late final _TranslationsExploreRowsBg rows = _TranslationsExploreRowsBg._(_root);
+ @override late final _TranslationsExploreStatusBg status = _TranslationsExploreStatusBg._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))(n,
+ one: '${n} епизод',
+ other: '${n} епизода',
+ );
+ @override String get cast => 'Актьори';
+ @override String get characters => 'Герои';
+ @override String get addToWatchlist => 'Добави в списъка за гледане';
+ @override String get removeFromWatchlist => 'Премахни от списъка за гледане';
+ @override String get watchlistUpdateFailed => 'Неуспешно обновяване на списъка за гледане';
+ @override String get notInLibrary => 'Не е в твоята библиотека';
+ @override String get inTheseLibraries => 'В тези библиотеки';
+ @override String availableOn({required Object server}) => 'Налично на ${server}';
+ @override String get checkingLibrary => 'Проверка на твоята библиотека...';
+ @override String get emptyTitle => 'Тук все още няма нищо';
+ @override String emptyMessage({required Object source}) => 'Редовете от ${source} ще се появят тук, когато има съдържание.';
+ @override String searchHint({required Object source}) => 'Търсене в ${source}';
+ @override String searchEmpty({required Object query}) => 'Няма резултати за "${query}"';
+ @override String searchPrompt({required Object source}) => 'Търси филми и сериали в ${source}.';
+ @override String get searchFailed => 'Търсенето се провали. Провери връзката си и опитай отново.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktBg extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Когато маркирате елементи като гледани в Plezy, маркирай ги и в Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersBg extends TranslationsTrackersEn {
- _TranslationsTrackersBg._(TranslationsBg root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrBg extends TranslationsSeerrEn {
+ _TranslationsSeerrBg._(TranslationsBg root) : this._root = root, super.internal(root);
final TranslationsBg _root; // ignore: unused_field
// Translations
- @override String get title => 'Тракери';
- @override String get hubSubtitle => 'Синхронизирай прогреса на гледане с Trakt и други услуги.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Свързване със Seerr';
+ @override String get serverUrl => 'URL на сървъра';
+ @override String get serverUrlHelper => 'Адресът на твоята Seerr инстанция';
+ @override String get checkServer => 'Продължи';
+ @override String get signInWithJellyfin => 'Вход с Jellyfin';
+ @override String get signInWithEmby => 'Вход с Emby';
+ @override String get signInWithLocal => 'Използвай локален акаунт';
+ @override String get email => 'Имейл';
+ @override String get noSignInMethods => 'Тази Seerr инстанция не предлага метод за вход, който Plezy поддържа.';
+ @override String get instance => 'Инстанция';
+ @override String get disconnectConfirm => 'Да се прекъсне ли Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy ще забрави тази Seerr инстанция. Можете да се свържете отново по всяко време.';
+ @override String get request => 'Заяви';
+ @override String get request4k => 'Заяви в 4K';
+ @override String get seasons => 'Сезони';
+ @override String get allSeasons => 'Всички сезони';
+ @override String get advancedOptions => 'Разширени';
+ @override String get destinationServer => 'Целеви сървър';
+ @override String get qualityProfile => 'Профил за качество';
+ @override String get rootFolder => 'Основна папка';
+ @override String get languageProfile => 'Езиков профил';
+ @override String get requestSubmitted => 'Заявката е изпратена';
+ @override String requestFailed({required Object error}) => 'Заявката се провали: ${error}';
+ @override String get requestsLoadFailed => 'Неуспешно зареждане на опциите за заявка';
+ @override String get nothingToRequest => 'Всичко вече е налично или заявено.';
+ @override String get statusAvailable => 'Налично';
+ @override String get statusPartiallyAvailable => 'Частично налично';
+ @override String get statusRequested => 'Заявено';
+ @override String get statusProcessing => 'Обработва се';
+}
+
+// Path: services
+class _TranslationsServicesBg extends TranslationsServicesEn {
+ _TranslationsServicesBg._(TranslationsBg root) : this._root = root, super.internal(root);
+
+ final TranslationsBg _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Услуги';
+ @override String get hubSubtitle => 'Синхронизирай прогреса на гледане и заявявай нови заглавия.';
@override String get notConnected => 'Не е свързан';
@override String connectedAs({required Object username}) => 'Свързан като @${username}';
@override String get scrobble => 'Проследявай прогреса автоматично';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersBg extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Да се прекъсне ли ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy ще спре да обновява ${service}. Можете да се свържете отново по всяко време.';
@override String connectFailed({required Object service}) => 'Неуспешно свързване с ${service}. Опитайте отново.';
- @override late final _TranslationsTrackersServicesBg services = _TranslationsTrackersServicesBg._(_root);
- @override late final _TranslationsTrackersDeviceCodeBg deviceCode = _TranslationsTrackersDeviceCodeBg._(_root);
- @override late final _TranslationsTrackersOauthProxyBg oauthProxy = _TranslationsTrackersOauthProxyBg._(_root);
- @override late final _TranslationsTrackersLibraryFilterBg libraryFilter = _TranslationsTrackersLibraryFilterBg._(_root);
+ @override late final _TranslationsServicesNamesBg names = _TranslationsServicesNamesBg._(_root);
+ @override late final _TranslationsServicesDeviceCodeBg deviceCode = _TranslationsServicesDeviceCodeBg._(_root);
+ @override late final _TranslationsServicesOauthProxyBg oauthProxy = _TranslationsServicesOauthProxyBg._(_root);
+ @override late final _TranslationsServicesLibraryFilterBg libraryFilter = _TranslationsServicesLibraryFilterBg._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsBg extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Дата на добавяне на последния епизод';
}
+// Path: explore.rows
+class _TranslationsExploreRowsBg extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsBg._(TranslationsBg root) : this._root = root, super.internal(root);
+
+ final TranslationsBg _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Списък за гледане';
+ @override String get recommendedMovies => 'Препоръчани филми';
+ @override String get recommendedShows => 'Препоръчани сериали';
+ @override String get trendingMovies => 'Актуални филми';
+ @override String get trendingShows => 'Актуални сериали';
+ @override String get popularMovies => 'Популярни филми';
+ @override String get popularShows => 'Популярни сериали';
+ @override String get suggestedAnime => 'Препоръчани аниме';
+ @override String get airingAnime => 'Топ излъчвани аниме';
+ @override String get popularAnime => 'Най-популярни аниме';
+ @override String get trending => 'Актуални';
+ @override String get upcomingMovies => 'Предстоящи филми';
+ @override String get upcomingShows => 'Предстоящи сериали';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusBg extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusBg._(TranslationsBg root) : this._root = root, super.internal(root);
+
+ final TranslationsBg _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Излъчва се';
+ @override String get ended => 'Приключил';
+ @override String get canceled => 'Отменен';
+ @override String get upcoming => 'Предстоящ';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionBg extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionBg._(TranslationsBg root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsBg extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Връзката е загубена';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesBg extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesBg._(TranslationsBg root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesBg extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesBg._(TranslationsBg root) : this._root = root, super.internal(root);
final TranslationsBg _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesBg extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeBg extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeBg._(TranslationsBg root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeBg extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeBg._(TranslationsBg root) : this._root = root, super.internal(root);
final TranslationsBg _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeBg extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Кодът е копиран';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyBg extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyBg._(TranslationsBg root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyBg extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyBg._(TranslationsBg root) : this._root = root, super.internal(root);
final TranslationsBg _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyBg extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL адресът е копиран';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterBg extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterBg._(TranslationsBg root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterBg extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterBg._(TranslationsBg root) : this._root = root, super.internal(root);
final TranslationsBg _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsBg {
'settings.discordRichPresenceDescription' => 'Показвай какво гледате в Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Синхронизирай историята на гледане с Trakt',
- 'settings.trackers' => 'Тракери',
- 'settings.trackersDescription' => 'Синхронизирай прогреса с Trakt, MyAnimeList, AniList и Simkl',
+ 'settings.services' => 'Услуги',
+ 'settings.servicesDescription' => 'Свържи Trakt, MyAnimeList, Seerr и още',
'settings.companionRemoteServer' => 'Сървър за дистанционно управление',
'settings.companionRemoteServerDescription' => 'Позволи на мобилни устройства във вашата мрежа да управляват това приложение',
'settings.autoPip' => 'Автоматичен режим картина в картината',
@@ -2390,7 +2500,7 @@ extension on TranslationsBg {
'rateSheet.setScore' => 'Задай оценка',
'rateSheet.saved' => 'Запазено',
'rateSheet.notAvailable' => 'Няма намерено съвпадение',
- 'rateSheet.noConnectedTrackers' => 'Свържете тракер в Настройки, за да оценявате там.',
+ 'rateSheet.noConnectedServices' => 'Свържи услуга в Настройки, за да оценяваш там.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, филм',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, ТВ сериал',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsBg {
'navigation.libraries' => 'Библиотеки',
'navigation.downloads' => 'Изтегляния',
'navigation.liveTv' => 'Телевизия на живо',
+ 'navigation.explore' => 'Разгледай',
+ 'explore.title' => 'Разгледай',
+ 'explore.selectSource' => 'Избери източник',
+ 'explore.rows.watchlist' => 'Списък за гледане',
+ 'explore.rows.recommendedMovies' => 'Препоръчани филми',
+ 'explore.rows.recommendedShows' => 'Препоръчани сериали',
+ 'explore.rows.trendingMovies' => 'Актуални филми',
+ 'explore.rows.trendingShows' => 'Актуални сериали',
+ 'explore.rows.popularMovies' => 'Популярни филми',
+ 'explore.rows.popularShows' => 'Популярни сериали',
+ 'explore.rows.suggestedAnime' => 'Препоръчани аниме',
+ 'explore.rows.airingAnime' => 'Топ излъчвани аниме',
+ 'explore.rows.popularAnime' => 'Най-популярни аниме',
+ 'explore.rows.trending' => 'Актуални',
+ 'explore.rows.upcomingMovies' => 'Предстоящи филми',
+ 'explore.rows.upcomingShows' => 'Предстоящи сериали',
+ 'explore.status.airing' => 'Излъчва се',
+ 'explore.status.ended' => 'Приключил',
+ 'explore.status.canceled' => 'Отменен',
+ 'explore.status.upcoming' => 'Предстоящ',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))(n, one: '${n} епизод', other: '${n} епизода', ),
+ 'explore.cast' => 'Актьори',
+ 'explore.characters' => 'Герои',
+ 'explore.addToWatchlist' => 'Добави в списъка за гледане',
+ 'explore.removeFromWatchlist' => 'Премахни от списъка за гледане',
+ 'explore.watchlistUpdateFailed' => 'Неуспешно обновяване на списъка за гледане',
+ 'explore.notInLibrary' => 'Не е в твоята библиотека',
+ 'explore.inTheseLibraries' => 'В тези библиотеки',
+ 'explore.availableOn' => ({required Object server}) => 'Налично на ${server}',
+ 'explore.checkingLibrary' => 'Проверка на твоята библиотека...',
+ 'explore.emptyTitle' => 'Тук все още няма нищо',
+ 'explore.emptyMessage' => ({required Object source}) => 'Редовете от ${source} ще се появят тук, когато има съдържание.',
+ 'explore.searchHint' => ({required Object source}) => 'Търсене в ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Няма резултати за "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Търси филми и сериали в ${source}.',
+ 'explore.searchFailed' => 'Търсенето се провали. Провери връзката си и опитай отново.',
'liveTv.title' => 'Телевизия на живо',
'liveTv.guide' => 'ТВ програма',
'liveTv.noChannels' => 'Няма налични канали',
@@ -2986,6 +3132,8 @@ extension on TranslationsBg {
'downloads.cancelledDownloadMessage' => 'Това изтегляне беше отменено. Какво искате да направите?',
'downloads.allEpisodesAlreadyDownloaded' => 'Всички епизоди вече са изтеглени',
'downloads.resumeDownload' => 'Възобнови изтеглянето',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Отменено изтегляне',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (синхронизира се ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => 'Изтеглен ${file} — щракнете за довършване',
@@ -3022,8 +3170,6 @@ extension on TranslationsBg {
'downloads.noSyncRules' => 'Няма правила за синхронизация',
'downloads.manageSyncRule' => 'Управление на синхронизацията',
'downloads.editEpisodeCount' => 'Брой епизоди',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Филтър за синхронизация',
'downloads.syncAllItems' => 'Синхронизират се всички елементи',
'downloads.syncUnwatchedItems' => 'Синхронизират се негледаните елементи',
@@ -3272,39 +3418,70 @@ extension on TranslationsBg {
'trakt.scrobbleDescription' => 'Изпращай събития за пускане, пауза и спиране към Trakt по време на възпроизвеждане.',
'trakt.watchedSync' => 'Синхронизирай статус гледано',
'trakt.watchedSyncDescription' => 'Когато маркирате елементи като гледани в Plezy, маркирай ги и в Trakt.',
- 'trackers.title' => 'Тракери',
- 'trackers.hubSubtitle' => 'Синхронизирай прогреса на гледане с Trakt и други услуги.',
- 'trackers.notConnected' => 'Не е свързан',
- 'trackers.connectedAs' => ({required Object username}) => 'Свързан като @${username}',
- 'trackers.scrobble' => 'Проследявай прогреса автоматично',
- 'trackers.scrobbleDescription' => 'Обновявай списъка си, когато завършиш епизод или филм.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Да се прекъсне ли ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy ще спре да обновява ${service}. Можете да се свържете отново по всяко време.',
- 'trackers.connectFailed' => ({required Object service}) => 'Неуспешно свързване с ${service}. Опитайте отново.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Активиране на Plezy в ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Посетете ${url} и въведете този код:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Отворете ${service}, за да активирате',
- 'trackers.deviceCode.waitingForAuthorization' => 'Изчакване на оторизация…',
- 'trackers.deviceCode.codeCopied' => 'Кодът е копиран',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Вход в ${service}',
- 'trackers.oauthProxy.body' => 'Сканирайте този QR код или отворете URL-а на което и да е устройство.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Отворете ${service}, за да влезете',
- 'trackers.oauthProxy.urlCopied' => 'URL адресът е копиран',
- 'trackers.libraryFilter.title' => 'Филтър на библиотеките',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Синхронизират се всички библиотеки',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Нищо не се синхронизира',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} блокирани',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} разрешени',
- 'trackers.libraryFilter.mode' => 'Режим на филтъра',
- 'trackers.libraryFilter.modeBlacklist' => 'Черен списък',
- 'trackers.libraryFilter.modeWhitelist' => 'Бял списък',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Синхронизирай всяка библиотека, освен отметнатите по-долу.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Синхронизирай само отметнатите по-долу библиотеки.',
- 'trackers.libraryFilter.libraries' => 'Библиотеки',
- 'trackers.libraryFilter.noLibraries' => 'Няма налични библиотеки',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Свързване със Seerr',
+ 'seerr.serverUrl' => 'URL на сървъра',
+ 'seerr.serverUrlHelper' => 'Адресът на твоята Seerr инстанция',
+ 'seerr.checkServer' => 'Продължи',
+ 'seerr.signInWithJellyfin' => 'Вход с Jellyfin',
+ 'seerr.signInWithEmby' => 'Вход с Emby',
+ 'seerr.signInWithLocal' => 'Използвай локален акаунт',
+ 'seerr.email' => 'Имейл',
+ 'seerr.noSignInMethods' => 'Тази Seerr инстанция не предлага метод за вход, който Plezy поддържа.',
+ 'seerr.instance' => 'Инстанция',
+ 'seerr.disconnectConfirm' => 'Да се прекъсне ли Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy ще забрави тази Seerr инстанция. Можете да се свържете отново по всяко време.',
+ 'seerr.request' => 'Заяви',
+ 'seerr.request4k' => 'Заяви в 4K',
+ 'seerr.seasons' => 'Сезони',
+ 'seerr.allSeasons' => 'Всички сезони',
+ 'seerr.advancedOptions' => 'Разширени',
+ 'seerr.destinationServer' => 'Целеви сървър',
+ 'seerr.qualityProfile' => 'Профил за качество',
+ 'seerr.rootFolder' => 'Основна папка',
+ 'seerr.languageProfile' => 'Езиков профил',
+ 'seerr.requestSubmitted' => 'Заявката е изпратена',
+ 'seerr.requestFailed' => ({required Object error}) => 'Заявката се провали: ${error}',
+ 'seerr.requestsLoadFailed' => 'Неуспешно зареждане на опциите за заявка',
+ 'seerr.nothingToRequest' => 'Всичко вече е налично или заявено.',
+ 'seerr.statusAvailable' => 'Налично',
+ 'seerr.statusPartiallyAvailable' => 'Частично налично',
+ 'seerr.statusRequested' => 'Заявено',
+ 'seerr.statusProcessing' => 'Обработва се',
+ 'services.title' => 'Услуги',
+ 'services.hubSubtitle' => 'Синхронизирай прогреса на гледане и заявявай нови заглавия.',
+ 'services.notConnected' => 'Не е свързан',
+ 'services.connectedAs' => ({required Object username}) => 'Свързан като @${username}',
+ 'services.scrobble' => 'Проследявай прогреса автоматично',
+ 'services.scrobbleDescription' => 'Обновявай списъка си, когато завършиш епизод или филм.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Да се прекъсне ли ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy ще спре да обновява ${service}. Можете да се свържете отново по всяко време.',
+ 'services.connectFailed' => ({required Object service}) => 'Неуспешно свързване с ${service}. Опитайте отново.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Активиране на Plezy в ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Посетете ${url} и въведете този код:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Отворете ${service}, за да активирате',
+ 'services.deviceCode.waitingForAuthorization' => 'Изчакване на оторизация…',
+ 'services.deviceCode.codeCopied' => 'Кодът е копиран',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Вход в ${service}',
+ 'services.oauthProxy.body' => 'Сканирайте този QR код или отворете URL-а на което и да е устройство.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Отворете ${service}, за да влезете',
+ 'services.oauthProxy.urlCopied' => 'URL адресът е копиран',
+ 'services.libraryFilter.title' => 'Филтър на библиотеките',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Синхронизират се всички библиотеки',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Нищо не се синхронизира',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} блокирани',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} разрешени',
+ 'services.libraryFilter.mode' => 'Режим на филтъра',
+ 'services.libraryFilter.modeBlacklist' => 'Черен списък',
+ 'services.libraryFilter.modeWhitelist' => 'Бял списък',
+ 'services.libraryFilter.modeHintBlacklist' => 'Синхронизирай всяка библиотека, освен отметнатите по-долу.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Синхронизирай само отметнатите по-долу библиотеки.',
+ 'services.libraryFilter.libraries' => 'Библиотеки',
+ 'services.libraryFilter.noLibraries' => 'Няма налични библиотеки',
'addServer.addJellyfinTitle' => 'Добави Jellyfin сървър',
'addServer.serverUrls' => 'URL адреси на сървъра',
'addServer.serverUrlsHelper' => 'Позволени са няколко URL адреса, разделени със запетаи.',
diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart
index 73b04dec..22586c6f 100644
--- a/lib/i18n/strings_da.g.dart
+++ b/lib/i18n/strings_da.g.dart
@@ -69,6 +69,7 @@ class TranslationsDa extends Translations with BaseTranslations 'Vis hvad du ser på Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Synkroniser visningshistorik med Trakt';
- @override String get trackers => 'Trackere';
- @override String get trackersDescription => 'Synkroniser fremgang til Trakt, MyAnimeList, AniList og Simkl';
+ @override String get services => 'Tjenester';
+ @override String get servicesDescription => 'Forbind Trakt, MyAnimeList, Seerr og mere';
@override String get companionRemoteServer => 'Companion Remote Server';
@override String get companionRemoteServerDescription => 'Tillad mobilenheder på dit netværk at styre denne app';
@override String get autoPip => 'Auto billede-i-billede';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetDa extends TranslationsRateSheetEn {
@override String get setScore => 'Angiv en score';
@override String get saved => 'Gemt';
@override String get notAvailable => 'Intet match fundet';
- @override String get noConnectedTrackers => 'Forbind en tracker i Indstillinger for at bedømme der.';
+ @override String get noConnectedServices => 'Forbind en tjeneste i Indstillinger for at bedømme der.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationDa extends TranslationsNavigationEn {
@override String get libraries => 'Biblioteker';
@override String get downloads => 'Downloads';
@override String get liveTv => 'Live TV';
+ @override String get explore => 'Udforsk';
+}
+
+// Path: explore
+class _TranslationsExploreDa extends TranslationsExploreEn {
+ _TranslationsExploreDa._(TranslationsDa root) : this._root = root, super.internal(root);
+
+ final TranslationsDa _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Udforsk';
+ @override String get selectSource => 'Vælg kilde';
+ @override late final _TranslationsExploreRowsDa rows = _TranslationsExploreRowsDa._(_root);
+ @override late final _TranslationsExploreStatusDa status = _TranslationsExploreStatusDa._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n,
+ one: '${n} afsnit',
+ other: '${n} afsnit',
+ );
+ @override String get cast => 'Rollebesætning';
+ @override String get characters => 'Figurer';
+ @override String get addToWatchlist => 'Føj til ønskeliste';
+ @override String get removeFromWatchlist => 'Fjern fra ønskeliste';
+ @override String get watchlistUpdateFailed => 'Kunne ikke opdatere ønskelisten';
+ @override String get notInLibrary => 'Ikke i dit bibliotek';
+ @override String get inTheseLibraries => 'I disse biblioteker';
+ @override String availableOn({required Object server}) => 'Tilgængelig på ${server}';
+ @override String get checkingLibrary => 'Tjekker dit bibliotek...';
+ @override String get emptyTitle => 'Der er ikke noget her endnu';
+ @override String emptyMessage({required Object source}) => 'Rækker fra ${source} vises her, når de har indhold.';
+ @override String searchHint({required Object source}) => 'Søg i ${source}';
+ @override String searchEmpty({required Object query}) => 'Ingen resultater for "${query}"';
+ @override String searchPrompt({required Object source}) => 'Søg efter film og serier på ${source}.';
+ @override String get searchFailed => 'Søgningen mislykkedes. Tjek din forbindelse, og prøv igen.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktDa extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Når du markerer ting som sét i Plezy, markeres de også på Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersDa extends TranslationsTrackersEn {
- _TranslationsTrackersDa._(TranslationsDa root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrDa extends TranslationsSeerrEn {
+ _TranslationsSeerrDa._(TranslationsDa root) : this._root = root, super.internal(root);
final TranslationsDa _root; // ignore: unused_field
// Translations
- @override String get title => 'Trackere';
- @override String get hubSubtitle => 'Synkroniser afspilningsfremskridt med Trakt og andre tjenester.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Forbind Seerr';
+ @override String get serverUrl => 'Server-URL';
+ @override String get serverUrlHelper => 'Adressen på din Seerr-instans';
+ @override String get checkServer => 'Fortsæt';
+ @override String get signInWithJellyfin => 'Log ind med Jellyfin';
+ @override String get signInWithEmby => 'Log ind med Emby';
+ @override String get signInWithLocal => 'Brug en lokal konto';
+ @override String get email => 'E-mail';
+ @override String get noSignInMethods => 'Denne Seerr-instans tilbyder ingen loginmetode, som Plezy understøtter.';
+ @override String get instance => 'Instans';
+ @override String get disconnectConfirm => 'Afbryd Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy glemmer denne Seerr-instans. Tilslut igen når som helst.';
+ @override String get request => 'Anmod';
+ @override String get request4k => 'Anmod i 4K';
+ @override String get seasons => 'Sæsoner';
+ @override String get allSeasons => 'Alle sæsoner';
+ @override String get advancedOptions => 'Avanceret';
+ @override String get destinationServer => 'Destinationsserver';
+ @override String get qualityProfile => 'Kvalitetsprofil';
+ @override String get rootFolder => 'Rodmappe';
+ @override String get languageProfile => 'Sprogprofil';
+ @override String get requestSubmitted => 'Anmodning sendt';
+ @override String requestFailed({required Object error}) => 'Anmodning mislykkedes: ${error}';
+ @override String get requestsLoadFailed => 'Kunne ikke indlæse anmodningsmuligheder';
+ @override String get nothingToRequest => 'Alt er allerede tilgængeligt eller anmodet.';
+ @override String get statusAvailable => 'Tilgængelig';
+ @override String get statusPartiallyAvailable => 'Delvist tilgængelig';
+ @override String get statusRequested => 'Anmodet';
+ @override String get statusProcessing => 'Behandler';
+}
+
+// Path: services
+class _TranslationsServicesDa extends TranslationsServicesEn {
+ _TranslationsServicesDa._(TranslationsDa root) : this._root = root, super.internal(root);
+
+ final TranslationsDa _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Tjenester';
+ @override String get hubSubtitle => 'Synkroniser dit visningsfremskridt, og anmod om nye titler.';
@override String get notConnected => 'Ikke forbundet';
@override String connectedAs({required Object username}) => 'Forbundet som @${username}';
@override String get scrobble => 'Registrer fremgang automatisk';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersDa extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Afbryd ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy stopper med at opdatere ${service}. Tilslut igen når som helst.';
@override String connectFailed({required Object service}) => 'Kunne ikke forbinde til ${service}. Prøv igen.';
- @override late final _TranslationsTrackersServicesDa services = _TranslationsTrackersServicesDa._(_root);
- @override late final _TranslationsTrackersDeviceCodeDa deviceCode = _TranslationsTrackersDeviceCodeDa._(_root);
- @override late final _TranslationsTrackersOauthProxyDa oauthProxy = _TranslationsTrackersOauthProxyDa._(_root);
- @override late final _TranslationsTrackersLibraryFilterDa libraryFilter = _TranslationsTrackersLibraryFilterDa._(_root);
+ @override late final _TranslationsServicesNamesDa names = _TranslationsServicesNamesDa._(_root);
+ @override late final _TranslationsServicesDeviceCodeDa deviceCode = _TranslationsServicesDeviceCodeDa._(_root);
+ @override late final _TranslationsServicesOauthProxyDa oauthProxy = _TranslationsServicesOauthProxyDa._(_root);
+ @override late final _TranslationsServicesLibraryFilterDa libraryFilter = _TranslationsServicesLibraryFilterDa._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsDa extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Dato for senest tilføjede episode';
}
+// Path: explore.rows
+class _TranslationsExploreRowsDa extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsDa._(TranslationsDa root) : this._root = root, super.internal(root);
+
+ final TranslationsDa _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Ønskeliste';
+ @override String get recommendedMovies => 'Anbefalede film';
+ @override String get recommendedShows => 'Anbefalede serier';
+ @override String get trendingMovies => 'Trending film';
+ @override String get trendingShows => 'Trending serier';
+ @override String get popularMovies => 'Populære film';
+ @override String get popularShows => 'Populære serier';
+ @override String get suggestedAnime => 'Foreslået anime';
+ @override String get airingAnime => 'Top igangværende anime';
+ @override String get popularAnime => 'Mest populære anime';
+ @override String get trending => 'Trending';
+ @override String get upcomingMovies => 'Kommende film';
+ @override String get upcomingShows => 'Kommende serier';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusDa extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusDa._(TranslationsDa root) : this._root = root, super.internal(root);
+
+ final TranslationsDa _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Sendes';
+ @override String get ended => 'Afsluttet';
+ @override String get canceled => 'Aflyst';
+ @override String get upcoming => 'Kommende';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionDa extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionDa._(TranslationsDa root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsDa extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Forbindelse mistet';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesDa extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesDa._(TranslationsDa root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesDa extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesDa._(TranslationsDa root) : this._root = root, super.internal(root);
final TranslationsDa _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesDa extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeDa extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeDa._(TranslationsDa root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeDa extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeDa._(TranslationsDa root) : this._root = root, super.internal(root);
final TranslationsDa _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeDa extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Kode kopieret';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyDa extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyDa._(TranslationsDa root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyDa extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyDa._(TranslationsDa root) : this._root = root, super.internal(root);
final TranslationsDa _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyDa extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL kopieret';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterDa extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterDa._(TranslationsDa root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterDa extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterDa._(TranslationsDa root) : this._root = root, super.internal(root);
final TranslationsDa _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsDa {
'settings.discordRichPresenceDescription' => 'Vis hvad du ser på Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Synkroniser visningshistorik med Trakt',
- 'settings.trackers' => 'Trackere',
- 'settings.trackersDescription' => 'Synkroniser fremgang til Trakt, MyAnimeList, AniList og Simkl',
+ 'settings.services' => 'Tjenester',
+ 'settings.servicesDescription' => 'Forbind Trakt, MyAnimeList, Seerr og mere',
'settings.companionRemoteServer' => 'Companion Remote Server',
'settings.companionRemoteServerDescription' => 'Tillad mobilenheder på dit netværk at styre denne app',
'settings.autoPip' => 'Auto billede-i-billede',
@@ -2390,7 +2500,7 @@ extension on TranslationsDa {
'rateSheet.setScore' => 'Angiv en score',
'rateSheet.saved' => 'Gemt',
'rateSheet.notAvailable' => 'Intet match fundet',
- 'rateSheet.noConnectedTrackers' => 'Forbind en tracker i Indstillinger for at bedømme der.',
+ 'rateSheet.noConnectedServices' => 'Forbind en tjeneste i Indstillinger for at bedømme der.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsDa {
'navigation.libraries' => 'Biblioteker',
'navigation.downloads' => 'Downloads',
'navigation.liveTv' => 'Live TV',
+ 'navigation.explore' => 'Udforsk',
+ 'explore.title' => 'Udforsk',
+ 'explore.selectSource' => 'Vælg kilde',
+ 'explore.rows.watchlist' => 'Ønskeliste',
+ 'explore.rows.recommendedMovies' => 'Anbefalede film',
+ 'explore.rows.recommendedShows' => 'Anbefalede serier',
+ 'explore.rows.trendingMovies' => 'Trending film',
+ 'explore.rows.trendingShows' => 'Trending serier',
+ 'explore.rows.popularMovies' => 'Populære film',
+ 'explore.rows.popularShows' => 'Populære serier',
+ 'explore.rows.suggestedAnime' => 'Foreslået anime',
+ 'explore.rows.airingAnime' => 'Top igangværende anime',
+ 'explore.rows.popularAnime' => 'Mest populære anime',
+ 'explore.rows.trending' => 'Trending',
+ 'explore.rows.upcomingMovies' => 'Kommende film',
+ 'explore.rows.upcomingShows' => 'Kommende serier',
+ 'explore.status.airing' => 'Sendes',
+ 'explore.status.ended' => 'Afsluttet',
+ 'explore.status.canceled' => 'Aflyst',
+ 'explore.status.upcoming' => 'Kommende',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n, one: '${n} afsnit', other: '${n} afsnit', ),
+ 'explore.cast' => 'Rollebesætning',
+ 'explore.characters' => 'Figurer',
+ 'explore.addToWatchlist' => 'Føj til ønskeliste',
+ 'explore.removeFromWatchlist' => 'Fjern fra ønskeliste',
+ 'explore.watchlistUpdateFailed' => 'Kunne ikke opdatere ønskelisten',
+ 'explore.notInLibrary' => 'Ikke i dit bibliotek',
+ 'explore.inTheseLibraries' => 'I disse biblioteker',
+ 'explore.availableOn' => ({required Object server}) => 'Tilgængelig på ${server}',
+ 'explore.checkingLibrary' => 'Tjekker dit bibliotek...',
+ 'explore.emptyTitle' => 'Der er ikke noget her endnu',
+ 'explore.emptyMessage' => ({required Object source}) => 'Rækker fra ${source} vises her, når de har indhold.',
+ 'explore.searchHint' => ({required Object source}) => 'Søg i ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Ingen resultater for "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Søg efter film og serier på ${source}.',
+ 'explore.searchFailed' => 'Søgningen mislykkedes. Tjek din forbindelse, og prøv igen.',
'liveTv.title' => 'Live TV',
'liveTv.guide' => 'Guide',
'liveTv.noChannels' => 'Ingen kanaler tilgængelige',
@@ -2986,6 +3132,8 @@ extension on TranslationsDa {
'downloads.cancelledDownloadMessage' => 'Denne download blev annulleret. Hvad vil du gøre?',
'downloads.allEpisodesAlreadyDownloaded' => 'Alle episoder er allerede downloadet',
'downloads.resumeDownload' => 'Genoptag download',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Annulleret download',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synkroniserer ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} downloadet — klik for at fuldføre',
@@ -3022,8 +3170,6 @@ extension on TranslationsDa {
'downloads.noSyncRules' => 'Ingen synkroniseringsregler',
'downloads.manageSyncRule' => 'Administrer synkronisering',
'downloads.editEpisodeCount' => 'Antal episoder',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Synkroniseringsfilter',
'downloads.syncAllItems' => 'Synkroniserer alle elementer',
'downloads.syncUnwatchedItems' => 'Synkroniserer usete elementer',
@@ -3272,39 +3418,70 @@ extension on TranslationsDa {
'trakt.scrobbleDescription' => 'Send afspil-, pause- og stop-begivenheder til Trakt under afspilning.',
'trakt.watchedSync' => 'Synkroniser sét-status',
'trakt.watchedSyncDescription' => 'Når du markerer ting som sét i Plezy, markeres de også på Trakt.',
- 'trackers.title' => 'Trackere',
- 'trackers.hubSubtitle' => 'Synkroniser afspilningsfremskridt med Trakt og andre tjenester.',
- 'trackers.notConnected' => 'Ikke forbundet',
- 'trackers.connectedAs' => ({required Object username}) => 'Forbundet som @${username}',
- 'trackers.scrobble' => 'Registrer fremgang automatisk',
- 'trackers.scrobbleDescription' => 'Opdater din liste når du er færdig med et afsnit eller en film.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Afbryd ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy stopper med at opdatere ${service}. Tilslut igen når som helst.',
- 'trackers.connectFailed' => ({required Object service}) => 'Kunne ikke forbinde til ${service}. Prøv igen.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Aktiver Plezy på ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Besøg ${url} og indtast denne kode:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Åbn ${service} for at aktivere',
- 'trackers.deviceCode.waitingForAuthorization' => 'Venter på godkendelse…',
- 'trackers.deviceCode.codeCopied' => 'Kode kopieret',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Log ind på ${service}',
- 'trackers.oauthProxy.body' => 'Scan denne QR-kode, eller åbn URL\'en på en enhed.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Åbn ${service} for at logge ind',
- 'trackers.oauthProxy.urlCopied' => 'URL kopieret',
- 'trackers.libraryFilter.title' => 'Bibliotekfilter',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Synkroniserer alle biblioteker',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Intet synkroniseres',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blokeret',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} tilladt',
- 'trackers.libraryFilter.mode' => 'Filtertilstand',
- 'trackers.libraryFilter.modeBlacklist' => 'Sortliste',
- 'trackers.libraryFilter.modeWhitelist' => 'Hvidliste',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Synkroniser alle biblioteker undtagen dem du markerer nedenfor.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Synkroniser kun de biblioteker du markerer nedenfor.',
- 'trackers.libraryFilter.libraries' => 'Biblioteker',
- 'trackers.libraryFilter.noLibraries' => 'Ingen biblioteker tilgængelige',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Forbind Seerr',
+ 'seerr.serverUrl' => 'Server-URL',
+ 'seerr.serverUrlHelper' => 'Adressen på din Seerr-instans',
+ 'seerr.checkServer' => 'Fortsæt',
+ 'seerr.signInWithJellyfin' => 'Log ind med Jellyfin',
+ 'seerr.signInWithEmby' => 'Log ind med Emby',
+ 'seerr.signInWithLocal' => 'Brug en lokal konto',
+ 'seerr.email' => 'E-mail',
+ 'seerr.noSignInMethods' => 'Denne Seerr-instans tilbyder ingen loginmetode, som Plezy understøtter.',
+ 'seerr.instance' => 'Instans',
+ 'seerr.disconnectConfirm' => 'Afbryd Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy glemmer denne Seerr-instans. Tilslut igen når som helst.',
+ 'seerr.request' => 'Anmod',
+ 'seerr.request4k' => 'Anmod i 4K',
+ 'seerr.seasons' => 'Sæsoner',
+ 'seerr.allSeasons' => 'Alle sæsoner',
+ 'seerr.advancedOptions' => 'Avanceret',
+ 'seerr.destinationServer' => 'Destinationsserver',
+ 'seerr.qualityProfile' => 'Kvalitetsprofil',
+ 'seerr.rootFolder' => 'Rodmappe',
+ 'seerr.languageProfile' => 'Sprogprofil',
+ 'seerr.requestSubmitted' => 'Anmodning sendt',
+ 'seerr.requestFailed' => ({required Object error}) => 'Anmodning mislykkedes: ${error}',
+ 'seerr.requestsLoadFailed' => 'Kunne ikke indlæse anmodningsmuligheder',
+ 'seerr.nothingToRequest' => 'Alt er allerede tilgængeligt eller anmodet.',
+ 'seerr.statusAvailable' => 'Tilgængelig',
+ 'seerr.statusPartiallyAvailable' => 'Delvist tilgængelig',
+ 'seerr.statusRequested' => 'Anmodet',
+ 'seerr.statusProcessing' => 'Behandler',
+ 'services.title' => 'Tjenester',
+ 'services.hubSubtitle' => 'Synkroniser dit visningsfremskridt, og anmod om nye titler.',
+ 'services.notConnected' => 'Ikke forbundet',
+ 'services.connectedAs' => ({required Object username}) => 'Forbundet som @${username}',
+ 'services.scrobble' => 'Registrer fremgang automatisk',
+ 'services.scrobbleDescription' => 'Opdater din liste når du er færdig med et afsnit eller en film.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Afbryd ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy stopper med at opdatere ${service}. Tilslut igen når som helst.',
+ 'services.connectFailed' => ({required Object service}) => 'Kunne ikke forbinde til ${service}. Prøv igen.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Aktiver Plezy på ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Besøg ${url} og indtast denne kode:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Åbn ${service} for at aktivere',
+ 'services.deviceCode.waitingForAuthorization' => 'Venter på godkendelse…',
+ 'services.deviceCode.codeCopied' => 'Kode kopieret',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Log ind på ${service}',
+ 'services.oauthProxy.body' => 'Scan denne QR-kode, eller åbn URL\'en på en enhed.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Åbn ${service} for at logge ind',
+ 'services.oauthProxy.urlCopied' => 'URL kopieret',
+ 'services.libraryFilter.title' => 'Bibliotekfilter',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Synkroniserer alle biblioteker',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Intet synkroniseres',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blokeret',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} tilladt',
+ 'services.libraryFilter.mode' => 'Filtertilstand',
+ 'services.libraryFilter.modeBlacklist' => 'Sortliste',
+ 'services.libraryFilter.modeWhitelist' => 'Hvidliste',
+ 'services.libraryFilter.modeHintBlacklist' => 'Synkroniser alle biblioteker undtagen dem du markerer nedenfor.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Synkroniser kun de biblioteker du markerer nedenfor.',
+ 'services.libraryFilter.libraries' => 'Biblioteker',
+ 'services.libraryFilter.noLibraries' => 'Ingen biblioteker tilgængelige',
'addServer.addJellyfinTitle' => 'Tilføj Jellyfin-server',
'addServer.serverUrls' => 'Server-URL\'er',
'addServer.serverUrlsHelper' => 'Flere URL\'er er tilladt, adskilt med kommaer.',
diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart
index afe78dba..d6362d62 100644
--- a/lib/i18n/strings_de.g.dart
+++ b/lib/i18n/strings_de.g.dart
@@ -69,6 +69,7 @@ class TranslationsDe extends Translations with BaseTranslations 'Zeige auf Discord, was du gerade schaust';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Wiedergabeverlauf mit Trakt synchronisieren';
- @override String get trackers => 'Tracker';
- @override String get trackersDescription => 'Fortschritt mit Trakt, MyAnimeList, AniList und Simkl synchronisieren';
+ @override String get services => 'Dienste';
+ @override String get servicesDescription => 'Trakt, MyAnimeList, Seerr und mehr verbinden';
@override String get companionRemoteServer => 'Companion Remote Server';
@override String get companionRemoteServerDescription => 'Mobilgeräten in deinem Netzwerk erlauben, diese App zu steuern';
@override String get autoPip => 'Automatisches Bild-in-Bild';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetDe extends TranslationsRateSheetEn {
@override String get setScore => 'Eine Wertung festlegen';
@override String get saved => 'Gespeichert';
@override String get notAvailable => 'Keine Übereinstimmung gefunden';
- @override String get noConnectedTrackers => 'Verbinde einen Tracker in den Einstellungen, um dort zu bewerten.';
+ @override String get noConnectedServices => 'Verbinde einen Dienst in den Einstellungen, um dort zu bewerten.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationDe extends TranslationsNavigationEn {
@override String get libraries => 'Medien';
@override String get downloads => 'Downloads';
@override String get liveTv => 'Live-TV';
+ @override String get explore => 'Erkunden';
+}
+
+// Path: explore
+class _TranslationsExploreDe extends TranslationsExploreEn {
+ _TranslationsExploreDe._(TranslationsDe root) : this._root = root, super.internal(root);
+
+ final TranslationsDe _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Erkunden';
+ @override String get selectSource => 'Quelle auswählen';
+ @override late final _TranslationsExploreRowsDe rows = _TranslationsExploreRowsDe._(_root);
+ @override late final _TranslationsExploreStatusDe status = _TranslationsExploreStatusDe._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n,
+ one: '${n} Folge',
+ other: '${n} Folgen',
+ );
+ @override String get cast => 'Besetzung';
+ @override String get characters => 'Charaktere';
+ @override String get addToWatchlist => 'Zur Merkliste hinzufügen';
+ @override String get removeFromWatchlist => 'Von Merkliste entfernen';
+ @override String get watchlistUpdateFailed => 'Merkliste konnte nicht aktualisiert werden';
+ @override String get notInLibrary => 'Nicht in deiner Mediathek';
+ @override String get inTheseLibraries => 'In diesen Mediatheken';
+ @override String availableOn({required Object server}) => 'Verfügbar auf ${server}';
+ @override String get checkingLibrary => 'Deine Mediathek wird überprüft...';
+ @override String get emptyTitle => 'Hier ist noch nichts';
+ @override String emptyMessage({required Object source}) => 'Zeilen aus ${source} erscheinen hier, sobald sie Inhalte enthalten.';
+ @override String searchHint({required Object source}) => '${source} durchsuchen';
+ @override String searchEmpty({required Object query}) => 'Keine Ergebnisse für "${query}"';
+ @override String searchPrompt({required Object source}) => 'Suche nach Filmen und Serien auf ${source}.';
+ @override String get searchFailed => 'Suche fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktDe extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Wenn du Inhalte in Plezy als gesehen markierst, werden sie auch auf Trakt markiert.';
}
-// Path: trackers
-class _TranslationsTrackersDe extends TranslationsTrackersEn {
- _TranslationsTrackersDe._(TranslationsDe root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrDe extends TranslationsSeerrEn {
+ _TranslationsSeerrDe._(TranslationsDe root) : this._root = root, super.internal(root);
final TranslationsDe _root; // ignore: unused_field
// Translations
- @override String get title => 'Tracker';
- @override String get hubSubtitle => 'Wiedergabefortschritt mit Trakt und anderen Diensten synchronisieren.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Seerr verbinden';
+ @override String get serverUrl => 'Server-URL';
+ @override String get serverUrlHelper => 'Die Adresse deiner Seerr-Instanz';
+ @override String get checkServer => 'Weiter';
+ @override String get signInWithJellyfin => 'Mit Jellyfin anmelden';
+ @override String get signInWithEmby => 'Mit Emby anmelden';
+ @override String get signInWithLocal => 'Lokales Konto verwenden';
+ @override String get email => 'E-Mail';
+ @override String get noSignInMethods => 'Diese Seerr-Instanz bietet keine von Plezy unterstützte Anmeldemethode.';
+ @override String get instance => 'Instanz';
+ @override String get disconnectConfirm => 'Seerr trennen?';
+ @override String get disconnectConfirmBody => 'Plezy vergisst diese Seerr-Instanz. Jederzeit erneut verbinden.';
+ @override String get request => 'Anfragen';
+ @override String get request4k => 'In 4K anfragen';
+ @override String get seasons => 'Staffeln';
+ @override String get allSeasons => 'Alle Staffeln';
+ @override String get advancedOptions => 'Erweitert';
+ @override String get destinationServer => 'Zielserver';
+ @override String get qualityProfile => 'Qualitätsprofil';
+ @override String get rootFolder => 'Stammordner';
+ @override String get languageProfile => 'Sprachprofil';
+ @override String get requestSubmitted => 'Anfrage gesendet';
+ @override String requestFailed({required Object error}) => 'Anfrage fehlgeschlagen: ${error}';
+ @override String get requestsLoadFailed => 'Anfrageoptionen konnten nicht geladen werden';
+ @override String get nothingToRequest => 'Alles ist bereits verfügbar oder angefragt.';
+ @override String get statusAvailable => 'Verfügbar';
+ @override String get statusPartiallyAvailable => 'Teilweise verfügbar';
+ @override String get statusRequested => 'Angefragt';
+ @override String get statusProcessing => 'Wird verarbeitet';
+}
+
+// Path: services
+class _TranslationsServicesDe extends TranslationsServicesEn {
+ _TranslationsServicesDe._(TranslationsDe root) : this._root = root, super.internal(root);
+
+ final TranslationsDe _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Dienste';
+ @override String get hubSubtitle => 'Wiedergabefortschritt synchronisieren und neue Titel anfragen.';
@override String get notConnected => 'Nicht verbunden';
@override String connectedAs({required Object username}) => 'Verbunden als @${username}';
@override String get scrobble => 'Fortschritt automatisch verfolgen';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersDe extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => '${service} trennen?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy aktualisiert ${service} nicht mehr. Jederzeit erneut verbinden.';
@override String connectFailed({required Object service}) => 'Verbindung zu ${service} fehlgeschlagen. Versuche es erneut.';
- @override late final _TranslationsTrackersServicesDe services = _TranslationsTrackersServicesDe._(_root);
- @override late final _TranslationsTrackersDeviceCodeDe deviceCode = _TranslationsTrackersDeviceCodeDe._(_root);
- @override late final _TranslationsTrackersOauthProxyDe oauthProxy = _TranslationsTrackersOauthProxyDe._(_root);
- @override late final _TranslationsTrackersLibraryFilterDe libraryFilter = _TranslationsTrackersLibraryFilterDe._(_root);
+ @override late final _TranslationsServicesNamesDe names = _TranslationsServicesNamesDe._(_root);
+ @override late final _TranslationsServicesDeviceCodeDe deviceCode = _TranslationsServicesDeviceCodeDe._(_root);
+ @override late final _TranslationsServicesOauthProxyDe oauthProxy = _TranslationsServicesOauthProxyDe._(_root);
+ @override late final _TranslationsServicesLibraryFilterDe libraryFilter = _TranslationsServicesLibraryFilterDe._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsDe extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Datum der zuletzt hinzugefügten Folge';
}
+// Path: explore.rows
+class _TranslationsExploreRowsDe extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsDe._(TranslationsDe root) : this._root = root, super.internal(root);
+
+ final TranslationsDe _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Merkliste';
+ @override String get recommendedMovies => 'Empfohlene Filme';
+ @override String get recommendedShows => 'Empfohlene Serien';
+ @override String get trendingMovies => 'Angesagte Filme';
+ @override String get trendingShows => 'Angesagte Serien';
+ @override String get popularMovies => 'Beliebte Filme';
+ @override String get popularShows => 'Beliebte Serien';
+ @override String get suggestedAnime => 'Vorgeschlagene Anime';
+ @override String get airingAnime => 'Top laufende Anime';
+ @override String get popularAnime => 'Beliebteste Anime';
+ @override String get trending => 'Angesagt';
+ @override String get upcomingMovies => 'Kommende Filme';
+ @override String get upcomingShows => 'Kommende Serien';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusDe extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusDe._(TranslationsDe root) : this._root = root, super.internal(root);
+
+ final TranslationsDe _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Laufend';
+ @override String get ended => 'Beendet';
+ @override String get canceled => 'Abgesetzt';
+ @override String get upcoming => 'Demnächst';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionDe extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionDe._(TranslationsDe root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsDe extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Verbindung verloren';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesDe extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesDe._(TranslationsDe root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesDe extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesDe._(TranslationsDe root) : this._root = root, super.internal(root);
final TranslationsDe _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesDe extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeDe extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeDe._(TranslationsDe root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeDe extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeDe._(TranslationsDe root) : this._root = root, super.internal(root);
final TranslationsDe _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeDe extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Code kopiert';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyDe extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyDe._(TranslationsDe root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyDe extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyDe._(TranslationsDe root) : this._root = root, super.internal(root);
final TranslationsDe _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyDe extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL kopiert';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterDe extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterDe._(TranslationsDe root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterDe extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterDe._(TranslationsDe root) : this._root = root, super.internal(root);
final TranslationsDe _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsDe {
'settings.discordRichPresenceDescription' => 'Zeige auf Discord, was du gerade schaust',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Wiedergabeverlauf mit Trakt synchronisieren',
- 'settings.trackers' => 'Tracker',
- 'settings.trackersDescription' => 'Fortschritt mit Trakt, MyAnimeList, AniList und Simkl synchronisieren',
+ 'settings.services' => 'Dienste',
+ 'settings.servicesDescription' => 'Trakt, MyAnimeList, Seerr und mehr verbinden',
'settings.companionRemoteServer' => 'Companion Remote Server',
'settings.companionRemoteServerDescription' => 'Mobilgeräten in deinem Netzwerk erlauben, diese App zu steuern',
'settings.autoPip' => 'Automatisches Bild-in-Bild',
@@ -2390,7 +2500,7 @@ extension on TranslationsDe {
'rateSheet.setScore' => 'Eine Wertung festlegen',
'rateSheet.saved' => 'Gespeichert',
'rateSheet.notAvailable' => 'Keine Übereinstimmung gefunden',
- 'rateSheet.noConnectedTrackers' => 'Verbinde einen Tracker in den Einstellungen, um dort zu bewerten.',
+ 'rateSheet.noConnectedServices' => 'Verbinde einen Dienst in den Einstellungen, um dort zu bewerten.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, Film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, Serie',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsDe {
'navigation.libraries' => 'Medien',
'navigation.downloads' => 'Downloads',
'navigation.liveTv' => 'Live-TV',
+ 'navigation.explore' => 'Erkunden',
+ 'explore.title' => 'Erkunden',
+ 'explore.selectSource' => 'Quelle auswählen',
+ 'explore.rows.watchlist' => 'Merkliste',
+ 'explore.rows.recommendedMovies' => 'Empfohlene Filme',
+ 'explore.rows.recommendedShows' => 'Empfohlene Serien',
+ 'explore.rows.trendingMovies' => 'Angesagte Filme',
+ 'explore.rows.trendingShows' => 'Angesagte Serien',
+ 'explore.rows.popularMovies' => 'Beliebte Filme',
+ 'explore.rows.popularShows' => 'Beliebte Serien',
+ 'explore.rows.suggestedAnime' => 'Vorgeschlagene Anime',
+ 'explore.rows.airingAnime' => 'Top laufende Anime',
+ 'explore.rows.popularAnime' => 'Beliebteste Anime',
+ 'explore.rows.trending' => 'Angesagt',
+ 'explore.rows.upcomingMovies' => 'Kommende Filme',
+ 'explore.rows.upcomingShows' => 'Kommende Serien',
+ 'explore.status.airing' => 'Laufend',
+ 'explore.status.ended' => 'Beendet',
+ 'explore.status.canceled' => 'Abgesetzt',
+ 'explore.status.upcoming' => 'Demnächst',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n, one: '${n} Folge', other: '${n} Folgen', ),
+ 'explore.cast' => 'Besetzung',
+ 'explore.characters' => 'Charaktere',
+ 'explore.addToWatchlist' => 'Zur Merkliste hinzufügen',
+ 'explore.removeFromWatchlist' => 'Von Merkliste entfernen',
+ 'explore.watchlistUpdateFailed' => 'Merkliste konnte nicht aktualisiert werden',
+ 'explore.notInLibrary' => 'Nicht in deiner Mediathek',
+ 'explore.inTheseLibraries' => 'In diesen Mediatheken',
+ 'explore.availableOn' => ({required Object server}) => 'Verfügbar auf ${server}',
+ 'explore.checkingLibrary' => 'Deine Mediathek wird überprüft...',
+ 'explore.emptyTitle' => 'Hier ist noch nichts',
+ 'explore.emptyMessage' => ({required Object source}) => 'Zeilen aus ${source} erscheinen hier, sobald sie Inhalte enthalten.',
+ 'explore.searchHint' => ({required Object source}) => '${source} durchsuchen',
+ 'explore.searchEmpty' => ({required Object query}) => 'Keine Ergebnisse für "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Suche nach Filmen und Serien auf ${source}.',
+ 'explore.searchFailed' => 'Suche fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut.',
'liveTv.title' => 'Live-TV',
'liveTv.guide' => 'Programmführer',
'liveTv.noChannels' => 'Keine Kanäle verfügbar',
@@ -2986,6 +3132,8 @@ extension on TranslationsDe {
'downloads.cancelledDownloadMessage' => 'Dieser Download wurde abgebrochen. Was möchtest du tun?',
'downloads.allEpisodesAlreadyDownloaded' => 'Alle Episoden sind bereits heruntergeladen',
'downloads.resumeDownload' => 'Download fortsetzen',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Abgebrochener Download',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (${status} wird synchronisiert)',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} heruntergeladen — zum Abschließen klicken',
@@ -3022,8 +3170,6 @@ extension on TranslationsDe {
'downloads.noSyncRules' => 'Keine Sync-Regeln',
'downloads.manageSyncRule' => 'Synchronisierung verwalten',
'downloads.editEpisodeCount' => 'Episodenanzahl',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Synchronisierungsfilter',
'downloads.syncAllItems' => 'Alle Einträge synchronisieren',
'downloads.syncUnwatchedItems' => 'Ungesehene Einträge synchronisieren',
@@ -3272,39 +3418,70 @@ extension on TranslationsDe {
'trakt.scrobbleDescription' => 'Sende Play-, Pause- und Stopp-Ereignisse während der Wiedergabe an Trakt.',
'trakt.watchedSync' => 'Gesehen-Status synchronisieren',
'trakt.watchedSyncDescription' => 'Wenn du Inhalte in Plezy als gesehen markierst, werden sie auch auf Trakt markiert.',
- 'trackers.title' => 'Tracker',
- 'trackers.hubSubtitle' => 'Wiedergabefortschritt mit Trakt und anderen Diensten synchronisieren.',
- 'trackers.notConnected' => 'Nicht verbunden',
- 'trackers.connectedAs' => ({required Object username}) => 'Verbunden als @${username}',
- 'trackers.scrobble' => 'Fortschritt automatisch verfolgen',
- 'trackers.scrobbleDescription' => 'Aktualisiere deine Liste, wenn du eine Folge oder einen Film beendest.',
- 'trackers.disconnectConfirm' => ({required Object service}) => '${service} trennen?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy aktualisiert ${service} nicht mehr. Jederzeit erneut verbinden.',
- 'trackers.connectFailed' => ({required Object service}) => 'Verbindung zu ${service} fehlgeschlagen. Versuche es erneut.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Plezy auf ${service} aktivieren',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Gehe zu ${url} und gib diesen Code ein:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => '${service} zum Aktivieren öffnen',
- 'trackers.deviceCode.waitingForAuthorization' => 'Warte auf Autorisierung…',
- 'trackers.deviceCode.codeCopied' => 'Code kopiert',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Bei ${service} anmelden',
- 'trackers.oauthProxy.body' => 'Scanne diesen QR-Code oder öffne die URL auf einem beliebigen Gerät.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => '${service} zum Anmelden öffnen',
- 'trackers.oauthProxy.urlCopied' => 'URL kopiert',
- 'trackers.libraryFilter.title' => 'Bibliothekfilter',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Alle Bibliotheken werden synchronisiert',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Nichts wird synchronisiert',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blockiert',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} erlaubt',
- 'trackers.libraryFilter.mode' => 'Filtermodus',
- 'trackers.libraryFilter.modeBlacklist' => 'Blacklist',
- 'trackers.libraryFilter.modeWhitelist' => 'Whitelist',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Alle Bibliotheken außer den unten markierten synchronisieren.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Nur die unten markierten Bibliotheken synchronisieren.',
- 'trackers.libraryFilter.libraries' => 'Bibliotheken',
- 'trackers.libraryFilter.noLibraries' => 'Keine Bibliotheken verfügbar',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Seerr verbinden',
+ 'seerr.serverUrl' => 'Server-URL',
+ 'seerr.serverUrlHelper' => 'Die Adresse deiner Seerr-Instanz',
+ 'seerr.checkServer' => 'Weiter',
+ 'seerr.signInWithJellyfin' => 'Mit Jellyfin anmelden',
+ 'seerr.signInWithEmby' => 'Mit Emby anmelden',
+ 'seerr.signInWithLocal' => 'Lokales Konto verwenden',
+ 'seerr.email' => 'E-Mail',
+ 'seerr.noSignInMethods' => 'Diese Seerr-Instanz bietet keine von Plezy unterstützte Anmeldemethode.',
+ 'seerr.instance' => 'Instanz',
+ 'seerr.disconnectConfirm' => 'Seerr trennen?',
+ 'seerr.disconnectConfirmBody' => 'Plezy vergisst diese Seerr-Instanz. Jederzeit erneut verbinden.',
+ 'seerr.request' => 'Anfragen',
+ 'seerr.request4k' => 'In 4K anfragen',
+ 'seerr.seasons' => 'Staffeln',
+ 'seerr.allSeasons' => 'Alle Staffeln',
+ 'seerr.advancedOptions' => 'Erweitert',
+ 'seerr.destinationServer' => 'Zielserver',
+ 'seerr.qualityProfile' => 'Qualitätsprofil',
+ 'seerr.rootFolder' => 'Stammordner',
+ 'seerr.languageProfile' => 'Sprachprofil',
+ 'seerr.requestSubmitted' => 'Anfrage gesendet',
+ 'seerr.requestFailed' => ({required Object error}) => 'Anfrage fehlgeschlagen: ${error}',
+ 'seerr.requestsLoadFailed' => 'Anfrageoptionen konnten nicht geladen werden',
+ 'seerr.nothingToRequest' => 'Alles ist bereits verfügbar oder angefragt.',
+ 'seerr.statusAvailable' => 'Verfügbar',
+ 'seerr.statusPartiallyAvailable' => 'Teilweise verfügbar',
+ 'seerr.statusRequested' => 'Angefragt',
+ 'seerr.statusProcessing' => 'Wird verarbeitet',
+ 'services.title' => 'Dienste',
+ 'services.hubSubtitle' => 'Wiedergabefortschritt synchronisieren und neue Titel anfragen.',
+ 'services.notConnected' => 'Nicht verbunden',
+ 'services.connectedAs' => ({required Object username}) => 'Verbunden als @${username}',
+ 'services.scrobble' => 'Fortschritt automatisch verfolgen',
+ 'services.scrobbleDescription' => 'Aktualisiere deine Liste, wenn du eine Folge oder einen Film beendest.',
+ 'services.disconnectConfirm' => ({required Object service}) => '${service} trennen?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy aktualisiert ${service} nicht mehr. Jederzeit erneut verbinden.',
+ 'services.connectFailed' => ({required Object service}) => 'Verbindung zu ${service} fehlgeschlagen. Versuche es erneut.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Plezy auf ${service} aktivieren',
+ 'services.deviceCode.body' => ({required Object url}) => 'Gehe zu ${url} und gib diesen Code ein:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => '${service} zum Aktivieren öffnen',
+ 'services.deviceCode.waitingForAuthorization' => 'Warte auf Autorisierung…',
+ 'services.deviceCode.codeCopied' => 'Code kopiert',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Bei ${service} anmelden',
+ 'services.oauthProxy.body' => 'Scanne diesen QR-Code oder öffne die URL auf einem beliebigen Gerät.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => '${service} zum Anmelden öffnen',
+ 'services.oauthProxy.urlCopied' => 'URL kopiert',
+ 'services.libraryFilter.title' => 'Bibliothekfilter',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Alle Bibliotheken werden synchronisiert',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Nichts wird synchronisiert',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blockiert',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} erlaubt',
+ 'services.libraryFilter.mode' => 'Filtermodus',
+ 'services.libraryFilter.modeBlacklist' => 'Blacklist',
+ 'services.libraryFilter.modeWhitelist' => 'Whitelist',
+ 'services.libraryFilter.modeHintBlacklist' => 'Alle Bibliotheken außer den unten markierten synchronisieren.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Nur die unten markierten Bibliotheken synchronisieren.',
+ 'services.libraryFilter.libraries' => 'Bibliotheken',
+ 'services.libraryFilter.noLibraries' => 'Keine Bibliotheken verfügbar',
'addServer.addJellyfinTitle' => 'Jellyfin-Server hinzufügen',
'addServer.serverUrls' => 'Server-URLs',
'addServer.serverUrlsHelper' => 'Mehrere URLs möglich, durch Kommas getrennt.',
diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart
index ddf97d87..a0f29818 100644
--- a/lib/i18n/strings_en.g.dart
+++ b/lib/i18n/strings_en.g.dart
@@ -70,6 +70,7 @@ class Translations with BaseTranslations {
late final TranslationsLogsEn logs = TranslationsLogsEn.internal(_root);
late final TranslationsLicensesEn licenses = TranslationsLicensesEn.internal(_root);
late final TranslationsNavigationEn navigation = TranslationsNavigationEn.internal(_root);
+ late final TranslationsExploreEn explore = TranslationsExploreEn.internal(_root);
late final TranslationsLiveTvEn liveTv = TranslationsLiveTvEn.internal(_root);
late final TranslationsCollectionsEn collections = TranslationsCollectionsEn.internal(_root);
late final TranslationsPlaylistsEn playlists = TranslationsPlaylistsEn.internal(_root);
@@ -85,7 +86,8 @@ class Translations with BaseTranslations {
late final TranslationsMatchScreenEn matchScreen = TranslationsMatchScreenEn.internal(_root);
late final TranslationsServerTasksEn serverTasks = TranslationsServerTasksEn.internal(_root);
late final TranslationsTraktEn trakt = TranslationsTraktEn.internal(_root);
- late final TranslationsTrackersEn trackers = TranslationsTrackersEn.internal(_root);
+ late final TranslationsSeerrEn seerr = TranslationsSeerrEn.internal(_root);
+ late final TranslationsServicesEn services = TranslationsServicesEn.internal(_root);
late final TranslationsAddServerEn addServer = TranslationsAddServerEn.internal(_root);
}
@@ -871,11 +873,11 @@ class TranslationsSettingsEn {
/// en: 'Sync watch history with Trakt'
String get traktDescription => 'Sync watch history with Trakt';
- /// en: 'Trackers'
- String get trackers => 'Trackers';
+ /// en: 'Services'
+ String get services => 'Services';
- /// en: 'Sync progress to Trakt, MyAnimeList, AniList, and Simkl'
- String get trackersDescription => 'Sync progress to Trakt, MyAnimeList, AniList, and Simkl';
+ /// en: 'Connect Trakt, MyAnimeList, Seerr, and more'
+ String get servicesDescription => 'Connect Trakt, MyAnimeList, Seerr, and more';
/// en: 'Reorder and hide libraries'
String get manageLibrariesDescription => 'Reorder and hide libraries';
@@ -1323,8 +1325,8 @@ class TranslationsRateSheetEn {
/// en: 'No match found'
String get notAvailable => 'No match found';
- /// en: 'Connect a tracker in Settings to rate there.'
- String get noConnectedTrackers => 'Connect a tracker in Settings to rate there.';
+ /// en: 'Connect a service in Settings to rate there.'
+ String get noConnectedServices => 'Connect a service in Settings to rate there.';
}
// Path: accessibility
@@ -2502,6 +2504,78 @@ class TranslationsNavigationEn {
/// en: 'Live TV'
String get liveTv => 'Live TV';
+
+ /// en: 'Explore'
+ String get explore => 'Explore';
+}
+
+// Path: explore
+class TranslationsExploreEn {
+ TranslationsExploreEn.internal(this._root);
+
+ final Translations _root; // ignore: unused_field
+
+ // Translations
+
+ /// en: 'Explore'
+ String get title => 'Explore';
+
+ /// en: 'Select source'
+ String get selectSource => 'Select source';
+
+ late final TranslationsExploreRowsEn rows = TranslationsExploreRowsEn.internal(_root);
+ late final TranslationsExploreStatusEn status = TranslationsExploreStatusEn.internal(_root);
+
+ /// en: '(one) {${n} episode} (other) {${n} episodes}'
+ String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n,
+ one: '${n} episode',
+ other: '${n} episodes',
+ );
+
+ /// en: 'Cast'
+ String get cast => 'Cast';
+
+ /// en: 'Characters'
+ String get characters => 'Characters';
+
+ /// en: 'Add to Watchlist'
+ String get addToWatchlist => 'Add to Watchlist';
+
+ /// en: 'Remove from Watchlist'
+ String get removeFromWatchlist => 'Remove from Watchlist';
+
+ /// en: 'Couldn't update watchlist'
+ String get watchlistUpdateFailed => 'Couldn\'t update watchlist';
+
+ /// en: 'Not in your library'
+ String get notInLibrary => 'Not in your library';
+
+ /// en: 'In these libraries'
+ String get inTheseLibraries => 'In these libraries';
+
+ /// en: 'Available on ${server}'
+ String availableOn({required Object server}) => 'Available on ${server}';
+
+ /// en: 'Checking your library...'
+ String get checkingLibrary => 'Checking your library...';
+
+ /// en: 'Nothing here yet'
+ String get emptyTitle => 'Nothing here yet';
+
+ /// en: 'Rows from ${source} will appear here once they have content.'
+ String emptyMessage({required Object source}) => 'Rows from ${source} will appear here once they have content.';
+
+ /// en: 'Search ${source}'
+ String searchHint({required Object source}) => 'Search ${source}';
+
+ /// en: 'No results for "${query}"'
+ String searchEmpty({required Object query}) => 'No results for "${query}"';
+
+ /// en: 'Search for movies and shows on ${source}.'
+ String searchPrompt({required Object source}) => 'Search for movies and shows on ${source}.';
+
+ /// en: 'Search failed. Check your connection and try again.'
+ String get searchFailed => 'Search failed. Check your connection and try again.';
}
// Path: liveTv
@@ -3973,19 +4047,118 @@ class TranslationsTraktEn {
String get watchedSyncDescription => 'When you mark items watched in Plezy, mark them on Trakt.';
}
-// Path: trackers
-class TranslationsTrackersEn {
- TranslationsTrackersEn.internal(this._root);
+// Path: seerr
+class TranslationsSeerrEn {
+ TranslationsSeerrEn.internal(this._root);
final Translations _root; // ignore: unused_field
// Translations
- /// en: 'Trackers'
- String get title => 'Trackers';
+ /// en: 'Seerr'
+ String get title => 'Seerr';
- /// en: 'Sync watch progress with Trakt and other services.'
- String get hubSubtitle => 'Sync watch progress with Trakt and other services.';
+ /// en: 'Connect Seerr'
+ String get connectTitle => 'Connect Seerr';
+
+ /// en: 'Server URL'
+ String get serverUrl => 'Server URL';
+
+ /// en: 'The address of your Seerr instance'
+ String get serverUrlHelper => 'The address of your Seerr instance';
+
+ /// en: 'Continue'
+ String get checkServer => 'Continue';
+
+ /// en: 'Sign in with Jellyfin'
+ String get signInWithJellyfin => 'Sign in with Jellyfin';
+
+ /// en: 'Sign in with Emby'
+ String get signInWithEmby => 'Sign in with Emby';
+
+ /// en: 'Use a local account'
+ String get signInWithLocal => 'Use a local account';
+
+ /// en: 'Email'
+ String get email => 'Email';
+
+ /// en: 'This Seerr instance offers no sign-in method Plezy supports.'
+ String get noSignInMethods => 'This Seerr instance offers no sign-in method Plezy supports.';
+
+ /// en: 'Instance'
+ String get instance => 'Instance';
+
+ /// en: 'Disconnect Seerr?'
+ String get disconnectConfirm => 'Disconnect Seerr?';
+
+ /// en: 'Plezy will forget this Seerr instance. Reconnect any time.'
+ String get disconnectConfirmBody => 'Plezy will forget this Seerr instance. Reconnect any time.';
+
+ /// en: 'Request'
+ String get request => 'Request';
+
+ /// en: 'Request in 4K'
+ String get request4k => 'Request in 4K';
+
+ /// en: 'Seasons'
+ String get seasons => 'Seasons';
+
+ /// en: 'All seasons'
+ String get allSeasons => 'All seasons';
+
+ /// en: 'Advanced'
+ String get advancedOptions => 'Advanced';
+
+ /// en: 'Destination server'
+ String get destinationServer => 'Destination server';
+
+ /// en: 'Quality profile'
+ String get qualityProfile => 'Quality profile';
+
+ /// en: 'Root folder'
+ String get rootFolder => 'Root folder';
+
+ /// en: 'Language profile'
+ String get languageProfile => 'Language profile';
+
+ /// en: 'Request submitted'
+ String get requestSubmitted => 'Request submitted';
+
+ /// en: 'Request failed: ${error}'
+ String requestFailed({required Object error}) => 'Request failed: ${error}';
+
+ /// en: 'Couldn't load request options'
+ String get requestsLoadFailed => 'Couldn\'t load request options';
+
+ /// en: 'Everything is already available or requested.'
+ String get nothingToRequest => 'Everything is already available or requested.';
+
+ /// en: 'Available'
+ String get statusAvailable => 'Available';
+
+ /// en: 'Partially available'
+ String get statusPartiallyAvailable => 'Partially available';
+
+ /// en: 'Requested'
+ String get statusRequested => 'Requested';
+
+ /// en: 'Processing'
+ String get statusProcessing => 'Processing';
+}
+
+// Path: services
+class TranslationsServicesEn {
+ TranslationsServicesEn.internal(this._root);
+
+ final Translations _root; // ignore: unused_field
+
+ // Translations
+
+ /// en: 'Services'
+ String get title => 'Services';
+
+ /// en: 'Sync watch progress and request new titles.'
+ String get hubSubtitle => 'Sync watch progress and request new titles.';
/// en: 'Not connected'
String get notConnected => 'Not connected';
@@ -4008,10 +4181,10 @@ class TranslationsTrackersEn {
/// en: 'Couldn't connect to ${service}. Try again.'
String connectFailed({required Object service}) => 'Couldn\'t connect to ${service}. Try again.';
- late final TranslationsTrackersServicesEn services = TranslationsTrackersServicesEn.internal(_root);
- late final TranslationsTrackersDeviceCodeEn deviceCode = TranslationsTrackersDeviceCodeEn.internal(_root);
- late final TranslationsTrackersOauthProxyEn oauthProxy = TranslationsTrackersOauthProxyEn.internal(_root);
- late final TranslationsTrackersLibraryFilterEn libraryFilter = TranslationsTrackersLibraryFilterEn.internal(_root);
+ late final TranslationsServicesNamesEn names = TranslationsServicesNamesEn.internal(_root);
+ late final TranslationsServicesDeviceCodeEn deviceCode = TranslationsServicesDeviceCodeEn.internal(_root);
+ late final TranslationsServicesOauthProxyEn oauthProxy = TranslationsServicesOauthProxyEn.internal(_root);
+ late final TranslationsServicesLibraryFilterEn libraryFilter = TranslationsServicesLibraryFilterEn.internal(_root);
}
// Path: addServer
@@ -4383,6 +4556,75 @@ class TranslationsLibrariesSortLabelsEn {
String get lastEpisodeDateAdded => 'Last Episode Date Added';
}
+// Path: explore.rows
+class TranslationsExploreRowsEn {
+ TranslationsExploreRowsEn.internal(this._root);
+
+ final Translations _root; // ignore: unused_field
+
+ // Translations
+
+ /// en: 'Watchlist'
+ String get watchlist => 'Watchlist';
+
+ /// en: 'Recommended Movies'
+ String get recommendedMovies => 'Recommended Movies';
+
+ /// en: 'Recommended Shows'
+ String get recommendedShows => 'Recommended Shows';
+
+ /// en: 'Trending Movies'
+ String get trendingMovies => 'Trending Movies';
+
+ /// en: 'Trending Shows'
+ String get trendingShows => 'Trending Shows';
+
+ /// en: 'Popular Movies'
+ String get popularMovies => 'Popular Movies';
+
+ /// en: 'Popular Shows'
+ String get popularShows => 'Popular Shows';
+
+ /// en: 'Suggested Anime'
+ String get suggestedAnime => 'Suggested Anime';
+
+ /// en: 'Top Airing Anime'
+ String get airingAnime => 'Top Airing Anime';
+
+ /// en: 'Most Popular Anime'
+ String get popularAnime => 'Most Popular Anime';
+
+ /// en: 'Trending'
+ String get trending => 'Trending';
+
+ /// en: 'Upcoming Movies'
+ String get upcomingMovies => 'Upcoming Movies';
+
+ /// en: 'Upcoming Shows'
+ String get upcomingShows => 'Upcoming Shows';
+}
+
+// Path: explore.status
+class TranslationsExploreStatusEn {
+ TranslationsExploreStatusEn.internal(this._root);
+
+ final Translations _root; // ignore: unused_field
+
+ // Translations
+
+ /// en: 'Airing'
+ String get airing => 'Airing';
+
+ /// en: 'Ended'
+ String get ended => 'Ended';
+
+ /// en: 'Canceled'
+ String get canceled => 'Canceled';
+
+ /// en: 'Upcoming'
+ String get upcoming => 'Upcoming';
+}
+
// Path: companionRemote.session
class TranslationsCompanionRemoteSessionEn {
TranslationsCompanionRemoteSessionEn.internal(this._root);
@@ -4599,9 +4841,9 @@ class TranslationsCompanionRemoteErrorsEn {
String get connectionLost => 'Connection lost';
}
-// Path: trackers.services
-class TranslationsTrackersServicesEn {
- TranslationsTrackersServicesEn.internal(this._root);
+// Path: services.names
+class TranslationsServicesNamesEn {
+ TranslationsServicesNamesEn.internal(this._root);
final Translations _root; // ignore: unused_field
@@ -4615,11 +4857,14 @@ class TranslationsTrackersServicesEn {
/// en: 'Simkl'
String get simkl => 'Simkl';
+
+ /// en: 'Seerr'
+ String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class TranslationsTrackersDeviceCodeEn {
- TranslationsTrackersDeviceCodeEn.internal(this._root);
+// Path: services.deviceCode
+class TranslationsServicesDeviceCodeEn {
+ TranslationsServicesDeviceCodeEn.internal(this._root);
final Translations _root; // ignore: unused_field
@@ -4641,9 +4886,9 @@ class TranslationsTrackersDeviceCodeEn {
String get codeCopied => 'Code copied';
}
-// Path: trackers.oauthProxy
-class TranslationsTrackersOauthProxyEn {
- TranslationsTrackersOauthProxyEn.internal(this._root);
+// Path: services.oauthProxy
+class TranslationsServicesOauthProxyEn {
+ TranslationsServicesOauthProxyEn.internal(this._root);
final Translations _root; // ignore: unused_field
@@ -4662,9 +4907,9 @@ class TranslationsTrackersOauthProxyEn {
String get urlCopied => 'URL copied';
}
-// Path: trackers.libraryFilter
-class TranslationsTrackersLibraryFilterEn {
- TranslationsTrackersLibraryFilterEn.internal(this._root);
+// Path: services.libraryFilter
+class TranslationsServicesLibraryFilterEn {
+ TranslationsServicesLibraryFilterEn.internal(this._root);
final Translations _root; // ignore: unused_field
@@ -4958,8 +5203,8 @@ extension on Translations {
'settings.discordRichPresenceDescription' => 'Show what you\'re watching on Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Sync watch history with Trakt',
- 'settings.trackers' => 'Trackers',
- 'settings.trackersDescription' => 'Sync progress to Trakt, MyAnimeList, AniList, and Simkl',
+ 'settings.services' => 'Services',
+ 'settings.servicesDescription' => 'Connect Trakt, MyAnimeList, Seerr, and more',
'settings.manageLibrariesDescription' => 'Reorder and hide libraries',
'settings.companionRemoteServer' => 'Companion Remote Server',
'settings.companionRemoteServerDescription' => 'Allow mobile devices on your network to control this app',
@@ -5118,7 +5363,7 @@ extension on Translations {
'rateSheet.favorited' => 'Favorited',
'rateSheet.saved' => 'Saved',
'rateSheet.notAvailable' => 'No match found',
- 'rateSheet.noConnectedTrackers' => 'Connect a tracker in Settings to rate there.',
+ 'rateSheet.noConnectedServices' => 'Connect a service in Settings to rate there.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, movie',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV show',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -5502,6 +5747,42 @@ extension on Translations {
'navigation.libraries' => 'Libraries',
'navigation.downloads' => 'Downloads',
'navigation.liveTv' => 'Live TV',
+ 'navigation.explore' => 'Explore',
+ 'explore.title' => 'Explore',
+ 'explore.selectSource' => 'Select source',
+ 'explore.rows.watchlist' => 'Watchlist',
+ 'explore.rows.recommendedMovies' => 'Recommended Movies',
+ 'explore.rows.recommendedShows' => 'Recommended Shows',
+ 'explore.rows.trendingMovies' => 'Trending Movies',
+ 'explore.rows.trendingShows' => 'Trending Shows',
+ 'explore.rows.popularMovies' => 'Popular Movies',
+ 'explore.rows.popularShows' => 'Popular Shows',
+ 'explore.rows.suggestedAnime' => 'Suggested Anime',
+ 'explore.rows.airingAnime' => 'Top Airing Anime',
+ 'explore.rows.popularAnime' => 'Most Popular Anime',
+ 'explore.rows.trending' => 'Trending',
+ 'explore.rows.upcomingMovies' => 'Upcoming Movies',
+ 'explore.rows.upcomingShows' => 'Upcoming Shows',
+ 'explore.status.airing' => 'Airing',
+ 'explore.status.ended' => 'Ended',
+ 'explore.status.canceled' => 'Canceled',
+ 'explore.status.upcoming' => 'Upcoming',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n, one: '${n} episode', other: '${n} episodes', ),
+ 'explore.cast' => 'Cast',
+ 'explore.characters' => 'Characters',
+ 'explore.addToWatchlist' => 'Add to Watchlist',
+ 'explore.removeFromWatchlist' => 'Remove from Watchlist',
+ 'explore.watchlistUpdateFailed' => 'Couldn\'t update watchlist',
+ 'explore.notInLibrary' => 'Not in your library',
+ 'explore.inTheseLibraries' => 'In these libraries',
+ 'explore.availableOn' => ({required Object server}) => 'Available on ${server}',
+ 'explore.checkingLibrary' => 'Checking your library...',
+ 'explore.emptyTitle' => 'Nothing here yet',
+ 'explore.emptyMessage' => ({required Object source}) => 'Rows from ${source} will appear here once they have content.',
+ 'explore.searchHint' => ({required Object source}) => 'Search ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'No results for "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Search for movies and shows on ${source}.',
+ 'explore.searchFailed' => 'Search failed. Check your connection and try again.',
'liveTv.title' => 'Live TV',
'liveTv.guide' => 'Guide',
'liveTv.noChannels' => 'No channels available',
@@ -5705,6 +5986,8 @@ extension on Translations {
'downloads.movies' => 'Movies',
'downloads.music' => 'Music',
'downloads.tracksQueued' => ({required Object count}) => '${count} tracks queued for download',
+ _ => null,
+ } ?? switch (path) {
'downloads.noDownloads' => 'No downloads yet',
'downloads.noDownloadsDescription' => 'Downloaded content will appear here for offline viewing',
'downloads.downloadNow' => 'Download',
@@ -5741,8 +6024,6 @@ extension on Translations {
'downloads.customAmount' => 'Custom amount...',
'downloads.includeSpecials' => 'Include Specials',
'downloads.howManyEpisodes' => 'How many episodes?',
- _ => null,
- } ?? switch (path) {
'downloads.itemsQueued' => ({required Object count}) => '${count} items queued for download',
'downloads.keepSynced' => 'Keep synced',
'downloads.downloadOnce' => 'Download once',
@@ -6006,39 +6287,70 @@ extension on Translations {
'trakt.scrobbleDescription' => 'Send play, pause, and stop events to Trakt during playback.',
'trakt.watchedSync' => 'Sync watched status',
'trakt.watchedSyncDescription' => 'When you mark items watched in Plezy, mark them on Trakt.',
- 'trackers.title' => 'Trackers',
- 'trackers.hubSubtitle' => 'Sync watch progress with Trakt and other services.',
- 'trackers.notConnected' => 'Not connected',
- 'trackers.connectedAs' => ({required Object username}) => 'Connected as @${username}',
- 'trackers.scrobble' => 'Track progress automatically',
- 'trackers.scrobbleDescription' => 'Update your list when you finish an episode or movie.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Disconnect ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy will stop updating ${service}. Reconnect any time.',
- 'trackers.connectFailed' => ({required Object service}) => 'Couldn\'t connect to ${service}. Try again.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Activate Plezy on ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Visit ${url} and enter this code:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Open ${service} to activate',
- 'trackers.deviceCode.waitingForAuthorization' => 'Waiting for authorization…',
- 'trackers.deviceCode.codeCopied' => 'Code copied',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Sign in to ${service}',
- 'trackers.oauthProxy.body' => 'Scan this QR code or open the URL on any device.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Open ${service} to sign in',
- 'trackers.oauthProxy.urlCopied' => 'URL copied',
- 'trackers.libraryFilter.title' => 'Library filter',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Syncing all libraries',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Nothing syncing',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blocked',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} allowed',
- 'trackers.libraryFilter.mode' => 'Filter mode',
- 'trackers.libraryFilter.modeBlacklist' => 'Blacklist',
- 'trackers.libraryFilter.modeWhitelist' => 'Whitelist',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Sync every library except the ones checked below.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Sync only the libraries checked below.',
- 'trackers.libraryFilter.libraries' => 'Libraries',
- 'trackers.libraryFilter.noLibraries' => 'No libraries available',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Connect Seerr',
+ 'seerr.serverUrl' => 'Server URL',
+ 'seerr.serverUrlHelper' => 'The address of your Seerr instance',
+ 'seerr.checkServer' => 'Continue',
+ 'seerr.signInWithJellyfin' => 'Sign in with Jellyfin',
+ 'seerr.signInWithEmby' => 'Sign in with Emby',
+ 'seerr.signInWithLocal' => 'Use a local account',
+ 'seerr.email' => 'Email',
+ 'seerr.noSignInMethods' => 'This Seerr instance offers no sign-in method Plezy supports.',
+ 'seerr.instance' => 'Instance',
+ 'seerr.disconnectConfirm' => 'Disconnect Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy will forget this Seerr instance. Reconnect any time.',
+ 'seerr.request' => 'Request',
+ 'seerr.request4k' => 'Request in 4K',
+ 'seerr.seasons' => 'Seasons',
+ 'seerr.allSeasons' => 'All seasons',
+ 'seerr.advancedOptions' => 'Advanced',
+ 'seerr.destinationServer' => 'Destination server',
+ 'seerr.qualityProfile' => 'Quality profile',
+ 'seerr.rootFolder' => 'Root folder',
+ 'seerr.languageProfile' => 'Language profile',
+ 'seerr.requestSubmitted' => 'Request submitted',
+ 'seerr.requestFailed' => ({required Object error}) => 'Request failed: ${error}',
+ 'seerr.requestsLoadFailed' => 'Couldn\'t load request options',
+ 'seerr.nothingToRequest' => 'Everything is already available or requested.',
+ 'seerr.statusAvailable' => 'Available',
+ 'seerr.statusPartiallyAvailable' => 'Partially available',
+ 'seerr.statusRequested' => 'Requested',
+ 'seerr.statusProcessing' => 'Processing',
+ 'services.title' => 'Services',
+ 'services.hubSubtitle' => 'Sync watch progress and request new titles.',
+ 'services.notConnected' => 'Not connected',
+ 'services.connectedAs' => ({required Object username}) => 'Connected as @${username}',
+ 'services.scrobble' => 'Track progress automatically',
+ 'services.scrobbleDescription' => 'Update your list when you finish an episode or movie.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Disconnect ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy will stop updating ${service}. Reconnect any time.',
+ 'services.connectFailed' => ({required Object service}) => 'Couldn\'t connect to ${service}. Try again.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Activate Plezy on ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Visit ${url} and enter this code:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Open ${service} to activate',
+ 'services.deviceCode.waitingForAuthorization' => 'Waiting for authorization…',
+ 'services.deviceCode.codeCopied' => 'Code copied',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Sign in to ${service}',
+ 'services.oauthProxy.body' => 'Scan this QR code or open the URL on any device.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Open ${service} to sign in',
+ 'services.oauthProxy.urlCopied' => 'URL copied',
+ 'services.libraryFilter.title' => 'Library filter',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Syncing all libraries',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Nothing syncing',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blocked',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} allowed',
+ 'services.libraryFilter.mode' => 'Filter mode',
+ 'services.libraryFilter.modeBlacklist' => 'Blacklist',
+ 'services.libraryFilter.modeWhitelist' => 'Whitelist',
+ 'services.libraryFilter.modeHintBlacklist' => 'Sync every library except the ones checked below.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Sync only the libraries checked below.',
+ 'services.libraryFilter.libraries' => 'Libraries',
+ 'services.libraryFilter.noLibraries' => 'No libraries available',
'addServer.addJellyfinTitle' => 'Add Jellyfin server',
'addServer.serverUrls' => 'Server URLs',
'addServer.serverUrlsHelper' => 'Multiple URLs allowed, separated by commas.',
diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart
index 5e22d6e8..465e5b0f 100644
--- a/lib/i18n/strings_es.g.dart
+++ b/lib/i18n/strings_es.g.dart
@@ -69,6 +69,7 @@ class TranslationsEs extends Translations with BaseTranslations 'Mostrar lo que estás viendo en Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Sincronizar historial de visualización con Trakt';
- @override String get trackers => 'Rastreadores';
- @override String get trackersDescription => 'Sincronizar progreso con Trakt, MyAnimeList, AniList y Simkl';
+ @override String get services => 'Servicios';
+ @override String get servicesDescription => 'Conecta Trakt, MyAnimeList, Seerr y más';
@override String get companionRemoteServer => 'Servidor de control remoto';
@override String get companionRemoteServerDescription => 'Permitir que dispositivos móviles en tu red controlen esta aplicación';
@override String get autoPip => 'Imagen en imagen automática';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetEs extends TranslationsRateSheetEn {
@override String get setScore => 'Establecer puntuación';
@override String get saved => 'Guardado';
@override String get notAvailable => 'No se encontró coincidencia';
- @override String get noConnectedTrackers => 'Conecta un tracker en Ajustes para calificar allí.';
+ @override String get noConnectedServices => 'Conecta un servicio en Configuración para calificar ahí.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationEs extends TranslationsNavigationEn {
@override String get libraries => 'Medios';
@override String get downloads => 'Descargas';
@override String get liveTv => 'TV en vivo';
+ @override String get explore => 'Explorar';
+}
+
+// Path: explore
+class _TranslationsExploreEs extends TranslationsExploreEn {
+ _TranslationsExploreEs._(TranslationsEs root) : this._root = root, super.internal(root);
+
+ final TranslationsEs _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Explorar';
+ @override String get selectSource => 'Seleccionar fuente';
+ @override late final _TranslationsExploreRowsEs rows = _TranslationsExploreRowsEs._(_root);
+ @override late final _TranslationsExploreStatusEs status = _TranslationsExploreStatusEs._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n,
+ one: '${n} episodio',
+ other: '${n} episodios',
+ );
+ @override String get cast => 'Reparto';
+ @override String get characters => 'Personajes';
+ @override String get addToWatchlist => 'Añadir a la lista de seguimiento';
+ @override String get removeFromWatchlist => 'Quitar de la lista de seguimiento';
+ @override String get watchlistUpdateFailed => 'No se pudo actualizar la lista de seguimiento';
+ @override String get notInLibrary => 'No está en tu biblioteca';
+ @override String get inTheseLibraries => 'En estas bibliotecas';
+ @override String availableOn({required Object server}) => 'Disponible en ${server}';
+ @override String get checkingLibrary => 'Comprobando tu biblioteca...';
+ @override String get emptyTitle => 'Aquí no hay nada todavía';
+ @override String emptyMessage({required Object source}) => 'Las filas de ${source} aparecerán aquí cuando tengan contenido.';
+ @override String searchHint({required Object source}) => 'Buscar en ${source}';
+ @override String searchEmpty({required Object query}) => 'Sin resultados para "${query}"';
+ @override String searchPrompt({required Object source}) => 'Busca películas y series en ${source}.';
+ @override String get searchFailed => 'La búsqueda falló. Comprueba tu conexión e inténtalo de nuevo.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktEs extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Cuando marques elementos como vistos en Plezy, también se marcarán en Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersEs extends TranslationsTrackersEn {
- _TranslationsTrackersEs._(TranslationsEs root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrEs extends TranslationsSeerrEn {
+ _TranslationsSeerrEs._(TranslationsEs root) : this._root = root, super.internal(root);
final TranslationsEs _root; // ignore: unused_field
// Translations
- @override String get title => 'Rastreadores';
- @override String get hubSubtitle => 'Sincroniza el progreso de visualización con Trakt y otros servicios.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Conectar Seerr';
+ @override String get serverUrl => 'URL del servidor';
+ @override String get serverUrlHelper => 'La dirección de tu instancia de Seerr';
+ @override String get checkServer => 'Continuar';
+ @override String get signInWithJellyfin => 'Iniciar sesión con Jellyfin';
+ @override String get signInWithEmby => 'Iniciar sesión con Emby';
+ @override String get signInWithLocal => 'Usar una cuenta local';
+ @override String get email => 'Correo electrónico';
+ @override String get noSignInMethods => 'Esta instancia de Seerr no ofrece ningún método de inicio de sesión compatible con Plezy.';
+ @override String get instance => 'Instancia';
+ @override String get disconnectConfirm => '¿Desconectar Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy olvidará esta instancia de Seerr. Reconecta cuando quieras.';
+ @override String get request => 'Solicitar';
+ @override String get request4k => 'Solicitar en 4K';
+ @override String get seasons => 'Temporadas';
+ @override String get allSeasons => 'Todas las temporadas';
+ @override String get advancedOptions => 'Avanzado';
+ @override String get destinationServer => 'Servidor de destino';
+ @override String get qualityProfile => 'Perfil de calidad';
+ @override String get rootFolder => 'Carpeta raíz';
+ @override String get languageProfile => 'Perfil de idioma';
+ @override String get requestSubmitted => 'Solicitud enviada';
+ @override String requestFailed({required Object error}) => 'La solicitud falló: ${error}';
+ @override String get requestsLoadFailed => 'No se pudieron cargar las opciones de solicitud';
+ @override String get nothingToRequest => 'Todo ya está disponible o solicitado.';
+ @override String get statusAvailable => 'Disponible';
+ @override String get statusPartiallyAvailable => 'Parcialmente disponible';
+ @override String get statusRequested => 'Solicitado';
+ @override String get statusProcessing => 'Procesando';
+}
+
+// Path: services
+class _TranslationsServicesEs extends TranslationsServicesEn {
+ _TranslationsServicesEs._(TranslationsEs root) : this._root = root, super.internal(root);
+
+ final TranslationsEs _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Servicios';
+ @override String get hubSubtitle => 'Sincroniza tu progreso de visualización y solicita nuevos títulos.';
@override String get notConnected => 'No conectado';
@override String connectedAs({required Object username}) => 'Conectado como @${username}';
@override String get scrobble => 'Registrar progreso automáticamente';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersEs extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => '¿Desconectar ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy dejará de actualizar ${service}. Reconecta cuando quieras.';
@override String connectFailed({required Object service}) => 'No se pudo conectar a ${service}. Inténtalo de nuevo.';
- @override late final _TranslationsTrackersServicesEs services = _TranslationsTrackersServicesEs._(_root);
- @override late final _TranslationsTrackersDeviceCodeEs deviceCode = _TranslationsTrackersDeviceCodeEs._(_root);
- @override late final _TranslationsTrackersOauthProxyEs oauthProxy = _TranslationsTrackersOauthProxyEs._(_root);
- @override late final _TranslationsTrackersLibraryFilterEs libraryFilter = _TranslationsTrackersLibraryFilterEs._(_root);
+ @override late final _TranslationsServicesNamesEs names = _TranslationsServicesNamesEs._(_root);
+ @override late final _TranslationsServicesDeviceCodeEs deviceCode = _TranslationsServicesDeviceCodeEs._(_root);
+ @override late final _TranslationsServicesOauthProxyEs oauthProxy = _TranslationsServicesOauthProxyEs._(_root);
+ @override late final _TranslationsServicesLibraryFilterEs libraryFilter = _TranslationsServicesLibraryFilterEs._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsEs extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Fecha de adición del último episodio';
}
+// Path: explore.rows
+class _TranslationsExploreRowsEs extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsEs._(TranslationsEs root) : this._root = root, super.internal(root);
+
+ final TranslationsEs _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Lista de seguimiento';
+ @override String get recommendedMovies => 'Películas recomendadas';
+ @override String get recommendedShows => 'Series recomendadas';
+ @override String get trendingMovies => 'Películas en tendencia';
+ @override String get trendingShows => 'Series en tendencia';
+ @override String get popularMovies => 'Películas populares';
+ @override String get popularShows => 'Series populares';
+ @override String get suggestedAnime => 'Anime sugerido';
+ @override String get airingAnime => 'Mejor anime en emisión';
+ @override String get popularAnime => 'Anime más popular';
+ @override String get trending => 'Tendencias';
+ @override String get upcomingMovies => 'Próximas películas';
+ @override String get upcomingShows => 'Próximas series';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusEs extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusEs._(TranslationsEs root) : this._root = root, super.internal(root);
+
+ final TranslationsEs _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'En emisión';
+ @override String get ended => 'Finalizada';
+ @override String get canceled => 'Cancelada';
+ @override String get upcoming => 'Próximamente';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionEs extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionEs._(TranslationsEs root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsEs extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Conexión perdida';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesEs extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesEs._(TranslationsEs root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesEs extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesEs._(TranslationsEs root) : this._root = root, super.internal(root);
final TranslationsEs _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesEs extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeEs extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeEs._(TranslationsEs root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeEs extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeEs._(TranslationsEs root) : this._root = root, super.internal(root);
final TranslationsEs _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeEs extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Código copiado';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyEs extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyEs._(TranslationsEs root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyEs extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyEs._(TranslationsEs root) : this._root = root, super.internal(root);
final TranslationsEs _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyEs extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL copiada';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterEs extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterEs._(TranslationsEs root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterEs extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterEs._(TranslationsEs root) : this._root = root, super.internal(root);
final TranslationsEs _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsEs {
'settings.discordRichPresenceDescription' => 'Mostrar lo que estás viendo en Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Sincronizar historial de visualización con Trakt',
- 'settings.trackers' => 'Rastreadores',
- 'settings.trackersDescription' => 'Sincronizar progreso con Trakt, MyAnimeList, AniList y Simkl',
+ 'settings.services' => 'Servicios',
+ 'settings.servicesDescription' => 'Conecta Trakt, MyAnimeList, Seerr y más',
'settings.companionRemoteServer' => 'Servidor de control remoto',
'settings.companionRemoteServerDescription' => 'Permitir que dispositivos móviles en tu red controlen esta aplicación',
'settings.autoPip' => 'Imagen en imagen automática',
@@ -2390,7 +2500,7 @@ extension on TranslationsEs {
'rateSheet.setScore' => 'Establecer puntuación',
'rateSheet.saved' => 'Guardado',
'rateSheet.notAvailable' => 'No se encontró coincidencia',
- 'rateSheet.noConnectedTrackers' => 'Conecta un tracker en Ajustes para calificar allí.',
+ 'rateSheet.noConnectedServices' => 'Conecta un servicio en Configuración para calificar ahí.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, película',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, serie de TV',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsEs {
'navigation.libraries' => 'Medios',
'navigation.downloads' => 'Descargas',
'navigation.liveTv' => 'TV en vivo',
+ 'navigation.explore' => 'Explorar',
+ 'explore.title' => 'Explorar',
+ 'explore.selectSource' => 'Seleccionar fuente',
+ 'explore.rows.watchlist' => 'Lista de seguimiento',
+ 'explore.rows.recommendedMovies' => 'Películas recomendadas',
+ 'explore.rows.recommendedShows' => 'Series recomendadas',
+ 'explore.rows.trendingMovies' => 'Películas en tendencia',
+ 'explore.rows.trendingShows' => 'Series en tendencia',
+ 'explore.rows.popularMovies' => 'Películas populares',
+ 'explore.rows.popularShows' => 'Series populares',
+ 'explore.rows.suggestedAnime' => 'Anime sugerido',
+ 'explore.rows.airingAnime' => 'Mejor anime en emisión',
+ 'explore.rows.popularAnime' => 'Anime más popular',
+ 'explore.rows.trending' => 'Tendencias',
+ 'explore.rows.upcomingMovies' => 'Próximas películas',
+ 'explore.rows.upcomingShows' => 'Próximas series',
+ 'explore.status.airing' => 'En emisión',
+ 'explore.status.ended' => 'Finalizada',
+ 'explore.status.canceled' => 'Cancelada',
+ 'explore.status.upcoming' => 'Próximamente',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n, one: '${n} episodio', other: '${n} episodios', ),
+ 'explore.cast' => 'Reparto',
+ 'explore.characters' => 'Personajes',
+ 'explore.addToWatchlist' => 'Añadir a la lista de seguimiento',
+ 'explore.removeFromWatchlist' => 'Quitar de la lista de seguimiento',
+ 'explore.watchlistUpdateFailed' => 'No se pudo actualizar la lista de seguimiento',
+ 'explore.notInLibrary' => 'No está en tu biblioteca',
+ 'explore.inTheseLibraries' => 'En estas bibliotecas',
+ 'explore.availableOn' => ({required Object server}) => 'Disponible en ${server}',
+ 'explore.checkingLibrary' => 'Comprobando tu biblioteca...',
+ 'explore.emptyTitle' => 'Aquí no hay nada todavía',
+ 'explore.emptyMessage' => ({required Object source}) => 'Las filas de ${source} aparecerán aquí cuando tengan contenido.',
+ 'explore.searchHint' => ({required Object source}) => 'Buscar en ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Sin resultados para "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Busca películas y series en ${source}.',
+ 'explore.searchFailed' => 'La búsqueda falló. Comprueba tu conexión e inténtalo de nuevo.',
'liveTv.title' => 'TV en vivo',
'liveTv.guide' => 'Guía',
'liveTv.noChannels' => 'No hay canales disponibles',
@@ -2986,6 +3132,8 @@ extension on TranslationsEs {
'downloads.cancelledDownloadMessage' => 'Esta descarga se canceló. ¿Qué quieres hacer?',
'downloads.allEpisodesAlreadyDownloaded' => 'Todos los episodios ya están descargados',
'downloads.resumeDownload' => 'Reanudar descarga',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Descarga cancelada',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (sincronizando ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} descargado — haz clic para completar',
@@ -3022,8 +3170,6 @@ extension on TranslationsEs {
'downloads.noSyncRules' => 'Sin reglas de sincronización',
'downloads.manageSyncRule' => 'Gestionar sincronización',
'downloads.editEpisodeCount' => 'Número de episodios',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Filtro de sincronización',
'downloads.syncAllItems' => 'Sincronizando todos los elementos',
'downloads.syncUnwatchedItems' => 'Sincronizando elementos no vistos',
@@ -3272,39 +3418,70 @@ extension on TranslationsEs {
'trakt.scrobbleDescription' => 'Enviar eventos de reproducción, pausa y parada a Trakt durante la reproducción.',
'trakt.watchedSync' => 'Sincronizar estado de visto',
'trakt.watchedSyncDescription' => 'Cuando marques elementos como vistos en Plezy, también se marcarán en Trakt.',
- 'trackers.title' => 'Rastreadores',
- 'trackers.hubSubtitle' => 'Sincroniza el progreso de visualización con Trakt y otros servicios.',
- 'trackers.notConnected' => 'No conectado',
- 'trackers.connectedAs' => ({required Object username}) => 'Conectado como @${username}',
- 'trackers.scrobble' => 'Registrar progreso automáticamente',
- 'trackers.scrobbleDescription' => 'Actualiza tu lista cuando termines un episodio o película.',
- 'trackers.disconnectConfirm' => ({required Object service}) => '¿Desconectar ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy dejará de actualizar ${service}. Reconecta cuando quieras.',
- 'trackers.connectFailed' => ({required Object service}) => 'No se pudo conectar a ${service}. Inténtalo de nuevo.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Activar Plezy en ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Visita ${url} e introduce este código:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Abrir ${service} para activar',
- 'trackers.deviceCode.waitingForAuthorization' => 'Esperando autorización…',
- 'trackers.deviceCode.codeCopied' => 'Código copiado',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Inicia sesión en ${service}',
- 'trackers.oauthProxy.body' => 'Escanea este código QR o abre la URL en cualquier dispositivo.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Abrir ${service} para iniciar sesión',
- 'trackers.oauthProxy.urlCopied' => 'URL copiada',
- 'trackers.libraryFilter.title' => 'Filtro de bibliotecas',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Sincronizando todas las bibliotecas',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Nada se sincroniza',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloqueadas',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} permitidas',
- 'trackers.libraryFilter.mode' => 'Modo de filtro',
- 'trackers.libraryFilter.modeBlacklist' => 'Lista negra',
- 'trackers.libraryFilter.modeWhitelist' => 'Lista blanca',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Sincronizar todas las bibliotecas excepto las marcadas abajo.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Sincronizar solo las bibliotecas marcadas abajo.',
- 'trackers.libraryFilter.libraries' => 'Bibliotecas',
- 'trackers.libraryFilter.noLibraries' => 'No hay bibliotecas disponibles',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Conectar Seerr',
+ 'seerr.serverUrl' => 'URL del servidor',
+ 'seerr.serverUrlHelper' => 'La dirección de tu instancia de Seerr',
+ 'seerr.checkServer' => 'Continuar',
+ 'seerr.signInWithJellyfin' => 'Iniciar sesión con Jellyfin',
+ 'seerr.signInWithEmby' => 'Iniciar sesión con Emby',
+ 'seerr.signInWithLocal' => 'Usar una cuenta local',
+ 'seerr.email' => 'Correo electrónico',
+ 'seerr.noSignInMethods' => 'Esta instancia de Seerr no ofrece ningún método de inicio de sesión compatible con Plezy.',
+ 'seerr.instance' => 'Instancia',
+ 'seerr.disconnectConfirm' => '¿Desconectar Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy olvidará esta instancia de Seerr. Reconecta cuando quieras.',
+ 'seerr.request' => 'Solicitar',
+ 'seerr.request4k' => 'Solicitar en 4K',
+ 'seerr.seasons' => 'Temporadas',
+ 'seerr.allSeasons' => 'Todas las temporadas',
+ 'seerr.advancedOptions' => 'Avanzado',
+ 'seerr.destinationServer' => 'Servidor de destino',
+ 'seerr.qualityProfile' => 'Perfil de calidad',
+ 'seerr.rootFolder' => 'Carpeta raíz',
+ 'seerr.languageProfile' => 'Perfil de idioma',
+ 'seerr.requestSubmitted' => 'Solicitud enviada',
+ 'seerr.requestFailed' => ({required Object error}) => 'La solicitud falló: ${error}',
+ 'seerr.requestsLoadFailed' => 'No se pudieron cargar las opciones de solicitud',
+ 'seerr.nothingToRequest' => 'Todo ya está disponible o solicitado.',
+ 'seerr.statusAvailable' => 'Disponible',
+ 'seerr.statusPartiallyAvailable' => 'Parcialmente disponible',
+ 'seerr.statusRequested' => 'Solicitado',
+ 'seerr.statusProcessing' => 'Procesando',
+ 'services.title' => 'Servicios',
+ 'services.hubSubtitle' => 'Sincroniza tu progreso de visualización y solicita nuevos títulos.',
+ 'services.notConnected' => 'No conectado',
+ 'services.connectedAs' => ({required Object username}) => 'Conectado como @${username}',
+ 'services.scrobble' => 'Registrar progreso automáticamente',
+ 'services.scrobbleDescription' => 'Actualiza tu lista cuando termines un episodio o película.',
+ 'services.disconnectConfirm' => ({required Object service}) => '¿Desconectar ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy dejará de actualizar ${service}. Reconecta cuando quieras.',
+ 'services.connectFailed' => ({required Object service}) => 'No se pudo conectar a ${service}. Inténtalo de nuevo.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Activar Plezy en ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Visita ${url} e introduce este código:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Abrir ${service} para activar',
+ 'services.deviceCode.waitingForAuthorization' => 'Esperando autorización…',
+ 'services.deviceCode.codeCopied' => 'Código copiado',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Inicia sesión en ${service}',
+ 'services.oauthProxy.body' => 'Escanea este código QR o abre la URL en cualquier dispositivo.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Abrir ${service} para iniciar sesión',
+ 'services.oauthProxy.urlCopied' => 'URL copiada',
+ 'services.libraryFilter.title' => 'Filtro de bibliotecas',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Sincronizando todas las bibliotecas',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Nada se sincroniza',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloqueadas',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} permitidas',
+ 'services.libraryFilter.mode' => 'Modo de filtro',
+ 'services.libraryFilter.modeBlacklist' => 'Lista negra',
+ 'services.libraryFilter.modeWhitelist' => 'Lista blanca',
+ 'services.libraryFilter.modeHintBlacklist' => 'Sincronizar todas las bibliotecas excepto las marcadas abajo.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Sincronizar solo las bibliotecas marcadas abajo.',
+ 'services.libraryFilter.libraries' => 'Bibliotecas',
+ 'services.libraryFilter.noLibraries' => 'No hay bibliotecas disponibles',
'addServer.addJellyfinTitle' => 'Añadir servidor Jellyfin',
'addServer.serverUrls' => 'URL del servidor',
'addServer.serverUrlsHelper' => 'Se permiten varias URL, separadas por comas.',
diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart
index 3bc19e0f..24622311 100644
--- a/lib/i18n/strings_fr.g.dart
+++ b/lib/i18n/strings_fr.g.dart
@@ -69,6 +69,7 @@ class TranslationsFr extends Translations with BaseTranslations 'Montrez ce que vous regardez sur Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Synchroniser l\'historique de visionnage avec Trakt';
- @override String get trackers => 'Trackers';
- @override String get trackersDescription => 'Synchroniser la progression avec Trakt, MyAnimeList, AniList et Simkl';
+ @override String get services => 'Services';
+ @override String get servicesDescription => 'Connectez Trakt, MyAnimeList, Seerr et plus';
@override String get companionRemoteServer => 'Serveur de télécommande';
@override String get companionRemoteServerDescription => 'Autoriser les appareils mobiles de votre réseau à contrôler cette application';
@override String get autoPip => 'Image dans l\'image automatique';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetFr extends TranslationsRateSheetEn {
@override String get setScore => 'Définir une note';
@override String get saved => 'Enregistré';
@override String get notAvailable => 'Aucune correspondance trouvée';
- @override String get noConnectedTrackers => 'Connectez un tracker dans Paramètres pour y noter.';
+ @override String get noConnectedServices => 'Connectez un service dans les Réglages pour noter ici.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationFr extends TranslationsNavigationEn {
@override String get libraries => 'Medias';
@override String get downloads => 'Téléch.';
@override String get liveTv => 'TV direct';
+ @override String get explore => 'Explorer';
+}
+
+// Path: explore
+class _TranslationsExploreFr extends TranslationsExploreEn {
+ _TranslationsExploreFr._(TranslationsFr root) : this._root = root, super.internal(root);
+
+ final TranslationsFr _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Explorer';
+ @override String get selectSource => 'Sélectionner la source';
+ @override late final _TranslationsExploreRowsFr rows = _TranslationsExploreRowsFr._(_root);
+ @override late final _TranslationsExploreStatusFr status = _TranslationsExploreStatusFr._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n,
+ one: '${n} épisode',
+ other: '${n} épisodes',
+ );
+ @override String get cast => 'Cast';
+ @override String get characters => 'Personnages';
+ @override String get addToWatchlist => 'Ajouter à la liste de suivi';
+ @override String get removeFromWatchlist => 'Retirer de la liste de suivi';
+ @override String get watchlistUpdateFailed => 'Impossible de mettre à jour la liste de suivi';
+ @override String get notInLibrary => 'Absent de votre bibliothèque';
+ @override String get inTheseLibraries => 'Dans ces bibliothèques';
+ @override String availableOn({required Object server}) => 'Disponible sur ${server}';
+ @override String get checkingLibrary => 'Vérification de votre bibliothèque...';
+ @override String get emptyTitle => 'Rien ici pour l\'instant';
+ @override String emptyMessage({required Object source}) => 'Les rangées de ${source} apparaîtront ici une fois qu\'elles auront du contenu.';
+ @override String searchHint({required Object source}) => 'Rechercher dans ${source}';
+ @override String searchEmpty({required Object query}) => 'Aucun résultat pour "${query}"';
+ @override String searchPrompt({required Object source}) => 'Recherchez des films et des séries sur ${source}.';
+ @override String get searchFailed => 'Échec de la recherche. Vérifiez votre connexion et réessayez.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktFr extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Lorsque vous marquez un élément comme vu dans Plezy, il l\'est aussi sur Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersFr extends TranslationsTrackersEn {
- _TranslationsTrackersFr._(TranslationsFr root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrFr extends TranslationsSeerrEn {
+ _TranslationsSeerrFr._(TranslationsFr root) : this._root = root, super.internal(root);
final TranslationsFr _root; // ignore: unused_field
// Translations
- @override String get title => 'Trackers';
- @override String get hubSubtitle => 'Synchronisez la progression de visionnage avec Trakt et d\'autres services.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Connecter Seerr';
+ @override String get serverUrl => 'URL du serveur';
+ @override String get serverUrlHelper => 'L\'adresse de votre instance Seerr';
+ @override String get checkServer => 'Continuer';
+ @override String get signInWithJellyfin => 'Se connecter avec Jellyfin';
+ @override String get signInWithEmby => 'Se connecter avec Emby';
+ @override String get signInWithLocal => 'Utiliser un compte local';
+ @override String get email => 'E-mail';
+ @override String get noSignInMethods => 'Cette instance Seerr ne propose aucune méthode de connexion prise en charge par Plezy.';
+ @override String get instance => 'Instance';
+ @override String get disconnectConfirm => 'Déconnecter Seerr ?';
+ @override String get disconnectConfirmBody => 'Plezy oubliera cette instance Seerr. Reconnectez à tout moment.';
+ @override String get request => 'Demander';
+ @override String get request4k => 'Demander en 4K';
+ @override String get seasons => 'Saisons';
+ @override String get allSeasons => 'Toutes les saisons';
+ @override String get advancedOptions => 'Avancé';
+ @override String get destinationServer => 'Serveur de destination';
+ @override String get qualityProfile => 'Profil de qualité';
+ @override String get rootFolder => 'Dossier racine';
+ @override String get languageProfile => 'Profil de langue';
+ @override String get requestSubmitted => 'Demande envoyée';
+ @override String requestFailed({required Object error}) => 'Échec de la demande : ${error}';
+ @override String get requestsLoadFailed => 'Impossible de charger les options de demande';
+ @override String get nothingToRequest => 'Tout est déjà disponible ou demandé.';
+ @override String get statusAvailable => 'Disponible';
+ @override String get statusPartiallyAvailable => 'Partiellement disponible';
+ @override String get statusRequested => 'Demandé';
+ @override String get statusProcessing => 'En cours de traitement';
+}
+
+// Path: services
+class _TranslationsServicesFr extends TranslationsServicesEn {
+ _TranslationsServicesFr._(TranslationsFr root) : this._root = root, super.internal(root);
+
+ final TranslationsFr _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Services';
+ @override String get hubSubtitle => 'Synchronisez votre progression et demandez de nouveaux titres.';
@override String get notConnected => 'Non connecté';
@override String connectedAs({required Object username}) => 'Connecté en tant que @${username}';
@override String get scrobble => 'Suivre la progression automatiquement';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersFr extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Déconnecter ${service} ?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy cessera de mettre à jour ${service}. Reconnectez à tout moment.';
@override String connectFailed({required Object service}) => 'Échec de la connexion à ${service}. Réessayez.';
- @override late final _TranslationsTrackersServicesFr services = _TranslationsTrackersServicesFr._(_root);
- @override late final _TranslationsTrackersDeviceCodeFr deviceCode = _TranslationsTrackersDeviceCodeFr._(_root);
- @override late final _TranslationsTrackersOauthProxyFr oauthProxy = _TranslationsTrackersOauthProxyFr._(_root);
- @override late final _TranslationsTrackersLibraryFilterFr libraryFilter = _TranslationsTrackersLibraryFilterFr._(_root);
+ @override late final _TranslationsServicesNamesFr names = _TranslationsServicesNamesFr._(_root);
+ @override late final _TranslationsServicesDeviceCodeFr deviceCode = _TranslationsServicesDeviceCodeFr._(_root);
+ @override late final _TranslationsServicesOauthProxyFr oauthProxy = _TranslationsServicesOauthProxyFr._(_root);
+ @override late final _TranslationsServicesLibraryFilterFr libraryFilter = _TranslationsServicesLibraryFilterFr._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsFr extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Date d\'ajout du dernier épisode';
}
+// Path: explore.rows
+class _TranslationsExploreRowsFr extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsFr._(TranslationsFr root) : this._root = root, super.internal(root);
+
+ final TranslationsFr _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Liste de suivi';
+ @override String get recommendedMovies => 'Films recommandés';
+ @override String get recommendedShows => 'Show TV recommandés';
+ @override String get trendingMovies => 'Films tendance';
+ @override String get trendingShows => 'Show TV tendance';
+ @override String get popularMovies => 'Films populaires';
+ @override String get popularShows => 'Show TV populaires';
+ @override String get suggestedAnime => 'Anime suggérés';
+ @override String get airingAnime => 'Meilleurs anime en diffusion';
+ @override String get popularAnime => 'Anime les plus populaires';
+ @override String get trending => 'Tendances';
+ @override String get upcomingMovies => 'Films à venir';
+ @override String get upcomingShows => 'Show TV à venir';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusFr extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusFr._(TranslationsFr root) : this._root = root, super.internal(root);
+
+ final TranslationsFr _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'En cours';
+ @override String get ended => 'Terminée';
+ @override String get canceled => 'Annulée';
+ @override String get upcoming => 'À venir';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionFr extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionFr._(TranslationsFr root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsFr extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Connexion perdue';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesFr extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesFr._(TranslationsFr root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesFr extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesFr._(TranslationsFr root) : this._root = root, super.internal(root);
final TranslationsFr _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesFr extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeFr extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeFr._(TranslationsFr root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeFr extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeFr._(TranslationsFr root) : this._root = root, super.internal(root);
final TranslationsFr _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeFr extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Code copié';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyFr extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyFr._(TranslationsFr root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyFr extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyFr._(TranslationsFr root) : this._root = root, super.internal(root);
final TranslationsFr _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyFr extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL copiée';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterFr extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterFr._(TranslationsFr root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterFr extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterFr._(TranslationsFr root) : this._root = root, super.internal(root);
final TranslationsFr _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsFr {
'settings.discordRichPresenceDescription' => 'Montrez ce que vous regardez sur Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Synchroniser l\'historique de visionnage avec Trakt',
- 'settings.trackers' => 'Trackers',
- 'settings.trackersDescription' => 'Synchroniser la progression avec Trakt, MyAnimeList, AniList et Simkl',
+ 'settings.services' => 'Services',
+ 'settings.servicesDescription' => 'Connectez Trakt, MyAnimeList, Seerr et plus',
'settings.companionRemoteServer' => 'Serveur de télécommande',
'settings.companionRemoteServerDescription' => 'Autoriser les appareils mobiles de votre réseau à contrôler cette application',
'settings.autoPip' => 'Image dans l\'image automatique',
@@ -2390,7 +2500,7 @@ extension on TranslationsFr {
'rateSheet.setScore' => 'Définir une note',
'rateSheet.saved' => 'Enregistré',
'rateSheet.notAvailable' => 'Aucune correspondance trouvée',
- 'rateSheet.noConnectedTrackers' => 'Connectez un tracker dans Paramètres pour y noter.',
+ 'rateSheet.noConnectedServices' => 'Connectez un service dans les Réglages pour noter ici.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, show TV',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsFr {
'navigation.libraries' => 'Medias',
'navigation.downloads' => 'Téléch.',
'navigation.liveTv' => 'TV direct',
+ 'navigation.explore' => 'Explorer',
+ 'explore.title' => 'Explorer',
+ 'explore.selectSource' => 'Sélectionner la source',
+ 'explore.rows.watchlist' => 'Liste de suivi',
+ 'explore.rows.recommendedMovies' => 'Films recommandés',
+ 'explore.rows.recommendedShows' => 'Show TV recommandés',
+ 'explore.rows.trendingMovies' => 'Films tendance',
+ 'explore.rows.trendingShows' => 'Show TV tendance',
+ 'explore.rows.popularMovies' => 'Films populaires',
+ 'explore.rows.popularShows' => 'Show TV populaires',
+ 'explore.rows.suggestedAnime' => 'Anime suggérés',
+ 'explore.rows.airingAnime' => 'Meilleurs anime en diffusion',
+ 'explore.rows.popularAnime' => 'Anime les plus populaires',
+ 'explore.rows.trending' => 'Tendances',
+ 'explore.rows.upcomingMovies' => 'Films à venir',
+ 'explore.rows.upcomingShows' => 'Show TV à venir',
+ 'explore.status.airing' => 'En cours',
+ 'explore.status.ended' => 'Terminée',
+ 'explore.status.canceled' => 'Annulée',
+ 'explore.status.upcoming' => 'À venir',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, one: '${n} épisode', other: '${n} épisodes', ),
+ 'explore.cast' => 'Cast',
+ 'explore.characters' => 'Personnages',
+ 'explore.addToWatchlist' => 'Ajouter à la liste de suivi',
+ 'explore.removeFromWatchlist' => 'Retirer de la liste de suivi',
+ 'explore.watchlistUpdateFailed' => 'Impossible de mettre à jour la liste de suivi',
+ 'explore.notInLibrary' => 'Absent de votre bibliothèque',
+ 'explore.inTheseLibraries' => 'Dans ces bibliothèques',
+ 'explore.availableOn' => ({required Object server}) => 'Disponible sur ${server}',
+ 'explore.checkingLibrary' => 'Vérification de votre bibliothèque...',
+ 'explore.emptyTitle' => 'Rien ici pour l\'instant',
+ 'explore.emptyMessage' => ({required Object source}) => 'Les rangées de ${source} apparaîtront ici une fois qu\'elles auront du contenu.',
+ 'explore.searchHint' => ({required Object source}) => 'Rechercher dans ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Aucun résultat pour "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Recherchez des films et des séries sur ${source}.',
+ 'explore.searchFailed' => 'Échec de la recherche. Vérifiez votre connexion et réessayez.',
'liveTv.title' => 'TV en direct',
'liveTv.guide' => 'Guide',
'liveTv.noChannels' => 'Aucune chaîne disponible',
@@ -2986,6 +3132,8 @@ extension on TranslationsFr {
'downloads.cancelledDownloadMessage' => 'Ce téléchargement a été annulé. Que voulez-vous faire ?',
'downloads.allEpisodesAlreadyDownloaded' => 'Tous les épisodes sont déjà téléchargés',
'downloads.resumeDownload' => 'Reprendre le téléchargement',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Téléchargement annulé',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synchronisation ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} téléchargé — cliquez pour terminer',
@@ -3022,8 +3170,6 @@ extension on TranslationsFr {
'downloads.noSyncRules' => 'Aucune règle de synchronisation',
'downloads.manageSyncRule' => 'Gérer la synchronisation',
'downloads.editEpisodeCount' => 'Nombre d’épisodes',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Filtre de synchronisation',
'downloads.syncAllItems' => 'Synchronisation de tous les éléments',
'downloads.syncUnwatchedItems' => 'Synchronisation des éléments non vus',
@@ -3272,39 +3418,70 @@ extension on TranslationsFr {
'trakt.scrobbleDescription' => 'Envoyer les événements de lecture, pause et arrêt à Trakt pendant la lecture.',
'trakt.watchedSync' => 'Synchroniser le statut « vu »',
'trakt.watchedSyncDescription' => 'Lorsque vous marquez un élément comme vu dans Plezy, il l\'est aussi sur Trakt.',
- 'trackers.title' => 'Trackers',
- 'trackers.hubSubtitle' => 'Synchronisez la progression de visionnage avec Trakt et d\'autres services.',
- 'trackers.notConnected' => 'Non connecté',
- 'trackers.connectedAs' => ({required Object username}) => 'Connecté en tant que @${username}',
- 'trackers.scrobble' => 'Suivre la progression automatiquement',
- 'trackers.scrobbleDescription' => 'Mettre à jour votre liste lorsque vous terminez un épisode ou un film.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Déconnecter ${service} ?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy cessera de mettre à jour ${service}. Reconnectez à tout moment.',
- 'trackers.connectFailed' => ({required Object service}) => 'Échec de la connexion à ${service}. Réessayez.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Activer Plezy sur ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Rendez-vous sur ${url} et entrez ce code :',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Ouvrir ${service} pour activer',
- 'trackers.deviceCode.waitingForAuthorization' => 'En attente d\'autorisation…',
- 'trackers.deviceCode.codeCopied' => 'Code copié',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Se connecter à ${service}',
- 'trackers.oauthProxy.body' => 'Scannez ce code QR ou ouvrez l\'URL sur n\'importe quel appareil.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Ouvrir ${service} pour se connecter',
- 'trackers.oauthProxy.urlCopied' => 'URL copiée',
- 'trackers.libraryFilter.title' => 'Filtre de bibliothèques',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Synchronisation de toutes les bibliothèques',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Aucune synchronisation',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloquées',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} autorisées',
- 'trackers.libraryFilter.mode' => 'Mode de filtrage',
- 'trackers.libraryFilter.modeBlacklist' => 'Liste noire',
- 'trackers.libraryFilter.modeWhitelist' => 'Liste blanche',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Synchroniser toutes les bibliothèques sauf celles cochées ci-dessous.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Synchroniser uniquement les bibliothèques cochées ci-dessous.',
- 'trackers.libraryFilter.libraries' => 'Bibliothèques',
- 'trackers.libraryFilter.noLibraries' => 'Aucune bibliothèque disponible',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Connecter Seerr',
+ 'seerr.serverUrl' => 'URL du serveur',
+ 'seerr.serverUrlHelper' => 'L\'adresse de votre instance Seerr',
+ 'seerr.checkServer' => 'Continuer',
+ 'seerr.signInWithJellyfin' => 'Se connecter avec Jellyfin',
+ 'seerr.signInWithEmby' => 'Se connecter avec Emby',
+ 'seerr.signInWithLocal' => 'Utiliser un compte local',
+ 'seerr.email' => 'E-mail',
+ 'seerr.noSignInMethods' => 'Cette instance Seerr ne propose aucune méthode de connexion prise en charge par Plezy.',
+ 'seerr.instance' => 'Instance',
+ 'seerr.disconnectConfirm' => 'Déconnecter Seerr ?',
+ 'seerr.disconnectConfirmBody' => 'Plezy oubliera cette instance Seerr. Reconnectez à tout moment.',
+ 'seerr.request' => 'Demander',
+ 'seerr.request4k' => 'Demander en 4K',
+ 'seerr.seasons' => 'Saisons',
+ 'seerr.allSeasons' => 'Toutes les saisons',
+ 'seerr.advancedOptions' => 'Avancé',
+ 'seerr.destinationServer' => 'Serveur de destination',
+ 'seerr.qualityProfile' => 'Profil de qualité',
+ 'seerr.rootFolder' => 'Dossier racine',
+ 'seerr.languageProfile' => 'Profil de langue',
+ 'seerr.requestSubmitted' => 'Demande envoyée',
+ 'seerr.requestFailed' => ({required Object error}) => 'Échec de la demande : ${error}',
+ 'seerr.requestsLoadFailed' => 'Impossible de charger les options de demande',
+ 'seerr.nothingToRequest' => 'Tout est déjà disponible ou demandé.',
+ 'seerr.statusAvailable' => 'Disponible',
+ 'seerr.statusPartiallyAvailable' => 'Partiellement disponible',
+ 'seerr.statusRequested' => 'Demandé',
+ 'seerr.statusProcessing' => 'En cours de traitement',
+ 'services.title' => 'Services',
+ 'services.hubSubtitle' => 'Synchronisez votre progression et demandez de nouveaux titres.',
+ 'services.notConnected' => 'Non connecté',
+ 'services.connectedAs' => ({required Object username}) => 'Connecté en tant que @${username}',
+ 'services.scrobble' => 'Suivre la progression automatiquement',
+ 'services.scrobbleDescription' => 'Mettre à jour votre liste lorsque vous terminez un épisode ou un film.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Déconnecter ${service} ?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy cessera de mettre à jour ${service}. Reconnectez à tout moment.',
+ 'services.connectFailed' => ({required Object service}) => 'Échec de la connexion à ${service}. Réessayez.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Activer Plezy sur ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Rendez-vous sur ${url} et entrez ce code :',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Ouvrir ${service} pour activer',
+ 'services.deviceCode.waitingForAuthorization' => 'En attente d\'autorisation…',
+ 'services.deviceCode.codeCopied' => 'Code copié',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Se connecter à ${service}',
+ 'services.oauthProxy.body' => 'Scannez ce code QR ou ouvrez l\'URL sur n\'importe quel appareil.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Ouvrir ${service} pour se connecter',
+ 'services.oauthProxy.urlCopied' => 'URL copiée',
+ 'services.libraryFilter.title' => 'Filtre de bibliothèques',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Synchronisation de toutes les bibliothèques',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Aucune synchronisation',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloquées',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} autorisées',
+ 'services.libraryFilter.mode' => 'Mode de filtrage',
+ 'services.libraryFilter.modeBlacklist' => 'Liste noire',
+ 'services.libraryFilter.modeWhitelist' => 'Liste blanche',
+ 'services.libraryFilter.modeHintBlacklist' => 'Synchroniser toutes les bibliothèques sauf celles cochées ci-dessous.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Synchroniser uniquement les bibliothèques cochées ci-dessous.',
+ 'services.libraryFilter.libraries' => 'Bibliothèques',
+ 'services.libraryFilter.noLibraries' => 'Aucune bibliothèque disponible',
'addServer.addJellyfinTitle' => 'Ajouter un serveur Jellyfin',
'addServer.serverUrls' => 'URL du serveur',
'addServer.serverUrlsHelper' => 'Plusieurs URL possibles, séparées par des virgules.',
diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart
index cfd48ee4..c1780769 100644
--- a/lib/i18n/strings_it.g.dart
+++ b/lib/i18n/strings_it.g.dart
@@ -69,6 +69,7 @@ class TranslationsIt extends Translations with BaseTranslations 'Mostra su Discord cosa stai guardando';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Sincronizza la cronologia di visione con Trakt';
- @override String get trackers => 'Tracker';
- @override String get trackersDescription => 'Sincronizza i progressi con Trakt, MyAnimeList, AniList e Simkl';
+ @override String get services => 'Servizi';
+ @override String get servicesDescription => 'Connetti Trakt, MyAnimeList, Seerr e altro';
@override String get companionRemoteServer => 'Server telecomando';
@override String get companionRemoteServerDescription => 'Consenti ai dispositivi mobili nella tua rete di controllare questa app';
@override String get autoPip => 'Picture-in-Picture automatico';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetIt extends TranslationsRateSheetEn {
@override String get setScore => 'Imposta un punteggio';
@override String get saved => 'Salvato';
@override String get notAvailable => 'Nessuna corrispondenza trovata';
- @override String get noConnectedTrackers => 'Collega un tracker in Impostazioni per valutarlo lì.';
+ @override String get noConnectedServices => 'Connetti un servizio nelle Impostazioni per valutare lì.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationIt extends TranslationsNavigationEn {
@override String get libraries => 'Librerie';
@override String get downloads => 'Download';
@override String get liveTv => 'TV Live';
+ @override String get explore => 'Scopri';
+}
+
+// Path: explore
+class _TranslationsExploreIt extends TranslationsExploreEn {
+ _TranslationsExploreIt._(TranslationsIt root) : this._root = root, super.internal(root);
+
+ final TranslationsIt _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Scopri';
+ @override String get selectSource => 'Seleziona fonte';
+ @override late final _TranslationsExploreRowsIt rows = _TranslationsExploreRowsIt._(_root);
+ @override String searchHint({required Object source}) => 'Cerca su ${source}';
+ @override String searchEmpty({required Object query}) => 'Nessun risultato per "${query}"';
+ @override String searchPrompt({required Object source}) => 'Cerca film e serie TV su ${source}.';
+ @override String get searchFailed => 'Ricerca fallita. Controlla la connessione e riprova.';
+ @override late final _TranslationsExploreStatusIt status = _TranslationsExploreStatusIt._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n,
+ one: '${n} episodio',
+ other: '${n} episodi',
+ );
+ @override String get cast => 'Attori';
+ @override String get characters => 'Personaggi';
+ @override String get addToWatchlist => 'Aggiungi alla Watchlist';
+ @override String get removeFromWatchlist => 'Rimuovi dalla Watchlist';
+ @override String get watchlistUpdateFailed => 'Impossibile aggiornare la Watchlist';
+ @override String get notInLibrary => 'Non è nella tua libreria';
+ @override String get inTheseLibraries => 'In queste librerie';
+ @override String availableOn({required Object server}) => 'Disponibile su ${server}';
+ @override String get checkingLibrary => 'Controllo della tua libreria...';
+ @override String get emptyTitle => 'Ancora niente qui';
+ @override String emptyMessage({required Object source}) => 'Le righe da ${source} appariranno qui una volta che avranno dei contenuti.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktIt extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Quando segni elementi come visti in Plezy, vengono segnati anche su Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersIt extends TranslationsTrackersEn {
- _TranslationsTrackersIt._(TranslationsIt root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrIt extends TranslationsSeerrEn {
+ _TranslationsSeerrIt._(TranslationsIt root) : this._root = root, super.internal(root);
final TranslationsIt _root; // ignore: unused_field
// Translations
- @override String get title => 'Tracker';
- @override String get hubSubtitle => 'Sincronizza l\'avanzamento di visione con Trakt e altri servizi.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Connetti Seerr';
+ @override String get serverUrl => 'URL del server';
+ @override String get serverUrlHelper => 'L\'indirizzo della tua istanza Seerr';
+ @override String get checkServer => 'Continua';
+ @override String get signInWithJellyfin => 'Accedi con Jellyfin';
+ @override String get signInWithEmby => 'Accedi con Emby';
+ @override String get signInWithLocal => 'Usa un account locale';
+ @override String get email => 'Email';
+ @override String get noSignInMethods => 'Questa istanza Seerr non offre alcun metodo di accesso supportato da Plezy.';
+ @override String get instance => 'Istanza';
+ @override String get disconnectConfirm => 'Disconnettere Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy dimenticherà questa istanza Seerr. Riconnetti quando vuoi.';
+ @override String get request => 'Richiedi';
+ @override String get request4k => 'Richiedi in 4K';
+ @override String get seasons => 'Stagioni';
+ @override String get allSeasons => 'Tutte le stagioni';
+ @override String get advancedOptions => 'Avanzate';
+ @override String get destinationServer => 'Server di destinazione';
+ @override String get qualityProfile => 'Profilo qualità';
+ @override String get rootFolder => 'Cartella radice';
+ @override String get languageProfile => 'Profilo lingua';
+ @override String get requestSubmitted => 'Richiesta inviata';
+ @override String requestFailed({required Object error}) => 'Richiesta non riuscita: ${error}';
+ @override String get requestsLoadFailed => 'Impossibile caricare le opzioni di richiesta';
+ @override String get nothingToRequest => 'Tutto è già disponibile o richiesto.';
+ @override String get statusAvailable => 'Disponibile';
+ @override String get statusPartiallyAvailable => 'Parzialmente disponibile';
+ @override String get statusRequested => 'Richiesto';
+ @override String get statusProcessing => 'In elaborazione';
+}
+
+// Path: services
+class _TranslationsServicesIt extends TranslationsServicesEn {
+ _TranslationsServicesIt._(TranslationsIt root) : this._root = root, super.internal(root);
+
+ final TranslationsIt _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Servizi';
+ @override String get hubSubtitle => 'Sincronizza i progressi di visione e richiedi nuovi titoli.';
@override String get notConnected => 'Non connesso';
@override String connectedAs({required Object username}) => 'Connesso come @${username}';
@override String get scrobble => 'Traccia i progressi automaticamente';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersIt extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Disconnettere ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy smetterà di aggiornare ${service}. Riconnetti quando vuoi.';
@override String connectFailed({required Object service}) => 'Impossibile connettersi a ${service}. Riprova.';
- @override late final _TranslationsTrackersServicesIt services = _TranslationsTrackersServicesIt._(_root);
- @override late final _TranslationsTrackersDeviceCodeIt deviceCode = _TranslationsTrackersDeviceCodeIt._(_root);
- @override late final _TranslationsTrackersOauthProxyIt oauthProxy = _TranslationsTrackersOauthProxyIt._(_root);
- @override late final _TranslationsTrackersLibraryFilterIt libraryFilter = _TranslationsTrackersLibraryFilterIt._(_root);
+ @override late final _TranslationsServicesNamesIt names = _TranslationsServicesNamesIt._(_root);
+ @override late final _TranslationsServicesDeviceCodeIt deviceCode = _TranslationsServicesDeviceCodeIt._(_root);
+ @override late final _TranslationsServicesOauthProxyIt oauthProxy = _TranslationsServicesOauthProxyIt._(_root);
+ @override late final _TranslationsServicesLibraryFilterIt libraryFilter = _TranslationsServicesLibraryFilterIt._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsIt extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Data aggiunta ultimo episodio';
}
+// Path: explore.rows
+class _TranslationsExploreRowsIt extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsIt._(TranslationsIt root) : this._root = root, super.internal(root);
+
+ final TranslationsIt _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Watchlist';
+ @override String get recommendedMovies => 'Film consigliati';
+ @override String get recommendedShows => 'Serie TV consigliate';
+ @override String get trendingMovies => 'Film di tendenza';
+ @override String get trendingShows => 'Serie TV di tendenza';
+ @override String get popularMovies => 'Film popolari';
+ @override String get popularShows => 'Serie TV popolari';
+ @override String get suggestedAnime => 'Anime suggeriti';
+ @override String get airingAnime => 'Migliori anime in onda';
+ @override String get popularAnime => 'Anime più popolari';
+ @override String get trending => 'Di tendenza';
+ @override String get upcomingMovies => 'Film in arrivo';
+ @override String get upcomingShows => 'Serie TV in arrivo';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusIt extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusIt._(TranslationsIt root) : this._root = root, super.internal(root);
+
+ final TranslationsIt _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'In onda';
+ @override String get ended => 'Conclusa';
+ @override String get canceled => 'Cancellata';
+ @override String get upcoming => 'In arrivo';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionIt extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionIt._(TranslationsIt root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsIt extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Connessione persa';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesIt extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesIt._(TranslationsIt root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesIt extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesIt._(TranslationsIt root) : this._root = root, super.internal(root);
final TranslationsIt _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesIt extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeIt extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeIt._(TranslationsIt root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeIt extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeIt._(TranslationsIt root) : this._root = root, super.internal(root);
final TranslationsIt _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeIt extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Codice copiato';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyIt extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyIt._(TranslationsIt root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyIt extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyIt._(TranslationsIt root) : this._root = root, super.internal(root);
final TranslationsIt _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyIt extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL copiato';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterIt extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterIt._(TranslationsIt root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterIt extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterIt._(TranslationsIt root) : this._root = root, super.internal(root);
final TranslationsIt _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsIt {
'settings.discordRichPresenceDescription' => 'Mostra su Discord cosa stai guardando',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Sincronizza la cronologia di visione con Trakt',
- 'settings.trackers' => 'Tracker',
- 'settings.trackersDescription' => 'Sincronizza i progressi con Trakt, MyAnimeList, AniList e Simkl',
+ 'settings.services' => 'Servizi',
+ 'settings.servicesDescription' => 'Connetti Trakt, MyAnimeList, Seerr e altro',
'settings.companionRemoteServer' => 'Server telecomando',
'settings.companionRemoteServerDescription' => 'Consenti ai dispositivi mobili nella tua rete di controllare questa app',
'settings.autoPip' => 'Picture-in-Picture automatico',
@@ -2390,7 +2500,7 @@ extension on TranslationsIt {
'rateSheet.setScore' => 'Imposta un punteggio',
'rateSheet.saved' => 'Salvato',
'rateSheet.notAvailable' => 'Nessuna corrispondenza trovata',
- 'rateSheet.noConnectedTrackers' => 'Collega un tracker in Impostazioni per valutarlo lì.',
+ 'rateSheet.noConnectedServices' => 'Connetti un servizio nelle Impostazioni per valutare lì.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, serie TV',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsIt {
'navigation.libraries' => 'Librerie',
'navigation.downloads' => 'Download',
'navigation.liveTv' => 'TV Live',
+ 'navigation.explore' => 'Scopri',
+ 'explore.title' => 'Scopri',
+ 'explore.selectSource' => 'Seleziona fonte',
+ 'explore.rows.watchlist' => 'Watchlist',
+ 'explore.rows.recommendedMovies' => 'Film consigliati',
+ 'explore.rows.recommendedShows' => 'Serie TV consigliate',
+ 'explore.rows.trendingMovies' => 'Film di tendenza',
+ 'explore.rows.trendingShows' => 'Serie TV di tendenza',
+ 'explore.rows.popularMovies' => 'Film popolari',
+ 'explore.rows.popularShows' => 'Serie TV popolari',
+ 'explore.rows.suggestedAnime' => 'Anime suggeriti',
+ 'explore.rows.airingAnime' => 'Migliori anime in onda',
+ 'explore.rows.popularAnime' => 'Anime più popolari',
+ 'explore.rows.trending' => 'Di tendenza',
+ 'explore.rows.upcomingMovies' => 'Film in arrivo',
+ 'explore.rows.upcomingShows' => 'Serie TV in arrivo',
+ 'explore.searchHint' => ({required Object source}) => 'Cerca su ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Nessun risultato per "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Cerca film e serie TV su ${source}.',
+ 'explore.searchFailed' => 'Ricerca fallita. Controlla la connessione e riprova.',
+ 'explore.status.airing' => 'In onda',
+ 'explore.status.ended' => 'Conclusa',
+ 'explore.status.canceled' => 'Cancellata',
+ 'explore.status.upcoming' => 'In arrivo',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n, one: '${n} episodio', other: '${n} episodi', ),
+ 'explore.cast' => 'Attori',
+ 'explore.characters' => 'Personaggi',
+ 'explore.addToWatchlist' => 'Aggiungi alla Watchlist',
+ 'explore.removeFromWatchlist' => 'Rimuovi dalla Watchlist',
+ 'explore.watchlistUpdateFailed' => 'Impossibile aggiornare la Watchlist',
+ 'explore.notInLibrary' => 'Non è nella tua libreria',
+ 'explore.inTheseLibraries' => 'In queste librerie',
+ 'explore.availableOn' => ({required Object server}) => 'Disponibile su ${server}',
+ 'explore.checkingLibrary' => 'Controllo della tua libreria...',
+ 'explore.emptyTitle' => 'Ancora niente qui',
+ 'explore.emptyMessage' => ({required Object source}) => 'Le righe da ${source} appariranno qui una volta che avranno dei contenuti.',
'liveTv.title' => 'TV in diretta',
'liveTv.guide' => 'Guida',
'liveTv.noChannels' => 'Nessun canale disponibile',
@@ -2986,6 +3132,8 @@ extension on TranslationsIt {
'downloads.cancelledDownloadMessage' => 'Questo download è stato annullato. Cosa vuoi fare?',
'downloads.allEpisodesAlreadyDownloaded' => 'Tutti gli episodi sono già stati scaricati',
'downloads.resumeDownload' => 'Riprendi download',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Download annullato',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (sincronizzazione ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} scaricato — fai clic per completare',
@@ -3022,8 +3170,6 @@ extension on TranslationsIt {
'downloads.noSyncRules' => 'Nessuna regola di sincronizzazione',
'downloads.manageSyncRule' => 'Gestisci sincronizzazione',
'downloads.editEpisodeCount' => 'Numero di episodi',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Filtro di sincronizzazione',
'downloads.syncAllItems' => 'Sincronizzazione di tutti gli elementi',
'downloads.syncUnwatchedItems' => 'Sincronizzazione degli elementi non visti',
@@ -3272,39 +3418,70 @@ extension on TranslationsIt {
'trakt.scrobbleDescription' => 'Invia eventi di riproduzione, pausa e arresto a Trakt durante la riproduzione.',
'trakt.watchedSync' => 'Sincronizza stato visualizzato',
'trakt.watchedSyncDescription' => 'Quando segni elementi come visti in Plezy, vengono segnati anche su Trakt.',
- 'trackers.title' => 'Tracker',
- 'trackers.hubSubtitle' => 'Sincronizza l\'avanzamento di visione con Trakt e altri servizi.',
- 'trackers.notConnected' => 'Non connesso',
- 'trackers.connectedAs' => ({required Object username}) => 'Connesso come @${username}',
- 'trackers.scrobble' => 'Traccia i progressi automaticamente',
- 'trackers.scrobbleDescription' => 'Aggiorna la tua lista quando finisci un episodio o un film.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Disconnettere ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy smetterà di aggiornare ${service}. Riconnetti quando vuoi.',
- 'trackers.connectFailed' => ({required Object service}) => 'Impossibile connettersi a ${service}. Riprova.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Attiva Plezy su ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Visita ${url} e inserisci questo codice:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Apri ${service} per attivare',
- 'trackers.deviceCode.waitingForAuthorization' => 'In attesa di autorizzazione…',
- 'trackers.deviceCode.codeCopied' => 'Codice copiato',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Accedi a ${service}',
- 'trackers.oauthProxy.body' => 'Scansiona questo codice QR o apri l\'URL su qualsiasi dispositivo.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Apri ${service} per accedere',
- 'trackers.oauthProxy.urlCopied' => 'URL copiato',
- 'trackers.libraryFilter.title' => 'Filtro librerie',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Sincronizzazione di tutte le librerie',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Nulla da sincronizzare',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloccate',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} consentite',
- 'trackers.libraryFilter.mode' => 'Modalità filtro',
- 'trackers.libraryFilter.modeBlacklist' => 'Lista nera',
- 'trackers.libraryFilter.modeWhitelist' => 'Lista bianca',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Sincronizza tutte le librerie tranne quelle selezionate sotto.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Sincronizza solo le librerie selezionate sotto.',
- 'trackers.libraryFilter.libraries' => 'Librerie',
- 'trackers.libraryFilter.noLibraries' => 'Nessuna libreria disponibile',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Connetti Seerr',
+ 'seerr.serverUrl' => 'URL del server',
+ 'seerr.serverUrlHelper' => 'L\'indirizzo della tua istanza Seerr',
+ 'seerr.checkServer' => 'Continua',
+ 'seerr.signInWithJellyfin' => 'Accedi con Jellyfin',
+ 'seerr.signInWithEmby' => 'Accedi con Emby',
+ 'seerr.signInWithLocal' => 'Usa un account locale',
+ 'seerr.email' => 'Email',
+ 'seerr.noSignInMethods' => 'Questa istanza Seerr non offre alcun metodo di accesso supportato da Plezy.',
+ 'seerr.instance' => 'Istanza',
+ 'seerr.disconnectConfirm' => 'Disconnettere Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy dimenticherà questa istanza Seerr. Riconnetti quando vuoi.',
+ 'seerr.request' => 'Richiedi',
+ 'seerr.request4k' => 'Richiedi in 4K',
+ 'seerr.seasons' => 'Stagioni',
+ 'seerr.allSeasons' => 'Tutte le stagioni',
+ 'seerr.advancedOptions' => 'Avanzate',
+ 'seerr.destinationServer' => 'Server di destinazione',
+ 'seerr.qualityProfile' => 'Profilo qualità',
+ 'seerr.rootFolder' => 'Cartella radice',
+ 'seerr.languageProfile' => 'Profilo lingua',
+ 'seerr.requestSubmitted' => 'Richiesta inviata',
+ 'seerr.requestFailed' => ({required Object error}) => 'Richiesta non riuscita: ${error}',
+ 'seerr.requestsLoadFailed' => 'Impossibile caricare le opzioni di richiesta',
+ 'seerr.nothingToRequest' => 'Tutto è già disponibile o richiesto.',
+ 'seerr.statusAvailable' => 'Disponibile',
+ 'seerr.statusPartiallyAvailable' => 'Parzialmente disponibile',
+ 'seerr.statusRequested' => 'Richiesto',
+ 'seerr.statusProcessing' => 'In elaborazione',
+ 'services.title' => 'Servizi',
+ 'services.hubSubtitle' => 'Sincronizza i progressi di visione e richiedi nuovi titoli.',
+ 'services.notConnected' => 'Non connesso',
+ 'services.connectedAs' => ({required Object username}) => 'Connesso come @${username}',
+ 'services.scrobble' => 'Traccia i progressi automaticamente',
+ 'services.scrobbleDescription' => 'Aggiorna la tua lista quando finisci un episodio o un film.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Disconnettere ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy smetterà di aggiornare ${service}. Riconnetti quando vuoi.',
+ 'services.connectFailed' => ({required Object service}) => 'Impossibile connettersi a ${service}. Riprova.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Attiva Plezy su ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Visita ${url} e inserisci questo codice:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Apri ${service} per attivare',
+ 'services.deviceCode.waitingForAuthorization' => 'In attesa di autorizzazione…',
+ 'services.deviceCode.codeCopied' => 'Codice copiato',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Accedi a ${service}',
+ 'services.oauthProxy.body' => 'Scansiona questo codice QR o apri l\'URL su qualsiasi dispositivo.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Apri ${service} per accedere',
+ 'services.oauthProxy.urlCopied' => 'URL copiato',
+ 'services.libraryFilter.title' => 'Filtro librerie',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Sincronizzazione di tutte le librerie',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Nulla da sincronizzare',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloccate',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} consentite',
+ 'services.libraryFilter.mode' => 'Modalità filtro',
+ 'services.libraryFilter.modeBlacklist' => 'Lista nera',
+ 'services.libraryFilter.modeWhitelist' => 'Lista bianca',
+ 'services.libraryFilter.modeHintBlacklist' => 'Sincronizza tutte le librerie tranne quelle selezionate sotto.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Sincronizza solo le librerie selezionate sotto.',
+ 'services.libraryFilter.libraries' => 'Librerie',
+ 'services.libraryFilter.noLibraries' => 'Nessuna libreria disponibile',
'addServer.addJellyfinTitle' => 'Aggiungi server Jellyfin',
'addServer.serverUrls' => 'URL del server',
'addServer.serverUrlsHelper' => 'Sono consentiti più URL, separati da virgole.',
diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart
index 6881d4c7..eff58a08 100644
--- a/lib/i18n/strings_ja.g.dart
+++ b/lib/i18n/strings_ja.g.dart
@@ -69,6 +69,7 @@ class TranslationsJa extends Translations with BaseTranslations 'Discordで視聴中の内容を表示';
@override String get trakt => 'Trakt';
@override String get traktDescription => '視聴履歴を Trakt と同期';
- @override String get trackers => 'トラッカー';
- @override String get trackersDescription => '進捗を Trakt、MyAnimeList、AniList、Simkl と同期';
+ @override String get services => 'サービス';
+ @override String get servicesDescription => 'Trakt、MyAnimeList、Seerr などを接続';
@override String get companionRemoteServer => 'コンパニオンリモートサーバー';
@override String get companionRemoteServerDescription => 'ネットワーク上のモバイルデバイスからこのアプリを操作できるようにする';
@override String get autoPip => '自動ピクチャーインピクチャー';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetJa extends TranslationsRateSheetEn {
@override String get setScore => 'スコアを設定';
@override String get saved => '保存済み';
@override String get notAvailable => '一致なし';
- @override String get noConnectedTrackers => '設定でトラッカーを接続すると、そこで評価できます。';
+ @override String get noConnectedServices => '評価するには、設定でサービスを接続してください。';
}
// Path: accessibility
@@ -1063,6 +1065,38 @@ class _TranslationsNavigationJa extends TranslationsNavigationEn {
@override String get libraries => 'ライブラリ';
@override String get downloads => 'ダウンロード';
@override String get liveTv => 'ライブTV';
+ @override String get explore => '探索';
+}
+
+// Path: explore
+class _TranslationsExploreJa extends TranslationsExploreEn {
+ _TranslationsExploreJa._(TranslationsJa root) : this._root = root, super.internal(root);
+
+ final TranslationsJa _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => '探索';
+ @override String get selectSource => 'ソースを選択';
+ @override late final _TranslationsExploreRowsJa rows = _TranslationsExploreRowsJa._(_root);
+ @override String searchHint({required Object source}) => '${source} で検索';
+ @override String searchEmpty({required Object query}) => '「${query}」の結果が見つかりません';
+ @override String searchPrompt({required Object source}) => '${source} で映画やテレビ番組を検索します。';
+ @override String get searchFailed => '検索に失敗しました。接続を確認してもう一度お試しください。';
+ @override late final _TranslationsExploreStatusJa status = _TranslationsExploreStatusJa._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n,
+ other: '${n} 話',
+ );
+ @override String get cast => 'キャスト';
+ @override String get characters => 'キャラクター';
+ @override String get addToWatchlist => 'ウォッチリストに追加';
+ @override String get removeFromWatchlist => 'ウォッチリストから削除';
+ @override String get watchlistUpdateFailed => 'ウォッチリストを更新できませんでした';
+ @override String get notInLibrary => 'ライブラリにありません';
+ @override String get inTheseLibraries => 'これらのライブラリにあります';
+ @override String availableOn({required Object server}) => '${server}で視聴可能';
+ @override String get checkingLibrary => 'ライブラリを確認中...';
+ @override String get emptyTitle => 'まだ何もありません';
+ @override String emptyMessage({required Object source}) => '${source}にコンテンツが追加されると、ここに表示されます。';
}
// Path: liveTv
@@ -1645,15 +1679,54 @@ class _TranslationsTraktJa extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Plezy で項目を視聴済みにすると、Trakt でも視聴済みになります。';
}
-// Path: trackers
-class _TranslationsTrackersJa extends TranslationsTrackersEn {
- _TranslationsTrackersJa._(TranslationsJa root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrJa extends TranslationsSeerrEn {
+ _TranslationsSeerrJa._(TranslationsJa root) : this._root = root, super.internal(root);
final TranslationsJa _root; // ignore: unused_field
// Translations
- @override String get title => 'トラッカー';
- @override String get hubSubtitle => '視聴進捗をTraktや他のサービスと同期します。';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Seerrに接続';
+ @override String get serverUrl => 'サーバー URL';
+ @override String get serverUrlHelper => 'Seerr インスタンスのアドレス';
+ @override String get checkServer => '続ける';
+ @override String get signInWithJellyfin => 'Jellyfinでサインイン';
+ @override String get signInWithEmby => 'Embyでサインイン';
+ @override String get signInWithLocal => 'ローカルアカウントを使う';
+ @override String get email => 'メールアドレス';
+ @override String get noSignInMethods => 'この Seerr インスタンスには Plezy が対応しているサインイン方法がありません。';
+ @override String get instance => 'インスタンス';
+ @override String get disconnectConfirm => 'Seerr の接続を解除しますか?';
+ @override String get disconnectConfirmBody => 'Plezy はこの Seerr インスタンスの情報を削除します。いつでも再接続できます。';
+ @override String get request => 'リクエスト';
+ @override String get request4k => '4K でリクエスト';
+ @override String get seasons => 'シーズン';
+ @override String get allSeasons => '全シーズン';
+ @override String get advancedOptions => '詳細';
+ @override String get destinationServer => '宛先サーバー';
+ @override String get qualityProfile => '画質プロファイル';
+ @override String get rootFolder => 'ルートフォルダ';
+ @override String get languageProfile => '言語プロファイル';
+ @override String get requestSubmitted => 'リクエストを送信しました';
+ @override String requestFailed({required Object error}) => 'リクエストに失敗しました: ${error}';
+ @override String get requestsLoadFailed => 'リクエストオプションを読み込めませんでした';
+ @override String get nothingToRequest => 'すべてすでに利用可能またはリクエスト済みです。';
+ @override String get statusAvailable => '利用可能';
+ @override String get statusPartiallyAvailable => '一部利用可能';
+ @override String get statusRequested => 'リクエスト済み';
+ @override String get statusProcessing => '処理中';
+}
+
+// Path: services
+class _TranslationsServicesJa extends TranslationsServicesEn {
+ _TranslationsServicesJa._(TranslationsJa root) : this._root = root, super.internal(root);
+
+ final TranslationsJa _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'サービス';
+ @override String get hubSubtitle => '視聴の進捗を同期して、新しいタイトルをリクエストします。';
@override String get notConnected => '未接続';
@override String connectedAs({required Object username}) => '@${username} として接続済み';
@override String get scrobble => '進捗を自動で記録';
@@ -1661,10 +1734,10 @@ class _TranslationsTrackersJa extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => '${service} の接続を解除しますか?';
@override String disconnectConfirmBody({required Object service}) => 'Plezyは${service}の更新を停止します。いつでも再接続できます。';
@override String connectFailed({required Object service}) => '${service} に接続できませんでした。もう一度お試しください。';
- @override late final _TranslationsTrackersServicesJa services = _TranslationsTrackersServicesJa._(_root);
- @override late final _TranslationsTrackersDeviceCodeJa deviceCode = _TranslationsTrackersDeviceCodeJa._(_root);
- @override late final _TranslationsTrackersOauthProxyJa oauthProxy = _TranslationsTrackersOauthProxyJa._(_root);
- @override late final _TranslationsTrackersLibraryFilterJa libraryFilter = _TranslationsTrackersLibraryFilterJa._(_root);
+ @override late final _TranslationsServicesNamesJa names = _TranslationsServicesNamesJa._(_root);
+ @override late final _TranslationsServicesDeviceCodeJa deviceCode = _TranslationsServicesDeviceCodeJa._(_root);
+ @override late final _TranslationsServicesOauthProxyJa oauthProxy = _TranslationsServicesOauthProxyJa._(_root);
+ @override late final _TranslationsServicesLibraryFilterJa libraryFilter = _TranslationsServicesLibraryFilterJa._(_root);
}
// Path: addServer
@@ -1831,6 +1904,41 @@ class _TranslationsLibrariesSortLabelsJa extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => '最新エピソード追加日';
}
+// Path: explore.rows
+class _TranslationsExploreRowsJa extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsJa._(TranslationsJa root) : this._root = root, super.internal(root);
+
+ final TranslationsJa _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'ウォッチリスト';
+ @override String get recommendedMovies => 'おすすめの映画';
+ @override String get recommendedShows => 'おすすめのテレビ番組';
+ @override String get trendingMovies => 'トレンドの映画';
+ @override String get trendingShows => 'トレンドのテレビ番組';
+ @override String get popularMovies => '人気の映画';
+ @override String get popularShows => '人気のテレビ番組';
+ @override String get suggestedAnime => 'おすすめのアニメ';
+ @override String get airingAnime => '放送中の注目アニメ';
+ @override String get popularAnime => '人気のアニメ';
+ @override String get trending => 'トレンド';
+ @override String get upcomingMovies => '近日公開の映画';
+ @override String get upcomingShows => '放送予定の番組';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusJa extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusJa._(TranslationsJa root) : this._root = root, super.internal(root);
+
+ final TranslationsJa _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => '放送中';
+ @override String get ended => '放送終了';
+ @override String get canceled => '打ち切り';
+ @override String get upcoming => '放送予定';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionJa extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionJa._(TranslationsJa root) : this._root = root, super.internal(root);
@@ -1927,9 +2035,9 @@ class _TranslationsCompanionRemoteErrorsJa extends TranslationsCompanionRemoteEr
@override String get connectionLost => '接続が切断されました';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesJa extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesJa._(TranslationsJa root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesJa extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesJa._(TranslationsJa root) : this._root = root, super.internal(root);
final TranslationsJa _root; // ignore: unused_field
@@ -1937,11 +2045,12 @@ class _TranslationsTrackersServicesJa extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeJa extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeJa._(TranslationsJa root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeJa extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeJa._(TranslationsJa root) : this._root = root, super.internal(root);
final TranslationsJa _root; // ignore: unused_field
@@ -1953,9 +2062,9 @@ class _TranslationsTrackersDeviceCodeJa extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'コードをコピーしました';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyJa extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyJa._(TranslationsJa root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyJa extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyJa._(TranslationsJa root) : this._root = root, super.internal(root);
final TranslationsJa _root; // ignore: unused_field
@@ -1966,9 +2075,9 @@ class _TranslationsTrackersOauthProxyJa extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URLをコピーしました';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterJa extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterJa._(TranslationsJa root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterJa extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterJa._(TranslationsJa root) : this._root = root, super.internal(root);
final TranslationsJa _root; // ignore: unused_field
@@ -2232,8 +2341,8 @@ extension on TranslationsJa {
'settings.discordRichPresenceDescription' => 'Discordで視聴中の内容を表示',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => '視聴履歴を Trakt と同期',
- 'settings.trackers' => 'トラッカー',
- 'settings.trackersDescription' => '進捗を Trakt、MyAnimeList、AniList、Simkl と同期',
+ 'settings.services' => 'サービス',
+ 'settings.servicesDescription' => 'Trakt、MyAnimeList、Seerr などを接続',
'settings.companionRemoteServer' => 'コンパニオンリモートサーバー',
'settings.companionRemoteServerDescription' => 'ネットワーク上のモバイルデバイスからこのアプリを操作できるようにする',
'settings.autoPip' => '自動ピクチャーインピクチャー',
@@ -2389,7 +2498,7 @@ extension on TranslationsJa {
'rateSheet.setScore' => 'スコアを設定',
'rateSheet.saved' => '保存済み',
'rateSheet.notAvailable' => '一致なし',
- 'rateSheet.noConnectedTrackers' => '設定でトラッカーを接続すると、そこで評価できます。',
+ 'rateSheet.noConnectedServices' => '評価するには、設定でサービスを接続してください。',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}、映画',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}、テレビ番組',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}、${episodeInfo}',
@@ -2770,6 +2879,42 @@ extension on TranslationsJa {
'navigation.libraries' => 'ライブラリ',
'navigation.downloads' => 'ダウンロード',
'navigation.liveTv' => 'ライブTV',
+ 'navigation.explore' => '探索',
+ 'explore.title' => '探索',
+ 'explore.selectSource' => 'ソースを選択',
+ 'explore.rows.watchlist' => 'ウォッチリスト',
+ 'explore.rows.recommendedMovies' => 'おすすめの映画',
+ 'explore.rows.recommendedShows' => 'おすすめのテレビ番組',
+ 'explore.rows.trendingMovies' => 'トレンドの映画',
+ 'explore.rows.trendingShows' => 'トレンドのテレビ番組',
+ 'explore.rows.popularMovies' => '人気の映画',
+ 'explore.rows.popularShows' => '人気のテレビ番組',
+ 'explore.rows.suggestedAnime' => 'おすすめのアニメ',
+ 'explore.rows.airingAnime' => '放送中の注目アニメ',
+ 'explore.rows.popularAnime' => '人気のアニメ',
+ 'explore.rows.trending' => 'トレンド',
+ 'explore.rows.upcomingMovies' => '近日公開の映画',
+ 'explore.rows.upcomingShows' => '放送予定の番組',
+ 'explore.searchHint' => ({required Object source}) => '${source} で検索',
+ 'explore.searchEmpty' => ({required Object query}) => '「${query}」の結果が見つかりません',
+ 'explore.searchPrompt' => ({required Object source}) => '${source} で映画やテレビ番組を検索します。',
+ 'explore.searchFailed' => '検索に失敗しました。接続を確認してもう一度お試しください。',
+ 'explore.status.airing' => '放送中',
+ 'explore.status.ended' => '放送終了',
+ 'explore.status.canceled' => '打ち切り',
+ 'explore.status.upcoming' => '放送予定',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n, other: '${n} 話', ),
+ 'explore.cast' => 'キャスト',
+ 'explore.characters' => 'キャラクター',
+ 'explore.addToWatchlist' => 'ウォッチリストに追加',
+ 'explore.removeFromWatchlist' => 'ウォッチリストから削除',
+ 'explore.watchlistUpdateFailed' => 'ウォッチリストを更新できませんでした',
+ 'explore.notInLibrary' => 'ライブラリにありません',
+ 'explore.inTheseLibraries' => 'これらのライブラリにあります',
+ 'explore.availableOn' => ({required Object server}) => '${server}で視聴可能',
+ 'explore.checkingLibrary' => 'ライブラリを確認中...',
+ 'explore.emptyTitle' => 'まだ何もありません',
+ 'explore.emptyMessage' => ({required Object source}) => '${source}にコンテンツが追加されると、ここに表示されます。',
'liveTv.title' => 'ライブTV',
'liveTv.guide' => '番組表',
'liveTv.noChannels' => 'チャンネルがありません',
@@ -2985,6 +3130,8 @@ extension on TranslationsJa {
'downloads.cancelledDownloadMessage' => 'このダウンロードはキャンセルされました。どうしますか?',
'downloads.allEpisodesAlreadyDownloaded' => 'すべてのエピソードはすでにダウンロード済みです',
'downloads.resumeDownload' => 'ダウンロードを再開',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'キャンセルされたダウンロード',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file}(${status}を同期中)',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} をダウンロード済み — クリックして完了',
@@ -3021,8 +3168,6 @@ extension on TranslationsJa {
'downloads.noSyncRules' => '同期ルールなし',
'downloads.manageSyncRule' => '同期を管理',
'downloads.editEpisodeCount' => 'エピソード数',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => '同期フィルター',
'downloads.syncAllItems' => 'すべてのアイテムを同期中',
'downloads.syncUnwatchedItems' => '未視聴のアイテムを同期中',
@@ -3271,39 +3416,70 @@ extension on TranslationsJa {
'trakt.scrobbleDescription' => '再生中に再生・一時停止・停止イベントを Trakt に送信します。',
'trakt.watchedSync' => '視聴済みステータスを同期',
'trakt.watchedSyncDescription' => 'Plezy で項目を視聴済みにすると、Trakt でも視聴済みになります。',
- 'trackers.title' => 'トラッカー',
- 'trackers.hubSubtitle' => '視聴進捗をTraktや他のサービスと同期します。',
- 'trackers.notConnected' => '未接続',
- 'trackers.connectedAs' => ({required Object username}) => '@${username} として接続済み',
- 'trackers.scrobble' => '進捗を自動で記録',
- 'trackers.scrobbleDescription' => 'エピソードや映画を見終えたときにリストを更新します。',
- 'trackers.disconnectConfirm' => ({required Object service}) => '${service} の接続を解除しますか?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezyは${service}の更新を停止します。いつでも再接続できます。',
- 'trackers.connectFailed' => ({required Object service}) => '${service} に接続できませんでした。もう一度お試しください。',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => '${service} で Plezy を有効化',
- 'trackers.deviceCode.body' => ({required Object url}) => '${url} にアクセスしてこのコードを入力:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => '${service} を開いて有効化',
- 'trackers.deviceCode.waitingForAuthorization' => '認証を待っています…',
- 'trackers.deviceCode.codeCopied' => 'コードをコピーしました',
- 'trackers.oauthProxy.title' => ({required Object service}) => '${service} にサインイン',
- 'trackers.oauthProxy.body' => 'このQRコードをスキャンするか、任意のデバイスでURLを開いてください。',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => '${service} を開いてサインイン',
- 'trackers.oauthProxy.urlCopied' => 'URLをコピーしました',
- 'trackers.libraryFilter.title' => 'ライブラリフィルター',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'すべてのライブラリを同期中',
- 'trackers.libraryFilter.subtitleNoneSyncing' => '同期なし',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} 件をブロック',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} 件を許可',
- 'trackers.libraryFilter.mode' => 'フィルターモード',
- 'trackers.libraryFilter.modeBlacklist' => 'ブロックリスト',
- 'trackers.libraryFilter.modeWhitelist' => '許可リスト',
- 'trackers.libraryFilter.modeHintBlacklist' => '下でチェックしたライブラリ以外をすべて同期します。',
- 'trackers.libraryFilter.modeHintWhitelist' => '下でチェックしたライブラリのみ同期します。',
- 'trackers.libraryFilter.libraries' => 'ライブラリ',
- 'trackers.libraryFilter.noLibraries' => '利用できるライブラリがありません',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Seerrに接続',
+ 'seerr.serverUrl' => 'サーバー URL',
+ 'seerr.serverUrlHelper' => 'Seerr インスタンスのアドレス',
+ 'seerr.checkServer' => '続ける',
+ 'seerr.signInWithJellyfin' => 'Jellyfinでサインイン',
+ 'seerr.signInWithEmby' => 'Embyでサインイン',
+ 'seerr.signInWithLocal' => 'ローカルアカウントを使う',
+ 'seerr.email' => 'メールアドレス',
+ 'seerr.noSignInMethods' => 'この Seerr インスタンスには Plezy が対応しているサインイン方法がありません。',
+ 'seerr.instance' => 'インスタンス',
+ 'seerr.disconnectConfirm' => 'Seerr の接続を解除しますか?',
+ 'seerr.disconnectConfirmBody' => 'Plezy はこの Seerr インスタンスの情報を削除します。いつでも再接続できます。',
+ 'seerr.request' => 'リクエスト',
+ 'seerr.request4k' => '4K でリクエスト',
+ 'seerr.seasons' => 'シーズン',
+ 'seerr.allSeasons' => '全シーズン',
+ 'seerr.advancedOptions' => '詳細',
+ 'seerr.destinationServer' => '宛先サーバー',
+ 'seerr.qualityProfile' => '画質プロファイル',
+ 'seerr.rootFolder' => 'ルートフォルダ',
+ 'seerr.languageProfile' => '言語プロファイル',
+ 'seerr.requestSubmitted' => 'リクエストを送信しました',
+ 'seerr.requestFailed' => ({required Object error}) => 'リクエストに失敗しました: ${error}',
+ 'seerr.requestsLoadFailed' => 'リクエストオプションを読み込めませんでした',
+ 'seerr.nothingToRequest' => 'すべてすでに利用可能またはリクエスト済みです。',
+ 'seerr.statusAvailable' => '利用可能',
+ 'seerr.statusPartiallyAvailable' => '一部利用可能',
+ 'seerr.statusRequested' => 'リクエスト済み',
+ 'seerr.statusProcessing' => '処理中',
+ 'services.title' => 'サービス',
+ 'services.hubSubtitle' => '視聴の進捗を同期して、新しいタイトルをリクエストします。',
+ 'services.notConnected' => '未接続',
+ 'services.connectedAs' => ({required Object username}) => '@${username} として接続済み',
+ 'services.scrobble' => '進捗を自動で記録',
+ 'services.scrobbleDescription' => 'エピソードや映画を見終えたときにリストを更新します。',
+ 'services.disconnectConfirm' => ({required Object service}) => '${service} の接続を解除しますか?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezyは${service}の更新を停止します。いつでも再接続できます。',
+ 'services.connectFailed' => ({required Object service}) => '${service} に接続できませんでした。もう一度お試しください。',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => '${service} で Plezy を有効化',
+ 'services.deviceCode.body' => ({required Object url}) => '${url} にアクセスしてこのコードを入力:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => '${service} を開いて有効化',
+ 'services.deviceCode.waitingForAuthorization' => '認証を待っています…',
+ 'services.deviceCode.codeCopied' => 'コードをコピーしました',
+ 'services.oauthProxy.title' => ({required Object service}) => '${service} にサインイン',
+ 'services.oauthProxy.body' => 'このQRコードをスキャンするか、任意のデバイスでURLを開いてください。',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => '${service} を開いてサインイン',
+ 'services.oauthProxy.urlCopied' => 'URLをコピーしました',
+ 'services.libraryFilter.title' => 'ライブラリフィルター',
+ 'services.libraryFilter.subtitleAllSyncing' => 'すべてのライブラリを同期中',
+ 'services.libraryFilter.subtitleNoneSyncing' => '同期なし',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} 件をブロック',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} 件を許可',
+ 'services.libraryFilter.mode' => 'フィルターモード',
+ 'services.libraryFilter.modeBlacklist' => 'ブロックリスト',
+ 'services.libraryFilter.modeWhitelist' => '許可リスト',
+ 'services.libraryFilter.modeHintBlacklist' => '下でチェックしたライブラリ以外をすべて同期します。',
+ 'services.libraryFilter.modeHintWhitelist' => '下でチェックしたライブラリのみ同期します。',
+ 'services.libraryFilter.libraries' => 'ライブラリ',
+ 'services.libraryFilter.noLibraries' => '利用できるライブラリがありません',
'addServer.addJellyfinTitle' => 'Jellyfinサーバーを追加',
'addServer.serverUrls' => 'サーバーURL',
'addServer.serverUrlsHelper' => '複数のURLをカンマ区切りで入力できます。',
diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart
index fc6ec963..5a80f740 100644
--- a/lib/i18n/strings_ko.g.dart
+++ b/lib/i18n/strings_ko.g.dart
@@ -69,6 +69,7 @@ class TranslationsKo extends Translations with BaseTranslations 'Discord에서 시청 중인 콘텐츠 표시';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Trakt와 시청 기록 동기화';
- @override String get trackers => '트래커';
- @override String get trackersDescription => 'Trakt, MyAnimeList, AniList 및 Simkl에 진행률 동기화';
+ @override String get services => '서비스';
+ @override String get servicesDescription => 'Trakt, MyAnimeList, Seerr 등 연결';
@override String get companionRemoteServer => '컴패니언 리모트 서버';
@override String get companionRemoteServerDescription => '네트워크의 모바일 기기가 이 앱을 제어할 수 있도록 허용';
@override String get autoPip => '자동 PIP 모드';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetKo extends TranslationsRateSheetEn {
@override String get setScore => '점수 설정';
@override String get saved => '저장됨';
@override String get notAvailable => '일치 항목 없음';
- @override String get noConnectedTrackers => '설정에서 트래커를 연결하면 거기에도 평가할 수 있습니다.';
+ @override String get noConnectedServices => '평가하려면 설정에서 서비스를 연결하세요.';
}
// Path: accessibility
@@ -1063,6 +1065,38 @@ class _TranslationsNavigationKo extends TranslationsNavigationEn {
@override String get libraries => '미디어 라이브러리';
@override String get downloads => '다운로드';
@override String get liveTv => '실시간 TV';
+ @override String get explore => '탐색';
+}
+
+// Path: explore
+class _TranslationsExploreKo extends TranslationsExploreEn {
+ _TranslationsExploreKo._(TranslationsKo root) : this._root = root, super.internal(root);
+
+ final TranslationsKo _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => '탐색';
+ @override String get selectSource => '소스 선택';
+ @override late final _TranslationsExploreRowsKo rows = _TranslationsExploreRowsKo._(_root);
+ @override String searchHint({required Object source}) => '${source}에서 검색';
+ @override String searchEmpty({required Object query}) => '「${query}」에 대한 결과가 없습니다';
+ @override String searchPrompt({required Object source}) => '${source}에서 영화와 TV 프로그램을 검색하세요.';
+ @override String get searchFailed => '검색에 실패했습니다. 연결을 확인하고 다시 시도하세요.';
+ @override late final _TranslationsExploreStatusKo status = _TranslationsExploreStatusKo._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n,
+ other: '${n}화',
+ );
+ @override String get cast => '출연진';
+ @override String get characters => '캐릭터';
+ @override String get addToWatchlist => '관심 목록에 추가';
+ @override String get removeFromWatchlist => '관심 목록에서 제거';
+ @override String get watchlistUpdateFailed => '관심 목록을 업데이트하지 못했습니다';
+ @override String get notInLibrary => '라이브러리에 없음';
+ @override String get inTheseLibraries => '이 라이브러리에 있음';
+ @override String availableOn({required Object server}) => '${server}에서 이용 가능';
+ @override String get checkingLibrary => '라이브러리 확인 중...';
+ @override String get emptyTitle => '아직 아무것도 없습니다';
+ @override String emptyMessage({required Object source}) => '${source}에 콘텐츠가 추가되면 여기에 표시됩니다.';
}
// Path: liveTv
@@ -1645,15 +1679,54 @@ class _TranslationsTraktKo extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Plezy에서 시청 완료로 표시한 항목이 Trakt에도 시청 완료로 표시됩니다.';
}
-// Path: trackers
-class _TranslationsTrackersKo extends TranslationsTrackersEn {
- _TranslationsTrackersKo._(TranslationsKo root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrKo extends TranslationsSeerrEn {
+ _TranslationsSeerrKo._(TranslationsKo root) : this._root = root, super.internal(root);
final TranslationsKo _root; // ignore: unused_field
// Translations
- @override String get title => '트래커';
- @override String get hubSubtitle => '시청 진행률을 Trakt 및 다른 서비스와 동기화합니다.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Seerr에 연결';
+ @override String get serverUrl => '서버 URL';
+ @override String get serverUrlHelper => 'Seerr 인스턴스의 주소';
+ @override String get checkServer => '계속';
+ @override String get signInWithJellyfin => 'Jellyfin으로 로그인';
+ @override String get signInWithEmby => 'Emby로 로그인';
+ @override String get signInWithLocal => '로컬 계정 사용';
+ @override String get email => '이메일';
+ @override String get noSignInMethods => '이 Seerr 인스턴스에는 Plezy가 지원하는 로그인 방법이 없습니다.';
+ @override String get instance => '인스턴스';
+ @override String get disconnectConfirm => 'Seerr 연결을 해제하시겠습니까?';
+ @override String get disconnectConfirmBody => 'Plezy가 이 Seerr 인스턴스를 삭제합니다. 언제든 다시 연결할 수 있습니다.';
+ @override String get request => '요청';
+ @override String get request4k => '4K로 요청';
+ @override String get seasons => '시즌';
+ @override String get allSeasons => '모든 시즌';
+ @override String get advancedOptions => '고급';
+ @override String get destinationServer => '대상 서버';
+ @override String get qualityProfile => '화질 프로파일';
+ @override String get rootFolder => '루트 폴더';
+ @override String get languageProfile => '언어 프로파일';
+ @override String get requestSubmitted => '요청을 제출했습니다';
+ @override String requestFailed({required Object error}) => '요청 실패: ${error}';
+ @override String get requestsLoadFailed => '요청 옵션을 불러올 수 없습니다';
+ @override String get nothingToRequest => '모두 이미 사용 가능하거나 요청되었습니다.';
+ @override String get statusAvailable => '사용 가능';
+ @override String get statusPartiallyAvailable => '일부 사용 가능';
+ @override String get statusRequested => '요청됨';
+ @override String get statusProcessing => '처리 중';
+}
+
+// Path: services
+class _TranslationsServicesKo extends TranslationsServicesEn {
+ _TranslationsServicesKo._(TranslationsKo root) : this._root = root, super.internal(root);
+
+ final TranslationsKo _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => '서비스';
+ @override String get hubSubtitle => '시청 진행률을 동기화하고 새 작품을 요청하세요.';
@override String get notConnected => '연결되지 않음';
@override String connectedAs({required Object username}) => '@${username} 로 연결됨';
@override String get scrobble => '진행률 자동 추적';
@@ -1661,10 +1734,10 @@ class _TranslationsTrackersKo extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => '${service} 연결을 해제하시겠습니까?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy가 ${service} 업데이트를 중지합니다. 언제든 다시 연결할 수 있습니다.';
@override String connectFailed({required Object service}) => '${service}에 연결할 수 없습니다. 다시 시도하세요.';
- @override late final _TranslationsTrackersServicesKo services = _TranslationsTrackersServicesKo._(_root);
- @override late final _TranslationsTrackersDeviceCodeKo deviceCode = _TranslationsTrackersDeviceCodeKo._(_root);
- @override late final _TranslationsTrackersOauthProxyKo oauthProxy = _TranslationsTrackersOauthProxyKo._(_root);
- @override late final _TranslationsTrackersLibraryFilterKo libraryFilter = _TranslationsTrackersLibraryFilterKo._(_root);
+ @override late final _TranslationsServicesNamesKo names = _TranslationsServicesNamesKo._(_root);
+ @override late final _TranslationsServicesDeviceCodeKo deviceCode = _TranslationsServicesDeviceCodeKo._(_root);
+ @override late final _TranslationsServicesOauthProxyKo oauthProxy = _TranslationsServicesOauthProxyKo._(_root);
+ @override late final _TranslationsServicesLibraryFilterKo libraryFilter = _TranslationsServicesLibraryFilterKo._(_root);
}
// Path: addServer
@@ -1831,6 +1904,41 @@ class _TranslationsLibrariesSortLabelsKo extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => '최신 에피소드 추가일';
}
+// Path: explore.rows
+class _TranslationsExploreRowsKo extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsKo._(TranslationsKo root) : this._root = root, super.internal(root);
+
+ final TranslationsKo _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => '관심 목록';
+ @override String get recommendedMovies => '추천 영화';
+ @override String get recommendedShows => '추천 TV 프로그램';
+ @override String get trendingMovies => '지금 뜨는 영화';
+ @override String get trendingShows => '지금 뜨는 TV 프로그램';
+ @override String get popularMovies => '인기 영화';
+ @override String get popularShows => '인기 TV 프로그램';
+ @override String get suggestedAnime => '추천 애니메이션';
+ @override String get airingAnime => '방영 중인 인기 애니메이션';
+ @override String get popularAnime => '가장 인기 있는 애니메이션';
+ @override String get trending => '지금 뜨는 콘텐츠';
+ @override String get upcomingMovies => '개봉 예정 영화';
+ @override String get upcomingShows => '방영 예정 TV 프로그램';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusKo extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusKo._(TranslationsKo root) : this._root = root, super.internal(root);
+
+ final TranslationsKo _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => '방영 중';
+ @override String get ended => '종영';
+ @override String get canceled => '취소됨';
+ @override String get upcoming => '방영 예정';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionKo extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionKo._(TranslationsKo root) : this._root = root, super.internal(root);
@@ -1927,9 +2035,9 @@ class _TranslationsCompanionRemoteErrorsKo extends TranslationsCompanionRemoteEr
@override String get connectionLost => '연결이 끊어졌습니다';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesKo extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesKo._(TranslationsKo root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesKo extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesKo._(TranslationsKo root) : this._root = root, super.internal(root);
final TranslationsKo _root; // ignore: unused_field
@@ -1937,11 +2045,12 @@ class _TranslationsTrackersServicesKo extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeKo extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeKo._(TranslationsKo root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeKo extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeKo._(TranslationsKo root) : this._root = root, super.internal(root);
final TranslationsKo _root; // ignore: unused_field
@@ -1953,9 +2062,9 @@ class _TranslationsTrackersDeviceCodeKo extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => '코드가 복사되었습니다';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyKo extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyKo._(TranslationsKo root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyKo extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyKo._(TranslationsKo root) : this._root = root, super.internal(root);
final TranslationsKo _root; // ignore: unused_field
@@ -1966,9 +2075,9 @@ class _TranslationsTrackersOauthProxyKo extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL이 복사되었습니다';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterKo extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterKo._(TranslationsKo root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterKo extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterKo._(TranslationsKo root) : this._root = root, super.internal(root);
final TranslationsKo _root; // ignore: unused_field
@@ -2232,8 +2341,8 @@ extension on TranslationsKo {
'settings.discordRichPresenceDescription' => 'Discord에서 시청 중인 콘텐츠 표시',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Trakt와 시청 기록 동기화',
- 'settings.trackers' => '트래커',
- 'settings.trackersDescription' => 'Trakt, MyAnimeList, AniList 및 Simkl에 진행률 동기화',
+ 'settings.services' => '서비스',
+ 'settings.servicesDescription' => 'Trakt, MyAnimeList, Seerr 등 연결',
'settings.companionRemoteServer' => '컴패니언 리모트 서버',
'settings.companionRemoteServerDescription' => '네트워크의 모바일 기기가 이 앱을 제어할 수 있도록 허용',
'settings.autoPip' => '자동 PIP 모드',
@@ -2389,7 +2498,7 @@ extension on TranslationsKo {
'rateSheet.setScore' => '점수 설정',
'rateSheet.saved' => '저장됨',
'rateSheet.notAvailable' => '일치 항목 없음',
- 'rateSheet.noConnectedTrackers' => '설정에서 트래커를 연결하면 거기에도 평가할 수 있습니다.',
+ 'rateSheet.noConnectedServices' => '평가하려면 설정에서 서비스를 연결하세요.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, 영화',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV 프로그램',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2770,6 +2879,42 @@ extension on TranslationsKo {
'navigation.libraries' => '미디어 라이브러리',
'navigation.downloads' => '다운로드',
'navigation.liveTv' => '실시간 TV',
+ 'navigation.explore' => '탐색',
+ 'explore.title' => '탐색',
+ 'explore.selectSource' => '소스 선택',
+ 'explore.rows.watchlist' => '관심 목록',
+ 'explore.rows.recommendedMovies' => '추천 영화',
+ 'explore.rows.recommendedShows' => '추천 TV 프로그램',
+ 'explore.rows.trendingMovies' => '지금 뜨는 영화',
+ 'explore.rows.trendingShows' => '지금 뜨는 TV 프로그램',
+ 'explore.rows.popularMovies' => '인기 영화',
+ 'explore.rows.popularShows' => '인기 TV 프로그램',
+ 'explore.rows.suggestedAnime' => '추천 애니메이션',
+ 'explore.rows.airingAnime' => '방영 중인 인기 애니메이션',
+ 'explore.rows.popularAnime' => '가장 인기 있는 애니메이션',
+ 'explore.rows.trending' => '지금 뜨는 콘텐츠',
+ 'explore.rows.upcomingMovies' => '개봉 예정 영화',
+ 'explore.rows.upcomingShows' => '방영 예정 TV 프로그램',
+ 'explore.searchHint' => ({required Object source}) => '${source}에서 검색',
+ 'explore.searchEmpty' => ({required Object query}) => '「${query}」에 대한 결과가 없습니다',
+ 'explore.searchPrompt' => ({required Object source}) => '${source}에서 영화와 TV 프로그램을 검색하세요.',
+ 'explore.searchFailed' => '검색에 실패했습니다. 연결을 확인하고 다시 시도하세요.',
+ 'explore.status.airing' => '방영 중',
+ 'explore.status.ended' => '종영',
+ 'explore.status.canceled' => '취소됨',
+ 'explore.status.upcoming' => '방영 예정',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, other: '${n}화', ),
+ 'explore.cast' => '출연진',
+ 'explore.characters' => '캐릭터',
+ 'explore.addToWatchlist' => '관심 목록에 추가',
+ 'explore.removeFromWatchlist' => '관심 목록에서 제거',
+ 'explore.watchlistUpdateFailed' => '관심 목록을 업데이트하지 못했습니다',
+ 'explore.notInLibrary' => '라이브러리에 없음',
+ 'explore.inTheseLibraries' => '이 라이브러리에 있음',
+ 'explore.availableOn' => ({required Object server}) => '${server}에서 이용 가능',
+ 'explore.checkingLibrary' => '라이브러리 확인 중...',
+ 'explore.emptyTitle' => '아직 아무것도 없습니다',
+ 'explore.emptyMessage' => ({required Object source}) => '${source}에 콘텐츠가 추가되면 여기에 표시됩니다.',
'liveTv.title' => '실시간 TV',
'liveTv.guide' => '편성표',
'liveTv.noChannels' => '사용 가능한 채널이 없습니다',
@@ -2985,6 +3130,8 @@ extension on TranslationsKo {
'downloads.cancelledDownloadMessage' => '이 다운로드가 취소되었습니다. 어떻게 하시겠습니까?',
'downloads.allEpisodesAlreadyDownloaded' => '모든 에피소드가 이미 다운로드되었습니다',
'downloads.resumeDownload' => '다운로드 재개',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => '취소된 다운로드',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (${status} 동기화 중)',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} 다운로드됨 — 클릭하여 완료',
@@ -3021,8 +3168,6 @@ extension on TranslationsKo {
'downloads.noSyncRules' => '동기화 규칙 없음',
'downloads.manageSyncRule' => '동기화 관리',
'downloads.editEpisodeCount' => '에피소드 수',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => '동기화 필터',
'downloads.syncAllItems' => '모든 항목 동기화 중',
'downloads.syncUnwatchedItems' => '시청하지 않은 항목 동기화 중',
@@ -3271,39 +3416,70 @@ extension on TranslationsKo {
'trakt.scrobbleDescription' => '재생 중 재생, 일시정지, 정지 이벤트를 Trakt로 전송합니다.',
'trakt.watchedSync' => '시청 상태 동기화',
'trakt.watchedSyncDescription' => 'Plezy에서 시청 완료로 표시한 항목이 Trakt에도 시청 완료로 표시됩니다.',
- 'trackers.title' => '트래커',
- 'trackers.hubSubtitle' => '시청 진행률을 Trakt 및 다른 서비스와 동기화합니다.',
- 'trackers.notConnected' => '연결되지 않음',
- 'trackers.connectedAs' => ({required Object username}) => '@${username} 로 연결됨',
- 'trackers.scrobble' => '진행률 자동 추적',
- 'trackers.scrobbleDescription' => '에피소드나 영화를 시청하면 목록을 업데이트합니다.',
- 'trackers.disconnectConfirm' => ({required Object service}) => '${service} 연결을 해제하시겠습니까?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy가 ${service} 업데이트를 중지합니다. 언제든 다시 연결할 수 있습니다.',
- 'trackers.connectFailed' => ({required Object service}) => '${service}에 연결할 수 없습니다. 다시 시도하세요.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => '${service}에서 Plezy 활성화',
- 'trackers.deviceCode.body' => ({required Object url}) => '${url}을 방문하여 이 코드를 입력하세요:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => '활성화하려면 ${service} 열기',
- 'trackers.deviceCode.waitingForAuthorization' => '인증을 기다리는 중…',
- 'trackers.deviceCode.codeCopied' => '코드가 복사되었습니다',
- 'trackers.oauthProxy.title' => ({required Object service}) => '${service}에 로그인',
- 'trackers.oauthProxy.body' => '이 QR 코드를 스캔하거나 아무 기기에서 URL을 여세요.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => '로그인하려면 ${service} 열기',
- 'trackers.oauthProxy.urlCopied' => 'URL이 복사되었습니다',
- 'trackers.libraryFilter.title' => '라이브러리 필터',
- 'trackers.libraryFilter.subtitleAllSyncing' => '모든 라이브러리 동기화 중',
- 'trackers.libraryFilter.subtitleNoneSyncing' => '동기화 안 함',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count}개 차단됨',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count}개 허용됨',
- 'trackers.libraryFilter.mode' => '필터 모드',
- 'trackers.libraryFilter.modeBlacklist' => '차단 목록',
- 'trackers.libraryFilter.modeWhitelist' => '허용 목록',
- 'trackers.libraryFilter.modeHintBlacklist' => '아래에 선택한 라이브러리를 제외한 모든 라이브러리를 동기화합니다.',
- 'trackers.libraryFilter.modeHintWhitelist' => '아래에 선택한 라이브러리만 동기화합니다.',
- 'trackers.libraryFilter.libraries' => '라이브러리',
- 'trackers.libraryFilter.noLibraries' => '사용 가능한 라이브러리가 없습니다',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Seerr에 연결',
+ 'seerr.serverUrl' => '서버 URL',
+ 'seerr.serverUrlHelper' => 'Seerr 인스턴스의 주소',
+ 'seerr.checkServer' => '계속',
+ 'seerr.signInWithJellyfin' => 'Jellyfin으로 로그인',
+ 'seerr.signInWithEmby' => 'Emby로 로그인',
+ 'seerr.signInWithLocal' => '로컬 계정 사용',
+ 'seerr.email' => '이메일',
+ 'seerr.noSignInMethods' => '이 Seerr 인스턴스에는 Plezy가 지원하는 로그인 방법이 없습니다.',
+ 'seerr.instance' => '인스턴스',
+ 'seerr.disconnectConfirm' => 'Seerr 연결을 해제하시겠습니까?',
+ 'seerr.disconnectConfirmBody' => 'Plezy가 이 Seerr 인스턴스를 삭제합니다. 언제든 다시 연결할 수 있습니다.',
+ 'seerr.request' => '요청',
+ 'seerr.request4k' => '4K로 요청',
+ 'seerr.seasons' => '시즌',
+ 'seerr.allSeasons' => '모든 시즌',
+ 'seerr.advancedOptions' => '고급',
+ 'seerr.destinationServer' => '대상 서버',
+ 'seerr.qualityProfile' => '화질 프로파일',
+ 'seerr.rootFolder' => '루트 폴더',
+ 'seerr.languageProfile' => '언어 프로파일',
+ 'seerr.requestSubmitted' => '요청을 제출했습니다',
+ 'seerr.requestFailed' => ({required Object error}) => '요청 실패: ${error}',
+ 'seerr.requestsLoadFailed' => '요청 옵션을 불러올 수 없습니다',
+ 'seerr.nothingToRequest' => '모두 이미 사용 가능하거나 요청되었습니다.',
+ 'seerr.statusAvailable' => '사용 가능',
+ 'seerr.statusPartiallyAvailable' => '일부 사용 가능',
+ 'seerr.statusRequested' => '요청됨',
+ 'seerr.statusProcessing' => '처리 중',
+ 'services.title' => '서비스',
+ 'services.hubSubtitle' => '시청 진행률을 동기화하고 새 작품을 요청하세요.',
+ 'services.notConnected' => '연결되지 않음',
+ 'services.connectedAs' => ({required Object username}) => '@${username} 로 연결됨',
+ 'services.scrobble' => '진행률 자동 추적',
+ 'services.scrobbleDescription' => '에피소드나 영화를 시청하면 목록을 업데이트합니다.',
+ 'services.disconnectConfirm' => ({required Object service}) => '${service} 연결을 해제하시겠습니까?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy가 ${service} 업데이트를 중지합니다. 언제든 다시 연결할 수 있습니다.',
+ 'services.connectFailed' => ({required Object service}) => '${service}에 연결할 수 없습니다. 다시 시도하세요.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => '${service}에서 Plezy 활성화',
+ 'services.deviceCode.body' => ({required Object url}) => '${url}을 방문하여 이 코드를 입력하세요:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => '활성화하려면 ${service} 열기',
+ 'services.deviceCode.waitingForAuthorization' => '인증을 기다리는 중…',
+ 'services.deviceCode.codeCopied' => '코드가 복사되었습니다',
+ 'services.oauthProxy.title' => ({required Object service}) => '${service}에 로그인',
+ 'services.oauthProxy.body' => '이 QR 코드를 스캔하거나 아무 기기에서 URL을 여세요.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => '로그인하려면 ${service} 열기',
+ 'services.oauthProxy.urlCopied' => 'URL이 복사되었습니다',
+ 'services.libraryFilter.title' => '라이브러리 필터',
+ 'services.libraryFilter.subtitleAllSyncing' => '모든 라이브러리 동기화 중',
+ 'services.libraryFilter.subtitleNoneSyncing' => '동기화 안 함',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count}개 차단됨',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count}개 허용됨',
+ 'services.libraryFilter.mode' => '필터 모드',
+ 'services.libraryFilter.modeBlacklist' => '차단 목록',
+ 'services.libraryFilter.modeWhitelist' => '허용 목록',
+ 'services.libraryFilter.modeHintBlacklist' => '아래에 선택한 라이브러리를 제외한 모든 라이브러리를 동기화합니다.',
+ 'services.libraryFilter.modeHintWhitelist' => '아래에 선택한 라이브러리만 동기화합니다.',
+ 'services.libraryFilter.libraries' => '라이브러리',
+ 'services.libraryFilter.noLibraries' => '사용 가능한 라이브러리가 없습니다',
'addServer.addJellyfinTitle' => 'Jellyfin 서버 추가',
'addServer.serverUrls' => '서버 URL',
'addServer.serverUrlsHelper' => '쉼표로 구분하여 여러 URL을 입력할 수 있습니다.',
diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart
index 5f65d9bd..70d9913f 100644
--- a/lib/i18n/strings_nb.g.dart
+++ b/lib/i18n/strings_nb.g.dart
@@ -69,6 +69,7 @@ class TranslationsNb extends Translations with BaseTranslations 'Vis hva du ser på Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Synkroniser visningshistorikk med Trakt';
- @override String get trackers => 'Trackere';
- @override String get trackersDescription => 'Synkroniser fremdrift til Trakt, MyAnimeList, AniList og Simkl';
+ @override String get services => 'Tjenester';
+ @override String get servicesDescription => 'Koble til Trakt, MyAnimeList, Seerr og mer';
@override String get companionRemoteServer => 'Companion Remote-server';
@override String get companionRemoteServerDescription => 'Tillat mobilenheter på nettverket ditt å styre denne appen';
@override String get autoPip => 'Auto bilde-i-bilde';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetNb extends TranslationsRateSheetEn {
@override String get setScore => 'Sett en poengsum';
@override String get saved => 'Lagret';
@override String get notAvailable => 'Ingen treff';
- @override String get noConnectedTrackers => 'Koble til en sporer i Innstillinger for å vurdere der.';
+ @override String get noConnectedServices => 'Koble til en tjeneste i Innstillinger for å vurdere her.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationNb extends TranslationsNavigationEn {
@override String get libraries => 'Biblioteker';
@override String get downloads => 'Nedlastinger';
@override String get liveTv => 'Direkte-TV';
+ @override String get explore => 'Utforsk';
+}
+
+// Path: explore
+class _TranslationsExploreNb extends TranslationsExploreEn {
+ _TranslationsExploreNb._(TranslationsNb root) : this._root = root, super.internal(root);
+
+ final TranslationsNb _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Utforsk';
+ @override String get selectSource => 'Velg kilde';
+ @override late final _TranslationsExploreRowsNb rows = _TranslationsExploreRowsNb._(_root);
+ @override String searchHint({required Object source}) => 'Søk i ${source}';
+ @override String searchEmpty({required Object query}) => 'Ingen treff for "${query}"';
+ @override String searchPrompt({required Object source}) => 'Søk etter filmer og serier på ${source}.';
+ @override String get searchFailed => 'Søk mislyktes. Sjekk tilkoblingen og prøv igjen.';
+ @override late final _TranslationsExploreStatusNb status = _TranslationsExploreStatusNb._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nb'))(n,
+ one: '${n} episode',
+ other: '${n} episoder',
+ );
+ @override String get cast => 'Skuespillere';
+ @override String get characters => 'Figurer';
+ @override String get addToWatchlist => 'Legg til i ønskeliste';
+ @override String get removeFromWatchlist => 'Fjern fra ønskeliste';
+ @override String get watchlistUpdateFailed => 'Kunne ikke oppdatere ønskelisten';
+ @override String get notInLibrary => 'Ikke i biblioteket ditt';
+ @override String get inTheseLibraries => 'I disse bibliotekene';
+ @override String availableOn({required Object server}) => 'Tilgjengelig på ${server}';
+ @override String get checkingLibrary => 'Sjekker biblioteket ditt...';
+ @override String get emptyTitle => 'Ingenting her ennå';
+ @override String emptyMessage({required Object source}) => 'Rader fra ${source} vises her når de har innhold.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktNb extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Når du markerer noe som sett i Plezy, markeres det også på Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersNb extends TranslationsTrackersEn {
- _TranslationsTrackersNb._(TranslationsNb root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrNb extends TranslationsSeerrEn {
+ _TranslationsSeerrNb._(TranslationsNb root) : this._root = root, super.internal(root);
final TranslationsNb _root; // ignore: unused_field
// Translations
- @override String get title => 'Trackere';
- @override String get hubSubtitle => 'Synkroniser seerfremdrift med Trakt og andre tjenester.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Koble til Seerr';
+ @override String get serverUrl => 'Server-URL';
+ @override String get serverUrlHelper => 'Adressen til Seerr-instansen din';
+ @override String get checkServer => 'Fortsett';
+ @override String get signInWithJellyfin => 'Logg inn med Jellyfin';
+ @override String get signInWithEmby => 'Logg inn med Emby';
+ @override String get signInWithLocal => 'Bruk en lokal konto';
+ @override String get email => 'E-post';
+ @override String get noSignInMethods => 'Denne Seerr-instansen tilbyr ingen innloggingsmetode som Plezy støtter.';
+ @override String get instance => 'Instans';
+ @override String get disconnectConfirm => 'Koble fra Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy glemmer denne Seerr-instansen. Koble til igjen når som helst.';
+ @override String get request => 'Forespør';
+ @override String get request4k => 'Forespør i 4K';
+ @override String get seasons => 'Sesonger';
+ @override String get allSeasons => 'Alle sesonger';
+ @override String get advancedOptions => 'Avansert';
+ @override String get destinationServer => 'Målserver';
+ @override String get qualityProfile => 'Kvalitetsprofil';
+ @override String get rootFolder => 'Rotmappe';
+ @override String get languageProfile => 'Språkprofil';
+ @override String get requestSubmitted => 'Forespørsel sendt';
+ @override String requestFailed({required Object error}) => 'Forespørsel mislyktes: ${error}';
+ @override String get requestsLoadFailed => 'Kunne ikke laste forespørselsalternativer';
+ @override String get nothingToRequest => 'Alt er allerede tilgjengelig eller forespurt.';
+ @override String get statusAvailable => 'Tilgjengelig';
+ @override String get statusPartiallyAvailable => 'Delvis tilgjengelig';
+ @override String get statusRequested => 'Forespurt';
+ @override String get statusProcessing => 'Behandler';
+}
+
+// Path: services
+class _TranslationsServicesNb extends TranslationsServicesEn {
+ _TranslationsServicesNb._(TranslationsNb root) : this._root = root, super.internal(root);
+
+ final TranslationsNb _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Tjenester';
+ @override String get hubSubtitle => 'Synkroniser fremdrift og forespør nye titler.';
@override String get notConnected => 'Ikke tilkoblet';
@override String connectedAs({required Object username}) => 'Tilkoblet som @${username}';
@override String get scrobble => 'Registrer fremdrift automatisk';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersNb extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Koble fra ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy slutter å oppdatere ${service}. Koble til igjen når som helst.';
@override String connectFailed({required Object service}) => 'Kunne ikke koble til ${service}. Prøv igjen.';
- @override late final _TranslationsTrackersServicesNb services = _TranslationsTrackersServicesNb._(_root);
- @override late final _TranslationsTrackersDeviceCodeNb deviceCode = _TranslationsTrackersDeviceCodeNb._(_root);
- @override late final _TranslationsTrackersOauthProxyNb oauthProxy = _TranslationsTrackersOauthProxyNb._(_root);
- @override late final _TranslationsTrackersLibraryFilterNb libraryFilter = _TranslationsTrackersLibraryFilterNb._(_root);
+ @override late final _TranslationsServicesNamesNb names = _TranslationsServicesNamesNb._(_root);
+ @override late final _TranslationsServicesDeviceCodeNb deviceCode = _TranslationsServicesDeviceCodeNb._(_root);
+ @override late final _TranslationsServicesOauthProxyNb oauthProxy = _TranslationsServicesOauthProxyNb._(_root);
+ @override late final _TranslationsServicesLibraryFilterNb libraryFilter = _TranslationsServicesLibraryFilterNb._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsNb extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Dato for sist lagt til episode';
}
+// Path: explore.rows
+class _TranslationsExploreRowsNb extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsNb._(TranslationsNb root) : this._root = root, super.internal(root);
+
+ final TranslationsNb _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Ønskeliste';
+ @override String get recommendedMovies => 'Anbefalte filmer';
+ @override String get recommendedShows => 'Anbefalte serier';
+ @override String get trendingMovies => 'Trending filmer';
+ @override String get trendingShows => 'Trending serier';
+ @override String get popularMovies => 'Populære filmer';
+ @override String get popularShows => 'Populære serier';
+ @override String get suggestedAnime => 'Foreslått anime';
+ @override String get airingAnime => 'Topp pågående anime';
+ @override String get popularAnime => 'Mest populære anime';
+ @override String get trending => 'Trending';
+ @override String get upcomingMovies => 'Kommende filmer';
+ @override String get upcomingShows => 'Kommende serier';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusNb extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusNb._(TranslationsNb root) : this._root = root, super.internal(root);
+
+ final TranslationsNb _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Sendes';
+ @override String get ended => 'Avsluttet';
+ @override String get canceled => 'Avlyst';
+ @override String get upcoming => 'Kommende';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionNb extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionNb._(TranslationsNb root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsNb extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Tilkobling mistet';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesNb extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesNb._(TranslationsNb root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesNb extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesNb._(TranslationsNb root) : this._root = root, super.internal(root);
final TranslationsNb _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesNb extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeNb extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeNb._(TranslationsNb root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeNb extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeNb._(TranslationsNb root) : this._root = root, super.internal(root);
final TranslationsNb _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeNb extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Kode kopiert';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyNb extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyNb._(TranslationsNb root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyNb extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyNb._(TranslationsNb root) : this._root = root, super.internal(root);
final TranslationsNb _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyNb extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL kopiert';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterNb extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterNb._(TranslationsNb root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterNb extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterNb._(TranslationsNb root) : this._root = root, super.internal(root);
final TranslationsNb _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsNb {
'settings.discordRichPresenceDescription' => 'Vis hva du ser på Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Synkroniser visningshistorikk med Trakt',
- 'settings.trackers' => 'Trackere',
- 'settings.trackersDescription' => 'Synkroniser fremdrift til Trakt, MyAnimeList, AniList og Simkl',
+ 'settings.services' => 'Tjenester',
+ 'settings.servicesDescription' => 'Koble til Trakt, MyAnimeList, Seerr og mer',
'settings.companionRemoteServer' => 'Companion Remote-server',
'settings.companionRemoteServerDescription' => 'Tillat mobilenheter på nettverket ditt å styre denne appen',
'settings.autoPip' => 'Auto bilde-i-bilde',
@@ -2390,7 +2500,7 @@ extension on TranslationsNb {
'rateSheet.setScore' => 'Sett en poengsum',
'rateSheet.saved' => 'Lagret',
'rateSheet.notAvailable' => 'Ingen treff',
- 'rateSheet.noConnectedTrackers' => 'Koble til en sporer i Innstillinger for å vurdere der.',
+ 'rateSheet.noConnectedServices' => 'Koble til en tjeneste i Innstillinger for å vurdere her.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsNb {
'navigation.libraries' => 'Biblioteker',
'navigation.downloads' => 'Nedlastinger',
'navigation.liveTv' => 'Direkte-TV',
+ 'navigation.explore' => 'Utforsk',
+ 'explore.title' => 'Utforsk',
+ 'explore.selectSource' => 'Velg kilde',
+ 'explore.rows.watchlist' => 'Ønskeliste',
+ 'explore.rows.recommendedMovies' => 'Anbefalte filmer',
+ 'explore.rows.recommendedShows' => 'Anbefalte serier',
+ 'explore.rows.trendingMovies' => 'Trending filmer',
+ 'explore.rows.trendingShows' => 'Trending serier',
+ 'explore.rows.popularMovies' => 'Populære filmer',
+ 'explore.rows.popularShows' => 'Populære serier',
+ 'explore.rows.suggestedAnime' => 'Foreslått anime',
+ 'explore.rows.airingAnime' => 'Topp pågående anime',
+ 'explore.rows.popularAnime' => 'Mest populære anime',
+ 'explore.rows.trending' => 'Trending',
+ 'explore.rows.upcomingMovies' => 'Kommende filmer',
+ 'explore.rows.upcomingShows' => 'Kommende serier',
+ 'explore.searchHint' => ({required Object source}) => 'Søk i ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Ingen treff for "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Søk etter filmer og serier på ${source}.',
+ 'explore.searchFailed' => 'Søk mislyktes. Sjekk tilkoblingen og prøv igjen.',
+ 'explore.status.airing' => 'Sendes',
+ 'explore.status.ended' => 'Avsluttet',
+ 'explore.status.canceled' => 'Avlyst',
+ 'explore.status.upcoming' => 'Kommende',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nb'))(n, one: '${n} episode', other: '${n} episoder', ),
+ 'explore.cast' => 'Skuespillere',
+ 'explore.characters' => 'Figurer',
+ 'explore.addToWatchlist' => 'Legg til i ønskeliste',
+ 'explore.removeFromWatchlist' => 'Fjern fra ønskeliste',
+ 'explore.watchlistUpdateFailed' => 'Kunne ikke oppdatere ønskelisten',
+ 'explore.notInLibrary' => 'Ikke i biblioteket ditt',
+ 'explore.inTheseLibraries' => 'I disse bibliotekene',
+ 'explore.availableOn' => ({required Object server}) => 'Tilgjengelig på ${server}',
+ 'explore.checkingLibrary' => 'Sjekker biblioteket ditt...',
+ 'explore.emptyTitle' => 'Ingenting her ennå',
+ 'explore.emptyMessage' => ({required Object source}) => 'Rader fra ${source} vises her når de har innhold.',
'liveTv.title' => 'Direkte-TV',
'liveTv.guide' => 'Programguide',
'liveTv.noChannels' => 'Ingen kanaler tilgjengelig',
@@ -2986,6 +3132,8 @@ extension on TranslationsNb {
'downloads.cancelledDownloadMessage' => 'Denne nedlastingen ble avbrutt. Hva vil du gjøre?',
'downloads.allEpisodesAlreadyDownloaded' => 'Alle episoder er allerede lastet ned',
'downloads.resumeDownload' => 'Gjenoppta nedlasting',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Avbrutt nedlasting',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synkroniserer ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} lastet ned – klikk for å fullføre',
@@ -3022,8 +3170,6 @@ extension on TranslationsNb {
'downloads.noSyncRules' => 'Ingen synkroniseringsregler',
'downloads.manageSyncRule' => 'Administrer synkronisering',
'downloads.editEpisodeCount' => 'Antall episoder',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Synkroniseringsfilter',
'downloads.syncAllItems' => 'Synkroniserer alle elementer',
'downloads.syncUnwatchedItems' => 'Synkroniserer usette elementer',
@@ -3272,39 +3418,70 @@ extension on TranslationsNb {
'trakt.scrobbleDescription' => 'Send avspillings-, pause- og stopphendelser til Trakt under avspilling.',
'trakt.watchedSync' => 'Synkroniser sett-status',
'trakt.watchedSyncDescription' => 'Når du markerer noe som sett i Plezy, markeres det også på Trakt.',
- 'trackers.title' => 'Trackere',
- 'trackers.hubSubtitle' => 'Synkroniser seerfremdrift med Trakt og andre tjenester.',
- 'trackers.notConnected' => 'Ikke tilkoblet',
- 'trackers.connectedAs' => ({required Object username}) => 'Tilkoblet som @${username}',
- 'trackers.scrobble' => 'Registrer fremdrift automatisk',
- 'trackers.scrobbleDescription' => 'Oppdater listen din når du er ferdig med en episode eller film.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Koble fra ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy slutter å oppdatere ${service}. Koble til igjen når som helst.',
- 'trackers.connectFailed' => ({required Object service}) => 'Kunne ikke koble til ${service}. Prøv igjen.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Aktiver Plezy på ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Besøk ${url} og skriv inn denne koden:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Åpne ${service} for å aktivere',
- 'trackers.deviceCode.waitingForAuthorization' => 'Venter på godkjenning…',
- 'trackers.deviceCode.codeCopied' => 'Kode kopiert',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Logg inn på ${service}',
- 'trackers.oauthProxy.body' => 'Skann denne QR-koden eller åpne URL-en på en enhet.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Åpne ${service} for å logge inn',
- 'trackers.oauthProxy.urlCopied' => 'URL kopiert',
- 'trackers.libraryFilter.title' => 'Biblioteksfilter',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Synkroniserer alle biblioteker',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Ingenting synkroniseres',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blokkert',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} tillatt',
- 'trackers.libraryFilter.mode' => 'Filtermodus',
- 'trackers.libraryFilter.modeBlacklist' => 'Svarteliste',
- 'trackers.libraryFilter.modeWhitelist' => 'Hviteliste',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Synkroniser alle biblioteker bortsett fra dem du markerer nedenfor.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Synkroniser kun bibliotekene du markerer nedenfor.',
- 'trackers.libraryFilter.libraries' => 'Biblioteker',
- 'trackers.libraryFilter.noLibraries' => 'Ingen biblioteker tilgjengelige',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Koble til Seerr',
+ 'seerr.serverUrl' => 'Server-URL',
+ 'seerr.serverUrlHelper' => 'Adressen til Seerr-instansen din',
+ 'seerr.checkServer' => 'Fortsett',
+ 'seerr.signInWithJellyfin' => 'Logg inn med Jellyfin',
+ 'seerr.signInWithEmby' => 'Logg inn med Emby',
+ 'seerr.signInWithLocal' => 'Bruk en lokal konto',
+ 'seerr.email' => 'E-post',
+ 'seerr.noSignInMethods' => 'Denne Seerr-instansen tilbyr ingen innloggingsmetode som Plezy støtter.',
+ 'seerr.instance' => 'Instans',
+ 'seerr.disconnectConfirm' => 'Koble fra Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy glemmer denne Seerr-instansen. Koble til igjen når som helst.',
+ 'seerr.request' => 'Forespør',
+ 'seerr.request4k' => 'Forespør i 4K',
+ 'seerr.seasons' => 'Sesonger',
+ 'seerr.allSeasons' => 'Alle sesonger',
+ 'seerr.advancedOptions' => 'Avansert',
+ 'seerr.destinationServer' => 'Målserver',
+ 'seerr.qualityProfile' => 'Kvalitetsprofil',
+ 'seerr.rootFolder' => 'Rotmappe',
+ 'seerr.languageProfile' => 'Språkprofil',
+ 'seerr.requestSubmitted' => 'Forespørsel sendt',
+ 'seerr.requestFailed' => ({required Object error}) => 'Forespørsel mislyktes: ${error}',
+ 'seerr.requestsLoadFailed' => 'Kunne ikke laste forespørselsalternativer',
+ 'seerr.nothingToRequest' => 'Alt er allerede tilgjengelig eller forespurt.',
+ 'seerr.statusAvailable' => 'Tilgjengelig',
+ 'seerr.statusPartiallyAvailable' => 'Delvis tilgjengelig',
+ 'seerr.statusRequested' => 'Forespurt',
+ 'seerr.statusProcessing' => 'Behandler',
+ 'services.title' => 'Tjenester',
+ 'services.hubSubtitle' => 'Synkroniser fremdrift og forespør nye titler.',
+ 'services.notConnected' => 'Ikke tilkoblet',
+ 'services.connectedAs' => ({required Object username}) => 'Tilkoblet som @${username}',
+ 'services.scrobble' => 'Registrer fremdrift automatisk',
+ 'services.scrobbleDescription' => 'Oppdater listen din når du er ferdig med en episode eller film.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Koble fra ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy slutter å oppdatere ${service}. Koble til igjen når som helst.',
+ 'services.connectFailed' => ({required Object service}) => 'Kunne ikke koble til ${service}. Prøv igjen.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Aktiver Plezy på ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Besøk ${url} og skriv inn denne koden:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Åpne ${service} for å aktivere',
+ 'services.deviceCode.waitingForAuthorization' => 'Venter på godkjenning…',
+ 'services.deviceCode.codeCopied' => 'Kode kopiert',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Logg inn på ${service}',
+ 'services.oauthProxy.body' => 'Skann denne QR-koden eller åpne URL-en på en enhet.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Åpne ${service} for å logge inn',
+ 'services.oauthProxy.urlCopied' => 'URL kopiert',
+ 'services.libraryFilter.title' => 'Biblioteksfilter',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Synkroniserer alle biblioteker',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Ingenting synkroniseres',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blokkert',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} tillatt',
+ 'services.libraryFilter.mode' => 'Filtermodus',
+ 'services.libraryFilter.modeBlacklist' => 'Svarteliste',
+ 'services.libraryFilter.modeWhitelist' => 'Hviteliste',
+ 'services.libraryFilter.modeHintBlacklist' => 'Synkroniser alle biblioteker bortsett fra dem du markerer nedenfor.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Synkroniser kun bibliotekene du markerer nedenfor.',
+ 'services.libraryFilter.libraries' => 'Biblioteker',
+ 'services.libraryFilter.noLibraries' => 'Ingen biblioteker tilgjengelige',
'addServer.addJellyfinTitle' => 'Legg til Jellyfin-server',
'addServer.serverUrls' => 'Server-URL-er',
'addServer.serverUrlsHelper' => 'Flere URL-er er tillatt, atskilt med komma.',
diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart
index 421d298b..48757bf8 100644
--- a/lib/i18n/strings_nl.g.dart
+++ b/lib/i18n/strings_nl.g.dart
@@ -69,6 +69,7 @@ class TranslationsNl extends Translations with BaseTranslations 'Toon op Discord wat je aan het kijken bent';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Kijkgeschiedenis synchroniseren met Trakt';
- @override String get trackers => 'Trackers';
- @override String get trackersDescription => 'Voortgang synchroniseren met Trakt, MyAnimeList, AniList en Simkl';
+ @override String get services => 'Services';
+ @override String get servicesDescription => 'Verbind Trakt, MyAnimeList, Seerr en meer';
@override String get companionRemoteServer => 'Companion Remote-server';
@override String get companionRemoteServerDescription => 'Sta mobiele apparaten op je netwerk toe om deze app te bedienen';
@override String get autoPip => 'Automatische beeld-in-beeld';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetNl extends TranslationsRateSheetEn {
@override String get setScore => 'Score instellen';
@override String get saved => 'Opgeslagen';
@override String get notAvailable => 'Geen match gevonden';
- @override String get noConnectedTrackers => 'Verbind een tracker in Instellingen om daar te beoordelen.';
+ @override String get noConnectedServices => 'Verbind een service in Instellingen om daar te beoordelen.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationNl extends TranslationsNavigationEn {
@override String get libraries => 'Media';
@override String get downloads => 'Downloads';
@override String get liveTv => 'Live TV';
+ @override String get explore => 'Verkennen';
+}
+
+// Path: explore
+class _TranslationsExploreNl extends TranslationsExploreEn {
+ _TranslationsExploreNl._(TranslationsNl root) : this._root = root, super.internal(root);
+
+ final TranslationsNl _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Verkennen';
+ @override String get selectSource => 'Bron kiezen';
+ @override late final _TranslationsExploreRowsNl rows = _TranslationsExploreRowsNl._(_root);
+ @override String searchHint({required Object source}) => 'Zoeken in ${source}';
+ @override String searchEmpty({required Object query}) => 'Geen resultaten voor "${query}"';
+ @override String searchPrompt({required Object source}) => 'Zoek naar films en series op ${source}.';
+ @override String get searchFailed => 'Zoeken mislukt. Controleer je verbinding en probeer opnieuw.';
+ @override late final _TranslationsExploreStatusNl status = _TranslationsExploreStatusNl._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n,
+ one: '${n} aflevering',
+ other: '${n} afleveringen',
+ );
+ @override String get cast => 'Acteurs';
+ @override String get characters => 'Personages';
+ @override String get addToWatchlist => 'Toevoegen aan kijklijst';
+ @override String get removeFromWatchlist => 'Verwijderen uit kijklijst';
+ @override String get watchlistUpdateFailed => 'Kon kijklijst niet bijwerken';
+ @override String get notInLibrary => 'Niet in je bibliotheek';
+ @override String get inTheseLibraries => 'In deze bibliotheken';
+ @override String availableOn({required Object server}) => 'Beschikbaar op ${server}';
+ @override String get checkingLibrary => 'Je bibliotheek controleren...';
+ @override String get emptyTitle => 'Hier is nog niets';
+ @override String emptyMessage({required Object source}) => 'Rijen van ${source} verschijnen hier zodra ze inhoud hebben.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktNl extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Wanneer je items als bekeken markeert in Plezy, worden ze ook op Trakt gemarkeerd.';
}
-// Path: trackers
-class _TranslationsTrackersNl extends TranslationsTrackersEn {
- _TranslationsTrackersNl._(TranslationsNl root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrNl extends TranslationsSeerrEn {
+ _TranslationsSeerrNl._(TranslationsNl root) : this._root = root, super.internal(root);
final TranslationsNl _root; // ignore: unused_field
// Translations
- @override String get title => 'Trackers';
- @override String get hubSubtitle => 'Synchroniseer kijkvoortgang met Trakt en andere diensten.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Verbinden met Seerr';
+ @override String get serverUrl => 'Server-URL';
+ @override String get serverUrlHelper => 'Het adres van je Seerr-instantie';
+ @override String get checkServer => 'Doorgaan';
+ @override String get signInWithJellyfin => 'Inloggen met Jellyfin';
+ @override String get signInWithEmby => 'Inloggen met Emby';
+ @override String get signInWithLocal => 'Een lokaal account gebruiken';
+ @override String get email => 'E-mail';
+ @override String get noSignInMethods => 'Deze Seerr-instantie biedt geen inlogmethode die Plezy ondersteunt.';
+ @override String get instance => 'Instantie';
+ @override String get disconnectConfirm => 'Seerr loskoppelen?';
+ @override String get disconnectConfirmBody => 'Plezy vergeet deze Seerr-instantie. Je kunt altijd opnieuw verbinden.';
+ @override String get request => 'Aanvragen';
+ @override String get request4k => 'Aanvragen in 4K';
+ @override String get seasons => 'Seizoenen';
+ @override String get allSeasons => 'Alle seizoenen';
+ @override String get advancedOptions => 'Geavanceerd';
+ @override String get destinationServer => 'Doelserver';
+ @override String get qualityProfile => 'Kwaliteitsprofiel';
+ @override String get rootFolder => 'Hoofdmap';
+ @override String get languageProfile => 'Taalprofiel';
+ @override String get requestSubmitted => 'Aanvraag verzonden';
+ @override String requestFailed({required Object error}) => 'Aanvraag mislukt: ${error}';
+ @override String get requestsLoadFailed => 'Kan aanvraagopties niet laden';
+ @override String get nothingToRequest => 'Alles is al beschikbaar of aangevraagd.';
+ @override String get statusAvailable => 'Beschikbaar';
+ @override String get statusPartiallyAvailable => 'Gedeeltelijk beschikbaar';
+ @override String get statusRequested => 'Aangevraagd';
+ @override String get statusProcessing => 'Verwerken';
+}
+
+// Path: services
+class _TranslationsServicesNl extends TranslationsServicesEn {
+ _TranslationsServicesNl._(TranslationsNl root) : this._root = root, super.internal(root);
+
+ final TranslationsNl _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Services';
+ @override String get hubSubtitle => 'Synchroniseer kijkvoortgang en vraag nieuwe titels aan.';
@override String get notConnected => 'Niet verbonden';
@override String connectedAs({required Object username}) => 'Verbonden als @${username}';
@override String get scrobble => 'Voortgang automatisch volgen';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersNl extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => '${service} loskoppelen?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy stopt met ${service} bijwerken. Je kunt altijd opnieuw verbinden.';
@override String connectFailed({required Object service}) => 'Kan niet verbinden met ${service}. Probeer opnieuw.';
- @override late final _TranslationsTrackersServicesNl services = _TranslationsTrackersServicesNl._(_root);
- @override late final _TranslationsTrackersDeviceCodeNl deviceCode = _TranslationsTrackersDeviceCodeNl._(_root);
- @override late final _TranslationsTrackersOauthProxyNl oauthProxy = _TranslationsTrackersOauthProxyNl._(_root);
- @override late final _TranslationsTrackersLibraryFilterNl libraryFilter = _TranslationsTrackersLibraryFilterNl._(_root);
+ @override late final _TranslationsServicesNamesNl names = _TranslationsServicesNamesNl._(_root);
+ @override late final _TranslationsServicesDeviceCodeNl deviceCode = _TranslationsServicesDeviceCodeNl._(_root);
+ @override late final _TranslationsServicesOauthProxyNl oauthProxy = _TranslationsServicesOauthProxyNl._(_root);
+ @override late final _TranslationsServicesLibraryFilterNl libraryFilter = _TranslationsServicesLibraryFilterNl._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsNl extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Datum laatst toegevoegde aflevering';
}
+// Path: explore.rows
+class _TranslationsExploreRowsNl extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsNl._(TranslationsNl root) : this._root = root, super.internal(root);
+
+ final TranslationsNl _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Kijklijst';
+ @override String get recommendedMovies => 'Aanbevolen films';
+ @override String get recommendedShows => 'Aanbevolen series';
+ @override String get trendingMovies => 'Trending films';
+ @override String get trendingShows => 'Trending series';
+ @override String get popularMovies => 'Populaire films';
+ @override String get popularShows => 'Populaire series';
+ @override String get suggestedAnime => 'Voorgestelde anime';
+ @override String get airingAnime => 'Top lopende anime';
+ @override String get popularAnime => 'Populairste anime';
+ @override String get trending => 'Trending';
+ @override String get upcomingMovies => 'Aankomende films';
+ @override String get upcomingShows => 'Aankomende series';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusNl extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusNl._(TranslationsNl root) : this._root = root, super.internal(root);
+
+ final TranslationsNl _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Lopend';
+ @override String get ended => 'Afgelopen';
+ @override String get canceled => 'Geannuleerd';
+ @override String get upcoming => 'Binnenkort';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionNl extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionNl._(TranslationsNl root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsNl extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Verbinding verloren';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesNl extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesNl._(TranslationsNl root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesNl extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesNl._(TranslationsNl root) : this._root = root, super.internal(root);
final TranslationsNl _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesNl extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeNl extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeNl._(TranslationsNl root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeNl extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeNl._(TranslationsNl root) : this._root = root, super.internal(root);
final TranslationsNl _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeNl extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Code gekopieerd';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyNl extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyNl._(TranslationsNl root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyNl extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyNl._(TranslationsNl root) : this._root = root, super.internal(root);
final TranslationsNl _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyNl extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL gekopieerd';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterNl extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterNl._(TranslationsNl root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterNl extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterNl._(TranslationsNl root) : this._root = root, super.internal(root);
final TranslationsNl _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsNl {
'settings.discordRichPresenceDescription' => 'Toon op Discord wat je aan het kijken bent',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Kijkgeschiedenis synchroniseren met Trakt',
- 'settings.trackers' => 'Trackers',
- 'settings.trackersDescription' => 'Voortgang synchroniseren met Trakt, MyAnimeList, AniList en Simkl',
+ 'settings.services' => 'Services',
+ 'settings.servicesDescription' => 'Verbind Trakt, MyAnimeList, Seerr en meer',
'settings.companionRemoteServer' => 'Companion Remote-server',
'settings.companionRemoteServerDescription' => 'Sta mobiele apparaten op je netwerk toe om deze app te bedienen',
'settings.autoPip' => 'Automatische beeld-in-beeld',
@@ -2390,7 +2500,7 @@ extension on TranslationsNl {
'rateSheet.setScore' => 'Score instellen',
'rateSheet.saved' => 'Opgeslagen',
'rateSheet.notAvailable' => 'Geen match gevonden',
- 'rateSheet.noConnectedTrackers' => 'Verbind een tracker in Instellingen om daar te beoordelen.',
+ 'rateSheet.noConnectedServices' => 'Verbind een service in Instellingen om daar te beoordelen.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsNl {
'navigation.libraries' => 'Media',
'navigation.downloads' => 'Downloads',
'navigation.liveTv' => 'Live TV',
+ 'navigation.explore' => 'Verkennen',
+ 'explore.title' => 'Verkennen',
+ 'explore.selectSource' => 'Bron kiezen',
+ 'explore.rows.watchlist' => 'Kijklijst',
+ 'explore.rows.recommendedMovies' => 'Aanbevolen films',
+ 'explore.rows.recommendedShows' => 'Aanbevolen series',
+ 'explore.rows.trendingMovies' => 'Trending films',
+ 'explore.rows.trendingShows' => 'Trending series',
+ 'explore.rows.popularMovies' => 'Populaire films',
+ 'explore.rows.popularShows' => 'Populaire series',
+ 'explore.rows.suggestedAnime' => 'Voorgestelde anime',
+ 'explore.rows.airingAnime' => 'Top lopende anime',
+ 'explore.rows.popularAnime' => 'Populairste anime',
+ 'explore.rows.trending' => 'Trending',
+ 'explore.rows.upcomingMovies' => 'Aankomende films',
+ 'explore.rows.upcomingShows' => 'Aankomende series',
+ 'explore.searchHint' => ({required Object source}) => 'Zoeken in ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Geen resultaten voor "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Zoek naar films en series op ${source}.',
+ 'explore.searchFailed' => 'Zoeken mislukt. Controleer je verbinding en probeer opnieuw.',
+ 'explore.status.airing' => 'Lopend',
+ 'explore.status.ended' => 'Afgelopen',
+ 'explore.status.canceled' => 'Geannuleerd',
+ 'explore.status.upcoming' => 'Binnenkort',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n, one: '${n} aflevering', other: '${n} afleveringen', ),
+ 'explore.cast' => 'Acteurs',
+ 'explore.characters' => 'Personages',
+ 'explore.addToWatchlist' => 'Toevoegen aan kijklijst',
+ 'explore.removeFromWatchlist' => 'Verwijderen uit kijklijst',
+ 'explore.watchlistUpdateFailed' => 'Kon kijklijst niet bijwerken',
+ 'explore.notInLibrary' => 'Niet in je bibliotheek',
+ 'explore.inTheseLibraries' => 'In deze bibliotheken',
+ 'explore.availableOn' => ({required Object server}) => 'Beschikbaar op ${server}',
+ 'explore.checkingLibrary' => 'Je bibliotheek controleren...',
+ 'explore.emptyTitle' => 'Hier is nog niets',
+ 'explore.emptyMessage' => ({required Object source}) => 'Rijen van ${source} verschijnen hier zodra ze inhoud hebben.',
'liveTv.title' => 'Live TV',
'liveTv.guide' => 'Gids',
'liveTv.noChannels' => 'Geen zenders beschikbaar',
@@ -2986,6 +3132,8 @@ extension on TranslationsNl {
'downloads.cancelledDownloadMessage' => 'Deze download is geannuleerd. Wat wil je doen?',
'downloads.allEpisodesAlreadyDownloaded' => 'Alle afleveringen zijn al gedownload',
'downloads.resumeDownload' => 'Download hervatten',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Geannuleerde download',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (${status} synchroniseren)',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} gedownload — klik om te voltooien',
@@ -3022,8 +3170,6 @@ extension on TranslationsNl {
'downloads.noSyncRules' => 'Geen synchronisatieregels',
'downloads.manageSyncRule' => 'Synchronisatie beheren',
'downloads.editEpisodeCount' => 'Aantal afleveringen',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Synchronisatiefilter',
'downloads.syncAllItems' => 'Alle items synchroniseren',
'downloads.syncUnwatchedItems' => 'Ongekeken items synchroniseren',
@@ -3272,39 +3418,70 @@ extension on TranslationsNl {
'trakt.scrobbleDescription' => 'Verstuur play-, pauze- en stopgebeurtenissen tijdens afspelen naar Trakt.',
'trakt.watchedSync' => 'Bekeken-status synchroniseren',
'trakt.watchedSyncDescription' => 'Wanneer je items als bekeken markeert in Plezy, worden ze ook op Trakt gemarkeerd.',
- 'trackers.title' => 'Trackers',
- 'trackers.hubSubtitle' => 'Synchroniseer kijkvoortgang met Trakt en andere diensten.',
- 'trackers.notConnected' => 'Niet verbonden',
- 'trackers.connectedAs' => ({required Object username}) => 'Verbonden als @${username}',
- 'trackers.scrobble' => 'Voortgang automatisch volgen',
- 'trackers.scrobbleDescription' => 'Werk je lijst bij wanneer je een aflevering of film afrondt.',
- 'trackers.disconnectConfirm' => ({required Object service}) => '${service} loskoppelen?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy stopt met ${service} bijwerken. Je kunt altijd opnieuw verbinden.',
- 'trackers.connectFailed' => ({required Object service}) => 'Kan niet verbinden met ${service}. Probeer opnieuw.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Plezy activeren op ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Ga naar ${url} en voer deze code in:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Open ${service} om te activeren',
- 'trackers.deviceCode.waitingForAuthorization' => 'Wachten op autorisatie…',
- 'trackers.deviceCode.codeCopied' => 'Code gekopieerd',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Aanmelden bij ${service}',
- 'trackers.oauthProxy.body' => 'Scan deze QR-code of open de URL op een apparaat.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => '${service} openen om aan te melden',
- 'trackers.oauthProxy.urlCopied' => 'URL gekopieerd',
- 'trackers.libraryFilter.title' => 'Bibliotheekfilter',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Alle bibliotheken synchroniseren',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Niets wordt gesynchroniseerd',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} geblokkeerd',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} toegestaan',
- 'trackers.libraryFilter.mode' => 'Filtermodus',
- 'trackers.libraryFilter.modeBlacklist' => 'Zwarte lijst',
- 'trackers.libraryFilter.modeWhitelist' => 'Witte lijst',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Synchroniseer alle bibliotheken behalve die hieronder aangevinkt zijn.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Synchroniseer alleen de hieronder aangevinkte bibliotheken.',
- 'trackers.libraryFilter.libraries' => 'Bibliotheken',
- 'trackers.libraryFilter.noLibraries' => 'Geen bibliotheken beschikbaar',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Verbinden met Seerr',
+ 'seerr.serverUrl' => 'Server-URL',
+ 'seerr.serverUrlHelper' => 'Het adres van je Seerr-instantie',
+ 'seerr.checkServer' => 'Doorgaan',
+ 'seerr.signInWithJellyfin' => 'Inloggen met Jellyfin',
+ 'seerr.signInWithEmby' => 'Inloggen met Emby',
+ 'seerr.signInWithLocal' => 'Een lokaal account gebruiken',
+ 'seerr.email' => 'E-mail',
+ 'seerr.noSignInMethods' => 'Deze Seerr-instantie biedt geen inlogmethode die Plezy ondersteunt.',
+ 'seerr.instance' => 'Instantie',
+ 'seerr.disconnectConfirm' => 'Seerr loskoppelen?',
+ 'seerr.disconnectConfirmBody' => 'Plezy vergeet deze Seerr-instantie. Je kunt altijd opnieuw verbinden.',
+ 'seerr.request' => 'Aanvragen',
+ 'seerr.request4k' => 'Aanvragen in 4K',
+ 'seerr.seasons' => 'Seizoenen',
+ 'seerr.allSeasons' => 'Alle seizoenen',
+ 'seerr.advancedOptions' => 'Geavanceerd',
+ 'seerr.destinationServer' => 'Doelserver',
+ 'seerr.qualityProfile' => 'Kwaliteitsprofiel',
+ 'seerr.rootFolder' => 'Hoofdmap',
+ 'seerr.languageProfile' => 'Taalprofiel',
+ 'seerr.requestSubmitted' => 'Aanvraag verzonden',
+ 'seerr.requestFailed' => ({required Object error}) => 'Aanvraag mislukt: ${error}',
+ 'seerr.requestsLoadFailed' => 'Kan aanvraagopties niet laden',
+ 'seerr.nothingToRequest' => 'Alles is al beschikbaar of aangevraagd.',
+ 'seerr.statusAvailable' => 'Beschikbaar',
+ 'seerr.statusPartiallyAvailable' => 'Gedeeltelijk beschikbaar',
+ 'seerr.statusRequested' => 'Aangevraagd',
+ 'seerr.statusProcessing' => 'Verwerken',
+ 'services.title' => 'Services',
+ 'services.hubSubtitle' => 'Synchroniseer kijkvoortgang en vraag nieuwe titels aan.',
+ 'services.notConnected' => 'Niet verbonden',
+ 'services.connectedAs' => ({required Object username}) => 'Verbonden als @${username}',
+ 'services.scrobble' => 'Voortgang automatisch volgen',
+ 'services.scrobbleDescription' => 'Werk je lijst bij wanneer je een aflevering of film afrondt.',
+ 'services.disconnectConfirm' => ({required Object service}) => '${service} loskoppelen?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy stopt met ${service} bijwerken. Je kunt altijd opnieuw verbinden.',
+ 'services.connectFailed' => ({required Object service}) => 'Kan niet verbinden met ${service}. Probeer opnieuw.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Plezy activeren op ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Ga naar ${url} en voer deze code in:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Open ${service} om te activeren',
+ 'services.deviceCode.waitingForAuthorization' => 'Wachten op autorisatie…',
+ 'services.deviceCode.codeCopied' => 'Code gekopieerd',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Aanmelden bij ${service}',
+ 'services.oauthProxy.body' => 'Scan deze QR-code of open de URL op een apparaat.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => '${service} openen om aan te melden',
+ 'services.oauthProxy.urlCopied' => 'URL gekopieerd',
+ 'services.libraryFilter.title' => 'Bibliotheekfilter',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Alle bibliotheken synchroniseren',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Niets wordt gesynchroniseerd',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} geblokkeerd',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} toegestaan',
+ 'services.libraryFilter.mode' => 'Filtermodus',
+ 'services.libraryFilter.modeBlacklist' => 'Zwarte lijst',
+ 'services.libraryFilter.modeWhitelist' => 'Witte lijst',
+ 'services.libraryFilter.modeHintBlacklist' => 'Synchroniseer alle bibliotheken behalve die hieronder aangevinkt zijn.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Synchroniseer alleen de hieronder aangevinkte bibliotheken.',
+ 'services.libraryFilter.libraries' => 'Bibliotheken',
+ 'services.libraryFilter.noLibraries' => 'Geen bibliotheken beschikbaar',
'addServer.addJellyfinTitle' => 'Jellyfin-server toevoegen',
'addServer.serverUrls' => 'Server-URL\'s',
'addServer.serverUrlsHelper' => 'Meerdere URL\'s toegestaan, gescheiden door komma\'s.',
diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart
index 91f3d4d9..06055c4d 100644
--- a/lib/i18n/strings_pl.g.dart
+++ b/lib/i18n/strings_pl.g.dart
@@ -69,6 +69,7 @@ class TranslationsPl extends Translations with BaseTranslations 'Pokaż, co oglądasz na Discordzie';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Synchronizuj historię oglądania z Trakt';
- @override String get trackers => 'Trackery';
- @override String get trackersDescription => 'Synchronizuj postęp z Trakt, MyAnimeList, AniList i Simkl';
+ @override String get services => 'Usługi';
+ @override String get servicesDescription => 'Połącz Trakt, MyAnimeList, Seerr i inne';
@override String get companionRemoteServer => 'Serwer zdalnego sterowania';
@override String get companionRemoteServerDescription => 'Pozwól urządzeniom mobilnym w sieci sterować tą aplikacją';
@override String get autoPip => 'Automatyczny obraz w obrazie';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetPl extends TranslationsRateSheetEn {
@override String get setScore => 'Ustaw ocenę';
@override String get saved => 'Zapisano';
@override String get notAvailable => 'Nie znaleziono dopasowania';
- @override String get noConnectedTrackers => 'Połącz tracker w Ustawieniach, aby tam oceniać.';
+ @override String get noConnectedServices => 'Połącz usługę w Ustawieniach, aby tam oceniać.';
}
// Path: accessibility
@@ -1063,6 +1065,41 @@ class _TranslationsNavigationPl extends TranslationsNavigationEn {
@override String get libraries => 'Biblioteki';
@override String get downloads => 'Pobrania';
@override String get liveTv => 'TV na żywo';
+ @override String get explore => 'Przeglądaj';
+}
+
+// Path: explore
+class _TranslationsExplorePl extends TranslationsExploreEn {
+ _TranslationsExplorePl._(TranslationsPl root) : this._root = root, super.internal(root);
+
+ final TranslationsPl _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Przeglądaj';
+ @override String get selectSource => 'Wybierz źródło';
+ @override late final _TranslationsExploreRowsPl rows = _TranslationsExploreRowsPl._(_root);
+ @override late final _TranslationsExploreStatusPl status = _TranslationsExploreStatusPl._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n,
+ one: '${n} odcinek',
+ few: '${n} odcinki',
+ many: '${n} odcinków',
+ other: '${n} odcinka',
+ );
+ @override String get cast => 'Obsada';
+ @override String get characters => 'Postacie';
+ @override String get addToWatchlist => 'Dodaj do listy do obejrzenia';
+ @override String get removeFromWatchlist => 'Usuń z listy do obejrzenia';
+ @override String get watchlistUpdateFailed => 'Nie udało się zaktualizować listy do obejrzenia';
+ @override String get notInLibrary => 'Nie ma tego w Twojej bibliotece';
+ @override String get inTheseLibraries => 'W tych bibliotekach';
+ @override String availableOn({required Object server}) => 'Dostępne na ${server}';
+ @override String get checkingLibrary => 'Sprawdzanie Twojej biblioteki...';
+ @override String get emptyTitle => 'Jeszcze nic tu nie ma';
+ @override String emptyMessage({required Object source}) => 'Wiersze z ${source} pojawią się tutaj, gdy będą zawierać treści.';
+ @override String searchHint({required Object source}) => 'Szukaj w ${source}';
+ @override String searchEmpty({required Object query}) => 'Brak wyników dla "${query}"';
+ @override String searchPrompt({required Object source}) => 'Szukaj filmów i seriali w ${source}.';
+ @override String get searchFailed => 'Wyszukiwanie nie powiodło się. Sprawdź połączenie i spróbuj ponownie.';
}
// Path: liveTv
@@ -1648,15 +1685,54 @@ class _TranslationsTraktPl extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Gdy oznaczysz pozycje jako obejrzane w Plezy, zostaną też oznaczone w Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersPl extends TranslationsTrackersEn {
- _TranslationsTrackersPl._(TranslationsPl root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrPl extends TranslationsSeerrEn {
+ _TranslationsSeerrPl._(TranslationsPl root) : this._root = root, super.internal(root);
final TranslationsPl _root; // ignore: unused_field
// Translations
- @override String get title => 'Trackery';
- @override String get hubSubtitle => 'Synchronizuj postęp oglądania z Trakt i innymi usługami.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Połącz Seerr';
+ @override String get serverUrl => 'Adres URL serwera';
+ @override String get serverUrlHelper => 'Adres Twojej instancji Seerr';
+ @override String get checkServer => 'Kontynuuj';
+ @override String get signInWithJellyfin => 'Zaloguj się przez Jellyfin';
+ @override String get signInWithEmby => 'Zaloguj się przez Emby';
+ @override String get signInWithLocal => 'Użyj konta lokalnego';
+ @override String get email => 'E-mail';
+ @override String get noSignInMethods => 'Ta instancja Seerr nie oferuje metody logowania obsługiwanej przez Plezy.';
+ @override String get instance => 'Instancja';
+ @override String get disconnectConfirm => 'Odłączyć Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy zapomni tę instancję Seerr. Połącz ponownie w dowolnym momencie.';
+ @override String get request => 'Zamów';
+ @override String get request4k => 'Zamów w 4K';
+ @override String get seasons => 'Sezony';
+ @override String get allSeasons => 'Wszystkie sezony';
+ @override String get advancedOptions => 'Zaawansowane';
+ @override String get destinationServer => 'Serwer docelowy';
+ @override String get qualityProfile => 'Profil jakości';
+ @override String get rootFolder => 'Folder główny';
+ @override String get languageProfile => 'Profil językowy';
+ @override String get requestSubmitted => 'Zamówienie wysłane';
+ @override String requestFailed({required Object error}) => 'Zamówienie nie powiodło się: ${error}';
+ @override String get requestsLoadFailed => 'Nie udało się wczytać opcji zamówienia';
+ @override String get nothingToRequest => 'Wszystko jest już dostępne lub zamówione.';
+ @override String get statusAvailable => 'Dostępne';
+ @override String get statusPartiallyAvailable => 'Częściowo dostępne';
+ @override String get statusRequested => 'Zamówione';
+ @override String get statusProcessing => 'Przetwarzanie';
+}
+
+// Path: services
+class _TranslationsServicesPl extends TranslationsServicesEn {
+ _TranslationsServicesPl._(TranslationsPl root) : this._root = root, super.internal(root);
+
+ final TranslationsPl _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Usługi';
+ @override String get hubSubtitle => 'Synchronizuj postęp oglądania i zamawiaj nowe tytuły.';
@override String get notConnected => 'Nie połączono';
@override String connectedAs({required Object username}) => 'Połączono jako @${username}';
@override String get scrobble => 'Automatycznie śledź postęp';
@@ -1664,10 +1740,10 @@ class _TranslationsTrackersPl extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Odłączyć ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy przestanie aktualizować ${service}. Połącz ponownie w dowolnym momencie.';
@override String connectFailed({required Object service}) => 'Nie udało się połączyć z ${service}. Spróbuj ponownie.';
- @override late final _TranslationsTrackersServicesPl services = _TranslationsTrackersServicesPl._(_root);
- @override late final _TranslationsTrackersDeviceCodePl deviceCode = _TranslationsTrackersDeviceCodePl._(_root);
- @override late final _TranslationsTrackersOauthProxyPl oauthProxy = _TranslationsTrackersOauthProxyPl._(_root);
- @override late final _TranslationsTrackersLibraryFilterPl libraryFilter = _TranslationsTrackersLibraryFilterPl._(_root);
+ @override late final _TranslationsServicesNamesPl names = _TranslationsServicesNamesPl._(_root);
+ @override late final _TranslationsServicesDeviceCodePl deviceCode = _TranslationsServicesDeviceCodePl._(_root);
+ @override late final _TranslationsServicesOauthProxyPl oauthProxy = _TranslationsServicesOauthProxyPl._(_root);
+ @override late final _TranslationsServicesLibraryFilterPl libraryFilter = _TranslationsServicesLibraryFilterPl._(_root);
}
// Path: addServer
@@ -1834,6 +1910,41 @@ class _TranslationsLibrariesSortLabelsPl extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Data dodania ostatniego odcinka';
}
+// Path: explore.rows
+class _TranslationsExploreRowsPl extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsPl._(TranslationsPl root) : this._root = root, super.internal(root);
+
+ final TranslationsPl _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Lista do obejrzenia';
+ @override String get recommendedMovies => 'Rekomendowane filmy';
+ @override String get recommendedShows => 'Rekomendowane seriale';
+ @override String get trendingMovies => 'Filmy na czasie';
+ @override String get trendingShows => 'Seriale na czasie';
+ @override String get popularMovies => 'Popularne filmy';
+ @override String get popularShows => 'Popularne seriale';
+ @override String get suggestedAnime => 'Sugerowane anime';
+ @override String get airingAnime => 'Najlepsze emitowane anime';
+ @override String get popularAnime => 'Najpopularniejsze anime';
+ @override String get trending => 'Na czasie';
+ @override String get upcomingMovies => 'Nadchodzące filmy';
+ @override String get upcomingShows => 'Nadchodzące seriale';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusPl extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusPl._(TranslationsPl root) : this._root = root, super.internal(root);
+
+ final TranslationsPl _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'W emisji';
+ @override String get ended => 'Zakończony';
+ @override String get canceled => 'Anulowany';
+ @override String get upcoming => 'Nadchodzący';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionPl extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionPl._(TranslationsPl root) : this._root = root, super.internal(root);
@@ -1930,9 +2041,9 @@ class _TranslationsCompanionRemoteErrorsPl extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Połączenie utracone';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesPl extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesPl._(TranslationsPl root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesPl extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesPl._(TranslationsPl root) : this._root = root, super.internal(root);
final TranslationsPl _root; // ignore: unused_field
@@ -1940,11 +2051,12 @@ class _TranslationsTrackersServicesPl extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodePl extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodePl._(TranslationsPl root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodePl extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodePl._(TranslationsPl root) : this._root = root, super.internal(root);
final TranslationsPl _root; // ignore: unused_field
@@ -1956,9 +2068,9 @@ class _TranslationsTrackersDeviceCodePl extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Kod skopiowany';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyPl extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyPl._(TranslationsPl root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyPl extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyPl._(TranslationsPl root) : this._root = root, super.internal(root);
final TranslationsPl _root; // ignore: unused_field
@@ -1969,9 +2081,9 @@ class _TranslationsTrackersOauthProxyPl extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL skopiowany';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterPl extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterPl._(TranslationsPl root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterPl extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterPl._(TranslationsPl root) : this._root = root, super.internal(root);
final TranslationsPl _root; // ignore: unused_field
@@ -2235,8 +2347,8 @@ extension on TranslationsPl {
'settings.discordRichPresenceDescription' => 'Pokaż, co oglądasz na Discordzie',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Synchronizuj historię oglądania z Trakt',
- 'settings.trackers' => 'Trackery',
- 'settings.trackersDescription' => 'Synchronizuj postęp z Trakt, MyAnimeList, AniList i Simkl',
+ 'settings.services' => 'Usługi',
+ 'settings.servicesDescription' => 'Połącz Trakt, MyAnimeList, Seerr i inne',
'settings.companionRemoteServer' => 'Serwer zdalnego sterowania',
'settings.companionRemoteServerDescription' => 'Pozwól urządzeniom mobilnym w sieci sterować tą aplikacją',
'settings.autoPip' => 'Automatyczny obraz w obrazie',
@@ -2392,7 +2504,7 @@ extension on TranslationsPl {
'rateSheet.setScore' => 'Ustaw ocenę',
'rateSheet.saved' => 'Zapisano',
'rateSheet.notAvailable' => 'Nie znaleziono dopasowania',
- 'rateSheet.noConnectedTrackers' => 'Połącz tracker w Ustawieniach, aby tam oceniać.',
+ 'rateSheet.noConnectedServices' => 'Połącz usługę w Ustawieniach, aby tam oceniać.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, serial TV',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2773,6 +2885,42 @@ extension on TranslationsPl {
'navigation.libraries' => 'Biblioteki',
'navigation.downloads' => 'Pobrania',
'navigation.liveTv' => 'TV na żywo',
+ 'navigation.explore' => 'Przeglądaj',
+ 'explore.title' => 'Przeglądaj',
+ 'explore.selectSource' => 'Wybierz źródło',
+ 'explore.rows.watchlist' => 'Lista do obejrzenia',
+ 'explore.rows.recommendedMovies' => 'Rekomendowane filmy',
+ 'explore.rows.recommendedShows' => 'Rekomendowane seriale',
+ 'explore.rows.trendingMovies' => 'Filmy na czasie',
+ 'explore.rows.trendingShows' => 'Seriale na czasie',
+ 'explore.rows.popularMovies' => 'Popularne filmy',
+ 'explore.rows.popularShows' => 'Popularne seriale',
+ 'explore.rows.suggestedAnime' => 'Sugerowane anime',
+ 'explore.rows.airingAnime' => 'Najlepsze emitowane anime',
+ 'explore.rows.popularAnime' => 'Najpopularniejsze anime',
+ 'explore.rows.trending' => 'Na czasie',
+ 'explore.rows.upcomingMovies' => 'Nadchodzące filmy',
+ 'explore.rows.upcomingShows' => 'Nadchodzące seriale',
+ 'explore.status.airing' => 'W emisji',
+ 'explore.status.ended' => 'Zakończony',
+ 'explore.status.canceled' => 'Anulowany',
+ 'explore.status.upcoming' => 'Nadchodzący',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n, one: '${n} odcinek', few: '${n} odcinki', many: '${n} odcinków', other: '${n} odcinka', ),
+ 'explore.cast' => 'Obsada',
+ 'explore.characters' => 'Postacie',
+ 'explore.addToWatchlist' => 'Dodaj do listy do obejrzenia',
+ 'explore.removeFromWatchlist' => 'Usuń z listy do obejrzenia',
+ 'explore.watchlistUpdateFailed' => 'Nie udało się zaktualizować listy do obejrzenia',
+ 'explore.notInLibrary' => 'Nie ma tego w Twojej bibliotece',
+ 'explore.inTheseLibraries' => 'W tych bibliotekach',
+ 'explore.availableOn' => ({required Object server}) => 'Dostępne na ${server}',
+ 'explore.checkingLibrary' => 'Sprawdzanie Twojej biblioteki...',
+ 'explore.emptyTitle' => 'Jeszcze nic tu nie ma',
+ 'explore.emptyMessage' => ({required Object source}) => 'Wiersze z ${source} pojawią się tutaj, gdy będą zawierać treści.',
+ 'explore.searchHint' => ({required Object source}) => 'Szukaj w ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Brak wyników dla "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Szukaj filmów i seriali w ${source}.',
+ 'explore.searchFailed' => 'Wyszukiwanie nie powiodło się. Sprawdź połączenie i spróbuj ponownie.',
'liveTv.title' => 'TV na żywo',
'liveTv.guide' => 'Przewodnik',
'liveTv.noChannels' => 'Brak dostępnych kanałów',
@@ -2988,6 +3136,8 @@ extension on TranslationsPl {
'downloads.cancelledDownloadMessage' => 'To pobieranie zostało anulowane. Co chcesz zrobić?',
'downloads.allEpisodesAlreadyDownloaded' => 'Wszystkie odcinki są już pobrane',
'downloads.resumeDownload' => 'Wznów pobieranie',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Anulowane pobieranie',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synchronizowanie ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => 'Pobrano ${file} — kliknij, aby dokończyć',
@@ -3024,8 +3174,6 @@ extension on TranslationsPl {
'downloads.noSyncRules' => 'Brak reguł synchronizacji',
'downloads.manageSyncRule' => 'Zarządzaj synchronizacją',
'downloads.editEpisodeCount' => 'Liczba odcinków',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Filtr synchronizacji',
'downloads.syncAllItems' => 'Synchronizuję wszystkie elementy',
'downloads.syncUnwatchedItems' => 'Synchronizuję nieobejrzane elementy',
@@ -3274,39 +3422,70 @@ extension on TranslationsPl {
'trakt.scrobbleDescription' => 'Wysyłaj zdarzenia odtwarzania, pauzy i zatrzymania do Trakt podczas odtwarzania.',
'trakt.watchedSync' => 'Synchronizuj status obejrzane',
'trakt.watchedSyncDescription' => 'Gdy oznaczysz pozycje jako obejrzane w Plezy, zostaną też oznaczone w Trakt.',
- 'trackers.title' => 'Trackery',
- 'trackers.hubSubtitle' => 'Synchronizuj postęp oglądania z Trakt i innymi usługami.',
- 'trackers.notConnected' => 'Nie połączono',
- 'trackers.connectedAs' => ({required Object username}) => 'Połączono jako @${username}',
- 'trackers.scrobble' => 'Automatycznie śledź postęp',
- 'trackers.scrobbleDescription' => 'Aktualizuj swoją listę po ukończeniu odcinka lub filmu.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Odłączyć ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy przestanie aktualizować ${service}. Połącz ponownie w dowolnym momencie.',
- 'trackers.connectFailed' => ({required Object service}) => 'Nie udało się połączyć z ${service}. Spróbuj ponownie.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Aktywuj Plezy w ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Odwiedź ${url} i wpisz ten kod:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Otwórz ${service}, aby aktywować',
- 'trackers.deviceCode.waitingForAuthorization' => 'Oczekiwanie na autoryzację…',
- 'trackers.deviceCode.codeCopied' => 'Kod skopiowany',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Zaloguj się do ${service}',
- 'trackers.oauthProxy.body' => 'Zeskanuj ten kod QR lub otwórz URL na dowolnym urządzeniu.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Otwórz ${service}, aby się zalogować',
- 'trackers.oauthProxy.urlCopied' => 'URL skopiowany',
- 'trackers.libraryFilter.title' => 'Filtr bibliotek',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Synchronizowanie wszystkich bibliotek',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Nic nie synchronizuje',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} zablokowanych',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} dozwolonych',
- 'trackers.libraryFilter.mode' => 'Tryb filtra',
- 'trackers.libraryFilter.modeBlacklist' => 'Czarna lista',
- 'trackers.libraryFilter.modeWhitelist' => 'Biała lista',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Synchronizuj wszystkie biblioteki oprócz zaznaczonych poniżej.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Synchronizuj tylko biblioteki zaznaczone poniżej.',
- 'trackers.libraryFilter.libraries' => 'Biblioteki',
- 'trackers.libraryFilter.noLibraries' => 'Brak dostępnych bibliotek',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Połącz Seerr',
+ 'seerr.serverUrl' => 'Adres URL serwera',
+ 'seerr.serverUrlHelper' => 'Adres Twojej instancji Seerr',
+ 'seerr.checkServer' => 'Kontynuuj',
+ 'seerr.signInWithJellyfin' => 'Zaloguj się przez Jellyfin',
+ 'seerr.signInWithEmby' => 'Zaloguj się przez Emby',
+ 'seerr.signInWithLocal' => 'Użyj konta lokalnego',
+ 'seerr.email' => 'E-mail',
+ 'seerr.noSignInMethods' => 'Ta instancja Seerr nie oferuje metody logowania obsługiwanej przez Plezy.',
+ 'seerr.instance' => 'Instancja',
+ 'seerr.disconnectConfirm' => 'Odłączyć Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy zapomni tę instancję Seerr. Połącz ponownie w dowolnym momencie.',
+ 'seerr.request' => 'Zamów',
+ 'seerr.request4k' => 'Zamów w 4K',
+ 'seerr.seasons' => 'Sezony',
+ 'seerr.allSeasons' => 'Wszystkie sezony',
+ 'seerr.advancedOptions' => 'Zaawansowane',
+ 'seerr.destinationServer' => 'Serwer docelowy',
+ 'seerr.qualityProfile' => 'Profil jakości',
+ 'seerr.rootFolder' => 'Folder główny',
+ 'seerr.languageProfile' => 'Profil językowy',
+ 'seerr.requestSubmitted' => 'Zamówienie wysłane',
+ 'seerr.requestFailed' => ({required Object error}) => 'Zamówienie nie powiodło się: ${error}',
+ 'seerr.requestsLoadFailed' => 'Nie udało się wczytać opcji zamówienia',
+ 'seerr.nothingToRequest' => 'Wszystko jest już dostępne lub zamówione.',
+ 'seerr.statusAvailable' => 'Dostępne',
+ 'seerr.statusPartiallyAvailable' => 'Częściowo dostępne',
+ 'seerr.statusRequested' => 'Zamówione',
+ 'seerr.statusProcessing' => 'Przetwarzanie',
+ 'services.title' => 'Usługi',
+ 'services.hubSubtitle' => 'Synchronizuj postęp oglądania i zamawiaj nowe tytuły.',
+ 'services.notConnected' => 'Nie połączono',
+ 'services.connectedAs' => ({required Object username}) => 'Połączono jako @${username}',
+ 'services.scrobble' => 'Automatycznie śledź postęp',
+ 'services.scrobbleDescription' => 'Aktualizuj swoją listę po ukończeniu odcinka lub filmu.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Odłączyć ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy przestanie aktualizować ${service}. Połącz ponownie w dowolnym momencie.',
+ 'services.connectFailed' => ({required Object service}) => 'Nie udało się połączyć z ${service}. Spróbuj ponownie.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Aktywuj Plezy w ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Odwiedź ${url} i wpisz ten kod:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Otwórz ${service}, aby aktywować',
+ 'services.deviceCode.waitingForAuthorization' => 'Oczekiwanie na autoryzację…',
+ 'services.deviceCode.codeCopied' => 'Kod skopiowany',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Zaloguj się do ${service}',
+ 'services.oauthProxy.body' => 'Zeskanuj ten kod QR lub otwórz URL na dowolnym urządzeniu.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Otwórz ${service}, aby się zalogować',
+ 'services.oauthProxy.urlCopied' => 'URL skopiowany',
+ 'services.libraryFilter.title' => 'Filtr bibliotek',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Synchronizowanie wszystkich bibliotek',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Nic nie synchronizuje',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} zablokowanych',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} dozwolonych',
+ 'services.libraryFilter.mode' => 'Tryb filtra',
+ 'services.libraryFilter.modeBlacklist' => 'Czarna lista',
+ 'services.libraryFilter.modeWhitelist' => 'Biała lista',
+ 'services.libraryFilter.modeHintBlacklist' => 'Synchronizuj wszystkie biblioteki oprócz zaznaczonych poniżej.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Synchronizuj tylko biblioteki zaznaczone poniżej.',
+ 'services.libraryFilter.libraries' => 'Biblioteki',
+ 'services.libraryFilter.noLibraries' => 'Brak dostępnych bibliotek',
'addServer.addJellyfinTitle' => 'Dodaj serwer Jellyfin',
'addServer.serverUrls' => 'URL-e serwera',
'addServer.serverUrlsHelper' => 'Można podać wiele adresów URL, rozdzielonych przecinkami.',
diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart
index e9b1b2a9..1d65c80a 100644
--- a/lib/i18n/strings_pt.g.dart
+++ b/lib/i18n/strings_pt.g.dart
@@ -69,6 +69,7 @@ class TranslationsPt extends Translations with BaseTranslations 'Mostrar o que você está assistindo no Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Sincronizar histórico de exibição com Trakt';
- @override String get trackers => 'Rastreadores';
- @override String get trackersDescription => 'Sincronizar progresso com Trakt, MyAnimeList, AniList e Simkl';
+ @override String get services => 'Serviços';
+ @override String get servicesDescription => 'Conecte Trakt, MyAnimeList, Seerr e mais';
@override String get companionRemoteServer => 'Servidor de controlo remoto';
@override String get companionRemoteServerDescription => 'Permitir que dispositivos móveis na sua rede controlem esta aplicação';
@override String get autoPip => 'Picture-in-Picture Automático';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetPt extends TranslationsRateSheetEn {
@override String get setScore => 'Definir pontuação';
@override String get saved => 'Salvo';
@override String get notAvailable => 'Nenhuma correspondência encontrada';
- @override String get noConnectedTrackers => 'Conecte um rastreador em Configurações para avaliar lá.';
+ @override String get noConnectedServices => 'Conecte um serviço nas Configurações para avaliar por lá.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationPt extends TranslationsNavigationEn {
@override String get libraries => 'Bibliotecas';
@override String get downloads => 'Downloads';
@override String get liveTv => 'TV ao Vivo';
+ @override String get explore => 'Explorar';
+}
+
+// Path: explore
+class _TranslationsExplorePt extends TranslationsExploreEn {
+ _TranslationsExplorePt._(TranslationsPt root) : this._root = root, super.internal(root);
+
+ final TranslationsPt _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Explorar';
+ @override String get selectSource => 'Selecionar fonte';
+ @override late final _TranslationsExploreRowsPt rows = _TranslationsExploreRowsPt._(_root);
+ @override late final _TranslationsExploreStatusPt status = _TranslationsExploreStatusPt._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n,
+ one: '${n} episódio',
+ other: '${n} episódios',
+ );
+ @override String get cast => 'Elenco';
+ @override String get characters => 'Personagens';
+ @override String get addToWatchlist => 'Adicionar à lista para ver';
+ @override String get removeFromWatchlist => 'Remover da lista para ver';
+ @override String get watchlistUpdateFailed => 'Não foi possível atualizar a lista para ver';
+ @override String get notInLibrary => 'Não está na sua biblioteca';
+ @override String get inTheseLibraries => 'Nestas bibliotecas';
+ @override String availableOn({required Object server}) => 'Disponível em ${server}';
+ @override String get checkingLibrary => 'Verificando a sua biblioteca...';
+ @override String get emptyTitle => 'Ainda não há nada aqui';
+ @override String emptyMessage({required Object source}) => 'As linhas de ${source} aparecerão aqui quando tiverem conteúdo.';
+ @override String searchHint({required Object source}) => 'Buscar em ${source}';
+ @override String searchEmpty({required Object query}) => 'Nenhum resultado para "${query}"';
+ @override String searchPrompt({required Object source}) => 'Busque filmes e séries em ${source}.';
+ @override String get searchFailed => 'Falha na busca. Verifique sua conexão e tente novamente.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktPt extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Ao marcar itens como assistidos no Plezy, eles também serão marcados no Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersPt extends TranslationsTrackersEn {
- _TranslationsTrackersPt._(TranslationsPt root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrPt extends TranslationsSeerrEn {
+ _TranslationsSeerrPt._(TranslationsPt root) : this._root = root, super.internal(root);
final TranslationsPt _root; // ignore: unused_field
// Translations
- @override String get title => 'Rastreadores';
- @override String get hubSubtitle => 'Sincronize o progresso assistido com Trakt e outros serviços.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Conectar Seerr';
+ @override String get serverUrl => 'URL do servidor';
+ @override String get serverUrlHelper => 'O endereço da sua instância do Seerr';
+ @override String get checkServer => 'Continuar';
+ @override String get signInWithJellyfin => 'Entrar com Jellyfin';
+ @override String get signInWithEmby => 'Entrar com Emby';
+ @override String get signInWithLocal => 'Usar uma conta local';
+ @override String get email => 'E-mail';
+ @override String get noSignInMethods => 'Esta instância do Seerr não oferece nenhum método de login compatível com o Plezy.';
+ @override String get instance => 'Instância';
+ @override String get disconnectConfirm => 'Desconectar Seerr?';
+ @override String get disconnectConfirmBody => 'O Plezy esquecerá esta instância do Seerr. Reconecte quando quiser.';
+ @override String get request => 'Solicitar';
+ @override String get request4k => 'Solicitar em 4K';
+ @override String get seasons => 'Temporadas';
+ @override String get allSeasons => 'Todas as temporadas';
+ @override String get advancedOptions => 'Avançado';
+ @override String get destinationServer => 'Servidor de destino';
+ @override String get qualityProfile => 'Perfil de qualidade';
+ @override String get rootFolder => 'Pasta raiz';
+ @override String get languageProfile => 'Perfil de idioma';
+ @override String get requestSubmitted => 'Solicitação enviada';
+ @override String requestFailed({required Object error}) => 'Falha na solicitação: ${error}';
+ @override String get requestsLoadFailed => 'Não foi possível carregar as opções de solicitação';
+ @override String get nothingToRequest => 'Tudo já está disponível ou solicitado.';
+ @override String get statusAvailable => 'Disponível';
+ @override String get statusPartiallyAvailable => 'Parcialmente disponível';
+ @override String get statusRequested => 'Solicitado';
+ @override String get statusProcessing => 'Processando';
+}
+
+// Path: services
+class _TranslationsServicesPt extends TranslationsServicesEn {
+ _TranslationsServicesPt._(TranslationsPt root) : this._root = root, super.internal(root);
+
+ final TranslationsPt _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Serviços';
+ @override String get hubSubtitle => 'Sincronize o progresso de exibição e solicite novos títulos.';
@override String get notConnected => 'Não conectado';
@override String connectedAs({required Object username}) => 'Conectado como @${username}';
@override String get scrobble => 'Registrar progresso automaticamente';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersPt extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Desconectar ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy deixará de atualizar ${service}. Reconecte quando quiser.';
@override String connectFailed({required Object service}) => 'Não foi possível conectar ao ${service}. Tente novamente.';
- @override late final _TranslationsTrackersServicesPt services = _TranslationsTrackersServicesPt._(_root);
- @override late final _TranslationsTrackersDeviceCodePt deviceCode = _TranslationsTrackersDeviceCodePt._(_root);
- @override late final _TranslationsTrackersOauthProxyPt oauthProxy = _TranslationsTrackersOauthProxyPt._(_root);
- @override late final _TranslationsTrackersLibraryFilterPt libraryFilter = _TranslationsTrackersLibraryFilterPt._(_root);
+ @override late final _TranslationsServicesNamesPt names = _TranslationsServicesNamesPt._(_root);
+ @override late final _TranslationsServicesDeviceCodePt deviceCode = _TranslationsServicesDeviceCodePt._(_root);
+ @override late final _TranslationsServicesOauthProxyPt oauthProxy = _TranslationsServicesOauthProxyPt._(_root);
+ @override late final _TranslationsServicesLibraryFilterPt libraryFilter = _TranslationsServicesLibraryFilterPt._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsPt extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Data de adição do último episódio';
}
+// Path: explore.rows
+class _TranslationsExploreRowsPt extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsPt._(TranslationsPt root) : this._root = root, super.internal(root);
+
+ final TranslationsPt _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Lista para ver';
+ @override String get recommendedMovies => 'Filmes recomendados';
+ @override String get recommendedShows => 'Séries recomendadas';
+ @override String get trendingMovies => 'Filmes em alta';
+ @override String get trendingShows => 'Séries em alta';
+ @override String get popularMovies => 'Filmes populares';
+ @override String get popularShows => 'Séries populares';
+ @override String get suggestedAnime => 'Anime sugerido';
+ @override String get airingAnime => 'Melhor anime em exibição';
+ @override String get popularAnime => 'Anime mais popular';
+ @override String get trending => 'Em alta';
+ @override String get upcomingMovies => 'Próximos filmes';
+ @override String get upcomingShows => 'Próximas séries';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusPt extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusPt._(TranslationsPt root) : this._root = root, super.internal(root);
+
+ final TranslationsPt _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Em exibição';
+ @override String get ended => 'Finalizada';
+ @override String get canceled => 'Cancelada';
+ @override String get upcoming => 'Em breve';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionPt extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionPt._(TranslationsPt root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsPt extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Conexão perdida';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesPt extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesPt._(TranslationsPt root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesPt extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesPt._(TranslationsPt root) : this._root = root, super.internal(root);
final TranslationsPt _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesPt extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodePt extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodePt._(TranslationsPt root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodePt extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodePt._(TranslationsPt root) : this._root = root, super.internal(root);
final TranslationsPt _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodePt extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Código copiado';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyPt extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyPt._(TranslationsPt root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyPt extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyPt._(TranslationsPt root) : this._root = root, super.internal(root);
final TranslationsPt _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxyPt extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL copiado';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterPt extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterPt._(TranslationsPt root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterPt extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterPt._(TranslationsPt root) : this._root = root, super.internal(root);
final TranslationsPt _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsPt {
'settings.discordRichPresenceDescription' => 'Mostrar o que você está assistindo no Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Sincronizar histórico de exibição com Trakt',
- 'settings.trackers' => 'Rastreadores',
- 'settings.trackersDescription' => 'Sincronizar progresso com Trakt, MyAnimeList, AniList e Simkl',
+ 'settings.services' => 'Serviços',
+ 'settings.servicesDescription' => 'Conecte Trakt, MyAnimeList, Seerr e mais',
'settings.companionRemoteServer' => 'Servidor de controlo remoto',
'settings.companionRemoteServerDescription' => 'Permitir que dispositivos móveis na sua rede controlem esta aplicação',
'settings.autoPip' => 'Picture-in-Picture Automático',
@@ -2390,7 +2500,7 @@ extension on TranslationsPt {
'rateSheet.setScore' => 'Definir pontuação',
'rateSheet.saved' => 'Salvo',
'rateSheet.notAvailable' => 'Nenhuma correspondência encontrada',
- 'rateSheet.noConnectedTrackers' => 'Conecte um rastreador em Configurações para avaliar lá.',
+ 'rateSheet.noConnectedServices' => 'Conecte um serviço nas Configurações para avaliar por lá.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, filme',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, série de TV',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsPt {
'navigation.libraries' => 'Bibliotecas',
'navigation.downloads' => 'Downloads',
'navigation.liveTv' => 'TV ao Vivo',
+ 'navigation.explore' => 'Explorar',
+ 'explore.title' => 'Explorar',
+ 'explore.selectSource' => 'Selecionar fonte',
+ 'explore.rows.watchlist' => 'Lista para ver',
+ 'explore.rows.recommendedMovies' => 'Filmes recomendados',
+ 'explore.rows.recommendedShows' => 'Séries recomendadas',
+ 'explore.rows.trendingMovies' => 'Filmes em alta',
+ 'explore.rows.trendingShows' => 'Séries em alta',
+ 'explore.rows.popularMovies' => 'Filmes populares',
+ 'explore.rows.popularShows' => 'Séries populares',
+ 'explore.rows.suggestedAnime' => 'Anime sugerido',
+ 'explore.rows.airingAnime' => 'Melhor anime em exibição',
+ 'explore.rows.popularAnime' => 'Anime mais popular',
+ 'explore.rows.trending' => 'Em alta',
+ 'explore.rows.upcomingMovies' => 'Próximos filmes',
+ 'explore.rows.upcomingShows' => 'Próximas séries',
+ 'explore.status.airing' => 'Em exibição',
+ 'explore.status.ended' => 'Finalizada',
+ 'explore.status.canceled' => 'Cancelada',
+ 'explore.status.upcoming' => 'Em breve',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n, one: '${n} episódio', other: '${n} episódios', ),
+ 'explore.cast' => 'Elenco',
+ 'explore.characters' => 'Personagens',
+ 'explore.addToWatchlist' => 'Adicionar à lista para ver',
+ 'explore.removeFromWatchlist' => 'Remover da lista para ver',
+ 'explore.watchlistUpdateFailed' => 'Não foi possível atualizar a lista para ver',
+ 'explore.notInLibrary' => 'Não está na sua biblioteca',
+ 'explore.inTheseLibraries' => 'Nestas bibliotecas',
+ 'explore.availableOn' => ({required Object server}) => 'Disponível em ${server}',
+ 'explore.checkingLibrary' => 'Verificando a sua biblioteca...',
+ 'explore.emptyTitle' => 'Ainda não há nada aqui',
+ 'explore.emptyMessage' => ({required Object source}) => 'As linhas de ${source} aparecerão aqui quando tiverem conteúdo.',
+ 'explore.searchHint' => ({required Object source}) => 'Buscar em ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Nenhum resultado para "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Busque filmes e séries em ${source}.',
+ 'explore.searchFailed' => 'Falha na busca. Verifique sua conexão e tente novamente.',
'liveTv.title' => 'TV ao Vivo',
'liveTv.guide' => 'Guia',
'liveTv.noChannels' => 'Nenhum canal disponível',
@@ -2986,6 +3132,8 @@ extension on TranslationsPt {
'downloads.cancelledDownloadMessage' => 'Este download foi cancelado. O que você deseja fazer?',
'downloads.allEpisodesAlreadyDownloaded' => 'Todos os episódios já foram baixados',
'downloads.resumeDownload' => 'Retomar download',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Download cancelado',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (sincronizando ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} baixado — clique para concluir',
@@ -3022,8 +3170,6 @@ extension on TranslationsPt {
'downloads.noSyncRules' => 'Nenhuma regra de sincronização',
'downloads.manageSyncRule' => 'Gerenciar sincronização',
'downloads.editEpisodeCount' => 'Número de episódios',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Filtro de sincronização',
'downloads.syncAllItems' => 'Sincronizando todos os itens',
'downloads.syncUnwatchedItems' => 'Sincronizando itens não vistos',
@@ -3272,39 +3418,70 @@ extension on TranslationsPt {
'trakt.scrobbleDescription' => 'Envia eventos de reprodução, pausa e parada ao Trakt durante a exibição.',
'trakt.watchedSync' => 'Sincronizar status de assistido',
'trakt.watchedSyncDescription' => 'Ao marcar itens como assistidos no Plezy, eles também serão marcados no Trakt.',
- 'trackers.title' => 'Rastreadores',
- 'trackers.hubSubtitle' => 'Sincronize o progresso assistido com Trakt e outros serviços.',
- 'trackers.notConnected' => 'Não conectado',
- 'trackers.connectedAs' => ({required Object username}) => 'Conectado como @${username}',
- 'trackers.scrobble' => 'Registrar progresso automaticamente',
- 'trackers.scrobbleDescription' => 'Atualiza sua lista quando você termina um episódio ou filme.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Desconectar ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy deixará de atualizar ${service}. Reconecte quando quiser.',
- 'trackers.connectFailed' => ({required Object service}) => 'Não foi possível conectar ao ${service}. Tente novamente.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Ativar Plezy no ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Acesse ${url} e insira este código:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Abrir ${service} para ativar',
- 'trackers.deviceCode.waitingForAuthorization' => 'Aguardando autorização…',
- 'trackers.deviceCode.codeCopied' => 'Código copiado',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Entrar no ${service}',
- 'trackers.oauthProxy.body' => 'Escaneie este código QR ou abra a URL em qualquer dispositivo.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Abrir ${service} para entrar',
- 'trackers.oauthProxy.urlCopied' => 'URL copiado',
- 'trackers.libraryFilter.title' => 'Filtro de bibliotecas',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Sincronizando todas as bibliotecas',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Nada a sincronizar',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloqueadas',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} permitidas',
- 'trackers.libraryFilter.mode' => 'Modo de filtro',
- 'trackers.libraryFilter.modeBlacklist' => 'Lista negra',
- 'trackers.libraryFilter.modeWhitelist' => 'Lista branca',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Sincronizar todas as bibliotecas exceto as marcadas abaixo.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Sincronizar apenas as bibliotecas marcadas abaixo.',
- 'trackers.libraryFilter.libraries' => 'Bibliotecas',
- 'trackers.libraryFilter.noLibraries' => 'Nenhuma biblioteca disponível',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Conectar Seerr',
+ 'seerr.serverUrl' => 'URL do servidor',
+ 'seerr.serverUrlHelper' => 'O endereço da sua instância do Seerr',
+ 'seerr.checkServer' => 'Continuar',
+ 'seerr.signInWithJellyfin' => 'Entrar com Jellyfin',
+ 'seerr.signInWithEmby' => 'Entrar com Emby',
+ 'seerr.signInWithLocal' => 'Usar uma conta local',
+ 'seerr.email' => 'E-mail',
+ 'seerr.noSignInMethods' => 'Esta instância do Seerr não oferece nenhum método de login compatível com o Plezy.',
+ 'seerr.instance' => 'Instância',
+ 'seerr.disconnectConfirm' => 'Desconectar Seerr?',
+ 'seerr.disconnectConfirmBody' => 'O Plezy esquecerá esta instância do Seerr. Reconecte quando quiser.',
+ 'seerr.request' => 'Solicitar',
+ 'seerr.request4k' => 'Solicitar em 4K',
+ 'seerr.seasons' => 'Temporadas',
+ 'seerr.allSeasons' => 'Todas as temporadas',
+ 'seerr.advancedOptions' => 'Avançado',
+ 'seerr.destinationServer' => 'Servidor de destino',
+ 'seerr.qualityProfile' => 'Perfil de qualidade',
+ 'seerr.rootFolder' => 'Pasta raiz',
+ 'seerr.languageProfile' => 'Perfil de idioma',
+ 'seerr.requestSubmitted' => 'Solicitação enviada',
+ 'seerr.requestFailed' => ({required Object error}) => 'Falha na solicitação: ${error}',
+ 'seerr.requestsLoadFailed' => 'Não foi possível carregar as opções de solicitação',
+ 'seerr.nothingToRequest' => 'Tudo já está disponível ou solicitado.',
+ 'seerr.statusAvailable' => 'Disponível',
+ 'seerr.statusPartiallyAvailable' => 'Parcialmente disponível',
+ 'seerr.statusRequested' => 'Solicitado',
+ 'seerr.statusProcessing' => 'Processando',
+ 'services.title' => 'Serviços',
+ 'services.hubSubtitle' => 'Sincronize o progresso de exibição e solicite novos títulos.',
+ 'services.notConnected' => 'Não conectado',
+ 'services.connectedAs' => ({required Object username}) => 'Conectado como @${username}',
+ 'services.scrobble' => 'Registrar progresso automaticamente',
+ 'services.scrobbleDescription' => 'Atualiza sua lista quando você termina um episódio ou filme.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Desconectar ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy deixará de atualizar ${service}. Reconecte quando quiser.',
+ 'services.connectFailed' => ({required Object service}) => 'Não foi possível conectar ao ${service}. Tente novamente.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Ativar Plezy no ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Acesse ${url} e insira este código:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Abrir ${service} para ativar',
+ 'services.deviceCode.waitingForAuthorization' => 'Aguardando autorização…',
+ 'services.deviceCode.codeCopied' => 'Código copiado',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Entrar no ${service}',
+ 'services.oauthProxy.body' => 'Escaneie este código QR ou abra a URL em qualquer dispositivo.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Abrir ${service} para entrar',
+ 'services.oauthProxy.urlCopied' => 'URL copiado',
+ 'services.libraryFilter.title' => 'Filtro de bibliotecas',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Sincronizando todas as bibliotecas',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Nada a sincronizar',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} bloqueadas',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} permitidas',
+ 'services.libraryFilter.mode' => 'Modo de filtro',
+ 'services.libraryFilter.modeBlacklist' => 'Lista negra',
+ 'services.libraryFilter.modeWhitelist' => 'Lista branca',
+ 'services.libraryFilter.modeHintBlacklist' => 'Sincronizar todas as bibliotecas exceto as marcadas abaixo.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Sincronizar apenas as bibliotecas marcadas abaixo.',
+ 'services.libraryFilter.libraries' => 'Bibliotecas',
+ 'services.libraryFilter.noLibraries' => 'Nenhuma biblioteca disponível',
'addServer.addJellyfinTitle' => 'Adicionar servidor Jellyfin',
'addServer.serverUrls' => 'URLs do servidor',
'addServer.serverUrlsHelper' => 'Vários URLs permitidos, separados por vírgulas.',
diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart
index 19fd93e4..99fbafc7 100644
--- a/lib/i18n/strings_ru.g.dart
+++ b/lib/i18n/strings_ru.g.dart
@@ -69,6 +69,7 @@ class TranslationsRu extends Translations with BaseTranslations 'Показывать, что вы смотрите, в Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Синхронизировать историю просмотров с Trakt';
- @override String get trackers => 'Трекеры';
- @override String get trackersDescription => 'Синхронизировать прогресс с Trakt, MyAnimeList, AniList и Simkl';
+ @override String get services => 'Сервисы';
+ @override String get servicesDescription => 'Подключите Trakt, MyAnimeList, Seerr и другие';
@override String get companionRemoteServer => 'Сервер удалённого управления';
@override String get companionRemoteServerDescription => 'Разрешить мобильным устройствам в сети управлять этим приложением';
@override String get autoPip => 'Автоматический «картинка в картинке»';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetRu extends TranslationsRateSheetEn {
@override String get setScore => 'Установить оценку';
@override String get saved => 'Сохранено';
@override String get notAvailable => 'Совпадений не найдено';
- @override String get noConnectedTrackers => 'Подключите трекер в настройках, чтобы оценивать там.';
+ @override String get noConnectedServices => 'Подключите сервис в настройках, чтобы оценивать здесь.';
}
// Path: accessibility
@@ -1063,6 +1065,41 @@ class _TranslationsNavigationRu extends TranslationsNavigationEn {
@override String get libraries => 'Библиотеки';
@override String get downloads => 'Загрузки';
@override String get liveTv => 'ТВ в прямом эфире';
+ @override String get explore => 'Исследовать';
+}
+
+// Path: explore
+class _TranslationsExploreRu extends TranslationsExploreEn {
+ _TranslationsExploreRu._(TranslationsRu root) : this._root = root, super.internal(root);
+
+ final TranslationsRu _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Исследовать';
+ @override String get selectSource => 'Выбрать источник';
+ @override late final _TranslationsExploreRowsRu rows = _TranslationsExploreRowsRu._(_root);
+ @override late final _TranslationsExploreStatusRu status = _TranslationsExploreStatusRu._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n,
+ one: '${n} эпизод',
+ few: '${n} эпизода',
+ many: '${n} эпизодов',
+ other: '${n} эпизода',
+ );
+ @override String get cast => 'В ролях';
+ @override String get characters => 'Персонажи';
+ @override String get addToWatchlist => 'Добавить в список для просмотра';
+ @override String get removeFromWatchlist => 'Удалить из списка для просмотра';
+ @override String get watchlistUpdateFailed => 'Не удалось обновить список для просмотра';
+ @override String get notInLibrary => 'Нет в вашей библиотеке';
+ @override String get inTheseLibraries => 'В этих библиотеках';
+ @override String availableOn({required Object server}) => 'Доступно на ${server}';
+ @override String get checkingLibrary => 'Проверка вашей библиотеки...';
+ @override String get emptyTitle => 'Здесь пока ничего нет';
+ @override String emptyMessage({required Object source}) => 'Строки из ${source} появятся здесь, когда в них будет контент.';
+ @override String searchHint({required Object source}) => 'Поиск в ${source}';
+ @override String searchEmpty({required Object query}) => 'Нет результатов по запросу "${query}"';
+ @override String searchPrompt({required Object source}) => 'Ищите фильмы и сериалы в ${source}.';
+ @override String get searchFailed => 'Ошибка поиска. Проверьте подключение и повторите попытку.';
}
// Path: liveTv
@@ -1648,15 +1685,54 @@ class _TranslationsTraktRu extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'Когда вы отмечаете элементы как просмотренные в Plezy, они отмечаются и в Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersRu extends TranslationsTrackersEn {
- _TranslationsTrackersRu._(TranslationsRu root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrRu extends TranslationsSeerrEn {
+ _TranslationsSeerrRu._(TranslationsRu root) : this._root = root, super.internal(root);
final TranslationsRu _root; // ignore: unused_field
// Translations
- @override String get title => 'Трекеры';
- @override String get hubSubtitle => 'Синхронизируйте прогресс просмотра с Trakt и другими сервисами.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Подключить Seerr';
+ @override String get serverUrl => 'URL сервера';
+ @override String get serverUrlHelper => 'Адрес вашего экземпляра Seerr';
+ @override String get checkServer => 'Продолжить';
+ @override String get signInWithJellyfin => 'Войти через Jellyfin';
+ @override String get signInWithEmby => 'Войти через Emby';
+ @override String get signInWithLocal => 'Использовать локальную учётную запись';
+ @override String get email => 'Эл. почта';
+ @override String get noSignInMethods => 'Этот экземпляр Seerr не предлагает способа входа, поддерживаемого Plezy.';
+ @override String get instance => 'Экземпляр';
+ @override String get disconnectConfirm => 'Отключить Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy забудет этот экземпляр Seerr. Подключитесь снова в любое время.';
+ @override String get request => 'Запросить';
+ @override String get request4k => 'Запросить в 4K';
+ @override String get seasons => 'Сезоны';
+ @override String get allSeasons => 'Все сезоны';
+ @override String get advancedOptions => 'Дополнительно';
+ @override String get destinationServer => 'Целевой сервер';
+ @override String get qualityProfile => 'Профиль качества';
+ @override String get rootFolder => 'Корневая папка';
+ @override String get languageProfile => 'Языковой профиль';
+ @override String get requestSubmitted => 'Запрос отправлен';
+ @override String requestFailed({required Object error}) => 'Ошибка запроса: ${error}';
+ @override String get requestsLoadFailed => 'Не удалось загрузить параметры запроса';
+ @override String get nothingToRequest => 'Всё уже доступно или запрошено.';
+ @override String get statusAvailable => 'Доступно';
+ @override String get statusPartiallyAvailable => 'Частично доступно';
+ @override String get statusRequested => 'Запрошено';
+ @override String get statusProcessing => 'Обработка';
+}
+
+// Path: services
+class _TranslationsServicesRu extends TranslationsServicesEn {
+ _TranslationsServicesRu._(TranslationsRu root) : this._root = root, super.internal(root);
+
+ final TranslationsRu _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Сервисы';
+ @override String get hubSubtitle => 'Синхронизируйте прогресс просмотра и запрашивайте новые тайтлы.';
@override String get notConnected => 'Не подключено';
@override String connectedAs({required Object username}) => 'Подключено как @${username}';
@override String get scrobble => 'Автоматически отслеживать прогресс';
@@ -1664,10 +1740,10 @@ class _TranslationsTrackersRu extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Отключить ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy перестанет обновлять ${service}. Подключите снова в любое время.';
@override String connectFailed({required Object service}) => 'Не удалось подключиться к ${service}. Попробуйте ещё раз.';
- @override late final _TranslationsTrackersServicesRu services = _TranslationsTrackersServicesRu._(_root);
- @override late final _TranslationsTrackersDeviceCodeRu deviceCode = _TranslationsTrackersDeviceCodeRu._(_root);
- @override late final _TranslationsTrackersOauthProxyRu oauthProxy = _TranslationsTrackersOauthProxyRu._(_root);
- @override late final _TranslationsTrackersLibraryFilterRu libraryFilter = _TranslationsTrackersLibraryFilterRu._(_root);
+ @override late final _TranslationsServicesNamesRu names = _TranslationsServicesNamesRu._(_root);
+ @override late final _TranslationsServicesDeviceCodeRu deviceCode = _TranslationsServicesDeviceCodeRu._(_root);
+ @override late final _TranslationsServicesOauthProxyRu oauthProxy = _TranslationsServicesOauthProxyRu._(_root);
+ @override late final _TranslationsServicesLibraryFilterRu libraryFilter = _TranslationsServicesLibraryFilterRu._(_root);
}
// Path: addServer
@@ -1834,6 +1910,41 @@ class _TranslationsLibrariesSortLabelsRu extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Дата добавления последнего эпизода';
}
+// Path: explore.rows
+class _TranslationsExploreRowsRu extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsRu._(TranslationsRu root) : this._root = root, super.internal(root);
+
+ final TranslationsRu _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Список для просмотра';
+ @override String get recommendedMovies => 'Рекомендуемые фильмы';
+ @override String get recommendedShows => 'Рекомендуемые сериалы';
+ @override String get trendingMovies => 'Фильмы в тренде';
+ @override String get trendingShows => 'Сериалы в тренде';
+ @override String get popularMovies => 'Популярные фильмы';
+ @override String get popularShows => 'Популярные сериалы';
+ @override String get suggestedAnime => 'Рекомендуемые аниме';
+ @override String get airingAnime => 'Топ выходящих аниме';
+ @override String get popularAnime => 'Самые популярные аниме';
+ @override String get trending => 'В тренде';
+ @override String get upcomingMovies => 'Ожидаемые фильмы';
+ @override String get upcomingShows => 'Ожидаемые сериалы';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusRu extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusRu._(TranslationsRu root) : this._root = root, super.internal(root);
+
+ final TranslationsRu _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Выходит';
+ @override String get ended => 'Завершён';
+ @override String get canceled => 'Отменён';
+ @override String get upcoming => 'Скоро';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionRu extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionRu._(TranslationsRu root) : this._root = root, super.internal(root);
@@ -1930,9 +2041,9 @@ class _TranslationsCompanionRemoteErrorsRu extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Соединение потеряно';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesRu extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesRu._(TranslationsRu root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesRu extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesRu._(TranslationsRu root) : this._root = root, super.internal(root);
final TranslationsRu _root; // ignore: unused_field
@@ -1940,11 +2051,12 @@ class _TranslationsTrackersServicesRu extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeRu extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeRu._(TranslationsRu root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeRu extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeRu._(TranslationsRu root) : this._root = root, super.internal(root);
final TranslationsRu _root; // ignore: unused_field
@@ -1956,9 +2068,9 @@ class _TranslationsTrackersDeviceCodeRu extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Код скопирован';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyRu extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyRu._(TranslationsRu root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyRu extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyRu._(TranslationsRu root) : this._root = root, super.internal(root);
final TranslationsRu _root; // ignore: unused_field
@@ -1969,9 +2081,9 @@ class _TranslationsTrackersOauthProxyRu extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL скопирован';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterRu extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterRu._(TranslationsRu root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterRu extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterRu._(TranslationsRu root) : this._root = root, super.internal(root);
final TranslationsRu _root; // ignore: unused_field
@@ -2235,8 +2347,8 @@ extension on TranslationsRu {
'settings.discordRichPresenceDescription' => 'Показывать, что вы смотрите, в Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Синхронизировать историю просмотров с Trakt',
- 'settings.trackers' => 'Трекеры',
- 'settings.trackersDescription' => 'Синхронизировать прогресс с Trakt, MyAnimeList, AniList и Simkl',
+ 'settings.services' => 'Сервисы',
+ 'settings.servicesDescription' => 'Подключите Trakt, MyAnimeList, Seerr и другие',
'settings.companionRemoteServer' => 'Сервер удалённого управления',
'settings.companionRemoteServerDescription' => 'Разрешить мобильным устройствам в сети управлять этим приложением',
'settings.autoPip' => 'Автоматический «картинка в картинке»',
@@ -2392,7 +2504,7 @@ extension on TranslationsRu {
'rateSheet.setScore' => 'Установить оценку',
'rateSheet.saved' => 'Сохранено',
'rateSheet.notAvailable' => 'Совпадений не найдено',
- 'rateSheet.noConnectedTrackers' => 'Подключите трекер в настройках, чтобы оценивать там.',
+ 'rateSheet.noConnectedServices' => 'Подключите сервис в настройках, чтобы оценивать здесь.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, фильм',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, сериал',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2773,6 +2885,42 @@ extension on TranslationsRu {
'navigation.libraries' => 'Библиотеки',
'navigation.downloads' => 'Загрузки',
'navigation.liveTv' => 'ТВ в прямом эфире',
+ 'navigation.explore' => 'Исследовать',
+ 'explore.title' => 'Исследовать',
+ 'explore.selectSource' => 'Выбрать источник',
+ 'explore.rows.watchlist' => 'Список для просмотра',
+ 'explore.rows.recommendedMovies' => 'Рекомендуемые фильмы',
+ 'explore.rows.recommendedShows' => 'Рекомендуемые сериалы',
+ 'explore.rows.trendingMovies' => 'Фильмы в тренде',
+ 'explore.rows.trendingShows' => 'Сериалы в тренде',
+ 'explore.rows.popularMovies' => 'Популярные фильмы',
+ 'explore.rows.popularShows' => 'Популярные сериалы',
+ 'explore.rows.suggestedAnime' => 'Рекомендуемые аниме',
+ 'explore.rows.airingAnime' => 'Топ выходящих аниме',
+ 'explore.rows.popularAnime' => 'Самые популярные аниме',
+ 'explore.rows.trending' => 'В тренде',
+ 'explore.rows.upcomingMovies' => 'Ожидаемые фильмы',
+ 'explore.rows.upcomingShows' => 'Ожидаемые сериалы',
+ 'explore.status.airing' => 'Выходит',
+ 'explore.status.ended' => 'Завершён',
+ 'explore.status.canceled' => 'Отменён',
+ 'explore.status.upcoming' => 'Скоро',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n, one: '${n} эпизод', few: '${n} эпизода', many: '${n} эпизодов', other: '${n} эпизода', ),
+ 'explore.cast' => 'В ролях',
+ 'explore.characters' => 'Персонажи',
+ 'explore.addToWatchlist' => 'Добавить в список для просмотра',
+ 'explore.removeFromWatchlist' => 'Удалить из списка для просмотра',
+ 'explore.watchlistUpdateFailed' => 'Не удалось обновить список для просмотра',
+ 'explore.notInLibrary' => 'Нет в вашей библиотеке',
+ 'explore.inTheseLibraries' => 'В этих библиотеках',
+ 'explore.availableOn' => ({required Object server}) => 'Доступно на ${server}',
+ 'explore.checkingLibrary' => 'Проверка вашей библиотеки...',
+ 'explore.emptyTitle' => 'Здесь пока ничего нет',
+ 'explore.emptyMessage' => ({required Object source}) => 'Строки из ${source} появятся здесь, когда в них будет контент.',
+ 'explore.searchHint' => ({required Object source}) => 'Поиск в ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Нет результатов по запросу "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Ищите фильмы и сериалы в ${source}.',
+ 'explore.searchFailed' => 'Ошибка поиска. Проверьте подключение и повторите попытку.',
'liveTv.title' => 'ТВ в прямом эфире',
'liveTv.guide' => 'Программа',
'liveTv.noChannels' => 'Нет доступных каналов',
@@ -2988,6 +3136,8 @@ extension on TranslationsRu {
'downloads.cancelledDownloadMessage' => 'Эта загрузка была отменена. Что вы хотите сделать?',
'downloads.allEpisodesAlreadyDownloaded' => 'Все эпизоды уже загружены',
'downloads.resumeDownload' => 'Возобновить загрузку',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Загрузка отменена',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (синхронизация ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} загружен — нажмите, чтобы завершить',
@@ -3024,8 +3174,6 @@ extension on TranslationsRu {
'downloads.noSyncRules' => 'Нет правил синхронизации',
'downloads.manageSyncRule' => 'Управление синхронизацией',
'downloads.editEpisodeCount' => 'Количество эпизодов',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Фильтр синхронизации',
'downloads.syncAllItems' => 'Синхронизация всех элементов',
'downloads.syncUnwatchedItems' => 'Синхронизация непросмотренных элементов',
@@ -3274,39 +3422,70 @@ extension on TranslationsRu {
'trakt.scrobbleDescription' => 'Отправлять события воспроизведения, паузы и остановки в Trakt во время просмотра.',
'trakt.watchedSync' => 'Синхронизация статуса просмотра',
'trakt.watchedSyncDescription' => 'Когда вы отмечаете элементы как просмотренные в Plezy, они отмечаются и в Trakt.',
- 'trackers.title' => 'Трекеры',
- 'trackers.hubSubtitle' => 'Синхронизируйте прогресс просмотра с Trakt и другими сервисами.',
- 'trackers.notConnected' => 'Не подключено',
- 'trackers.connectedAs' => ({required Object username}) => 'Подключено как @${username}',
- 'trackers.scrobble' => 'Автоматически отслеживать прогресс',
- 'trackers.scrobbleDescription' => 'Обновляет список, когда вы заканчиваете эпизод или фильм.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Отключить ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy перестанет обновлять ${service}. Подключите снова в любое время.',
- 'trackers.connectFailed' => ({required Object service}) => 'Не удалось подключиться к ${service}. Попробуйте ещё раз.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Активируйте Plezy в ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Перейдите на ${url} и введите этот код:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Открыть ${service} для активации',
- 'trackers.deviceCode.waitingForAuthorization' => 'Ожидание авторизации…',
- 'trackers.deviceCode.codeCopied' => 'Код скопирован',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Войти в ${service}',
- 'trackers.oauthProxy.body' => 'Отсканируйте этот QR-код или откройте URL на любом устройстве.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Открыть ${service} для входа',
- 'trackers.oauthProxy.urlCopied' => 'URL скопирован',
- 'trackers.libraryFilter.title' => 'Фильтр библиотек',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Синхронизация всех библиотек',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Ничего не синхронизируется',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} заблокировано',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} разрешено',
- 'trackers.libraryFilter.mode' => 'Режим фильтра',
- 'trackers.libraryFilter.modeBlacklist' => 'Чёрный список',
- 'trackers.libraryFilter.modeWhitelist' => 'Белый список',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Синхронизировать все библиотеки, кроме отмеченных ниже.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Синхронизировать только библиотеки, отмеченные ниже.',
- 'trackers.libraryFilter.libraries' => 'Библиотеки',
- 'trackers.libraryFilter.noLibraries' => 'Библиотеки недоступны',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Подключить Seerr',
+ 'seerr.serverUrl' => 'URL сервера',
+ 'seerr.serverUrlHelper' => 'Адрес вашего экземпляра Seerr',
+ 'seerr.checkServer' => 'Продолжить',
+ 'seerr.signInWithJellyfin' => 'Войти через Jellyfin',
+ 'seerr.signInWithEmby' => 'Войти через Emby',
+ 'seerr.signInWithLocal' => 'Использовать локальную учётную запись',
+ 'seerr.email' => 'Эл. почта',
+ 'seerr.noSignInMethods' => 'Этот экземпляр Seerr не предлагает способа входа, поддерживаемого Plezy.',
+ 'seerr.instance' => 'Экземпляр',
+ 'seerr.disconnectConfirm' => 'Отключить Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy забудет этот экземпляр Seerr. Подключитесь снова в любое время.',
+ 'seerr.request' => 'Запросить',
+ 'seerr.request4k' => 'Запросить в 4K',
+ 'seerr.seasons' => 'Сезоны',
+ 'seerr.allSeasons' => 'Все сезоны',
+ 'seerr.advancedOptions' => 'Дополнительно',
+ 'seerr.destinationServer' => 'Целевой сервер',
+ 'seerr.qualityProfile' => 'Профиль качества',
+ 'seerr.rootFolder' => 'Корневая папка',
+ 'seerr.languageProfile' => 'Языковой профиль',
+ 'seerr.requestSubmitted' => 'Запрос отправлен',
+ 'seerr.requestFailed' => ({required Object error}) => 'Ошибка запроса: ${error}',
+ 'seerr.requestsLoadFailed' => 'Не удалось загрузить параметры запроса',
+ 'seerr.nothingToRequest' => 'Всё уже доступно или запрошено.',
+ 'seerr.statusAvailable' => 'Доступно',
+ 'seerr.statusPartiallyAvailable' => 'Частично доступно',
+ 'seerr.statusRequested' => 'Запрошено',
+ 'seerr.statusProcessing' => 'Обработка',
+ 'services.title' => 'Сервисы',
+ 'services.hubSubtitle' => 'Синхронизируйте прогресс просмотра и запрашивайте новые тайтлы.',
+ 'services.notConnected' => 'Не подключено',
+ 'services.connectedAs' => ({required Object username}) => 'Подключено как @${username}',
+ 'services.scrobble' => 'Автоматически отслеживать прогресс',
+ 'services.scrobbleDescription' => 'Обновляет список, когда вы заканчиваете эпизод или фильм.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Отключить ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy перестанет обновлять ${service}. Подключите снова в любое время.',
+ 'services.connectFailed' => ({required Object service}) => 'Не удалось подключиться к ${service}. Попробуйте ещё раз.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Активируйте Plezy в ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Перейдите на ${url} и введите этот код:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Открыть ${service} для активации',
+ 'services.deviceCode.waitingForAuthorization' => 'Ожидание авторизации…',
+ 'services.deviceCode.codeCopied' => 'Код скопирован',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Войти в ${service}',
+ 'services.oauthProxy.body' => 'Отсканируйте этот QR-код или откройте URL на любом устройстве.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Открыть ${service} для входа',
+ 'services.oauthProxy.urlCopied' => 'URL скопирован',
+ 'services.libraryFilter.title' => 'Фильтр библиотек',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Синхронизация всех библиотек',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Ничего не синхронизируется',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} заблокировано',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} разрешено',
+ 'services.libraryFilter.mode' => 'Режим фильтра',
+ 'services.libraryFilter.modeBlacklist' => 'Чёрный список',
+ 'services.libraryFilter.modeWhitelist' => 'Белый список',
+ 'services.libraryFilter.modeHintBlacklist' => 'Синхронизировать все библиотеки, кроме отмеченных ниже.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Синхронизировать только библиотеки, отмеченные ниже.',
+ 'services.libraryFilter.libraries' => 'Библиотеки',
+ 'services.libraryFilter.noLibraries' => 'Библиотеки недоступны',
'addServer.addJellyfinTitle' => 'Добавить сервер Jellyfin',
'addServer.serverUrls' => 'URL сервера',
'addServer.serverUrlsHelper' => 'Можно указать несколько URL через запятую.',
diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart
index 05e71591..e709d78a 100644
--- a/lib/i18n/strings_sv.g.dart
+++ b/lib/i18n/strings_sv.g.dart
@@ -69,6 +69,7 @@ class TranslationsSv extends Translations with BaseTranslations 'Visa vad du tittar på i Discord';
@override String get trakt => 'Trakt';
@override String get traktDescription => 'Synkronisera visningshistorik med Trakt';
- @override String get trackers => 'Spårare';
- @override String get trackersDescription => 'Synkronisera framsteg till Trakt, MyAnimeList, AniList och Simkl';
+ @override String get services => 'Tjänster';
+ @override String get servicesDescription => 'Anslut Trakt, MyAnimeList, Seerr med mera';
@override String get companionRemoteServer => 'Companion Remote-server';
@override String get companionRemoteServerDescription => 'Tillåt mobila enheter i ditt nätverk att styra denna app';
@override String get autoPip => 'Automatisk bild-i-bild';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetSv extends TranslationsRateSheetEn {
@override String get setScore => 'Ange betyg';
@override String get saved => 'Sparat';
@override String get notAvailable => 'Ingen matchning hittades';
- @override String get noConnectedTrackers => 'Anslut en spårare i Inställningar för att betygsätta där.';
+ @override String get noConnectedServices => 'Anslut en tjänst i Inställningar för att betygsätta där.';
}
// Path: accessibility
@@ -1063,6 +1065,39 @@ class _TranslationsNavigationSv extends TranslationsNavigationEn {
@override String get libraries => 'Bibliotek';
@override String get downloads => 'Nerladdat';
@override String get liveTv => 'Live-TV';
+ @override String get explore => 'Utforska';
+}
+
+// Path: explore
+class _TranslationsExploreSv extends TranslationsExploreEn {
+ _TranslationsExploreSv._(TranslationsSv root) : this._root = root, super.internal(root);
+
+ final TranslationsSv _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Utforska';
+ @override String get selectSource => 'Välj källa';
+ @override late final _TranslationsExploreRowsSv rows = _TranslationsExploreRowsSv._(_root);
+ @override late final _TranslationsExploreStatusSv status = _TranslationsExploreStatusSv._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n,
+ one: '${n} avsnitt',
+ other: '${n} avsnitt',
+ );
+ @override String get cast => 'Rollbesättning';
+ @override String get characters => 'Karaktärer';
+ @override String get addToWatchlist => 'Lägg till i bevakningslista';
+ @override String get removeFromWatchlist => 'Ta bort från bevakningslista';
+ @override String get watchlistUpdateFailed => 'Det gick inte att uppdatera bevakningslistan';
+ @override String get notInLibrary => 'Finns inte i ditt bibliotek';
+ @override String get inTheseLibraries => 'I dessa bibliotek';
+ @override String availableOn({required Object server}) => 'Tillgänglig på ${server}';
+ @override String get checkingLibrary => 'Kontrollerar ditt bibliotek...';
+ @override String get emptyTitle => 'Inget här ännu';
+ @override String emptyMessage({required Object source}) => 'Rader från ${source} visas här när de har innehåll.';
+ @override String searchHint({required Object source}) => 'Sök i ${source}';
+ @override String searchEmpty({required Object query}) => 'Inga resultat för "${query}"';
+ @override String searchPrompt({required Object source}) => 'Sök efter filmer och serier på ${source}.';
+ @override String get searchFailed => 'Sökningen misslyckades. Kontrollera din anslutning och försök igen.';
}
// Path: liveTv
@@ -1646,15 +1681,54 @@ class _TranslationsTraktSv extends TranslationsTraktEn {
@override String get watchedSyncDescription => 'När du markerar något som tittat i Plezy markeras det också på Trakt.';
}
-// Path: trackers
-class _TranslationsTrackersSv extends TranslationsTrackersEn {
- _TranslationsTrackersSv._(TranslationsSv root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrSv extends TranslationsSeerrEn {
+ _TranslationsSeerrSv._(TranslationsSv root) : this._root = root, super.internal(root);
final TranslationsSv _root; // ignore: unused_field
// Translations
- @override String get title => 'Spårare';
- @override String get hubSubtitle => 'Synka tittförlopp med Trakt och andra tjänster.';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => 'Anslut Seerr';
+ @override String get serverUrl => 'Server-URL';
+ @override String get serverUrlHelper => 'Adressen till din Seerr-instans';
+ @override String get checkServer => 'Fortsätt';
+ @override String get signInWithJellyfin => 'Logga in med Jellyfin';
+ @override String get signInWithEmby => 'Logga in med Emby';
+ @override String get signInWithLocal => 'Använd ett lokalt konto';
+ @override String get email => 'E-post';
+ @override String get noSignInMethods => 'Den här Seerr-instansen erbjuder ingen inloggningsmetod som Plezy stöder.';
+ @override String get instance => 'Instans';
+ @override String get disconnectConfirm => 'Koppla från Seerr?';
+ @override String get disconnectConfirmBody => 'Plezy glömmer den här Seerr-instansen. Återanslut när som helst.';
+ @override String get request => 'Begär';
+ @override String get request4k => 'Begär i 4K';
+ @override String get seasons => 'Säsonger';
+ @override String get allSeasons => 'Alla säsonger';
+ @override String get advancedOptions => 'Avancerat';
+ @override String get destinationServer => 'Målserver';
+ @override String get qualityProfile => 'Kvalitetsprofil';
+ @override String get rootFolder => 'Rotmapp';
+ @override String get languageProfile => 'Språkprofil';
+ @override String get requestSubmitted => 'Begäran skickad';
+ @override String requestFailed({required Object error}) => 'Begäran misslyckades: ${error}';
+ @override String get requestsLoadFailed => 'Det gick inte att läsa in alternativ för begäran';
+ @override String get nothingToRequest => 'Allt är redan tillgängligt eller begärt.';
+ @override String get statusAvailable => 'Tillgänglig';
+ @override String get statusPartiallyAvailable => 'Delvis tillgänglig';
+ @override String get statusRequested => 'Begärd';
+ @override String get statusProcessing => 'Bearbetas';
+}
+
+// Path: services
+class _TranslationsServicesSv extends TranslationsServicesEn {
+ _TranslationsServicesSv._(TranslationsSv root) : this._root = root, super.internal(root);
+
+ final TranslationsSv _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => 'Tjänster';
+ @override String get hubSubtitle => 'Synkronisera dina framsteg och begär nya titlar.';
@override String get notConnected => 'Ej ansluten';
@override String connectedAs({required Object username}) => 'Ansluten som @${username}';
@override String get scrobble => 'Spåra framsteg automatiskt';
@@ -1662,10 +1736,10 @@ class _TranslationsTrackersSv extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => 'Koppla från ${service}?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy slutar uppdatera ${service}. Återanslut när som helst.';
@override String connectFailed({required Object service}) => 'Kunde inte ansluta till ${service}. Försök igen.';
- @override late final _TranslationsTrackersServicesSv services = _TranslationsTrackersServicesSv._(_root);
- @override late final _TranslationsTrackersDeviceCodeSv deviceCode = _TranslationsTrackersDeviceCodeSv._(_root);
- @override late final _TranslationsTrackersOauthProxySv oauthProxy = _TranslationsTrackersOauthProxySv._(_root);
- @override late final _TranslationsTrackersLibraryFilterSv libraryFilter = _TranslationsTrackersLibraryFilterSv._(_root);
+ @override late final _TranslationsServicesNamesSv names = _TranslationsServicesNamesSv._(_root);
+ @override late final _TranslationsServicesDeviceCodeSv deviceCode = _TranslationsServicesDeviceCodeSv._(_root);
+ @override late final _TranslationsServicesOauthProxySv oauthProxy = _TranslationsServicesOauthProxySv._(_root);
+ @override late final _TranslationsServicesLibraryFilterSv libraryFilter = _TranslationsServicesLibraryFilterSv._(_root);
}
// Path: addServer
@@ -1832,6 +1906,41 @@ class _TranslationsLibrariesSortLabelsSv extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => 'Datum då senaste avsnittet lades till';
}
+// Path: explore.rows
+class _TranslationsExploreRowsSv extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsSv._(TranslationsSv root) : this._root = root, super.internal(root);
+
+ final TranslationsSv _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => 'Bevakningslista';
+ @override String get recommendedMovies => 'Rekommenderade filmer';
+ @override String get recommendedShows => 'Rekommenderade serier';
+ @override String get trendingMovies => 'Trendande filmer';
+ @override String get trendingShows => 'Trendande serier';
+ @override String get popularMovies => 'Populära filmer';
+ @override String get popularShows => 'Populära serier';
+ @override String get suggestedAnime => 'Föreslagna anime';
+ @override String get airingAnime => 'Bästa pågående anime';
+ @override String get popularAnime => 'Mest populära anime';
+ @override String get trending => 'Trendar nu';
+ @override String get upcomingMovies => 'Kommande filmer';
+ @override String get upcomingShows => 'Kommande serier';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusSv extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusSv._(TranslationsSv root) : this._root = root, super.internal(root);
+
+ final TranslationsSv _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => 'Pågår';
+ @override String get ended => 'Avslutad';
+ @override String get canceled => 'Nedlagd';
+ @override String get upcoming => 'Kommande';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionSv extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionSv._(TranslationsSv root) : this._root = root, super.internal(root);
@@ -1928,9 +2037,9 @@ class _TranslationsCompanionRemoteErrorsSv extends TranslationsCompanionRemoteEr
@override String get connectionLost => 'Anslutning förlorad';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesSv extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesSv._(TranslationsSv root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesSv extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesSv._(TranslationsSv root) : this._root = root, super.internal(root);
final TranslationsSv _root; // ignore: unused_field
@@ -1938,11 +2047,12 @@ class _TranslationsTrackersServicesSv extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeSv extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeSv._(TranslationsSv root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeSv extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeSv._(TranslationsSv root) : this._root = root, super.internal(root);
final TranslationsSv _root; // ignore: unused_field
@@ -1954,9 +2064,9 @@ class _TranslationsTrackersDeviceCodeSv extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => 'Kod kopierad';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxySv extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxySv._(TranslationsSv root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxySv extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxySv._(TranslationsSv root) : this._root = root, super.internal(root);
final TranslationsSv _root; // ignore: unused_field
@@ -1967,9 +2077,9 @@ class _TranslationsTrackersOauthProxySv extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL kopierad';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterSv extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterSv._(TranslationsSv root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterSv extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterSv._(TranslationsSv root) : this._root = root, super.internal(root);
final TranslationsSv _root; // ignore: unused_field
@@ -2233,8 +2343,8 @@ extension on TranslationsSv {
'settings.discordRichPresenceDescription' => 'Visa vad du tittar på i Discord',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => 'Synkronisera visningshistorik med Trakt',
- 'settings.trackers' => 'Spårare',
- 'settings.trackersDescription' => 'Synkronisera framsteg till Trakt, MyAnimeList, AniList och Simkl',
+ 'settings.services' => 'Tjänster',
+ 'settings.servicesDescription' => 'Anslut Trakt, MyAnimeList, Seerr med mera',
'settings.companionRemoteServer' => 'Companion Remote-server',
'settings.companionRemoteServerDescription' => 'Tillåt mobila enheter i ditt nätverk att styra denna app',
'settings.autoPip' => 'Automatisk bild-i-bild',
@@ -2390,7 +2500,7 @@ extension on TranslationsSv {
'rateSheet.setScore' => 'Ange betyg',
'rateSheet.saved' => 'Sparat',
'rateSheet.notAvailable' => 'Ingen matchning hittades',
- 'rateSheet.noConnectedTrackers' => 'Anslut en spårare i Inställningar för att betygsätta där.',
+ 'rateSheet.noConnectedServices' => 'Anslut en tjänst i Inställningar för att betygsätta där.',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, film',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, TV-serie',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2771,6 +2881,42 @@ extension on TranslationsSv {
'navigation.libraries' => 'Bibliotek',
'navigation.downloads' => 'Nerladdat',
'navigation.liveTv' => 'Live-TV',
+ 'navigation.explore' => 'Utforska',
+ 'explore.title' => 'Utforska',
+ 'explore.selectSource' => 'Välj källa',
+ 'explore.rows.watchlist' => 'Bevakningslista',
+ 'explore.rows.recommendedMovies' => 'Rekommenderade filmer',
+ 'explore.rows.recommendedShows' => 'Rekommenderade serier',
+ 'explore.rows.trendingMovies' => 'Trendande filmer',
+ 'explore.rows.trendingShows' => 'Trendande serier',
+ 'explore.rows.popularMovies' => 'Populära filmer',
+ 'explore.rows.popularShows' => 'Populära serier',
+ 'explore.rows.suggestedAnime' => 'Föreslagna anime',
+ 'explore.rows.airingAnime' => 'Bästa pågående anime',
+ 'explore.rows.popularAnime' => 'Mest populära anime',
+ 'explore.rows.trending' => 'Trendar nu',
+ 'explore.rows.upcomingMovies' => 'Kommande filmer',
+ 'explore.rows.upcomingShows' => 'Kommande serier',
+ 'explore.status.airing' => 'Pågår',
+ 'explore.status.ended' => 'Avslutad',
+ 'explore.status.canceled' => 'Nedlagd',
+ 'explore.status.upcoming' => 'Kommande',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: '${n} avsnitt', other: '${n} avsnitt', ),
+ 'explore.cast' => 'Rollbesättning',
+ 'explore.characters' => 'Karaktärer',
+ 'explore.addToWatchlist' => 'Lägg till i bevakningslista',
+ 'explore.removeFromWatchlist' => 'Ta bort från bevakningslista',
+ 'explore.watchlistUpdateFailed' => 'Det gick inte att uppdatera bevakningslistan',
+ 'explore.notInLibrary' => 'Finns inte i ditt bibliotek',
+ 'explore.inTheseLibraries' => 'I dessa bibliotek',
+ 'explore.availableOn' => ({required Object server}) => 'Tillgänglig på ${server}',
+ 'explore.checkingLibrary' => 'Kontrollerar ditt bibliotek...',
+ 'explore.emptyTitle' => 'Inget här ännu',
+ 'explore.emptyMessage' => ({required Object source}) => 'Rader från ${source} visas här när de har innehåll.',
+ 'explore.searchHint' => ({required Object source}) => 'Sök i ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => 'Inga resultat för "${query}"',
+ 'explore.searchPrompt' => ({required Object source}) => 'Sök efter filmer och serier på ${source}.',
+ 'explore.searchFailed' => 'Sökningen misslyckades. Kontrollera din anslutning och försök igen.',
'liveTv.title' => 'Live-TV',
'liveTv.guide' => 'Programguide',
'liveTv.noChannels' => 'Inga kanaler tillgängliga',
@@ -2986,6 +3132,8 @@ extension on TranslationsSv {
'downloads.cancelledDownloadMessage' => 'Den här nedladdningen avbröts. Vad vill du göra?',
'downloads.allEpisodesAlreadyDownloaded' => 'Alla avsnitt är redan nedladdade',
'downloads.resumeDownload' => 'Återuppta nedladdning',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => 'Avbruten nedladdning',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file} (synkroniserar ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '${file} nedladdad – klicka för att slutföra',
@@ -3022,8 +3170,6 @@ extension on TranslationsSv {
'downloads.noSyncRules' => 'Inga synkregler',
'downloads.manageSyncRule' => 'Hantera synkronisering',
'downloads.editEpisodeCount' => 'Antal avsnitt',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => 'Synkroniseringsfilter',
'downloads.syncAllItems' => 'Synkroniserar alla objekt',
'downloads.syncUnwatchedItems' => 'Synkroniserar osedda objekt',
@@ -3272,39 +3418,70 @@ extension on TranslationsSv {
'trakt.scrobbleDescription' => 'Skicka uppspelnings-, paus- och stopphändelser till Trakt under uppspelning.',
'trakt.watchedSync' => 'Synkronisera tittad-status',
'trakt.watchedSyncDescription' => 'När du markerar något som tittat i Plezy markeras det också på Trakt.',
- 'trackers.title' => 'Spårare',
- 'trackers.hubSubtitle' => 'Synka tittförlopp med Trakt och andra tjänster.',
- 'trackers.notConnected' => 'Ej ansluten',
- 'trackers.connectedAs' => ({required Object username}) => 'Ansluten som @${username}',
- 'trackers.scrobble' => 'Spåra framsteg automatiskt',
- 'trackers.scrobbleDescription' => 'Uppdaterar din lista när du är klar med ett avsnitt eller en film.',
- 'trackers.disconnectConfirm' => ({required Object service}) => 'Koppla från ${service}?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy slutar uppdatera ${service}. Återanslut när som helst.',
- 'trackers.connectFailed' => ({required Object service}) => 'Kunde inte ansluta till ${service}. Försök igen.',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => 'Aktivera Plezy på ${service}',
- 'trackers.deviceCode.body' => ({required Object url}) => 'Besök ${url} och ange den här koden:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => 'Öppna ${service} för att aktivera',
- 'trackers.deviceCode.waitingForAuthorization' => 'Väntar på auktorisering…',
- 'trackers.deviceCode.codeCopied' => 'Kod kopierad',
- 'trackers.oauthProxy.title' => ({required Object service}) => 'Logga in på ${service}',
- 'trackers.oauthProxy.body' => 'Skanna den här QR-koden eller öppna URL:en på valfri enhet.',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => 'Öppna ${service} för att logga in',
- 'trackers.oauthProxy.urlCopied' => 'URL kopierad',
- 'trackers.libraryFilter.title' => 'Biblioteksfilter',
- 'trackers.libraryFilter.subtitleAllSyncing' => 'Synkroniserar alla bibliotek',
- 'trackers.libraryFilter.subtitleNoneSyncing' => 'Ingenting synkroniseras',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blockerade',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} tillåtna',
- 'trackers.libraryFilter.mode' => 'Filterläge',
- 'trackers.libraryFilter.modeBlacklist' => 'Svartlista',
- 'trackers.libraryFilter.modeWhitelist' => 'Vitlista',
- 'trackers.libraryFilter.modeHintBlacklist' => 'Synkronisera alla bibliotek utom de som markerats nedan.',
- 'trackers.libraryFilter.modeHintWhitelist' => 'Synkronisera endast de bibliotek som markerats nedan.',
- 'trackers.libraryFilter.libraries' => 'Bibliotek',
- 'trackers.libraryFilter.noLibraries' => 'Inga bibliotek tillgängliga',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => 'Anslut Seerr',
+ 'seerr.serverUrl' => 'Server-URL',
+ 'seerr.serverUrlHelper' => 'Adressen till din Seerr-instans',
+ 'seerr.checkServer' => 'Fortsätt',
+ 'seerr.signInWithJellyfin' => 'Logga in med Jellyfin',
+ 'seerr.signInWithEmby' => 'Logga in med Emby',
+ 'seerr.signInWithLocal' => 'Använd ett lokalt konto',
+ 'seerr.email' => 'E-post',
+ 'seerr.noSignInMethods' => 'Den här Seerr-instansen erbjuder ingen inloggningsmetod som Plezy stöder.',
+ 'seerr.instance' => 'Instans',
+ 'seerr.disconnectConfirm' => 'Koppla från Seerr?',
+ 'seerr.disconnectConfirmBody' => 'Plezy glömmer den här Seerr-instansen. Återanslut när som helst.',
+ 'seerr.request' => 'Begär',
+ 'seerr.request4k' => 'Begär i 4K',
+ 'seerr.seasons' => 'Säsonger',
+ 'seerr.allSeasons' => 'Alla säsonger',
+ 'seerr.advancedOptions' => 'Avancerat',
+ 'seerr.destinationServer' => 'Målserver',
+ 'seerr.qualityProfile' => 'Kvalitetsprofil',
+ 'seerr.rootFolder' => 'Rotmapp',
+ 'seerr.languageProfile' => 'Språkprofil',
+ 'seerr.requestSubmitted' => 'Begäran skickad',
+ 'seerr.requestFailed' => ({required Object error}) => 'Begäran misslyckades: ${error}',
+ 'seerr.requestsLoadFailed' => 'Det gick inte att läsa in alternativ för begäran',
+ 'seerr.nothingToRequest' => 'Allt är redan tillgängligt eller begärt.',
+ 'seerr.statusAvailable' => 'Tillgänglig',
+ 'seerr.statusPartiallyAvailable' => 'Delvis tillgänglig',
+ 'seerr.statusRequested' => 'Begärd',
+ 'seerr.statusProcessing' => 'Bearbetas',
+ 'services.title' => 'Tjänster',
+ 'services.hubSubtitle' => 'Synkronisera dina framsteg och begär nya titlar.',
+ 'services.notConnected' => 'Ej ansluten',
+ 'services.connectedAs' => ({required Object username}) => 'Ansluten som @${username}',
+ 'services.scrobble' => 'Spåra framsteg automatiskt',
+ 'services.scrobbleDescription' => 'Uppdaterar din lista när du är klar med ett avsnitt eller en film.',
+ 'services.disconnectConfirm' => ({required Object service}) => 'Koppla från ${service}?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy slutar uppdatera ${service}. Återanslut när som helst.',
+ 'services.connectFailed' => ({required Object service}) => 'Kunde inte ansluta till ${service}. Försök igen.',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => 'Aktivera Plezy på ${service}',
+ 'services.deviceCode.body' => ({required Object url}) => 'Besök ${url} och ange den här koden:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => 'Öppna ${service} för att aktivera',
+ 'services.deviceCode.waitingForAuthorization' => 'Väntar på auktorisering…',
+ 'services.deviceCode.codeCopied' => 'Kod kopierad',
+ 'services.oauthProxy.title' => ({required Object service}) => 'Logga in på ${service}',
+ 'services.oauthProxy.body' => 'Skanna den här QR-koden eller öppna URL:en på valfri enhet.',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => 'Öppna ${service} för att logga in',
+ 'services.oauthProxy.urlCopied' => 'URL kopierad',
+ 'services.libraryFilter.title' => 'Biblioteksfilter',
+ 'services.libraryFilter.subtitleAllSyncing' => 'Synkroniserar alla bibliotek',
+ 'services.libraryFilter.subtitleNoneSyncing' => 'Ingenting synkroniseras',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '${count} blockerade',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '${count} tillåtna',
+ 'services.libraryFilter.mode' => 'Filterläge',
+ 'services.libraryFilter.modeBlacklist' => 'Svartlista',
+ 'services.libraryFilter.modeWhitelist' => 'Vitlista',
+ 'services.libraryFilter.modeHintBlacklist' => 'Synkronisera alla bibliotek utom de som markerats nedan.',
+ 'services.libraryFilter.modeHintWhitelist' => 'Synkronisera endast de bibliotek som markerats nedan.',
+ 'services.libraryFilter.libraries' => 'Bibliotek',
+ 'services.libraryFilter.noLibraries' => 'Inga bibliotek tillgängliga',
'addServer.addJellyfinTitle' => 'Lägg till Jellyfin-server',
'addServer.serverUrls' => 'Server-URL:er',
'addServer.serverUrlsHelper' => 'Flera URL:er tillåtna, separerade med kommatecken.',
diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart
index 23e0853c..8801a2a0 100644
--- a/lib/i18n/strings_zh.g.dart
+++ b/lib/i18n/strings_zh.g.dart
@@ -69,6 +69,7 @@ class TranslationsZh extends Translations with BaseTranslations '在 Discord 上显示您正在观看的内容';
@override String get trakt => 'Trakt';
@override String get traktDescription => '将观看历史与 Trakt 同步';
- @override String get trackers => '追踪器';
- @override String get trackersDescription => '将进度同步到 Trakt、MyAnimeList、AniList 和 Simkl';
+ @override String get services => '服务';
+ @override String get servicesDescription => '连接 Trakt、MyAnimeList、Seerr 等';
@override String get companionRemoteServer => '配套遥控服务器';
@override String get companionRemoteServerDescription => '允许网络上的移动设备控制此应用';
@override String get autoPip => '自动画中画';
@@ -555,7 +557,7 @@ class _TranslationsRateSheetZh extends TranslationsRateSheetEn {
@override String get setScore => '设置分数';
@override String get saved => '已保存';
@override String get notAvailable => '未找到匹配项';
- @override String get noConnectedTrackers => '在设置中连接跟踪器即可在那里评分。';
+ @override String get noConnectedServices => '在设置中连接服务,即可在此评分。';
}
// Path: accessibility
@@ -1063,6 +1065,38 @@ class _TranslationsNavigationZh extends TranslationsNavigationEn {
@override String get libraries => '媒体库';
@override String get downloads => '下载';
@override String get liveTv => '电视直播';
+ @override String get explore => '探索';
+}
+
+// Path: explore
+class _TranslationsExploreZh extends TranslationsExploreEn {
+ _TranslationsExploreZh._(TranslationsZh root) : this._root = root, super.internal(root);
+
+ final TranslationsZh _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => '探索';
+ @override String get selectSource => '选择来源';
+ @override late final _TranslationsExploreRowsZh rows = _TranslationsExploreRowsZh._(_root);
+ @override late final _TranslationsExploreStatusZh status = _TranslationsExploreStatusZh._(_root);
+ @override String episodeCount({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n,
+ other: '${n} 集',
+ );
+ @override String get cast => '演员表';
+ @override String get characters => '角色';
+ @override String get addToWatchlist => '添加到想看列表';
+ @override String get removeFromWatchlist => '从想看列表移除';
+ @override String get watchlistUpdateFailed => '无法更新想看列表';
+ @override String get notInLibrary => '不在你的媒体库中';
+ @override String get inTheseLibraries => '在这些媒体库中';
+ @override String availableOn({required Object server}) => '在 ${server} 上可用';
+ @override String get checkingLibrary => '正在检查你的媒体库...';
+ @override String get emptyTitle => '这里还什么都没有';
+ @override String emptyMessage({required Object source}) => '当 ${source} 有内容时,相关内容将显示在这里。';
+ @override String searchHint({required Object source}) => '搜索 ${source}';
+ @override String searchEmpty({required Object query}) => '没有“${query}”的结果';
+ @override String searchPrompt({required Object source}) => '在 ${source} 上搜索电影和剧集。';
+ @override String get searchFailed => '搜索失败。请检查网络连接后重试。';
}
// Path: liveTv
@@ -1645,15 +1679,54 @@ class _TranslationsTraktZh extends TranslationsTraktEn {
@override String get watchedSyncDescription => '在 Plezy 中将内容标记为已观看时,也会在 Trakt 上标记为已观看。';
}
-// Path: trackers
-class _TranslationsTrackersZh extends TranslationsTrackersEn {
- _TranslationsTrackersZh._(TranslationsZh root) : this._root = root, super.internal(root);
+// Path: seerr
+class _TranslationsSeerrZh extends TranslationsSeerrEn {
+ _TranslationsSeerrZh._(TranslationsZh root) : this._root = root, super.internal(root);
final TranslationsZh _root; // ignore: unused_field
// Translations
- @override String get title => '追踪器';
- @override String get hubSubtitle => '与 Trakt 和其他服务同步观看进度。';
+ @override String get title => 'Seerr';
+ @override String get connectTitle => '连接 Seerr';
+ @override String get serverUrl => '服务器 URL';
+ @override String get serverUrlHelper => '你的 Seerr 实例的地址';
+ @override String get checkServer => '继续';
+ @override String get signInWithJellyfin => '使用 Jellyfin 登录';
+ @override String get signInWithEmby => '使用 Emby 登录';
+ @override String get signInWithLocal => '使用本地账户';
+ @override String get email => '邮箱';
+ @override String get noSignInMethods => '此 Seerr 实例未提供 Plezy 支持的登录方式。';
+ @override String get instance => '实例';
+ @override String get disconnectConfirm => '断开 Seerr 连接?';
+ @override String get disconnectConfirmBody => 'Plezy 将忘记此 Seerr 实例。可随时重新连接。';
+ @override String get request => '请求';
+ @override String get request4k => '请求 4K';
+ @override String get seasons => '季';
+ @override String get allSeasons => '全部季';
+ @override String get advancedOptions => '高级';
+ @override String get destinationServer => '目标服务器';
+ @override String get qualityProfile => '质量配置文件';
+ @override String get rootFolder => '根目录';
+ @override String get languageProfile => '语言配置文件';
+ @override String get requestSubmitted => '请求已提交';
+ @override String requestFailed({required Object error}) => '请求失败: ${error}';
+ @override String get requestsLoadFailed => '无法加载请求选项';
+ @override String get nothingToRequest => '所有内容都已可用或已请求。';
+ @override String get statusAvailable => '可用';
+ @override String get statusPartiallyAvailable => '部分可用';
+ @override String get statusRequested => '已请求';
+ @override String get statusProcessing => '处理中';
+}
+
+// Path: services
+class _TranslationsServicesZh extends TranslationsServicesEn {
+ _TranslationsServicesZh._(TranslationsZh root) : this._root = root, super.internal(root);
+
+ final TranslationsZh _root; // ignore: unused_field
+
+ // Translations
+ @override String get title => '服务';
+ @override String get hubSubtitle => '同步观看进度并请求新内容。';
@override String get notConnected => '未连接';
@override String connectedAs({required Object username}) => '已以 @${username} 身份连接';
@override String get scrobble => '自动记录进度';
@@ -1661,10 +1734,10 @@ class _TranslationsTrackersZh extends TranslationsTrackersEn {
@override String disconnectConfirm({required Object service}) => '断开 ${service} 连接?';
@override String disconnectConfirmBody({required Object service}) => 'Plezy 将停止更新 ${service}。可随时重新连接。';
@override String connectFailed({required Object service}) => '无法连接到 ${service}。请重试。';
- @override late final _TranslationsTrackersServicesZh services = _TranslationsTrackersServicesZh._(_root);
- @override late final _TranslationsTrackersDeviceCodeZh deviceCode = _TranslationsTrackersDeviceCodeZh._(_root);
- @override late final _TranslationsTrackersOauthProxyZh oauthProxy = _TranslationsTrackersOauthProxyZh._(_root);
- @override late final _TranslationsTrackersLibraryFilterZh libraryFilter = _TranslationsTrackersLibraryFilterZh._(_root);
+ @override late final _TranslationsServicesNamesZh names = _TranslationsServicesNamesZh._(_root);
+ @override late final _TranslationsServicesDeviceCodeZh deviceCode = _TranslationsServicesDeviceCodeZh._(_root);
+ @override late final _TranslationsServicesOauthProxyZh oauthProxy = _TranslationsServicesOauthProxyZh._(_root);
+ @override late final _TranslationsServicesLibraryFilterZh libraryFilter = _TranslationsServicesLibraryFilterZh._(_root);
}
// Path: addServer
@@ -1831,6 +1904,41 @@ class _TranslationsLibrariesSortLabelsZh extends TranslationsLibrariesSortLabels
@override String get lastEpisodeDateAdded => '最新一集添加日期';
}
+// Path: explore.rows
+class _TranslationsExploreRowsZh extends TranslationsExploreRowsEn {
+ _TranslationsExploreRowsZh._(TranslationsZh root) : this._root = root, super.internal(root);
+
+ final TranslationsZh _root; // ignore: unused_field
+
+ // Translations
+ @override String get watchlist => '想看列表';
+ @override String get recommendedMovies => '推荐电影';
+ @override String get recommendedShows => '推荐剧集';
+ @override String get trendingMovies => '趋势电影';
+ @override String get trendingShows => '趋势剧集';
+ @override String get popularMovies => '热门电影';
+ @override String get popularShows => '热门剧集';
+ @override String get suggestedAnime => '推荐动画';
+ @override String get airingAnime => '热门连载动画';
+ @override String get popularAnime => '最受欢迎动画';
+ @override String get trending => '趋势';
+ @override String get upcomingMovies => '即将上映的电影';
+ @override String get upcomingShows => '即将播出的剧集';
+}
+
+// Path: explore.status
+class _TranslationsExploreStatusZh extends TranslationsExploreStatusEn {
+ _TranslationsExploreStatusZh._(TranslationsZh root) : this._root = root, super.internal(root);
+
+ final TranslationsZh _root; // ignore: unused_field
+
+ // Translations
+ @override String get airing => '连载中';
+ @override String get ended => '已完结';
+ @override String get canceled => '已取消';
+ @override String get upcoming => '即将上线';
+}
+
// Path: companionRemote.session
class _TranslationsCompanionRemoteSessionZh extends TranslationsCompanionRemoteSessionEn {
_TranslationsCompanionRemoteSessionZh._(TranslationsZh root) : this._root = root, super.internal(root);
@@ -1927,9 +2035,9 @@ class _TranslationsCompanionRemoteErrorsZh extends TranslationsCompanionRemoteEr
@override String get connectionLost => '连接丢失';
}
-// Path: trackers.services
-class _TranslationsTrackersServicesZh extends TranslationsTrackersServicesEn {
- _TranslationsTrackersServicesZh._(TranslationsZh root) : this._root = root, super.internal(root);
+// Path: services.names
+class _TranslationsServicesNamesZh extends TranslationsServicesNamesEn {
+ _TranslationsServicesNamesZh._(TranslationsZh root) : this._root = root, super.internal(root);
final TranslationsZh _root; // ignore: unused_field
@@ -1937,11 +2045,12 @@ class _TranslationsTrackersServicesZh extends TranslationsTrackersServicesEn {
@override String get mal => 'MyAnimeList';
@override String get anilist => 'AniList';
@override String get simkl => 'Simkl';
+ @override String get seerr => 'Seerr';
}
-// Path: trackers.deviceCode
-class _TranslationsTrackersDeviceCodeZh extends TranslationsTrackersDeviceCodeEn {
- _TranslationsTrackersDeviceCodeZh._(TranslationsZh root) : this._root = root, super.internal(root);
+// Path: services.deviceCode
+class _TranslationsServicesDeviceCodeZh extends TranslationsServicesDeviceCodeEn {
+ _TranslationsServicesDeviceCodeZh._(TranslationsZh root) : this._root = root, super.internal(root);
final TranslationsZh _root; // ignore: unused_field
@@ -1953,9 +2062,9 @@ class _TranslationsTrackersDeviceCodeZh extends TranslationsTrackersDeviceCodeEn
@override String get codeCopied => '代码已复制';
}
-// Path: trackers.oauthProxy
-class _TranslationsTrackersOauthProxyZh extends TranslationsTrackersOauthProxyEn {
- _TranslationsTrackersOauthProxyZh._(TranslationsZh root) : this._root = root, super.internal(root);
+// Path: services.oauthProxy
+class _TranslationsServicesOauthProxyZh extends TranslationsServicesOauthProxyEn {
+ _TranslationsServicesOauthProxyZh._(TranslationsZh root) : this._root = root, super.internal(root);
final TranslationsZh _root; // ignore: unused_field
@@ -1966,9 +2075,9 @@ class _TranslationsTrackersOauthProxyZh extends TranslationsTrackersOauthProxyEn
@override String get urlCopied => 'URL 已复制';
}
-// Path: trackers.libraryFilter
-class _TranslationsTrackersLibraryFilterZh extends TranslationsTrackersLibraryFilterEn {
- _TranslationsTrackersLibraryFilterZh._(TranslationsZh root) : this._root = root, super.internal(root);
+// Path: services.libraryFilter
+class _TranslationsServicesLibraryFilterZh extends TranslationsServicesLibraryFilterEn {
+ _TranslationsServicesLibraryFilterZh._(TranslationsZh root) : this._root = root, super.internal(root);
final TranslationsZh _root; // ignore: unused_field
@@ -2232,8 +2341,8 @@ extension on TranslationsZh {
'settings.discordRichPresenceDescription' => '在 Discord 上显示您正在观看的内容',
'settings.trakt' => 'Trakt',
'settings.traktDescription' => '将观看历史与 Trakt 同步',
- 'settings.trackers' => '追踪器',
- 'settings.trackersDescription' => '将进度同步到 Trakt、MyAnimeList、AniList 和 Simkl',
+ 'settings.services' => '服务',
+ 'settings.servicesDescription' => '连接 Trakt、MyAnimeList、Seerr 等',
'settings.companionRemoteServer' => '配套遥控服务器',
'settings.companionRemoteServerDescription' => '允许网络上的移动设备控制此应用',
'settings.autoPip' => '自动画中画',
@@ -2389,7 +2498,7 @@ extension on TranslationsZh {
'rateSheet.setScore' => '设置分数',
'rateSheet.saved' => '已保存',
'rateSheet.notAvailable' => '未找到匹配项',
- 'rateSheet.noConnectedTrackers' => '在设置中连接跟踪器即可在那里评分。',
+ 'rateSheet.noConnectedServices' => '在设置中连接服务,即可在此评分。',
'accessibility.mediaCardMovie' => ({required Object title}) => '${title}, 电影',
'accessibility.mediaCardShow' => ({required Object title}) => '${title}, 电视剧',
'accessibility.mediaCardEpisode' => ({required Object title, required Object episodeInfo}) => '${title}, ${episodeInfo}',
@@ -2770,6 +2879,42 @@ extension on TranslationsZh {
'navigation.libraries' => '媒体库',
'navigation.downloads' => '下载',
'navigation.liveTv' => '电视直播',
+ 'navigation.explore' => '探索',
+ 'explore.title' => '探索',
+ 'explore.selectSource' => '选择来源',
+ 'explore.rows.watchlist' => '想看列表',
+ 'explore.rows.recommendedMovies' => '推荐电影',
+ 'explore.rows.recommendedShows' => '推荐剧集',
+ 'explore.rows.trendingMovies' => '趋势电影',
+ 'explore.rows.trendingShows' => '趋势剧集',
+ 'explore.rows.popularMovies' => '热门电影',
+ 'explore.rows.popularShows' => '热门剧集',
+ 'explore.rows.suggestedAnime' => '推荐动画',
+ 'explore.rows.airingAnime' => '热门连载动画',
+ 'explore.rows.popularAnime' => '最受欢迎动画',
+ 'explore.rows.trending' => '趋势',
+ 'explore.rows.upcomingMovies' => '即将上映的电影',
+ 'explore.rows.upcomingShows' => '即将播出的剧集',
+ 'explore.status.airing' => '连载中',
+ 'explore.status.ended' => '已完结',
+ 'explore.status.canceled' => '已取消',
+ 'explore.status.upcoming' => '即将上线',
+ 'explore.episodeCount' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, other: '${n} 集', ),
+ 'explore.cast' => '演员表',
+ 'explore.characters' => '角色',
+ 'explore.addToWatchlist' => '添加到想看列表',
+ 'explore.removeFromWatchlist' => '从想看列表移除',
+ 'explore.watchlistUpdateFailed' => '无法更新想看列表',
+ 'explore.notInLibrary' => '不在你的媒体库中',
+ 'explore.inTheseLibraries' => '在这些媒体库中',
+ 'explore.availableOn' => ({required Object server}) => '在 ${server} 上可用',
+ 'explore.checkingLibrary' => '正在检查你的媒体库...',
+ 'explore.emptyTitle' => '这里还什么都没有',
+ 'explore.emptyMessage' => ({required Object source}) => '当 ${source} 有内容时,相关内容将显示在这里。',
+ 'explore.searchHint' => ({required Object source}) => '搜索 ${source}',
+ 'explore.searchEmpty' => ({required Object query}) => '没有“${query}”的结果',
+ 'explore.searchPrompt' => ({required Object source}) => '在 ${source} 上搜索电影和剧集。',
+ 'explore.searchFailed' => '搜索失败。请检查网络连接后重试。',
'liveTv.title' => '电视直播',
'liveTv.guide' => '节目指南',
'liveTv.noChannels' => '没有可用的频道',
@@ -2985,6 +3130,8 @@ extension on TranslationsZh {
'downloads.cancelledDownloadMessage' => '此下载已取消。你想怎么做?',
'downloads.allEpisodesAlreadyDownloaded' => '所有剧集均已下载',
'downloads.resumeDownload' => '继续下载',
+ _ => null,
+ } ?? switch (path) {
'downloads.cancelledDownload' => '已取消的下载',
'downloads.syncingFile' => ({required Object file, required Object status}) => '${file}(正在同步 ${status})',
'downloads.downloadedFileClickToComplete' => ({required Object file}) => '已下载 ${file} — 点击完成',
@@ -3021,8 +3168,6 @@ extension on TranslationsZh {
'downloads.noSyncRules' => '没有同步规则',
'downloads.manageSyncRule' => '管理同步',
'downloads.editEpisodeCount' => '剧集数量',
- _ => null,
- } ?? switch (path) {
'downloads.editSyncFilter' => '同步筛选',
'downloads.syncAllItems' => '同步所有项目',
'downloads.syncUnwatchedItems' => '同步未观看项目',
@@ -3271,39 +3416,70 @@ extension on TranslationsZh {
'trakt.scrobbleDescription' => '在播放时向 Trakt 发送播放、暂停和停止事件。',
'trakt.watchedSync' => '同步已观看状态',
'trakt.watchedSyncDescription' => '在 Plezy 中将内容标记为已观看时,也会在 Trakt 上标记为已观看。',
- 'trackers.title' => '追踪器',
- 'trackers.hubSubtitle' => '与 Trakt 和其他服务同步观看进度。',
- 'trackers.notConnected' => '未连接',
- 'trackers.connectedAs' => ({required Object username}) => '已以 @${username} 身份连接',
- 'trackers.scrobble' => '自动记录进度',
- 'trackers.scrobbleDescription' => '观看完一集或一部电影后更新你的列表。',
- 'trackers.disconnectConfirm' => ({required Object service}) => '断开 ${service} 连接?',
- 'trackers.disconnectConfirmBody' => ({required Object service}) => 'Plezy 将停止更新 ${service}。可随时重新连接。',
- 'trackers.connectFailed' => ({required Object service}) => '无法连接到 ${service}。请重试。',
- 'trackers.services.mal' => 'MyAnimeList',
- 'trackers.services.anilist' => 'AniList',
- 'trackers.services.simkl' => 'Simkl',
- 'trackers.deviceCode.title' => ({required Object service}) => '在 ${service} 上激活 Plezy',
- 'trackers.deviceCode.body' => ({required Object url}) => '访问 ${url} 并输入此代码:',
- 'trackers.deviceCode.openToActivate' => ({required Object service}) => '打开 ${service} 以激活',
- 'trackers.deviceCode.waitingForAuthorization' => '等待授权…',
- 'trackers.deviceCode.codeCopied' => '代码已复制',
- 'trackers.oauthProxy.title' => ({required Object service}) => '登录 ${service}',
- 'trackers.oauthProxy.body' => '扫描此二维码,或在任意设备上打开 URL。',
- 'trackers.oauthProxy.openToSignIn' => ({required Object service}) => '打开 ${service} 以登录',
- 'trackers.oauthProxy.urlCopied' => 'URL 已复制',
- 'trackers.libraryFilter.title' => '媒体库筛选',
- 'trackers.libraryFilter.subtitleAllSyncing' => '同步所有媒体库',
- 'trackers.libraryFilter.subtitleNoneSyncing' => '不同步任何内容',
- 'trackers.libraryFilter.subtitleBlocked' => ({required Object count}) => '已屏蔽 ${count} 个',
- 'trackers.libraryFilter.subtitleAllowed' => ({required Object count}) => '已允许 ${count} 个',
- 'trackers.libraryFilter.mode' => '筛选模式',
- 'trackers.libraryFilter.modeBlacklist' => '黑名单',
- 'trackers.libraryFilter.modeWhitelist' => '白名单',
- 'trackers.libraryFilter.modeHintBlacklist' => '同步下方未勾选的所有媒体库。',
- 'trackers.libraryFilter.modeHintWhitelist' => '仅同步下方勾选的媒体库。',
- 'trackers.libraryFilter.libraries' => '媒体库',
- 'trackers.libraryFilter.noLibraries' => '没有可用的媒体库',
+ 'seerr.title' => 'Seerr',
+ 'seerr.connectTitle' => '连接 Seerr',
+ 'seerr.serverUrl' => '服务器 URL',
+ 'seerr.serverUrlHelper' => '你的 Seerr 实例的地址',
+ 'seerr.checkServer' => '继续',
+ 'seerr.signInWithJellyfin' => '使用 Jellyfin 登录',
+ 'seerr.signInWithEmby' => '使用 Emby 登录',
+ 'seerr.signInWithLocal' => '使用本地账户',
+ 'seerr.email' => '邮箱',
+ 'seerr.noSignInMethods' => '此 Seerr 实例未提供 Plezy 支持的登录方式。',
+ 'seerr.instance' => '实例',
+ 'seerr.disconnectConfirm' => '断开 Seerr 连接?',
+ 'seerr.disconnectConfirmBody' => 'Plezy 将忘记此 Seerr 实例。可随时重新连接。',
+ 'seerr.request' => '请求',
+ 'seerr.request4k' => '请求 4K',
+ 'seerr.seasons' => '季',
+ 'seerr.allSeasons' => '全部季',
+ 'seerr.advancedOptions' => '高级',
+ 'seerr.destinationServer' => '目标服务器',
+ 'seerr.qualityProfile' => '质量配置文件',
+ 'seerr.rootFolder' => '根目录',
+ 'seerr.languageProfile' => '语言配置文件',
+ 'seerr.requestSubmitted' => '请求已提交',
+ 'seerr.requestFailed' => ({required Object error}) => '请求失败: ${error}',
+ 'seerr.requestsLoadFailed' => '无法加载请求选项',
+ 'seerr.nothingToRequest' => '所有内容都已可用或已请求。',
+ 'seerr.statusAvailable' => '可用',
+ 'seerr.statusPartiallyAvailable' => '部分可用',
+ 'seerr.statusRequested' => '已请求',
+ 'seerr.statusProcessing' => '处理中',
+ 'services.title' => '服务',
+ 'services.hubSubtitle' => '同步观看进度并请求新内容。',
+ 'services.notConnected' => '未连接',
+ 'services.connectedAs' => ({required Object username}) => '已以 @${username} 身份连接',
+ 'services.scrobble' => '自动记录进度',
+ 'services.scrobbleDescription' => '观看完一集或一部电影后更新你的列表。',
+ 'services.disconnectConfirm' => ({required Object service}) => '断开 ${service} 连接?',
+ 'services.disconnectConfirmBody' => ({required Object service}) => 'Plezy 将停止更新 ${service}。可随时重新连接。',
+ 'services.connectFailed' => ({required Object service}) => '无法连接到 ${service}。请重试。',
+ 'services.names.mal' => 'MyAnimeList',
+ 'services.names.anilist' => 'AniList',
+ 'services.names.simkl' => 'Simkl',
+ 'services.names.seerr' => 'Seerr',
+ 'services.deviceCode.title' => ({required Object service}) => '在 ${service} 上激活 Plezy',
+ 'services.deviceCode.body' => ({required Object url}) => '访问 ${url} 并输入此代码:',
+ 'services.deviceCode.openToActivate' => ({required Object service}) => '打开 ${service} 以激活',
+ 'services.deviceCode.waitingForAuthorization' => '等待授权…',
+ 'services.deviceCode.codeCopied' => '代码已复制',
+ 'services.oauthProxy.title' => ({required Object service}) => '登录 ${service}',
+ 'services.oauthProxy.body' => '扫描此二维码,或在任意设备上打开 URL。',
+ 'services.oauthProxy.openToSignIn' => ({required Object service}) => '打开 ${service} 以登录',
+ 'services.oauthProxy.urlCopied' => 'URL 已复制',
+ 'services.libraryFilter.title' => '媒体库筛选',
+ 'services.libraryFilter.subtitleAllSyncing' => '同步所有媒体库',
+ 'services.libraryFilter.subtitleNoneSyncing' => '不同步任何内容',
+ 'services.libraryFilter.subtitleBlocked' => ({required Object count}) => '已屏蔽 ${count} 个',
+ 'services.libraryFilter.subtitleAllowed' => ({required Object count}) => '已允许 ${count} 个',
+ 'services.libraryFilter.mode' => '筛选模式',
+ 'services.libraryFilter.modeBlacklist' => '黑名单',
+ 'services.libraryFilter.modeWhitelist' => '白名单',
+ 'services.libraryFilter.modeHintBlacklist' => '同步下方未勾选的所有媒体库。',
+ 'services.libraryFilter.modeHintWhitelist' => '仅同步下方勾选的媒体库。',
+ 'services.libraryFilter.libraries' => '媒体库',
+ 'services.libraryFilter.noLibraries' => '没有可用的媒体库',
'addServer.addJellyfinTitle' => '添加 Jellyfin 服务器',
'addServer.serverUrls' => '服务器 URL',
'addServer.serverUrlsHelper' => '可输入多个 URL,以逗号分隔。',
diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json
index b95dc1de..8bd3d2d9 100644
--- a/lib/i18n/sv.i18n.json
+++ b/lib/i18n/sv.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "Visa vad du tittar på i Discord",
"trakt": "Trakt",
"traktDescription": "Synkronisera visningshistorik med Trakt",
- "trackers": "Spårare",
- "trackersDescription": "Synkronisera framsteg till Trakt, MyAnimeList, AniList och Simkl",
+ "services": "Tjänster",
+ "servicesDescription": "Anslut Trakt, MyAnimeList, Seerr med mera",
"companionRemoteServer": "Companion Remote-server",
"companionRemoteServerDescription": "Tillåt mobila enheter i ditt nätverk att styra denna app",
"autoPip": "Automatisk bild-i-bild",
@@ -416,7 +416,7 @@
"setScore": "Ange betyg",
"saved": "Sparat",
"notAvailable": "Ingen matchning hittades",
- "noConnectedTrackers": "Anslut en spårare i Inställningar för att betygsätta där."
+ "noConnectedServices": "Anslut en tjänst i Inställningar för att betygsätta där."
},
"accessibility": {
"mediaCardMovie": "${title}, film",
@@ -842,7 +842,52 @@
"navigation": {
"libraries": "Bibliotek",
"downloads": "Nerladdat",
- "liveTv": "Live-TV"
+ "liveTv": "Live-TV",
+ "explore": "Utforska"
+ },
+ "explore": {
+ "title": "Utforska",
+ "selectSource": "Välj källa",
+ "rows": {
+ "watchlist": "Bevakningslista",
+ "recommendedMovies": "Rekommenderade filmer",
+ "recommendedShows": "Rekommenderade serier",
+ "trendingMovies": "Trendande filmer",
+ "trendingShows": "Trendande serier",
+ "popularMovies": "Populära filmer",
+ "popularShows": "Populära serier",
+ "suggestedAnime": "Föreslagna anime",
+ "airingAnime": "Bästa pågående anime",
+ "popularAnime": "Mest populära anime",
+ "trending": "Trendar nu",
+ "upcomingMovies": "Kommande filmer",
+ "upcomingShows": "Kommande serier"
+ },
+ "status": {
+ "airing": "Pågår",
+ "ended": "Avslutad",
+ "canceled": "Nedlagd",
+ "upcoming": "Kommande"
+ },
+ "episodeCount": {
+ "one": "${n} avsnitt",
+ "other": "${n} avsnitt"
+ },
+ "cast": "Rollbesättning",
+ "characters": "Karaktärer",
+ "addToWatchlist": "Lägg till i bevakningslista",
+ "removeFromWatchlist": "Ta bort från bevakningslista",
+ "watchlistUpdateFailed": "Det gick inte att uppdatera bevakningslistan",
+ "notInLibrary": "Finns inte i ditt bibliotek",
+ "inTheseLibraries": "I dessa bibliotek",
+ "availableOn": "Tillgänglig på ${server}",
+ "checkingLibrary": "Kontrollerar ditt bibliotek...",
+ "emptyTitle": "Inget här ännu",
+ "emptyMessage": "Rader från ${source} visas här när de har innehåll.",
+ "searchHint": "Sök i ${source}",
+ "searchEmpty": "Inga resultat för \"${query}\"",
+ "searchPrompt": "Sök efter filmer och serier på ${source}.",
+ "searchFailed": "Sökningen misslyckades. Kontrollera din anslutning och försök igen."
},
"liveTv": {
"title": "Live-TV",
@@ -1384,9 +1429,41 @@
"watchedSync": "Synkronisera tittad-status",
"watchedSyncDescription": "När du markerar något som tittat i Plezy markeras det också på Trakt."
},
- "trackers": {
- "title": "Spårare",
- "hubSubtitle": "Synka tittförlopp med Trakt och andra tjänster.",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "Anslut Seerr",
+ "serverUrl": "Server-URL",
+ "serverUrlHelper": "Adressen till din Seerr-instans",
+ "checkServer": "Fortsätt",
+ "signInWithJellyfin": "Logga in med Jellyfin",
+ "signInWithEmby": "Logga in med Emby",
+ "signInWithLocal": "Använd ett lokalt konto",
+ "email": "E-post",
+ "noSignInMethods": "Den här Seerr-instansen erbjuder ingen inloggningsmetod som Plezy stöder.",
+ "instance": "Instans",
+ "disconnectConfirm": "Koppla från Seerr?",
+ "disconnectConfirmBody": "Plezy glömmer den här Seerr-instansen. Återanslut när som helst.",
+ "request": "Begär",
+ "request4k": "Begär i 4K",
+ "seasons": "Säsonger",
+ "allSeasons": "Alla säsonger",
+ "advancedOptions": "Avancerat",
+ "destinationServer": "Målserver",
+ "qualityProfile": "Kvalitetsprofil",
+ "rootFolder": "Rotmapp",
+ "languageProfile": "Språkprofil",
+ "requestSubmitted": "Begäran skickad",
+ "requestFailed": "Begäran misslyckades: ${error}",
+ "requestsLoadFailed": "Det gick inte att läsa in alternativ för begäran",
+ "nothingToRequest": "Allt är redan tillgängligt eller begärt.",
+ "statusAvailable": "Tillgänglig",
+ "statusPartiallyAvailable": "Delvis tillgänglig",
+ "statusRequested": "Begärd",
+ "statusProcessing": "Bearbetas"
+ },
+ "services": {
+ "title": "Tjänster",
+ "hubSubtitle": "Synkronisera dina framsteg och begär nya titlar.",
"notConnected": "Ej ansluten",
"connectedAs": "Ansluten som @${username}",
"scrobble": "Spåra framsteg automatiskt",
@@ -1394,10 +1471,11 @@
"disconnectConfirm": "Koppla från ${service}?",
"disconnectConfirmBody": "Plezy slutar uppdatera ${service}. Återanslut när som helst.",
"connectFailed": "Kunde inte ansluta till ${service}. Försök igen.",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "Aktivera Plezy på ${service}",
diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json
index f6dea236..99b58282 100644
--- a/lib/i18n/zh.i18n.json
+++ b/lib/i18n/zh.i18n.json
@@ -247,8 +247,8 @@
"discordRichPresenceDescription": "在 Discord 上显示您正在观看的内容",
"trakt": "Trakt",
"traktDescription": "将观看历史与 Trakt 同步",
- "trackers": "追踪器",
- "trackersDescription": "将进度同步到 Trakt、MyAnimeList、AniList 和 Simkl",
+ "services": "服务",
+ "servicesDescription": "连接 Trakt、MyAnimeList、Seerr 等",
"companionRemoteServer": "配套遥控服务器",
"companionRemoteServerDescription": "允许网络上的移动设备控制此应用",
"autoPip": "自动画中画",
@@ -416,7 +416,7 @@
"setScore": "设置分数",
"saved": "已保存",
"notAvailable": "未找到匹配项",
- "noConnectedTrackers": "在设置中连接跟踪器即可在那里评分。"
+ "noConnectedServices": "在设置中连接服务,即可在此评分。"
},
"accessibility": {
"mediaCardMovie": "${title}, 电影",
@@ -842,7 +842,51 @@
"navigation": {
"libraries": "媒体库",
"downloads": "下载",
- "liveTv": "电视直播"
+ "liveTv": "电视直播",
+ "explore": "探索"
+ },
+ "explore": {
+ "title": "探索",
+ "selectSource": "选择来源",
+ "rows": {
+ "watchlist": "想看列表",
+ "recommendedMovies": "推荐电影",
+ "recommendedShows": "推荐剧集",
+ "trendingMovies": "趋势电影",
+ "trendingShows": "趋势剧集",
+ "popularMovies": "热门电影",
+ "popularShows": "热门剧集",
+ "suggestedAnime": "推荐动画",
+ "airingAnime": "热门连载动画",
+ "popularAnime": "最受欢迎动画",
+ "trending": "趋势",
+ "upcomingMovies": "即将上映的电影",
+ "upcomingShows": "即将播出的剧集"
+ },
+ "status": {
+ "airing": "连载中",
+ "ended": "已完结",
+ "canceled": "已取消",
+ "upcoming": "即将上线"
+ },
+ "episodeCount": {
+ "other": "${n} 集"
+ },
+ "cast": "演员表",
+ "characters": "角色",
+ "addToWatchlist": "添加到想看列表",
+ "removeFromWatchlist": "从想看列表移除",
+ "watchlistUpdateFailed": "无法更新想看列表",
+ "notInLibrary": "不在你的媒体库中",
+ "inTheseLibraries": "在这些媒体库中",
+ "availableOn": "在 ${server} 上可用",
+ "checkingLibrary": "正在检查你的媒体库...",
+ "emptyTitle": "这里还什么都没有",
+ "emptyMessage": "当 ${source} 有内容时,相关内容将显示在这里。",
+ "searchHint": "搜索 ${source}",
+ "searchEmpty": "没有“${query}”的结果",
+ "searchPrompt": "在 ${source} 上搜索电影和剧集。",
+ "searchFailed": "搜索失败。请检查网络连接后重试。"
},
"liveTv": {
"title": "电视直播",
@@ -1383,9 +1427,41 @@
"watchedSync": "同步已观看状态",
"watchedSyncDescription": "在 Plezy 中将内容标记为已观看时,也会在 Trakt 上标记为已观看。"
},
- "trackers": {
- "title": "追踪器",
- "hubSubtitle": "与 Trakt 和其他服务同步观看进度。",
+ "seerr": {
+ "title": "Seerr",
+ "connectTitle": "连接 Seerr",
+ "serverUrl": "服务器 URL",
+ "serverUrlHelper": "你的 Seerr 实例的地址",
+ "checkServer": "继续",
+ "signInWithJellyfin": "使用 Jellyfin 登录",
+ "signInWithEmby": "使用 Emby 登录",
+ "signInWithLocal": "使用本地账户",
+ "email": "邮箱",
+ "noSignInMethods": "此 Seerr 实例未提供 Plezy 支持的登录方式。",
+ "instance": "实例",
+ "disconnectConfirm": "断开 Seerr 连接?",
+ "disconnectConfirmBody": "Plezy 将忘记此 Seerr 实例。可随时重新连接。",
+ "request": "请求",
+ "request4k": "请求 4K",
+ "seasons": "季",
+ "allSeasons": "全部季",
+ "advancedOptions": "高级",
+ "destinationServer": "目标服务器",
+ "qualityProfile": "质量配置文件",
+ "rootFolder": "根目录",
+ "languageProfile": "语言配置文件",
+ "requestSubmitted": "请求已提交",
+ "requestFailed": "请求失败: ${error}",
+ "requestsLoadFailed": "无法加载请求选项",
+ "nothingToRequest": "所有内容都已可用或已请求。",
+ "statusAvailable": "可用",
+ "statusPartiallyAvailable": "部分可用",
+ "statusRequested": "已请求",
+ "statusProcessing": "处理中"
+ },
+ "services": {
+ "title": "服务",
+ "hubSubtitle": "同步观看进度并请求新内容。",
"notConnected": "未连接",
"connectedAs": "已以 @${username} 身份连接",
"scrobble": "自动记录进度",
@@ -1393,10 +1469,11 @@
"disconnectConfirm": "断开 ${service} 连接?",
"disconnectConfirmBody": "Plezy 将停止更新 ${service}。可随时重新连接。",
"connectFailed": "无法连接到 ${service}。请重试。",
- "services": {
+ "names": {
"mal": "MyAnimeList",
"anilist": "AniList",
- "simkl": "Simkl"
+ "simkl": "Simkl",
+ "seerr": "Seerr"
},
"deviceCode": {
"title": "在 ${service} 上激活 Plezy",
diff --git a/lib/screens/settings/seerr_connect_screen.dart b/lib/screens/settings/seerr_connect_screen.dart
new file mode 100644
index 00000000..68059483
--- /dev/null
+++ b/lib/screens/settings/seerr_connect_screen.dart
@@ -0,0 +1,368 @@
+import 'package:flutter/material.dart';
+import 'package:material_symbols_icons/symbols.dart';
+import 'package:provider/provider.dart';
+
+import '../../focus/focusable_button.dart';
+import '../../focus/focusable_text_field.dart';
+import '../../i18n/strings.g.dart';
+import '../../mixins/controller_disposer_mixin.dart';
+import '../../models/seerr/seerr_public_settings.dart';
+import '../../models/seerr/seerr_session.dart';
+import '../../providers/seerr_account_provider.dart';
+import '../../services/seerr/seerr_constants.dart';
+import '../../services/seerr/seerr_exceptions.dart';
+import '../../theme/mono_tokens.dart';
+import '../../widgets/app_icon.dart';
+import '../../widgets/focused_scroll_scaffold.dart';
+import '../../widgets/loading_indicator_box.dart';
+import 'async_form_state_mixin.dart';
+
+/// Which credential form is on screen after the probe.
+enum _CredentialForm { none, jellyfin, emby, local }
+
+/// Two-step Seerr connect flow:
+/// 1. Probe the instance URL (`/settings/public`).
+/// 2. Sign in with one of the methods the instance supports — one-tap
+/// Plex (reusing the profile's stored token), Jellyfin/Emby
+/// credentials, or a local Seerr account.
+///
+/// The finished [SeerrSession] is handed to [SeerrAccountProvider.adoptSession]
+/// and the screen pops.
+class SeerrConnectScreen extends StatefulWidget {
+ const SeerrConnectScreen({super.key});
+
+ @override
+ State createState() => _SeerrConnectScreenState();
+}
+
+class _SeerrConnectScreenState extends State with AsyncFormStateMixin, ControllerDisposerMixin {
+ late final _urlController = createTextEditingController();
+ late final _identifierController = createTextEditingController();
+ late final _passwordController = createTextEditingController();
+ final _urlFocus = FocusNode(debugLabel: 'SeerrConnect:Url');
+ final _continueFocus = FocusNode(debugLabel: 'SeerrConnect:Continue');
+ final _changeServerFocus = FocusNode(debugLabel: 'SeerrConnect:ChangeServer');
+ final _identifierFocus = FocusNode(debugLabel: 'SeerrConnect:Identifier');
+ final _passwordFocus = FocusNode(debugLabel: 'SeerrConnect:Password');
+ final _formKey = GlobalKey();
+
+ SeerrPublicSettings? _instance;
+ String _baseUrl = '';
+ bool _plexTokenAvailable = false;
+ _CredentialForm _form = _CredentialForm.none;
+
+ @override
+ void dispose() {
+ _urlFocus.dispose();
+ _continueFocus.dispose();
+ _changeServerFocus.dispose();
+ _identifierFocus.dispose();
+ _passwordFocus.dispose();
+ super.dispose();
+ }
+
+ bool get _offersPlex {
+ final instance = _instance;
+ return instance != null &&
+ instance.mediaServerLogin &&
+ instance.mediaServerType == SeerrMediaServerType.plex &&
+ _plexTokenAvailable;
+ }
+
+ _CredentialForm get _mediaServerForm {
+ final instance = _instance;
+ if (instance == null || !instance.mediaServerLogin) return _CredentialForm.none;
+ return switch (instance.mediaServerType) {
+ SeerrMediaServerType.jellyfin => _CredentialForm.jellyfin,
+ SeerrMediaServerType.emby => _CredentialForm.emby,
+ _ => _CredentialForm.none,
+ };
+ }
+
+ Future _probe() async {
+ final input = _urlController.text.trim();
+ if (input.isEmpty) {
+ setErrorText(t.addServer.required);
+ return;
+ }
+ // Bare hosts are common ("seerr.example.com") — default to https.
+ final url = input.contains('://') ? input : 'https://$input';
+ await runAsync(() async {
+ final account = context.read();
+ final settings = await account.authService.probe(url);
+ final plexToken = await account.resolvePlexToken();
+ if (!mounted) return;
+ setState(() {
+ _instance = settings;
+ _baseUrl = url;
+ _plexTokenAvailable = plexToken != null && plexToken.isNotEmpty;
+ // With exactly one credential form on offer, skip the method list.
+ final mediaForm = _mediaServerForm;
+ if (!_offersPlex && mediaForm != _CredentialForm.none && !settings.localLogin) {
+ _form = mediaForm;
+ } else if (!_offersPlex && mediaForm == _CredentialForm.none && settings.localLogin) {
+ _form = _CredentialForm.local;
+ } else {
+ _form = _CredentialForm.none;
+ }
+ });
+ }, errorMapper: _describeError);
+ }
+
+ Future _signInWithPlex() async {
+ await runAsync(() async {
+ final account = context.read();
+ final token = await account.resolvePlexToken();
+ if (token == null || token.isEmpty) throw const SeerrAuthException('No Plex token available');
+ final session = await account.authService.signInWithPlex(baseUrl: _baseUrl, plexToken: token);
+ await _finish(account, session);
+ }, errorMapper: _describeError);
+ }
+
+ Future _signInWithCredentials() async {
+ if (!(_formKey.currentState?.validate() ?? false)) return;
+ final form = _form;
+ await runAsync(() async {
+ final account = context.read();
+ final identifier = _identifierController.text.trim();
+ final password = _passwordController.text;
+ final session = switch (form) {
+ _CredentialForm.jellyfin || _CredentialForm.emby => await account.authService.signInWithJellyfin(
+ baseUrl: _baseUrl,
+ username: identifier,
+ password: password,
+ emby: form == _CredentialForm.emby,
+ ),
+ _CredentialForm.local => await account.authService.signInWithLocal(
+ baseUrl: _baseUrl,
+ email: identifier,
+ password: password,
+ ),
+ _CredentialForm.none => throw StateError('no credential form selected'),
+ };
+ await _finish(account, session);
+ }, errorMapper: _describeError);
+ }
+
+ Future _finish(SeerrAccountProvider account, SeerrSession session) async {
+ await account.adoptSession(session.copyWith(instanceLabel: _instance?.instanceLabel));
+ if (!mounted) return;
+ Navigator.of(context).pop(true);
+ }
+
+ String _describeError(Object e) => switch (e) {
+ SeerrUrlException(:final message) => message,
+ SeerrAuthException(:final message) => message,
+ _ => t.addServer.couldNotReachServer(error: e.toString()),
+ };
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return FocusedScrollScaffold(
+ title: Text(t.seerr.connectTitle),
+ slivers: [
+ SliverPadding(
+ padding: const EdgeInsets.all(16),
+ sliver: SliverToBoxAdapter(
+ child: Form(
+ key: _formKey,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: _instance == null ? _buildUrlStep(theme) : _buildSignInStep(theme),
+ ),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+
+ List _buildUrlStep(ThemeData theme) {
+ return [
+ FocusableTextFormField(
+ controller: _urlController,
+ focusNode: _urlFocus,
+ autofocus: true,
+ tvKeyboardAutoOpenBehavior: TvKeyboardAutoOpenBehavior.afterFirstFocus,
+ keyboardType: TextInputType.url,
+ autocorrect: false,
+ enableSuggestions: false,
+ enabled: !busy,
+ onNavigateDown: () => _continueFocus.requestFocus(),
+ textInputAction: TextInputAction.go,
+ onFieldSubmitted: busy ? null : (_) => _probe(),
+ decoration: InputDecoration(
+ labelText: t.seerr.serverUrl,
+ // URL example — intentionally not localized.
+ hintText: 'https://seerr.example.com',
+ helperText: t.seerr.serverUrlHelper,
+ prefixIcon: const AppIcon(Symbols.link_rounded, fill: 1),
+ ),
+ ),
+ const SizedBox(height: 16),
+ FocusableButton(
+ focusNode: _continueFocus,
+ useBackgroundFocus: true,
+ onNavigateUp: () => _urlFocus.requestFocus(),
+ onPressed: busy ? null : _probe,
+ child: FilledButton.icon(
+ onPressed: busy ? null : _probe,
+ icon: busy ? const LoadingIndicatorBox() : const AppIcon(Symbols.travel_explore_rounded, fill: 1),
+ label: Text(t.seerr.checkServer),
+ ),
+ ),
+ ...buildInlineError(theme),
+ ];
+ }
+
+ List _buildSignInStep(ThemeData theme) {
+ final instance = _instance!;
+ final mediaForm = _mediaServerForm;
+ final showLocalOption = instance.localLogin && _form != _CredentialForm.local;
+ final showMediaOption = mediaForm != _CredentialForm.none && _form != mediaForm;
+ final noMethods = !_offersPlex && mediaForm == _CredentialForm.none && !instance.localLogin;
+ return [
+ _buildInstanceCard(theme, instance),
+ const SizedBox(height: 16),
+ if (noMethods)
+ Text(t.seerr.noSignInMethods, style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.error))
+ else ...[
+ if (_offersPlex) ...[
+ FocusableButton(
+ useBackgroundFocus: true,
+ onPressed: busy ? null : _signInWithPlex,
+ child: FilledButton.icon(
+ onPressed: busy ? null : _signInWithPlex,
+ icon: busy ? const LoadingIndicatorBox() : const AppIcon(Symbols.login_rounded, fill: 1),
+ label: Text(t.auth.signInWithPlex),
+ ),
+ ),
+ const SizedBox(height: 12),
+ ],
+ if (_form != _CredentialForm.none) ..._buildCredentialFields(theme),
+ if (showMediaOption)
+ _buildMethodButton(
+ label: mediaForm == _CredentialForm.emby ? t.seerr.signInWithEmby : t.seerr.signInWithJellyfin,
+ onPressed: () => _switchForm(mediaForm),
+ ),
+ if (showLocalOption)
+ _buildMethodButton(label: t.seerr.signInWithLocal, onPressed: () => _switchForm(_CredentialForm.local)),
+ ],
+ ...buildInlineError(theme),
+ ];
+ }
+
+ void _switchForm(_CredentialForm form) {
+ setState(() {
+ _form = form;
+ _identifierController.clear();
+ _passwordController.clear();
+ });
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ if (mounted && _identifierFocus.canRequestFocus) _identifierFocus.requestFocus();
+ });
+ }
+
+ Widget _buildMethodButton({required String label, required VoidCallback onPressed}) {
+ return Padding(
+ padding: const EdgeInsets.only(bottom: 12),
+ child: FocusableButton(
+ useBackgroundFocus: true,
+ onPressed: busy ? null : onPressed,
+ child: OutlinedButton(onPressed: busy ? null : onPressed, child: Text(label)),
+ ),
+ );
+ }
+
+ List _buildCredentialFields(ThemeData theme) {
+ final isLocal = _form == _CredentialForm.local;
+ return [
+ FocusableTextFormField(
+ controller: _identifierController,
+ focusNode: _identifierFocus,
+ autocorrect: false,
+ enableSuggestions: false,
+ enabled: !busy,
+ keyboardType: isLocal ? TextInputType.emailAddress : TextInputType.text,
+ textInputAction: TextInputAction.next,
+ onFieldSubmitted: busy ? null : (_) => _passwordFocus.requestFocus(),
+ decoration: InputDecoration(
+ labelText: isLocal ? t.seerr.email : t.addServer.username,
+ prefixIcon: AppIcon(isLocal ? Symbols.mail_rounded : Symbols.person_rounded, fill: 1),
+ ),
+ validator: (v) => v == null || v.trim().isEmpty ? t.addServer.required : null,
+ ),
+ const SizedBox(height: 12),
+ FocusableTextFormField(
+ controller: _passwordController,
+ focusNode: _passwordFocus,
+ obscureText: true,
+ enabled: !busy,
+ textInputAction: TextInputAction.done,
+ onFieldSubmitted: busy ? null : (_) => _signInWithCredentials(),
+ decoration: InputDecoration(
+ labelText: t.addServer.password,
+ prefixIcon: const AppIcon(Symbols.lock_rounded, fill: 1),
+ ),
+ validator: (v) => v == null || v.isEmpty ? t.addServer.required : null,
+ ),
+ const SizedBox(height: 16),
+ FocusableButton(
+ useBackgroundFocus: true,
+ onPressed: busy ? null : _signInWithCredentials,
+ child: FilledButton.icon(
+ onPressed: busy ? null : _signInWithCredentials,
+ icon: busy ? const LoadingIndicatorBox() : const AppIcon(Symbols.login_rounded, fill: 1),
+ label: Text(t.addServer.signIn),
+ ),
+ ),
+ const SizedBox(height: 12),
+ ];
+ }
+
+ Widget _buildInstanceCard(ThemeData theme, SeerrPublicSettings instance) {
+ return Container(
+ padding: const EdgeInsets.all(12),
+ decoration: BoxDecoration(
+ color: theme.colorScheme.surfaceContainerHighest,
+ borderRadius: BorderRadius.circular(tokens(context).radiusMd),
+ ),
+ child: Row(
+ children: [
+ const AppIcon(Symbols.cloud_done_rounded, fill: 1),
+ const SizedBox(width: 12),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(instance.instanceLabel, style: theme.textTheme.titleSmall),
+ Text(
+ _baseUrl,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ style: theme.textTheme.bodySmall?.copyWith(color: theme.colorScheme.onSurface.withValues(alpha: 0.7)),
+ ),
+ ],
+ ),
+ ),
+ FocusableButton(
+ focusNode: _changeServerFocus,
+ useBackgroundFocus: true,
+ onPressed: busy ? null : _resetToUrlStep,
+ child: TextButton(onPressed: busy ? null : _resetToUrlStep, child: Text(t.addServer.change)),
+ ),
+ ],
+ ),
+ );
+ }
+
+ void _resetToUrlStep() {
+ setState(() {
+ _instance = null;
+ _form = _CredentialForm.none;
+ _identifierController.clear();
+ _passwordController.clear();
+ });
+ }
+}
diff --git a/lib/screens/settings/seerr_settings_screen.dart b/lib/screens/settings/seerr_settings_screen.dart
new file mode 100644
index 00000000..9e47d191
--- /dev/null
+++ b/lib/screens/settings/seerr_settings_screen.dart
@@ -0,0 +1,87 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:material_symbols_icons/symbols.dart';
+import 'package:provider/provider.dart';
+
+import '../../i18n/strings.g.dart';
+import '../../models/seerr/seerr_session.dart';
+import '../../providers/seerr_account_provider.dart';
+import '../../utils/dialogs.dart';
+import '../../widgets/app_icon.dart';
+import '../../widgets/settings_page.dart';
+import '../../widgets/settings_section.dart';
+
+/// Connected-state settings for the Seerr instance: who is signed in,
+/// which instance, and disconnect.
+class SeerrSettingsScreen extends StatelessWidget {
+ const SeerrSettingsScreen({super.key});
+
+ Future _disconnect(BuildContext context, SeerrAccountProvider account) async {
+ final confirmed = await showConfirmDialog(
+ context,
+ title: t.seerr.disconnectConfirm,
+ message: t.seerr.disconnectConfirmBody,
+ confirmText: t.common.disconnect,
+ isDestructive: true,
+ );
+ if (!confirmed) return;
+ await account.disconnect();
+ // build()'s post-frame handler pops the screen once the provider rebuilds
+ // with isConnected == false — don't pop here too.
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Consumer(
+ builder: (context, account, _) {
+ final session = account.session;
+ // Safety net: if the session got invalidated in the background, bail
+ // out — the Services hub row is the entry point for reconnecting.
+ if (session == null) {
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ if (context.mounted) Navigator.of(context).pop();
+ });
+ return SettingsPage(title: Text(t.seerr.title), children: const []);
+ }
+
+ final methodLabel = switch (session.method) {
+ SeerrAuthMethod.plex => 'Plex',
+ SeerrAuthMethod.jellyfin => 'Jellyfin',
+ SeerrAuthMethod.emby => 'Emby',
+ SeerrAuthMethod.local => t.seerr.email,
+ };
+ return SettingsPage(
+ title: Text(t.seerr.title),
+ children: [
+ SettingsGroup(
+ children: [
+ ListTile(
+ leading: const AppIcon(Symbols.account_circle_rounded, fill: 1),
+ title: Text(t.services.connectedAs(username: session.displayName)),
+ subtitle: Text(methodLabel),
+ ),
+ ListTile(
+ leading: const AppIcon(Symbols.dns_rounded, fill: 1),
+ title: Text(session.instanceLabel.isNotEmpty ? session.instanceLabel : t.seerr.instance),
+ subtitle: Text(session.baseUrl),
+ ),
+ ],
+ ),
+ const SizedBox(height: 24),
+ SettingsGroup(
+ children: [
+ ListTile(
+ leading: AppIcon(Symbols.link_off_rounded, fill: 1, color: Theme.of(context).colorScheme.error),
+ title: Text(t.common.disconnect, style: TextStyle(color: Theme.of(context).colorScheme.error)),
+ onTap: () => unawaited(_disconnect(context, account)),
+ ),
+ ],
+ ),
+ const SizedBox(height: 24),
+ ],
+ );
+ },
+ );
+ }
+}
diff --git a/lib/screens/settings/trackers_settings_screen.dart b/lib/screens/settings/services_settings_screen.dart
similarity index 62%
rename from lib/screens/settings/trackers_settings_screen.dart
rename to lib/screens/settings/services_settings_screen.dart
index d40b1773..114a2c2e 100644
--- a/lib/screens/settings/trackers_settings_screen.dart
+++ b/lib/screens/settings/services_settings_screen.dart
@@ -1,39 +1,43 @@
import 'package:flutter/material.dart';
-import 'package:flutter_svg/flutter_svg.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:provider/provider.dart';
import '../../i18n/strings.g.dart';
+import '../../providers/seerr_account_provider.dart';
import '../../providers/trackers_provider.dart';
import '../../providers/trakt_account_provider.dart';
import '../../widgets/app_icon.dart';
+import '../../widgets/catalog_source_logo.dart';
import '../../widgets/focused_scroll_scaffold.dart';
import '../../widgets/settings_section.dart';
+import 'seerr_connect_screen.dart';
+import 'seerr_settings_screen.dart';
import 'tracker_settings_screen.dart';
import 'trakt_settings_screen.dart';
-/// Unified hub for all watch-progress trackers: Trakt, MyAnimeList, AniList,
-/// Simkl. Each row opens its service-specific settings screen.
-class TrackersSettingsScreen extends StatelessWidget {
- const TrackersSettingsScreen({super.key});
+/// Unified hub for all connected services: the watch-progress trackers
+/// (Trakt, MyAnimeList, AniList, Simkl) and the Seerr request server. Each
+/// row opens its service-specific settings screen.
+class ServicesSettingsScreen extends StatelessWidget {
+ const ServicesSettingsScreen({super.key});
@override
Widget build(BuildContext context) {
return FocusedScrollScaffold(
- title: Text(t.trackers.title),
+ title: Text(t.services.title),
slivers: [
SliverList(
delegate: SliverChildListDelegate([
Padding(
padding: const EdgeInsets.fromLTRB(16, 8, 16, 16),
child: Text(
- t.trackers.hubSubtitle,
+ t.services.hubSubtitle,
style: Theme.of(
context,
).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant),
),
),
- SettingsGroup(children: [_trakt(), _mal(), _anilist(), _simkl()]),
+ SettingsGroup(children: [_trakt(), _mal(), _anilist(), _simkl(), _seerr()]),
const SizedBox(height: 24),
]),
),
@@ -42,8 +46,8 @@ class TrackersSettingsScreen extends StatelessWidget {
}
Widget _trakt() => Consumer(
- builder: (context, account, _) => _TrackerHubRow(
- leading: const _TrackerLogo('assets/trakt_circlemark.svg'),
+ builder: (context, account, _) => _ServiceHubRow(
+ leading: const CatalogSourceLogo.asset('assets/trakt_circlemark.svg', size: 24),
title: t.trakt.title,
username: account.isConnected ? account.username : null,
onTap: () {
@@ -57,9 +61,9 @@ class TrackersSettingsScreen extends StatelessWidget {
);
Widget _mal() => Consumer(
- builder: (context, account, _) => _TrackerHubRow(
- leading: const _TrackerLogo('assets/mal_mark.svg'),
- title: t.trackers.services.mal,
+ builder: (context, account, _) => _ServiceHubRow(
+ leading: const CatalogSourceLogo.asset('assets/mal_mark.svg', size: 24),
+ title: t.services.names.mal,
username: account.isMalConnected ? account.malUsername : null,
onTap: () {
if (account.isMalConnected) {
@@ -75,9 +79,9 @@ class TrackersSettingsScreen extends StatelessWidget {
);
Widget _anilist() => Consumer(
- builder: (context, account, _) => _TrackerHubRow(
- leading: const _TrackerLogo('assets/anilist_mark.svg'),
- title: t.trackers.services.anilist,
+ builder: (context, account, _) => _ServiceHubRow(
+ leading: const CatalogSourceLogo.asset('assets/anilist_mark.svg', size: 24),
+ title: t.services.names.anilist,
username: account.isAnilistConnected ? account.anilistUsername : null,
onTap: () {
if (account.isAnilistConnected) {
@@ -93,9 +97,9 @@ class TrackersSettingsScreen extends StatelessWidget {
);
Widget _simkl() => Consumer(
- builder: (context, account, _) => _TrackerHubRow(
- leading: const _TrackerLogo('assets/simkl_mark.svg'),
- title: t.trackers.services.simkl,
+ builder: (context, account, _) => _ServiceHubRow(
+ leading: const CatalogSourceLogo.asset('assets/simkl_mark.svg', size: 24),
+ title: t.services.names.simkl,
username: account.isSimklConnected ? account.simklUsername : null,
onTap: () {
if (account.isSimklConnected) {
@@ -109,9 +113,25 @@ class TrackersSettingsScreen extends StatelessWidget {
},
),
);
+
+ Widget _seerr() => Consumer(
+ builder: (context, account, _) => _ServiceHubRow(
+ leading: const CatalogSourceLogo.asset('assets/seerr_mark.svg', size: 24),
+ title: t.services.names.seerr,
+ username: account.isConnected ? account.displayName : null,
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (_) => account.isConnected ? const SeerrSettingsScreen() : const SeerrConnectScreen(),
+ ),
+ );
+ },
+ ),
+ );
}
-class _TrackerHubRow extends StatelessWidget {
+class _ServiceHubRow extends StatelessWidget {
final Widget leading;
final String title;
@@ -120,30 +140,16 @@ class _TrackerHubRow extends StatelessWidget {
final VoidCallback onTap;
- const _TrackerHubRow({required this.leading, required this.title, required this.username, required this.onTap});
+ const _ServiceHubRow({required this.leading, required this.title, required this.username, required this.onTap});
@override
Widget build(BuildContext context) {
return ListTile(
leading: leading,
title: Text(title),
- subtitle: Text(username != null ? t.trackers.connectedAs(username: username!) : t.trackers.notConnected),
+ subtitle: Text(username != null ? t.services.connectedAs(username: username!) : t.services.notConnected),
trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1),
onTap: onTap,
);
}
}
-
-/// 24x24 SVG logo driven by [IconTheme]. Uses [SvgTheme.currentColor] so SVGs
-/// with multiple explicit fills (AniList keeps its brand-blue L while the A
-/// follows the theme) render correctly alongside single-color wordmarks.
-class _TrackerLogo extends StatelessWidget {
- final String asset;
- const _TrackerLogo(this.asset);
-
- @override
- Widget build(BuildContext context) {
- final color = IconTheme.of(context).color ?? Theme.of(context).colorScheme.onSurface;
- return SvgPicture.asset(asset, width: 24, height: 24, theme: SvgTheme(currentColor: color));
- }
-}
diff --git a/lib/screens/settings/settings_screen.dart b/lib/screens/settings/settings_screen.dart
index 1c7556a9..7407a708 100644
--- a/lib/screens/settings/settings_screen.dart
+++ b/lib/screens/settings/settings_screen.dart
@@ -24,6 +24,7 @@ import '../../services/file_picker_service.dart';
import '../../services/saf_storage_service.dart';
import '../../services/settings_export_service.dart';
import '../../providers/theme_provider.dart';
+import '../../providers/seerr_account_provider.dart';
import '../../providers/trackers_provider.dart';
import '../../providers/trakt_account_provider.dart';
import '../../services/keyboard_shortcuts_service.dart';
@@ -48,7 +49,7 @@ import 'keyboard_shortcuts_screen.dart';
import 'logs_screen.dart';
import 'playback_settings_screen.dart';
import '../profile/profile_switch_screen.dart';
-import 'trackers_settings_screen.dart';
+import 'services_settings_screen.dart';
import '../../widgets/loading_indicator_box.dart';
class SettingsScreen extends StatefulWidget {
@@ -66,7 +67,7 @@ class _SettingsScreenState extends State with FocusableTab, Moun
static const _kAppearance = 'appearance';
static const _kPlayback = 'playback';
static const _kManageLibraries = 'manage_libraries';
- static const _kTrackers = 'trackers';
+ static const _kServices = 'services';
static const _kDownloadLocation = 'download_location';
static const _kDownloadOnWifiOnly = 'download_on_wifi_only';
static const _kAutoRemoveWatchedDownloads = 'auto_remove_watched_downloads';
@@ -155,7 +156,7 @@ class _SettingsScreenState extends State with FocusableTab, Moun
_buildAppearanceTile(),
_buildPlaybackTile(),
if (hasLibraries) _buildManageLibrariesTile(),
- _buildTrackersTile(),
+ _buildServicesTile(),
],
),
@@ -248,22 +249,23 @@ class _SettingsScreenState extends State with FocusableTab, Moun
);
}
- Widget _buildTrackersTile() {
- return Consumer2(
- builder: (context, trakt, trackers, _) {
+ Widget _buildServicesTile() {
+ return Consumer3(
+ builder: (context, trakt, trackers, seerr, _) {
final connectedNames = [
if (trakt.isConnected) t.trakt.title,
- if (trackers.isMalConnected) t.trackers.services.mal,
- if (trackers.isAnilistConnected) t.trackers.services.anilist,
- if (trackers.isSimklConnected) t.trackers.services.simkl,
+ if (trackers.isMalConnected) t.services.names.mal,
+ if (trackers.isAnilistConnected) t.services.names.anilist,
+ if (trackers.isSimklConnected) t.services.names.simkl,
+ if (seerr.isConnected) t.services.names.seerr,
];
- final subtitle = connectedNames.isEmpty ? t.settings.trackersDescription : connectedNames.join(' · ');
+ final subtitle = connectedNames.isEmpty ? t.settings.servicesDescription : connectedNames.join(' · ');
return SettingNavigationTile(
- focusNode: _focusTracker.get(_kTrackers),
+ focusNode: _focusTracker.get(_kServices),
icon: Symbols.sync_rounded,
- title: t.settings.trackers,
+ title: t.settings.services,
subtitle: subtitle,
- destinationBuilder: (_) => const TrackersSettingsScreen(),
+ destinationBuilder: (_) => const ServicesSettingsScreen(),
);
},
);
diff --git a/lib/screens/settings/tracker_account_settings_body.dart b/lib/screens/settings/tracker_account_settings_body.dart
index b228a73a..31b88c62 100644
--- a/lib/screens/settings/tracker_account_settings_body.dart
+++ b/lib/screens/settings/tracker_account_settings_body.dart
@@ -78,7 +78,7 @@ class TrackerAccountSettingsBody extends StatelessWidget {
final settings = SettingsService.instance;
return ListTile(
leading: const AppIcon(Symbols.filter_list_rounded, fill: 1),
- title: Text(t.trackers.libraryFilter.title),
+ title: Text(t.services.libraryFilter.title),
subtitle: Text(TrackerLibraryFilterScreen.subtitleFor(settings, service)),
trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1),
onTap: () => Navigator.of(
diff --git a/lib/screens/settings/tracker_connect_launcher.dart b/lib/screens/settings/tracker_connect_launcher.dart
index a1587796..2dfb9b05 100644
--- a/lib/screens/settings/tracker_connect_launcher.dart
+++ b/lib/screens/settings/tracker_connect_launcher.dart
@@ -62,6 +62,6 @@ Future launchTrackerConnect(
Navigator.of(context).pop();
}
if (!ok) {
- showAppSnackBar(context, t.trackers.connectFailed(service: serviceName));
+ showAppSnackBar(context, t.services.connectFailed(service: serviceName));
}
}
diff --git a/lib/screens/settings/tracker_library_filter_screen.dart b/lib/screens/settings/tracker_library_filter_screen.dart
index bd08ba21..e16a4344 100644
--- a/lib/screens/settings/tracker_library_filter_screen.dart
+++ b/lib/screens/settings/tracker_library_filter_screen.dart
@@ -29,18 +29,18 @@ class TrackerLibraryFilterScreen extends StatelessWidget {
final ids = settings.read(SettingsService.trackerFilterIdsPref(service)).toSet();
if (ids.isEmpty) {
return mode == TrackerLibraryFilterMode.blacklist
- ? t.trackers.libraryFilter.subtitleAllSyncing
- : t.trackers.libraryFilter.subtitleNoneSyncing;
+ ? t.services.libraryFilter.subtitleAllSyncing
+ : t.services.libraryFilter.subtitleNoneSyncing;
}
final count = ids.length.toString();
return mode == TrackerLibraryFilterMode.blacklist
- ? t.trackers.libraryFilter.subtitleBlocked(count: count)
- : t.trackers.libraryFilter.subtitleAllowed(count: count);
+ ? t.services.libraryFilter.subtitleBlocked(count: count)
+ : t.services.libraryFilter.subtitleAllowed(count: count);
}
@override
Widget build(BuildContext context) {
- final title = Text(t.trackers.libraryFilter.title);
+ final title = Text(t.services.libraryFilter.title);
final modePref = SettingsService.trackerFilterModePref(service);
final idsPref = SettingsService.trackerFilterIdsPref(service);
@@ -79,8 +79,8 @@ class TrackerLibraryFilterScreen extends StatelessWidget {
padding: const EdgeInsets.fromLTRB(16, 8, 16, 16),
child: Text(
mode == TrackerLibraryFilterMode.blacklist
- ? t.trackers.libraryFilter.modeHintBlacklist
- : t.trackers.libraryFilter.modeHintWhitelist,
+ ? t.services.libraryFilter.modeHintBlacklist
+ : t.services.libraryFilter.modeHintWhitelist,
style: theme.textTheme.bodyMedium?.copyWith(color: theme.colorScheme.onSurfaceVariant),
),
),
@@ -89,15 +89,15 @@ class TrackerLibraryFilterScreen extends StatelessWidget {
SettingSegmentedTile(
pref: modePref,
icon: Symbols.filter_list_rounded,
- title: t.trackers.libraryFilter.mode,
+ title: t.services.libraryFilter.mode,
segments: [
ButtonSegment(
value: TrackerLibraryFilterMode.blacklist,
- label: Text(t.trackers.libraryFilter.modeBlacklist),
+ label: Text(t.services.libraryFilter.modeBlacklist),
),
ButtonSegment(
value: TrackerLibraryFilterMode.whitelist,
- label: Text(t.trackers.libraryFilter.modeWhitelist),
+ label: Text(t.services.libraryFilter.modeWhitelist),
),
],
decode: (v) => v,
@@ -110,8 +110,8 @@ class TrackerLibraryFilterScreen extends StatelessWidget {
if (libraries.isEmpty) {
children.add(
SettingsGroup(
- title: t.trackers.libraryFilter.libraries,
- children: [ListTile(title: Text(t.trackers.libraryFilter.noLibraries))],
+ title: t.services.libraryFilter.libraries,
+ children: [ListTile(title: Text(t.services.libraryFilter.noLibraries))],
),
);
} else if (showServerHeaders) {
@@ -126,7 +126,7 @@ class TrackerLibraryFilterScreen extends StatelessWidget {
} else {
children.add(
SettingsGroup(
- title: t.trackers.libraryFilter.libraries,
+ title: t.services.libraryFilter.libraries,
children: [
for (final libs in grouped.values)
for (final lib in libs) libraryTile(lib),
diff --git a/lib/screens/settings/tracker_settings_screen.dart b/lib/screens/settings/tracker_settings_screen.dart
index a267dc21..d67a1ebc 100644
--- a/lib/screens/settings/tracker_settings_screen.dart
+++ b/lib/screens/settings/tracker_settings_screen.dart
@@ -20,7 +20,7 @@ import 'tracker_connect_launcher.dart';
Future startMalConnection(BuildContext context) {
final account = context.read();
- final name = t.trackers.services.mal;
+ final name = t.services.names.mal;
return launchTrackerConnect(
context,
isBusyOrConnected: account.isConnecting(TrackerService.mal) || account.isMalConnected,
@@ -34,7 +34,7 @@ Future startMalConnection(BuildContext context) {
Future startAnilistConnection(BuildContext context) {
final account = context.read();
- final name = t.trackers.services.anilist;
+ final name = t.services.names.anilist;
return launchTrackerConnect(
context,
isBusyOrConnected: account.isConnecting(TrackerService.anilist) || account.isAnilistConnected,
@@ -48,7 +48,7 @@ Future startAnilistConnection(BuildContext context) {
Future startSimklConnection(BuildContext context) {
final account = context.read();
- final name = t.trackers.services.simkl;
+ final name = t.services.names.simkl;
return launchTrackerConnect(
context,
isBusyOrConnected: account.isConnecting(TrackerService.simkl) || account.isSimklConnected,
@@ -83,7 +83,7 @@ class TrackerConfig {
static TrackerConfig mal() => TrackerConfig(
service: TrackerService.mal,
- displayName: t.trackers.services.mal,
+ displayName: t.services.names.mal,
isConnected: (a) => a.isMalConnected,
username: (a) => a.malUsername,
scrobblePref: SettingsService.enableMalScrobble,
@@ -93,7 +93,7 @@ class TrackerConfig {
static TrackerConfig anilist() => TrackerConfig(
service: TrackerService.anilist,
- displayName: t.trackers.services.anilist,
+ displayName: t.services.names.anilist,
isConnected: (a) => a.isAnilistConnected,
username: (a) => a.anilistUsername,
scrobblePref: SettingsService.enableAnilistScrobble,
@@ -103,7 +103,7 @@ class TrackerConfig {
static TrackerConfig simkl() => TrackerConfig(
service: TrackerService.simkl,
- displayName: t.trackers.services.simkl,
+ displayName: t.services.names.simkl,
isConnected: (a) => a.isSimklConnected,
username: (a) => a.simklUsername,
scrobblePref: SettingsService.enableSimklScrobble,
@@ -122,8 +122,8 @@ class TrackerSettingsScreen extends StatelessWidget {
Future _disconnect(BuildContext context, TrackersProvider account) async {
final confirmed = await showConfirmDialog(
context,
- title: t.trackers.disconnectConfirm(service: config.displayName),
- message: t.trackers.disconnectConfirmBody(service: config.displayName),
+ title: t.services.disconnectConfirm(service: config.displayName),
+ message: t.services.disconnectConfirmBody(service: config.displayName),
confirmText: t.common.disconnect,
isDestructive: true,
);
@@ -150,14 +150,14 @@ class TrackerSettingsScreen extends StatelessWidget {
final username = config.username(account);
return TrackerAccountSettingsBody(
title: title,
- accountTitle: username != null ? t.trackers.connectedAs(username: username) : config.displayName,
+ accountTitle: username != null ? t.services.connectedAs(username: username) : config.displayName,
service: config.service,
toggles: [
TrackerSettingsToggle(
pref: config.scrobblePref,
icon: Symbols.auto_timer,
- title: t.trackers.scrobble,
- subtitle: t.trackers.scrobbleDescription,
+ title: t.services.scrobble,
+ subtitle: t.services.scrobbleDescription,
onAfterWrite: config.onScrobbleChanged,
),
],
diff --git a/lib/widgets/catalog_source_logo.dart b/lib/widgets/catalog_source_logo.dart
new file mode 100644
index 00000000..911a0809
--- /dev/null
+++ b/lib/widgets/catalog_source_logo.dart
@@ -0,0 +1,38 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+
+import '../models/catalog/catalog_item.dart';
+
+/// Brand mark of a catalog source (Trakt circle, MAL square) — or any
+/// service SVG via [CatalogSourceLogo.asset] — tinted with the ambient icon
+/// color. Uses [SvgTheme.currentColor] so SVGs with multiple explicit fills
+/// (AniList keeps its brand-blue L while the A follows the theme) render
+/// correctly alongside single-color wordmarks.
+class CatalogSourceLogo extends StatelessWidget {
+ final CatalogSourceId? id;
+ final String? assetPath;
+ final double size;
+
+ const CatalogSourceLogo(CatalogSourceId this.id, {super.key, this.size = 20}) : assetPath = null;
+
+ /// For services that aren't catalog sources (AniList, Simkl).
+ const CatalogSourceLogo.asset(String this.assetPath, {super.key, this.size = 20}) : id = null;
+
+ @override
+ Widget build(BuildContext context) {
+ final asset =
+ assetPath ??
+ switch (id!) {
+ CatalogSourceId.trakt => 'assets/trakt_circlemark.svg',
+ CatalogSourceId.mal => 'assets/mal_mark.svg',
+ CatalogSourceId.seerr => 'assets/seerr_mark.svg',
+ };
+ final color = IconTheme.of(context).color ?? Theme.of(context).colorScheme.onSurface;
+ return SvgPicture.asset(
+ asset,
+ width: size,
+ height: size,
+ theme: SvgTheme(currentColor: color),
+ );
+ }
+}
diff --git a/lib/widgets/device_code_dialog.dart b/lib/widgets/device_code_dialog.dart
index 8b85567f..aef6653b 100644
--- a/lib/widgets/device_code_dialog.dart
+++ b/lib/widgets/device_code_dialog.dart
@@ -30,19 +30,19 @@ class DeviceCodeDialog extends StatelessWidget {
Future _copy(BuildContext context) async {
await Clipboard.setData(ClipboardData(text: code.userCode));
if (!context.mounted) return;
- showAppSnackBar(context, t.trackers.deviceCode.codeCopied);
+ showAppSnackBar(context, t.services.deviceCode.codeCopied);
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return AlertDialog(
- title: Text(t.trackers.deviceCode.title(service: serviceName)),
+ title: Text(t.services.deviceCode.title(service: serviceName)),
content: Column(
mainAxisSize: .min,
crossAxisAlignment: .start,
children: [
- Text(t.trackers.deviceCode.body(url: code.verificationUrl), style: theme.textTheme.bodyMedium),
+ Text(t.services.deviceCode.body(url: code.verificationUrl), style: theme.textTheme.bodyMedium),
const SizedBox(height: 16),
Center(
child: InkWell(
@@ -68,7 +68,7 @@ class DeviceCodeDialog extends StatelessWidget {
onPressed: _open,
child: FilledButton.icon(
icon: const Icon(Icons.open_in_new),
- label: Text(t.trackers.deviceCode.openToActivate(service: serviceName)),
+ label: Text(t.services.deviceCode.openToActivate(service: serviceName)),
onPressed: _open,
),
),
@@ -78,7 +78,7 @@ class DeviceCodeDialog extends StatelessWidget {
children: [
const LoadingIndicatorBox(size: 16),
const SizedBox(width: 12),
- Expanded(child: Text(t.trackers.deviceCode.waitingForAuthorization, style: theme.textTheme.bodySmall)),
+ Expanded(child: Text(t.services.deviceCode.waitingForAuthorization, style: theme.textTheme.bodySmall)),
],
),
],
diff --git a/lib/widgets/oauth_proxy_dialog.dart b/lib/widgets/oauth_proxy_dialog.dart
index dd4e2749..06f8f62b 100644
--- a/lib/widgets/oauth_proxy_dialog.dart
+++ b/lib/widgets/oauth_proxy_dialog.dart
@@ -29,19 +29,19 @@ class OAuthProxyDialog extends StatelessWidget {
Future _copyUrl(BuildContext context) async {
await Clipboard.setData(ClipboardData(text: start.url));
if (!context.mounted) return;
- showAppSnackBar(context, t.trackers.oauthProxy.urlCopied);
+ showAppSnackBar(context, t.services.oauthProxy.urlCopied);
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return AlertDialog(
- title: Text(t.trackers.oauthProxy.title(service: serviceName)),
+ title: Text(t.services.oauthProxy.title(service: serviceName)),
content: Column(
mainAxisSize: .min,
crossAxisAlignment: .start,
children: [
- Text(t.trackers.oauthProxy.body, style: theme.textTheme.bodyMedium),
+ Text(t.services.oauthProxy.body, style: theme.textTheme.bodyMedium),
const SizedBox(height: 16),
// QrImageView doesn't support intrinsic sizing; wrap in SizedBox so
// AlertDialog's IntrinsicWidth walk sees a concrete width.
@@ -77,7 +77,7 @@ class OAuthProxyDialog extends StatelessWidget {
onPressed: _open,
child: FilledButton.icon(
icon: const Icon(Icons.open_in_new),
- label: Text(t.trackers.oauthProxy.openToSignIn(service: serviceName)),
+ label: Text(t.services.oauthProxy.openToSignIn(service: serviceName)),
onPressed: _open,
),
),
@@ -87,7 +87,7 @@ class OAuthProxyDialog extends StatelessWidget {
children: [
const LoadingIndicatorBox(size: 16),
const SizedBox(width: 12),
- Expanded(child: Text(t.trackers.deviceCode.waitingForAuthorization, style: theme.textTheme.bodySmall)),
+ Expanded(child: Text(t.services.deviceCode.waitingForAuthorization, style: theme.textTheme.bodySmall)),
],
),
],
diff --git a/lib/widgets/rating_bottom_sheet.dart b/lib/widgets/rating_bottom_sheet.dart
index b5d2a475..e1b8c74e 100644
--- a/lib/widgets/rating_bottom_sheet.dart
+++ b/lib/widgets/rating_bottom_sheet.dart
@@ -138,7 +138,7 @@ class _RatingBottomSheetState extends State {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 2, vertical: 4),
child: Text(
- t.rateSheet.noConnectedTrackers,
+ t.rateSheet.noConnectedServices,
style: Theme.of(
context,
).textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant),
@@ -229,7 +229,7 @@ class _RatingBottomSheetState extends State {
autofocus: autofocus,
leading: _TrackerLogo(source.logoAsset),
title: source.title,
- subtitle: source.username != null ? t.trackers.connectedAs(username: source.username!) : source.connectedLabel,
+ subtitle: source.username != null ? t.services.connectedAs(username: source.username!) : source.connectedLabel,
loading: loading,
status: status,
enabled: !loading,
@@ -265,7 +265,7 @@ class _RatingBottomSheetState extends State {
sources.add(
_TrackerRatingSource(
service: TrackerService.mal,
- title: t.trackers.services.mal,
+ title: t.services.names.mal,
username: trackers.malUsername,
connectedLabel: t.trakt.connected,
logoAsset: 'assets/mal_mark.svg',
@@ -277,7 +277,7 @@ class _RatingBottomSheetState extends State {
sources.add(
_TrackerRatingSource(
service: TrackerService.anilist,
- title: t.trackers.services.anilist,
+ title: t.services.names.anilist,
username: trackers.anilistUsername,
connectedLabel: t.trakt.connected,
logoAsset: 'assets/anilist_mark.svg',
@@ -289,7 +289,7 @@ class _RatingBottomSheetState extends State {
sources.add(
_TrackerRatingSource(
service: TrackerService.simkl,
- title: t.trackers.services.simkl,
+ title: t.services.names.simkl,
username: trackers.simklUsername,
connectedLabel: t.trakt.connected,
logoAsset: 'assets/simkl_mark.svg',
diff --git a/pubspec.yaml b/pubspec.yaml
index 1e08113c..2790cb6c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -145,6 +145,7 @@ flutter:
- assets/mal_mark.svg
- assets/anilist_mark.svg
- assets/simkl_mark.svg
+ - assets/seerr_mark.svg
- assets/go-noto-current-regular.ttf
- assets/shaders/nvscaler/
- assets/shaders/artcnn/