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/