This commit is contained in:
Filipinos 2025-08-02 09:57:03 +02:00
parent b348ffc529
commit ed6cb69add
18 changed files with 2106 additions and 1366 deletions

View File

@ -1,10 +1,10 @@
{
"appName": { "message": "CinePlex" },
"appDescription": { "message": "Scannt Plex-Server nach Inhalten und zeigt diese in der Oberfläche an" },
"appDescription": { "message": "Sucht Plex-Server nach Inhalten und zeigt sie in der Benutzeroberfläche an" },
"appTagline": { "message": "Filme, Serien und Musik" },
"appLocaleCode": { "message": "de" },
"appLocaleCode": { "message": "de-DE" },
"toggleNavigation": { "message": "Navigation umschalten" },
"searchPlaceholder": { "message": "Filme oder Serien suchen..." },
"searchPlaceholder": { "message": "Suche nach Filmen oder Serien..." },
"openMusicPlayer": { "message": "Musik-Player öffnen" },
"settings": { "message": "Einstellungen" },
"navMovies": { "message": "Filme" },
@ -17,10 +17,10 @@
"navRecommendations": { "message": "Empfehlungen" },
"navMusic": { "message": "Musik" },
"navM3uGenerator": { "message": "M3U-Generator" },
"heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Entdecke Tausende von Filmen und Serien." },
"heroWelcome": { "message": "Willkommen bei CinePlex" },
"heroSubtitle": { "message": "Entdecken Sie Tausende von Filmen und Serien." },
"addStream": { "message": "Stream hinzufügen" },
"moreInfo": { "message": "Mehr Informationen" },
"moreInfo": { "message": "Mehr Info" },
"popularMovies": { "message": "Beliebte Filme" },
"allGenres": { "message": "Alle Genres" },
"allYears": { "message": "Alle Jahre" },
@ -29,33 +29,33 @@
"sortRecent": { "message": "Neueste" },
"loadMore": { "message": "Mehr laden" },
"photosBreadcrumbHome": { "message": "Alben" },
"selectServer": { "message": "Server auswählen" },
"selectServer": { "message": "Wählen Sie einen Server" },
"loading": { "message": "Laden..." },
"loadingLibraries": { "message": "Bibliotheken laden..." },
"loadingLibraries": { "message": "Lade Bibliotheken..." },
"photosEmptyState": { "message": "Keine Alben oder Fotos gefunden." },
"photosEmptyStateSub": { "message": "Bitte wählen Sie einen Server aus oder stellen Sie sicher, dass Sie eine Fotobibliothek in Plex haben." },
"statsTitle": { "message": "Bibliotheksstatistiken" },
"statsAllTokens": { "message": "Alle Tokens" },
"statsAnalyzing": { "message": "Ihre Bibliothek wird analysiert..." },
"statsActiveTokens": { "message": "Aktive Tokens" },
"statsServersFound": { "message": "Server gefunden" },
"statsAllTokens": { "message": "Alle Token" },
"statsAnalyzing": { "message": "Analysiere deine Bibliothek..." },
"statsActiveTokens": { "message": "Aktive Token" },
"statsServersFound": { "message": "Gefundene Server" },
"statsUniqueMovies": { "message": "Einzigartige Filme" },
"statsUniqueSeries": { "message": "Einzigartige Serien" },
"statsUniqueArtists": { "message": "Einzigartige Künstler" },
"statsTokenServers": { "message": "Token-Server" },
"statsChartMoviesByGenre": { "message": "Inhalte nach Genre (Filme)" },
"statsChartSeriesByGenre": { "message": "Inhalte nach Genre (Serien)" },
"statsChartByDecade": { "message": "Inhalte nach Jahrzehnt" },
"recommendationsTitle": { "message": "Empfehlungen für Sie" },
"statsChartMoviesByGenre": { "message": "Inhalt nach Genre (Filme)" },
"statsChartSeriesByGenre": { "message": "Inhalt nach Genre (Serien)" },
"statsChartByDecade": { "message": "Inhalt nach Jahrzehnt" },
"recommendationsTitle": { "message": "Empfehlungen für dich" },
"historyTitle": { "message": "Wiedergabeverlauf" },
"clearHistory": { "message": "Alles löschen" },
"consoleTitle": { "message": "Plex-Scan-Konsole" },
"footerCredit": { "message": "Eine Oberfläche für Ihr Plex-Universum." },
"closeTrailer": { "message": "Trailer schließen" },
"close": { "message": "Schließen" },
"photoViewer": { "message": "Foto-Viewer" },
"previous": { "message": "Vorherige" },
"next": { "message": "Nächste" },
"photoViewer": { "message": "Fotobetrachter" },
"previous": { "message": "Zurück" },
"next": { "message": "Weiter" },
"notificationTemplateText": { "message": "Benachrichtigung" },
"settingsTitleFull": { "message": "Einstellungen und Konfiguration" },
"settingsTabGeneral": { "message": "Allgemein" },
@ -64,45 +64,45 @@
"settingsTabPhpGen": { "message": "PHP-Generator" },
"settingsTabData": { "message": "Daten" },
"settingsApiServer": { "message": "API- und Server-Einstellungen" },
"settingsTmdbApiLabel": { "message": "TMDB API-Schlüssel (Optional)" },
"settingsTmdbApiPlaceholder": { "message": "Standardschlüssel wird verwendet, wenn leer gelassen" },
"settingsGoogleApiLabel": { "message": "Google Gemini API-Schlüssel (Optional)" },
"settingsGoogleApiPlaceholder": { "message": "Erforderlich für die Nutzung des KI-Assistenten" },
"settingsRegionLabel": { "message": "Region für die Inhaltserkennung" },
"settingsTmdbApiLabel": { "message": "TMDB-API-Schlüssel (optional)" },
"settingsTmdbApiPlaceholder": { "message": "Der Standardschlüssel wird verwendet, wenn das Feld leer gelassen wird" },
"settingsGoogleApiLabel": { "message": "Google Gemini-API-Schlüssel (optional)" },
"settingsGoogleApiPlaceholder": { "message": "Wird für die Nutzung des KI-Assistenten benötigt" },
"settingsRegionLabel": { "message": "Region für die Inhaltsentdeckung" },
"allRegions": { "message": "Alle Regionen" },
"settingsPhpUrlLabel": { "message": "Server-URL zum Hinzufügen von Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://ihr-server.com/pfad/zum/script.php" },
"settingsInterface": { "message": "Oberfläche" },
"settingsPhpUrlPlaceholder": { "message": "https://ihr-server.com/pfad/zum/skript.php" },
"settingsInterface": { "message": "Benutzeroberfläche" },
"settingsLightTheme": { "message": "Heller Modus" },
"settingsShowHero": { "message": "Willkommensbereich 'Hero' anzeigen" },
"settingsScanContent": { "message": "Inhaltsscanning" },
"settingsScanDesc": { "message": "Wählen Sie aus, was gescannt werden soll, und klicken Sie auf die Schaltfläche." },
"settingsScanContent": { "message": "Inhalt scannen" },
"settingsScanDesc": { "message": "Wählen Sie aus, was gescannt werden soll, und drücken Sie die Taste." },
"settingsScanMovies": { "message": "Filme" },
"settingsScanShows": { "message": "Serien" },
"settingsScanArtists": { "message": "Musik" },
"settingsScanPhotos": { "message": "Fotos" },
"settingsSelectAll": { "message": "Alle auswählen" },
"settingsSelectAll": { "message": "Alles auswählen" },
"settingsStartScan": { "message": "Scan starten" },
"settingsPlexTokens": { "message": "Plex-Tokens" },
"settingsPlexTokensDesc": { "message": "Bearbeiten Sie die Liste der Plex-Tokens (JSON-Format)." },
"settingsSaveTokens": { "message": "Tokens speichern" },
"settingsJellyfinTitle": { "message": "Jellyfin-Konfiguration" },
"settingsJellyfinDesc": { "message": "Fügen Sie Ihre Jellyfin-Serverdaten hinzu, um deren Inhalte zu scannen." },
"jellyfinUrlLabel": { "message": "Jellyfin Server-URL" },
"settingsPlexTokens": { "message": "Plex-Token" },
"settingsPlexTokensDesc": { "message": "Bearbeiten Sie die Liste der Plex-Token (JSON-Format)." },
"settingsSaveTokens": { "message": "Token speichern" },
"settingsJellyfinTitle": { "message": "Jellyfin-Einstellungen" },
"settingsJellyfinDesc": { "message": "Fügen Sie Ihre Jellyfin-Serverdetails hinzu, um deren Inhalte zu scannen." },
"jellyfinUrlLabel": { "message": "Jellyfin-Server-URL" },
"jellyfinUserLabel": { "message": "Benutzername" },
"jellyfinPassLabel": { "message": "Passwort" },
"jellyfinConnectAndScan": { "message": "Verbinden und scannen" },
"settingsPhpGenTitle": { "message": "PHP-Skript-Generator für den Server" },
"settingsPhpGenTitle": { "message": "PHP-Skript-Generator für Server" },
"settingsPhpFileOptions": { "message": "Dateioptionen" },
"settingsPhpSavePathLabel": { "message": "Speicherpfad auf dem Server" },
"settingsPhpSavePathPlaceholder": { "message": "Bsp.: /var/www/html/listen (leer lassen für denselben Ordner)" },
"settingsPhpSavePathPlaceholder": { "message": "Bsp.: /var/www/html/listen (leer für denselben Ordner)" },
"settingsPhpFilenameLabel": { "message": "Dateiname" },
"settingsPhpFileAction": { "message": "Dateiaktion" },
"settingsPhpActionAppend": { "message": "An Dateiende anhängen (kumulativ)" },
"settingsPhpActionOverwrite": { "message": "Datei überschreiben (neu beginnen)" },
"settingsPhpSecurity": { "message": "Sicherheit (Optional)" },
"settingsPhpUseSecretKey": { "message": "Geheimen Schlüssel verwenden (Empfohlen)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Geben Sie einen sicheren geheimen Schlüssel ein" },
"settingsPhpActionAppend": { "message": "Am Ende der Datei anfügen (kumulativ)" },
"settingsPhpActionOverwrite": { "message": "Datei überschreiben (von vorne beginnen)" },
"settingsPhpSecurity": { "message": "Sicherheit (optional)" },
"settingsPhpUseSecretKey": { "message": "Geheimschlüssel verwenden (empfohlen)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Geben Sie einen sicheren Geheimschlüssel ein" },
"settingsPhpGeneratedCode": { "message": "Generierter Code" },
"settingsPhpGeneratedPlaceholder": { "message": "Der generierte PHP-Code wird hier angezeigt." },
"settingsGenerateScript": { "message": "Skript generieren" },
@ -111,18 +111,18 @@
"settingsImportDb": { "message": "DB aus Datei importieren" },
"settingsExportDb": { "message": "DB in Datei exportieren" },
"settingsClearContent": { "message": "Lokale Inhaltsdaten löschen" },
"settingsClearContentDesc": { "message": "Diese Aktion löscht Filme, Serien und Musik aus der lokalen Datenbank, hat aber keine Auswirkungen auf Ihre Favoriten oder Einstellungen." },
"settingsClearContentDesc": { "message": "Diese Aktion löscht Filme, Serien und Musik aus der lokalen Datenbank, hat aber keine Auswirkungen auf Ihre Favoriten oder Ihre Einstellungen." },
"settingsClose": { "message": "Schließen" },
"settingsSave": { "message": "Einstellungen speichern" },
"musicSidenavTitle": { "message": "Plex Musik" },
"musicSidenavTitle": { "message": "Plex-Musik" },
"musicAllServers": { "message": "Alle Server" },
"musicSearchArtistPlaceholder": { "message": "Künstler suchen..." },
"musicSearchDiscographyPlaceholder": { "message": "Diskografie durchsuchen..." },
"musicSearchArtistPlaceholder": { "message": "Suche nach einem Künstler..." },
"musicSearchDiscographyPlaceholder": { "message": "In Diskografie suchen..." },
"musicNothingPlaying": { "message": "Nichts wird abgespielt" },
"musicSelectSong": { "message": "Wählen Sie einen Song" },
"musicToStart": { "message": "zum Abspielen" },
"miniplayerDownloadSong": { "message": "Song herunterladen" },
"miniplayerDownloadAlbum": { "message": "Album M3U herunterladen" },
"musicSelectSong": { "message": "Wählen Sie ein Lied" },
"musicToStart": { "message": "um die Wiedergabe zu starten" },
"miniplayerDownloadSong": { "message": "Lied herunterladen" },
"miniplayerDownloadAlbum": { "message": "M3U-Album herunterladen" },
"miniplayerVolume": { "message": "Lautstärke" },
"miniplayerShuffle": { "message": "Zufallswiedergabe" },
"miniplayerEqualizer": { "message": "Equalizer" },
@ -134,7 +134,7 @@
"eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Klassik" },
"eqPresetBassBoost": { "message": "Bass-Verstärkung" },
"eqPresetBassBoost": { "message": "Bass-Boost" },
"eqPreampLabel": { "message": "Vorverstärker" },
"infoModalTitle": { "message": "Informationen" },
"infoModalFieldTitle": { "message": "Titel:" },
@ -156,14 +156,14 @@
"deletingContentData": { "message": "Lokale Inhaltsdaten werden gelöscht..." },
"noContentDataToDelete": { "message": "Keine Inhaltsdaten zum Löschen vorhanden." },
"contentDataDeleted": { "message": "Inhaltsdaten aus IndexedDB gelöscht." },
"errorDeletingData": { "message": "Fehler beim Löschen der Daten: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDeletingData": { "message": "Fehler beim Löschen von Daten: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Texteditor nicht verfügbar." },
"errorLoadingTokens": { "message": "Fehler beim Laden der Tokens zum Bearbeiten." },
"errorLoadingTokensMessage": { "message": "Fehler beim Laden der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor nicht zum Speichern verfügbar." },
"invalidJsonFormat": { "message": "Ungültiges JSON-Format. Muss { \"tokens\": [...] } sein" },
"tokensSaved": { "message": "Tokens erfolgreich gespeichert." },
"errorSavingTokens": { "message": "Fehler beim Speichern der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorLoadingTokens": { "message": "Fehler beim Laden der Token zur Bearbeitung." },
"errorLoadingTokensMessage": { "message": "Fehler beim Laden der Token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor zum Speichern nicht verfügbar." },
"invalidJsonFormat": { "message": "Ungültiges JSON-Format. Es muss { \"tokens\": [...] } sein" },
"tokensSaved": { "message": "Token erfolgreich gespeichert." },
"errorSavingTokens": { "message": "Fehler beim Speichern der Token: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB ist nicht verfügbar." },
"dbExported": { "message": "Datenbank erfolgreich exportiert." },
"errorExportingDb": { "message": "Fehler beim Exportieren der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } },
@ -171,8 +171,8 @@
"noDataToImport": { "message": "Die Datei enthält keine Daten für die aktuellen DB-Abschnitte." },
"dbImported": { "message": "Datenbank erfolgreich importiert." },
"errorImportingDb": { "message": "Fehler beim Importieren der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Ansicht wird mit neuen Daten aktualisiert..." },
"confirmClearContent": { "message": "Sind Sie sicher, dass Sie die lokalen Inhaltsdaten (Filme, Serien, Musik usw.) löschen möchten? Favoriten und Einstellungen werden NICHT gelöscht." },
"updatingView": { "message": "Ansicht mit neuen Daten wird aktualisiert..." },
"confirmClearContent": { "message": "Sind Sie sicher, dass Sie lokale Inhaltsdaten (Filme, Serien, Musik usw.) löschen möchten? Favoriten und Einstellungen werden NICHT gelöscht." },
"trailerNotFound": { "message": "Kein Trailer für diesen Titel gefunden." },
"confirmClearHistory": { "message": "Sind Sie sicher, dass Sie Ihren gesamten Wiedergabeverlauf löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden." },
"historyCleared": { "message": "Wiedergabeverlauf gelöscht." },
@ -183,40 +183,40 @@
"scriptGenerated": { "message": "PHP-Skript generiert." },
"errorLoadingAlbum": { "message": "Fehler beim Laden des Albums: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Fehler: Es wurde kein Fotoserver ausgewählt." },
"loadingGenres": { "message": "Genres laden..." },
"loadingGenres": { "message": "Lade Genres..." },
"errorLoadingGenres": { "message": "Fehler beim Laden" },
"noContentFound": { "message": "Keine Ergebnisse gefunden." },
"couldNotLoadContent": { "message": "Inhalt konnte nicht geladen werden." },
"noFavorites": { "message": "Sie haben noch keine Favoriten." },
"errorLoadingFavorites": { "message": "Fehler beim Laden der Favoriten." },
"historyEmpty": { "message": "Ihr Verlauf ist leer." },
"historyEmptySub": { "message": "Durchsuchen und schauen Sie Inhalte, damit sie hier erscheinen." },
"historyEmptySub": { "message": "Entdecken und sehen Sie sich Inhalte an, damit sie hier erscheinen." },
"errorGeneratingRecommendations": { "message": "Fehler beim Generieren von Empfehlungen." },
"noRecommendations": { "message": "Wir müssen Sie besser kennenlernen, um Empfehlungen geben zu können!" },
"noRecommendations": { "message": "Wir müssen Sie besser kennenlernen, um Ihnen Empfehlungen geben zu können!" },
"errorGeneratingStats": { "message": "Fehler beim Generieren von Statistiken." },
"noServersForToken": { "message": "Keine zugehörigen Server für dieses Token gefunden." },
"searchingActorContent": { "message": "Suche Inhalt von $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"searchingActorContent": { "message": "Suche nach Inhalten von $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Inhalt für $actorName$ konnte nicht geladen werden.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Fehler beim Hinzufügen von Stream(s): $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "Die PHP-Server-URL ist nicht konfiguriert. Bitte konfigurieren Sie sie in den Einstellungen." },
"searchingStreams": { "message": "Suche Streams für „$title$“", "placeholders": { "title": { "content": "$1" } } },
"searchingStreams": { "message": "Suche nach Streams für \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Sende $count$ Stream(s) an den Server...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) erfolgreich hinzugefügt." },
"generatingM3U": { "message": "Generiere M3U für „$title$“", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "„$title$“ heruntergeladen.", "placeholders": { "title": { "content": "$1" } } },
"generatingM3U": { "message": "Generiere M3U für \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" heruntergeladen.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Fehler beim Generieren von M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Einstellungen erfolgreich gespeichert." },
"errorSavingSettings": { "message": "Fehler beim Speichern der Einstellungen in der Datenbank." },
"languageChangeReload": { "message": "Sprache geändert. Die Anwendung wird jetzt neu geladen." },
"addedToFavorites": { "message": "Zu Favoriten hinzugefügt." },
"removedFromFavorites": { "message": "Aus Favoriten entfernt." },
"plexScanInProgress": { "message": "Der Plex-Scan läuft bereits." },
"addedToFavorites": { "message": "Zu den Favoriten hinzugefügt." },
"removedFromFavorites": { "message": "Aus den Favoriten entfernt." },
"plexScanInProgress": { "message": "Plex-Scan läuft bereits." },
"plexScanStarting": { "message": "Plex-Scan wird gestartet..." },
"noPlexTokens": { "message": "Keine Plex-Tokens konfiguriert." },
"clearingSections": { "message": "Abschnitte werden gelöscht: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"noPlexTokens": { "message": "Keine Plex-Token konfiguriert." },
"clearingSections": { "message": "Lösche Abschnitte: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Erste Scanphase abgeschlossen." },
"retryPhaseFinished": { "message": "Wiederholungsphase abgeschlossen." },
"plexScanFinished": { "message": "Scan abgeschlossen. Inhalte werden aktualisiert..." },
"plexScanFinished": { "message": "Scan abgeschlossen. Inhalt wird aktualisiert..." },
"scanCancelled": { "message": "Scan vom Benutzer abgebrochen." },
"scanCancelledInfo": { "message": "Scan abgebrochen." },
"errorInitializingMusicPlayer": { "message": "Fehler beim Initialisieren des Musik-Players." },
@ -225,11 +225,11 @@
"dbUnavailableError": { "message": "Fehler: Datenbank nicht verfügbar." },
"updatingMusicData": { "message": "Musikdaten werden aktualisiert..." },
"musicDataUpdated": { "message": "Musikdaten aktualisiert." },
"errorFetchingArtistSongs": { "message": "Fehler beim Abrufen der Künstlersongs." },
"errorLoadingSongs": { "message": "Fehler beim Laden der Songs." },
"errorFetchingArtistSongs": { "message": "Fehler beim Abrufen der Lieder des Künstlers." },
"errorLoadingSongs": { "message": "Fehler beim Laden der Lieder." },
"noArtistsFound": { "message": "Keine Künstler gefunden." },
"shuffleOn": { "message": "Zufallswiedergabe aktiviert." },
"shuffleOff": { "message": "Zufallswiedergabe deaktiviert." },
"shuffleOn": { "message": "Zufallswiedergabe ein." },
"shuffleOff": { "message": "Zufallswiedergabe aus." },
"playbackError": { "message": "Wiedergabefehler" },
"errorLabel": { "message": "Fehler" },
"reloadingPage": { "message": "Seite wird neu geladen..." },
@ -240,32 +240,29 @@
"popularSort": {"message": "Beliebteste"},
"moviesSectionTitle": {"message": "Filme"},
"seriesSectionTitle": {"message": "Serien"},
"searchResultsFor": {"message": "Ergebnisse für „$query$“", "placeholders": {"query": {"content": "$1"}}},
"searchResultsFor": {"message": "Ergebnisse für \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Inhalt von $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Erkunden"},
"explore": {"message": "Entdecken"},
"noGenre": {"message": "Ohne Kategorie"},
"synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "Keine Synopsis verfügbar."},
"synopsis": {"message": "Zusammenfassung"},
"noSynopsis": {"message": "Keine Zusammenfassung verfügbar."},
"director": {"message": "Regisseur:"},
"writer": {"message": "Drehbuchautor:"},
"writer": {"message": "Autor:"},
"viewOnImdb": {"message": "Auf IMDb ansehen"},
"watchTrailer": {"message": "Trailer ansehen"},
"addToFavorites": {"message": "Zu Favoriten hinzufügen"},
"removeFromFavorites": {"message": "Aus Favoriten entfernen"},
"addToFavorites": {"message": "Zu den Favoriten hinzufügen"},
"removeFromFavorites": {"message": "Aus den Favoriten entfernen"},
"notAvailable": {"message": "Nicht verfügbar"},
"mainCast": {"message": "Hauptdarsteller"},
"mainCast": {"message": "Hauptbesetzung"},
"seasonsAndEpisodes": {"message": "Staffeln und Episoden"},
"similarContent": {"message": "Ähnlicher Inhalt"},
"filmography": {"message": "Filmografie"},
"availableOn": {"message": "Verfügbar auf"},
"episodesCount": {"message": "$count$ Episoden", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Staffeln", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ Min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Kein Trailer für diesen Titel gefunden."},
"fatalInitError": {"message": "Fataler Initialisierungsfehler"},
"fatalInitErrorSub": {"message": "Anwendung konnte nicht geladen werden."},
"invalidStreamInfo": {"message": "Ungültige Informationen."},
"dbUnavailableForStreams": {"message": "Lokale Datenbank nicht verfügbar."},
"noPlexServersForStreams": {"message": "Keine Plex-Server vorhanden."},
"notFoundOnServers": {"message": "„$query$“ wurde auf den Plex-Servern nicht gefunden.", "placeholders": {"query": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Kein Trailer für diesen Titel gefunden."},n "fatalInitError": {"message": "Fataler Initialisierungsfehler"},
"fatalInitErrorSub": {"message": "Die Anwendung konnte nicht geladen werden."},n "invalidStreamInfo": {"message": "Ungültige Informationen."},n "dbUnavailableForStreams": {"message": "Lokale Datenbank nicht verfügbar."},n "noPlexServersForStreams": {"message": "Keine Plex-Server."},n "notFoundOnServers": {"message": "\"$query$\" auf Plex-Servern nicht gefunden.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Gerade eben" },
"relativeTime_minutesAgo": { "message": "Vor $count$ Minuten", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "Vor $count$ Stunden", "placeholders": { "count": { "content": "$1" } } },
@ -273,35 +270,35 @@
"relativeTime_daysAgo": { "message": "Vor $count$ Tagen", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Fehler beim Laden der Details" },
"errorLoadingLocalContent": { "message": "Fehler beim Laden des lokalen Inhalts." },
"errorServerResponse": { "message": "Unerfolgreiche Serverantwort." },
"errorPlexApi": { "message": "Plex API-Fehler $status$.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Fehler beim Parsen der Plex-XML." },
"untitled": { "message": "Unbetitelt" },
"errorServerResponse": { "message": "Nicht erfolgreiche Serverantwort." },
"errorPlexApi": { "message": "Plex-API-Fehler $status$.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Fehler beim Parsen von Plex-XML." },
"untitled": { "message": "Ohne Titel" },
"itemCount": { "message": "$count$ Elemente", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Keine Fotoserver" },
"jellyfinScanInProgress": { "message": "Der Jellyfin-Scan läuft bereits." },
"jellyfinScanning": { "message": "Jellyfin wird gescannt..." },
"jellyfinMissingCredentials": { "message": "Bitte geben Sie die Jellyfin-URL und den Benutzernamen an." },
"jellyfinConnecting": { "message": "Verbindung zu Jellyfin wird hergestellt unter: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinScanInProgress": { "message": "Jellyfin-Scan läuft bereits." },
"jellyfinScanning": { "message": "Scanne Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Bitte vervollständigen Sie die Jellyfin-URL und den Benutzernamen." },
"jellyfinConnecting": { "message": "Verbinde mit Jellyfin unter: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Jellyfin-Authentifizierung fehlgeschlagen: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Jellyfin-Authentifizierung erfolgreich." },
"jellyfinFetchingLibraries": { "message": "Bibliotheken werden abgerufen..." },
"jellyfinFetchingLibraries": { "message": "Rufe Bibliotheken ab..." },
"jellyfinFetchFailed": { "message": "Fehler beim Abrufen der Bibliotheken: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Keine Film- oder Serienbibliotheken in Jellyfin gefunden." },
"jellyfinLibrariesFound": { "message": "$count$ Medienbibliothek(en) gefunden.", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Erfolg] „$libraryName$“ gescannt, $count$ Titel hinzugefügt.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Fehler beim Scannen der Bibliothek „$libraryName$“.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Erfolg] '$libraryName' gescannt, $count$ Titel hinzugefügt.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Fehler beim Scannen der Bibliothek '$libraryName'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Jellyfin-Scan abgeschlossen. $movies$ Filme und $series$ Serien hinzugefügt.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Jellyfin-Anmeldeinformationen nicht konfiguriert." },
"notFoundOnJellyfin": { "message": "„$query$“ wurde in Jellyfin nicht gefunden.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "„$query$“ wurde auf keinem Server gefunden.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnJellyfin": { "message": "\"$query$\" auf Jellyfin nicht gefunden.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" auf keinem Server gefunden.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "Auf Plex" },
"searchOnPlex": { "message": "Auf Plex suchen" },
"jellyfinTitle": { "message": "Jellyfin-Inhalt" },
"noJellyfinContent": { "message": "Kein Jellyfin-Inhalt gefunden." },
"noJellyfinContentSub": { "message": "Stellen Sie sicher, dass Sie Ihren Jellyfin-Server in den Einstellungen gescannt haben." },
"activityViewerTitle": { "message": "Server-Aktivitätsanzeige" },
"activitySelectServer": { "message": "Server auswählen" },
"activitySelectServer": { "message": "Wählen Sie einen Server" },
"activityCheckBtn": { "message": "Aktualisieren" },
"activityNoSessions": { "message": "Keine aktiven Sitzungen auf diesem Server." },
"activitySessionUser": { "message": "Benutzer" },
@ -310,19 +307,19 @@
"activitySessionState": { "message": "Status" },
"activitySessionIdentifier": { "message": "Client-Identifikator" },
"activityCopyID": { "message": "ID kopieren" },
"activityError": { "message": "Aktivität des Servers konnte nicht abgerufen werden." },
"activityError": { "message": "Serveraktivität konnte nicht abgerufen werden." },
"activityCopied": { "message": "Identifikator in die Zwischenablage kopiert!" },
"activityCopyError": { "message": "Fehler beim Kopieren des Identifikators." },
"noProvidersFound": { "message": "Keine Anbieter gefunden." },
"availableOnPlex": { "message": "Verfügbar auf Plex" },
"m3uGeneratorTitle": { "message": "M3U-Listen-Generator" },
"selectAServer": { "message": "Server auswählen..." },
"selectAServer": { "message": "Wählen Sie einen Server..." },
"downloadM3u": { "message": "M3U herunterladen" },
"m3uGenerator": { "message": "M3U-Generator" },
"selectLibraries": { "message": "Bibliotheken auswählen" },
"howToUse": { "message": "Anleitung" },
"howToUse": { "message": "Anwendung" },
"m3uInstruction1": { "message": "Wählen Sie einen Server aus der Liste." },
"m3uInstruction2": { "message": "Wählen Sie eine oder mehrere Bibliotheken zum Einschließen aus." },
"m3uInstruction2": { "message": "Wählen Sie eine oder mehrere Bibliotheken aus, die einbezogen werden sollen." },
"m3uInstruction3": { "message": "Klicken Sie auf die Download-Schaltfläche." },
"m3uInstruction4": { "message": "Importieren Sie die .m3u-Datei in Ihren kompatiblen Player." },
"chatOpen": { "message": "Chat öffnen" },
@ -330,112 +327,118 @@
"chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Geben Sie Ihre Nachricht ein..." },
"chatSend": { "message": "➤" },
"chatWelcome": { "message": "Willkommen! Ich bin Ihr CinePlex-Assistent. Fragen Sie mich nach Filmen, Serien oder allem, was Sie wissen möchten." },
"chatGoogleApiKeyMissing": { "message": "Der Google Gemini API-Schlüssel ist nicht konfiguriert. Bitte richten Sie ihn in den Erweiterungseinstellungen ein, um den KI-Assistenten zu verwenden." },
"chatWelcome": { "message": "Willkommen! Ich bin Ihr CinePlex-Assistent. Fragen Sie mich nach Filmen, Serien oder allem, was Sie sonst noch wissen möchten." },
"chatGoogleApiKeyMissing": { "message": "Der Google Gemini-API-Schlüssel ist nicht konfiguriert. Bitte legen Sie ihn in den Erweiterungseinstellungen fest, um den KI-Assistenten zu verwenden." },
"chatApiInvalidResponse": { "message": "Die API hat eine ungültige Antwort zurückgegeben. Bitte versuchen Sie es erneut." },
"chatApiError": { "message": "Fehler bei der Kommunikation mit dem KI-Assistenten" },
"downloadAll": { "message": "Alles herunterladen" },
"download": { "message": "Herunterladen" },
"aiToolSearchLibraryDesc": { "message": "Sucht in der Plex-Bibliothek des Benutzers nach Filmen oder Serien nach Titel." },
"aiToolSearchLibraryQueryParamDesc": { "message": "Der Titel des Films oder der Serie, die gesucht werden soll." },
"aiToolSearchLibraryTypeParamDesc": { "message": "Der Typ des Inhalts, der gesucht werden soll. Kann 'movie' für Filme oder 'series' für Serien sein. (Optional)." },
"aiToolSearchLibraryDesc": { "message": "Durchsucht die Plex-Bibliothek des Benutzers nach Filmen oder Serien nach Titel." },
"aiToolSearchLibraryQueryParamDesc": { "message": "Der Titel des zu suchenden Films oder der zu suchenden Serie." },
"aiToolSearchLibraryTypeParamDesc": { "message": "Der Typ des zu suchenden Inhalts. Kann 'movie' für Filme oder 'series' für Serien sein. (Optional)." },
"aiToolSearchLibraryResolutionParamDesc": { "message": "Die zu suchende Videoauflösung (z. B. '4k', '1080p'). (Optional)." },
"aiToolSearchLibraryContainerParamDesc": { "message": "Das zu suchende Video-Containerformat (z. B. 'mkv', 'mp4'). (Optional)." },
"aiToolNavigateToPageDesc": { "message": "Navigiert den Benutzer zu einer bestimmten Seite der Anwendungsoberfläche." },
"aiToolNavigateToPagePageParamDesc": { "message": "Der Name der Seite, zu der navigiert werden soll, z.B.: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers' oder 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Ruft die Bibliotheksstatistiken des Benutzers ab und zeigt sie an, wie z.B. die Gesamtzahl der einzigartigen Filme, Serien und Künstler." },
"aiToolShowItemDetailsDesc": { "message": "Zeigt die Detailseite eines bestimmten Films oder einer Serie nach Titel und Typ an." },
"aiToolNavigateToPagePageParamDesc": { "message": "Der Name der Seite, zu der navigiert werden soll, z. B.: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers' oder 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Ruft die Bibliotheksstatistiken des Benutzers ab und zeigt sie an, z. B. die Gesamtzahl der einzigartigen Filme, Serien und Künstler." },
"aiToolShowItemDetailsDesc": { "message": "Zeigt die Detailseite eines bestimmten Films oder einer bestimmten Serie nach Titel und Typ an." },
"aiToolShowItemDetailsTitleParamDesc": { "message": "Der genaue Titel des Films oder der Serie." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "Der Inhaltstyp. Muss 'movie' oder 'series' sein." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "Der Typ des Inhalts. Muss 'movie' oder 'series' sein." },
"aiToolAddToPlaylistDesc": { "message": "Fügt einen Film oder eine Serie zur aktuellen Wiedergabeliste des Benutzers hinzu, um sie an einen konfigurierten PHP-Server zu streamen." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "Der Titel des hinzuzufügenden Films oder der Serie." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "Der Inhaltstyp. Muss 'movie' oder 'series' sein." },
"aiToolCheckAndDownloadDesc": { "message": "Überprüft die Verfügbarkeit einer Liste von Filmen oder Serientiteln auf den lokalen Servern des Benutzers und generiert, falls gefunden, eine M3U-Wiedergabelistendatei mit den gefundenen Streams und lädt diese herunter." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "Der Titel des hinzuzufügenden Films oder der hinzuzufügenden Serie." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "Der Typ des Inhalts. Muss 'movie' oder 'series' sein." },
"aiToolCheckAndDownloadDesc": { "message": "Überprüft die Verfügbarkeit einer Liste von Film- oder Serientiteln auf den lokalen Servern des Benutzers und generiert und lädt, falls gefunden, eine M3U-Wiedergabelistendatei mit den gefundenen Streams herunter." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Ein Array von Film- oder Serientiteln zum Suchen und Herunterladen." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "Der Inhaltstyp der Liste. Muss 'movie' oder 'series' sein." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "Der Name der herunterzuladenden M3U-Datei (z.B. 'MeineListe.m3u'). Falls nicht angegeben, wird ein Standardname verwendet." },
"aiToolToggleFavoriteDesc": { "message": "Fügt einen Film oder eine Serie zur Favoritenliste des Benutzers hinzu oder entfernt sie." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "Der Name der herunterzuladenden M3U-Datei (z. B. 'MeineListe.m3u'). Wenn nicht angegeben, wird ein Standardname verwendet." },
"aiToolToggleFavoriteDesc": { "message": "Fügt einen Film oder eine Serie zur Favoritenliste des Benutzers hinzu oder entfernt sie daraus." },
"aiToolToggleFavoriteTitleParamDesc": { "message": "Der Titel des Films oder der Serie." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "Der Inhaltstyp. Muss 'movie' oder 'series' sein." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "Der Typ des Inhalts. Muss 'movie' oder 'series' sein." },
"aiToolGetRecommendationsDesc": { "message": "Generiert und zeigt eine Liste von Film- oder Serienempfehlungen basierend auf dem Wiedergabeverlauf und den Favoriten des Benutzers an." },
"aiToolApplyFiltersDesc": { "message": "Wendet Filter auf die aktuelle Film- oder Serienansicht an, wodurch die Ergebnisse nach Typ, Genre, Jahr und Sortierreihenfolge verfeinert werden können." },
"aiToolApplyFiltersTypeParamDesc": { "message": "Der Inhaltstyp, auf den die Filter angewendet werden sollen. Muss 'movie' oder 'series' sein." },
"aiToolApplyFiltersGenreParamDesc": { "message": "Der Name des Genres, nach dem gefiltert werden soll (z.B. 'Action', 'Drama')." },
"aiToolApplyFiltersYearParamDesc": { "message": "Das Erscheinungsjahr, nach dem gefiltert werden soll (z.B. '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "Das Sortierkriterium für die Ergebnisse. Gültige Werte: 'popularity.desc' (beliebteste), 'vote_average.desc' (am besten bewertet), 'release_date.desc' (neueste für Filme) oder 'first_air_date.desc' (neueste für Serien)." },
"aiToolApplyFiltersDesc": { "message": "Wendet Filter auf die aktuelle Ansicht von Filmen oder Serien an, um die Ergebnisse nach Typ, Genre, Jahr und Sortierreihenfolge zu verfeinern." },
"aiToolApplyFiltersTypeParamDesc": { "message": "Der Typ des Inhalts, auf den die Filter angewendet werden sollen. Muss 'movie' oder 'series' sein." },
"aiToolApplyFiltersGenreParamDesc": { "message": "Der Name des Genres, nach dem gefiltert werden soll (z. B. 'Action', 'Drama')." },
"aiToolApplyFiltersYearParamDesc": { "message": "Das Erscheinungsjahr, nach dem gefiltert werden soll (z. B. '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "Das Sortierkriterium für die Ergebnisse. Gültige Werte: 'popularity.desc' (beliebt), 'vote_average.desc' (am besten bewertet), 'release_date.desc' (neu für Filme) oder 'first_air_date.desc' (neu für Serien)." },
"aiToolPlayMusicByArtistDesc": { "message": "Öffnet den Musik-Player und beginnt mit der Wiedergabe von Liedern eines bestimmten Künstlers aus der Bibliothek des Benutzers." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "Der genaue Name des Künstlers, dessen Lieder abgespielt werden sollen." },
"aiToolClearChatHistoryDesc": { "message": "Löscht den gesamten Nachrichtenverlauf der aktuellen Konversation mit dem KI-Assistenten." },
"aiToolDeleteDatabaseDesc": { "message": "Löscht die gesamte lokale Datenbank der Erweiterung, einschließlich gescannter Inhalte, Einstellungen und Favoriten. Diese Aktion ist irreversibel und lädt die Anwendung neu." },
"aiToolUpdateAllTokensDesc": { "message": "Startet einen vollständigen Scan aller Plex-Server und Bibliotheken, die mit den in der Erweiterung konfigurierten Tokens verknüpft sind. Aktualisiert alle Filme, Serien, Künstler und Fotos." },
"aiToolAddPlexTokenDesc": { "message": "Fügt der Konfiguration der Erweiterung einen neuen X-Plex-Token hinzu, wodurch die Anwendung Inhalte von neuen Plex-Servern scannen kann." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "Die X-Plex-Token-Zeichenfolge, die hinzugefügt werden soll." },
"aiToolChangeRegionDesc": { "message": "Ändert die Region, die für die Inhaltserkennung in der TMDB-API verwendet wird. Dies wirkt sich auf die in den Film- und Serienabschnitten angezeigten Ergebnisse sowie auf Streaming-Anbieter aus." },
"aiToolChangeRegionRegionParamDesc": { "message": "Der zweibuchstabige ISO 3166-1 Ländercode für die neue Region (z.B. 'US' für die Vereinigten Staaten, 'ES' für Spanien, 'MX' für Mexiko)." },
"aiToolUpdateAllTokensDesc": { "message": "Startet einen vollständigen Scan aller Plex-Server und Bibliotheken, die mit den in der Erweiterung konfigurierten Token verknüpft sind. Aktualisiert alle Filme, Serien, Künstler und Fotos." },
"aiToolAddPlexTokenDesc": { "message": "Fügt der Konfiguration der Erweiterung einen neuen X-Plex-Token hinzu, sodass die Anwendung Inhalte von neuen Plex-Servern scannen kann." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "Die hinzuzufügende X-Plex-Token-Zeichenfolge." },
"aiToolChangeRegionDesc": { "message": "Ändert die für die Inhaltsentdeckung in der TMDB-API verwendete Region. Dies wirkt sich auf die in den Film- und Serienabschnitten angezeigten Ergebnisse sowie auf die Streaming-Anbieter aus." },
"aiToolChangeRegionRegionParamDesc": { "message": "Der zweibuchstabige ISO 3166-1-Ländercode für die neue Region (z. B. 'US' für die Vereinigten Staaten, 'ES' für Spanien, 'MX' für Mexiko)." },
"aiToolClearAllFavoritesDesc": { "message": "Entfernt alle Filme und Serien, die der Benutzer als Favoriten markiert hat." },
"aiToolClearViewingHistoryDesc": { "message": "Löscht den Wiedergabeverlauf des Benutzers von der Verlaufsseite." },
"aiToolClearRecommendationsViewDesc": { "message": "Leert die Empfehlungsansicht und löscht zwischengespeicherte Empfehlungen." },
"aiToolSearchNotFound": { "message": "„$query$“ in Ihrer Bibliothek nicht gefunden.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Zur Seite $page$ navigiert.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Fehler beim Navigieren zur Seite $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolClearRecommendationsViewDesc": { "message": "Löscht die Empfehlungsansicht und entfernt zwischengespeicherte Empfehlungen." },
"aiToolSearchNotFound": { "message": "'$query' in Ihrer Bibliothek nicht gefunden.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Zur Seite $page$ navigiert.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Fehler beim Navigieren zur Seite $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Fehler beim Abrufen der Statistiken." },
"aiToolItemNotFound": { "message": "Element „$title$“ nicht gefunden.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Details für „$title$“ werden angezeigt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "„$title$“ zur Wiedergabeliste hinzugefügt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "„$title$“ zu Favoriten hinzugefügt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "„$title$“ aus Favoriten entfernt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Empfehlungen werden angezeigt." },
"aiToolApplyFiltersGenreNotFound": { "message": "Genre „$genre$“ nicht gefunden.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolItemNotFound": { "message": "Element '$title' nicht gefunden.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Zeige Details für '$title'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "'$title' zur Wiedergabeliste hinzugefügt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "'$title' zu den Favoriten hinzugefügt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "'$title' aus den Favoriten entfernt.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Zeige Empfehlungen an." },
"aiToolApplyFiltersGenreNotFound": { "message": "Genre '$genre' nicht gefunden.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filter erfolgreich angewendet." },
"aiToolPlayMusicNotReady": { "message": "Der Musik-Player ist nicht bereit. Stellen Sie sicher, dass Ihre Plex-Musikbibliothek gescannt wurde." },
"aiToolPlayMusicArtistNotFound": { "message": "Künstler „$artist_name$“ nicht gefunden.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Keine Songs für „$artist_name$“ gefunden.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Spiele Musik von „$artist_name$“.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Chat-Verlauf gelöscht." },
"aiToolPlayMusicArtistNotFound": { "message": "Künstler '$artist_name' nicht gefunden.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Keine Lieder für '$artist_name' gefunden.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Spiele Musik von '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Chatverlauf gelöscht." },
"aiToolConfirmDeleteDatabase": { "message": "Sind Sie sicher, dass Sie die lokale Datenbank löschen möchten? Diese Aktion ist irreversibel." },
"aiToolDeleteDatabaseCancelled": { "message": "Löschen der Datenbank abgebrochen." },
"aiToolExecutionError": { "message": "Fehler beim Ausführen des Tools „$toolName$“: $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Unbekanntes Tool: „$toolName$“.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolExecutionError": { "message": "Fehler beim Ausführen des Tools '$toolName': $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Unbekanntes Tool: '$toolName'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favoriten gelöscht." },
"aiToolFavoritesClearError": { "message": "Fehler beim Löschen der Favoriten: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Empfehlungen gelöscht." },
"aiToolRecommendationsClearError": { "message": "Fehler beim Löschen der Empfehlungen: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Datenbank gelöscht. Die Seite wird neu geladen." },
"aiToolDatabaseDeleteError": { "message": "Fehler beim Löschen der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "Das Löschen der Datenbank ist blockiert. Schließen Sie andere App-Tabs." },
"aiToolUpdateAllTokensSuccess": { "message": "Alle Tokens erfolgreich aktualisiert." },
"aiToolUpdateAllTokensError": { "message": "Fehler beim Aktualisieren der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "Das Löschen der Datenbank ist blockiert. Schließen Sie andere Tabs der Anwendung." },
"aiToolUpdateAllTokensSuccess": { "message": "Alle Token wurden erfolgreich aktualisiert." },
"aiToolUpdateAllTokensError": { "message": "Fehler beim Aktualisieren der Token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Plex-Token erfolgreich hinzugefügt." },
"aiToolAddPlexTokenError": { "message": "Fehler beim Hinzufügen des Plex-Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Region auf $region$ geändert. Inhalt wird aktualisiert.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Region auf $region$ geändert. Der Inhalt wird aktualisiert.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Fehler beim Ändern der Region: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Wiedergabeverlauf gelöscht." },
"aiToolViewingHistoryClearError": { "message": "Fehler beim Löschen des Wiedergabeverlaufs: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Sie sind ein erfahrener Film- und Serienassistent namens CinePlex. Ihre Hauptfunktion ist es, Benutzern dabei zu helfen, Inhalte zu entdecken und mit ihrer Bibliothek zu interagieren. Befolgen Sie diese Regeln strikt: 1. **ERFINDEN SIE NIEMALS**, dass Sie eine Aktion durchgeführt haben, wenn Sie dafür kein Werkzeug verwendet haben. Sagen Sie zum Beispiel nicht „Ich habe X heruntergeladen“, wenn Sie das Download-Tool nicht verwendet haben. 2. Für Empfehlungsanfragen oder Listen (z.B. „Nennen Sie mir 5 Horrorfilme“) verwenden Sie Ihr eigenes Wissen, um die Liste zu erstellen. Präsentieren Sie sie in nummerierter oder aufgezählter Form. Nachdem Sie die Liste angezeigt haben, fragen Sie den Benutzer proaktiv, ob Sie die Verfügbarkeit auf seinen lokalen Servern überprüfen und eine M3U-Datei erstellen sollen. 3. Verwenden Sie das Tool `check_and_download_titles_list` **NUR**, wenn der Benutzer ausdrücklich bestätigt, dass er die Liste überprüfen oder herunterladen möchte. Verwenden Sie es nicht ohne explizite Bestätigung. 4. Für alle anderen Aktionen wie Navigieren, Statistiken abrufen oder einen bestimmten Titel suchen, verwenden Sie die entsprechenden Tools. Seien Sie stets prägnant, freundlich und effizient." },
"aiSystemPrompt_v3": { "message": "Sie sind ein erfahrener Film- und Serienassistent namens CinePlex. Ihre Hauptfunktion besteht darin, Benutzern bei der Entdeckung von Inhalten und der Interaktion mit ihrer Bibliothek zu helfen. Befolgen Sie diese Regeln strikt: 1. **TUN SIE NIEMALS SO**, als hätten Sie eine Aktion ausgeführt, wenn Sie kein Werkzeug dafür verwendet haben. Sagen Sie zum Beispiel nicht 'Ich habe X heruntergeladen', wenn Sie das Download-Tool nicht verwendet haben. 2. Bei Empfehlungs- oder Listenanfragen (z. B. 'Nennen Sie mir 5 Horrorfilme') verwenden Sie Ihr eigenes Wissen, um die Liste zu erstellen. Präsentieren Sie sie in nummerierter oder Aufzählungsform. Fragen Sie den Benutzer nach der Anzeige der Liste proaktiv, ob er die Verfügbarkeit auf seinen lokalen Servern überprüfen und eine M3U-Datei erstellen soll. 3. **NUR** wenn der Benutzer bestätigt, dass er die Liste überprüfen oder herunterladen möchte, verwenden Sie das Tool `check_and_download_titles_list`. Verwenden Sie es nicht ohne ausdrückliche Bestätigung. 4. Für alle anderen Aktionen wie das Navigieren, das Abrufen von Statistiken, das Suchen nach einem bestimmten Titel oder das Filtern nach Auflösung oder Container verwenden Sie die entsprechenden Tools. Seien Sie immer prägnant, freundlich und effizient." },
"aiToolM3UNoTitlesProvided": { "message": "Bitte geben Sie eine Liste von Titeln an, um die Wiedergabeliste zu erstellen." },
"aiToolM3UCheckingTitles": { "message": "Titel werden auf Ihren lokalen Servern überprüft..." },
"aiToolM3UCheckingTitles": { "message": "Überprüfe die Titel auf Ihren lokalen Servern..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Ich habe keinen der Filme oder Serien aus der Liste auf Ihren lokalen Servern gefunden." },
"aiToolM3UDownloadStarted": { "message": "Erledigt! Ich habe $1 von $2 Titeln auf Ihren Servern gefunden und den M3U-Playlist-Download gestartet.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Zurück zu Anbietern" },
"aiToolM3UDownloadStarted": { "message": "Fertig! Ich habe $1 von $2 Titeln auf Ihren Servern gefunden und den Download der M3U-Wiedergabeliste gestartet.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Zurück zu den Anbietern" },
"artistsCounterSingle": { "message": "$total$ Künstler", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Laden..." },
"downloadingSong": { "message": "Download von „$title$“ wird gestartet", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "„$title$“ heruntergeladen.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Fehler beim Herunterladen von „$title$“", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "M3U für „$artist$“ wird generiert", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U für Album „$artist$“ generiert.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Abschnitt „$title$“ wird erneut versucht", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[ERFOLG] Wiederholung für „$title$“ abgeschlossen.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ENDGÜLTIGER FEHLER] Wiederholung fehlgeschlagen für „$title$“: $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Wiederholungsphase für $count$ Abschnitte wird gestartet...", "placeholders": { "count": { "content": "$1" } } },
"downloadingSong": { "message": "Starte Download von \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" heruntergeladen.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Fehler beim Herunterladen von \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Generiere M3U für \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U für Album \"$artist$\" generiert.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Wiederhole Abschnitt \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[ERFOLG] Wiederholung von \"$title$\" abgeschlossen.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[FEHLER] Wiederholung für \"$title$\" fehlgeschlagen: $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Starte Wiederholungsphase für $count$ Abschnitte...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Token $token$... hat $count$ Server gefunden.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Fehler beim Verarbeiten von Token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"errorProcessingToken": { "message": "Fehler beim Verarbeiten des Tokens $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "FATALER FEHLER: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Fehler während des Scans: $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Plex-Scan wird gestoppt..." },
"invalidTokenProvided": { "message": "Ungültiger Token bereitgestellt." },
"tokenAlreadyExists": { "message": "Der Token existiert bereits." },
"invalidTokenProvided": { "message": "Ungültiges Token angegeben." },
"tokenAlreadyExists": { "message": "Token existiert bereits." },
"tokenAddedSuccessfully": { "message": "Token erfolgreich hinzugefügt." },
"noStreamsFoundForSelection": { "message": "Keine Streams für die Auswahl gefunden." },
"autoplayBlocked": { "message": "Automatische Wiedergabe blockiert." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Seite" }
"autoplayBlocked": { "message": "Autoplay blockiert." },
"page": { "message": "Seite" },
"all": { "message": "Alle" },
"userScore": { "message": "Benutzerbewertung" },
"duration": { "message": "Dauer" },
"min": { "message": "Min" },
"max": { "message": "Max" }
}

View File

@ -1,10 +1,10 @@
{
"appName": { "message": "CinePlex" },
"appDescription": { "message": "Scans Plex servers to find content and displays it in the interface" },
"appDescription": { "message": "Scans Plex servers for content and displays it in the interface" },
"appTagline": { "message": "Movies, Series, and Music" },
"appLocaleCode": { "message": "en" },
"appLocaleCode": { "message": "en-US" },
"toggleNavigation": { "message": "Toggle Navigation" },
"searchPlaceholder": { "message": "Search movies or series..." },
"searchPlaceholder": { "message": "Search for movies or series..." },
"openMusicPlayer": { "message": "Open Music Player" },
"settings": { "message": "Settings" },
"navMovies": { "message": "Movies" },
@ -17,23 +17,23 @@
"navRecommendations": { "message": "Recommendations" },
"navMusic": { "message": "Music" },
"navM3uGenerator": { "message": "M3U Generator" },
"heroWelcome": { "message": "" },
"heroWelcome": { "message": "Welcome to CinePlex" },
"heroSubtitle": { "message": "Explore thousands of movies and series." },
"addStream": { "message": "Add Stream" },
"moreInfo": { "message": "More Information" },
"moreInfo": { "message": "More info" },
"popularMovies": { "message": "Popular Movies" },
"allGenres": { "message": "All Genres" },
"allYears": { "message": "All Years" },
"sortPopular": { "message": "Most Popular" },
"sortTopRated": { "message": "Top Rated" },
"sortRecent": { "message": "Most Recent" },
"loadMore": { "message": "Load More" },
"allGenres": { "message": "All genres" },
"allYears": { "message": "All years" },
"sortPopular": { "message": "Most popular" },
"sortTopRated": { "message": "Top rated" },
"sortRecent": { "message": "Most recent" },
"loadMore": { "message": "Load more" },
"photosBreadcrumbHome": { "message": "Albums" },
"selectServer": { "message": "Select a server" },
"loading": { "message": "Loading..." },
"loadingLibraries": { "message": "Loading libraries..." },
"photosEmptyState": { "message": "No albums or photos found." },
"photosEmptyStateSub": { "message": "Please select a server or ensure you have a photo library in Plex." },
"photosEmptyStateSub": { "message": "Please select a server or make sure you have a photo library in Plex." },
"statsTitle": { "message": "Library Statistics" },
"statsAllTokens": { "message": "All Tokens" },
"statsAnalyzing": { "message": "Analyzing your library..." },
@ -65,18 +65,18 @@
"settingsTabData": { "message": "Data" },
"settingsApiServer": { "message": "API and Server Settings" },
"settingsTmdbApiLabel": { "message": "TMDB API Key (Optional)" },
"settingsTmdbApiPlaceholder": { "message": "Default key will be used if left blank" },
"settingsTmdbApiPlaceholder": { "message": "The default key will be used if left blank" },
"settingsGoogleApiLabel": { "message": "Google Gemini API Key (Optional)" },
"settingsGoogleApiPlaceholder": { "message": "Required to use AI assistant" },
"settingsGoogleApiPlaceholder": { "message": "Required to use the AI assistant" },
"settingsRegionLabel": { "message": "Region for content discovery" },
"allRegions": { "message": "All Regions" },
"allRegions": { "message": "All regions" },
"settingsPhpUrlLabel": { "message": "Server URL for Adding Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://your-server.com/path/to/script.php" },
"settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Light Mode" },
"settingsShowHero": { "message": "Show 'Hero' welcome section" },
"settingsScanContent": { "message": "Content Scan" },
"settingsScanDesc": { "message": "Select what to scan and click the button." },
"settingsScanDesc": { "message": "Select what to scan and press the button." },
"settingsScanMovies": { "message": "Movies" },
"settingsScanShows": { "message": "Series" },
"settingsScanArtists": { "message": "Music" },
@ -86,7 +86,7 @@
"settingsPlexTokens": { "message": "Plex Tokens" },
"settingsPlexTokensDesc": { "message": "Edit the list of Plex tokens (JSON format)." },
"settingsSaveTokens": { "message": "Save Tokens" },
"settingsJellyfinTitle": { "message": "Jellyfin Configuration" },
"settingsJellyfinTitle": { "message": "Jellyfin Settings" },
"settingsJellyfinDesc": { "message": "Add your Jellyfin server details to scan its content." },
"jellyfinUrlLabel": { "message": "Jellyfin Server URL" },
"jellyfinUserLabel": { "message": "Username" },
@ -94,35 +94,35 @@
"jellyfinConnectAndScan": { "message": "Connect and Scan" },
"settingsPhpGenTitle": { "message": "PHP Script Generator for Server" },
"settingsPhpFileOptions": { "message": "File Options" },
"settingsPhpSavePathLabel": { "message": "Server Save Path" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/lists (blank for same folder)" },
"settingsPhpSavePathLabel": { "message": "Save Path on Server" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/lists (blank for the same folder)" },
"settingsPhpFilenameLabel": { "message": "File Name" },
"settingsPhpFileAction": { "message": "File Action" },
"settingsPhpActionAppend": { "message": "Append to file (cumulative)" },
"settingsPhpActionOverwrite": { "message": "Overwrite file (start fresh)" },
"settingsPhpActionAppend": { "message": "Append to the end of the file (cumulative)" },
"settingsPhpActionOverwrite": { "message": "Overwrite the file (start over)" },
"settingsPhpSecurity": { "message": "Security (Optional)" },
"settingsPhpUseSecretKey": { "message": "Use secret key (Recommended)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Enter a secure secret key" },
"settingsPhpGeneratedCode": { "message": "Generated Code" },
"settingsPhpGeneratedPlaceholder": { "message": "Generated PHP code will appear here." },
"settingsPhpGeneratedPlaceholder": { "message": "The generated PHP code will appear here." },
"settingsGenerateScript": { "message": "Generate Script" },
"settingsCopyScript": { "message": "Copy Script" },
"settingsDataManagement": { "message": "Local Database Management" },
"settingsImportDb": { "message": "Import DB from File" },
"settingsExportDb": { "message": "Export DB to File" },
"settingsClearContent": { "message": "Clear Local Content Data" },
"settingsClearContentDesc": { "message": "This action will delete movies, series, and music from the local database, but will not affect your favorites or settings." },
"settingsClearContentDesc": { "message": "This action will delete movies, series, and music from the local database, but will not affect your favorites or your settings." },
"settingsClose": { "message": "Close" },
"settingsSave": { "message": "Save Settings" },
"musicSidenavTitle": { "message": "Plex Music" },
"musicAllServers": { "message": "All Servers" },
"musicSearchArtistPlaceholder": { "message": "Search artist..." },
"musicSearchDiscographyPlaceholder": { "message": "Search discography..." },
"musicSearchArtistPlaceholder": { "message": "Search for an artist..." },
"musicSearchDiscographyPlaceholder": { "message": "Search in discography..." },
"musicNothingPlaying": { "message": "Nothing playing" },
"musicSelectSong": { "message": "Select a song" },
"musicToStart": { "message": "to start playing" },
"miniplayerDownloadSong": { "message": "Download song" },
"miniplayerDownloadAlbum": { "message": "Download album M3U" },
"miniplayerDownloadAlbum": { "message": "Download M3U album" },
"miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Shuffle" },
"miniplayerEqualizer": { "message": "Equalizer" },
@ -150,9 +150,9 @@
"lang_it": { "message": "Italian" },
"lang_pt": { "message": "Portuguese" },
"essentialFeaturesNotSupported": { "message": "Your browser does not support essential features." },
"dbAccessError": { "message": "Error accessing local database." },
"dbUpdateNeeded": { "message": "Database needs updating, please reload the page." },
"dbBlocked": { "message": "Please close other tabs of this app to continue." },
"dbAccessError": { "message": "Error accessing the local database." },
"dbUpdateNeeded": { "message": "The database needs to be updated, please reload the page." },
"dbBlocked": { "message": "Please close other tabs of this application to continue." },
"deletingContentData": { "message": "Deleting local content data..." },
"noContentDataToDelete": { "message": "No content data to delete." },
"contentDataDeleted": { "message": "Content data deleted from IndexedDB." },
@ -160,29 +160,29 @@
"aceEditorNotAvailable": { "message": "Text editor not available." },
"errorLoadingTokens": { "message": "Error loading tokens for editing." },
"errorLoadingTokensMessage": { "message": "Error loading tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor not available to save." },
"invalidJsonFormat": { "message": "Invalid JSON format. Must be { \"tokens\": [...] }" },
"aceEditorNotAvailableToSave": { "message": "Editor not available for saving." },
"invalidJsonFormat": { "message": "Invalid JSON format. It must be { \"tokens\": [...] }" },
"tokensSaved": { "message": "Tokens saved successfully." },
"errorSavingTokens": { "message": "Error saving tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB is not available." },
"dbExported": { "message": "Database exported successfully." },
"errorExportingDb": { "message": "Error exporting database: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "File does not contain a valid JSON object." },
"noDataToImport": { "message": "File contains no data for current DB sections." },
"errorExportingDb": { "message": "Error exporting the database: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "The file does not contain a valid JSON object." },
"noDataToImport": { "message": "The file does not contain data for the current DB sections." },
"dbImported": { "message": "Database imported successfully." },
"errorImportingDb": { "message": "Error importing database: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Updating view with new data..." },
"errorImportingDb": { "message": "Error importing the database: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Updating the view with new data..." },
"confirmClearContent": { "message": "Are you sure you want to delete local content data (Movies, Series, Music, etc.)? Favorites and Settings will NOT be deleted." },
"trailerNotFound": { "message": "No trailer found for this title." },
"confirmClearHistory": { "message": "Are you sure you want to clear all your viewing history? This action cannot be undone." },
"confirmClearHistory": { "message": "Are you sure you want to delete all your viewing history? This action cannot be undone." },
"historyCleared": { "message": "Viewing history cleared." },
"historyItemDeleted": { "message": "Item deleted from history." },
"errorGeneratingScript": { "message": "First generate a script to copy it." },
"errorGeneratingScript": { "message": "First generate a script to be able to copy it." },
"scriptCopied": { "message": "PHP script copied to clipboard." },
"errorCopyingScript": { "message": "Error copying script." },
"errorCopyingScript": { "message": "Error copying the script." },
"scriptGenerated": { "message": "PHP script generated." },
"errorLoadingAlbum": { "message": "Error loading album: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Error: No photo server selected." },
"noPhotoServerSelected": { "message": "Error: No photo server has been selected." },
"loadingGenres": { "message": "Loading genres..." },
"errorLoadingGenres": { "message": "Error loading" },
"noContentFound": { "message": "No results found." },
@ -190,17 +190,17 @@
"noFavorites": { "message": "You don't have any favorites yet." },
"errorLoadingFavorites": { "message": "Error loading favorites." },
"historyEmpty": { "message": "Your history is empty." },
"historyEmptySub": { "message": "Browse and watch content for it to appear here." },
"historyEmptySub": { "message": "Explore and watch content for it to appear here." },
"errorGeneratingRecommendations": { "message": "Error generating recommendations." },
"noRecommendations": { "message": "We need to know you better to give you recommendations!" },
"noRecommendations": { "message": "We need to get to know you better to give you recommendations!" },
"errorGeneratingStats": { "message": "Error generating statistics." },
"noServersForToken": { "message": "No associated servers found for this token." },
"searchingActorContent": { "message": "Searching content for $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"searchingActorContent": { "message": "Searching for content by $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Could not load content for $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Error adding stream(s): $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "PHP server URL is not configured. Please configure it in Settings." },
"searchingStreams": { "message": "Searching streams for \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Sending $count$ stream(s) to server...", "placeholders": { "count": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "The PHP server URL is not configured. Please configure it in Settings." },
"searchingStreams": { "message": "Searching for streams for \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Sending $count$ stream(s) to the server...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) added successfully." },
"generatingM3U": { "message": "Generating M3U for \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" downloaded.", "placeholders": { "title": { "content": "$1" } } },
@ -214,25 +214,25 @@
"plexScanStarting": { "message": "Starting Plex scan..." },
"noPlexTokens": { "message": "No Plex tokens configured." },
"clearingSections": { "message": "Clearing sections: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Initial scan phase completed." },
"initialScanPhaseComplete": { "message": "Initial scan phase finished." },
"retryPhaseFinished": { "message": "Retry phase finished." },
"plexScanFinished": { "message": "Scan finished. Updating content..." },
"scanCancelled": { "message": "Scan cancelled by user." },
"scanCancelled": { "message": "Scan cancelled by the user." },
"scanCancelledInfo": { "message": "Scan cancelled." },
"errorInitializingMusicPlayer": { "message": "Error initializing music player." },
"errorInitializingMusicPlayer": { "message": "Error initializing the music player." },
"criticalErrorLoadingMusic": { "message": "Critical error loading music data." },
"errorLoadingArtists": { "message": "Error loading artists." },
"dbUnavailableError": { "message": "Error: Database unavailable." },
"dbUnavailableError": { "message": "Error: Database not available." },
"updatingMusicData": { "message": "Updating music data..." },
"musicDataUpdated": { "message": "Music data updated." },
"errorFetchingArtistSongs": { "message": "Error fetching artist songs." },
"errorFetchingArtistSongs": { "message": "Error fetching the artist's songs." },
"errorLoadingSongs": { "message": "Error loading songs." },
"noArtistsFound": { "message": "No artists found." },
"shuffleOn": { "message": "Shuffle mode enabled." },
"shuffleOff": { "message": "Shuffle mode disabled." },
"shuffleOn": { "message": "Shuffle mode on." },
"shuffleOff": { "message": "Shuffle mode off." },
"playbackError": { "message": "Playback error" },
"errorLabel": { "message": "Error" },
"reloadingPage": { "message": "Reloading page..." },
"reloadingPage": { "message": "Reloading the page..." },
"viewed": { "message": "Viewed" },
"local": { "message": "Local" },
"topRatedSort": {"message": "Top Rated"},
@ -243,7 +243,7 @@
"searchResultsFor": {"message": "Results for \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Content from $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Explore"},
"noGenre": {"message": "No category"},
"noGenre": {"message": "Uncategorized"},
"synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "No synopsis available."},
"director": {"message": "Director:"},
@ -256,6 +256,8 @@
"mainCast": {"message": "Main Cast"},
"seasonsAndEpisodes": {"message": "Seasons and Episodes"},
"similarContent": {"message": "Similar Content"},
"filmography": {"message": "Filmography"},
"availableOn": {"message": "Available on"},
"episodesCount": {"message": "$count$ Episodes", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Seasons", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
@ -263,9 +265,9 @@
"fatalInitError": {"message": "Fatal initialization error"},
"fatalInitErrorSub": {"message": "Could not load the application."},
"invalidStreamInfo": {"message": "Invalid information."},
"dbUnavailableForStreams": {"message": "Local database unavailable."},
"dbUnavailableForStreams": {"message": "Local database not available."},
"noPlexServersForStreams": {"message": "No Plex servers."},
"notFoundOnServers": {"message": "Could not find \"$query$\" on Plex servers.", "placeholders": {"query": {"content": "$1"}}},
"notFoundOnServers": {"message": "\"$query$\" not found on Plex servers.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Just now" },
"relativeTime_minutesAgo": { "message": "$count$ minutes ago", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "$count$ hours ago", "placeholders": { "count": { "content": "$1" } } },
@ -281,25 +283,25 @@
"noPhotoServers": { "message": "No photo servers" },
"jellyfinScanInProgress": { "message": "Jellyfin scan is already in progress." },
"jellyfinScanning": { "message": "Scanning Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Please fill in Jellyfin URL and username." },
"jellyfinMissingCredentials": { "message": "Please complete the Jellyfin URL and username." },
"jellyfinConnecting": { "message": "Connecting to Jellyfin at: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Jellyfin authentication failed: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Jellyfin authentication successful." },
"jellyfinFetchingLibraries": { "message": "Fetching libraries..." },
"jellyfinFetchFailed": { "message": "Error fetching libraries: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "No movie or series libraries found in Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ media library(ies) found.", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Success] '$libraryName$' scanned, $count$ titles added.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Error scanning library '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinLibrariesFound": { "message": "$count$ media library(s) found.", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Success] '$libraryName' scanned, $count$ titles added.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Error scanning library '$libraryName'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Jellyfin scan completed. Added $movies$ movies and $series$ series.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Jellyfin credentials not configured." },
"notFoundOnJellyfin": { "message": "Could not find \"$query$\" on Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "Could not find \"$query$\" on any server.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnJellyfin": { "message": "\"$query$\" not found on Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" not found on any server.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "On Plex" },
"searchOnPlex": { "message": "Search on Plex" },
"jellyfinTitle": { "message": "Jellyfin Content" },
"noJellyfinContent": { "message": "No Jellyfin content found." },
"noJellyfinContentSub": { "message": "Make sure you have scanned your Jellyfin server in settings." },
"noJellyfinContentSub": { "message": "Make sure you have scanned your Jellyfin server in the settings." },
"activityViewerTitle": { "message": "Server Activity Viewer" },
"activitySelectServer": { "message": "Select a server" },
"activityCheckBtn": { "message": "Refresh" },
@ -312,7 +314,7 @@
"activityCopyID": { "message": "Copy ID" },
"activityError": { "message": "Could not get server activity." },
"activityCopied": { "message": "Identifier copied to clipboard!" },
"activityCopyError": { "message": "Error copying identifier." },
"activityCopyError": { "message": "Error copying the identifier." },
"noProvidersFound": { "message": "No providers found." },
"availableOnPlex": { "message": "Available on Plex" },
"m3uGeneratorTitle": { "message": "M3U List Generator" },
@ -320,7 +322,7 @@
"downloadM3u": { "message": "Download M3U" },
"m3uGenerator": { "message": "M3U Generator" },
"selectLibraries": { "message": "Select Libraries" },
"howToUse": { "message": "How To Use" },
"howToUse": { "message": "How to Use" },
"m3uInstruction1": { "message": "Choose a server from the list." },
"m3uInstruction2": { "message": "Select one or more libraries to include." },
"m3uInstruction3": { "message": "Click the download button." },
@ -331,89 +333,91 @@
"chatPlaceholder": { "message": "Type your message..." },
"chatSend": { "message": "➤" },
"chatWelcome": { "message": "Welcome! I'm your CinePlex assistant. Ask me about movies, series, or anything else you want to know." },
"chatGoogleApiKeyMissing": { "message": "Google Gemini API key is not configured. Please set it in the extension settings to use the AI assistant." },
"chatGoogleApiKeyMissing": { "message": "The Google Gemini API key is not configured. Please set it in the extension settings to use the AI assistant." },
"chatApiInvalidResponse": { "message": "The API returned an invalid response. Please try again." },
"chatApiError": { "message": "Error communicating with the AI assistant" },
"downloadAll": { "message": "Download all" },
"download": { "message": "Download" },
"aiToolSearchLibraryDesc": { "message": "Searches the user's Plex library for movies or series by title." },
"aiToolSearchLibraryQueryParamDesc": { "message": "The title of the movie or series to search for." },
"aiToolSearchLibraryTypeParamDesc": { "message": "The type of content to search for. Can be 'movie' for movies or 'series' for series. (Optional)." },
"aiToolSearchLibraryTypeParamDesc": { "message": "The type of content to search for. It can be 'movie' for movies or 'series' for series. (Optional)." },
"aiToolSearchLibraryResolutionParamDesc": { "message": "The video resolution to search for (e.g., '4k', '1080p'). (Optional)." },
"aiToolSearchLibraryContainerParamDesc": { "message": "The video container format to search for (e.g., 'mkv', 'mp4'). (Optional)." },
"aiToolNavigateToPageDesc": { "message": "Navigates the user to a specific page of the application interface." },
"aiToolNavigateToPagePageParamDesc": { "message": "The name of the page to navigate to, e.g.: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', or 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Retrieves and displays the user's library statistics, such as the total number of unique movies, series, and artists." },
"aiToolShowItemDetailsDesc": { "message": "Displays the details page for a specific movie or series by its title and type." },
"aiToolGetUserStatsDesc": { "message": "Gets and displays the user's library statistics, such as the total number of unique movies, series, and artists." },
"aiToolShowItemDetailsDesc": { "message": "Displays the details page of a specific movie or series by its title and type." },
"aiToolShowItemDetailsTitleParamDesc": { "message": "The exact title of the movie or series." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "The type of content. Must be 'movie' or 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Adds a movie or series to the user's current playlist to stream to a configured PHP server." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "The type of content. It must be 'movie' or 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Adds a movie or series to the user's current playlist to stream it to a configured PHP server." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "The title of the movie or series to add." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "The type of content. Must be 'movie' or 'series'." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "The type of content. It must be 'movie' or 'series'." },
"aiToolCheckAndDownloadDesc": { "message": "Checks the availability of a list of movie or series titles on the user's local servers and, if found, generates and downloads an M3U playlist file with the found streams." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "An array of movie or series titles to search for and download." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "The content type of the list. Must be 'movie' or 'series'." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "The content type of the list. It must be 'movie' or 'series'." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "The name of the M3U file to download (e.g., 'MyList.m3u'). If not provided, a default name will be used." },
"aiToolToggleFavoriteDesc": { "message": "Adds or removes a movie or series from the user's favorites list." },
"aiToolToggleFavoriteTitleParamDesc": { "message": "The title of the movie or series." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "The type of content. Must be 'movie' or 'series'." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "The type of content. It must be 'movie' or 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Generates and displays a list of movie or series recommendations based on the user's viewing history and favorites." },
"aiToolApplyFiltersDesc": { "message": "Applies filters to the current movie or series view, allowing refinement of results by type, genre, year, and sort order." },
"aiToolApplyFiltersTypeParamDesc": { "message": "The type of content to apply filters to. Must be 'movie' or 'series'." },
"aiToolApplyFiltersDesc": { "message": "Applies filters to the current view of movies or series, allowing to refine the results by type, genre, year, and sort order." },
"aiToolApplyFiltersTypeParamDesc": { "message": "The type of content to apply the filters to. It must be 'movie' or 'series'." },
"aiToolApplyFiltersGenreParamDesc": { "message": "The name of the genre to filter by (e.g., 'Action', 'Drama')." },
"aiToolApplyFiltersYearParamDesc": { "message": "The release year to filter by (e.g., '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "The sort criterion for the results. Valid values: 'popularity.desc' (popular), 'vote_average.desc' (top rated), 'release_date.desc' (recent for movies) or 'first_air_date.desc' (recent for series)." },
"aiToolApplyFiltersSortParamDesc": { "message": "The sorting criterion for the results. Valid values: 'popularity.desc' (popular), 'vote_average.desc' (top rated), 'release_date.desc' (recent for movies) or 'first_air_date.desc' (recent for series)." },
"aiToolPlayMusicByArtistDesc": { "message": "Opens the music player and starts playing songs by a specific artist from the user's library." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "The exact name of the artist whose songs are desired to be played." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "The exact name of the artist whose songs are to be played." },
"aiToolClearChatHistoryDesc": { "message": "Clears all message history from the current conversation with the AI assistant." },
"aiToolDeleteDatabaseDesc": { "message": "Deletes the entire local database of the extension, including scanned content, settings, and favorites. This action is irreversible and will reload the application." },
"aiToolUpdateAllTokensDesc": { "message": "Initiates a full scan of all Plex servers and libraries associated with the configured tokens in the extension. Updates all movies, series, artists, and photos." },
"aiToolAddPlexTokenDesc": { "message": "Adds a new X-Plex token to the extension's configuration, allowing the app to scan content from new Plex servers." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "The X-Plex token string to add." },
"aiToolChangeRegionDesc": { "message": "Changes the region used for content discovery in the TMDB API. This will affect results displayed in movie and series sections, as well as streaming providers." },
"aiToolChangeRegionRegionParamDesc": { "message": "The two-letter ISO 3166-1 country code for the new region (e.g., 'US' for United States, 'ES' for Spain, 'MX' for Mexico)." },
"aiToolClearAllFavoritesDesc": { "message": "Removes all movies and series the user has marked as favorites." },
"aiToolUpdateAllTokensDesc": { "message": "Initiates a full scan of all Plex servers and libraries associated with the tokens configured in the extension. Updates all movies, series, artists, and photos." },
"aiToolAddPlexTokenDesc": { "message": "Adds a new X-Plex token to the extension's configuration, allowing the application to scan content from new Plex servers." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "The X-Plex token string to be added." },
"aiToolChangeRegionDesc": { "message": "Changes the region used for content discovery in the TMDB API. This will affect the results shown in the movie and series sections, as well as the streaming providers." },
"aiToolChangeRegionRegionParamDesc": { "message": "The two-letter ISO 3166-1 country code for the new region (e.g., 'US' for the United States, 'ES' for Spain, 'MX' for Mexico)." },
"aiToolClearAllFavoritesDesc": { "message": "Removes all movies and series that the user has marked as favorites." },
"aiToolClearViewingHistoryDesc": { "message": "Clears the user's viewing history from the history page." },
"aiToolClearRecommendationsViewDesc": { "message": "Clears the recommendations view and removes cached recommendations." },
"aiToolSearchNotFound": { "message": "Could not find '$query$' in your library.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navigated to $page$ page.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Error navigating to $page$ page.", "placeholders": { "page": { "content": "$1" } } },
"aiToolSearchNotFound": { "message": "'$query$' not found in your library.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navigated to the $page$ page.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Error navigating to the $page$ page.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Error getting statistics." },
"aiToolItemNotFound": { "message": "Item '$title$' not found.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Showing details for '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Added '$title$' to playlist.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Added '$title$' to the playlist.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Added '$title$' to favorites.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Removed '$title$' from favorites.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Showing recommendations." },
"aiToolApplyFiltersGenreNotFound": { "message": "Genre '$genre$' not found.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filters applied successfully." },
"aiToolPlayMusicNotReady": { "message": "Music player is not ready. Make sure your Plex music library has been scanned." },
"aiToolPlayMusicNotReady": { "message": "The music player is not ready. Make sure your Plex music library has been scanned." },
"aiToolPlayMusicArtistNotFound": { "message": "Artist '$artist_name$' not found.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "No songs found for '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Playing music by '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Chat history cleared." },
"aiToolConfirmDeleteDatabase": { "message": "Are you sure you want to delete the local database? This action is irreversible." },
"aiToolDeleteDatabaseCancelled": { "message": "Database deletion cancelled." },
"aiToolExecutionError": { "message": "Error executing tool '$toolName$': $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Unknown tool: '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolExecutionError": { "message": "Error executing tool '$toolName': $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Unknown tool: '$toolName'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favorites cleared." },
"aiToolFavoritesClearError": { "message": "Error clearing favorites: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recommendations cleared." },
"aiToolRecommendationsClearError": { "message": "Error clearing recommendations: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Database deleted. The page will reload." },
"aiToolDatabaseDeleteError": { "message": "Error deleting database: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "Database deletion is blocked. Close other app tabs." },
"aiToolUpdateAllTokensSuccess": { "message": "All tokens updated successfully." },
"aiToolDatabaseDeleteError": { "message": "Error deleting the database: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "Database deletion is blocked. Close other tabs of the application." },
"aiToolUpdateAllTokensSuccess": { "message": "All tokens have been updated successfully." },
"aiToolUpdateAllTokensError": { "message": "Error updating tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Plex token added successfully." },
"aiToolAddPlexTokenError": { "message": "Error adding Plex token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Region changed to $region$. Content is updating.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Error changing region: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenError": { "message": "Error adding the Plex token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Region changed to $region$. The content is being updated.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Error changing the region: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Viewing history cleared." },
"aiToolViewingHistoryClearError": { "message": "Error clearing viewing history: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "You are a movie and series expert assistant called CinePlex. Your main function is to help users discover content and interact with their library. Follow these rules rigorously: 1. **NEVER** invent that you have performed an action if you have not used a tool for it. For example, do not say 'I have downloaded X' if you have not used the download tool. 2. For recommendation requests or lists (e.g., 'tell me 5 horror movies'), use your own knowledge to generate the list. Present it in a numbered or bulleted format. After showing the list, proactively ask the user if they want you to check availability on their local servers and create an M3U file. 3. **ONLY** if the user confirms that they want to check or download the list, use the `check_and_download_titles_list` tool. Do not use it without explicit confirmation. 4. For any other action such as navigating, getting statistics, or searching for a specific title, use the appropriate tools. Always be concise, friendly, and efficient." },
"aiToolViewingHistoryClearError": { "message": "Error clearing the viewing history: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "You are an expert film and series assistant called CinePlex. Your main function is to help users discover content and interact with their library. Follow these rules strictly: 1. **NEVER** pretend you have performed an action if you have not used a tool for it. For example, do not say 'I have downloaded X' if you have not used the download tool. 2. For recommendation or list requests (e.g., 'tell me 5 horror movies'), use your own knowledge to generate the list. Present it in numbered or bulleted format. After displaying the list, proactively ask the user if they want you to check for availability on their local servers and create an M3U file. 3. **ONLY** if the user confirms they want to check or download the list, use the `check_and_download_titles_list` tool. Do not use it without explicit confirmation. 4. For any other action such as navigating, getting statistics, or searching for a specific title, or filtering by resolution or container, use the appropriate tools. Always be concise, friendly, and efficient." },
"aiToolM3UNoTitlesProvided": { "message": "Please provide a list of titles to create the playlist." },
"aiToolM3UCheckingTitles": { "message": "Checking titles on your local servers..." },
"aiToolM3UCheckingTitles": { "message": "Checking the titles on your local servers..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "I haven't found any of the movies or series from the list on your local servers." },
"aiToolM3UDownloadStarted": { "message": "Done! I found $1 of $2 titles on your servers and started the M3U playlist download.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"aiToolM3UDownloadStarted": { "message": "Done! I found $1 of the $2 titles on your servers and have started the download of the M3U playlist.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Back to Providers" },
"artistsCounterSingle": { "message": "$total$ Artist", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Loading..." },
@ -423,7 +427,7 @@
"generatingAlbumM3U": { "message": "Generating M3U for \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U for album \"$artist$\" generated.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Retrying section \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCESS] Retry for \"$title$\" completed.", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCESS] Retry of \"$title$\" completed.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[FINAL ERROR] Retry failed for \"$title$\": $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Starting retry phase for $count$ sections...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Token $token$... found $count$ servers.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
@ -432,10 +436,14 @@
"errorDuringScan": { "message": "Error during scan: $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Stopping Plex scan..." },
"invalidTokenProvided": { "message": "Invalid token provided." },
"tokenAlreadyExists": { "message": "Token already exists." },
"tokenAlreadyExists": { "message": "The token already exists." },
"tokenAddedSuccessfully": { "message": "Token added successfully." },
"noStreamsFoundForSelection": { "message": "No streams found for selection." },
"noStreamsFoundForSelection": { "message": "No streams found for the selection." },
"autoplayBlocked": { "message": "Autoplay blocked." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Page" }
"page": { "message": "Page" },
"all": { "message": "All" },
"userScore": { "message": "User Score" },
"duration": { "message": "Duration" },
"min": { "message": "Min" },
"max": { "message": "Max" }
}

View File

@ -256,6 +256,8 @@
"mainCast": {"message": "Reparto Principal"},
"seasonsAndEpisodes": {"message": "Temporadas y Episodios"},
"similarContent": {"message": "Contenido Similar"},
"filmography": {"message": "Filmografía"},
"availableOn": {"message": "Disponible en"},
"episodesCount": {"message": "$count$ Episodios", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Temporadas", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
@ -289,8 +291,8 @@
"jellyfinFetchFailed": { "message": "Error al obtener bibliotecas: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "No se encontraron bibliotecas de películas o series en Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ biblioteca(s) de medios encontrada(s).", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Éxito] '$libraryName$' escaneada, $count$ títulos añadidos.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Error al escanear la biblioteca '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Éxito] '$libraryName escaneada, $count$ títulos añadidos.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Error al escanear la biblioteca '$libraryName.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Escaneo Jellyfin completado. Añadidas $movies$ películas y $series$ series.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Credenciales de Jellyfin no configuradas." },
"notFoundOnJellyfin": { "message": "No se encontró \"$query$\" en Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
@ -339,6 +341,8 @@
"aiToolSearchLibraryDesc": { "message": "Busca en la biblioteca de Plex del usuario películas o series por título." },
"aiToolSearchLibraryQueryParamDesc": { "message": "El título de la película o serie a buscar." },
"aiToolSearchLibraryTypeParamDesc": { "message": "El tipo de contenido a buscar. Puede ser 'movie' para películas o 'series' para series. (Opcional)." },
"aiToolSearchLibraryResolutionParamDesc": { "message": "La resolución del video a buscar (por ejemplo, '4k', '1080p'). (Opcional)." },
"aiToolSearchLibraryContainerParamDesc": { "message": "El formato contenedor del video a buscar (por ejemplo, 'mkv', 'mp4'). (Opcional)." },
"aiToolNavigateToPageDesc": { "message": "Navega al usuario a una página específica de la interfaz de la aplicación." },
"aiToolNavigateToPagePageParamDesc": { "message": "El nombre de la página a la que navegar, por ejemplo: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', o 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Obtiene y muestra las estadísticas de la biblioteca del usuario, como el número total de películas, series y artistas únicos." },
@ -373,27 +377,27 @@
"aiToolClearAllFavoritesDesc": { "message": "Elimina todas las películas y series que el usuario ha marcado como favoritas." },
"aiToolClearViewingHistoryDesc": { "message": "Borra el historial de visualización del usuario de la página de historial." },
"aiToolClearRecommendationsViewDesc": { "message": "Limpia la vista de recomendaciones y elimina las recomendaciones almacenadas en caché." },
"aiToolSearchNotFound": { "message": "No se encontró '$query$' en tu biblioteca.", "placeholders": { "query": { "content": "$1" } } },
"aiToolSearchNotFound": { "message": "No se encontró '$query en tu biblioteca.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navegado a la página de $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Error al navegar a la página de $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Error al obtener estadísticas." },
"aiToolItemNotFound": { "message": "No se encontró el elemento '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Mostrando detalles de '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Añadido '$title$' a la lista de reproducción.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Añadido '$title$' a favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Eliminado '$title$' de favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolItemNotFound": { "message": "No se encontró el elemento '$title.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Mostrando detalles de '$title.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Añadido '$title a la lista de reproducción.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Añadido '$title a favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Eliminado '$title de favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Mostrando recomendaciones." },
"aiToolApplyFiltersGenreNotFound": { "message": "Género '$genre$' no encontrado.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersGenreNotFound": { "message": "Género '$genre no encontrado.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filtros aplicados correctamente." },
"aiToolPlayMusicNotReady": { "message": "El reproductor de música no está listo. Asegúrate de que tu biblioteca de música de Plex haya sido escaneada." },
"aiToolPlayMusicArtistNotFound": { "message": "Artista '$artist_name$' no encontrado.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "No se encontraron canciones para '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Reproduciendo música de '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicArtistNotFound": { "message": "Artista '$artist_name no encontrado.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "No se encontraron canciones para '$artist_name.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Reproduciendo música de '$artist_name.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Historial de chat borrado." },
"aiToolConfirmDeleteDatabase": { "message": "¿Estás seguro de que quieres eliminar la base de datos local? Esta acción es irreversible." },
"aiToolDeleteDatabaseCancelled": { "message": "Eliminación de la base de datos cancelada." },
"aiToolExecutionError": { "message": "Error al ejecutar la herramienta '$toolName$': $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Herramienta desconocida: '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolExecutionError": { "message": "Error al ejecutar la herramienta '$toolName: $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Herramienta desconocida: '$toolName.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favoritos eliminados." },
"aiToolFavoritesClearError": { "message": "Error al eliminar los favoritos: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recomendaciones eliminadas." },
@ -409,7 +413,7 @@
"aiToolChangeRegionError": { "message": "Error al cambiar la región: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Historial de visualización borrado." },
"aiToolViewingHistoryClearError": { "message": "Error al borrar el historial de visualización: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Eres un asistente experto en cine y series llamado CinePlex. Tu función principal es ayudar a los usuarios a descubrir contenido y a interactuar con su biblioteca. Sigue estas reglas rigurosamente: 1. **NUNCA** inventes que has realizado una acción si no has usado una herramienta para ello. Por ejemplo, no digas 'he descargado X' si no has usado la herramienta de descarga. 2. Para peticiones de recomendaciones o listas (ej. 'dime 5 películas de terror'), usa tu propio conocimiento para generar la lista. Preséntala en formato numerado o con viñetas. Después de mostrar la lista, pregunta proactivamente al usuario si quiere que compruebes la disponibilidad en sus servidores locales y crees un archivo M3U. 3. **SOLO** si el usuario confirma que quiere comprobar o descargar la lista, utiliza la herramienta `check_and_download_titles_list`. No la uses sin confirmación explícita. 4. Para cualquier otra acción como navegar, obtener estadísticas o buscar un título específico, usa las herramientas apropiadas. Sé siempre conciso, amigable y eficiente." },
"aiSystemPrompt_v3": { "message": "Eres un asistente experto en cine y series llamado CinePlex. Tu función principal es ayudar a los usuarios a descubrir contenido y a interactuar con su biblioteca. Sigue estas reglas rigurosamente: 1. **NUNCA** inventes que has realizado una acción si no has usado una herramienta para ello. Por ejemplo, no digas 'he descargado X' si no has usado la herramienta de descarga. 2. Para peticiones de recomendaciones o listas (ej. 'dime 5 películas de terror'), usa tu propio conocimiento para generar la lista. Preséntala en formato numerado o con viñetas. Después de mostrar la lista, pregunta proactivamente al usuario si quiere que compruebes la disponibilidad en sus servidores locales y crees un archivo M3U. 3. **SOLO** si el usuario confirma que quiere comprobar o descargar la lista, utiliza la herramienta `check_and_download_titles_list`. No la uses sin confirmación explícita. 4. Para cualquier otra acción como navegar, obtener estadísticas o buscar un título específico, o filtrar por resolución o contenedor, usa las herramientas apropiadas. Sé siempre conciso, amigable y eficiente." },
"aiToolM3UNoTitlesProvided": { "message": "Por favor, proporciona una lista de títulos para crear la lista de reproducción." },
"aiToolM3UCheckingTitles": { "message": "Comprobando los títulos en tus servidores locales..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "No he encontrado ninguna de las películas o series de la lista en tus servidores locales." },
@ -437,5 +441,10 @@
"noStreamsFoundForSelection": { "message": "No se encontraron streams para la selección." },
"autoplayBlocked": { "message": "Reproducción automática bloqueada." },
"welcomeToCinePlex": { "message": "Bienvenido a CinePlex" },
"page": { "message": "Página" }
"page": { "message": "Página" },
"all": { "message": "Todo" },
"userScore": { "message": "Puntuación" },
"duration": { "message": "Duración" },
"min": { "message": "Mín" },
"max": { "message": "Máx" }
}

View File

@ -1,8 +1,8 @@
{
"appName": { "message": "CinePlex" },
"appDescription": { "message": "Scanne les serveurs Plex pour trouver du contenu et l'affiche dans l'interface" },
"appDescription": { "message": "Scanne les serveurs Plex à la recherche de contenu et l'affiche dans l'interface" },
"appTagline": { "message": "Films, Séries et Musique" },
"appLocaleCode": { "message": "fr" },
"appLocaleCode": { "message": "fr-FR" },
"toggleNavigation": { "message": "Basculer la navigation" },
"searchPlaceholder": { "message": "Rechercher des films ou des séries..." },
"openMusicPlayer": { "message": "Ouvrir le lecteur de musique" },
@ -17,10 +17,10 @@
"navRecommendations": { "message": "Recommandations" },
"navMusic": { "message": "Musique" },
"navM3uGenerator": { "message": "Générateur M3U" },
"heroWelcome": { "message": "" },
"heroWelcome": { "message": "Bienvenue sur CinePlex" },
"heroSubtitle": { "message": "Explorez des milliers de films et de séries." },
"addStream": { "message": "Ajouter un stream" },
"moreInfo": { "message": "Plus d'informations" },
"addStream": { "message": "Ajouter un flux" },
"moreInfo": { "message": "Plus d'infos" },
"popularMovies": { "message": "Films populaires" },
"allGenres": { "message": "Tous les genres" },
"allYears": { "message": "Toutes les années" },
@ -29,11 +29,11 @@
"sortRecent": { "message": "Les plus récents" },
"loadMore": { "message": "Charger plus" },
"photosBreadcrumbHome": { "message": "Albums" },
"selectServer": { "message": "Sélectionner un serveur" },
"selectServer": { "message": "Sélectionnez un serveur" },
"loading": { "message": "Chargement..." },
"loadingLibraries": { "message": "Chargement des bibliothèques..." },
"photosEmptyState": { "message": "Aucun album ou photo trouvé." },
"photosEmptyStateSub": { "message": "Veuillez sélectionner un serveur ou assurez-vous d'avoir une bibliothèque de photos dans Plex." },
"photosEmptyStateSub": { "message": "Veuillez sélectionner un serveur ou vous assurer que vous disposez d'une photothèque dans Plex." },
"statsTitle": { "message": "Statistiques de la bibliothèque" },
"statsAllTokens": { "message": "Tous les jetons" },
"statsAnalyzing": { "message": "Analyse de votre bibliothèque..." },
@ -42,14 +42,14 @@
"statsUniqueMovies": { "message": "Films uniques" },
"statsUniqueSeries": { "message": "Séries uniques" },
"statsUniqueArtists": { "message": "Artistes uniques" },
"statsTokenServers": { "message": "Serveurs du jeton" },
"statsTokenServers": { "message": "Serveurs de jetons" },
"statsChartMoviesByGenre": { "message": "Contenu par genre (Films)" },
"statsChartSeriesByGenre": { "message": "Contenu par genre (Séries)" },
"statsChartByDecade": { "message": "Contenu par décennie" },
"recommendationsTitle": { "message": "Recommandations pour vous" },
"historyTitle": { "message": "Historique de visionnage" },
"clearHistory": { "message": "Tout effacer" },
"consoleTitle": { "message": "Console de scan Plex" },
"consoleTitle": { "message": "Console d'analyse Plex" },
"footerCredit": { "message": "Une interface pour votre univers Plex." },
"closeTrailer": { "message": "Fermer la bande-annonce" },
"close": { "message": "Fermer" },
@ -57,51 +57,51 @@
"previous": { "message": "Précédent" },
"next": { "message": "Suivant" },
"notificationTemplateText": { "message": "Notification" },
"settingsTitleFull": { "message": "Réglages et Configuration" },
"settingsTitleFull": { "message": "Paramètres et configuration" },
"settingsTabGeneral": { "message": "Général" },
"settingsTabPlex": { "message": "Plex" },
"settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "Générateur PHP" },
"settingsTabData": { "message": "Données" },
"settingsApiServer": { "message": "Configuration API et serveur" },
"settingsTmdbApiLabel": { "message": "Clé API TMDB (Facultatif)" },
"settingsTmdbApiPlaceholder": { "message": "La clé par défaut sera utilisée si laissée vide" },
"settingsGoogleApiLabel": { "message": "Clé API Google Gemini (Facultatif)" },
"settingsGoogleApiPlaceholder": { "message": "Nécessaire pour utiliser l'assistant IA" },
"settingsApiServer": { "message": "Paramètres API et serveur" },
"settingsTmdbApiLabel": { "message": "Clé API TMDB (facultatif)" },
"settingsTmdbApiPlaceholder": { "message": "La clé par défaut sera utilisée si ce champ est laissé vide" },
"settingsGoogleApiLabel": { "message": "Clé API Google Gemini (facultatif)" },
"settingsGoogleApiPlaceholder": { "message": "Requis pour utiliser l'assistant IA" },
"settingsRegionLabel": { "message": "Région pour la découverte de contenu" },
"allRegions": { "message": "Toutes les régions" },
"settingsPhpUrlLabel": { "message": "URL du serveur pour ajouter des streams" },
"settingsPhpUrlPlaceholder": { "message": "https://votre-serveur.com/chemin/vers/le-script.php" },
"settingsPhpUrlLabel": { "message": "URL du serveur pour l'ajout de flux" },
"settingsPhpUrlPlaceholder": { "message": "https://votre-serveur.com/chemin/vers/script.php" },
"settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Mode clair" },
"settingsShowHero": { "message": "Afficher la section de bienvenue 'Hero'" },
"settingsScanContent": { "message": "Scan de contenu" },
"settingsScanDesc": { "message": "Sélectionnez ce que vous voulez scanner et cliquez sur le bouton." },
"settingsShowHero": { "message": "Afficher la section d'accueil 'Hero'" },
"settingsScanContent": { "message": "Analyse du contenu" },
"settingsScanDesc": { "message": "Sélectionnez les éléments à analyser et appuyez sur le bouton." },
"settingsScanMovies": { "message": "Films" },
"settingsScanShows": { "message": "Séries" },
"settingsScanArtists": { "message": "Musique" },
"settingsScanPhotos": { "message": "Photos" },
"settingsSelectAll": { "message": "Tout sélectionner" },
"settingsStartScan": { "message": "Lancer le scan" },
"settingsStartScan": { "message": "Démarrer l'analyse" },
"settingsPlexTokens": { "message": "Jetons Plex" },
"settingsPlexTokensDesc": { "message": "Modifier la liste des jetons Plex (format JSON)." },
"settingsSaveTokens": { "message": "Sauvegarder les jetons" },
"settingsJellyfinTitle": { "message": "Configuration Jellyfin" },
"settingsJellyfinDesc": { "message": "Ajoutez les détails de votre serveur Jellyfin pour scanner son contenu." },
"settingsPlexTokensDesc": { "message": "Modifiez la liste des jetons Plex (format JSON)." },
"settingsSaveTokens": { "message": "Enregistrer les jetons" },
"settingsJellyfinTitle": { "message": "Paramètres Jellyfin" },
"settingsJellyfinDesc": { "message": "Ajoutez les détails de votre serveur Jellyfin pour analyser son contenu." },
"jellyfinUrlLabel": { "message": "URL du serveur Jellyfin" },
"jellyfinUserLabel": { "message": "Nom d'utilisateur" },
"jellyfinPassLabel": { "message": "Mot de passe" },
"jellyfinConnectAndScan": { "message": "Connecter et scanner" },
"settingsPhpGenTitle": { "message": "Générateur de script PHP pour le serveur" },
"jellyfinConnectAndScan": { "message": "Connecter et analyser" },
"settingsPhpGenTitle": { "message": "Générateur de script PHP pour serveur" },
"settingsPhpFileOptions": { "message": "Options de fichier" },
"settingsPhpSavePathLabel": { "message": "Chemin de sauvegarde sur le serveur" },
"settingsPhpSavePathLabel": { "message": "Chemin d'enregistrement sur le serveur" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listes (vide pour le même dossier)" },
"settingsPhpFilenameLabel": { "message": "Nom de fichier" },
"settingsPhpFileAction": { "message": "Action sur le fichier" },
"settingsPhpActionAppend": { "message": "Ajouter à la fin du fichier (cumulatif)" },
"settingsPhpActionOverwrite": { "message": "Écraser le fichier (repartir de zéro)" },
"settingsPhpSecurity": { "message": "Sécurité (Facultatif)" },
"settingsPhpUseSecretKey": { "message": "Utiliser une clé secrète (Recommandé)" },
"settingsPhpSecurity": { "message": "Sécurité (facultatif)" },
"settingsPhpUseSecretKey": { "message": "Utiliser une clé secrète (recommandé)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Saisissez une clé secrète sécurisée" },
"settingsPhpGeneratedCode": { "message": "Code généré" },
"settingsPhpGeneratedPlaceholder": { "message": "Le code PHP généré apparaîtra ici." },
@ -111,20 +111,20 @@
"settingsImportDb": { "message": "Importer la base de données depuis un fichier" },
"settingsExportDb": { "message": "Exporter la base de données vers un fichier" },
"settingsClearContent": { "message": "Effacer les données de contenu local" },
"settingsClearContentDesc": { "message": "Cette action supprimera les films, séries et musiques de la base de données locale, mais n'affectera pas vos favoris ni vos paramètres." },
"settingsClearContentDesc": { "message": "Cette action supprimera les films, les séries et la musique de la base de données locale, mais n'affectera pas vos favoris ni vos paramètres." },
"settingsClose": { "message": "Fermer" },
"settingsSave": { "message": "Enregistrer les paramètres" },
"musicSidenavTitle": { "message": "Musique de Plex" },
"musicSidenavTitle": { "message": "Musique Plex" },
"musicAllServers": { "message": "Tous les serveurs" },
"musicSearchArtistPlaceholder": { "message": "Rechercher un artiste..." },
"musicSearchDiscographyPlaceholder": { "message": "Rechercher dans la discographie..." },
"musicNothingPlaying": { "message": "Rien ne joue" },
"musicNothingPlaying": { "message": "Aucune lecture en cours" },
"musicSelectSong": { "message": "Sélectionnez une chanson" },
"musicToStart": { "message": "pour commencer à jouer" },
"musicToStart": { "message": "pour démarrer la lecture" },
"miniplayerDownloadSong": { "message": "Télécharger la chanson" },
"miniplayerDownloadAlbum": { "message": "Télécharger l'album M3U" },
"miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Lecture aléatoire" },
"miniplayerShuffle": { "message": "Aléatoire" },
"miniplayerEqualizer": { "message": "Égaliseur" },
"miniplayerOpenList": { "message": "Ouvrir la liste" },
"eqTitle": { "message": "Égaliseur graphique" },
@ -134,8 +134,8 @@
"eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Classique" },
"eqPresetBassBoost": { "message": "Accentuation des basses" },
"eqPreampLabel": { "message": "Préamplificateur" },
"eqPresetBassBoost": { "message": "Amplification des basses" },
"eqPreampLabel": { "message": "Préampli" },
"infoModalTitle": { "message": "Informations" },
"infoModalFieldTitle": { "message": "Titre :" },
"infoModalFieldArtist": { "message": "Artiste :" },
@ -149,7 +149,7 @@
"lang_de": { "message": "Allemand" },
"lang_it": { "message": "Italien" },
"lang_pt": { "message": "Portugais" },
"essentialFeaturesNotSupported": { "message": "Votre navigateur ne prend pas en charge les fonctions essentielles." },
"essentialFeaturesNotSupported": { "message": "Votre navigateur ne prend pas en charge les fonctionnalités essentielles." },
"dbAccessError": { "message": "Erreur d'accès à la base de données locale." },
"dbUpdateNeeded": { "message": "La base de données doit être mise à jour, veuillez recharger la page." },
"dbBlocked": { "message": "Veuillez fermer les autres onglets de cette application pour continuer." },
@ -158,23 +158,23 @@
"contentDataDeleted": { "message": "Données de contenu supprimées d'IndexedDB." },
"errorDeletingData": { "message": "Erreur lors de la suppression des données : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Éditeur de texte non disponible." },
"errorLoadingTokens": { "message": "Erreur lors du chargement des jetons pour l'édition." },
"errorLoadingTokens": { "message": "Erreur lors du chargement des jetons pour modification." },
"errorLoadingTokensMessage": { "message": "Erreur lors du chargement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Éditeur non disponible pour la sauvegarde." },
"invalidJsonFormat": { "message": "Format JSON invalide. Doit être { \"tokens\": [...] }" },
"aceEditorNotAvailableToSave": { "message": "Éditeur non disponible pour l'enregistrement." },
"invalidJsonFormat": { "message": "Format JSON non valide. Il doit être { \"tokens\": [...] }" },
"tokensSaved": { "message": "Jetons enregistrés avec succès." },
"errorSavingTokens": { "message": "Erreur lors de l'enregistrement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB n'est pas disponible." },
"dbExported": { "message": "Base de données exportée avec succès." },
"errorExportingDb": { "message": "Erreur lors de l'exportation de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "Le fichier ne contient pas d'objet JSON valide." },
"noDataToImport": { "message": "Le fichier ne contient pas de données pour les sections de la base de données actuelle." },
"noDataToImport": { "message": "Le fichier ne contient aucune donnée pour les sections actuelles de la base de données." },
"dbImported": { "message": "Base de données importée avec succès." },
"errorImportingDb": { "message": "Erreur lors de l'importation de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Mise à jour de la vue avec les nouvelles données..." },
"confirmClearContent": { "message": "Êtes-vous sûr de vouloir supprimer les données de contenu local (films, séries, musique, etc.) ? Les favoris et les paramètres NE SERONT PAS supprimés." },
"confirmClearContent": { "message": "Êtes-vous sûr de vouloir supprimer les données de contenu local (films, séries, musique, etc.) ? Les favoris et les paramètres ne seront PAS supprimés." },
"trailerNotFound": { "message": "Aucune bande-annonce trouvée pour ce titre." },
"confirmClearHistory": { "message": "Êtes-vous sûr de vouloir effacer tout votre historique de visionnage ? Cette action ne peut pas être annulée." },
"confirmClearHistory": { "message": "Êtes-vous sûr de vouloir effacer tout votre historique de visionnage ? Cette action est irréversible." },
"historyCleared": { "message": "Historique de visionnage effacé." },
"historyItemDeleted": { "message": "Élément supprimé de l'historique." },
"errorGeneratingScript": { "message": "Générez d'abord un script pour pouvoir le copier." },
@ -192,33 +192,33 @@
"historyEmpty": { "message": "Votre historique est vide." },
"historyEmptySub": { "message": "Explorez et regardez du contenu pour qu'il apparaisse ici." },
"errorGeneratingRecommendations": { "message": "Erreur lors de la génération des recommandations." },
"noRecommendations": { "message": "Nous devons mieux vous connaître pour vous donner des recommandations !" },
"noRecommendations": { "message": "Nous avons besoin de mieux vous connaître pour vous faire des recommandations !" },
"errorGeneratingStats": { "message": "Erreur lors de la génération des statistiques." },
"noServersForToken": { "message": "Aucun serveur associé trouvé pour ce jeton." },
"searchingActorContent": { "message": "Recherche de contenu de $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Impossible de charger le contenu pour $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Erreur lors de l'ajout de stream(s) : $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "L'URL du serveur PHP n'est pas configurée. Veuillez la configurer dans les Paramètres." },
"searchingStreams": { "message": "Recherche de streams pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Envoi de $count$ stream(s) au serveur...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) ajouté(s) avec succès." },
"generatingM3U": { "message": "Génération M3U pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"errorAddingStream": { "message": "Erreur lors de l'ajout de flux : $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "L'URL du serveur PHP n'est pas configurée. Veuillez la configurer dans les paramètres." },
"searchingStreams": { "message": "Recherche de flux pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Envoi de $count$ flux au serveur...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Flux ajouté(s) avec succès." },
"generatingM3U": { "message": "Génération de M3U pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" téléchargé.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Erreur lors de la génération M3U : $message$", "placeholders": { "message": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Erreur lors de la génération de M3U : $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Paramètres enregistrés avec succès." },
"errorSavingSettings": { "message": "Erreur lors de l'enregistrement des paramètres dans la base de données." },
"languageChangeReload": { "message": "Langue changée. L'application va maintenant être rechargée." },
"languageChangeReload": { "message": "Langue modifiée. L'application va maintenant se recharger." },
"addedToFavorites": { "message": "Ajouté aux favoris." },
"removedFromFavorites": { "message": "Supprimé des favoris." },
"plexScanInProgress": { "message": "Le scan Plex est déjà en cours." },
"plexScanStarting": { "message": "Démarrage du scan Plex..." },
"plexScanInProgress": { "message": "L'analyse Plex est déjà en cours." },
"plexScanStarting": { "message": "Démarrage de l'analyse Plex..." },
"noPlexTokens": { "message": "Aucun jeton Plex configuré." },
"clearingSections": { "message": "Nettoyage des sections : $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Phase de scan initiale terminée." },
"retryPhaseFinished": { "message": "Phase de réessais terminée." },
"plexScanFinished": { "message": "Scan terminé. Mise à jour du contenu..." },
"scanCancelled": { "message": "Scan annulé par l'utilisateur." },
"scanCancelledInfo": { "message": "Scan annulé." },
"clearingSections": { "message": "Effacement des sections : $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Phase d'analyse initiale terminée." },
"retryPhaseFinished": { "message": "Phase de nouvelle tentative terminée." },
"plexScanFinished": { "message": "Analyse terminée. Mise à jour du contenu..." },
"scanCancelled": { "message": "Analyse annulée par l'utilisateur." },
"scanCancelledInfo": { "message": "Analyse annulée." },
"errorInitializingMusicPlayer": { "message": "Erreur lors de l'initialisation du lecteur de musique." },
"criticalErrorLoadingMusic": { "message": "Erreur critique lors du chargement des données musicales." },
"errorLoadingArtists": { "message": "Erreur lors du chargement des artistes." },
@ -243,29 +243,31 @@
"searchResultsFor": {"message": "Résultats pour \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Contenu de $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Explorer"},
"noGenre": {"message": "Sans catégorie"},
"noGenre": {"message": "Non classé"},
"synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "Aucune synopsis disponible."},
"noSynopsis": {"message": "Aucun synopsis disponible."},
"director": {"message": "Réalisateur :"},
"writer": {"message": "Scénariste :"},
"viewOnImdb": {"message": "Voir sur IMDb"},
"watchTrailer": {"message": "Voir la bande-annonce"},
"watchTrailer": {"message": "Regarder la bande-annonce"},
"addToFavorites": {"message": "Ajouter aux favoris"},
"removeFromFavorites": {"message": "Supprimer des favoris"},
"removeFromFavorites": {"message": "Retirer des favoris"},
"notAvailable": {"message": "Non disponible"},
"mainCast": {"message": "Distribution principale"},
"seasonsAndEpisodes": {"message": "Saisons et épisodes"},
"similarContent": {"message": "Contenu similaire"},
"episodesCount": {"message": "$count$ Épisodes", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Saisons", "placeholders": {"count": {"content": "$1"}}},
"filmography": {"message": "Filmographie"},
"availableOn": {"message": "Disponible sur"},
"episodesCount": {"message": "$count$ épisodes", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ saisons", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Aucune bande-annonce trouvée pour ce titre."},
"fatalInitError": {"message": "Erreur d'initialisation fatale"},
"fatalInitErrorSub": {"message": "Impossible de charger l'application."},
"invalidStreamInfo": {"message": "Informations invalides."},
"invalidStreamInfo": {"message": "Informations non valides."},
"dbUnavailableForStreams": {"message": "Base de données locale non disponible."},
"noPlexServersForStreams": {"message": "Aucun serveur Plex."},
"notFoundOnServers": {"message": "Impossible de trouver \"$query$\" sur les serveurs Plex.", "placeholders": {"query": {"content": "$1"}}},
"notFoundOnServers": {"message": "\"$query$\" introuvable sur les serveurs Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "À l'instant" },
"relativeTime_minutesAgo": { "message": "Il y a $count$ minutes", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "Il y a $count$ heures", "placeholders": { "count": { "content": "$1" } } },
@ -273,35 +275,35 @@
"relativeTime_daysAgo": { "message": "Il y a $count$ jours", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Erreur lors du chargement des détails" },
"errorLoadingLocalContent": { "message": "Erreur lors du chargement du contenu local." },
"errorServerResponse": { "message": "Réponse du serveur non réussie." },
"errorServerResponse": { "message": "Réponse du serveur infructueuse." },
"errorPlexApi": { "message": "Erreur $status$ de l'API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Erreur lors de l'analyse du XML Plex." },
"untitled": { "message": "Sans titre" },
"itemCount": { "message": "$count$ éléments", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Aucun serveur photo" },
"jellyfinScanInProgress": { "message": "Le scan Jellyfin est déjà en cours." },
"jellyfinScanning": { "message": "Scan de Jellyfin en cours..." },
"jellyfinMissingCredentials": { "message": "Veuillez compléter l'URL et l'utilisateur de Jellyfin." },
"jellyfinConnecting": { "message": "Connexion à Jellyfin en cours : $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinScanInProgress": { "message": "L'analyse Jellyfin est déjà en cours." },
"jellyfinScanning": { "message": "Analyse de Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Veuillez compléter l'URL et le nom d'utilisateur de Jellyfin." },
"jellyfinConnecting": { "message": "Connexion à Jellyfin à : $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Échec de l'authentification Jellyfin : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Authentification Jellyfin réussie." },
"jellyfinFetchingLibraries": { "message": "Récupération des bibliothèques..." },
"jellyfinFetchFailed": { "message": "Erreur lors de la récupération des bibliothèques : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Aucune bibliothèque de films ou de séries trouvée dans Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ bibliothèque(s) multimédia(s) trouvée(s).", "placeholders": {"count": {"content": "$1"}}},
"jellyfinLibraryScanSuccess": { "message": "[Succès] '$libraryName$' scanné, $count$ titres ajoutés.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Erreur lors du scan de la bibliothèque '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Scan Jellyfin terminé. $movies$ films et $series$ séries ajoutés.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Identifiants Jellyfin non configurés." },
"notFoundOnJellyfin": { "message": "Impossible de trouver \"$query$\" sur Jellyfin.", "placeholders": {"query": {"content": "$1"}}},
"notFoundOnAnyServer": { "message": "Impossible de trouver \"$query$\" sur aucun serveur.", "placeholders": {"query": {"content": "$1"}}},
"jellyfinLibrariesFound": { "message": "$count$ bibliothèque(s) multimédia(s) trouvée(s).", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Succès] '$libraryName' analysée, $count$ titres ajoutés.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Erreur lors de l'analyse de la bibliothèque '$libraryName'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Analyse Jellyfin terminée. $movies$ films et $series$ séries ajoutés.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Informations d'identification Jellyfin non configurées." },
"notFoundOnJellyfin": { "message": "\"$query$\" introuvable sur Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" introuvable sur aucun serveur.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "Sur Plex" },
"searchOnPlex": { "message": "Rechercher sur Plex" },
"jellyfinTitle": { "message": "Contenu Jellyfin" },
"noJellyfinContent": { "message": "Aucun contenu Jellyfin trouvé." },
"noJellyfinContentSub": { "message": "Assurez-vous d'avoir scanné votre serveur Jellyfin dans les paramètres." },
"noJellyfinContentSub": { "message": "Assurez-vous d'avoir analysé votre serveur Jellyfin dans les paramètres." },
"activityViewerTitle": { "message": "Visionneuse d'activité du serveur" },
"activitySelectServer": { "message": "Sélectionner un serveur" },
"activitySelectServer": { "message": "Sélectionnez un serveur" },
"activityCheckBtn": { "message": "Actualiser" },
"activityNoSessions": { "message": "Aucune session active sur ce serveur." },
"activitySessionUser": { "message": "Utilisateur" },
@ -316,7 +318,7 @@
"noProvidersFound": { "message": "Aucun fournisseur trouvé." },
"availableOnPlex": { "message": "Disponible sur Plex" },
"m3uGeneratorTitle": { "message": "Générateur de listes M3U" },
"selectAServer": { "message": "Sélectionner un serveur..." },
"selectAServer": { "message": "Sélectionnez un serveur..." },
"downloadM3u": { "message": "Télécharger M3U" },
"m3uGenerator": { "message": "Générateur M3U" },
"selectLibraries": { "message": "Sélectionner les bibliothèques" },
@ -328,72 +330,74 @@
"chatOpen": { "message": "Ouvrir le chat" },
"chatTitle": { "message": "Assistant IA" },
"chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Écrivez votre message..." },
"chatPlaceholder": { "message": "Saisissez votre message..." },
"chatSend": { "message": "➤" },
"chatWelcome": { "message": "Bienvenue ! Je suis votre assistant CinePlex. Demandez-moi des informations sur les films, les séries ou tout ce que vous voulez savoir." },
"chatGoogleApiKeyMissing": { "message": "La clé API Google Gemini n'est pas configurée. Veuillez la configurer dans les paramètres de l'extension pour utiliser l'assistant IA." },
"chatApiInvalidResponse": { "message": "L'API a renvoyé une réponse invalide. Veuillez réessayer." },
"chatWelcome": { "message": "Bienvenue ! Je suis votre assistant CinePlex. Posez-moi des questions sur les films, les séries ou tout ce que vous voulez savoir." },
"chatGoogleApiKeyMissing": { "message": "La clé API Google Gemini n'est pas configurée. Veuillez la définir dans les paramètres de l'extension pour utiliser l'assistant IA." },
"chatApiInvalidResponse": { "message": "L'API a renvoyé une réponse non valide. Veuillez réessayer." },
"chatApiError": { "message": "Erreur de communication avec l'assistant IA" },
"downloadAll": { "message": "Tout télécharger" },
"download": { "message": "Télécharger" },
"aiToolSearchLibraryDesc": { "message": "Recherche dans la bibliothèque Plex de l'utilisateur des films ou séries par titre." },
"aiToolSearchLibraryDesc": { "message": "Recherche dans la bibliothèque Plex de l'utilisateur des films ou des séries par titre." },
"aiToolSearchLibraryQueryParamDesc": { "message": "Le titre du film ou de la série à rechercher." },
"aiToolSearchLibraryTypeParamDesc": { "message": "Le type de contenu à rechercher. Peut être 'movie' pour les films ou 'series' pour les séries. (Facultatif)." },
"aiToolNavigateToPageDesc": { "message": "Navigue l'utilisateur vers une page spécifique de l'interface de l'application." },
"aiToolNavigateToPagePageParamDesc": { "message": "Le nom de la page à naviguer, par exemple : 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', ou 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Obtient et affiche les statistiques de la bibliothèque de l'utilisateur, telles que le nombre total de films, séries et artistes uniques." },
"aiToolSearchLibraryResolutionParamDesc": { "message": "La résolution vidéo à rechercher (par exemple, '4k', '1080p'). (Facultatif)." },
"aiToolSearchLibraryContainerParamDesc": { "message": "Le format de conteneur vidéo à rechercher (par exemple, 'mkv', 'mp4'). (Facultatif)." },
"aiToolNavigateToPageDesc": { "message": "Dirige l'utilisateur vers une page spécifique de l'interface de l'application." },
"aiToolNavigateToPagePageParamDesc": { "message": "Le nom de la page vers laquelle naviguer, par exemple : 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers' ou 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Récupère et affiche les statistiques de la bibliothèque de l'utilisateur, telles que le nombre total de films, de séries et d'artistes uniques." },
"aiToolShowItemDetailsDesc": { "message": "Affiche la page de détails d'un film ou d'une série spécifique par son titre et son type." },
"aiToolShowItemDetailsTitleParamDesc": { "message": "Le titre exact du film ou de la série." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Ajoute un film ou une série à la liste de lecture actuelle de l'utilisateur pour la diffuser à un serveur PHP configuré." },
"aiToolAddToPlaylistDesc": { "message": "Ajoute un film ou une série à la liste de lecture actuelle de l'utilisateur pour le diffuser sur un serveur PHP configuré." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "Le titre du film ou de la série à ajouter." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolCheckAndDownloadDesc": { "message": "Vérifie la disponibilité d'une liste de titres de films ou de séries sur les serveurs locaux de l'utilisateur et, si trouvés, génère et télécharge un fichier de playlist M3U avec les streams trouvés." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Un tableau de titres de films ou de séries à rechercher et télécharger." },
"aiToolCheckAndDownloadDesc": { "message": "Vérifie la disponibilité d'une liste de titres de films ou de séries sur les serveurs locaux de l'utilisateur et, si trouvés, génère et télécharge un fichier de liste de lecture M3U avec les flux trouvés." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Un tableau de titres de films ou de séries à rechercher et à télécharger." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "Le type de contenu de la liste. Doit être 'movie' ou 'series'." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "Le nom du fichier M3U à télécharger (par exemple, 'MaListe.m3u'). S'il n'est pas fourni, un nom par défaut sera utilisé." },
"aiToolToggleFavoriteDesc": { "message": "Ajoute ou retire un film ou une série de la liste des favoris de l'utilisateur." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "Le nom du fichier M3U à télécharger (par exemple, 'MaListe.m3u'). Si aucun nom n'est fourni, un nom par défaut sera utilisé." },
"aiToolToggleFavoriteDesc": { "message": "Ajoute ou supprime un film ou une série de la liste des favoris de l'utilisateur." },
"aiToolToggleFavoriteTitleParamDesc": { "message": "Le titre du film ou de la série." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Génère et affiche une liste de recommandations de films ou de séries basées sur l'historique de visionnage et les favoris de l'utilisateur." },
"aiToolApplyFiltersDesc": { "message": "Applique des filtres à la vue actuelle des films ou des séries, permettant d'affiner les résultats par type, genre, année et ordre de classement." },
"aiToolApplyFiltersDesc": { "message": "Applique des filtres à la vue actuelle des films ou des séries, permettant d'affiner les résultats par type, genre, année et ordre de tri." },
"aiToolApplyFiltersTypeParamDesc": { "message": "Le type de contenu auquel appliquer les filtres. Doit être 'movie' ou 'series'." },
"aiToolApplyFiltersGenreParamDesc": { "message": "Le nom du genre par lequel filtrer (par exemple, 'Action', 'Drame')." },
"aiToolApplyFiltersYearParamDesc": { "message": "L'année de sortie par laquelle filtrer (par exemple, '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "Le critère de tri pour les résultats. Valeurs valides : 'popularity.desc' (populaires), 'vote_average.desc' (mieux notés), 'release_date.desc' (récents pour les films) ou 'first_air_date.desc' (récents pour les séries)." },
"aiToolPlayMusicByArtistDesc": { "message": "Ouvre le lecteur de musique et commence à jouer des chansons d'un artiste spécifique de la bibliothèque de l'utilisateur." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "Le nom exact de l'artiste dont les chansons sont à jouer." },
"aiToolClearChatHistoryDesc": { "message": "Efface tout l'historique des messages de la conversation actuelle avec l'assistant IA." },
"aiToolDeleteDatabaseDesc": { "message": "Supprime toute la base de données locale de l'extension, y compris le contenu scanné, les paramètres et les favoris. Cette action est irréversible et rechargera l'application." },
"aiToolUpdateAllTokensDesc": { "message": "Lance un scan complet de tous les serveurs et bibliothèques Plex associés aux jetons configurés dans l'extension. Met à jour tous les films, séries, artistes et photos." },
"aiToolAddPlexTokenDesc": { "message": "Ajoute un nouveau jeton X-Plex à la configuration de l'extension, permettant à l'application de scanner le contenu des nouveaux serveurs Plex." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "La chaîne du jeton X-Plex à ajouter." },
"aiToolChangeRegionDesc": { "message": "Change la région utilisée pour la découverte de contenu dans l'API TMDB. Cela affectera les résultats affichés dans les sections de films et de séries, ainsi que les fournisseurs de streaming." },
"aiToolChangeRegionRegionParamDesc": { "message": "Le code pays ISO 3166-1 à deux lettres pour la nouvelle région (par exemple, 'US' pour les États-Unis, 'ES' pour l'Espagne, 'MX' pour le Mexique)." },
"aiToolPlayMusicByArtistDesc": { "message": "Ouvre le lecteur de musique et commence à jouer les chansons d'un artiste spécifique de la bibliothèque de l'utilisateur." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "Le nom exact de l'artiste dont les chansons doivent être jouées." },
"aiToolClearChatHistoryDesc": { "message": "Efface tout l'historique des messages de la conversation en cours avec l'assistant IA." },
"aiToolDeleteDatabaseDesc": { "message": "Supprime l'intégralité de la base de données locale de l'extension, y compris le contenu analysé, les paramètres et les favoris. Cette action est irréversible et rechargera l'application." },
"aiToolUpdateAllTokensDesc": { "message": "Lance une analyse complète de tous les serveurs et bibliothèques Plex associés aux jetons configurés dans l'extension. Met à jour tous les films, séries, artistes et photos." },
"aiToolAddPlexTokenDesc": { "message": "Ajoute un nouveau jeton X-Plex à la configuration de l'extension, permettant à l'application d'analyser le contenu de nouveaux serveurs Plex." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "La chaîne de jeton X-Plex à ajouter." },
"aiToolChangeRegionDesc": { "message": "Modifie la région utilisée pour la découverte de contenu dans l'API TMDB. Cela affectera les résultats affichés dans les sections des films et des séries, ainsi que les fournisseurs de streaming." },
"aiToolChangeRegionRegionParamDesc": { "message": "Le code de pays ISO 3166-1 à deux lettres pour la nouvelle région (par exemple, 'US' pour les États-Unis, 'ES' pour l'Espagne, 'MX' pour le Mexique)." },
"aiToolClearAllFavoritesDesc": { "message": "Supprime tous les films et séries que l'utilisateur a marqués comme favoris." },
"aiToolClearViewingHistoryDesc": { "message": "Efface l'historique de visionnage de l'utilisateur de la page d'historique." },
"aiToolClearRecommendationsViewDesc": { "message": "Nettoie la vue des recommandations et supprime les recommandations mises en cache." },
"aiToolSearchNotFound": { "message": "Impossible de trouver '$query$' dans votre bibliothèque.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navig vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolClearRecommendationsViewDesc": { "message": "Efface la vue des recommandations et supprime les recommandations mises en cache." },
"aiToolSearchNotFound": { "message": "'$query' introuvable dans votre bibliothèque.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navigation vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Erreur lors de la navigation vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Erreur lors de l'obtention des statistiques." },
"aiToolItemNotFound": { "message": "L'élément '$title$' n'a pas été trouvé.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Affichage des détails de '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Ajouté '$title$' à la liste de lecture.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Ajouté '$title$' aux favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Supprimé '$title$' des favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolItemNotFound": { "message": "Élément '$title' introuvable.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Affichage des détails de '$title'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "'$title' ajouté à la liste de lecture.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "'$title' ajouté aux favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "'$title' supprimé des favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Affichage des recommandations." },
"aiToolApplyFiltersGenreNotFound": { "message": "Genre '$genre$' non trouvé.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersGenreNotFound": { "message": "Genre '$genre' introuvable.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filtres appliqués avec succès." },
"aiToolPlayMusicNotReady": { "message": "Le lecteur de musique n'est pas prêt. Assurez-vous que votre bibliothèque musicale Plex a été scannée." },
"aiToolPlayMusicArtistNotFound": { "message": "Artiste '$artist_name$' non trouvé.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Aucune chanson trouvée pour '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Lecture de musique de '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNotReady": { "message": "Le lecteur de musique n'est pas prêt. Assurez-vous que votre bibliothèque musicale Plex a été analysée." },
"aiToolPlayMusicArtistNotFound": { "message": "Artiste '$artist_name' introuvable.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Aucune chanson trouvée pour '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Lecture de la musique de '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Historique du chat effacé." },
"aiToolConfirmDeleteDatabase": { "message": "Êtes-vous sûr de vouloir supprimer la base de données locale ? Cette action est irréversible." },
"aiToolDeleteDatabaseCancelled": { "message": "Suppression de la base de données annulée." },
"aiToolExecutionError": { "message": "Erreur lors de l'exécution de l'outil '$toolName$' : $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Outil inconnu : '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolExecutionError": { "message": "Erreur lors de l'exécution de l'outil '$toolName' : $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Outil inconnu : '$toolName'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favoris effacés." },
"aiToolFavoritesClearError": { "message": "Erreur lors de l'effacement des favoris : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recommandations effacées." },
@ -405,37 +409,41 @@
"aiToolUpdateAllTokensError": { "message": "Erreur lors de la mise à jour des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Jeton Plex ajouté avec succès." },
"aiToolAddPlexTokenError": { "message": "Erreur lors de l'ajout du jeton Plex : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Région changée en $region$. Le contenu est en cours de mise à jour.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Région modifiée en $region$. Le contenu est en cours de mise à jour.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Erreur lors du changement de région : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Historique de visionnage effacé." },
"aiToolViewingHistoryClearError": { "message": "Erreur lors de l'effacement de l'historique de visionnage : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Vous êtes un assistant expert en films et séries appelé CinePlex. Votre fonction principale est d'aider les utilisateurs à découvrir du contenu et à interagir avec leur bibliothèque. Suivez ces règles rigoureusement : 1. **NE JAMAIS** inventer que vous avez effectué une action si vous n'avez pas utilisé un outil pour cela. Par exemple, ne dites pas 'j'ai téléchargé X' si vous n'avez pas utilisé l'outil de téléchargement. 2. Pour les demandes de recommandations ou de listes (ex. 'dis-moi 5 films d'horreur'), utilisez vos propres connaissances pour générer la liste. Présentez-la sous forme numérotée ou à puces. Après avoir affiché la liste, demandez de manière proactive à l'utilisateur s'il souhaite que vous vérifiiez la disponibilité sur ses serveurs locaux et que vous créiez un fichier M3U. 3. **SEULEMENT** si l'utilisateur confirme qu'il souhaite vérifier ou télécharger la liste, utilisez l'outil `check_and_download_titles_list`. Ne l'utilisez pas sans confirmation explicite. 4. Pour toute autre action comme naviguer, obtenir des statistiques ou rechercher un titre spécifique, utilisez les outils appropriés. Soyez toujours concis, amical et efficace." },
"aiToolM3UNoTitlesProvided": { "message": "Veuillez fournir une liste de titres pour créer la playlist." },
"aiSystemPrompt_v3": { "message": "Vous êtes un assistant expert en films et séries appelé CinePlex. Votre fonction principale est d'aider les utilisateurs à découvrir du contenu et à interagir avec leur bibliothèque. Suivez rigoureusement ces règles : 1. **N'INVENTEZ JAMAIS** avoir effectué une action si vous n'avez pas utilisé d'outil pour cela. Par exemple, ne dites pas 'J'ai téléchargé X' si vous n'avez pas utilisé l'outil de téléchargement. 2. Pour les demandes de recommandations ou de listes (par exemple, 'donnez-moi 5 films d'horreur'), utilisez vos propres connaissances pour générer la liste. Présentez-la sous forme de liste numérotée ou à puces. Après avoir affiché la liste, demandez de manière proactive à l'utilisateur s'il souhaite que vous vérifiiez la disponibilité sur ses serveurs locaux et que vous créiez un fichier M3U. 3. **UNIQUEMENT** si l'utilisateur confirme qu'il souhaite vérifier ou télécharger la liste, utilisez l'outil `check_and_download_titles_list`. Ne l'utilisez pas sans confirmation explicite. 4. Pour toute autre action telle que la navigation, l'obtention de statistiques, la recherche d'un titre spécifique ou le filtrage par résolution ou conteneur, utilisez les outils appropriés. Soyez toujours concis, amical et efficace." },
"aiToolM3UNoTitlesProvided": { "message": "Veuillez fournir une liste de titres pour créer la liste de lecture." },
"aiToolM3UCheckingTitles": { "message": "Vérification des titres sur vos serveurs locaux..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Je n'ai trouvé aucun des films ou séries de la liste sur vos serveurs locaux." },
"aiToolM3UDownloadStarted": { "message": "Fait ! J'ai trouvé $1 sur $2 titres sur vos serveurs et j'ai lancé le téléchargement de la playlist M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Je n'ai trouvé aucun des films ou séries de la liste sur vos serveveurs locaux." },
"aiToolM3UDownloadStarted": { "message": "Terminé ! J'ai trouvé $1 des $2 titres sur vos serveurs et j'ai lancé le téléchargement de la liste de lecture M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Retour aux fournisseurs" },
"artistsCounterSingle": { "message": "$total$ Artiste", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterSingle": { "message": "$total$ artiste", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Chargement..." },
"downloadingSong": { "message": "Démarrage du téléchargement de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" téléchargée.", "placeholders": { "title": { "content": "$1" } } },
"downloadingSong": { "message": "Début du téléchargement de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" téléchargé.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Erreur lors du téléchargement de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Génération M3U pour \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Génération de M3U pour \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U pour l'album \"$artist$\" généré.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Nouvel essai de la section \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCÈS] Nouvel essai pour \"$title$\" terminé.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERREUR FINALE] L'essai a échoué pour \"$title$\" : $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Démarrage de la phase de réessais pour $count$ sections...", "placeholders": { "count": { "content": "$1" } } },
"retyingSection": { "message": "Nouvelle tentative de la section \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCÈS] Nouvelle tentative pour \"$title$\" terminée.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERREUR FINALE] Échec de la nouvelle tentative pour \"$title$\" : $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Démarrage de la phase de nouvelle tentative pour $count$ sections...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Jeton $token$... a trouvé $count$ serveurs.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Erreur lors du traitement du jeton $token$... : $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "ERREUR FATALE : $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Erreur pendant le scan : $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Arrêt du scan Plex..." },
"invalidTokenProvided": { "message": "Jeton invalide fourni." },
"errorDuringScan": { "message": "Erreur pendant l'analyse : $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Arrêt de l'analyse Plex..." },
"invalidTokenProvided": { "message": "Jeton non valide fourni." },
"tokenAlreadyExists": { "message": "Le jeton existe déjà." },
"tokenAddedSuccessfully": { "message": "Jeton ajouté avec succès." },
"noStreamsFoundForSelection": { "message": "Aucun stream trouvé pour la sélection." },
"noStreamsFoundForSelection": { "message": "Aucun flux trouvé pour la sélection." },
"autoplayBlocked": { "message": "Lecture automatique bloquée." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Page" }
"page": { "message": "Page" },
"all": { "message": "Tous" },
"userScore": { "message": "Score des utilisateurs" },
"duration": { "message": "Durée" },
"min": { "message": "Min" },
"max": { "message": "Max" }
}

View File

@ -1,441 +1,449 @@
{
"appName": { "message": "CinePlex" },
"appDescription": { "message": "Scanne les serveurs Plex pour trouver du contenu et l'affiche dans l'interface" },
"appTagline": { "message": "Films, Séries et Musique" },
"appLocaleCode": { "message": "fr" },
"toggleNavigation": { "message": "Basculer la navigation" },
"searchPlaceholder": { "message": "Rechercher des films ou des séries..." },
"openMusicPlayer": { "message": "Ouvrir le lecteur de musique" },
"settings": { "message": "Paramètres" },
"navMovies": { "message": "Films" },
"navSeries": { "message": "Séries" },
"navProviders": { "message": "Fournisseurs" },
"navPhotos": { "message": "Photos" },
"navStats": { "message": "Statistiques" },
"navFavorites": { "message": "Favoris" },
"navHistory": { "message": "Historique" },
"navRecommendations": { "message": "Recommandations" },
"navMusic": { "message": "Musique" },
"navM3uGenerator": { "message": "Générateur M3U" },
"heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Explorez des milliers de films et de séries." },
"addStream": { "message": "Ajouter un stream" },
"moreInfo": { "message": "Plus d'informations" },
"popularMovies": { "message": "Films populaires" },
"allGenres": { "message": "Tous les genres" },
"allYears": { "message": "Toutes les années" },
"sortPopular": { "message": "Les plus populaires" },
"sortTopRated": { "message": "Les mieux notés" },
"sortRecent": { "message": "Les plus récents" },
"loadMore": { "message": "Charger plus" },
"photosBreadcrumbHome": { "message": "Albums" },
"selectServer": { "message": "Sélectionner un serveur" },
"loading": { "message": "Chargement..." },
"loadingLibraries": { "message": "Chargement des bibliothèques..." },
"photosEmptyState": { "message": "Aucun album ou photo trouvé." },
"photosEmptyStateSub": { "message": "Veuillez sélectionner un serveur ou assurez-vous d'avoir une bibliothèque de photos dans Plex." },
"statsTitle": { "message": "Statistiques de la bibliothèque" },
"statsAllTokens": { "message": "Tous les jetons" },
"statsAnalyzing": { "message": "Analyse de votre bibliothèque..." },
"statsActiveTokens": { "message": "Jetons actifs" },
"statsServersFound": { "message": "Serveurs trouvés" },
"statsUniqueMovies": { "message": "Films uniques" },
"statsUniqueSeries": { "message": "Séries uniques" },
"statsUniqueArtists": { "message": "Artistes uniques" },
"statsTokenServers": { "message": "Serveurs du jeton" },
"statsChartMoviesByGenre": { "message": "Contenu par genre (Films)" },
"statsChartSeriesByGenre": { "message": "Contenu par genre (Séries)" },
"statsChartByDecade": { "message": "Contenu par décennie" },
"recommendationsTitle": { "message": "Recommandations pour vous" },
"historyTitle": { "message": "Historique de visionnage" },
"clearHistory": { "message": "Tout effacer" },
"consoleTitle": { "message": "Console de scan Plex" },
"footerCredit": { "message": "Une interface pour votre univers Plex." },
"closeTrailer": { "message": "Fermer la bande-annonce" },
"close": { "message": "Fermer" },
"photoViewer": { "message": "Visionneuse de photos" },
"previous": { "message": "Précédent" },
"next": { "message": "Suivant" },
"notificationTemplateText": { "message": "Notification" },
"settingsTitleFull": { "message": "Réglages et Configuration" },
"settingsTabGeneral": { "message": "Général" },
"appDescription": { "message": "Scansiona i server Plex alla ricerca di contenuti e li visualizza nell'interfaccia" },
"appTagline": { "message": "Film, Serie e Musica" },
"appLocaleCode": { "message": "it-IT" },
"toggleNavigation": { "message": "Attiva/disattiva la navigazione" },
"searchPlaceholder": { "message": "Cerca film o serie..." },
"openMusicPlayer": { "message": "Apri il lettore musicale" },
"settings": { "message": "Impostazioni" },
"navMovies": { "message": "Film" },
"navSeries": { "message": "Serie" },
"navProviders": { "message": "Provider" },
"navPhotos": { "message": "Foto" },
"navStats": { "message": "Statistiche" },
"navFavorites": { "message": "Preferiti" },
"navHistory": { "message": "Cronologia" },
"navRecommendations": { "message": "Raccomandazioni" },
"navMusic": { "message": "Musica" },
"navM3uGenerator": { "message": "Generatore M3U" },
"heroWelcome": { "message": "Benvenuto in CinePlex" },
"heroSubtitle": { "message": "Esplora migliaia di film e serie." },
"addStream": { "message": "Aggiungi streaming" },
"moreInfo": { "message": "Più informazioni" },
"popularMovies": { "message": "Film popolari" },
"allGenres": { "message": "Tutti i generi" },
"allYears": { "message": "Tutti gli anni" },
"sortPopular": { "message": "I più popolari" },
"sortTopRated": { "message": "I più votati" },
"sortRecent": { "message": "I più recenti" },
"loadMore": { "message": "Carica altro" },
"photosBreadcrumbHome": { "message": "Album" },
"selectServer": { "message": "Seleziona un server" },
"loading": { "message": "Caricamento..." },
"loadingLibraries": { "message": "Caricamento delle librerie..." },
"photosEmptyState": { "message": "Nessun album o foto trovati." },
"photosEmptyStateSub": { "message": "Seleziona un server o assicurati di avere una libreria di foto in Plex." },
"statsTitle": { "message": "Statistiche della libreria" },
"statsAllTokens": { "message": "Tutti i token" },
"statsAnalyzing": { "message": "Analisi della tua libreria..." },
"statsActiveTokens": { "message": "Token attivi" },
"statsServersFound": { "message": "Server trovati" },
"statsUniqueMovies": { "message": "Film unici" },
"statsUniqueSeries": { "message": "Serie uniche" },
"statsUniqueArtists": { "message": "Artisti unici" },
"statsTokenServers": { "message": "Server token" },
"statsChartMoviesByGenre": { "message": "Contenuti per genere (Film)" },
"statsChartSeriesByGenre": { "message": "Contenuti per genere (Serie)" },
"statsChartByDecade": { "message": "Contenuti per decennio" },
"recommendationsTitle": { "message": "Raccomandazioni per te" },
"historyTitle": { "message": "Cronologia visualizzazioni" },
"clearHistory": { "message": "Cancella tutto" },
"consoleTitle": { "message": "Console di scansione Plex" },
"footerCredit": { "message": "Un'interfaccia per il tuo universo Plex." },
"closeTrailer": { "message": "Chiudi trailer" },
"close": { "message": "Chiudi" },
"photoViewer": { "message": "Visualizzatore di foto" },
"previous": { "message": "Precedente" },
"next": { "message": "Successivo" },
"notificationTemplateText": { "message": "Notifica" },
"settingsTitleFull": { "message": "Impostazioni e configurazione" },
"settingsTabGeneral": { "message": "Generale" },
"settingsTabPlex": { "message": "Plex" },
"settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "Générateur PHP" },
"settingsTabData": { "message": "Données" },
"settingsApiServer": { "message": "Configuration API et serveur" },
"settingsTmdbApiLabel": { "message": "Clé API TMDB (Facultatif)" },
"settingsTmdbApiPlaceholder": { "message": "La clé par défaut sera utilisée si laissée vide" },
"settingsGoogleApiLabel": { "message": "Clé API Google Gemini (Facultatif)" },
"settingsGoogleApiPlaceholder": { "message": "Nécessaire pour utiliser l'assistant IA" },
"settingsRegionLabel": { "message": "Région pour la découverte de contenu" },
"allRegions": { "message": "Toutes les régions" },
"settingsPhpUrlLabel": { "message": "URL du serveur pour ajouter des streams" },
"settingsPhpUrlPlaceholder": { "message": "https://votre-serveur.com/chemin/vers/le-script.php" },
"settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Mode clair" },
"settingsShowHero": { "message": "Afficher la section de bienvenue 'Hero'" },
"settingsScanContent": { "message": "Scan de contenu" },
"settingsScanDesc": { "message": "Sélectionnez ce que vous voulez scanner et cliquez sur le bouton." },
"settingsScanMovies": { "message": "Films" },
"settingsScanShows": { "message": "Séries" },
"settingsScanArtists": { "message": "Musique" },
"settingsScanPhotos": { "message": "Photos" },
"settingsSelectAll": { "message": "Tout sélectionner" },
"settingsStartScan": { "message": "Lancer le scan" },
"settingsPlexTokens": { "message": "Jetons Plex" },
"settingsPlexTokensDesc": { "message": "Modifier la liste des jetons Plex (format JSON)." },
"settingsSaveTokens": { "message": "Sauvegarder les jetons" },
"settingsJellyfinTitle": { "message": "Configuration Jellyfin" },
"settingsJellyfinDesc": { "message": "Ajoutez les détails de votre serveur Jellyfin pour scanner son contenu." },
"jellyfinUrlLabel": { "message": "URL du serveur Jellyfin" },
"jellyfinUserLabel": { "message": "Nom d'utilisateur" },
"jellyfinPassLabel": { "message": "Mot de passe" },
"jellyfinConnectAndScan": { "message": "Connecter et scanner" },
"settingsPhpGenTitle": { "message": "Générateur de script PHP pour le serveur" },
"settingsPhpFileOptions": { "message": "Options de fichier" },
"settingsPhpSavePathLabel": { "message": "Chemin de sauvegarde sur le serveur" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listes (vide pour le même dossier)" },
"settingsPhpFilenameLabel": { "message": "Nom de fichier" },
"settingsPhpFileAction": { "message": "Action sur le fichier" },
"settingsPhpActionAppend": { "message": "Ajouter à la fin du fichier (cumulatif)" },
"settingsPhpActionOverwrite": { "message": "Écraser le fichier (repartir de zéro)" },
"settingsPhpSecurity": { "message": "Sécurité (Facultatif)" },
"settingsPhpUseSecretKey": { "message": "Utiliser une clé secrète (Recommandé)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Saisissez une clé secrète sécurisée" },
"settingsPhpGeneratedCode": { "message": "Code généré" },
"settingsPhpGeneratedPlaceholder": { "message": "Le code PHP généré apparaîtra ici." },
"settingsGenerateScript": { "message": "Générer le script" },
"settingsCopyScript": { "message": "Copier le script" },
"settingsDataManagement": { "message": "Gestion de la base de données locale" },
"settingsImportDb": { "message": "Importer la base de données depuis un fichier" },
"settingsExportDb": { "message": "Exporter la base de données vers un fichier" },
"settingsClearContent": { "message": "Effacer les données de contenu local" },
"settingsClearContentDesc": { "message": "Cette action supprimera les films, séries et musiques de la base de données locale, mais n'affectera pas vos favoris ni vos paramètres." },
"settingsClose": { "message": "Fermer" },
"settingsSave": { "message": "Enregistrer les paramètres" },
"musicSidenavTitle": { "message": "Musique de Plex" },
"musicAllServers": { "message": "Tous les serveurs" },
"musicSearchArtistPlaceholder": { "message": "Rechercher un artiste..." },
"musicSearchDiscographyPlaceholder": { "message": "Rechercher dans la discographie..." },
"musicNothingPlaying": { "message": "Rien ne joue" },
"musicSelectSong": { "message": "Sélectionnez une chanson" },
"musicToStart": { "message": "pour commencer à jouer" },
"miniplayerDownloadSong": { "message": "Télécharger la chanson" },
"miniplayerDownloadAlbum": { "message": "Télécharger l'album M3U" },
"settingsTabPhpGen": { "message": "Generatore PHP" },
"settingsTabData": { "message": "Dati" },
"settingsApiServer": { "message": "Impostazioni API e server" },
"settingsTmdbApiLabel": { "message": "Chiave API TMDB (facoltativa)" },
"settingsTmdbApiPlaceholder": { "message": "La chiave predefinita verrà utilizzata se lasciata vuota" },
"settingsGoogleApiLabel": { "message": "Chiave API Google Gemini (facoltativa)" },
"settingsGoogleApiPlaceholder": { "message": "Necessaria per utilizzare l'assistente AI" },
"settingsRegionLabel": { "message": "Regione per la scoperta di contenuti" },
"allRegions": { "message": "Tutte le regioni" },
"settingsPhpUrlLabel": { "message": "URL del server per l'aggiunta di streaming" },
"settingsPhpUrlPlaceholder": { "message": "https://tuo-server.com/percorso/dello/script.php" },
"settingsInterface": { "message": "Interfaccia" },
"settingsLightTheme": { "message": "Modalità chiara" },
"settingsShowHero": { "message": "Mostra la sezione di benvenuto 'Hero'" },
"settingsScanContent": { "message": "Scansione dei contenuti" },
"settingsScanDesc": { "message": "Seleziona cosa scansionare e premi il pulsante." },
"settingsScanMovies": { "message": "Film" },
"settingsScanShows": { "message": "Serie" },
"settingsScanArtists": { "message": "Musica" },
"settingsScanPhotos": { "message": "Foto" },
"settingsSelectAll": { "message": "Seleziona tutto" },
"settingsStartScan": { "message": "Avvia scansione" },
"settingsPlexTokens": { "message": "Token Plex" },
"settingsPlexTokensDesc": { "message": "Modifica l'elenco dei token Plex (formato JSON)." },
"settingsSaveTokens": { "message": "Salva token" },
"settingsJellyfinTitle": { "message": "Impostazioni Jellyfin" },
"settingsJellyfinDesc": { "message": "Aggiungi i dettagli del tuo server Jellyfin per scansionarne il contenuto." },
"jellyfinUrlLabel": { "message": "URL del server Jellyfin" },
"jellyfinUserLabel": { "message": "Nome utente" },
"jellyfinPassLabel": { "message": "Password" },
"jellyfinConnectAndScan": { "message": "Connetti e scansiona" },
"settingsPhpGenTitle": { "message": "Generatore di script PHP per server" },
"settingsPhpFileOptions": { "message": "Opzioni file" },
"settingsPhpSavePathLabel": { "message": "Percorso di salvataggio sul server" },
"settingsPhpSavePathPlaceholder": { "message": "Es: /var/www/html/liste (vuoto per la stessa cartella)" },
"settingsPhpFilenameLabel": { "message": "Nome file" },
"settingsPhpFileAction": { "message": "Azione file" },
"settingsPhpActionAppend": { "message": "Aggiungi alla fine del file (cumulativo)" },
"settingsPhpActionOverwrite": { "message": "Sovrascrivi il file (ricomincia da capo)" },
"settingsPhpSecurity": { "message": "Sicurezza (facoltativa)" },
"settingsPhpUseSecretKey": { "message": "Usa chiave segreta (consigliato)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Inserisci una chiave segreta sicura" },
"settingsPhpGeneratedCode": { "message": "Codice generato" },
"settingsPhpGeneratedPlaceholder": { "message": "Il codice PHP generato apparirà qui." },
"settingsGenerateScript": { "message": "Genera script" },
"settingsCopyScript": { "message": "Copia script" },
"settingsDataManagement": { "message": "Gestione del database locale" },
"settingsImportDb": { "message": "Importa DB da file" },
"settingsExportDb": { "message": "Esporta DB su file" },
"settingsClearContent": { "message": "Cancella i dati dei contenuti locali" },
"settingsClearContentDesc": { "message": "Questa azione eliminerà film, serie e musica dal database locale, ma non influirà sui preferiti o sulle impostazioni." },
"settingsClose": { "message": "Chiudi" },
"settingsSave": { "message": "Salva impostazioni" },
"musicSidenavTitle": { "message": "Musica Plex" },
"musicAllServers": { "message": "Tutti i server" },
"musicSearchArtistPlaceholder": { "message": "Cerca un artista..." },
"musicSearchDiscographyPlaceholder": { "message": "Cerca nella discografia..." },
"musicNothingPlaying": { "message": "Nessuna riproduzione in corso" },
"musicSelectSong": { "message": "Seleziona un brano" },
"musicToStart": { "message": "per avviare la riproduzione" },
"miniplayerDownloadSong": { "message": "Scarica brano" },
"miniplayerDownloadAlbum": { "message": "Scarica album M3U" },
"miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Lecture aléatoire" },
"miniplayerEqualizer": { "message": "Égaliseur" },
"miniplayerOpenList": { "message": "Ouvrir la liste" },
"eqTitle": { "message": "Égaliseur graphique" },
"eqPresetsLabel": { "message": "Préréglages" },
"eqPresetFlat": { "message": "Plat" },
"miniplayerShuffle": { "message": "Casuale" },
"miniplayerEqualizer": { "message": "Equalizzatore" },
"miniplayerOpenList": { "message": "Apri elenco" },
"eqTitle": { "message": "Equalizzatore grafico" },
"eqPresetsLabel": { "message": "Preimpostazioni" },
"eqPresetFlat": { "message": "Piatto" },
"eqPresetRock": { "message": "Rock" },
"eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Classique" },
"eqPresetBassBoost": { "message": "Accentuation des basses" },
"eqPreampLabel": { "message": "Préamplificateur" },
"infoModalTitle": { "message": "Informations" },
"infoModalFieldTitle": { "message": "Titre :" },
"infoModalFieldArtist": { "message": "Artiste :" },
"infoModalFieldAlbum": { "message": "Album :" },
"infoModalFieldSong": { "message": "Chanson :" },
"infoModalFieldYear": { "message": "Année :" },
"infoModalFieldGenre": { "message": "Genre :" },
"lang_en": { "message": "Anglais" },
"lang_es": { "message": "Espagnol" },
"lang_fr": { "message": "Français" },
"lang_de": { "message": "Allemand" },
"lang_it": { "message": "Italien" },
"lang_pt": { "message": "Portugais" },
"essentialFeaturesNotSupported": { "message": "Votre navigateur ne prend pas en charge les fonctions essentielles." },
"dbAccessError": { "message": "Erreur d'accès à la base de données locale." },
"dbUpdateNeeded": { "message": "La base de données doit être mise à jour, veuillez recharger la page." },
"dbBlocked": { "message": "Veuillez fermer les autres onglets de cette application pour continuer." },
"deletingContentData": { "message": "Suppression des données de contenu local..." },
"noContentDataToDelete": { "message": "Aucune donnée de contenu à supprimer." },
"contentDataDeleted": { "message": "Données de contenu supprimées d'IndexedDB." },
"errorDeletingData": { "message": "Erreur lors de la suppression des données : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Éditeur de texte non disponible." },
"errorLoadingTokens": { "message": "Erreur lors du chargement des jetons pour l'édition." },
"errorLoadingTokensMessage": { "message": "Erreur lors du chargement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Éditeur non disponible pour la sauvegarde." },
"invalidJsonFormat": { "message": "Format JSON invalide. Doit être { \"tokens\": [...] }" },
"tokensSaved": { "message": "Jetons enregistrés avec succès." },
"errorSavingTokens": { "message": "Erreur lors de l'enregistrement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB n'est pas disponible." },
"dbExported": { "message": "Base de données exportée avec succès." },
"errorExportingDb": { "message": "Erreur lors de l'exportation de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "Le fichier ne contient pas d'objet JSON valide." },
"noDataToImport": { "message": "Le fichier ne contient pas de données pour les sections de la base de données actuelle." },
"dbImported": { "message": "Base de données importée avec succès." },
"errorImportingDb": { "message": "Erreur lors de l'importation de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Mise à jour de la vue avec les nouvelles données..." },
"confirmClearContent": { "message": "Êtes-vous sûr de vouloir supprimer les données de contenu local (films, séries, musique, etc.) ? Les favoris et les paramètres NE SERONT PAS supprimés." },
"trailerNotFound": { "message": "Aucune bande-annonce trouvée pour ce titre." },
"confirmClearHistory": { "message": "Êtes-vous sûr de vouloir effacer tout votre historique de visionnage ? Cette action ne peut pas être annulée." },
"historyCleared": { "message": "Historique de visionnage effacé." },
"historyItemDeleted": { "message": "Élément supprimé de l'historique." },
"errorGeneratingScript": { "message": "Générez d'abord un script pour pouvoir le copier." },
"scriptCopied": { "message": "Script PHP copié dans le presse-papiers." },
"errorCopyingScript": { "message": "Erreur lors de la copie du script." },
"scriptGenerated": { "message": "Script PHP généré." },
"errorLoadingAlbum": { "message": "Erreur lors du chargement de l'album : $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Erreur : Aucun serveur photo n'a été sélectionné." },
"loadingGenres": { "message": "Chargement des genres..." },
"errorLoadingGenres": { "message": "Erreur de chargement" },
"noContentFound": { "message": "Aucun résultat trouvé." },
"couldNotLoadContent": { "message": "Impossible de charger le contenu." },
"noFavorites": { "message": "Vous n'avez pas encore de favoris." },
"errorLoadingFavorites": { "message": "Erreur lors du chargement des favoris." },
"historyEmpty": { "message": "Votre historique est vide." },
"historyEmptySub": { "message": "Explorez et regardez du contenu pour qu'il apparaisse ici." },
"errorGeneratingRecommendations": { "message": "Erreur lors de la génération des recommandations." },
"noRecommendations": { "message": "Nous devons mieux vous connaître pour vous donner des recommandations !" },
"errorGeneratingStats": { "message": "Erreur lors de la génération des statistiques." },
"noServersForToken": { "message": "Aucun serveur associé trouvé pour ce jeton." },
"searchingActorContent": { "message": "Recherche de contenu de $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Impossible de charger le contenu pour $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Erreur lors de l'ajout de stream(s) : $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "L'URL du serveur PHP n'est pas configurée. Veuillez la configurer dans les Paramètres." },
"searchingStreams": { "message": "Recherche de streams pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Envoi de $count$ stream(s) au serveur...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) ajouté(s) avec succès." },
"generatingM3U": { "message": "Génération M3U pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" téléchargé.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Erreur lors de la génération M3U : $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Paramètres enregistrés avec succès." },
"errorSavingSettings": { "message": "Erreur lors de l'enregistrement des paramètres dans la base de données." },
"languageChangeReload": { "message": "Langue changée. L'application va maintenant être rechargée." },
"addedToFavorites": { "message": "Ajouté aux favoris." },
"removedFromFavorites": { "message": "Supprimé des favoris." },
"plexScanInProgress": { "message": "Le scan Plex est déjà en cours." },
"plexScanStarting": { "message": "Démarrage du scan Plex..." },
"noPlexTokens": { "message": "Aucun jeton Plex configuré." },
"clearingSections": { "message": "Nettoyage des sections : $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Phase de scan initiale terminée." },
"retryPhaseFinished": { "message": "Phase de réessais terminée." },
"plexScanFinished": { "message": "Scan terminé. Mise à jour du contenu..." },
"scanCancelled": { "message": "Scan annulé par l'utilisateur." },
"scanCancelledInfo": { "message": "Scan annulé." },
"errorInitializingMusicPlayer": { "message": "Erreur lors de l'initialisation du lecteur de musique." },
"criticalErrorLoadingMusic": { "message": "Erreur critique lors du chargement des données musicales." },
"errorLoadingArtists": { "message": "Erreur lors du chargement des artistes." },
"dbUnavailableError": { "message": "Erreur : Base de données non disponible." },
"updatingMusicData": { "message": "Mise à jour des données musicales..." },
"musicDataUpdated": { "message": "Données musicales mises à jour." },
"errorFetchingArtistSongs": { "message": "Erreur lors de la récupération des chansons de l'artiste." },
"errorLoadingSongs": { "message": "Erreur lors du chargement des chansons." },
"noArtistsFound": { "message": "Aucun artiste trouvé." },
"shuffleOn": { "message": "Mode aléatoire activé." },
"shuffleOff": { "message": "Mode aléatoire désactivé." },
"playbackError": { "message": "Erreur de lecture" },
"errorLabel": { "message": "Erreur" },
"reloadingPage": { "message": "Rechargement de la page..." },
"viewed": { "message": "Vu" },
"local": { "message": "Local" },
"topRatedSort": {"message": "Les mieux notés"},
"recentSort": {"message": "Récents"},
"popularSort": {"message": "Populaires"},
"moviesSectionTitle": {"message": "Films"},
"seriesSectionTitle": {"message": "Séries"},
"searchResultsFor": {"message": "Résultats pour \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Contenu de $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Explorer"},
"noGenre": {"message": "Sans catégorie"},
"synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "Aucune synopsis disponible."},
"director": {"message": "Réalisateur :"},
"writer": {"message": "Scénariste :"},
"viewOnImdb": {"message": "Voir sur IMDb"},
"watchTrailer": {"message": "Voir la bande-annonce"},
"addToFavorites": {"message": "Ajouter aux favoris"},
"removeFromFavorites": {"message": "Supprimer des favoris"},
"notAvailable": {"message": "Non disponible"},
"mainCast": {"message": "Distribution principale"},
"seasonsAndEpisodes": {"message": "Saisons et épisodes"},
"similarContent": {"message": "Contenu similaire"},
"episodesCount": {"message": "$count$ Épisodes", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Saisons", "placeholders": {"count": {"content": "$1"}}},
"eqPresetClassical": { "message": "Classica" },
"eqPresetBassBoost": { "message": "Aumento dei bassi" },
"eqPreampLabel": { "message": "Preamplificatore" },
"infoModalTitle": { "message": "Informazioni" },
"infoModalFieldTitle": { "message": "Titolo:" },
"infoModalFieldArtist": { "message": "Artista:" },
"infoModalFieldAlbum": { "message": "Album:" },
"infoModalFieldSong": { "message": "Brano:" },
"infoModalFieldYear": { "message": "Anno:" },
"infoModalFieldGenre": { "message": "Genere:" },
"lang_en": { "message": "Inglese" },
"lang_es": { "message": "Spagnolo" },
"lang_fr": { "message": "Francese" },
"lang_de": { "message": "Tedesco" },
"lang_it": { "message": "Italiano" },
"lang_pt": { "message": "Portoghese" },
"essentialFeaturesNotSupported": { "message": "Il tuo browser non supporta le funzionalità essenziali." },
"dbAccessError": { "message": "Errore di accesso al database locale." },
"dbUpdateNeeded": { "message": "Il database deve essere aggiornato, ricarica la pagina." },
"dbBlocked": { "message": "Chiudi le altre schede di questa applicazione per continuare." },
"deletingContentData": { "message": "Eliminazione dei dati dei contenuti locali..." },
"noContentDataToDelete": { "message": "Nessun dato di contenuto da eliminare." },
"contentDataDeleted": { "message": "Dati dei contenuti eliminati da IndexedDB." },
"errorDeletingData": { "message": "Errore durante l'eliminazione dei dati: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Editor di testo non disponibile." },
"errorLoadingTokens": { "message": "Errore durante il caricamento dei token per la modifica." },
"errorLoadingTokensMessage": { "message": "Errore durante il caricamento dei token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor non disponibile per il salvataggio." },
"invalidJsonFormat": { "message": "Formato JSON non valido. Deve essere { \"tokens\": [...] }" },
"tokensSaved": { "message": "Token salvati correttamente." },
"errorSavingTokens": { "message": "Errore durante il salvataggio dei token: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB non è disponibile." },
"dbExported": { "message": "Database esportato correttamente." },
"errorExportingDb": { "message": "Errore durante l'esportazione del database: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "Il file non contiene un oggetto JSON valido." },
"noDataToImport": { "message": "Il file non contiene dati per le sezioni correnti del database." },
"dbImported": { "message": "Database importato correttamente." },
"errorImportingDb": { "message": "Errore durante l'importazione del database: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Aggiornamento della vista con i nuovi dati..." },
"confirmClearContent": { "message": "Sei sicuro di voler eliminare i dati dei contenuti locali (film, serie, musica, ecc.)? I preferiti e le impostazioni NON verranno eliminati." },
"trailerNotFound": { "message": "Nessun trailer trovato per questo titolo." },
"confirmClearHistory": { "message": "Sei sicuro di voler cancellare tutta la cronologia delle visualizzazioni? Questa azione non può essere annullata." },
"historyCleared": { "message": "Cronologia visualizzazioni cancellata." },
"historyItemDeleted": { "message": "Elemento eliminato dalla cronologia." },
"errorGeneratingScript": { "message": "Genera prima uno script per poterlo copiare." },
"scriptCopied": { "message": "Script PHP copiato negli appunti." },
"errorCopyingScript": { "message": "Errore durante la copia dello script." },
"scriptGenerated": { "message": "Script PHP generato." },
"errorLoadingAlbum": { "message": "Errore durante il caricamento dell'album: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Errore: non è stato selezionato alcun server di foto." },
"loadingGenres": { "message": "Caricamento dei generi..." },
"errorLoadingGenres": { "message": "Errore durante il caricamento" },
"noContentFound": { "message": "Nessun risultato trovato." },
"couldNotLoadContent": { "message": "Impossibile caricare il contenuto." },
"noFavorites": { "message": "Non hai ancora preferiti." },
"errorLoadingFavorites": { "message": "Errore durante il caricamento dei preferiti." },
"historyEmpty": { "message": "La tua cronologia è vuota." },
"historyEmptySub": { "message": "Esplora e guarda i contenuti perché appaiano qui." },
"errorGeneratingRecommendations": { "message": "Errore durante la generazione delle raccomandazioni." },
"noRecommendations": { "message": "Dobbiamo conoscerti meglio per darti consigli!" },
"errorGeneratingStats": { "message": "Errore durante la generazione delle statistiche." },
"noServersForToken": { "message": "Nessun server associato trovato per questo token." },
"searchingActorContent": { "message": "Ricerca di contenuti di $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Impossibile caricare i contenuti per $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Errore durante l'aggiunta di streaming: $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "L'URL del server PHP non è configurato. Configuralo nelle Impostazioni." },
"searchingStreams": { "message": "Ricerca di streaming per \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Invio di $count$ streaming al server...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Streaming aggiunto/i con successo." },
"generatingM3U": { "message": "Generazione di M3U per \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" scaricato.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Errore durante la generazione di M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Impostazioni salvate correttamente." },
"errorSavingSettings": { "message": "Errore durante il salvataggio delle impostazioni nel database." },
"languageChangeReload": { "message": "Lingua modificata. L'applicazione verrà ora ricaricata." },
"addedToFavorites": { "message": "Aggiunto ai preferiti." },
"removedFromFavorites": { "message": "Rimosso dai preferiti." },
"plexScanInProgress": { "message": "La scansione di Plex è già in corso." },
"plexScanStarting": { "message": "Avvio della scansione di Plex..." },
"noPlexTokens": { "message": "Nessun token Plex configurato." },
"clearingSections": { "message": "Cancellazione delle sezioni: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Fase di scansione iniziale completata." },
"retryPhaseFinished": { "message": "Fase di tentativi ripetuti terminata." },
"plexScanFinished": { "message": "Scansione terminata. Aggiornamento dei contenuti..." },
"scanCancelled": { "message": "Scansione annullata dall'utente." },
"scanCancelledInfo": { "message": "Scansione annullata." },
"errorInitializingMusicPlayer": { "message": "Errore durante l'inizializzazione del lettore musicale." },
"criticalErrorLoadingMusic": { "message": "Errore critico durante il caricamento dei dati musicali." },
"errorLoadingArtists": { "message": "Errore durante il caricamento degli artisti." },
"dbUnavailableError": { "message": "Errore: database non disponibile." },
"updatingMusicData": { "message": "Aggiornamento dei dati musicali..." },
"musicDataUpdated": { "message": "Dati musicali aggiornati." },
"errorFetchingArtistSongs": { "message": "Errore durante il recupero dei brani dell'artista." },
"errorLoadingSongs": { "message": "Errore durante il caricamento dei brani." },
"noArtistsFound": { "message": "Nessun artista trovato." },
"shuffleOn": { "message": "Modalità casuale attivata." },
"shuffleOff": { "message": "Modalità casuale disattivata." },
"playbackError": { "message": "Errore di riproduzione" },
"errorLabel": { "message": "Errore" },
"reloadingPage": { "message": "Ricaricamento della pagina..." },
"viewed": { "message": "Visto" },
"local": { "message": "Locale" },
"topRatedSort": {"message": "I più votati"},
"recentSort": {"message": "Recenti"},
"popularSort": {"message": "Popolari"},
"moviesSectionTitle": {"message": "Film"},
"seriesSectionTitle": {"message": "Serie"},
"searchResultsFor": {"message": "Risultati per \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Contenuti di $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Esplora"},
"noGenre": {"message": "Senza categoria"},
"synopsis": {"message": "Sinossi"},
"noSynopsis": {"message": "Nessuna sinossi disponibile."},
"director": {"message": "Regista:"},
"writer": {"message": "Sceneggiatore:"},
"viewOnImdb": {"message": "Vedi su IMDb"},
"watchTrailer": {"message": "Guarda il trailer"},
"addToFavorites": {"message": "Aggiungi ai preferiti"},
"removeFromFavorites": {"message": "Rimuovi dai preferiti"},
"notAvailable": {"message": "Non disponibile"},
"mainCast": {"message": "Cast principale"},
"seasonsAndEpisodes": {"message": "Stagioni ed episodi"},
"similarContent": {"message": "Contenuti simili"},
"filmography": {"message": "Filmografia"},
"availableOn": {"message": "Disponibile su"},
"episodesCount": {"message": "$count$ episodi", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ stagioni", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Aucune bande-annonce trouvée pour ce titre."},
"fatalInitError": {"message": "Erreur d'initialisation fatale"},
"fatalInitErrorSub": {"message": "Impossible de charger l'application."},
"invalidStreamInfo": {"message": "Informations invalides."},
"dbUnavailableForStreams": {"message": "Base de données locale non disponible."},
"noPlexServersForStreams": {"message": "Aucun serveur Plex."},
"notFoundOnServers": {"message": "Impossible de trouver \"$query$\" sur les serveurs Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "À l'instant" },
"relativeTime_minutesAgo": { "message": "Il y a $count$ minutes", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "Il y a $count$ heures", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Hier" },
"relativeTime_daysAgo": { "message": "Il y a $count$ jours", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Erreur lors du chargement des détails" },
"errorLoadingLocalContent": { "message": "Erreur lors du chargement du contenu local." },
"errorServerResponse": { "message": "Réponse du serveur non réussie." },
"errorPlexApi": { "message": "Erreur $status$ de l'API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Erreur lors de l'analyse du XML Plex." },
"untitled": { "message": "Sans titre" },
"itemCount": { "message": "$count$ éléments", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Aucun serveur photo" },
"jellyfinScanInProgress": { "message": "Le scan Jellyfin est déjà en cours." },
"jellyfinScanning": { "message": "Scan de Jellyfin en cours..." },
"jellyfinMissingCredentials": { "message": "Veuillez compléter l'URL et l'utilisateur de Jellyfin." },
"jellyfinConnecting": { "message": "Connexion à Jellyfin en cours : $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Échec de l'authentification Jellyfin : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Authentification Jellyfin réussie." },
"jellyfinFetchingLibraries": { "message": "Récupération des bibliothèques..." },
"jellyfinFetchFailed": { "message": "Erreur lors de la récupération des bibliothèques : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Aucune bibliothèque de films ou de séries trouvée dans Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ bibliothèque(s) multimédia(s) trouvée(s).", "placeholders": {"count": {"content": "$1"}}},
"jellyfinLibraryScanSuccess": { "message": "[Succès] '$libraryName$' scanné, $count$ titres ajoutés.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Erreur lors du scan de la bibliothèque '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Scan Jellyfin terminé. $movies$ films et $series$ séries ajoutés.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Identifiants Jellyfin non configurés." },
"notFoundOnJellyfin": { "message": "Impossible de trouver \"$query$\" sur Jellyfin.", "placeholders": {"query": {"content": "$1"}}},
"notFoundOnAnyServer": { "message": "Impossible de trouver \"$query$\" sur aucun serveur.", "placeholders": {"query": {"content": "$1"}}},
"localOnPlex": { "message": "Sur Plex" },
"searchOnPlex": { "message": "Rechercher sur Plex" },
"jellyfinTitle": { "message": "Contenu Jellyfin" },
"noJellyfinContent": { "message": "Aucun contenu Jellyfin trouvé." },
"noJellyfinContentSub": { "message": "Assurez-vous d'avoir scanné votre serveur Jellyfin dans les paramètres." },
"activityViewerTitle": { "message": "Visionneuse d'activité du serveur" },
"activitySelectServer": { "message": "Sélectionner un serveur" },
"activityCheckBtn": { "message": "Actualiser" },
"activityNoSessions": { "message": "Aucune session active sur ce serveur." },
"activitySessionUser": { "message": "Utilisateur" },
"activitySessionDevice": { "message": "Appareil" },
"activitySessionContent": { "message": "Contenu" },
"activitySessionState": { "message": "État" },
"activitySessionIdentifier": { "message": "Identifiant du client" },
"activityCopyID": { "message": "Copier l'ID" },
"activityError": { "message": "Impossible d'obtenir l'activité du serveur." },
"activityCopied": { "message": "Identifiant copié dans le presse-papiers !" },
"activityCopyError": { "message": "Erreur lors de la copie de l'identifiant." },
"noProvidersFound": { "message": "Aucun fournisseur trouvé." },
"availableOnPlex": { "message": "Disponible sur Plex" },
"m3uGeneratorTitle": { "message": "Générateur de listes M3U" },
"selectAServer": { "message": "Sélectionner un serveur..." },
"downloadM3u": { "message": "Télécharger M3U" },
"m3uGenerator": { "message": "Générateur M3U" },
"selectLibraries": { "message": "Sélectionner les bibliothèques" },
"howToUse": { "message": "Comment utiliser" },
"m3uInstruction1": { "message": "Choisissez un serveur dans la liste." },
"m3uInstruction2": { "message": "Sélectionnez une ou plusieurs bibliothèques à inclure." },
"m3uInstruction3": { "message": "Cliquez sur le bouton de téléchargement." },
"m3uInstruction4": { "message": "Importez le fichier .m3u dans votre lecteur compatible." },
"chatOpen": { "message": "Ouvrir le chat" },
"chatTitle": { "message": "Assistant IA" },
"noTrailerFound": {"message": "Nessun trailer trovato per questo titolo."},
"fatalInitError": {"message": "Errore fatale di inizializzazione"},
"fatalInitErrorSub": {"message": "Impossibile caricare l'applicazione."},
"invalidStreamInfo": {"message": "Informazioni non valide."},
"dbUnavailableForStreams": {"message": "Database locale non disponibile."},
"noPlexServersForStreams": {"message": "Nessun server Plex."},
"notFoundOnServers": {"message": "\"$query$\" non trovato sui server Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Poco fa" },
"relativeTime_minutesAgo": { "message": "$count$ minuti fa", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "$count$ ore fa", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Ieri" },
"relativeTime_daysAgo": { "message": "$count$ giorni fa", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Errore durante il caricamento dei dettagli" },
"errorLoadingLocalContent": { "message": "Errore durante il caricamento del contenuto locale." },
"errorServerResponse": { "message": "Risposta del server non riuscita." },
"errorPlexApi": { "message": "Errore $status$ dell'API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Errore durante l'analisi dell'XML di Plex." },
"untitled": { "message": "Senza titolo" },
"itemCount": { "message": "$count$ elementi", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Nessun server di foto" },
"jellyfinScanInProgress": { "message": "La scansione di Jellyfin è già in corso." },
"jellyfinScanning": { "message": "Scansione di Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Completa l'URL e il nome utente di Jellyfin." },
"jellyfinConnecting": { "message": "Connessione a Jellyfin in corso: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Autenticazione Jellyfin non riuscita: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Autenticazione Jellyfin riuscita." },
"jellyfinFetchingLibraries": { "message": "Recupero delle librerie..." },
"jellyfinFetchFailed": { "message": "Errore durante il recupero delle librerie: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Nessuna libreria di film o serie trovata in Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ libreria/e multimediale/i trovata/e.", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Successo] '$libraryName' scansionata, $count$ titoli aggiunti.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Errore durante la scansione della libreria '$libraryName'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Scansione Jellyfin completata. Aggiunti $movies$ film e $series$ serie.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Credenziali Jellyfin non configurate." },
"notFoundOnJellyfin": { "message": "\"$query$\" non trovato su Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" non trovato su nessun server.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "Su Plex" },
"searchOnPlex": { "message": "Cerca su Plex" },
"jellyfinTitle": { "message": "Contenuti Jellyfin" },
"noJellyfinContent": { "message": "Nessun contenuto Jellyfin trovato." },
"noJellyfinContentSub": { "message": "Assicurati di aver scansionato il tuo server Jellyfin nelle impostazioni." },
"activityViewerTitle": { "message": "Visualizzatore attività del server" },
"activitySelectServer": { "message": "Seleziona un server" },
"activityCheckBtn": { "message": "Aggiorna" },
"activityNoSessions": { "message": "Nessuna sessione attiva su questo server." },
"activitySessionUser": { "message": "Utente" },
"activitySessionDevice": { "message": "Dispositivo" },
"activitySessionContent": { "message": "Contenuto" },
"activitySessionState": { "message": "Stato" },
"activitySessionIdentifier": { "message": "Identificatore del client" },
"activityCopyID": { "message": "Copia ID" },
"activityError": { "message": "Impossibile ottenere l'attività del server." },
"activityCopied": { "message": "Identificatore copiato negli appunti!" },
"activityCopyError": { "message": "Errore durante la copia dell'identificatore." },
"noProvidersFound": { "message": "Nessun provider trovato." },
"availableOnPlex": { "message": "Disponibile su Plex" },
"m3uGeneratorTitle": { "message": "Generatore di elenchi M3U" },
"selectAServer": { "message": "Seleziona un server..." },
"downloadM3u": { "message": "Scarica M3U" },
"m3uGenerator": { "message": "Generatore M3U" },
"selectLibraries": { "message": "Seleziona librerie" },
"howToUse": { "message": "Come usare" },
"m3uInstruction1": { "message": "Scegli un server dall'elenco." },
"m3uInstruction2": { "message": "Seleziona una o più librerie da includere." },
"m3uInstruction3": { "message": "Fai clic sul pulsante di download." },
"m3uInstruction4": { "message": "Importa il file .m3u nel tuo lettore compatibile." },
"chatOpen": { "message": "Apri chat" },
"chatTitle": { "message": "Assistente AI" },
"chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Écrivez votre message..." },
"chatPlaceholder": { "message": "Scrivi il tuo messaggio..." },
"chatSend": { "message": "➤" },
"chatWelcome": { "message": "Bienvenue ! Je suis votre assistant CinePlex. Demandez-moi des informations sur les films, les séries ou tout ce que vous voulez savoir." },
"chatGoogleApiKeyMissing": { "message": "La clé API Google Gemini n'est pas configurée. Veuillez la configurer dans les paramètres de l'extension pour utiliser l'assistant IA." },
"chatApiInvalidResponse": { "message": "L'API a renvoyé une réponse invalide. Veuillez réessayer." },
"chatApiError": { "message": "Erreur de communication avec l'assistant IA" },
"downloadAll": { "message": "Tout télécharger" },
"download": { "message": "Télécharger" },
"aiToolSearchLibraryDesc": { "message": "Recherche dans la bibliothèque Plex de l'utilisateur des films ou séries par titre." },
"aiToolSearchLibraryQueryParamDesc": { "message": "Le titre du film ou de la série à rechercher." },
"aiToolSearchLibraryTypeParamDesc": { "message": "Le type de contenu à rechercher. Peut être 'movie' pour les films ou 'series' pour les séries. (Facultatif)." },
"aiToolNavigateToPageDesc": { "message": "Navigue l'utilisateur vers une page spécifique de l'interface de l'application." },
"aiToolNavigateToPagePageParamDesc": { "message": "Le nom de la page à naviguer, par exemple : 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', ou 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Obtient et affiche les statistiques de la bibliothèque de l'utilisateur, telles que le nombre total de films, séries et artistes uniques." },
"aiToolShowItemDetailsDesc": { "message": "Affiche la page de détails d'un film ou d'une série spécifique par son titre et son type." },
"aiToolShowItemDetailsTitleParamDesc": { "message": "Le titre exact du film ou de la série." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Ajoute un film ou une série à la liste de lecture actuelle de l'utilisateur pour la diffuser à un serveur PHP configuré." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "Le titre du film ou de la série à ajouter." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolCheckAndDownloadDesc": { "message": "Vérifie la disponibilité d'une liste de titres de films ou de séries sur les serveurs locaux de l'utilisateur et, si trouvés, génère et télécharge un fichier de playlist M3U avec les streams trouvés." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Un tableau de titres de films ou de séries à rechercher et télécharger." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "Le type de contenu de la liste. Doit être 'movie' ou 'series'." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "Le nom du fichier M3U à télécharger (par exemple, 'MaListe.m3u'). S'il n'est pas fourni, un nom par défaut sera utilisé." },
"aiToolToggleFavoriteDesc": { "message": "Ajoute ou retire un film ou une série de la liste des favoris de l'utilisateur." },
"aiToolToggleFavoriteTitleParamDesc": { "message": "Le titre du film ou de la série." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Génère et affiche une liste de recommandations de films ou de séries basées sur l'historique de visionnage et les favoris de l'utilisateur." },
"aiToolApplyFiltersDesc": { "message": "Applique des filtres à la vue actuelle des films ou des séries, permettant d'affiner les résultats par type, genre, année et ordre de classement." },
"aiToolApplyFiltersTypeParamDesc": { "message": "Le type de contenu auquel appliquer les filtres. Doit être 'movie' ou 'series'." },
"aiToolApplyFiltersGenreParamDesc": { "message": "Le nom du genre par lequel filtrer (par exemple, 'Action', 'Drame')." },
"aiToolApplyFiltersYearParamDesc": { "message": "L'année de sortie par laquelle filtrer (par exemple, '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "Le critère de tri pour les résultats. Valeurs valides : 'popularity.desc' (populaires), 'vote_average.desc' (mieux notés), 'release_date.desc' (récents pour les films) ou 'first_air_date.desc' (récents pour les séries)." },
"aiToolPlayMusicByArtistDesc": { "message": "Ouvre le lecteur de musique et commence à jouer des chansons d'un artiste spécifique de la bibliothèque de l'utilisateur." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "Le nom exact de l'artiste dont les chansons sont à jouer." },
"aiToolClearChatHistoryDesc": { "message": "Efface tout l'historique des messages de la conversation actuelle avec l'assistant IA." },
"aiToolDeleteDatabaseDesc": { "message": "Supprime toute la base de données locale de l'extension, y compris le contenu scanné, les paramètres et les favoris. Cette action est irréversible et rechargera l'application." },
"aiToolUpdateAllTokensDesc": { "message": "Lance un scan complet de tous les serveurs et bibliothèques Plex associés aux jetons configurés dans l'extension. Met à jour tous les films, séries, artistes et photos." },
"aiToolAddPlexTokenDesc": { "message": "Ajoute un nouveau jeton X-Plex à la configuration de l'extension, permettant à l'application de scanner le contenu des nouveaux serveurs Plex." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "La chaîne du jeton X-Plex à ajouter." },
"aiToolChangeRegionDesc": { "message": "Change la région utilisée pour la découverte de contenu dans l'API TMDB. Cela affectera les résultats affichés dans les sections de films et de séries, ainsi que les fournisseurs de streaming." },
"aiToolChangeRegionRegionParamDesc": { "message": "Le code pays ISO 3166-1 à deux lettres pour la nouvelle région (par exemple, 'US' pour les États-Unis, 'ES' pour l'Espagne, 'MX' pour le Mexique)." },
"aiToolClearAllFavoritesDesc": { "message": "Supprime tous les films et séries que l'utilisateur a marqués comme favoris." },
"aiToolClearViewingHistoryDesc": { "message": "Efface l'historique de visionnage de l'utilisateur de la page d'historique." },
"aiToolClearRecommendationsViewDesc": { "message": "Nettoie la vue des recommandations et supprime les recommandations mises en cache." },
"aiToolSearchNotFound": { "message": "Impossible de trouver '$query$' dans votre bibliothèque.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navigué vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Erreur lors de la navigation vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Erreur lors de l'obtention des statistiques." },
"aiToolItemNotFound": { "message": "L'élément '$title$' n'a pas été trouvé.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Affichage des détails de '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Ajouté '$title$' à la liste de lecture.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Ajouté '$title$' aux favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Supprimé '$title$' des favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Affichage des recommandations." },
"aiToolApplyFiltersGenreNotFound": { "message": "Genre '$genre$' non trouvé.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filtres appliqués avec succès." },
"aiToolPlayMusicNotReady": { "message": "Le lecteur de musique n'est pas prêt. Assurez-vous que votre bibliothèque musicale Plex a été scannée." },
"aiToolPlayMusicArtistNotFound": { "message": "Artiste '$artist_name$' non trouvé.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Aucune chanson trouvée pour '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Lecture de musique de '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Historique du chat effacé." },
"aiToolConfirmDeleteDatabase": { "message": "Êtes-vous sûr de vouloir supprimer la base de données locale ? Cette action est irréversible." },
"aiToolDeleteDatabaseCancelled": { "message": "Suppression de la base de données annulée." },
"aiToolExecutionError": { "message": "Erreur lors de l'exécution de l'outil '$toolName$' : $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Outil inconnu : '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favoris effacés." },
"aiToolFavoritesClearError": { "message": "Erreur lors de l'effacement des favoris : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recommandations effacées." },
"aiToolRecommendationsClearError": { "message": "Erreur lors de l'effacement des recommandations : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Base de données supprimée. La page va être rechargée." },
"aiToolDatabaseDeleteError": { "message": "Erreur lors de la suppression de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "La suppression de la base de données est bloquée. Fermez les autres onglets de l'application." },
"aiToolUpdateAllTokensSuccess": { "message": "Tous les jetons ont été mis à jour avec succès." },
"aiToolUpdateAllTokensError": { "message": "Erreur lors de la mise à jour des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Jeton Plex ajouté avec succès." },
"aiToolAddPlexTokenError": { "message": "Erreur lors de l'ajout du jeton Plex : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Région changée en $region$. Le contenu est en cours de mise à jour.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Erreur lors du changement de région : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Historique de visionnage effacé." },
"aiToolViewingHistoryClearError": { "message": "Erreur lors de l'effacement de l'historique de visionnage : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Vous êtes un assistant expert en films et séries appelé CinePlex. Votre fonction principale est d'aider les utilisateurs à découvrir du contenu et à interagir avec leur bibliothèque. Suivez ces règles rigoureusement : 1. **NE JAMAIS** inventer que vous avez effectué une action si vous n'avez pas utilisé un outil pour cela. Par exemple, ne dites pas 'j'ai téléchargé X' si vous n'avez pas utilisé l'outil de téléchargement. 2. Pour les demandes de recommandations ou de listes (ex. 'dis-moi 5 films d'horreur'), utilisez vos propres connaissances pour générer la liste. Présentez-la sous forme numérotée ou à puces. Après avoir affiché la liste, demandez de manière proactive à l'utilisateur s'il souhaite que vous vérifiiez la disponibilité sur ses serveurs locaux et que vous créiez un fichier M3U. 3. **SEULEMENT** si l'utilisateur confirme qu'il souhaite vérifier ou télécharger la liste, utilisez l'outil `check_and_download_titles_list`. Ne l'utilisez pas sans confirmation explicite. 4. Pour toute autre action comme naviguer, obtenir des statistiques ou rechercher un titre spécifique, utilisez les outils appropriés. Soyez toujours concis, amical et efficace." },
"aiToolM3UNoTitlesProvided": { "message": "Veuillez fournir une liste de titres pour créer la playlist." },
"aiToolM3UCheckingTitles": { "message": "Vérification des titres sur vos serveurs locaux..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Je n'ai trouvé aucun des films ou séries de la liste sur vos serveurs locaux." },
"aiToolM3UDownloadStarted": { "message": "Fait ! J'ai trouvé $1 sur $2 titres sur vos serveurs et j'ai lancé le téléchargement de la playlist M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Retour aux fournisseurs" },
"artistsCounterSingle": { "message": "$total$ Artiste", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Chargement..." },
"downloadingSong": { "message": "Démarrage du téléchargement de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" téléchargée.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Erreur lors du téléchargement de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Génération M3U pour \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U pour l'album \"$artist$\" généré.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Nouvel essai de la section \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCÈS] Nouvel essai pour \"$title$\" terminé.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERREUR FINALE] L'essai a échoué pour \"$title$\" : $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Démarrage de la phase de réessais pour $count$ sections...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Jeton $token$... a trouvé $count$ serveurs.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Erreur lors du traitement du jeton $token$... : $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "ERREUR FATALE : $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Erreur pendant le scan : $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Arrêt du scan Plex..." },
"invalidTokenProvided": { "message": "Jeton invalide fourni." },
"tokenAlreadyExists": { "message": "Le jeton existe déjà." },
"tokenAddedSuccessfully": { "message": "Jeton ajouté avec succès." },
"noStreamsFoundForSelection": { "message": "Aucun stream trouvé pour la sélection." },
"autoplayBlocked": { "message": "Lecture automatique bloquée." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Page" }
"chatWelcome": { "message": "Benvenuto! Sono il tuo assistente CinePlex. Chiedimi di film, serie o qualsiasi altra cosa tu voglia sapere." },
"chatGoogleApiKeyMissing": { "message": "La chiave API di Google Gemini non è configurata. Impostala nelle impostazioni dell'estensione per utilizzare l'assistente AI." },
"chatApiInvalidResponse": { "message": "L'API ha restituito una risposta non valida. Riprova." },
"chatApiError": { "message": "Errore di comunicazione con l'assistente AI" },
"downloadAll": { "message": "Scarica tutto" },
"download": { "message": "Scarica" },
"aiToolSearchLibraryDesc": { "message": "Cerca nella libreria Plex dell'utente film o serie per titolo." },
"aiToolSearchLibraryQueryParamDesc": { "message": "Il titolo del film o della serie da cercare." },
"aiToolSearchLibraryTypeParamDesc": { "message": "Il tipo di contenuto da cercare. Può essere 'movie' per i film o 'series' per le serie. (Facoltativo)." },
"aiToolSearchLibraryResolutionParamDesc": { "message": "La risoluzione video da cercare (ad es. '4k', '1080p'). (Facoltativo)." },
"aiToolSearchLibraryContainerParamDesc": { "message": "Il formato del contenitore video da cercare (ad es. 'mkv', 'mp4'). (Facoltativo)." },
"aiToolNavigateToPageDesc": { "message": "Indirizza l'utente a una pagina specifica dell'interfaccia dell'applicazione." },
"aiToolNavigateToPagePageParamDesc": { "message": "Il nome della pagina a cui navigare, ad es.: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers' o 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Recupera e visualizza le statistiche della libreria dell'utente, come il numero totale di film, serie e artisti unici." },
"aiToolShowItemDetailsDesc": { "message": "Visualizza la pagina dei dettagli di un film o di una serie specifica in base al titolo e al tipo." },
"aiToolShowItemDetailsTitleParamDesc": { "message": "Il titolo esatto del film o della serie." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "Il tipo di contenuto. Deve essere 'movie' o 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Aggiunge un film o una serie alla playlist corrente dell'utente per lo streaming su un server PHP configurato." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "Il titolo del film o della serie da aggiungere." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "Il tipo di contenuto. Deve essere 'movie' o 'series'." },
"aiToolCheckAndDownloadDesc": { "message": "Controlla la disponibilità di un elenco di titoli di film o serie sui server locali dell'utente e, se trovati, genera e scarica un file di playlist M3U con gli streaming trovati." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Un array di titoli di film o serie da cercare e scaricare." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "Il tipo di contenuto dell'elenco. Deve essere 'movie' o 'series'." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "Il nome del file M3U da scaricare (ad es. 'MiaLista.m3u'). Se non fornito, verrà utilizzato un nome predefinito." },
"aiToolToggleFavoriteDesc": { "message": "Aggiunge o rimuove un film o una serie dall'elenco dei preferiti dell'utente." },
"aiToolToggleFavoriteTitleParamDesc": { "message": "Il titolo del film o della serie." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "Il tipo di contenuto. Deve essere 'movie' o 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Genera e visualizza un elenco di consigli di film o serie basati sulla cronologia di visualizzazione e sui preferiti dell'utente." },
"aiToolApplyFiltersDesc": { "message": "Applica filtri alla visualizzazione corrente di film o serie, consentendo di affinare i risultati per tipo, genere, anno e ordine di ordinamento." },
"aiToolApplyFiltersTypeParamDesc": { "message": "Il tipo di contenuto a cui applicare i filtri. Deve essere 'movie' o 'series'." },
"aiToolApplyFiltersGenreParamDesc": { "message": "Il nome del genere per cui filtrare (ad es. 'Azione', 'Drammatico')." },
"aiToolApplyFiltersYearParamDesc": { "message": "L'anno di uscita per cui filtrare (ad es. '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "Il criterio di ordinamento per i risultati. Valori validi: 'popularity.desc' (popolari), 'vote_average.desc' (più votati), 'release_date.desc' (recenti per i film) o 'first_air_date.desc' (recenti per le serie)." },
"aiToolPlayMusicByArtistDesc": { "message": "Apre il lettore musicale e avvia la riproduzione dei brani di un artista specifico dalla libreria dell'utente." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "Il nome esatto dell'artista di cui si desidera riprodurre i brani." },
"aiToolClearChatHistoryDesc": { "message": "Cancella tutta la cronologia dei messaggi della conversazione corrente con l'assistente AI." },
"aiToolDeleteDatabaseDesc": { "message": "Elimina l'intero database locale dell'estensione, inclusi i contenuti scansionati, le impostazioni e i preferiti. Questa azione è irreversibile e ricaricherà l'applicazione." },
"aiToolUpdateAllTokensDesc": { "message": "Avvia una scansione completa di tutti i server e le librerie Plex associati ai token configurati nell'estensione. Aggiorna tutti i film, le serie, gli artisti e le foto." },
"aiToolAddPlexTokenDesc": { "message": "Aggiunge un nuovo token X-Plex alla configurazione dell'estensione, consentendo all'applicazione di scansionare i contenuti di nuovi server Plex." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "La stringa del token X-Plex da aggiungere." },
"aiToolChangeRegionDesc": { "message": "Modifica la regione utilizzata per la scoperta di contenuti nell'API TMDB. Ciò influirà sui risultati visualizzati nelle sezioni di film e serie, nonché sui provider di streaming." },
"aiToolChangeRegionRegionParamDesc": { "message": "Il codice paese ISO 3166-1 a due lettere per la nuova regione (ad es. 'US' per gli Stati Uniti, 'ES' per la Spagna, 'MX' per il Messico)." },
"aiToolClearAllFavoritesDesc": { "message": "Rimuove tutti i film e le serie che l'utente ha contrassegnato come preferiti." },
"aiToolClearViewingHistoryDesc": { "message": "Cancella la cronologia di visualizzazione dell'utente dalla pagina della cronologia." },
"aiToolClearRecommendationsViewDesc": { "message": "Svuota la vista dei consigli e rimuove i consigli memorizzati nella cache." },
"aiToolSearchNotFound": { "message": "'$query' non trovato nella tua libreria.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navigato alla pagina $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Errore durante la navigazione alla pagina $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Errore nel recupero delle statistiche." },
"aiToolItemNotFound": { "message": "Elemento '$title' non trovato.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Visualizzazione dei dettagli di '$title'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Aggiunto '$title' alla playlist.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Aggiunto '$title' ai preferiti.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Rimosso '$title' dai preferiti.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Visualizzazione dei consigli." },
"aiToolApplyFiltersGenreNotFound": { "message": "Genere '$genre' non trovato.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filtri applicati correttamente." },
"aiToolPlayMusicNotReady": { "message": "Il lettore musicale non è pronto. Assicurati che la tua libreria musicale di Plex sia stata scansionata." },
"aiToolPlayMusicArtistNotFound": { "message": "Artista '$artist_name' non trovato.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Nessun brano trovato per '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Riproduzione di musica di '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Cronologia della chat cancellata." },
"aiToolConfirmDeleteDatabase": { "message": "Sei sicuro di voler eliminare il database locale? Questa azione è irreversibile." },
"aiToolDeleteDatabaseCancelled": { "message": "Eliminazione del database annullata." },
"aiToolExecutionError": { "message": "Errore durante l'esecuzione dello strumento '$toolName$': $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Strumento sconosciuto: '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Preferiti cancellati." },
"aiToolFavoritesClearError": { "message": "Errore durante la cancellazione dei preferiti: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Consigli cancellati." },
"aiToolRecommendationsClearError": { "message": "Errore durante la cancellazione dei consigli: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Database eliminato. La pagina verrà ricaricata." },
"aiToolDatabaseDeleteError": { "message": "Errore durante l'eliminazione del database: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "L'eliminazione del database è bloccata. Chiudi le altre schede dell'applicazione." },
"aiToolUpdateAllTokensSuccess": { "message": "Tutti i token sono stati aggiornati correttamente." },
"aiToolUpdateAllTokensError": { "message": "Errore durante l'aggiornamento dei token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Token Plex aggiunto correttamente." },
"aiToolAddPlexTokenError": { "message": "Errore durante l'aggiunta del token Plex: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Regione modificata in $region$. Il contenuto è in fase di aggiornamento.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Errore durante la modifica della regione: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Cronologia visualizzazioni cancellata." },
"aiToolViewingHistoryClearError": { "message": "Errore durante la cancellazione della cronologia di visualizzazione: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Sei un assistente esperto di film e serie chiamato CinePlex. La tua funzione principale è aiutare gli utenti a scoprire contenuti e a interagire con la loro libreria. Segui rigorosamente queste regole: 1. **NON FINGERE MAI** di aver eseguito un'azione se non hai utilizzato uno strumento per farlo. Ad esempio, non dire 'Ho scaricato X' se non hai utilizzato lo strumento di download. 2. Per le richieste di consigli o elenchi (ad es. 'dimmi 5 film dell'orrore'), usa le tue conoscenze per generare l'elenco. Presentalo in formato numerato o puntato. Dopo aver visualizzato l'elenco, chiedi proattivamente all'utente se desidera che tu verifichi la disponibilità sui suoi server locali e crei un file M3U. 3. **SOLO** se l'utente conferma di voler controllare o scaricare l'elenco, utilizza lo strumento `check_and_download_titles_list`. Non utilizzarlo senza una conferma esplicita. 4. Per qualsiasi altra azione come la navigazione, l'ottenimento di statistiche, la ricerca di un titolo specifico o il filtraggio per risoluzione o contenitore, utilizza gli strumenti appropriati. Sii sempre conciso, amichevole ed efficiente." },
"aiToolM3UNoTitlesProvided": { "message": "Fornisci un elenco di titoli per creare la playlist." },
"aiToolM3UCheckingTitles": { "message": "Controllo dei titoli sui tuoi server locali..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Non ho trovato nessuno dei film o delle serie dell'elenco sui tuoi server locali." },
"aiToolM3UDownloadStarted": { "message": "Fatto! Ho trovato $1 dei $2 titoli sui tuoi server e ho avviato il download della playlist M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Torna ai provider" },
"artistsCounterSingle": { "message": "$total$ artista", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Caricamento..." },
"downloadingSong": { "message": "Avvio del download di \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" scaricato.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Errore durante il download di \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Generazione di M3U per \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U per l'album \"$artist$\" generato.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Nuovo tentativo per la sezione \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCESSO] Nuovo tentativo per \"$title$\" completato.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERRORE FINALE] Tentativo fallito per \"$title$\": $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Avvio della fase di tentativi ripetuti per $count$ sezioni...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Token $token$... ha trovato $count$ server.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Errore durante l'elaborazione del token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "ERRORE FATALE: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Errore durante la scansione: $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Arresto della scansione di Plex..." },
"invalidTokenProvided": { "message": "Token non valido fornito." },
"tokenAlreadyExists": { "message": "Il token esiste già." },
"tokenAddedSuccessfully": { "message": "Token aggiunto correttamente." },
"noStreamsFoundForSelection": { "message": "Nessuno streaming trovato per la selezione." },
"autoplayBlocked": { "message": "Riproduzione automatica bloccata." },
"page": { "message": "Pagina" },
"all": { "message": "Tutti" },
"userScore": { "message": "Punteggio degli utenti" },
"duration": { "message": "Durata" },
"min": { "message": "Min" },
"max": { "message": "Max" }
}

View File

@ -1,55 +1,55 @@
{
"appName": { "message": "CinePlex" },
"appDescription": { "message": "Scaneia servidores Plex para encontrar conteúdo e mostra-o na interface" },
"appDescription": { "message": "Examina servidores Plex em busca de conteúdo e o exibe na interface" },
"appTagline": { "message": "Filmes, Séries e Música" },
"appLocaleCode": { "message": "pt-PT" },
"toggleNavigation": { "message": "Alternar Navegação" },
"appLocaleCode": { "message": "pt-BR" },
"toggleNavigation": { "message": "Alternar navegação" },
"searchPlaceholder": { "message": "Pesquisar filmes ou séries..." },
"openMusicPlayer": { "message": "Abrir Reprodutor de Música" },
"settings": { "message": "Definições" },
"openMusicPlayer": { "message": "Abrir reprodutor de música" },
"settings": { "message": "Configurações" },
"navMovies": { "message": "Filmes" },
"navSeries": { "message": "Séries" },
"navProviders": { "message": "Fornecedores" },
"navProviders": { "message": "Provedores" },
"navPhotos": { "message": "Fotos" },
"navStats": { "message": "Estatísticas" },
"navFavorites": { "message": "Favoritos" },
"navHistory": { "message": "Histórico" },
"navRecommendations": { "message": "Recomendações" },
"navMusic": { "message": "Música" },
"navM3uGenerator": { "message": "Gerador M3U" },
"heroWelcome": { "message": "" },
"navM3uGenerator": { "message": "Gerador de M3U" },
"heroWelcome": { "message": "Bem-vindo ao CinePlex" },
"heroSubtitle": { "message": "Explore milhares de filmes e séries." },
"addStream": { "message": "Adicionar Stream" },
"addStream": { "message": "Adicionar stream" },
"moreInfo": { "message": "Mais informações" },
"popularMovies": { "message": "Filmes Populares" },
"allGenres": { "message": "Todos os géneros" },
"popularMovies": { "message": "Filmes populares" },
"allGenres": { "message": "Todos os gêneros" },
"allYears": { "message": "Todos os anos" },
"sortPopular": { "message": "Mais populares" },
"sortTopRated": { "message": "Melhor avaliados" },
"sortTopRated": { "message": "Mais bem avaliados" },
"sortRecent": { "message": "Mais recentes" },
"loadMore": { "message": "Carregar mais" },
"photosBreadcrumbHome": { "message": "Álbuns" },
"selectServer": { "message": "Selecionar um servidor" },
"loading": { "message": "A carregar..." },
"loadingLibraries": { "message": "A carregar bibliotecas..." },
"photosEmptyState": { "message": "Nenhum álbum ou foto encontrada." },
"photosEmptyStateSub": { "message": "Por favor, selecione um servidor ou certifique-se de que tem uma biblioteca de fotos no Plex." },
"statsTitle": { "message": "Estatísticas da Biblioteca" },
"statsAllTokens": { "message": "Todos os Tokens" },
"statsAnalyzing": { "message": "A analisar a sua biblioteca..." },
"statsActiveTokens": { "message": "Tokens Ativos" },
"statsServersFound": { "message": "Servidores Encontrados" },
"statsUniqueMovies": { "message": "Filmes Únicos" },
"statsUniqueSeries": { "message": "Séries Únicas" },
"statsUniqueArtists": { "message": "Artistas Únicos" },
"statsTokenServers": { "message": "Servidores do Token" },
"statsChartMoviesByGenre": { "message": "Conteúdo por nero (Filmes)" },
"statsChartSeriesByGenre": { "message": "Conteúdo por nero (Séries)" },
"statsChartByDecade": { "message": "Conteúdo por Década" },
"recommendationsTitle": { "message": "Recomendações para si" },
"historyTitle": { "message": "Histórico de Visualização" },
"clearHistory": { "message": "Limpar Tudo" },
"consoleTitle": { "message": "Consola de Leitura Plex" },
"selectServer": { "message": "Selecione um servidor" },
"loading": { "message": "Carregando..." },
"loadingLibraries": { "message": "Carregando bibliotecas..." },
"photosEmptyState": { "message": "Nenhum álbum ou foto encontrado." },
"photosEmptyStateSub": { "message": "Selecione um servidor ou verifique se você tem uma biblioteca de fotos no Plex." },
"statsTitle": { "message": "Estatísticas da biblioteca" },
"statsAllTokens": { "message": "Todos os tokens" },
"statsAnalyzing": { "message": "Analisando sua biblioteca..." },
"statsActiveTokens": { "message": "Tokens ativos" },
"statsServersFound": { "message": "Servidores encontrados" },
"statsUniqueMovies": { "message": "Filmes únicos" },
"statsUniqueSeries": { "message": "Séries únicas" },
"statsUniqueArtists": { "message": "Artistas únicos" },
"statsTokenServers": { "message": "Servidores de token" },
"statsChartMoviesByGenre": { "message": "Conteúdo por nero (Filmes)" },
"statsChartSeriesByGenre": { "message": "Conteúdo por nero (Séries)" },
"statsChartByDecade": { "message": "Conteúdo por década" },
"recommendationsTitle": { "message": "Recomendações para você" },
"historyTitle": { "message": "Histórico de visualização" },
"clearHistory": { "message": "Limpar tudo" },
"consoleTitle": { "message": "Console de verificação do Plex" },
"footerCredit": { "message": "Uma interface para o seu universo Plex." },
"closeTrailer": { "message": "Fechar trailer" },
"close": { "message": "Fechar" },
@ -57,185 +57,185 @@
"previous": { "message": "Anterior" },
"next": { "message": "Próximo" },
"notificationTemplateText": { "message": "Notificação" },
"settingsTitleFull": { "message": "Definições e Configuração" },
"settingsTitleFull": { "message": "Configurações e ajustes" },
"settingsTabGeneral": { "message": "Geral" },
"settingsTabPlex": { "message": "Plex" },
"settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "Gerador PHP" },
"settingsTabPhpGen": { "message": "Gerador de PHP" },
"settingsTabData": { "message": "Dados" },
"settingsApiServer": { "message": "Configuração de API e Servidor" },
"settingsTmdbApiLabel": { "message": "Chave de API TMDB (Opcional)" },
"settingsTmdbApiPlaceholder": { "message": "Será usada a chave padrão se deixado em branco" },
"settingsGoogleApiLabel": { "message": "Chave de API Google Gemini (Opcional)" },
"settingsApiServer": { "message": "Configurações de API e servidor" },
"settingsTmdbApiLabel": { "message": "Chave de API do TMDB (opcional)" },
"settingsTmdbApiPlaceholder": { "message": "A chave padrão será usada se o campo for deixado em branco" },
"settingsGoogleApiLabel": { "message": "Chave de API do Google Gemini (opcional)" },
"settingsGoogleApiPlaceholder": { "message": "Necessária para usar o assistente de IA" },
"settingsRegionLabel": { "message": "Região para descoberta de conteúdo" },
"allRegions": { "message": "Todas as regiões" },
"settingsPhpUrlLabel": { "message": "URL do Servidor para Adicionar Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://o-seu-servidor.com/caminho/para/o-script.php" },
"settingsPhpUrlLabel": { "message": "URL do servidor para adicionar streams" },
"settingsPhpUrlPlaceholder": { "message": "https://seu-servidor.com/caminho/para/script.php" },
"settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Modo Claro" },
"settingsShowHero": { "message": "Mostrar secção de boas-vindas 'Hero'" },
"settingsScanContent": { "message": "Análise de Conteúdo" },
"settingsScanDesc": { "message": "Selecione o que analisar e clique no botão." },
"settingsLightTheme": { "message": "Modo claro" },
"settingsShowHero": { "message": "Mostrar seção de boas-vindas 'Hero'" },
"settingsScanContent": { "message": "Verificação de conteúdo" },
"settingsScanDesc": { "message": "Selecione o que verificar e pressione o botão." },
"settingsScanMovies": { "message": "Filmes" },
"settingsScanShows": { "message": "Séries" },
"settingsScanArtists": { "message": "Música" },
"settingsScanPhotos": { "message": "Fotos" },
"settingsSelectAll": { "message": "Selecionar Tudo" },
"settingsStartScan": { "message": "Iniciar Análise" },
"settingsPlexTokens": { "message": "Tokens Plex" },
"settingsPlexTokensDesc": { "message": "Editar a lista de tokens Plex (formato JSON)." },
"settingsSaveTokens": { "message": "Guardar Tokens" },
"settingsJellyfinTitle": { "message": "Configuração Jellyfin" },
"settingsJellyfinDesc": { "message": "Adicione os dados do seu servidor Jellyfin para analisar o seu conteúdo." },
"jellyfinUrlLabel": { "message": "URL do Servidor Jellyfin" },
"jellyfinUserLabel": { "message": "Nome de Utilizador" },
"jellyfinPassLabel": { "message": "Palavra-passe" },
"jellyfinConnectAndScan": { "message": "Ligar e Analisar" },
"settingsPhpGenTitle": { "message": "Gerador de Script PHP para o Servidor" },
"settingsPhpFileOptions": { "message": "Opções do Ficheiro" },
"settingsPhpSavePathLabel": { "message": "Caminho de Gravação no Servidor" },
"settingsSelectAll": { "message": "Selecionar tudo" },
"settingsStartScan": { "message": "Iniciar verificação" },
"settingsPlexTokens": { "message": "Tokens do Plex" },
"settingsPlexTokensDesc": { "message": "Edite a lista de tokens do Plex (formato JSON)." },
"settingsSaveTokens": { "message": "Salvar tokens" },
"settingsJellyfinTitle": { "message": "Configurações do Jellyfin" },
"settingsJellyfinDesc": { "message": "Adicione os detalhes do seu servidor Jellyfin para verificar o conteúdo dele." },
"jellyfinUrlLabel": { "message": "URL do servidor Jellyfin" },
"jellyfinUserLabel": { "message": "Nome de usuário" },
"jellyfinPassLabel": { "message": "Senha" },
"jellyfinConnectAndScan": { "message": "Conectar e verificar" },
"settingsPhpGenTitle": { "message": "Gerador de script PHP para servidor" },
"settingsPhpFileOptions": { "message": "Opções de arquivo" },
"settingsPhpSavePathLabel": { "message": "Caminho para salvar no servidor" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listas (em branco para a mesma pasta)" },
"settingsPhpFilenameLabel": { "message": "Nome do Ficheiro" },
"settingsPhpFileAction": { "message": "Ação no Ficheiro" },
"settingsPhpActionAppend": { "message": "Adicionar ao fim do ficheiro (cumulativo)" },
"settingsPhpActionOverwrite": { "message": "Sobrescrever o ficheiro (começar de novo)" },
"settingsPhpSecurity": { "message": "Segurança (Opcional)" },
"settingsPhpUseSecretKey": { "message": "Usar chave secreta (Recomendado)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Introduza uma chave secreta segura" },
"settingsPhpGeneratedCode": { "message": "Código Gerado" },
"settingsPhpFilenameLabel": { "message": "Nome do arquivo" },
"settingsPhpFileAction": { "message": "Ação do arquivo" },
"settingsPhpActionAppend": { "message": "Anexar ao final do arquivo (cumulativo)" },
"settingsPhpActionOverwrite": { "message": "Substituir o arquivo (começar do zero)" },
"settingsPhpSecurity": { "message": "Segurança (opcional)" },
"settingsPhpUseSecretKey": { "message": "Usar chave secreta (recomendado)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Digite uma chave secreta segura" },
"settingsPhpGeneratedCode": { "message": "Código gerado" },
"settingsPhpGeneratedPlaceholder": { "message": "O código PHP gerado aparecerá aqui." },
"settingsGenerateScript": { "message": "Gerar Script" },
"settingsCopyScript": { "message": "Copiar Script" },
"settingsDataManagement": { "message": "Gestão da Base de Dados Local" },
"settingsImportDb": { "message": "Importar BD de Ficheiro" },
"settingsExportDb": { "message": "Exportar BD para Ficheiro" },
"settingsClearContent": { "message": "Limpar Dados de Conteúdo Local" },
"settingsClearContentDesc": { "message": "Esta ação apagará filmes, séries e música da base de dados local, mas não afetará os seus favoritos nem as suas definições." },
"settingsGenerateScript": { "message": "Gerar script" },
"settingsCopyScript": { "message": "Copiar script" },
"settingsDataManagement": { "message": "Gerenciamento do banco de dados local" },
"settingsImportDb": { "message": "Importar banco de dados de um arquivo" },
"settingsExportDb": { "message": "Exportar banco de dados para um arquivo" },
"settingsClearContent": { "message": "Limpar dados de conteúdo local" },
"settingsClearContentDesc": { "message": "Esta ação excluirá filmes, séries e músicas do banco de dados local, mas não afetará seus favoritos ou suas configurações." },
"settingsClose": { "message": "Fechar" },
"settingsSave": { "message": "Guardar Definições" },
"settingsSave": { "message": "Salvar configurações" },
"musicSidenavTitle": { "message": "Música do Plex" },
"musicAllServers": { "message": "Todos os Servidores" },
"musicSearchArtistPlaceholder": { "message": "Pesquisar artista..." },
"musicAllServers": { "message": "Todos os servidores" },
"musicSearchArtistPlaceholder": { "message": "Pesquisar um artista..." },
"musicSearchDiscographyPlaceholder": { "message": "Pesquisar na discografia..." },
"musicNothingPlaying": { "message": "Nada a reproduzir" },
"musicSelectSong": { "message": "Selecionar uma canção" },
"musicToStart": { "message": "para começar a reproduzir" },
"miniplayerDownloadSong": { "message": "Descarregar canção" },
"miniplayerDownloadAlbum": { "message": "Descarregar álbum M3U" },
"musicNothingPlaying": { "message": "Nada tocando" },
"musicSelectSong": { "message": "Selecione uma música" },
"musicToStart": { "message": "para começar a tocar" },
"miniplayerDownloadSong": { "message": "Baixar música" },
"miniplayerDownloadAlbum": { "message": "Baixar álbum M3U" },
"miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Aleatório" },
"miniplayerEqualizer": { "message": "Equalizador" },
"miniplayerOpenList": { "message": "Abrir lista" },
"eqTitle": { "message": "Equalizador Gráfico" },
"eqTitle": { "message": "Equalizador gráfico" },
"eqPresetsLabel": { "message": "Predefinições" },
"eqPresetFlat": { "message": "Plano" },
"eqPresetRock": { "message": "Rock" },
"eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Clássica" },
"eqPresetBassBoost": { "message": "Reforço de Graves" },
"eqPresetClassical": { "message": "Clássico" },
"eqPresetBassBoost": { "message": "Reforço de graves" },
"eqPreampLabel": { "message": "Pré-amplificador" },
"infoModalTitle": { "message": "Informações" },
"infoModalFieldTitle": { "message": "Título:" },
"infoModalFieldArtist": { "message": "Artista:" },
"infoModalFieldAlbum": { "message": "Álbum:" },
"infoModalFieldSong": { "message": "Canção:" },
"infoModalFieldSong": { "message": "Música:" },
"infoModalFieldYear": { "message": "Ano:" },
"infoModalFieldGenre": { "message": "Género:" },
"infoModalFieldGenre": { "message": "Gênero:" },
"lang_en": { "message": "Inglês" },
"lang_es": { "message": "Espanhol" },
"lang_fr": { "message": "Francês" },
"lang_de": { "message": "Alemão" },
"lang_it": { "message": "Italiano" },
"lang_pt": { "message": "Português" },
"essentialFeaturesNotSupported": { "message": "O seu navegador não suporta funções essenciais." },
"dbAccessError": { "message": "Erro ao aceder à base de dados local." },
"dbUpdateNeeded": { "message": "A base de dados precisa de ser atualizada, por favor, recarregue a página." },
"dbBlocked": { "message": "Por favor, feche outros separadores desta aplicação para continuar." },
"deletingContentData": { "message": "A apagar dados de conteúdo locais..." },
"noContentDataToDelete": { "message": "Não há dados de conteúdo para apagar." },
"contentDataDeleted": { "message": "Dados de conteúdo apagados do IndexedDB." },
"errorDeletingData": { "message": "Erro ao apagar dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"essentialFeaturesNotSupported": { "message": "Seu navegador não suporta recursos essenciais." },
"dbAccessError": { "message": "Erro ao acessar o banco de dados local." },
"dbUpdateNeeded": { "message": "O banco de dados precisa ser atualizado, recarregue a página." },
"dbBlocked": { "message": "Feche outras abas deste aplicativo para continuar." },
"deletingContentData": { "message": "Excluindo dados de conteúdo local..." },
"noContentDataToDelete": { "message": "Nenhum dado de conteúdo para excluir." },
"contentDataDeleted": { "message": "Dados de conteúdo excluídos do IndexedDB." },
"errorDeletingData": { "message": "Erro ao excluir dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Editor de texto não disponível." },
"errorLoadingTokens": { "message": "Erro ao carregar tokens para edição." },
"errorLoadingTokensMessage": { "message": "Erro ao carregar tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor não disponível para guardar." },
"aceEditorNotAvailableToSave": { "message": "Editor não disponível para salvar." },
"invalidJsonFormat": { "message": "Formato JSON inválido. Deve ser { \"tokens\": [...] }" },
"tokensSaved": { "message": "Tokens guardados com sucesso." },
"errorSavingTokens": { "message": "Erro ao guardar tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB não está disponível." },
"dbExported": { "message": "Base de dados exportada com sucesso." },
"errorExportingDb": { "message": "Erro ao exportar a base de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "O ficheiro não contém um objeto JSON válido." },
"noDataToImport": { "message": "O ficheiro não contém dados para as secções da BD atual." },
"dbImported": { "message": "Base de dados importada com sucesso." },
"errorImportingDb": { "message": "Erro ao importar a base de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "A atualizar a vista com os novos dados..." },
"confirmClearContent": { "message": "Tem a certeza de que pretende apagar os dados de conteúdo locais (Filmes, Séries, Música, etc.)? Favoritos e Definições NÃO serão apagados." },
"trailerNotFound": { "message": "Não foi encontrado trailer para este título." },
"confirmClearHistory": { "message": "Tem a certeza de que pretende apagar todo o seu histórico de visualização? Esta ação não pode ser desfeita." },
"historyCleared": { "message": "Histórico de visualização apagado." },
"historyItemDeleted": { "message": "Item apagado do histórico." },
"tokensSaved": { "message": "Tokens salvos com sucesso." },
"errorSavingTokens": { "message": "Erro ao salvar tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "O IndexedDB não está disponível." },
"dbExported": { "message": "Banco de dados exportado com sucesso." },
"errorExportingDb": { "message": "Erro ao exportar o banco de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "O arquivo não contém um objeto JSON válido." },
"noDataToImport": { "message": "O arquivo não contém dados para as seções atuais do banco de dados." },
"dbImported": { "message": "Banco de dados importado com sucesso." },
"errorImportingDb": { "message": "Erro ao importar o banco de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Atualizando a visualização com novos dados..." },
"confirmClearContent": { "message": "Tem certeza de que deseja excluir os dados de conteúdo local (filmes, séries, músicas, etc.)? Favoritos e configurações NÃO serão excluídos." },
"trailerNotFound": { "message": "Nenhum trailer encontrado para este título." },
"confirmClearHistory": { "message": "Tem certeza de que deseja limpar todo o seu histórico de visualização? Esta ação não pode ser desfeita." },
"historyCleared": { "message": "Histórico de visualização limpo." },
"historyItemDeleted": { "message": "Item excluído do histórico." },
"errorGeneratingScript": { "message": "Primeiro, gere um script para poder copiá-lo." },
"scriptCopied": { "message": "Script PHP copiado para a área de transferência." },
"errorCopyingScript": { "message": "Erro ao copiar o script." },
"scriptGenerated": { "message": "Script PHP gerado." },
"errorLoadingAlbum": { "message": "Erro ao carregar álbum: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Erro: Nenhum servidor de fotos foi selecionado." },
"loadingGenres": { "message": "A carregar géneros..." },
"errorLoadingAlbum": { "message": "Erro ao carregar o álbum: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Erro: nenhum servidor de fotos foi selecionado." },
"loadingGenres": { "message": "Carregando gêneros..." },
"errorLoadingGenres": { "message": "Erro ao carregar" },
"noContentFound": { "message": "Não foram encontrados resultados." },
"noContentFound": { "message": "Nenhum resultado encontrado." },
"couldNotLoadContent": { "message": "Não foi possível carregar o conteúdo." },
"noFavorites": { "message": "Ainda não tem favoritos." },
"errorLoadingFavorites": { "message": "Erro ao carregar favoritos." },
"historyEmpty": { "message": "O seu histórico está vazio." },
"historyEmptySub": { "message": "Explore e veja conteúdo para que apareça aqui." },
"noFavorites": { "message": "Você ainda não tem favoritos." },
"errorLoadingFavorites": { "message": "Erro ao carregar os favoritos." },
"historyEmpty": { "message": "Seu histórico está vazio." },
"historyEmptySub": { "message": "Explore e assista a conteúdo para que ele apareça aqui." },
"errorGeneratingRecommendations": { "message": "Erro ao gerar recomendações." },
"noRecommendations": { "message": "Precisamos de o conhecer melhor para lhe dar recomendações!" },
"noRecommendations": { "message": "Precisamos conhecê-lo melhor para dar recomendações!" },
"errorGeneratingStats": { "message": "Erro ao gerar estatísticas." },
"noServersForToken": { "message": "Não foram encontrados servidores associados para este token." },
"searchingActorContent": { "message": "A procurar conteúdo de $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Não foi possível carregar o conteúdo para $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"noServersForToken": { "message": "Nenhum servidor associado encontrado para este token." },
"searchingActorContent": { "message": "Pesquisando conteúdo de $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Não foi possível carregar o conteúdo de $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Erro ao adicionar stream(s): $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "O URL do servidor PHP não está configurado. Por favor, configure-o em Definições." },
"searchingStreams": { "message": "A procurar streams para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "A enviar $count$ stream(s) para o servidor...", "placeholders": { "count": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "A URL do servidor PHP não está configurada. Configure-a nas Configurações." },
"searchingStreams": { "message": "Pesquisando streams para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Enviando $count$ stream(s) para o servidor...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) adicionado(s) com sucesso." },
"generatingM3U": { "message": "A gerar M3U para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" descarregado.", "placeholders": { "title": { "content": "$1" } } },
"generatingM3U": { "message": "Gerando M3U para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" baixado.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Erro ao gerar M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Definições guardadas com sucesso." },
"errorSavingSettings": { "message": "Erro ao guardar as definições na base de dados." },
"languageChangeReload": { "message": "Idioma alterado. A aplicação será recarregada agora." },
"settingsSavedSuccess": { "message": "Configurações salvas com sucesso." },
"errorSavingSettings": { "message": "Erro ao salvar as configurações no banco de dados." },
"languageChangeReload": { "message": "Idioma alterado. O aplicativo será recarregado agora." },
"addedToFavorites": { "message": "Adicionado aos favoritos." },
"removedFromFavorites": { "message": "Removido dos favoritos." },
"plexScanInProgress": { "message": "A análise do Plex já está em curso." },
"plexScanStarting": { "message": "A iniciar análise do Plex..." },
"noPlexTokens": { "message": "Não há tokens Plex configurados." },
"clearingSections": { "message": "A limpar secções: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Fase inicial de análise concluída." },
"retryPhaseFinished": { "message": "Fase de retentativas concluída." },
"plexScanFinished": { "message": "Análise concluída. A atualizar conteúdo..." },
"scanCancelled": { "message": "Análise cancelada pelo utilizador." },
"scanCancelledInfo": { "message": "Análise cancelada." },
"errorInitializingMusicPlayer": { "message": "Erro ao iniciar o reprodutor de música." },
"criticalErrorLoadingMusic": { "message": "Erro crítico ao carregar dados de música." },
"errorLoadingArtists": { "message": "Erro ao carregar artistas." },
"dbUnavailableError": { "message": "Erro: Base de dados não disponível." },
"updatingMusicData": { "message": "A atualizar dados de música..." },
"plexScanInProgress": { "message": "A verificação do Plex já está em andamento." },
"plexScanStarting": { "message": "Iniciando a verificação do Plex..." },
"noPlexTokens": { "message": "Nenhum token do Plex configurado." },
"clearingSections": { "message": "Limpando seções: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"initialScanPhaseComplete": { "message": "Fase de verificação inicial concluída." },
"retryPhaseFinished": { "message": "Fase de nova tentativa concluída." },
"plexScanFinished": { "message": "Verificação concluída. Atualizando conteúdo..." },
"scanCancelled": { "message": "Verificação cancelada pelo usuário." },
"scanCancelledInfo": { "message": "Verificação cancelada." },
"errorInitializingMusicPlayer": { "message": "Erro ao inicializar o reprodutor de música." },
"criticalErrorLoadingMusic": { "message": "Erro crítico ao carregar os dados de música." },
"errorLoadingArtists": { "message": "Erro ao carregar os artistas." },
"dbUnavailableError": { "message": "Erro: banco de dados indisponível." },
"updatingMusicData": { "message": "Atualizando dados de música..." },
"musicDataUpdated": { "message": "Dados de música atualizados." },
"errorFetchingArtistSongs": { "message": "Erro ao obter as canções do artista." },
"errorLoadingSongs": { "message": "Erro ao carregar canções." },
"noArtistsFound": { "message": "Não foram encontrados artistas." },
"errorFetchingArtistSongs": { "message": "Erro ao buscar as músicas do artista." },
"errorLoadingSongs": { "message": "Erro ao carregar as músicas." },
"noArtistsFound": { "message": "Nenhum artista encontrado." },
"shuffleOn": { "message": "Modo aleatório ativado." },
"shuffleOff": { "message": "Modo aleatório desativado." },
"playbackError": { "message": "Erro de reprodução" },
"errorLabel": { "message": "Erro" },
"reloadingPage": { "message": "A recarregar a página..." },
"reloadingPage": { "message": "Recarregando a página..." },
"viewed": { "message": "Visto" },
"local": { "message": "Local" },
"topRatedSort": {"message": "Melhor Avaliados"},
"topRatedSort": {"message": "Mais bem avaliados"},
"recentSort": {"message": "Recentes"},
"popularSort": {"message": "Populares"},
"moviesSectionTitle": {"message": "Filmes"},
@ -245,197 +245,205 @@
"explore": {"message": "Explorar"},
"noGenre": {"message": "Sem categoria"},
"synopsis": {"message": "Sinopse"},
"noSynopsis": {"message": "Não há sinopse disponível."},
"director": {"message": "Realizador:"},
"writer": {"message": "Argumentista:"},
"noSynopsis": {"message": "Nenhuma sinopse disponível."},
"director": {"message": "Diretor:"},
"writer": {"message": "Roteirista:"},
"viewOnImdb": {"message": "Ver no IMDb"},
"watchTrailer": {"message": "Ver Trailer"},
"watchTrailer": {"message": "Assistir ao trailer"},
"addToFavorites": {"message": "Adicionar aos favoritos"},
"removeFromFavorites": {"message": "Remover dos favoritos"},
"notAvailable": {"message": "Não disponível"},
"mainCast": {"message": "Elenco Principal"},
"seasonsAndEpisodes": {"message": "Temporadas e Episódios"},
"similarContent": {"message": "Conteúdo Semelhante"},
"episodesCount": {"message": "$count$ Episódios", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Temporadas", "placeholders": {"count": {"content": "$1"}}},
"mainCast": {"message": "Elenco principal"},
"seasonsAndEpisodes": {"message": "Temporadas e episódios"},
"similarContent": {"message": "Conteúdo semelhante"},
"filmography": {"message": "Filmografia"},
"availableOn": {"message": "Disponível em"},
"episodesCount": {"message": "$count$ episódios", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ temporadas", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Não foi encontrado trailer para este título."},
"noTrailerFound": {"message": "Nenhum trailer encontrado para este título."},
"fatalInitError": {"message": "Erro fatal de inicialização"},
"fatalInitErrorSub": {"message": "Não foi possível carregar a aplicação."},
"invalidStreamInfo": {"message": "Informação inválida."},
"dbUnavailableForStreams": {"message": "Base de dados local não disponível."},
"noPlexServersForStreams": {"message": "Não há servidores Plex."},
"notFoundOnServers": {"message": "Não foi encontrado \"$query$\" nos servidores Plex.", "placeholders": {"query": {"content": "$1"}}},
"fatalInitErrorSub": {"message": "Não foi possível carregar o aplicativo."},
"invalidStreamInfo": {"message": "Informações inválidas."},
"dbUnavailableForStreams": {"message": "Banco de dados local indisponível."},
"noPlexServersForStreams": {"message": "Nenhum servidor Plex."},
"notFoundOnServers": {"message": "\"$query$\" não encontrado nos servidores Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Agora mesmo" },
"relativeTime_minutesAgo": { "message": "Há $count$ minutos", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "Há $count$ horas", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Ontem" },
"relativeTime_daysAgo": { "message": "Há $count$ dias", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Erro ao Carregar Detalhes" },
"errorLoadingDetails": { "message": "Erro ao carregar os detalhes" },
"errorLoadingLocalContent": { "message": "Erro ao carregar o conteúdo local." },
"errorServerResponse": { "message": "Resposta não bem-sucedida do servidor." },
"errorPlexApi": { "message": "Erro $status$ da API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Erro ao analisar o XML Plex." },
"errorServerResponse": { "message": "Resposta do servidor sem sucesso." },
"errorPlexApi": { "message": "Erro $status$ da API do Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Erro ao analisar o XML do Plex." },
"untitled": { "message": "Sem título" },
"itemCount": { "message": "$count$ elementos", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Não há servidores de fotos" },
"jellyfinScanInProgress": { "message": "A análise do Jellyfin já está em curso." },
"jellyfinScanning": { "message": "A analisar Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Por favor, preencha o URL e o utilizador do Jellyfin." },
"jellyfinConnecting": { "message": "A ligar ao Jellyfin em: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Autenticação Jellyfin falhada: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Autenticação Jellyfin bem-sucedida." },
"jellyfinFetchingLibraries": { "message": "A obter bibliotecas..." },
"jellyfinFetchFailed": { "message": "Erro ao obter bibliotecas: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Não foram encontradas bibliotecas de filmes ou séries no Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ biblioteca(s) de multimédia encontrada(s).", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Sucesso] '$libraryName$' analisada, $count$ títulos adicionados.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Erro ao analisar a biblioteca '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Análise Jellyfin concluída. Adicionados $movies$ filmes e $series$ séries.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Credenciais Jellyfin não configuradas." },
"notFoundOnJellyfin": { "message": "Não foi encontrado \"$query$\" no Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "Não foi encontrado \"$query$\" em nenhum servidor.", "placeholders": { "query": { "content": "$1" } } },
"itemCount": { "message": "$count$ itens", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Nenhum servidor de fotos" },
"jellyfinScanInProgress": { "message": "A verificação do Jellyfin já está em andamento." },
"jellyfinScanning": { "message": "Verificando o Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Preencha a URL e o nome de usuário do Jellyfin." },
"jellyfinConnecting": { "message": "Conectando-se ao Jellyfin em: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "A autenticação do Jellyfin falhou: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Autenticação do Jellyfin bem-sucedida." },
"jellyfinFetchingLibraries": { "message": "Buscando bibliotecas..." },
"jellyfinFetchFailed": { "message": "Erro ao buscar bibliotecas: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Nenhuma biblioteca de filmes ou séries encontrada no Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ biblioteca(s) de mídia encontrada(s).", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Sucesso] '$libraryName' verificada, $count$ títulos adicionados.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Erro ao verificar a biblioteca '$libraryName'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Verificação do Jellyfin concluída. Adicionados $movies$ filmes e $series$ séries.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Credenciais do Jellyfin não configuradas." },
"notFoundOnJellyfin": { "message": "\"$query$\" não encontrado no Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" não encontrado em nenhum servidor.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "No Plex" },
"searchOnPlex": { "message": "Pesquisar no Plex" },
"jellyfinTitle": { "message": "Conteúdo do Jellyfin" },
"noJellyfinContent": { "message": "Não foi encontrado conteúdo do Jellyfin." },
"noJellyfinContentSub": { "message": "Certifique-se de que analisou o seu servidor Jellyfin nas definições." },
"activityViewerTitle": { "message": "Visualizador de Atividade do Servidor" },
"activitySelectServer": { "message": "Selecionar um servidor" },
"noJellyfinContent": { "message": "Nenhum conteúdo do Jellyfin encontrado." },
"noJellyfinContentSub": { "message": "Verifique se você verificou seu servidor Jellyfin nas configurações." },
"activityViewerTitle": { "message": "Visualizador de atividades do servidor" },
"activitySelectServer": { "message": "Selecione um servidor" },
"activityCheckBtn": { "message": "Atualizar" },
"activityNoSessions": { "message": "Não há sessões ativas neste servidor." },
"activitySessionUser": { "message": "Utilizador" },
"activityNoSessions": { "message": "Nenhuma sessão ativa neste servidor." },
"activitySessionUser": { "message": "Usuário" },
"activitySessionDevice": { "message": "Dispositivo" },
"activitySessionContent": { "message": "Conteúdo" },
"activitySessionState": { "message": "Estado" },
"activitySessionIdentifier": { "message": "Identificador do Cliente" },
"activitySessionIdentifier": { "message": "Identificador do cliente" },
"activityCopyID": { "message": "Copiar ID" },
"activityError": { "message": "Não foi possível obter a atividade do servidor." },
"activityCopied": { "message": "Identificador copiado para a área de transferência!" },
"activityCopyError": { "message": "Erro ao copiar o identificador." },
"noProvidersFound": { "message": "Não foram encontrados fornecedores." },
"noProvidersFound": { "message": "Nenhum provedor encontrado." },
"availableOnPlex": { "message": "Disponível no Plex" },
"m3uGeneratorTitle": { "message": "Gerador de Listas M3U" },
"selectAServer": { "message": "Selecionar um servidor..." },
"downloadM3u": { "message": "Descarregar M3U" },
"m3uGenerator": { "message": "Gerador M3U" },
"selectLibraries": { "message": "Selecionar Bibliotecas" },
"howToUse": { "message": "Como Usar" },
"m3uInstruction1": { "message": "Escolha um servidor da lista." },
"m3uGeneratorTitle": { "message": "Gerador de listas M3U" },
"selectAServer": { "message": "Selecione um servidor..." },
"downloadM3u": { "message": "Baixar M3U" },
"m3uGenerator": { "message": "Gerador de M3U" },
"selectLibraries": { "message": "Selecionar bibliotecas" },
"howToUse": { "message": "Como usar" },
"m3uInstruction1": { "message": "Escolha um servidor na lista." },
"m3uInstruction2": { "message": "Selecione uma ou mais bibliotecas para incluir." },
"m3uInstruction3": { "message": "Clique no botão de descarregar." },
"m3uInstruction4": { "message": "Importe o ficheiro .m3u para o seu reprodutor compatível." },
"chatOpen": { "message": "Abrir Chat" },
"chatTitle": { "message": "Assistente IA" },
"m3uInstruction3": { "message": "Clique no botão de download." },
"m3uInstruction4": { "message": "Importe o arquivo .m3u para o seu reprodutor compatível." },
"chatOpen": { "message": "Abrir chat" },
"chatTitle": { "message": "Assistente de IA" },
"chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Escreva a sua mensagem..." },
"chatPlaceholder": { "message": "Digite sua mensagem..." },
"chatSend": { "message": "➤" },
"chatWelcome": { "message": "Bem-vindo! Sou o seu assistente CinePlex. Pergunte-me sobre filmes, séries ou qualquer outra coisa que queira saber." },
"chatGoogleApiKeyMissing": { "message": "A chave da API Google Gemini não está configurada. Por favor, configure-a nas definições da extensão para usar o assistente de IA." },
"chatApiInvalidResponse": { "message": "A API devolveu uma resposta inválida. Por favor, tente novamente." },
"chatApiError": { "message": "Erro ao comunicar com o assistente de IA" },
"downloadAll": { "message": "Descarregar tudo" },
"download": { "message": "Descarregar" },
"aiToolSearchLibraryDesc": { "message": "Pesquisa na biblioteca Plex do utilizador filmes ou séries por título." },
"aiToolSearchLibraryQueryParamDesc": { "message": "O título do filme ou série a pesquisar." },
"aiToolSearchLibraryTypeParamDesc": { "message": "O tipo de conteúdo a pesquisar. Pode ser 'movie' para filmes ou 'series' para séries. (Opcional)." },
"aiToolNavigateToPageDesc": { "message": "Navega o utilizador para uma página específica da interface da aplicação." },
"aiToolNavigateToPagePageParamDesc": { "message": "O nome da página para a qual navegar, por exemplo: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', ou 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Obtém e mostra as estatísticas da biblioteca do utilizador, como o número total de filmes, séries e artistas únicos." },
"aiToolShowItemDetailsDesc": { "message": "Mostra a página de detalhes de um filme ou série específica pelo seu título e tipo." },
"chatWelcome": { "message": "Bem-vindo! Eu sou seu assistente CinePlex. Pergunte-me sobre filmes, séries ou qualquer outra coisa que você queira saber." },
"chatGoogleApiKeyMissing": { "message": "A chave de API do Google Gemini não está configurada. Defina-a nas configurações da extensão para usar o assistente de IA." },
"chatApiInvalidResponse": { "message": "A API retornou uma resposta inválida. Tente novamente." },
"chatApiError": { "message": "Erro ao se comunicar com o assistente de IA" },
"downloadAll": { "message": "Baixar tudo" },
"download": { "message": "Baixar" },
"aiToolSearchLibraryDesc": { "message": "Pesquisa na biblioteca Plex do usuário por filmes ou séries por título." },
"aiToolSearchLibraryQueryParamDesc": { "message": "O título do filme ou série a ser pesquisado." },
"aiToolSearchLibraryTypeParamDesc": { "message": "O tipo de conteúdo a ser pesquisado. Pode ser 'movie' para filmes ou 'series' para séries. (Opcional)." },
"aiToolSearchLibraryResolutionParamDesc": { "message": "A resolução de vídeo a ser pesquisada (por exemplo, '4k', '1080p'). (Opcional)." },
"aiToolSearchLibraryContainerParamDesc": { "message": "O formato do contêiner de vídeo a ser pesquisado (por exemplo, 'mkv', 'mp4'). (Opcional)." },
"aiToolNavigateToPageDesc": { "message": "Navega o usuário para uma página específica da interface do aplicativo." },
"aiToolNavigateToPagePageParamDesc": { "message": "O nome da página para a qual navegar, por exemplo: 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers' ou 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Obtém e exibe as estatísticas da biblioteca do usuário, como o número total de filmes, séries e artistas únicos." },
"aiToolShowItemDetailsDesc": { "message": "Exibe a página de detalhes de um filme ou série específica por seu título e tipo." },
"aiToolShowItemDetailsTitleParamDesc": { "message": "O título exato do filme ou série." },
"aiToolShowItemDetailsTypeParamDesc": { "message": "O tipo de conteúdo. Deve ser 'movie' ou 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Adiciona um filme ou série à lista de reprodução atual do utilizador para transmitir para um servidor PHP configurado." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "O título do filme ou série a adicionar." },
"aiToolAddToPlaylistDesc": { "message": "Adiciona um filme ou série à lista de reprodução atual do usuário para transmiti-lo para um servidor PHP configurado." },
"aiToolAddToPlaylistTitleParamDesc": { "message": "O título do filme ou série a ser adicionado." },
"aiToolAddToPlaylistTypeParamDesc": { "message": "O tipo de conteúdo. Deve ser 'movie' ou 'series'." },
"aiToolCheckAndDownloadDesc": { "message": "Verifica a disponibilidade de uma lista de títulos de filmes ou séries nos servidores locais do utilizador e, se encontrados, gera e descarrega um ficheiro de lista de reprodução M3U com os streams encontrados." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Uma matriz de títulos de filmes ou séries para pesquisar e descarregar." },
"aiToolCheckAndDownloadDesc": { "message": "Verifica a disponibilidade de uma lista de títulos de filmes ou séries nos servidores locais do usuário e, se encontrados, gera e baixa um arquivo de lista de reprodução M3U com os streams encontrados." },
"aiToolCheckAndDownloadTitlesParamDesc": { "message": "Uma matriz de títulos de filmes ou séries para pesquisar e baixar." },
"aiToolCheckAndDownloadTypeParamDesc": { "message": "O tipo de conteúdo da lista. Deve ser 'movie' ou 'series'." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "O nome do ficheiro M3U a descarregar (por exemplo, 'MinhaLista.m3u'). Se não for fornecido, será usado um nome por defeito." },
"aiToolToggleFavoriteDesc": { "message": "Adiciona ou remove um filme ou série da lista de favoritos do utilizador." },
"aiToolCheckAndDownloadFilenameParamDesc": { "message": "O nome do arquivo M3U a ser baixado (por exemplo, 'MinhaLista.m3u'). Se não for fornecido, um nome padrão será usado." },
"aiToolToggleFavoriteDesc": { "message": "Adiciona ou remove um filme ou série da lista de favoritos do usuário." },
"aiToolToggleFavoriteTitleParamDesc": { "message": "O título do filme ou série." },
"aiToolToggleFavoriteTypeParamDesc": { "message": "O tipo de conteúdo. Deve ser 'movie' ou 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Gera e mostra uma lista de recomendações de filmes ou séries baseadas no histórico de visualização e nos favoritos do utilizador." },
"aiToolApplyFiltersDesc": { "message": "Aplica filtros à vista atual de filmes ou séries, permitindo refinar os resultados por tipo, género, ano e ordem de classificação." },
"aiToolGetRecommendationsDesc": { "message": "Gera e exibe uma lista de recomendações de filmes ou séries com base no histórico de visualização e nos favoritos do usuário." },
"aiToolApplyFiltersDesc": { "message": "Aplica filtros à visualização atual de filmes ou séries, permitindo refinar os resultados por tipo, gênero, ano e ordem de classificação." },
"aiToolApplyFiltersTypeParamDesc": { "message": "O tipo de conteúdo ao qual aplicar os filtros. Deve ser 'movie' ou 'series'." },
"aiToolApplyFiltersGenreParamDesc": { "message": "O nome do género pelo qual filtrar (por exemplo, 'Ação', 'Drama')." },
"aiToolApplyFiltersGenreParamDesc": { "message": "O nome do gênero pelo qual filtrar (por exemplo, 'Ação', 'Drama')." },
"aiToolApplyFiltersYearParamDesc": { "message": "O ano de lançamento pelo qual filtrar (por exemplo, '2023')." },
"aiToolApplyFiltersSortParamDesc": { "message": "O critério de ordenação para os resultados. Valores válidos: 'popularity.desc' (populares), 'vote_average.desc' (melhor avaliados), 'release_date.desc' (recentes para filmes) ou 'first_air_date.desc' (recentes para séries)." },
"aiToolPlayMusicByArtistDesc": { "message": "Abre o reprodutor de música e começa a reproduzir canções de um artista específico da biblioteca do utilizador." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "O nome exato do artista cujas canções se deseja reproduzir." },
"aiToolApplyFiltersSortParamDesc": { "message": "O critério de classificação para os resultados. Valores válidos: 'popularity.desc' (populares), 'vote_average.desc' (mais bem avaliados), 'release_date.desc' (recentes para filmes) ou 'first_air_date.desc' (recentes para séries)." },
"aiToolPlayMusicByArtistDesc": { "message": "Abre o reprodutor de música e começa a tocar músicas de um artista específico da biblioteca do usuário." },
"aiToolPlayMusicByArtistNameParamDesc": { "message": "O nome exato do artista cujas músicas devem ser tocadas." },
"aiToolClearChatHistoryDesc": { "message": "Limpa todo o histórico de mensagens da conversa atual com o assistente de IA." },
"aiToolDeleteDatabaseDesc": { "message": "Elimina toda a base de dados local da extensão, incluindo o conteúdo analisado, as definições e os favoritos. Esta ação é irreversível e recarregará a aplicação." },
"aiToolUpdateAllTokensDesc": { "message": "Inicia uma análise completa de todos os servidores e bibliotecas Plex associados aos tokens configurados na extensão. Atualiza todos os filmes, séries, artistas e fotos." },
"aiToolAddPlexTokenDesc": { "message": "Adiciona um novo token X-Plex à configuração da extensão, permitindo que a aplicação analise conteúdo de novos servidores Plex." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "A string do token X-Plex que se deseja adicionar." },
"aiToolChangeRegionDesc": { "message": "Altera a região utilizada para a descoberta de conteúdo na API do TMDB. Isto afetará os resultados mostrados nas secções de filmes e séries, bem como os fornecedores de streaming." },
"aiToolChangeRegionRegionParamDesc": { "message": "O código de país ISO 3166-1 de duas letras para a nova região (por exemplo, 'US' para Estados Unidos, 'PT' para Portugal, 'MX' para México)." },
"aiToolClearAllFavoritesDesc": { "message": "Elimina todos os filmes e séries que o utilizador marcou como favoritos." },
"aiToolClearViewingHistoryDesc": { "message": "Apaga o histórico de visualização do utilizador da página de histórico." },
"aiToolClearRecommendationsViewDesc": { "message": "Limpa a vista de recomendações e elimina as recomendações em cache." },
"aiToolSearchNotFound": { "message": "Não foi encontrado '$query$' na sua biblioteca.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navegado para a página de $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Erro ao navegar para a página de $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolDeleteDatabaseDesc": { "message": "Exclui todo o banco de dados local da extensão, incluindo conteúdo verificado, configurações e favoritos. Esta ação é irreversível e recarregará o aplicativo." },
"aiToolUpdateAllTokensDesc": { "message": "Inicia uma verificação completa de todos os servidores e bibliotecas Plex associados aos tokens configurados na extensão. Atualiza todos os filmes, séries, artistas e fotos." },
"aiToolAddPlexTokenDesc": { "message": "Adiciona um novo token X-Plex à configuração da extensão, permitindo que o aplicativo verifique o conteúdo de novos servidores Plex." },
"aiToolAddPlexTokenTokenParamDesc": { "message": "A string do token X-Plex a ser adicionada." },
"aiToolChangeRegionDesc": { "message": "Altera a região usada para a descoberta de conteúdo na API do TMDB. Isso afetará os resultados exibidos nas seções de filmes e séries, bem como os provedores de streaming." },
"aiToolChangeRegionRegionParamDesc": { "message": "O código de país de duas letras ISO 3166-1 para a nova região (por exemplo, 'US' para os Estados Unidos, 'ES' para a Espanha, 'MX' para o México)." },
"aiToolClearAllFavoritesDesc": { "message": "Remove todos os filmes e séries que o usuário marcou como favoritos." },
"aiToolClearViewingHistoryDesc": { "message": "Limpa o histórico de visualização do usuário da página de histórico." },
"aiToolClearRecommendationsViewDesc": { "message": "Limpa a visualização de recomendações e remove as recomendações em cache." },
"aiToolSearchNotFound": { "message": "'$query' não encontrado em sua biblioteca.", "placeholders": { "query": { "content": "$1" } } },
"aiToolNavigateSuccess": { "message": "Navegado para a página $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolNavigateError": { "message": "Erro ao navegar para a página $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolStatsError": { "message": "Erro ao obter estatísticas." },
"aiToolItemNotFound": { "message": "Não foi encontrado o item '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "A mostrar detalhes de '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Adicionado '$title$' à lista de reprodução.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Adicionado '$title$' aos favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Removido '$title$' dos favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "A mostrar recomendações." },
"aiToolApplyFiltersGenreNotFound": { "message": "Género '$genre$' não encontrado.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolItemNotFound": { "message": "Item '$title' não encontrado.", "placeholders": { "title": { "content": "$1" } } },
"aiToolShowItemDetailsSuccess": { "message": "Mostrando detalhes de '$title'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddToPlaylistSuccess": { "message": "Adicionado '$title' à lista de reprodução.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteAdded": { "message": "Adicionado '$title' aos favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolFavoriteRemoved": { "message": "Removido '$title' dos favoritos.", "placeholders": { "title": { "content": "$1" } } },
"aiToolRecommendationsSuccess": { "message": "Mostrando recomendações." },
"aiToolApplyFiltersGenreNotFound": { "message": "Gênero '$genre' não encontrado.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolApplyFiltersSuccess": { "message": "Filtros aplicados com sucesso." },
"aiToolPlayMusicNotReady": { "message": "O reprodutor de música não está pronto. Certifique-se de que a sua biblioteca de música Plex foi analisada." },
"aiToolPlayMusicArtistNotFound": { "message": "Artista '$artist_name$' não encontrado.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Não foram encontradas canções para '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "A reproduzir música de '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNotReady": { "message": "O reprodutor de música não está pronto. Verifique se a sua biblioteca de música do Plex foi verificada." },
"aiToolPlayMusicArtistNotFound": { "message": "Artista '$artist_name' não encontrado.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicNoSongs": { "message": "Nenhuma música encontrada para '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolPlayMusicSuccess": { "message": "Tocando música de '$artist_name'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolChatHistoryCleared": { "message": "Histórico do chat limpo." },
"aiToolConfirmDeleteDatabase": { "message": "Tem a certeza de que pretende eliminar a base de dados local? Esta ação é irreversível." },
"aiToolDeleteDatabaseCancelled": { "message": "Eliminação da base de dados cancelada." },
"aiToolConfirmDeleteDatabase": { "message": "Tem certeza de que deseja excluir o banco de dados local? Esta ação é irreversível." },
"aiToolDeleteDatabaseCancelled": { "message": "Exclusão do banco de dados cancelada." },
"aiToolExecutionError": { "message": "Erro ao executar a ferramenta '$toolName$': $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolUnknown": { "message": "Ferramenta desconhecida: '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favoritos eliminados." },
"aiToolFavoritesClearError": { "message": "Erro ao eliminar os favoritos: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recomendações eliminadas." },
"aiToolRecommendationsClearError": { "message": "Erro ao eliminar as recomendações: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Base de dados eliminada. A página será recarregada." },
"aiToolDatabaseDeleteError": { "message": "Erro ao eliminar a base de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "A eliminação da base de dados está bloqueada. Feche outros separadores da aplicação." },
"aiToolUnknown": { "message": "Ferramenta desconhecida: '$toolName'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolFavoritesCleared": { "message": "Favoritos limpos." },
"aiToolFavoritesClearError": { "message": "Erro ao limpar os favoritos: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recomendações limpas." },
"aiToolRecommendationsClearError": { "message": "Erro ao limpar as recomendações: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Banco de dados excluído. A página será recarregada." },
"aiToolDatabaseDeleteError": { "message": "Erro ao excluir o banco de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "A exclusão do banco de dados está bloqueada. Feche outras abas do aplicativo." },
"aiToolUpdateAllTokensSuccess": { "message": "Todos os tokens foram atualizados com sucesso." },
"aiToolUpdateAllTokensError": { "message": "Erro ao atualizar os tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Token Plex adicionado com sucesso." },
"aiToolAddPlexTokenError": { "message": "Erro ao adicionar o token Plex: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Região alterada para $region$. O conteúdo está a ser atualizado.", "placeholders": { "region": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Token do Plex adicionado com sucesso." },
"aiToolAddPlexTokenError": { "message": "Erro ao adicionar o token do Plex: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Região alterada para $region$. O conteúdo está sendo atualizado.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Erro ao alterar a região: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Histórico de visualização apagado." },
"aiToolViewingHistoryClearError": { "message": "Erro ao apagar o histórico de visualização: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Você é um assistente especialista em filmes e séries chamado CinePlex. A sua função principal é ajudar os utilizadores a descobrir conteúdo e a interagir com a sua biblioteca. Siga estas regras rigorosamente: 1. **NUNCA** invente que realizou uma ação se não usou uma ferramenta para tal. Por exemplo, não diga 'descarreguei X' se não usou a ferramenta de descarregar. 2. Para pedidos de recomendações ou listas (ex. 'diga-me 5 filmes de terror'), use o seu próprio conhecimento para gerar a lista. Apresente-a em formato numerado ou com marcadores. Depois de mostrar a lista, pergunte proativamente ao utilizador se ele quer que verifique a disponibilidade nos seus servidores locais e crie um ficheiro M3U. 3. **APENAS** se o utilizador confirmar que quer verificar ou descarregar a lista, utilize a ferramenta `check_and_download_titles_list`. Não a utilize sem confirmação explícita. 4. Para qualquer outra ação como navegar, obter estatísticas ou procurar um título específico, utilize as ferramentas apropriadas. Seja sempre conciso, amigável e eficiente." },
"aiToolM3UNoTitlesProvided": { "message": "Por favor, forneça uma lista de títulos para criar a lista de reprodução." },
"aiToolM3UCheckingTitles": { "message": "A verificar os títulos nos seus servidores locais..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Não encontrei nenhum dos filmes ou séries da lista nos seus servidores locais." },
"aiToolM3UDownloadStarted": { "message": "Feito! Encontrei $1 de $2 títulos nos seus servidores e iniciei o descarregamento da lista de reprodução M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Voltar aos Fornecedores" },
"artistsCounterSingle": { "message": "$total$ Artista", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "A carregar..." },
"downloadingSong": { "message": "A iniciar descarregamento de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" descarregado.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Erro ao descarregar \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "A gerar M3U para \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"aiToolViewingHistoryCleared": { "message": "Histórico de visualização limpo." },
"aiToolViewingHistoryClearError": { "message": "Erro ao limpar o histórico de visualização: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Você é um assistente especialista em filmes e séries chamado CinePlex. Sua função principal é ajudar os usuários a descobrir conteúdo e interagir com sua biblioteca. Siga estas regras rigorosamente: 1. **NUNCA** finja que realizou uma ação se não usou uma ferramenta para isso. Por exemplo, não diga 'Eu baixei X' se não usou a ferramenta de download. 2. Para solicitações de recomendações ou listas (por exemplo, 'diga-me 5 filmes de terror'), use seu próprio conhecimento para gerar a lista. Apresente-a em formato numerado ou com marcadores. Depois de exibir a lista, pergunte proativamente ao usuário se ele deseja que você verifique a disponibilidade em seus servidores locais e crie um arquivo M3U. 3. **SOMENTE** se o usuário confirmar que deseja verificar ou baixar a lista, use a ferramenta `check_and_download_titles_list`. Não a use sem confirmação explícita. 4. Para qualquer outra ação, como navegar, obter estatísticas, pesquisar um título específico ou filtrar por resolução ou contêiner, use as ferramentas apropriadas. Seja sempre conciso, amigável e eficiente." },
"aiToolM3UNoTitlesProvided": { "message": "Forneça uma lista de títulos para criar a lista de reprodução." },
"aiToolM3UCheckingTitles": { "message": "Verificando os títulos em seus servidores locais..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Não encontrei nenhum dos filmes ou séries da lista em seus servidores locais." },
"aiToolM3UDownloadStarted": { "message": "Pronto! Encontrei $1 de $2 títulos em seus servidores e iniciei o download da lista de reprodução M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Voltar para os provedores" },
"artistsCounterSingle": { "message": "$total$ artista", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Carregando..." },
"downloadingSong": { "message": "Iniciando o download de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" baixado.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Erro ao baixar \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Gerando M3U para \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U para o álbum \"$artist$\" gerado.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "A tentar novamente a secção \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCESSO] Retentativa de \"$title$\" concluída.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERRO FINAL] A retentativa para \"$title$\" falhou: $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "A iniciar fase de retentativas para $count$ secções...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Token $token$... encontrou $count$ servidores.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Erro ao processar token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"retyingSection": { "message": "Tentando novamente a seção \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCESSO] Nova tentativa de \"$title$\" concluída.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERRO FINAL] A nova tentativa para \"$title$\" falhou: $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Iniciando a fase de nova tentativa para $count$ seções...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "O token $token$... encontrou $count$ servidores.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Erro ao processar o token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "ERRO FATAL: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Erro durante a análise: $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "A parar análise do Plex..." },
"errorDuringScan": { "message": "Erro durante a verificação: $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Parando a verificação do Plex..." },
"invalidTokenProvided": { "message": "Token inválido fornecido." },
"tokenAlreadyExists": { "message": "O token já existe." },
"tokenAddedSuccessfully": { "message": "Token adicionado com sucesso." },
"noStreamsFoundForSelection": { "message": "Não foram encontrados streams para a seleção." },
"noStreamsFoundForSelection": { "message": "Nenhum stream encontrado para a seleção." },
"autoplayBlocked": { "message": "Reprodução automática bloqueada." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Página" }
"page": { "message": "Página" },
"all": { "message": "Todos" },
"userScore": { "message": "Pontuação dos usuários" },
"duration": { "message": "Duração" },
"min": { "message": "Mín" },
"max": { "message": "Máx" }
}

103
css/custom-filters.css Normal file
View File

@ -0,0 +1,103 @@
.filter-popover-wrapper {
position: relative;
display: inline-block;
}
.filter-popover {
display: none;
position: absolute;
background-color: var(--secondary);
min-width: 280px;
box-shadow: var(--shadow);
padding: 1rem;
z-index: 100;
border-radius: var(--border-radius-md);
border: 1px solid var(--glass-border);
margin-top: 0.5rem; /* Add some space between button and popover */
}
.range-slider-container {
position: relative;
height: 20px;
display: flex;
align-items: center;
}
.slider-track, .slider-fill {
position: absolute;
width: 100%;
height: 6px;
border-radius: 3px;
left: 0;
}
.slider-track {
background-color: var(--glass);
z-index: 1;
}
.slider-fill {
background-color: var(--accent);
z-index: 2;
}
.filter-popover .range-values {
display: flex;
justify-content: space-between;
margin-top: 0.75rem;
font-size: 0.9rem;
color: var(--text-secondary);
}
.form-range {
-webkit-appearance: none;
appearance: none;
width: 100%;
background: transparent;
position: absolute;
left: 0;
margin: 0;
pointer-events: none;
}
input[id$="-max"].form-range {
z-index: 3;
}
input[id$="-min"].form-range {
z-index: 4;
}
.form-range::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
background: var(--accent-dark);
background-clip: padding-box;
cursor: pointer;
border-radius: 50%;
border: 3px solid var(--secondary);
pointer-events: auto;
transition: background-color 0.2s;
}
.form-range::-webkit-slider-thumb:hover {
background-color: var(--accent);
}
.form-range::-moz-range-thumb {
width: 20px;
height: 20px;
background: var(--accent-dark);
background-clip: padding-box;
cursor: pointer;
border-radius: 50%;
border: 3px solid var(--secondary);
pointer-events: auto;
transition: background-color 0.2s;
}
.form-range::-moz-range-thumb:hover {
background-color: var(--accent);
}

View File

@ -3,7 +3,51 @@
Generated and Refactored by Gemini
*/
/* --- base.css --- */
.filter-group {
display: flex;
align-items: center;
gap: 0.5rem;
}
.filter-group label {
font-size: 0.9rem;
color: var(--text-secondary);
white-space: nowrap;
}
.filter-input {
width: 80px;
padding: 0.7rem 1rem;
font-size: 0.9rem;
color: var(--text-primary);
background-color: var(--secondary);
border: 1px solid var(--glass-border);
border-radius: 50px;
transition: var(--transition);
}
.filter-input::placeholder {
color: var(--text-secondary);
opacity: 0.7;
}
.filter-input:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(0, 224, 255, 0.2);
}
/* Remove arrows from number input */
.filter-input::-webkit-outer-spin-button,
.filter-input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.filter-input[type=number] {
-moz-appearance: textfield;
}
:root {
--primary: #0a0a0f;
--secondary: #101116;
@ -1997,24 +2041,47 @@ body.sidebar-collapsed #main-container {
background: var(--danger);
}
.watch-providers-section {
margin-top: 2rem;
}
.watch-providers-grid {
display: flex;
flex-wrap: wrap;
gap: 1rem;
align-items: center;
}
.provider-link {
display: block;
transition: var(--transition);
border-radius: var(--border-radius-md);
overflow: hidden;
}
.provider-link:hover {
transform: scale(1.1);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
.provider-logo {
display: block;
width: 50px;
height: 50px;
border-radius: var(--border-radius-md);
background-color: var(--glass);
border: 1px solid var(--glass-border);
}
@media (max-width: 576px) {
.history-item {
flex-direction: column;
align-items: flex-start;
gap: 1rem;
}
.history-main-content {
display: flex;
gap: 1rem;
width: 100%;
}
.history-actions {
width: 100%;
justify-content: space-around;
padding-top: 1rem;
border-top: 1px solid var(--glass-border);
}
}

View File

@ -21,9 +21,11 @@ export class AITools {
type: 'object',
properties: {
query: { type: 'string', description: _('aiToolSearchLibraryQueryParamDesc') },
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolSearchLibraryTypeParamDesc') }
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolSearchLibraryTypeParamDesc') },
resolution: { type: 'string', description: _('aiToolSearchLibraryResolutionParamDesc') },
container: { type: 'string', description: _('aiToolSearchLibraryContainerParamDesc') }
},
required: ['query']
required: []
}
},
{
@ -188,22 +190,35 @@ export class AITools {
];
}
async "search_library"({ query, type }) {
async "search_library"({ query, type, resolution, container }) {
const movieEntries = await getFromDB('movies');
const seriesEntries = await getFromDB('series');
const allContent = [
...movieEntries.flatMap(e => (e.titulos || []).map(t => ({ ...t, type: 'movie' }))),
...seriesEntries.flatMap(e => (e.titulos || []).map(t => ({ ...t, type: 'series' })))
];
const searchTerm = query.toLowerCase().trim();
let results = allContent.filter(item => item.title.toLowerCase().includes(searchTerm));
let results = allContent;
if (query) {
const searchTerm = query.toLowerCase().trim();
results = allContent.filter(item => item.title.toLowerCase().includes(searchTerm));
}
if (type) {
results = results.filter(item => item.type === type);
}
if (resolution) {
results = results.filter(item => item.resolution && item.resolution.toLowerCase() === resolution.toLowerCase());
}
if (container) {
results = results.filter(item => item.container && item.container.toLowerCase() === container.toLowerCase());
}
if (results.length === 0) {
return JSON.stringify({ success: false, message: _('aiToolSearchNotFound', query) });
}
const formattedResults = results.slice(0, 10).map(item => ({ title: item.title, year: item.year, type: item.type }));
const formattedResults = results.slice(0, 10).map(item => ({ title: item.title, year: item.year, type: item.type, resolution: item.resolution, container: item.container }));
return JSON.stringify({ success: true, count: results.length, results: formattedResults });
}

View File

@ -6,25 +6,21 @@ import { _ } from './utils.js';
export async function fetchTMDB(endpoint, params = {}, signal) {
const region = state.settings.watchRegion || 'US';
const regionToLangMap = {
'ES': 'es-ES', 'MX': 'es-MX',
'FR': 'fr-FR', 'CA': 'fr-CA',
'DE': 'de-DE',
'IT': 'it-IT',
'PT': 'pt-PT', 'BR': 'pt-BR',
'US': 'en-US', 'GB': 'en-GB'
};
const tmdbLang = regionToLangMap[region] || 'en-US';
const lang = state.settings.language || 'en';
const [path, existingQuery] = endpoint.split('?');
const finalParams = new URLSearchParams(existingQuery);
finalParams.set('api_key', state.settings.apiKey);
finalParams.set('language', tmdbLang);
finalParams.set('language', lang);
finalParams.set('watch_region', region);
// Añadir filtros de puntuación y duración
if (params.minScore) finalParams.set('vote_average.gte', params.minScore);
if (params.maxScore) finalParams.set('vote_average.lte', params.maxScore);
if (params.minDuration) finalParams.set('with_runtime.gte', params.minDuration);
if (params.maxDuration) finalParams.set('with_runtime.lte', params.maxDuration);
for (const [key, value] of Object.entries(params)) {
if (value) {
finalParams.set(key, value);
@ -171,7 +167,7 @@ export async function getMusicUrlsFromJellyfin(serverUrl, userId, token, artistI
}
}
export async function fetchAllStreamsFromPlex(busqueda, tipoContenido) {
export async function fetchAllStreamsFromPlex(busqueda, tipoContenido, year = null) {
if (!busqueda || !tipoContenido) return { success: false, streams: [], message: _('invalidStreamInfo') };
if (!state.db) return { success: false, streams: [], message: _('dbUnavailableForStreams') };
@ -197,10 +193,23 @@ export async function fetchAllStreamsFromPlex(busqueda, tipoContenido) {
if (tipoContenido === 'movie') {
const videos = Array.from(xml.querySelectorAll("Video"));
let videosToProcess = videos;
const exactMatch = videos.find(v => v.getAttribute('title')?.toLowerCase() === busqueda.toLowerCase());
if (exactMatch) {
videosToProcess = [exactMatch];
let videosToProcess = [];
if (year) {
const exactMatch = videos.find(v =>
v.getAttribute('title')?.toLowerCase() === busqueda.toLowerCase() &&
v.getAttribute('year') == year
);
if (exactMatch) {
videosToProcess = [exactMatch];
}
} else {
const exactMatch = videos.find(v => v.getAttribute('title')?.toLowerCase() === busqueda.toLowerCase());
if (exactMatch) {
videosToProcess = [exactMatch];
} else {
videosToProcess = videos;
}
}
videosToProcess.forEach(video => {
@ -221,7 +230,19 @@ export async function fetchAllStreamsFromPlex(busqueda, tipoContenido) {
});
} else {
const directories = Array.from(xml.querySelectorAll('Directory[type="show"]'));
let directoryToProcess = directories.find(d => d.getAttribute('title')?.toLowerCase() === busqueda.toLowerCase());
let directoryToProcess;
if(year){
directoryToProcess = directories.find(d =>
d.getAttribute('title')?.toLowerCase() === busqueda.toLowerCase() &&
d.getAttribute('year') == year
);
}
if (!directoryToProcess) {
directoryToProcess = directories.find(d => d.getAttribute('title')?.toLowerCase() === busqueda.toLowerCase());
}
if (!directoryToProcess && directories.length > 0) {
directoryToProcess = directories[0];
}
@ -374,9 +395,9 @@ export async function fetchAllStreamsFromJellyfin(busqueda, tipoContenido) {
}
}
export async function fetchAllAvailableStreams(title, type) {
const plexPromise = fetchAllStreamsFromPlex(title, type);
const jellyfinPromise = fetchAllStreamsFromJellyfin(title, type);
export async function fetchAllAvailableStreams(title, type, year = null) {
const plexPromise = fetchAllStreamsFromPlex(title, type, year);
const jellyfinPromise = fetchAllStreamsFromJellyfin(title, type); // Jellyfin no usa 'year' en su signature, lo he quitado para que no cause error si se le pasa.
const results = await Promise.allSettled([plexPromise, jellyfinPromise]);

View File

@ -40,6 +40,7 @@ export class Chat {
this.dom.header.addEventListener('mousedown', this.startDrag.bind(this));
document.addEventListener('mousemove', this.drag.bind(this));
document.addEventListener('mouseup', this.stopDrag.bind(this));
document.addEventListener('mouseleave', this.stopDrag.bind(this));
}
toggle() {

View File

@ -1,5 +1,5 @@
import { state } from './state.js';
import { switchView, resetView, showMainView, showItemDetails, applyFilters, searchByActor, loadContent, toggleFavorite, addStreamToList, downloadM3U, showTrailer, closeTrailer, openSettingsModal, saveSettings, updateSectionTitle, generateStatistics, loadFavorites, loadLocalContent, phpScriptGenerator, initPhotosView, handlePhotoGridClick, handlePhotoTokenChange, showNextPhoto, showPrevPhoto, closePhotoLightbox, activateSettingsTab, deleteHistoryItem, clearAllHistory, getTrailerKey, initializeHeroSection } from './ui.js';
import { switchView, resetView, showMainView, showItemDetails, showActorDetails, applyFilters, searchByActor, loadContent, toggleFavorite, addStreamToList, downloadM3U, showTrailer, closeTrailer, openSettingsModal, saveSettings, updateSectionTitle, generateStatistics, loadFavorites, loadLocalContent, phpScriptGenerator, initPhotosView, handlePhotoGridClick, handlePhotoTokenChange, showNextPhoto, showPrevPhoto, closePhotoLightbox, activateSettingsTab, deleteHistoryItem, clearAllHistory, getTrailerKey, initializeHeroSection } from './ui.js';
import { loadProviderContent, changeProviderPage, backToProviders } from './providers.js';
import { debounce, showNotification, _ } from './utils.js';
import { clearContentData, loadTokensToEditor, saveTokensFromEditor, exportDatabase, importDatabase } from './db.js';
@ -74,20 +74,99 @@ export function setupEventListeners() {
document.getElementById('search-input').addEventListener('keyup', debounce(async (e) => {
const query = e.target.value.trim();
if (query === state.currentParams.query && state.currentView === 'search') return;
state.currentView = 'search';
if (!query) {
resetView();
return;
}
if (state.currentView !== 'search') {
switchView('search');
}
state.currentParams.query = query;
state.currentPage = 1;
if (!query) {
switchView(state.currentParams.contentType === 'movie' ? 'movies' : 'series');
} else {
updateSectionTitle();
await loadContent();
}
updateSectionTitle();
await loadContent();
}, 400));
document.getElementById('genre-filter').addEventListener('change', applyFilters);
document.getElementById('year-filter').addEventListener('change', applyFilters);
document.getElementById('sort-filter').addEventListener('change', applyFilters);
// Filter Popover Logic
const durationBtn = document.getElementById('duration-filter-btn');
const scoreBtn = document.getElementById('score-filter-btn');
const durationPopover = document.getElementById('duration-popover');
const scorePopover = document.getElementById('score-popover');
const setupPopover = (button, popover) => {
if (!button || !popover) return;
button.addEventListener('click', (event) => {
event.stopPropagation();
const isVisible = popover.style.display === 'block';
// Close all popovers
document.querySelectorAll('.filter-popover').forEach(p => {
if (p !== popover) p.style.display = 'none';
});
// Toggle current popover
popover.style.display = isVisible ? 'none' : 'block';
});
};
setupPopover(durationBtn, durationPopover);
setupPopover(scoreBtn, scorePopover);
// Close popovers when clicking outside
window.addEventListener('click', (event) => {
if (!event.target.closest('.filter-popover') && !event.target.closest('#duration-filter-btn') && !event.target.closest('#score-filter-btn')) {
document.querySelectorAll('.filter-popover').forEach(p => p.style.display = 'none');
}
});
// Range Slider Logic
function setupRangeSlider(minId, maxId, fillId, minValueId, maxValueId) {
const minSlider = document.getElementById(minId);
const maxSlider = document.getElementById(maxId);
const fill = document.getElementById(fillId);
const minValueDisplay = document.getElementById(minValueId);
const maxValueDisplay = document.getElementById(maxValueId);
if (!minSlider || !maxSlider || !fill || !minValueDisplay || !maxValueDisplay) return;
const updateFill = () => {
const min = parseFloat(minSlider.value);
const max = parseFloat(maxSlider.value);
const range = parseFloat(minSlider.max) - parseFloat(minSlider.min);
const left = ((min - parseFloat(minSlider.min)) / range) * 100;
const width = ((max - min) / range) * 100;
fill.style.left = `${left}%`;
fill.style.width = `${width}%`;
minValueDisplay.textContent = minSlider.value;
maxValueDisplay.textContent = maxSlider.value;
};
minSlider.addEventListener('input', () => {
if (parseFloat(minSlider.value) > parseFloat(maxSlider.value)) {
minSlider.value = maxSlider.value;
}
updateFill();
});
maxSlider.addEventListener('input', () => {
if (parseFloat(maxSlider.value) < parseFloat(minSlider.value)) {
maxSlider.value = minSlider.value;
}
updateFill();
});
minSlider.addEventListener('change', applyFilters);
maxSlider.addEventListener('change', applyFilters);
updateFill(); // Initial call
}
setupRangeSlider('duration-min', 'duration-max', 'duration-fill', 'duration-min-value', 'duration-max-value');
setupRangeSlider('score-min', 'score-max', 'score-fill', 'score-min-value', 'score-max-value');
document.getElementById('stats-token-filter').addEventListener('change', generateStatistics);
document.getElementById('photos-token-select').addEventListener('change', handlePhotoTokenChange);
document.getElementById('region-filter').addEventListener('change', saveSettings);
@ -292,17 +371,29 @@ function handleMainViewClick(e) {
if (actionBtn) {
e.stopPropagation();
const { id, type } = itemCard.dataset;
const { id, type, year, name } = itemCard.dataset;
const title = itemCard.querySelector('.item-title')?.textContent;
if (actionBtn.classList.contains('info-btn')) showItemDetails(Number(id), type);
if (actionBtn.classList.contains('info-btn')) {
if (type === 'person') {
searchByActor(id, name);
} else {
showItemDetails(Number(id), type);
}
}
else if (actionBtn.classList.contains('favorites-btn')) toggleFavorite(Number(id), type);
else if (actionBtn.classList.contains('play-btn')) addStreamToList(title, type, actionBtn);
else if (actionBtn.classList.contains('download-btn')) downloadM3U([{ title, type }], actionBtn);
else if (actionBtn.classList.contains('play-btn')) addStreamToList(title, type, year, actionBtn);
else if (actionBtn.classList.contains('download-btn')) downloadM3U([{ title, type, year }], actionBtn);
return;
}
const { id, type } = itemCard.dataset;
if (id && type) showItemDetails(Number(id), type);
if (id && type) {
if (type === 'person') {
showActorDetails(Number(id));
} else {
showItemDetails(Number(id), type);
}
}
}
async function handleHistoryClick(e, historyItem) {
@ -353,8 +444,7 @@ async function handleDetailsClick(e) {
const castCard = e.target.closest('.cast-card');
if (castCard) {
const { actorId } = castCard.dataset;
const actorName = castCard.querySelector('.cast-name').textContent;
if (actorId && actorName) await searchByActor(actorId, actorName);
if (actorId) showActorDetails(Number(actorId));
return;
}

View File

@ -64,11 +64,22 @@ export async function fetchItemsFromLibrary(url, userId, apiKey, library) {
const data = await response.json();
const items = data.Items.map(item => {
const mediaStream = item.MediaStreams?.find(s => s.Type === 'Video');
const container = item.Container;
let resolution = null;
if (mediaStream && mediaStream.Height) {
if (mediaStream.Height >= 2160) resolution = '4k';
else if (mediaStream.Height >= 1080) resolution = '1080p';
else if (mediaStream.Height >= 720) resolution = '720p';
}
const baseItem = {
id: item.Id,
title: item.Name,
type: item.Type,
thumb: item.ImageTags?.Primary ? `${url}/Items/${item.Id}/Images/Primary?tag=${item.ImageTags.Primary}` : ''
thumb: item.ImageTags?.Primary ? `${url}/Items/${item.Id}/Images/Primary?tag=${item.ImageTags.Primary}` : '',
container: container,
resolution: resolution
};
if (!isMusic) {
baseItem.year = item.ProductionYear;

View File

@ -17,7 +17,16 @@ async function loadSettings() {
}
if (!state.settings.watchRegion) {
state.settings.watchRegion = 'US';
const langToRegionMap = {
'es': 'ES',
'en': 'US',
'fr': 'FR',
'de': 'DE',
'it': 'IT',
'pt': 'PT'
};
const userLang = chrome.i18n.getUILanguage().split('-')[0];
state.settings.watchRegion = langToRegionMap[userLang] || 'US';
}
if (!state.settings.language) {
@ -35,7 +44,9 @@ async function loadSettings() {
} catch (error) {
console.error("Could not load settings from DB, using defaults.", error);
state.settings.watchRegion = 'US';
const userLang = chrome.i18n.getUILanguage();
const region = userLang.split('-')[1] || userLang.split('-')[0];
state.settings.watchRegion = region.toUpperCase();
}
}

View File

@ -86,13 +86,22 @@ async function parseAndStoreSectionItems(contentXml, storeName, serverData) {
if (type === 'movie' || type === 'show') {
const itemSelector = type === 'movie' ? 'Video' : 'Directory';
items = Array.from(contentXml.querySelectorAll(itemSelector)).map(el => ({
id: el.getAttribute('ratingKey'),
title: el.getAttribute('title'),
year: el.getAttribute('year'),
genre: el.querySelector('Genre')?.getAttribute('tag') || _('noGenre'),
type: type
}));
items = Array.from(contentXml.querySelectorAll(itemSelector)).map(el => {
const media = el.querySelector('Media');
const part = media?.querySelector('Part');
const container = part?.getAttribute('container');
const videoResolution = media?.getAttribute('videoResolution');
return {
id: el.getAttribute('ratingKey'),
title: el.getAttribute('title'),
year: el.getAttribute('year'),
genre: el.querySelector('Genre')?.getAttribute('tag') || _('noGenre'),
type: type,
container: container,
resolution: videoResolution
};
});
} else if (type === 'artist' || type === 'photo') {
items = Array.from(contentXml.querySelectorAll('Directory')).map(el => ({
id: el.getAttribute('ratingKey'),

View File

@ -101,24 +101,31 @@ export function renderProviders(providers) {
);
}
export async function getProviderItems(providerId, page = 1) {
export async function getProviderItems(providerId, page = 1, mediaType = 'all') {
try {
const watchRegion = state.settings.watchRegion || 'US';
const params = {
with_watch_providers: providerId,
watch_region: watchRegion,
page: page,
};
const moviesResponse = await fetchTMDB('discover/movie', params);
const seriesResponse = await fetchTMDB('discover/tv', params);
let items = [];
let total_pages = 0;
const movies = moviesResponse.results.map(item => ({ ...item, media_type: 'movie' }));
const series = seriesResponse.results.map(item => ({ ...item, media_type: 'tv' }));
if (mediaType === 'movie' || mediaType === 'all') {
const moviesResponse = await fetchTMDB('discover/movie', params);
items.push(...moviesResponse.results.map(item => ({ ...item, media_type: 'movie' })));
total_pages = Math.max(total_pages, moviesResponse.total_pages);
}
const items = [...movies, ...series].sort((a, b) => b.popularity - a.popularity);
const total_pages = Math.max(moviesResponse.total_pages, seriesResponse.total_pages);
if (mediaType === 'tv' || mediaType === 'all') {
const seriesResponse = await fetchTMDB('discover/tv', params);
items.push(...seriesResponse.results.map(item => ({ ...item, media_type: 'tv' })));
total_pages = Math.max(total_pages, seriesResponse.total_pages);
}
items.sort((a, b) => b.popularity - a.popularity);
return { success: true, items, total_pages };
} catch (error) {
@ -127,7 +134,9 @@ export async function getProviderItems(providerId, page = 1) {
}
}
export async function loadProviderContent(providerId, providerName, page = 1) {
let currentMediaType = 'all';
export async function loadProviderContent(providerId, providerName, page = 1, isFilterChange = false) {
currentProviderId = providerId;
currentPage = page;
@ -141,6 +150,22 @@ export async function loadProviderContent(providerId, providerName, page = 1) {
const sectionTitle = document.querySelector('#providers-section .section-title');
const backButton = document.getElementById('back-to-providers');
if (!isFilterChange) {
const filterButtons = document.querySelectorAll('#provider-content-type-filter button');
filterButtons.forEach(button => {
button.replaceWith(button.cloneNode(true));
});
document.querySelectorAll('#provider-content-type-filter button').forEach(button => {
button.addEventListener('click', () => {
document.querySelectorAll('#provider-content-type-filter button').forEach(btn => btn.classList.remove('active'));
button.classList.add('active');
currentMediaType = button.dataset.type;
loadProviderContent(currentProviderId, providerName, 1, true);
});
});
}
providersGrid.style.display = 'none';
itemsContainer.style.display = 'block';
backButton.style.display = 'block';
@ -149,11 +174,11 @@ export async function loadProviderContent(providerId, providerName, page = 1) {
itemsGrid.innerHTML = `<div class="col-12 text-center mt-5"><div class="spinner" style="position: static; margin: auto; display: block;"></div></div>`;
paginationControls.style.display = 'none';
const { success, items, total_pages } = await getProviderItems(providerId, page);
const { success, items, total_pages } = await getProviderItems(providerId, page, currentMediaType);
if (success) {
totalPages = total_pages;
renderGrid(items, false, 'provider-items');
renderGrid(items, false, 'provider-items', !isFilterChange);
if (totalPages > 1) {
paginationControls.style.display = 'flex';

561
js/ui.js

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&family=Orbitron:wght@500;600;700&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/custom-filters.css">
</head>
<body class="unlocalized">
@ -96,6 +97,34 @@
<option value="vote_average.desc">__MSG_sortTopRated__</option>
<option id="sort-release-date" value="release_date.desc">__MSG_sortRecent__</option>
</select>
<div class="filter-popover-wrapper">
<button type="button" class="btn btn-secondary" id="duration-filter-btn" data-i18n="duration_min">Duración (Min)</button>
<div id="duration-popover" class="filter-popover">
<div class="range-slider-container">
<div class="slider-track"></div>
<div class="slider-fill" id="duration-fill"></div>
<input type="range" class="form-range" id="duration-min" min="0" max="300" value="0">
<input type="range" class="form-range" id="duration-max" min="0" max="300" value="300">
</div>
<div class="range-values">
<span id="duration-min-value">0</span> - <span id="duration-max-value">300</span>
</div>
</div>
</div>
<div class="filter-popover-wrapper">
<button type="button" class="btn btn-secondary" id="score-filter-btn" data-i18n="score">Puntuación</button>
<div id="score-popover" class="filter-popover">
<div class="range-slider-container">
<div class="slider-track"></div>
<div class="slider-fill" id="score-fill"></div>
<input type="range" class="form-range" id="score-min" min="0" max="10" step="0.1" value="0">
<input type="range" class="form-range" id="score-max" min="0" max="10" step="0.1" value="10">
</div>
<div class="range-values">
<span id="score-min-value">0</span> - <span id="score-max-value">10</span>
</div>
</div>
</div>
</div>
<div id="content-grid" class="content-grid">
<div class="col-12 text-center mt-5">
@ -111,7 +140,14 @@
</div>
<div id="providers-grid" class="providers-grid"></div>
<div id="provider-items-container" style="display: none;">
<button id="back-to-providers" class="btn btn-secondary mb-3"><i class="fas fa-arrow-left me-2"></i>__MSG_backToProviders__</button>
<div class="d-flex justify-content-between align-items-center mb-3">
<button id="back-to-providers" class="btn btn-secondary"><i class="fas fa-arrow-left me-2"></i>__MSG_backToProviders__</button>
<div id="provider-content-type-filter" class="btn-group">
<button type="button" class="btn btn-outline-primary active" data-type="all">__MSG_all__</button>
<button type="button" class="btn btn-outline-primary" data-type="movie">__MSG_navMovies__</button>
<button type="button" class="btn btn-outline-primary" data-type="tv">__MSG_navSeries__</button>
</div>
</div>
<div id="provider-items" class="content-grid"></div>
<div id="pagination-controls" class="text-center mt-4" style="display: none;">
<button id="prev-page" class="btn btn-primary">&larr; __MSG_previous__</button>