change OpenAI to Gemini (Assitant)

This commit is contained in:
Filipinos 2025-07-30 20:47:55 +02:00
parent 2449a07cae
commit c4d80d31eb
12 changed files with 1647 additions and 1573 deletions

View File

@ -1,10 +1,10 @@
{ {
"appName": { "message": "CinePlex" }, "appName": { "message": "CinePlex" },
"appDescription": { "message": "Sucht auf Plex-Servern nach Inhalten und zeigt sie in der Benutzeroberfläche an" }, "appDescription": { "message": "Scannt Plex-Server nach Inhalten und zeigt diese in der Oberfläche an" },
"appTagline": { "message": "Filme, Serien & Musik" }, "appTagline": { "message": "Filme, Serien und Musik" },
"appLocaleCode": { "message": "de-DE" }, "appLocaleCode": { "message": "de" },
"toggleNavigation": { "message": "Navigation umschalten" }, "toggleNavigation": { "message": "Navigation umschalten" },
"searchPlaceholder": { "message": "Suche nach Filmen oder Serien..." }, "searchPlaceholder": { "message": "Filme oder Serien suchen..." },
"openMusicPlayer": { "message": "Musik-Player öffnen" }, "openMusicPlayer": { "message": "Musik-Player öffnen" },
"settings": { "message": "Einstellungen" }, "settings": { "message": "Einstellungen" },
"navMovies": { "message": "Filme" }, "navMovies": { "message": "Filme" },
@ -16,10 +16,11 @@
"navHistory": { "message": "Verlauf" }, "navHistory": { "message": "Verlauf" },
"navRecommendations": { "message": "Empfehlungen" }, "navRecommendations": { "message": "Empfehlungen" },
"navMusic": { "message": "Musik" }, "navMusic": { "message": "Musik" },
"navM3uGenerator": { "message": "M3U-Generator" },
"heroWelcome": { "message": "" }, "heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Entdecke Tausende von Filmen und Serien." }, "heroSubtitle": { "message": "Entdecke Tausende von Filmen und Serien." },
"addStream": { "message": "Stream hinzufügen" }, "addStream": { "message": "Stream hinzufügen" },
"moreInfo": { "message": "Mehr Infos" }, "moreInfo": { "message": "Mehr Informationen" },
"popularMovies": { "message": "Beliebte Filme" }, "popularMovies": { "message": "Beliebte Filme" },
"allGenres": { "message": "Alle Genres" }, "allGenres": { "message": "Alle Genres" },
"allYears": { "message": "Alle Jahre" }, "allYears": { "message": "Alle Jahre" },
@ -28,34 +29,33 @@
"sortRecent": { "message": "Neueste" }, "sortRecent": { "message": "Neueste" },
"loadMore": { "message": "Mehr laden" }, "loadMore": { "message": "Mehr laden" },
"photosBreadcrumbHome": { "message": "Alben" }, "photosBreadcrumbHome": { "message": "Alben" },
"selectServer": { "message": "Einen Server auswählen" }, "selectServer": { "message": "Server auswählen" },
"loading": { "message": "Lädt..." }, "loading": { "message": "Laden..." },
"loadingLibraries": { "message": "Bibliotheken werden geladen..." }, "loadingLibraries": { "message": "Bibliotheken laden..." },
"photosEmptyState": { "message": "Keine Alben oder Fotos gefunden." }, "photosEmptyState": { "message": "Keine Alben oder Fotos gefunden." },
"photosEmptyStateSub": { "message": "Bitte wähle einen Server aus oder stelle sicher, dass du eine Fotobibliothek in Plex hast." }, "photosEmptyStateSub": { "message": "Bitte wählen Sie einen Server aus oder stellen Sie sicher, dass Sie eine Fotobibliothek in Plex haben." },
"statsTitle": { "message": "Bibliotheksstatistiken" }, "statsTitle": { "message": "Bibliotheksstatistiken" },
"statsAllTokens": { "message": "Alle Tokens" }, "statsAllTokens": { "message": "Alle Tokens" },
"statsAnalyzing": { "message": "Analysiere deine Bibliothek..." }, "statsAnalyzing": { "message": "Ihre Bibliothek wird analysiert..." },
"statsActiveTokens": { "message": "Aktive Tokens" }, "statsActiveTokens": { "message": "Aktive Tokens" },
"statsServersFound": { "message": "Gefundene Server" }, "statsServersFound": { "message": "Server gefunden" },
"statsUniqueMovies": { "message": "Einzigartige Filme" }, "statsUniqueMovies": { "message": "Einzigartige Filme" },
"statsUniqueSeries": { "message": "Einzigartige Serien" }, "statsUniqueSeries": { "message": "Einzigartige Serien" },
"statsUniqueArtists": { "message": "Einzigartige Künstler" }, "statsUniqueArtists": { "message": "Einzigartige Künstler" },
"statsTokenServers": { "message": "Server des Tokens" }, "statsTokenServers": { "message": "Token-Server" },
"statsChartMoviesByGenre": { "message": "Inhalt nach Genre (Filme)" }, "statsChartMoviesByGenre": { "message": "Inhalte nach Genre (Filme)" },
"statsChartSeriesByGenre": { "message": "Inhalt nach Genre (Serien)" }, "statsChartSeriesByGenre": { "message": "Inhalte nach Genre (Serien)" },
"statsChartByDecade": { "message": "Inhalt nach Jahrzehnt" }, "statsChartByDecade": { "message": "Inhalte nach Jahrzehnt" },
"recommendationsTitle": { "message": "Empfehlungen für dich" }, "recommendationsTitle": { "message": "Empfehlungen für Sie" },
"historyTitle": { "message": "Wiedergabeverlauf" }, "historyTitle": { "message": "Wiedergabeverlauf" },
"clearHistory": { "message": "Alles löschen" }, "clearHistory": { "message": "Alles löschen" },
"consoleTitle": { "message": "Plex Scan-Konsole" }, "consoleTitle": { "message": "Plex-Scan-Konsole" },
"footerCredit": { "message": "Eine Oberfläche für dein Plex-Universum." }, "footerCredit": { "message": "Eine Oberfläche für Ihr Plex-Universum." },
"backButton": { "message": "Zurück" },
"closeTrailer": { "message": "Trailer schließen" }, "closeTrailer": { "message": "Trailer schließen" },
"close": { "message": "Schließen" }, "close": { "message": "Schließen" },
"photoViewer": { "message": "Fotoanzeige" }, "photoViewer": { "message": "Foto-Viewer" },
"previous": { "message": "Zurück" }, "previous": { "message": "Vorherige" },
"next": { "message": "Weiter" }, "next": { "message": "Nächste" },
"notificationTemplateText": { "message": "Benachrichtigung" }, "notificationTemplateText": { "message": "Benachrichtigung" },
"settingsTitleFull": { "message": "Einstellungen und Konfiguration" }, "settingsTitleFull": { "message": "Einstellungen und Konfiguration" },
"settingsTabGeneral": { "message": "Allgemein" }, "settingsTabGeneral": { "message": "Allgemein" },
@ -63,48 +63,46 @@
"settingsTabJellyfin": { "message": "Jellyfin" }, "settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "PHP-Generator" }, "settingsTabPhpGen": { "message": "PHP-Generator" },
"settingsTabData": { "message": "Daten" }, "settingsTabData": { "message": "Daten" },
"settingsApiServer": { "message": "API- und Serverkonfiguration" }, "settingsApiServer": { "message": "API- und Server-Einstellungen" },
"settingsTmdbApiLabel": { "message": "TMDB API-Schlüssel (Optional)" }, "settingsTmdbApiLabel": { "message": "TMDB API-Schlüssel (Optional)" },
"settingsTmdbApiPlaceholder": { "message": "Verwendet den Standardschlüssel, wenn leer gelassen" }, "settingsTmdbApiPlaceholder": { "message": "Standardschlüssel wird verwendet, wenn leer gelassen" },
"openaiApiKey": { "message": "OpenAI API-Schlüssel" }, "settingsGoogleApiLabel": { "message": "Google Gemini API-Schlüssel (Optional)" },
"settingsTmdbLangLabel": { "message": "Sprache für TMDB & UI" }, "settingsGoogleApiPlaceholder": { "message": "Erforderlich für die Nutzung des KI-Assistenten" },
"settingsRegionLabel": { "message": "Region für Anbieter" }, "settingsRegionLabel": { "message": "Region für die Inhaltserkennung" },
"allRegions": { "message": "Alle Regionen" }, "allRegions": { "message": "Alle Regionen" },
"loadingRegions": { "message": "Regionen werden geladen..." },
"errorLoadingRegions": { "message": "Fehler beim Laden der Regionen" },
"settingsPhpUrlLabel": { "message": "Server-URL zum Hinzufügen von Streams" }, "settingsPhpUrlLabel": { "message": "Server-URL zum Hinzufügen von Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://dein-server.com/pfad/zum/script.php" }, "settingsPhpUrlPlaceholder": { "message": "https://ihr-server.com/pfad/zum/script.php" },
"settingsInterface": { "message": "Oberfläche" }, "settingsInterface": { "message": "Oberfläche" },
"settingsLightTheme": { "message": "Heller Modus" }, "settingsLightTheme": { "message": "Heller Modus" },
"settingsShowHero": { "message": "Willkommensbereich \"Hero\" anzeigen" }, "settingsShowHero": { "message": "Willkommensbereich 'Hero' anzeigen" },
"settingsScanContent": { "message": "Inhaltsscan" }, "settingsScanContent": { "message": "Inhaltsscanning" },
"settingsScanDesc": { "message": "Wähle aus, was gescannt werden soll, und drücke die Taste." }, "settingsScanDesc": { "message": "Wählen Sie aus, was gescannt werden soll, und klicken Sie auf die Schaltfläche." },
"settingsScanMovies": { "message": "Filme" }, "settingsScanMovies": { "message": "Filme" },
"settingsScanShows": { "message": "Serien" }, "settingsScanShows": { "message": "Serien" },
"settingsScanArtists": { "message": "Musik" }, "settingsScanArtists": { "message": "Musik" },
"settingsScanPhotos": { "message": "Fotos" }, "settingsScanPhotos": { "message": "Fotos" },
"settingsSelectAll": { "message": "Alles auswählen" }, "settingsSelectAll": { "message": "Alle auswählen" },
"settingsStartScan": { "message": "Scan starten" }, "settingsStartScan": { "message": "Scan starten" },
"settingsPlexTokens": { "message": "Plex-Tokens" }, "settingsPlexTokens": { "message": "Plex-Tokens" },
"settingsPlexTokensDesc": { "message": "Bearbeite die Liste der Plex-Tokens (JSON-Format)." }, "settingsPlexTokensDesc": { "message": "Bearbeiten Sie die Liste der Plex-Tokens (JSON-Format)." },
"settingsSaveTokens": { "message": "Tokens speichern" }, "settingsSaveTokens": { "message": "Tokens speichern" },
"settingsJellyfinTitle": { "message": "Jellyfin-Einstellungen" }, "settingsJellyfinTitle": { "message": "Jellyfin-Konfiguration" },
"settingsJellyfinDesc": { "message": "Füge die Daten deines Jellyfin-Servers hinzu, um dessen Inhalt zu scannen." }, "settingsJellyfinDesc": { "message": "Fügen Sie Ihre Jellyfin-Serverdaten hinzu, um deren Inhalte zu scannen." },
"jellyfinUrlLabel": { "message": "Jellyfin Server-URL" }, "jellyfinUrlLabel": { "message": "Jellyfin Server-URL" },
"jellyfinUserLabel": { "message": "Benutzername" }, "jellyfinUserLabel": { "message": "Benutzername" },
"jellyfinPassLabel": { "message": "Passwort" }, "jellyfinPassLabel": { "message": "Passwort" },
"jellyfinConnectAndScan": { "message": "Verbinden und Scannen" }, "jellyfinConnectAndScan": { "message": "Verbinden und scannen" },
"settingsPhpGenTitle": { "message": "PHP-Server-Skript-Generator" }, "settingsPhpGenTitle": { "message": "PHP-Skript-Generator für den Server" },
"settingsPhpFileOptions": { "message": "Dateioptionen" }, "settingsPhpFileOptions": { "message": "Dateioptionen" },
"settingsPhpSavePathLabel": { "message": "Speicherpfad auf dem Server" }, "settingsPhpSavePathLabel": { "message": "Speicherpfad auf dem Server" },
"settingsPhpSavePathPlaceholder": { "message": "Bsp: /var/www/html/listen (leer für denselben Ordner)" }, "settingsPhpSavePathPlaceholder": { "message": "Bsp.: /var/www/html/listen (leer lassen für denselben Ordner)" },
"settingsPhpFilenameLabel": { "message": "Dateiname" }, "settingsPhpFilenameLabel": { "message": "Dateiname" },
"settingsPhpFileAction": { "message": "Dateiaktion" }, "settingsPhpFileAction": { "message": "Dateiaktion" },
"settingsPhpActionAppend": { "message": "An das Ende der Datei anhängen (kumulativ)" }, "settingsPhpActionAppend": { "message": "An Dateiende anhängen (kumulativ)" },
"settingsPhpActionOverwrite": { "message": "Datei überschreiben (neu beginnen)" }, "settingsPhpActionOverwrite": { "message": "Datei überschreiben (neu beginnen)" },
"settingsPhpSecurity": { "message": "Sicherheit (Optional)" }, "settingsPhpSecurity": { "message": "Sicherheit (Optional)" },
"settingsPhpUseSecretKey": { "message": "Geheimschlüssel verwenden (Empfohlen)" }, "settingsPhpUseSecretKey": { "message": "Geheimen Schlüssel verwenden (Empfohlen)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Gib einen sicheren Geheimschlüssel ein" }, "settingsPhpSecretKeyPlaceholder": { "message": "Geben Sie einen sicheren geheimen Schlüssel ein" },
"settingsPhpGeneratedCode": { "message": "Generierter Code" }, "settingsPhpGeneratedCode": { "message": "Generierter Code" },
"settingsPhpGeneratedPlaceholder": { "message": "Der generierte PHP-Code wird hier angezeigt." }, "settingsPhpGeneratedPlaceholder": { "message": "Der generierte PHP-Code wird hier angezeigt." },
"settingsGenerateScript": { "message": "Skript generieren" }, "settingsGenerateScript": { "message": "Skript generieren" },
@ -113,20 +111,20 @@
"settingsImportDb": { "message": "DB aus Datei importieren" }, "settingsImportDb": { "message": "DB aus Datei importieren" },
"settingsExportDb": { "message": "DB in Datei exportieren" }, "settingsExportDb": { "message": "DB in Datei exportieren" },
"settingsClearContent": { "message": "Lokale Inhaltsdaten löschen" }, "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 deine 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 Einstellungen." },
"settingsClose": { "message": "Schließen" }, "settingsClose": { "message": "Schließen" },
"settingsSave": { "message": "Einstellungen speichern" }, "settingsSave": { "message": "Einstellungen speichern" },
"musicSidenavTitle": { "message": "Plex Musik" }, "musicSidenavTitle": { "message": "Plex Musik" },
"musicAllServers": { "message": "Alle Server" }, "musicAllServers": { "message": "Alle Server" },
"musicSearchArtistPlaceholder": { "message": "Künstler suchen..." }, "musicSearchArtistPlaceholder": { "message": "Künstler suchen..." },
"musicSearchDiscographyPlaceholder": { "message": "In Diskografie suchen..." }, "musicSearchDiscographyPlaceholder": { "message": "Diskografie durchsuchen..." },
"musicNothingPlaying": { "message": "Nichts wird abgespielt" }, "musicNothingPlaying": { "message": "Nichts wird abgespielt" },
"musicSelectSong": { "message": "Wähle ein Lied" }, "musicSelectSong": { "message": "Wählen Sie einen Song" },
"musicToStart": { "message": "um die Wiedergabe zu starten" }, "musicToStart": { "message": "zum Abspielen" },
"miniplayerDownloadSong": { "message": "Lied herunterladen" }, "miniplayerDownloadSong": { "message": "Song herunterladen" },
"miniplayerDownloadAlbum": { "message": "M3U-Album herunterladen" }, "miniplayerDownloadAlbum": { "message": "Album M3U herunterladen" },
"miniplayerVolume": { "message": "Lautstärke" }, "miniplayerVolume": { "message": "Lautstärke" },
"miniplayerShuffle": { "message": "Zufall" }, "miniplayerShuffle": { "message": "Zufallswiedergabe" },
"miniplayerEqualizer": { "message": "Equalizer" }, "miniplayerEqualizer": { "message": "Equalizer" },
"miniplayerOpenList": { "message": "Liste öffnen" }, "miniplayerOpenList": { "message": "Liste öffnen" },
"eqTitle": { "message": "Grafischer Equalizer" }, "eqTitle": { "message": "Grafischer Equalizer" },
@ -136,9 +134,9 @@
"eqPresetPop": { "message": "Pop" }, "eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" }, "eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Klassik" }, "eqPresetClassical": { "message": "Klassik" },
"eqPresetBassBoost": { "message": "Bass-Boost" }, "eqPresetBassBoost": { "message": "Bass-Verstärkung" },
"eqPreampLabel": { "message": "Vorverstärker" }, "eqPreampLabel": { "message": "Vorverstärker" },
"infoModalTitle": { "message": "Information" }, "infoModalTitle": { "message": "Informationen" },
"infoModalFieldTitle": { "message": "Titel:" }, "infoModalFieldTitle": { "message": "Titel:" },
"infoModalFieldArtist": { "message": "Künstler:" }, "infoModalFieldArtist": { "message": "Künstler:" },
"infoModalFieldAlbum": { "message": "Album:" }, "infoModalFieldAlbum": { "message": "Album:" },
@ -151,18 +149,18 @@
"lang_de": { "message": "Deutsch" }, "lang_de": { "message": "Deutsch" },
"lang_it": { "message": "Italienisch" }, "lang_it": { "message": "Italienisch" },
"lang_pt": { "message": "Portugiesisch" }, "lang_pt": { "message": "Portugiesisch" },
"essentialFeaturesNotSupported": { "message": "Dein Browser unterstützt wesentliche Funktionen nicht." }, "essentialFeaturesNotSupported": { "message": "Ihr Browser unterstützt keine wesentlichen Funktionen." },
"dbAccessError": { "message": "Fehler beim Zugriff auf die lokale Datenbank." }, "dbAccessError": { "message": "Fehler beim Zugriff auf die lokale Datenbank." },
"dbUpdateNeeded": { "message": "Die Datenbank muss aktualisiert werden, bitte lade die Seite neu." }, "dbUpdateNeeded": { "message": "Die Datenbank muss aktualisiert werden, bitte laden Sie die Seite neu." },
"dbBlocked": { "message": "Bitte schließe andere Tabs dieser Anwendung, um fortzufahren." }, "dbBlocked": { "message": "Bitte schließen Sie andere Tabs dieser Anwendung, um fortzufahren." },
"deletingContentData": { "message": "Lokale Inhaltsdaten werden gelöscht..." }, "deletingContentData": { "message": "Lokale Inhaltsdaten werden gelöscht..." },
"noContentDataToDelete": { "message": "Keine Inhaltsdaten zum Löschen." }, "noContentDataToDelete": { "message": "Keine Inhaltsdaten zum Löschen vorhanden." },
"contentDataDeleted": { "message": "Inhaltsdaten aus IndexedDB gelöscht." }, "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 der Daten: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Texteditor nicht verfügbar." }, "aceEditorNotAvailable": { "message": "Texteditor nicht verfügbar." },
"errorLoadingTokens": { "message": "Fehler beim Laden der Tokens in den Editor." }, "errorLoadingTokens": { "message": "Fehler beim Laden der Tokens zum Bearbeiten." },
"errorLoadingTokensMessage": { "message": "Fehler beim Laden der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingTokensMessage": { "message": "Fehler beim Laden der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor zum Speichern nicht verfügbar." }, "aceEditorNotAvailableToSave": { "message": "Editor nicht zum Speichern verfügbar." },
"invalidJsonFormat": { "message": "Ungültiges JSON-Format. Muss { \"tokens\": [...] } sein" }, "invalidJsonFormat": { "message": "Ungültiges JSON-Format. Muss { \"tokens\": [...] } sein" },
"tokensSaved": { "message": "Tokens erfolgreich gespeichert." }, "tokensSaved": { "message": "Tokens erfolgreich gespeichert." },
"errorSavingTokens": { "message": "Fehler beim Speichern der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorSavingTokens": { "message": "Fehler beim Speichern der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
@ -174,253 +172,270 @@
"dbImported": { "message": "Datenbank erfolgreich importiert." }, "dbImported": { "message": "Datenbank erfolgreich importiert." },
"errorImportingDb": { "message": "Fehler beim Importieren der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorImportingDb": { "message": "Fehler beim Importieren der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Ansicht wird mit neuen Daten aktualisiert..." }, "updatingView": { "message": "Ansicht wird mit neuen Daten aktualisiert..." },
"confirmClearContent": { "message": "Bist du sicher, dass du die lokalen Inhaltsdaten (Filme, Serien, Musik usw.) löschen möchtest? Favoriten und Einstellungen werden NICHT gelöscht." }, "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." },
"trailerNotFound": { "message": "Für diesen Titel wurde kein Trailer gefunden." }, "trailerNotFound": { "message": "Kein Trailer für diesen Titel gefunden." },
"confirmClearHistory": { "message": "Bist du sicher, dass du deinen gesamten Wiedergabeverlauf löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden." }, "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." }, "historyCleared": { "message": "Wiedergabeverlauf gelöscht." },
"historyItemDeleted": { "message": "Eintrag aus dem Verlauf gelöscht." }, "historyItemDeleted": { "message": "Element aus dem Verlauf gelöscht." },
"errorGeneratingScript": { "message": "Generiere zuerst ein Skript, um es kopieren zu können." }, "errorGeneratingScript": { "message": "Generieren Sie zuerst ein Skript, um es kopieren zu können." },
"scriptCopied": { "message": "PHP-Skript in die Zwischenablage kopiert." }, "scriptCopied": { "message": "PHP-Skript in die Zwischenablage kopiert." },
"errorCopyingScript": { "message": "Fehler beim Kopieren des Skripts." }, "errorCopyingScript": { "message": "Fehler beim Kopieren des Skripts." },
"scriptGenerated": { "message": "PHP-Skript generiert." }, "scriptGenerated": { "message": "PHP-Skript generiert." },
"errorLoadingAlbum": { "message": "Fehler beim Laden des Albums: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingAlbum": { "message": "Fehler beim Laden des Albums: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Fehler: Es wurde kein Fotoserver ausgewählt." }, "noPhotoServerSelected": { "message": "Fehler: Es wurde kein Fotoserver ausgewählt." },
"loadingGenres": { "message": "Lade Genres..." }, "loadingGenres": { "message": "Genres laden..." },
"errorLoadingGenres": { "message": "Fehler beim Laden" }, "errorLoadingGenres": { "message": "Fehler beim Laden" },
"noContentFound": { "message": "Keine Ergebnisse gefunden." }, "noContentFound": { "message": "Keine Ergebnisse gefunden." },
"couldNotLoadContent": { "message": "Inhalt konnte nicht geladen werden." }, "couldNotLoadContent": { "message": "Inhalt konnte nicht geladen werden." },
"noFavorites": { "message": "Du hast noch keine Favoriten." }, "noFavorites": { "message": "Sie haben noch keine Favoriten." },
"errorLoadingFavorites": { "message": "Fehler beim Laden der Favoriten." }, "errorLoadingFavorites": { "message": "Fehler beim Laden der Favoriten." },
"historyEmpty": { "message": "Dein Verlauf ist leer." }, "historyEmpty": { "message": "Ihr Verlauf ist leer." },
"historyEmptySub": { "message": "Durchsuche und schaue Inhalte an, damit sie hier erscheinen." }, "historyEmptySub": { "message": "Durchsuchen und schauen Sie Inhalte, damit sie hier erscheinen." },
"errorGeneratingRecommendations": { "message": "Fehler beim Erstellen von Empfehlungen." }, "errorGeneratingRecommendations": { "message": "Fehler beim Generieren von Empfehlungen." },
"noRecommendations": { "message": "Wir müssen dich besser kennenlernen, um dir Empfehlungen geben zu können!" }, "noRecommendations": { "message": "Wir müssen Sie besser kennenlernen, um Empfehlungen geben zu können!" },
"errorGeneratingStats": { "message": "Fehler beim Erstellen von Statistiken." }, "errorGeneratingStats": { "message": "Fehler beim Generieren von Statistiken." },
"noServersForToken": { "message": "Keine zugehörigen Server für dieses Token gefunden." }, "noServersForToken": { "message": "Keine zugehörigen Server für dieses Token gefunden." },
"searchingActorContent": { "message": "Suche nach Inhalten von $actorName$", "placeholders": { "actorName": { "content": "$1" } } }, "searchingActorContent": { "message": "Suche Inhalt von $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Inhalt für $actorName$ konnte nicht geladen werden.", "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" } } }, "errorAddingStream": { "message": "Fehler beim Hinzufügen von Stream(s): $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "Die PHP-Server-URL ist nicht konfiguriert. Bitte richte sie in den Einstellungen ein." }, "phpUrlNotConfigured": { "message": "Die PHP-Server-URL ist nicht konfiguriert. Bitte konfigurieren Sie sie in den Einstellungen." },
"searchingStreams": { "message": "Suche nach Streams für \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "searchingStreams": { "message": "Suche Streams für „$title$“", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Sende $count$ Stream(s) an den Server...", "placeholders": { "count": { "content": "$1" } } }, "sendingStreams": { "message": "Sende $count$ Stream(s) an den Server...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) erfolgreich hinzugefügt." }, "streamAddedSuccess": { "message": "Stream(s) erfolgreich hinzugefügt." },
"generatingM3U": { "message": "Generiere M3U für \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "generatingM3U": { "message": "Generiere M3U für „$title$“", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"\"$title$\" heruntergeladen.", "placeholders": { "title": { "content": "$1" } } }, "m3uDownloaded": { "message": "„$title$“ heruntergeladen.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Fehler beim Generieren der M3U: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorGeneratingM3U": { "message": "Fehler beim Generieren von M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Einstellungen erfolgreich gespeichert." }, "settingsSavedSuccess": { "message": "Einstellungen erfolgreich gespeichert." },
"errorSavingSettings": { "message": "Fehler beim Speichern der Einstellungen in der Datenbank." }, "errorSavingSettings": { "message": "Fehler beim Speichern der Einstellungen in der Datenbank." },
"languageChangeReload": { "message": "Sprache geändert. Die Anwendung wird jetzt neu geladen." }, "languageChangeReload": { "message": "Sprache geändert. Die Anwendung wird jetzt neu geladen." },
"addedToFavorites": { "message": "Zu Favoriten hinzugefügt." }, "addedToFavorites": { "message": "Zu Favoriten hinzugefügt." },
"removedFromFavorites": { "message": "Aus Favoriten entfernen." }, "removedFromFavorites": { "message": "Aus Favoriten entfernt." },
"plexScanInProgress": { "message": "Plex-Scan läuft bereits." }, "plexScanInProgress": { "message": "Der Plex-Scan läuft bereits." },
"plexScanStarting": { "message": "Starte Plex-Scan..." }, "plexScanStarting": { "message": "Plex-Scan wird gestartet..." },
"noPlexTokens": { "message": "Keine Plex-Tokens konfiguriert." }, "noPlexTokens": { "message": "Keine Plex-Tokens konfiguriert." },
"clearingSections": { "message": "Lösche Abschnitte: $sections$", "placeholders": { "sections": { "content": "$1" } } }, "clearingSections": { "message": "Abschnitte werden gelöscht: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"sectionsCleared": { "message": "Abschnitte gelöscht." }, "initialScanPhaseComplete": { "message": "Erste Scanphase abgeschlossen." },
"tokenFoundServers": { "message": "Token $token$... hat $count$ Server gefunden.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Fehler bei der Verarbeitung von Token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"initialScanPhaseComplete": { "message": "Initiale Scan-Phase abgeschlossen." },
"retryPhaseFinished": { "message": "Wiederholungsphase abgeschlossen." }, "retryPhaseFinished": { "message": "Wiederholungsphase abgeschlossen." },
"plexScanFinished": { "message": "Scan abgeschlossen. Aktualisiere Inhalte..." }, "plexScanFinished": { "message": "Scan abgeschlossen. Inhalte werden aktualisiert..." },
"plexScanFatalError": { "message": "FATALER FEHLER: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Fehler während des Scans: $message$", "placeholders": { "message": { "content": "$1" } } },
"scanCancelled": { "message": "Scan vom Benutzer abgebrochen." }, "scanCancelled": { "message": "Scan vom Benutzer abgebrochen." },
"scanCancelledInfo": { "message": "Scan abgebrochen." }, "scanCancelledInfo": { "message": "Scan abgebrochen." },
"retyingSection": { "message": "Wiederhole Abschnitt \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[ERFOLG] Wiederholung von \"$title$\" abgeschlossen.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[FINALER FEHLER] Wiederholung für \"$title$\" fehlgeschlagen: $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"noRetriesPending": { "message": "Keine ausstehenden Wiederholungen." },
"startingRetryPhase": { "message": "Starte Wiederholungsphase für $count$ Abschnitte...", "placeholders": { "count": { "content": "$1" } } },
"retryPhaseCancelled": { "message": "Wiederholungsphase abgebrochen." },
"errorInitializingMusicPlayer": { "message": "Fehler beim Initialisieren des Musik-Players." }, "errorInitializingMusicPlayer": { "message": "Fehler beim Initialisieren des Musik-Players." },
"criticalErrorLoadingMusic": { "message": "Kritischer Fehler beim Laden der Musikdaten." }, "criticalErrorLoadingMusic": { "message": "Kritischer Fehler beim Laden der Musikdaten." },
"errorLoadingArtists": { "message": "Fehler beim Laden der Künstler." }, "errorLoadingArtists": { "message": "Fehler beim Laden der Künstler." },
"dbUnavailableError": { "message": "Fehler: Datenbank nicht verfügbar." }, "dbUnavailableError": { "message": "Fehler: Datenbank nicht verfügbar." },
"updatingMusicData": { "message": "Aktualisiere Musikdaten..." }, "updatingMusicData": { "message": "Musikdaten werden aktualisiert..." },
"musicDataUpdated": { "message": "Musikdaten aktualisiert." }, "musicDataUpdated": { "message": "Musikdaten aktualisiert." },
"errorFetchingArtistSongs": { "message": "Fehler beim Abrufen der Lieder des Künstlers." }, "errorFetchingArtistSongs": { "message": "Fehler beim Abrufen der Künstlersongs." },
"errorLoadingSongs": { "message": "Fehler beim Laden der Lieder." }, "errorLoadingSongs": { "message": "Fehler beim Laden der Songs." },
"noArtistsFound": { "message": "Keine Künstler gefunden." }, "noArtistsFound": { "message": "Keine Künstler gefunden." },
"artistsCounter": { "message": "$start$-$end$ von $total$", "placeholders": { "start": { "content": "$1" }, "end": { "content": "$2" }, "total": { "content": "$3" } } }, "shuffleOn": { "message": "Zufallswiedergabe aktiviert." },
"artistsCounterSingle": { "message": "$total$ Künstler", "placeholders": { "total": { "content": "$1" } } }, "shuffleOff": { "message": "Zufallswiedergabe deaktiviert." },
"artistsCounterLoading": { "message": "Lädt..." },
"noSongsFound": { "message": "Keine Lieder gefunden." },
"shuffleOn": { "message": "Zufallsmodus aktiviert." },
"shuffleOff": { "message": "Zufallsmodus deaktiviert." },
"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" } } },
"playbackError": { "message": "Wiedergabefehler" }, "playbackError": { "message": "Wiedergabefehler" },
"errorLabel": { "message": "Fehler" }, "errorLabel": { "message": "Fehler" },
"reloadingPage": { "message": "Seite wird neu geladen..." }, "reloadingPage": { "message": "Seite wird neu geladen..." },
"viewed": { "message": "Gesehen" }, "viewed": { "message": "Gesehen" },
"local": { "message": "Lokal" }, "local": { "message": "Lokal" },
"topRatedSort": {"message": "Bestbewertet"}, "topRatedSort": {"message": "Am besten bewertet"},
"recentSort": {"message": "Neueste"}, "recentSort": {"message": "Neueste"},
"popularSort": {"message": "Beliebte"}, "popularSort": {"message": "Beliebteste"},
"moviesSectionTitle": {"message": "Filme"}, "moviesSectionTitle": {"message": "Filme"},
"seriesSectionTitle": {"message": "Serien"}, "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"}}}, "contentFrom": {"message": "Inhalt von $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Entdecken"}, "explore": {"message": "Erkunden"},
"noGenre": {"message": "Unkategorisiert"}, "noGenre": {"message": "Ohne Kategorie"},
"synopsis": {"message": "Zusammenfassung"}, "synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "Keine Zusammenfassung verfügbar."}, "noSynopsis": {"message": "Keine Synopsis verfügbar."},
"director": {"message": "Regisseur:"}, "director": {"message": "Regisseur:"},
"writer": {"message": "Autor:"}, "writer": {"message": "Drehbuchautor:"},
"viewOnImdb": {"message": "Auf IMDb ansehen"}, "viewOnImdb": {"message": "Auf IMDb ansehen"},
"watchTrailer": {"message": "Trailer ansehen"}, "watchTrailer": {"message": "Trailer ansehen"},
"addToFavorites": {"message": "Zu Favoriten hinzufügen"}, "addToFavorites": {"message": "Zu Favoriten hinzufügen"},
"removeFromFavorites": {"message": "Aus Favoriten entfernen"}, "removeFromFavorites": {"message": "Aus Favoriten entfernen"},
"notAvailable": {"message": "Nicht verfügbar"}, "notAvailable": {"message": "Nicht verfügbar"},
"mainCast": {"message": "Hauptbesetzung"}, "mainCast": {"message": "Hauptdarsteller"},
"seasonsAndEpisodes": {"message": "Staffeln & Episoden"}, "seasonsAndEpisodes": {"message": "Staffeln und Episoden"},
"similarContent": {"message": "Ähnlicher Inhalt"}, "similarContent": {"message": "Ähnlicher Inhalt"},
"episodesCount": {"message": "$count$ Episoden", "placeholders": {"count": {"content": "$1"}}}, "episodesCount": {"message": "$count$ Episoden", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Staffeln", "placeholders": {"count": {"content": "$1"}}}, "seasonsCount": {"message": "$count$ Staffeln", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ Min.", "placeholders": {"count": {"content": "$1"}}}, "runtimeMinutes": {"message": "$count$ Min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Für diesen Titel wurde kein Trailer gefunden."}, "fatalInitError": {"message": "Fataler Initialisierungsfehler"}, "noTrailerFound": {"message": "Kein Trailer für diesen Titel gefunden."},
"fatalInitErrorSub": {"message": "Die Anwendung konnte nicht geladen werden."}, "fatalInitError": {"message": "Fataler Initialisierungsfehler"},
"invalidStreamInfo": {"message": "Ungültige Information."}, "fatalInitErrorSub": {"message": "Anwendung konnte nicht geladen werden."},
"invalidStreamInfo": {"message": "Ungültige Informationen."},
"dbUnavailableForStreams": {"message": "Lokale Datenbank nicht verfügbar."}, "dbUnavailableForStreams": {"message": "Lokale Datenbank nicht verfügbar."},
"noPlexServersForStreams": {"message": "Keine Plex-Server."}, "noPlexServersForStreams": {"message": "Keine Plex-Server vorhanden."},
"notFoundOnServers": {"message": "\"query$\" auf Servern nicht gefunden.", "placeholders": {"query": {"content": "$1"}}}, "notFoundOnServers": {"message": "„$query$“ wurde auf den Plex-Servern nicht gefunden.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Gerade eben" }, "relativeTime_justNow": { "message": "Gerade eben" },
"relativeTime_minutesAgo": { "message": "Vor $count$ Minuten", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_minutesAgo": { "message": "Vor $count$ Minuten", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "Vor $count$ Stunden", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_hoursAgo": { "message": "Vor $count$ Stunden", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Gestern" }, "relativeTime_yesterday": { "message": "Gestern" },
"relativeTime_daysAgo": { "message": "Vor $count$ Tagen", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_daysAgo": { "message": "Vor $count$ Tagen", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Fehler beim Laden der Details" }, "errorLoadingDetails": { "message": "Fehler beim Laden der Details" },
"errorLoadingLocalContent": { "message": "Fehler beim Laden lokaler Inhalte." }, "errorLoadingLocalContent": { "message": "Fehler beim Laden des lokalen Inhalts." },
"errorServerResponse": { "message": "Nicht erfolgreiche Antwort vom Server." }, "errorServerResponse": { "message": "Unerfolgreiche Serverantwort." },
"errorPlexApi": { "message": "Fehler $status$ von der Plex-API.", "placeholders": { "status": { "content": "$1" } } }, "errorPlexApi": { "message": "Plex API-Fehler $status$.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Fehler beim Parsen von Plex-XML." }, "errorParsingPlexXml": { "message": "Fehler beim Parsen der Plex-XML." },
"untitled": { "message": "Ohne Titel" }, "untitled": { "message": "Unbetitelt" },
"itemCount": { "message": "$count$ Elemente", "placeholders": { "count": { "content": "$1" } } }, "itemCount": { "message": "$count$ Elemente", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Keine Foto-Server" }, "noPhotoServers": { "message": "Keine Fotoserver" },
"jellyfinScanInProgress": { "message": "Jellyfin-Scan läuft bereits." }, "jellyfinScanInProgress": { "message": "Der Jellyfin-Scan läuft bereits." },
"jellyfinScanning": { "message": "Scanne Jellyfin..." }, "jellyfinScanning": { "message": "Jellyfin wird gescannt..." },
"jellyfinMissingCredentials": { "message": "Bitte vervollständige die Jellyfin-URL und den Benutzernamen." }, "jellyfinMissingCredentials": { "message": "Bitte geben Sie die Jellyfin-URL und den Benutzernamen an." },
"jellyfinConnecting": { "message": "Verbinde mit Jellyfin unter: $url$", "placeholders": { "url": { "content": "$1" } } }, "jellyfinConnecting": { "message": "Verbindung zu Jellyfin wird hergestellt unter: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Jellyfin-Authentifizierung fehlgeschlagen: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinAuthFailed": { "message": "Jellyfin-Authentifizierung fehlgeschlagen: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Jellyfin-Authentifizierung erfolgreich." }, "jellyfinAuthSuccess": { "message": "Jellyfin-Authentifizierung erfolgreich." },
"jellyfinFetchingLibraries": { "message": "Bibliotheken werden abgerufen..." }, "jellyfinFetchingLibraries": { "message": "Bibliotheken werden abgerufen..." },
"jellyfinFetchFailed": { "message": "Fehler beim Abrufen der Bibliotheken: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinFetchFailed": { "message": "Fehler beim Abrufen der Bibliotheken: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Keine Film- oder Serienbibliotheken auf Jellyfin gefunden." }, "jellyfinNoMediaLibraries": { "message": "Keine Film- oder Serienbibliotheken in Jellyfin gefunden." },
"jellyfinLibrariesFound": { "message": "$count$ Medienbibliothek(en) gefunden.", "placeholders": { "count": { "content": "$1" } } }, "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" } } }, "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" } } }, "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" } } }, "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." }, "noJellyfinCredentials": { "message": "Jellyfin-Anmeldeinformationen nicht konfiguriert." },
"notFoundOnJellyfin": { "message": "\"query$\" auf Jellyfin nicht gefunden.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnJellyfin": { "message": "„$query$“ wurde in Jellyfin nicht gefunden.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"query$\" auf keinem Server gefunden.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnAnyServer": { "message": "„$query$“ wurde auf keinem Server gefunden.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "Auf Plex" }, "localOnPlex": { "message": "Auf Plex" },
"searchOnPlex": { "message": "Auf Plex suchen" }, "searchOnPlex": { "message": "Auf Plex suchen" },
"jellyfinTitle": { "message": "Jellyfin-Inhalt" }, "jellyfinTitle": { "message": "Jellyfin-Inhalt" },
"noJellyfinContent": { "message": "Kein Jellyfin-Inhalt gefunden." }, "noJellyfinContent": { "message": "Kein Jellyfin-Inhalt gefunden." },
"noJellyfinContentSub": { "message": "Stelle sicher, dass du deinen Jellyfin-Server in den Einstellungen gescannt hast." }, "noJellyfinContentSub": { "message": "Stellen Sie sicher, dass Sie Ihren Jellyfin-Server in den Einstellungen gescannt haben." },
"activityViewerTitle": { "message": "Server-Aktivitätsanzeige" }, "activityViewerTitle": { "message": "Server-Aktivitätsanzeige" },
"activitySelectServer": { "message": "Wählen Sie einen Server aus" }, "activitySelectServer": { "message": "Server auswählen" },
"activityCheckBtn": { "message": "Aktualisieren" }, "activityCheckBtn": { "message": "Aktualisieren" },
"activityNoSessions": { "message": "Keine aktiven Sitzungen auf diesem Server." }, "activityNoSessions": { "message": "Keine aktiven Sitzungen auf diesem Server." },
"activitySessionUser": { "message": "Benutzer" }, "activitySessionUser": { "message": "Benutzer" },
"activitySessionDevice": { "message": "Gerät" }, "activitySessionDevice": { "message": "Gerät" },
"activitySessionContent": { "message": "Inhalt" }, "activitySessionContent": { "message": "Inhalt" },
"activitySessionState": { "message": "Status" }, "activitySessionState": { "message": "Status" },
"activitySessionIdentifier": { "message": "Client-Kennung" }, "activitySessionIdentifier": { "message": "Client-Identifikator" },
"activityCopyID": { "message": "ID kopieren" }, "activityCopyID": { "message": "ID kopieren" },
"activityError": { "message": "Serveraktivität konnte nicht abgerufen werden." }, "activityError": { "message": "Aktivität des Servers konnte nicht abgerufen werden." },
"activityCopied": { "message": "Kennung in die Zwischenablage kopiert!" }, "activityCopied": { "message": "Identifikator in die Zwischenablage kopiert!" },
"activityCopyError": { "message": "Fehler beim Kopieren der Kennung." }, "activityCopyError": { "message": "Fehler beim Kopieren des Identifikators." },
"noProvidersFound": { "message": "Keine Anbieter gefunden." }, "noProvidersFound": { "message": "Keine Anbieter gefunden." },
"availableOnPlex": { "message": "Auf Plex verfügbar" }, "availableOnPlex": { "message": "Verfügbar auf Plex" },
"navM3uGenerator": { "message": "M3U-Generator" }, "m3uGeneratorTitle": { "message": "M3U-Listen-Generator" },
"m3uGeneratorTitle": { "message": "M3U-Wiedergabelisten-Generator" }, "selectAServer": { "message": "Server auswählen..." },
"selectAServer": { "message": "Wählen Sie einen Server aus..." },
"downloadM3u": { "message": "M3U herunterladen" }, "downloadM3u": { "message": "M3U herunterladen" },
"m3uGenerator": { "message": "M3U-Generator" }, "m3uGenerator": { "message": "M3U-Generator" },
"selectServer": { "message": "Server auswählen" },
"selectLibraries": { "message": "Bibliotheken auswählen" }, "selectLibraries": { "message": "Bibliotheken auswählen" },
"howToUse": { "message": "Anleitung" }, "howToUse": { "message": "Anleitung" },
"m3uInstruction1": { "message": "Wählen Sie einen Server aus der Liste aus." }, "m3uInstruction1": { "message": "Wählen Sie einen Server aus der Liste." },
"m3uInstruction2": { "message": "Wählen Sie eine oder mehrere Bibliotheken aus, die Sie einschließen möchten." }, "m3uInstruction2": { "message": "Wählen Sie eine oder mehrere Bibliotheken zum Einschließen aus." },
"m3uInstruction3": { "message": "Klicken Sie auf die Download-Schaltfläche." }, "m3uInstruction3": { "message": "Klicken Sie auf die Download-Schaltfläche." },
"m3uInstruction4": { "message": "Importieren Sie die .m3u-Datei in Ihren kompatiblen Player." }, "m3uInstruction4": { "message": "Importieren Sie die .m3u-Datei in Ihren kompatiblen Player." },
"settingsRegionLabel": { "message": "Region für die Inhaltsentdeckung" },
"allRegions": { "message": "Alle Regionen" },
"chatOpen": { "message": "Chat öffnen" }, "chatOpen": { "message": "Chat öffnen" },
"chatTitle": { "message": "KI-Assistent" }, "chatTitle": { "message": "KI-Assistent" },
"chatClose": { "message": "X" }, "chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Nachricht eingeben..." }, "chatPlaceholder": { "message": "Geben Sie Ihre Nachricht ein..." },
"chatSend": { "message": "➤" }, "chatSend": { "message": "➤" },
"chatGptError": { "message": "Entschuldigung, ich konnte keine Antwort erhalten. Bitte versuchen Sie es erneut." }, "chatWelcome": { "message": "Willkommen! Ich bin Ihr CinePlex-Assistent. Fragen Sie mich nach Filmen, Serien oder allem, was Sie wissen möchten." },
"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 richten Sie ihn in den Erweiterungseinstellungen ein, um den KI-Assistenten zu verwenden." },
"chatApiKeyMissing": { "message": "Der OpenAI-API-Schlüssel ist nicht festgelegt. Bitte konfigurieren Sie ihn in den Erweiterungseinstellungen." },
"chatApiInvalidResponse": { "message": "Die API hat eine ungültige Antwort zurückgegeben. Bitte versuchen Sie es erneut." }, "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" }, "chatApiError": { "message": "Fehler bei der Kommunikation mit dem KI-Assistenten" },
"downloadAll": { "message": "Alles herunterladen" }, "downloadAll": { "message": "Alles herunterladen" },
"download": { "message": "Herunterladen" }, "download": { "message": "Herunterladen" },
"aiToolSearchLibraryDesc": { "message": "Durchsucht die Plex-Bibliothek nach Filmen oder Serien." }, "aiToolSearchLibraryDesc": { "message": "Sucht in der Plex-Bibliothek des Benutzers nach Filmen oder Serien nach Titel." },
"aiToolSearchLibraryQueryDesc": { "message": "Der zu suchende Titel." }, "aiToolSearchLibraryQueryParamDesc": { "message": "Der Titel des Films oder der Serie, die gesucht werden soll." },
"aiToolSearchLibraryTypeDesc": { "message": "Die Art des zu suchenden Inhalts (Film oder Serie)." }, "aiToolSearchLibraryTypeParamDesc": { "message": "Der Typ des Inhalts, der gesucht werden soll. Kann 'movie' für Filme oder 'series' für Serien sein. (Optional)." },
"aiToolNavigateToPageDesc": { "message": "Navigiert zu einer bestimmten Seite in der Anwendung." }, "aiToolNavigateToPageDesc": { "message": "Navigiert den Benutzer zu einer bestimmten Seite der Anwendungsoberfläche." },
"aiToolNavigateToPagePageDesc": { "message": "Die Seite, zu der navigiert werden soll." }, "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 Benutzerstatistiken ab." }, "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 Details eines Films oder einer Serie an." }, "aiToolShowItemDetailsDesc": { "message": "Zeigt die Detailseite eines bestimmten Films oder einer Serie nach Titel und Typ an." },
"aiToolShowItemDetailsTitleDesc": { "message": "Der Titel des Films oder der Serie." }, "aiToolShowItemDetailsTitleParamDesc": { "message": "Der genaue Titel des Films oder der Serie." },
"aiToolShowItemDetailsTypeDesc": { "message": "Die Art des Inhalts (Film oder Serie)." }, "aiToolShowItemDetailsTypeParamDesc": { "message": "Der Inhaltstyp. Muss 'movie' oder 'series' sein." },
"aiToolAddToPlaylistDesc": { "message": "Fügt einen Film oder eine Serie zur Wiedergabeliste hinzu." }, "aiToolAddToPlaylistDesc": { "message": "Fügt einen Film oder eine Serie zur aktuellen Wiedergabeliste des Benutzers hinzu, um sie an einen konfigurierten PHP-Server zu streamen." },
"aiToolAddToPlaylistTitleDesc": { "message": "Der Titel des Films oder der Serie." }, "aiToolAddToPlaylistTitleParamDesc": { "message": "Der Titel des hinzuzufügenden Films oder der Serie." },
"aiToolAddToPlaylistTypeDesc": { "message": "Die Art des Inhalts (Film oder Serie)." }, "aiToolAddToPlaylistTypeParamDesc": { "message": "Der Inhaltstyp. Muss 'movie' oder 'series' sein." },
"aiToolDownloadPlaylistDesc": { "message": "Lädt die Wiedergabeliste für einen Film oder eine Serie herunter." }, "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." },
"aiToolDownloadPlaylistTitleDesc": { "message": "Der Titel des Films oder der Serie." }, "aiToolCheckAndDownloadTitlesParamDesc": { "message": "Ein Array von Film- oder Serientiteln zum Suchen und Herunterladen." },
"aiToolDownloadPlaylistTypeDesc": { "message": "Die Art des Inhalts (Film oder Serie)." }, "aiToolCheckAndDownloadTypeParamDesc": { "message": "Der Inhaltstyp der Liste. Muss 'movie' oder 'series' sein." },
"aiToolToggleFavoriteDesc": { "message": "Fügt einen Film oder eine Serie zu den Favoriten hinzu oder entfernt sie daraus." }, "aiToolCheckAndDownloadFilenameParamDesc": { "message": "Der Name der herunterzuladenden M3U-Datei (z.B. 'MeineListe.m3u'). Falls nicht angegeben, wird ein Standardname verwendet." },
"aiToolToggleFavoriteTitleDesc": { "message": "Der Titel des Films oder der Serie." }, "aiToolToggleFavoriteDesc": { "message": "Fügt einen Film oder eine Serie zur Favoritenliste des Benutzers hinzu oder entfernt sie." },
"aiToolToggleFavoriteTypeDesc": { "message": "Die Art des Inhalts (Film oder Serie)." }, "aiToolToggleFavoriteTitleParamDesc": { "message": "Der Titel des Films oder der Serie." },
"aiToolGetRecommendationsDesc": { "message": "Ruft Empfehlungen für den Benutzer ab." }, "aiToolToggleFavoriteTypeParamDesc": { "message": "Der Inhaltstyp. Muss 'movie' oder 'series' sein." },
"aiToolApplyFiltersDesc": { "message": "Wendet Filter auf die aktuelle Ansicht an." }, "aiToolGetRecommendationsDesc": { "message": "Generiert und zeigt eine Liste von Film- oder Serienempfehlungen basierend auf dem Wiedergabeverlauf und den Favoriten des Benutzers an." },
"aiToolApplyFiltersTypeDesc": { "message": "Die Art des zu filternden Inhalts (Film oder Serie)." }, "aiToolApplyFiltersDesc": { "message": "Wendet Filter auf die aktuelle Film- oder Serienansicht an, wodurch die Ergebnisse nach Typ, Genre, Jahr und Sortierreihenfolge verfeinert werden können." },
"aiToolApplyFiltersGenreDesc": { "message": "Das zu filternde Genre." }, "aiToolApplyFiltersTypeParamDesc": { "message": "Der Inhaltstyp, auf den die Filter angewendet werden sollen. Muss 'movie' oder 'series' sein." },
"aiToolApplyFiltersYearDesc": { "message": "Das zu filternde Jahr." }, "aiToolApplyFiltersGenreParamDesc": { "message": "Der Name des Genres, nach dem gefiltert werden soll (z.B. 'Action', 'Drama')." },
"aiToolApplyFiltersSortDesc": { "message": "Die Reihenfolge, in der die Ergebnisse sortiert werden sollen." }, "aiToolApplyFiltersYearParamDesc": { "message": "Das Erscheinungsjahr, nach dem gefiltert werden soll (z.B. '2023')." },
"aiToolPlayMusicByArtistDesc": { "message": "Spielt Musik von einem bestimmten Künstler ab." }, "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)." },
"aiToolPlayMusicByArtistNameDesc": { "message": "Der Name des Künstlers." }, "aiToolPlayMusicByArtistDesc": { "message": "Öffnet den Musik-Player und beginnt mit der Wiedergabe von Liedern eines bestimmten Künstlers aus der Bibliothek des Benutzers." },
"aiToolClearChatHistoryDesc": { "message": "Löscht den Chat-Verlauf." }, "aiToolPlayMusicByArtistNameParamDesc": { "message": "Der genaue Name des Künstlers, dessen Lieder abgespielt werden sollen." },
"aiToolDeleteDatabaseDesc": { "message": "Löscht die Datenbank der Erweiterung." }, "aiToolClearChatHistoryDesc": { "message": "Löscht den gesamten Nachrichtenverlauf der aktuellen Konversation mit dem KI-Assistenten." },
"aiToolUpdateAllTokensDesc": { "message": "Aktualisiert alle Plex-Token." }, "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." },
"aiToolAddPlexTokenDesc": { "message": "Fügt einen neuen Plex-Token hinzu." }, "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." },
"aiToolAddPlexTokenTokenDesc": { "message": "Der hinzuzufügende Plex-Token." }, "aiToolAddPlexTokenDesc": { "message": "Fügt der Konfiguration der Erweiterung einen neuen X-Plex-Token hinzu, wodurch die Anwendung Inhalte von neuen Plex-Servern scannen kann." },
"aiToolChangeRegionDesc": { "message": "Ändert die Region für die Inhaltsentdeckung." }, "aiToolAddPlexTokenTokenParamDesc": { "message": "Die X-Plex-Token-Zeichenfolge, die hinzugefügt werden soll." },
"aiToolChangeRegionRegionDesc": { "message": "Der zweibuchstabige Regionscode (z. B. US, ES, FR)." }, "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." },
"aiToolClearAllFavoritesDesc": { "message": "Löscht alle Benutzerfavoriten." }, "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)." },
"aiToolClearRecommendationsViewDesc": { "message": "Löscht die Empfehlungsansicht." }, "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" } } },
"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" } } },
"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." },
"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" } } },
"aiToolFavoritesCleared": { "message": "Favoriten gelöscht." }, "aiToolFavoritesCleared": { "message": "Favoriten gelöscht." },
"aiToolFavoritesClearError": { "message": "Fehler beim Löschen der Favoriten: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolFavoritesClearError": { "message": "Fehler beim Löschen der Favoriten: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Empfehlungen gelöscht." }, "aiToolRecommendationsCleared": { "message": "Empfehlungen gelöscht." },
"aiToolRecommendationsClearError": { "message": "Fehler beim Löschen der Empfehlungen: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolRecommendationsClearError": { "message": "Fehler beim Löschen der Empfehlungen: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Datenbank gelöscht. Die Seite wird jetzt neu geladen." }, "aiToolDatabaseDeleted": { "message": "Datenbank gelöscht. Die Seite wird neu geladen." },
"aiToolDatabaseDeleteError": { "message": "Fehler beim Löschen der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolDatabaseDeleteError": { "message": "Fehler beim Löschen der Datenbank: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "Das Löschen der Datenbank ist blockiert. Bitte schließen Sie andere Tabs der Anwendung." }, "aiToolDatabaseDeleteBlocked": { "message": "Das Löschen der Datenbank ist blockiert. Schließen Sie andere App-Tabs." },
"aiToolUpdateAllTokensSuccess": { "message": "Alle Token wurden erfolgreich aktualisiert." }, "aiToolUpdateAllTokensSuccess": { "message": "Alle Tokens erfolgreich aktualisiert." },
"aiToolUpdateAllTokensError": { "message": "Fehler beim Aktualisieren der Token: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolUpdateAllTokensError": { "message": "Fehler beim Aktualisieren der Tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Plex-Token erfolgreich hinzugefügt." }, "aiToolAddPlexTokenSuccess": { "message": "Plex-Token erfolgreich hinzugefügt." },
"aiToolAddPlexTokenError": { "message": "Fehler beim Hinzufügen des Plex-Tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "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. Inhalt wird aktualisiert.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Fehler beim Ändern der Region: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolChangeRegionError": { "message": "Fehler beim Ändern der Region: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v2": { "message": "Sie sind ein erfahrener Film- und Serienassistent namens CinePlex. Ihre Hauptfunktion ist es, Benutzern bei der Interaktion mit ihrer Medienbibliothek und der Entdeckung von Inhalten zu helfen. Befolgen Sie diese Regeln: 1. Wenn ein Benutzer nach einer Liste oder Empfehlung fragt (z. B. 'nennen Sie mir 5 Horrorfilme', 'die besten Science-Fiction-Serien'), MÜSSEN Sie Ihr eigenes Wissen verwenden, um die Liste zu erstellen und sie in einem nummerierten oder Aufzählungsformat darzustellen. VERWENDEN Sie KEINE Werkzeuge für diese anfängliche Entdeckungsaufgabe. 2. Nachdem Sie die Liste präsentiert haben, wenn der Benutzer Sie bittet, sie herunterzuladen, zu überprüfen oder eine M3U zu erstellen, DANN und nur dann, verwenden Sie das Werkzeug 'generate_m3u_from_titles_list' und übergeben Sie ihm die Titel, die Sie gerade erwähnt haben. 3. Für jede andere Aktion wie das Navigieren in der App, das Abrufen von Statistiken oder die Suche nach einem BESTIMMTEN TITEL in der Bibliothek des Benutzers, verwenden Sie die entsprechenden Werkzeuge. Seien Sie prägnant, freundlich und effizient." }, "aiToolViewingHistoryCleared": { "message": "Wiedergabeverlauf gelöscht." },
"aiToolSearchLibraryDesc_v2": { "message": "Die Liste der zu verarbeitenden Titel ist leer." }, "aiToolViewingHistoryClearError": { "message": "Fehler beim Löschen des Wiedergabeverlaufs: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolM3UNoLocalMatches": { "message": "Anscheinend haben Sie keinen der Titel aus dieser Liste auf Ihren lokalen Servern." }, "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." },
"aiToolGenerateM3UTypeDesc": { "message": "Der zu suchende Inhaltstyp: 'movie' oder 'series'." },
"aiToolGenerateM3UFilenameDesc": { "message": "Ein benutzerdefinierter Dateiname für die heruntergeladene M3U-Wiedergabeliste." },
"aiToolGenerateM3USuccess": { "message": "Verstanden! Ich erstelle eine M3U-Wiedergabeliste mit $1 Elementen. Der Download sollte in Kürze beginnen.", "placeholders": { "1": { "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. **BEHAUPTEN** Sie **NIEMALS**, eine Aktion ausgeführt zu haben, wenn Sie dafür kein Werkzeug verwendet haben. Sagen Sie zum Beispiel nicht 'Ich habe X heruntergeladen', wenn Sie das Download-Werkzeug nicht verwendet haben. 2. Bei Anfragen nach Empfehlungen oder Listen (z. B. 'gib mir 5 Horrorfilme') verwenden Sie Ihr eigenes Wissen, um die Liste zu erstellen. Präsentieren Sie sie in einem nummerierten oder Aufzählungsformat. Nachdem Sie die Liste angezeigt haben, fragen Sie den Benutzer proaktiv, ob er möchte, dass Sie die Verfügbarkeit auf seinen lokalen Servern überprüfen und eine M3U-Datei erstellen. 3. **NUR** wenn der Benutzer bestätigt, dass er die Liste überprüfen oder herunterladen möchte, verwenden Sie das Werkzeug `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 oder die Suche nach einem bestimmten Titel verwenden Sie die entsprechenden Werkzeuge. Seien Sie immer prägnant, freundlich und effizient." },
"aiToolCheckAndDownloadDesc": { "message": "Überprüft eine Liste von Film- oder Serientiteln mit den lokalen Servern des Benutzers und generiert und lädt bei Übereinstimmungen eine M3U-Wiedergabelistendatei herunter." },
"aiToolGenerateM3UFromTitlesTitlesDesc": { "message": "Eine Liste von Film- oder Serientiteln zum Überprüfen und Herunterladen." },
"aiToolM3UNoTitlesProvided": { "message": "Bitte geben Sie eine Liste von Titeln an, um die Wiedergabeliste zu erstellen." }, "aiToolM3UNoTitlesProvided": { "message": "Bitte geben Sie eine Liste von Titeln an, um die Wiedergabeliste zu erstellen." },
"aiToolM3UCheckingTitles": { "message": "Überprüfe die Titel auf deinen lokalen Servern..." }, "aiToolM3UCheckingTitles": { "message": "Titel werden auf Ihren lokalen Servern überprüft..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Ich konnte keinen der Filme oder Serien aus der Liste auf deinen lokalen Servern finden." }, "aiToolM3UNoLocalMatchesForDownload": { "message": "Ich habe keinen der Filme oder Serien aus der Liste auf Ihren lokalen Servern gefunden." },
"aiToolM3UDownloadStarted": { "message": "Fertig! Ich habe $1 der $2 Titel auf deinen Servern gefunden und den Download der M3U-Wiedergabeliste gestartet.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } } "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" },
"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" } } },
"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" } } },
"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." },
"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" }
} }

View File

@ -1,10 +1,10 @@
{ {
"appName": { "message": "CinePlex" }, "appName": { "message": "CinePlex" },
"appDescription": { "message": "Scans Plex servers to find content and displays it in the interface" }, "appDescription": { "message": "Scans Plex servers to find content and displays it in the interface" },
"appTagline": { "message": "Movies, Series & Music" }, "appTagline": { "message": "Movies, Series, and Music" },
"appLocaleCode": { "message": "en-US" }, "appLocaleCode": { "message": "en" },
"toggleNavigation": { "message": "Toggle Navigation" }, "toggleNavigation": { "message": "Toggle Navigation" },
"searchPlaceholder": { "message": "Search for movies or series..." }, "searchPlaceholder": { "message": "Search movies or series..." },
"openMusicPlayer": { "message": "Open Music Player" }, "openMusicPlayer": { "message": "Open Music Player" },
"settings": { "message": "Settings" }, "settings": { "message": "Settings" },
"navMovies": { "message": "Movies" }, "navMovies": { "message": "Movies" },
@ -16,10 +16,11 @@
"navHistory": { "message": "History" }, "navHistory": { "message": "History" },
"navRecommendations": { "message": "Recommendations" }, "navRecommendations": { "message": "Recommendations" },
"navMusic": { "message": "Music" }, "navMusic": { "message": "Music" },
"navM3uGenerator": { "message": "M3U Generator" },
"heroWelcome": { "message": "" }, "heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Explore thousands of movies and series." }, "heroSubtitle": { "message": "Explore thousands of movies and series." },
"addStream": { "message": "Add Stream" }, "addStream": { "message": "Add Stream" },
"moreInfo": { "message": "More Info" }, "moreInfo": { "message": "More Information" },
"popularMovies": { "message": "Popular Movies" }, "popularMovies": { "message": "Popular Movies" },
"allGenres": { "message": "All Genres" }, "allGenres": { "message": "All Genres" },
"allYears": { "message": "All Years" }, "allYears": { "message": "All Years" },
@ -32,7 +33,7 @@
"loading": { "message": "Loading..." }, "loading": { "message": "Loading..." },
"loadingLibraries": { "message": "Loading libraries..." }, "loadingLibraries": { "message": "Loading libraries..." },
"photosEmptyState": { "message": "No albums or photos found." }, "photosEmptyState": { "message": "No albums or photos found." },
"photosEmptyStateSub": { "message": "Please select a server or make sure you have a photo library in Plex." }, "photosEmptyStateSub": { "message": "Please select a server or ensure you have a photo library in Plex." },
"statsTitle": { "message": "Library Statistics" }, "statsTitle": { "message": "Library Statistics" },
"statsAllTokens": { "message": "All Tokens" }, "statsAllTokens": { "message": "All Tokens" },
"statsAnalyzing": { "message": "Analyzing your library..." }, "statsAnalyzing": { "message": "Analyzing your library..." },
@ -41,16 +42,15 @@
"statsUniqueMovies": { "message": "Unique Movies" }, "statsUniqueMovies": { "message": "Unique Movies" },
"statsUniqueSeries": { "message": "Unique Series" }, "statsUniqueSeries": { "message": "Unique Series" },
"statsUniqueArtists": { "message": "Unique Artists" }, "statsUniqueArtists": { "message": "Unique Artists" },
"statsTokenServers": { "message": "Token's Servers" }, "statsTokenServers": { "message": "Token Servers" },
"statsChartMoviesByGenre": { "message": "Content by Genre (Movies)" }, "statsChartMoviesByGenre": { "message": "Content by Genre (Movies)" },
"statsChartSeriesByGenre": { "message": "Content by Genre (Series)" }, "statsChartSeriesByGenre": { "message": "Content by Genre (Series)" },
"statsChartByDecade": { "message": "Content by Decade" }, "statsChartByDecade": { "message": "Content by Decade" },
"recommendationsTitle": { "message": "Recommendations For You" }, "recommendationsTitle": { "message": "Recommendations for you" },
"historyTitle": { "message": "Viewing History" }, "historyTitle": { "message": "Viewing History" },
"clearHistory": { "message": "Clear All" }, "clearHistory": { "message": "Clear All" },
"consoleTitle": { "message": "Plex Scan Console" }, "consoleTitle": { "message": "Plex Scan Console" },
"footerCredit": { "message": "An interface for your Plex universe." }, "footerCredit": { "message": "An interface for your Plex universe." },
"backButton": { "message": "Back" },
"closeTrailer": { "message": "Close trailer" }, "closeTrailer": { "message": "Close trailer" },
"close": { "message": "Close" }, "close": { "message": "Close" },
"photoViewer": { "message": "Photo Viewer" }, "photoViewer": { "message": "Photo Viewer" },
@ -63,18 +63,20 @@
"settingsTabJellyfin": { "message": "Jellyfin" }, "settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "PHP Generator" }, "settingsTabPhpGen": { "message": "PHP Generator" },
"settingsTabData": { "message": "Data" }, "settingsTabData": { "message": "Data" },
"settingsApiServer": { "message": "API and Server Configuration" }, "settingsApiServer": { "message": "API and Server Settings" },
"settingsTmdbApiLabel": { "message": "TMDB API Key (Optional)" }, "settingsTmdbApiLabel": { "message": "TMDB API Key (Optional)" },
"settingsTmdbApiPlaceholder": { "message": "Will use default key if left blank" }, "settingsTmdbApiPlaceholder": { "message": "Default key will be used if left blank" },
"openaiApiKey": { "message": "OpenAI API Key" }, "settingsGoogleApiLabel": { "message": "Google Gemini API Key (Optional)" },
"settingsTmdbLangLabel": { "message": "Language for TMDB & UI" }, "settingsGoogleApiPlaceholder": { "message": "Required to use AI assistant" },
"settingsRegionLabel": { "message": "Region for content discovery" },
"allRegions": { "message": "All Regions" },
"settingsPhpUrlLabel": { "message": "Server URL for Adding Streams" }, "settingsPhpUrlLabel": { "message": "Server URL for Adding Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://your-server.com/path/to/script.php" }, "settingsPhpUrlPlaceholder": { "message": "https://your-server.com/path/to/script.php" },
"settingsInterface": { "message": "Interface" }, "settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Light Mode" }, "settingsLightTheme": { "message": "Light Mode" },
"settingsShowHero": { "message": "Show 'Hero' welcome section" }, "settingsShowHero": { "message": "Show 'Hero' welcome section" },
"settingsScanContent": { "message": "Content Scanning" }, "settingsScanContent": { "message": "Content Scan" },
"settingsScanDesc": { "message": "Select what to scan and press the button." }, "settingsScanDesc": { "message": "Select what to scan and click the button." },
"settingsScanMovies": { "message": "Movies" }, "settingsScanMovies": { "message": "Movies" },
"settingsScanShows": { "message": "Series" }, "settingsScanShows": { "message": "Series" },
"settingsScanArtists": { "message": "Music" }, "settingsScanArtists": { "message": "Music" },
@ -84,25 +86,25 @@
"settingsPlexTokens": { "message": "Plex Tokens" }, "settingsPlexTokens": { "message": "Plex Tokens" },
"settingsPlexTokensDesc": { "message": "Edit the list of Plex tokens (JSON format)." }, "settingsPlexTokensDesc": { "message": "Edit the list of Plex tokens (JSON format)." },
"settingsSaveTokens": { "message": "Save Tokens" }, "settingsSaveTokens": { "message": "Save Tokens" },
"settingsJellyfinTitle": { "message": "Jellyfin Settings" }, "settingsJellyfinTitle": { "message": "Jellyfin Configuration" },
"settingsJellyfinDesc": { "message": "Add your Jellyfin server details to scan its content." }, "settingsJellyfinDesc": { "message": "Add your Jellyfin server details to scan its content." },
"jellyfinUrlLabel": { "message": "Jellyfin Server URL" }, "jellyfinUrlLabel": { "message": "Jellyfin Server URL" },
"jellyfinUserLabel": { "message": "Username" }, "jellyfinUserLabel": { "message": "Username" },
"jellyfinPassLabel": { "message": "Password" }, "jellyfinPassLabel": { "message": "Password" },
"jellyfinConnectAndScan": { "message": "Connect and Scan" }, "jellyfinConnectAndScan": { "message": "Connect and Scan" },
"settingsPhpGenTitle": { "message": "PHP Server Script Generator" }, "settingsPhpGenTitle": { "message": "PHP Script Generator for Server" },
"settingsPhpFileOptions": { "message": "File Options" }, "settingsPhpFileOptions": { "message": "File Options" },
"settingsPhpSavePathLabel": { "message": "Save Path on Server" }, "settingsPhpSavePathLabel": { "message": "Server Save Path" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/lists (blank for same folder)" }, "settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/lists (blank for same folder)" },
"settingsPhpFilenameLabel": { "message": "Filename" }, "settingsPhpFilenameLabel": { "message": "File Name" },
"settingsPhpFileAction": { "message": "File Action" }, "settingsPhpFileAction": { "message": "File Action" },
"settingsPhpActionAppend": { "message": "Append to the end of the file (cumulative)" }, "settingsPhpActionAppend": { "message": "Append to file (cumulative)" },
"settingsPhpActionOverwrite": { "message": "Overwrite the file (start fresh)" }, "settingsPhpActionOverwrite": { "message": "Overwrite file (start fresh)" },
"settingsPhpSecurity": { "message": "Security (Optional)" }, "settingsPhpSecurity": { "message": "Security (Optional)" },
"settingsPhpUseSecretKey": { "message": "Use secret key (Recommended)" }, "settingsPhpUseSecretKey": { "message": "Use secret key (Recommended)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Enter a secure secret key" }, "settingsPhpSecretKeyPlaceholder": { "message": "Enter a secure secret key" },
"settingsPhpGeneratedCode": { "message": "Generated Code" }, "settingsPhpGeneratedCode": { "message": "Generated Code" },
"settingsPhpGeneratedPlaceholder": { "message": "The generated PHP code will appear here." }, "settingsPhpGeneratedPlaceholder": { "message": "Generated PHP code will appear here." },
"settingsGenerateScript": { "message": "Generate Script" }, "settingsGenerateScript": { "message": "Generate Script" },
"settingsCopyScript": { "message": "Copy Script" }, "settingsCopyScript": { "message": "Copy Script" },
"settingsDataManagement": { "message": "Local Database Management" }, "settingsDataManagement": { "message": "Local Database Management" },
@ -115,12 +117,12 @@
"musicSidenavTitle": { "message": "Plex Music" }, "musicSidenavTitle": { "message": "Plex Music" },
"musicAllServers": { "message": "All Servers" }, "musicAllServers": { "message": "All Servers" },
"musicSearchArtistPlaceholder": { "message": "Search artist..." }, "musicSearchArtistPlaceholder": { "message": "Search artist..." },
"musicSearchDiscographyPlaceholder": { "message": "Search in discography..." }, "musicSearchDiscographyPlaceholder": { "message": "Search discography..." },
"musicNothingPlaying": { "message": "Nothing playing" }, "musicNothingPlaying": { "message": "Nothing playing" },
"musicSelectSong": { "message": "Select a song" }, "musicSelectSong": { "message": "Select a song" },
"musicToStart": { "message": "to start playing" }, "musicToStart": { "message": "to start playing" },
"miniplayerDownloadSong": { "message": "Download song" }, "miniplayerDownloadSong": { "message": "Download song" },
"miniplayerDownloadAlbum": { "message": "Download M3U album" }, "miniplayerDownloadAlbum": { "message": "Download album M3U" },
"miniplayerVolume": { "message": "Volume" }, "miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Shuffle" }, "miniplayerShuffle": { "message": "Shuffle" },
"miniplayerEqualizer": { "message": "Equalizer" }, "miniplayerEqualizer": { "message": "Equalizer" },
@ -133,7 +135,7 @@
"eqPresetJazz": { "message": "Jazz" }, "eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Classical" }, "eqPresetClassical": { "message": "Classical" },
"eqPresetBassBoost": { "message": "Bass Boost" }, "eqPresetBassBoost": { "message": "Bass Boost" },
"eqPreampLabel": { "message": "Pre-Amp" }, "eqPreampLabel": { "message": "Preamp" },
"infoModalTitle": { "message": "Information" }, "infoModalTitle": { "message": "Information" },
"infoModalFieldTitle": { "message": "Title:" }, "infoModalFieldTitle": { "message": "Title:" },
"infoModalFieldArtist": { "message": "Artist:" }, "infoModalFieldArtist": { "message": "Artist:" },
@ -148,39 +150,39 @@
"lang_it": { "message": "Italian" }, "lang_it": { "message": "Italian" },
"lang_pt": { "message": "Portuguese" }, "lang_pt": { "message": "Portuguese" },
"essentialFeaturesNotSupported": { "message": "Your browser does not support essential features." }, "essentialFeaturesNotSupported": { "message": "Your browser does not support essential features." },
"dbAccessError": { "message": "Error accessing the local database." }, "dbAccessError": { "message": "Error accessing local database." },
"dbUpdateNeeded": { "message": "The database needs to be updated, please reload the page." }, "dbUpdateNeeded": { "message": "Database needs updating, please reload the page." },
"dbBlocked": { "message": "Please close other tabs of this application to continue." }, "dbBlocked": { "message": "Please close other tabs of this app to continue." },
"deletingContentData": { "message": "Deleting local content data..." }, "deletingContentData": { "message": "Deleting local content data..." },
"noContentDataToDelete": { "message": "No content data to delete." }, "noContentDataToDelete": { "message": "No content data to delete." },
"contentDataDeleted": { "message": "Content data deleted from IndexedDB." }, "contentDataDeleted": { "message": "Content data deleted from IndexedDB." },
"errorDeletingData": { "message": "Error deleting data: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorDeletingData": { "message": "Error deleting data: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Text editor not available." }, "aceEditorNotAvailable": { "message": "Text editor not available." },
"errorLoadingTokens": { "message": "Error loading tokens to editor." }, "errorLoadingTokens": { "message": "Error loading tokens for editing." },
"errorLoadingTokensMessage": { "message": "Error loading tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingTokensMessage": { "message": "Error loading tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor not available for saving." }, "aceEditorNotAvailableToSave": { "message": "Editor not available to save." },
"invalidJsonFormat": { "message": "Invalid JSON format. Must be { \"tokens\": [...] }" }, "invalidJsonFormat": { "message": "Invalid JSON format. Must be { \"tokens\": [...] }" },
"tokensSaved": { "message": "Tokens saved successfully." }, "tokensSaved": { "message": "Tokens saved successfully." },
"errorSavingTokens": { "message": "Error saving tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorSavingTokens": { "message": "Error saving tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB is not available." }, "dbNotAvailable": { "message": "IndexedDB is not available." },
"dbExported": { "message": "Database exported successfully." }, "dbExported": { "message": "Database exported successfully." },
"errorExportingDb": { "message": "Error exporting database: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorExportingDb": { "message": "Error exporting database: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "The file does not contain a valid JSON object." }, "invalidJsonFile": { "message": "File does not contain a valid JSON object." },
"noDataToImport": { "message": "The file does not contain data for the current DB sections." }, "noDataToImport": { "message": "File contains no data for current DB sections." },
"dbImported": { "message": "Database imported successfully." }, "dbImported": { "message": "Database imported successfully." },
"errorImportingDb": { "message": "Error importing database: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorImportingDb": { "message": "Error importing database: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Updating view with new data..." }, "updatingView": { "message": "Updating 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." }, "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." }, "trailerNotFound": { "message": "No trailer found for this title." },
"confirmClearHistory": { "message": "Are you sure you want to delete your entire viewing history? This action cannot be undone." }, "confirmClearHistory": { "message": "Are you sure you want to clear all your viewing history? This action cannot be undone." },
"historyCleared": { "message": "Viewing history cleared." }, "historyCleared": { "message": "Viewing history cleared." },
"historyItemDeleted": { "message": "Item deleted from history." }, "historyItemDeleted": { "message": "Item deleted from history." },
"errorGeneratingScript": { "message": "First, generate a script to be able to copy it." }, "errorGeneratingScript": { "message": "First generate a script to copy it." },
"scriptCopied": { "message": "PHP script copied to clipboard." }, "scriptCopied": { "message": "PHP script copied to clipboard." },
"errorCopyingScript": { "message": "Error copying script." }, "errorCopyingScript": { "message": "Error copying script." },
"scriptGenerated": { "message": "PHP script generated." }, "scriptGenerated": { "message": "PHP script generated." },
"errorLoadingAlbum": { "message": "Error loading album: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingAlbum": { "message": "Error loading album: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Error: No photo server has been selected." }, "noPhotoServerSelected": { "message": "Error: No photo server selected." },
"loadingGenres": { "message": "Loading genres..." }, "loadingGenres": { "message": "Loading genres..." },
"errorLoadingGenres": { "message": "Error loading" }, "errorLoadingGenres": { "message": "Error loading" },
"noContentFound": { "message": "No results found." }, "noContentFound": { "message": "No results found." },
@ -193,14 +195,14 @@
"noRecommendations": { "message": "We need to know you better to give you recommendations!" }, "noRecommendations": { "message": "We need to know you better to give you recommendations!" },
"errorGeneratingStats": { "message": "Error generating statistics." }, "errorGeneratingStats": { "message": "Error generating statistics." },
"noServersForToken": { "message": "No associated servers found for this token." }, "noServersForToken": { "message": "No associated servers found for this token." },
"searchingActorContent": { "message": "Searching for content from $actorName$", "placeholders": { "actorName": { "content": "$1" } } }, "searchingActorContent": { "message": "Searching content for $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Could not load content for $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" } } }, "errorAddingStream": { "message": "Error adding stream(s): $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "The PHP server URL is not configured. Please set it up in Settings." }, "phpUrlNotConfigured": { "message": "PHP server URL is not configured. Please configure it in Settings." },
"searchingStreams": { "message": "Searching for streams for \"$title$\"...", "placeholders": { "title": { "content": "$1" } } }, "searchingStreams": { "message": "Searching streams for \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Sending $count$ stream(s) to the server...", "placeholders": { "count": { "content": "$1" } } }, "sendingStreams": { "message": "Sending $count$ stream(s) to server...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) added successfully." }, "streamAddedSuccess": { "message": "Stream(s) added successfully." },
"generatingM3U": { "message": "Generating M3U for \"$title$\"...", "placeholders": { "title": { "content": "$1" } } }, "generatingM3U": { "message": "Generating M3U for \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"$title$\" downloaded.", "placeholders": { "title": { "content": "$1" } } }, "m3uDownloaded": { "message": "\"$title$\" downloaded.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Error generating M3U: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorGeneratingM3U": { "message": "Error generating M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Settings saved successfully." }, "settingsSavedSuccess": { "message": "Settings saved successfully." },
@ -212,42 +214,22 @@
"plexScanStarting": { "message": "Starting Plex scan..." }, "plexScanStarting": { "message": "Starting Plex scan..." },
"noPlexTokens": { "message": "No Plex tokens configured." }, "noPlexTokens": { "message": "No Plex tokens configured." },
"clearingSections": { "message": "Clearing sections: $sections$", "placeholders": { "sections": { "content": "$1" } } }, "clearingSections": { "message": "Clearing sections: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"sectionsCleared": { "message": "Sections cleared." },
"tokenFoundServers": { "message": "Token $token$... found $count$ servers.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Error processing token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"initialScanPhaseComplete": { "message": "Initial scan phase completed." }, "initialScanPhaseComplete": { "message": "Initial scan phase completed." },
"retryPhaseFinished": { "message": "Retry phase finished." }, "retryPhaseFinished": { "message": "Retry phase finished." },
"plexScanFinished": { "message": "Plex scan finished. Updating content..." }, "plexScanFinished": { "message": "Scan finished. Updating content..." },
"plexScanFatalError": { "message": "FATAL ERROR: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Error during scan: $message$", "placeholders": { "message": { "content": "$1" } } },
"scanCancelled": { "message": "Scan cancelled by user." }, "scanCancelled": { "message": "Scan cancelled by user." },
"scanCancelledInfo": { "message": "Scan cancelled." }, "scanCancelledInfo": { "message": "Scan cancelled." },
"retyingSection": { "message": "Retrying section \"$title$\"...", "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" } } },
"noRetriesPending": { "message": "No pending retries." },
"startingRetryPhase": { "message": "Starting retry phase for $count$ sections...", "placeholders": { "count": { "content": "$1" } } },
"retryPhaseCancelled": { "message": "Retry phase cancelled." },
"errorInitializingMusicPlayer": { "message": "Error initializing music player." }, "errorInitializingMusicPlayer": { "message": "Error initializing music player." },
"criticalErrorLoadingMusic": { "message": "Critical error loading music data." }, "criticalErrorLoadingMusic": { "message": "Critical error loading music data." },
"errorLoadingArtists": { "message": "Error loading artists." }, "errorLoadingArtists": { "message": "Error loading artists." },
"dbUnavailableError": { "message": "Error: Database not available." }, "dbUnavailableError": { "message": "Error: Database unavailable." },
"updatingMusicData": { "message": "Updating music data..." }, "updatingMusicData": { "message": "Updating music data..." },
"musicDataUpdated": { "message": "Music data updated." }, "musicDataUpdated": { "message": "Music data updated." },
"errorFetchingArtistSongs": { "message": "Error getting artist's songs." }, "errorFetchingArtistSongs": { "message": "Error fetching artist songs." },
"errorLoadingSongs": { "message": "Error loading songs." }, "errorLoadingSongs": { "message": "Error loading songs." },
"noArtistsFound": { "message": "No artists found." }, "noArtistsFound": { "message": "No artists found." },
"artistsCounter": { "message": "$start$-$end$ of $total$", "placeholders": { "start": { "content": "$1" }, "end": { "content": "$2" }, "total": { "content": "$3" } } },
"artistsCounterSingle": { "message": "$total$ Artists", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Loading..." },
"noSongsFound": { "message": "No songs found." },
"shuffleOn": { "message": "Shuffle mode enabled." }, "shuffleOn": { "message": "Shuffle mode enabled." },
"shuffleOff": { "message": "Shuffle mode disabled." }, "shuffleOff": { "message": "Shuffle mode disabled." },
"downloadingSong": { "message": "Starting download of \"$title$\"...", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" downloaded.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Error downloading \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Generating M3U for \"$artist$\"...", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U for album \"$artist$\" generated.", "placeholders": { "artist": { "content": "$1" } } },
"playbackError": { "message": "Playback error" }, "playbackError": { "message": "Playback error" },
"errorLabel": { "message": "Error" }, "errorLabel": { "message": "Error" },
"reloadingPage": { "message": "Reloading page..." }, "reloadingPage": { "message": "Reloading page..." },
@ -261,29 +243,29 @@
"searchResultsFor": {"message": "Results for \"$query$\"", "placeholders": {"query": {"content": "$1"}}}, "searchResultsFor": {"message": "Results for \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Content from $actor$", "placeholders": {"actor": {"content": "$1"}}}, "contentFrom": {"message": "Content from $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Explore"}, "explore": {"message": "Explore"},
"noGenre": {"message": "Uncategorized"}, "noGenre": {"message": "No category"},
"synopsis": {"message": "Synopsis"}, "synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "No synopsis available."}, "noSynopsis": {"message": "No synopsis available."},
"director": {"message": "Director:"}, "director": {"message": "Director:"},
"writer": {"message": "Writer:"}, "writer": {"message": "Writer:"},
"viewOnImdb": {"message": "View on IMDb"}, "viewOnImdb": {"message": "View on IMDb"},
"watchTrailer": {"message": "Watch Trailer"}, "watchTrailer": {"message": "Watch Trailer"},
"addToFavorites": {"message": "Favorite"}, "addToFavorites": {"message": "Add to favorites"},
"removeFromFavorites": {"message": "Unfavorite"}, "removeFromFavorites": {"message": "Remove from favorites"},
"notAvailable": {"message": "Not Available"}, "notAvailable": {"message": "Not available"},
"mainCast": {"message": "Main Cast"}, "mainCast": {"message": "Main Cast"},
"seasonsAndEpisodes": {"message": "Seasons & Episodes"}, "seasonsAndEpisodes": {"message": "Seasons and Episodes"},
"similarContent": {"message": "Similar Content"}, "similarContent": {"message": "Similar Content"},
"episodesCount": {"message": "$count$ Episodes", "placeholders": {"count": {"content": "$1"}}}, "episodesCount": {"message": "$count$ Episodes", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Seasons", "placeholders": {"count": {"content": "$1"}}}, "seasonsCount": {"message": "$count$ Seasons", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}}, "runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "No trailer was found for this title."}, "noTrailerFound": {"message": "No trailer found for this title."},
"fatalInitError": {"message": "Fatal Initialization Error"}, "fatalInitError": {"message": "Fatal initialization error"},
"fatalInitErrorSub": {"message": "The application could not be loaded."}, "fatalInitErrorSub": {"message": "Could not load the application."},
"invalidStreamInfo": {"message": "Invalid information."}, "invalidStreamInfo": {"message": "Invalid information."},
"dbUnavailableForStreams": {"message": "Local database not available."}, "dbUnavailableForStreams": {"message": "Local database unavailable."},
"noPlexServersForStreams": {"message": "No Plex servers."}, "noPlexServersForStreams": {"message": "No Plex servers."},
"notFoundOnServers": {"message": "\"$query$\" not found on servers.", "placeholders": {"query": {"content": "$1"}}}, "notFoundOnServers": {"message": "Could not find \"$query$\" on Plex servers.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Just now" }, "relativeTime_justNow": { "message": "Just now" },
"relativeTime_minutesAgo": { "message": "$count$ minutes ago", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_minutesAgo": { "message": "$count$ minutes ago", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "$count$ hours ago", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_hoursAgo": { "message": "$count$ hours ago", "placeholders": { "count": { "content": "$1" } } },
@ -291,33 +273,33 @@
"relativeTime_daysAgo": { "message": "$count$ days ago", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_daysAgo": { "message": "$count$ days ago", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Error Loading Details" }, "errorLoadingDetails": { "message": "Error Loading Details" },
"errorLoadingLocalContent": { "message": "Error loading local content." }, "errorLoadingLocalContent": { "message": "Error loading local content." },
"errorServerResponse": { "message": "Unsuccessful response from server." }, "errorServerResponse": { "message": "Unsuccessful server response." },
"errorPlexApi": { "message": "Error $status$ from Plex API.", "placeholders": { "status": { "content": "$1" } } }, "errorPlexApi": { "message": "Plex API error $status$.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Error parsing Plex XML." }, "errorParsingPlexXml": { "message": "Error parsing Plex XML." },
"untitled": { "message": "Untitled" }, "untitled": { "message": "Untitled" },
"itemCount": { "message": "$count$ items", "placeholders": { "count": { "content": "$1" } } }, "itemCount": { "message": "$count$ items", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "No photo servers" }, "noPhotoServers": { "message": "No photo servers" },
"jellyfinScanInProgress": { "message": "Jellyfin scan is already in progress." }, "jellyfinScanInProgress": { "message": "Jellyfin scan is already in progress." },
"jellyfinScanning": { "message": "Scanning Jellyfin..." }, "jellyfinScanning": { "message": "Scanning Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Please complete the Jellyfin URL and username." }, "jellyfinMissingCredentials": { "message": "Please fill in Jellyfin URL and username." },
"jellyfinConnecting": { "message": "Connecting to Jellyfin at: $url$", "placeholders": { "url": { "content": "$1" } } }, "jellyfinConnecting": { "message": "Connecting to Jellyfin at: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Jellyfin authentication failed: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinAuthFailed": { "message": "Jellyfin authentication failed: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Jellyfin authentication successful." }, "jellyfinAuthSuccess": { "message": "Jellyfin authentication successful." },
"jellyfinFetchingLibraries": { "message": "Fetching libraries..." }, "jellyfinFetchingLibraries": { "message": "Fetching libraries..." },
"jellyfinFetchFailed": { "message": "Failed to fetch libraries: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinFetchFailed": { "message": "Error fetching libraries: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "No movie or series libraries found on Jellyfin." }, "jellyfinNoMediaLibraries": { "message": "No movie or series libraries found in Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ media library(s) found.", "placeholders": { "count": { "content": "$1" } } }, "jellyfinLibrariesFound": { "message": "$count$ media library(ies) found.", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Success] Scanned '$libraryName, added $count$ titles.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } }, "jellyfinLibraryScanSuccess": { "message": "[Success] '$libraryName$' scanned, $count$ titles added.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Failed to scan library '$libraryName.", "placeholders": { "libraryName": { "content": "$1" } } }, "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" } } }, "jellyfinScanSuccess": { "message": "Jellyfin scan completed. Added $movies$ movies and $series$ series.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Jellyfin credentials not configured." }, "noJellyfinCredentials": { "message": "Jellyfin credentials not configured." },
"notFoundOnJellyfin": { "message": "\"$query$\" not found on Jellyfin.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnJellyfin": { "message": "Could not find \"$query$\" on Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" not found on any server.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnAnyServer": { "message": "Could not find \"$query$\" on any server.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "On Plex" }, "localOnPlex": { "message": "On Plex" },
"searchOnPlex": { "message": "Search on Plex" }, "searchOnPlex": { "message": "Search on Plex" },
"jellyfinTitle": { "message": "Jellyfin Content" }, "jellyfinTitle": { "message": "Jellyfin Content" },
"noJellyfinContent": { "message": "No Jellyfin content found." }, "noJellyfinContent": { "message": "No Jellyfin content found." },
"noJellyfinContentSub": { "message": "Make sure you have scanned your Jellyfin server in the settings." }, "noJellyfinContentSub": { "message": "Make sure you have scanned your Jellyfin server in settings." },
"activityViewerTitle": { "message": "Server Activity Viewer" }, "activityViewerTitle": { "message": "Server Activity Viewer" },
"activitySelectServer": { "message": "Select a server" }, "activitySelectServer": { "message": "Select a server" },
"activityCheckBtn": { "message": "Refresh" }, "activityCheckBtn": { "message": "Refresh" },
@ -328,96 +310,132 @@
"activitySessionState": { "message": "State" }, "activitySessionState": { "message": "State" },
"activitySessionIdentifier": { "message": "Client Identifier" }, "activitySessionIdentifier": { "message": "Client Identifier" },
"activityCopyID": { "message": "Copy ID" }, "activityCopyID": { "message": "Copy ID" },
"activityError": { "message": "Could not fetch server activity." }, "activityError": { "message": "Could not get server activity." },
"activityCopied": { "message": "Identifier copied to clipboard!" }, "activityCopied": { "message": "Identifier copied to clipboard!" },
"activityCopyError": { "message": "Failed to copy identifier." }, "activityCopyError": { "message": "Error copying identifier." },
"noProvidersFound": { "message": "No providers found." }, "noProvidersFound": { "message": "No providers found." },
"availableOnPlex": { "message": "Available on Plex" }, "availableOnPlex": { "message": "Available on Plex" },
"navM3uGenerator": { "message": "M3U Generator" }, "m3uGeneratorTitle": { "message": "M3U List Generator" },
"m3uGeneratorTitle": { "message": "M3U Playlist Generator" },
"selectAServer": { "message": "Select a server..." }, "selectAServer": { "message": "Select a server..." },
"downloadM3u": { "message": "Download M3U" }, "downloadM3u": { "message": "Download M3U" },
"m3uGenerator": { "message": "M3U Generator" }, "m3uGenerator": { "message": "M3U Generator" },
"selectServer": { "message": "Select Server" },
"selectLibraries": { "message": "Select Libraries" }, "selectLibraries": { "message": "Select Libraries" },
"howToUse": { "message": "How to Use" }, "howToUse": { "message": "How To Use" },
"m3uInstruction1": { "message": "Choose a server from the list." }, "m3uInstruction1": { "message": "Choose a server from the list." },
"m3uInstruction2": { "message": "Select one or more libraries to include." }, "m3uInstruction2": { "message": "Select one or more libraries to include." },
"m3uInstruction3": { "message": "Click the download button." }, "m3uInstruction3": { "message": "Click the download button." },
"m3uInstruction4": { "message": "Import the .m3u file into your compatible player." }, "m3uInstruction4": { "message": "Import the .m3u file into your compatible player." },
"settingsRegionLabel": { "message": "Region for content discovery" },
"allRegions": { "message": "All regions" },
"chatOpen": { "message": "Open Chat" }, "chatOpen": { "message": "Open Chat" },
"chatTitle": { "message": "AI Assistant" }, "chatTitle": { "message": "AI Assistant" },
"chatClose": { "message": "X" }, "chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Type your message..." }, "chatPlaceholder": { "message": "Type your message..." },
"chatSend": { "message": "➤" }, "chatSend": { "message": "➤" },
"chatGptError": { "message": "Sorry, I couldn't get a response. Please try again." }, "chatWelcome": { "message": "Welcome! I'm your CinePlex assistant. Ask me about movies, series, or anything else you want to know." },
"chatWelcome": { "message": "Welcome! I'm your CinePlex assistant. Ask me about movies, series, or anything else you'd like to know." }, "chatGoogleApiKeyMissing": { "message": "Google Gemini API key is not configured. Please set it in the extension settings to use the AI assistant." },
"chatApiKeyMissing": { "message": "OpenAI API key is not set. Please configure it in the extension settings." },
"chatApiInvalidResponse": { "message": "The API returned an invalid response. Please try again." }, "chatApiInvalidResponse": { "message": "The API returned an invalid response. Please try again." },
"chatApiError": { "message": "Error communicating with the AI assistant" }, "chatApiError": { "message": "Error communicating with the AI assistant" },
"downloadAll": { "message": "Download All" }, "downloadAll": { "message": "Download all" },
"download": { "message": "Download" }, "download": { "message": "Download" },
"aiToolSearchLibraryDesc": { "message": "Searches the Plex library for movies or series." }, "aiToolSearchLibraryDesc": { "message": "Searches the user's Plex library for movies or series by title." },
"aiToolSearchLibraryQueryDesc": { "message": "The title to search for." }, "aiToolSearchLibraryQueryParamDesc": { "message": "The title of the movie or series to search for." },
"aiToolSearchLibraryTypeDesc": { "message": "The type of content to search for (movie or series)." }, "aiToolSearchLibraryTypeParamDesc": { "message": "The type of content to search for. Can be 'movie' for movies or 'series' for series. (Optional)." },
"aiToolNavigateToPageDesc": { "message": "Navigates to a specific page in the application." }, "aiToolNavigateToPageDesc": { "message": "Navigates the user to a specific page of the application interface." },
"aiToolNavigateToPagePageDesc": { "message": "The page to navigate to." }, "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": "Gets user statistics." }, "aiToolGetUserStatsDesc": { "message": "Retrieves and displays the user's library statistics, such as the total number of unique movies, series, and artists." },
"aiToolShowItemDetailsDesc": { "message": "Shows the details of a movie or series." }, "aiToolShowItemDetailsDesc": { "message": "Displays the details page for a specific movie or series by its title and type." },
"aiToolShowItemDetailsTitleDesc": { "message": "The title of the movie or series." }, "aiToolShowItemDetailsTitleParamDesc": { "message": "The exact title of the movie or series." },
"aiToolShowItemDetailsTypeDesc": { "message": "The type of content (movie or series)." }, "aiToolShowItemDetailsTypeParamDesc": { "message": "The type of content. Must be 'movie' or 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Adds a movie or series to the playlist." }, "aiToolAddToPlaylistDesc": { "message": "Adds a movie or series to the user's current playlist to stream to a configured PHP server." },
"aiToolAddToPlaylistTitleDesc": { "message": "The title of the movie or series." }, "aiToolAddToPlaylistTitleParamDesc": { "message": "The title of the movie or series to add." },
"aiToolAddToPlaylistTypeDesc": { "message": "The type of content (movie or series)." }, "aiToolAddToPlaylistTypeParamDesc": { "message": "The type of content. Must be 'movie' or 'series'." },
"aiToolDownloadPlaylistDesc": { "message": "Downloads the playlist for a 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." },
"aiToolDownloadPlaylistTitleDesc": { "message": "The title of the movie or series." }, "aiToolCheckAndDownloadTitlesParamDesc": { "message": "An array of movie or series titles to search for and download." },
"aiToolDownloadPlaylistTypeDesc": { "message": "The type of content (movie or series)." }, "aiToolCheckAndDownloadTypeParamDesc": { "message": "The content type of the list. Must be 'movie' or 'series'." },
"aiToolToggleFavoriteDesc": { "message": "Adds or removes a movie or series from favorites." }, "aiToolCheckAndDownloadFilenameParamDesc": { "message": "The name of the M3U file to download (e.g., 'MyList.m3u'). If not provided, a default name will be used." },
"aiToolToggleFavoriteTitleDesc": { "message": "The title of the movie or series." }, "aiToolToggleFavoriteDesc": { "message": "Adds or removes a movie or series from the user's favorites list." },
"aiToolToggleFavoriteTypeDesc": { "message": "The type of content (movie or series)." }, "aiToolToggleFavoriteTitleParamDesc": { "message": "The title of the movie or series." },
"aiToolGetRecommendationsDesc": { "message": "Gets recommendations for the user." }, "aiToolToggleFavoriteTypeParamDesc": { "message": "The type of content. Must be 'movie' or 'series'." },
"aiToolApplyFiltersDesc": { "message": "Applies filters to the current view." }, "aiToolGetRecommendationsDesc": { "message": "Generates and displays a list of movie or series recommendations based on the user's viewing history and favorites." },
"aiToolApplyFiltersTypeDesc": { "message": "The type of content to filter (movie or series)." }, "aiToolApplyFiltersDesc": { "message": "Applies filters to the current movie or series view, allowing refinement of results by type, genre, year, and sort order." },
"aiToolApplyFiltersGenreDesc": { "message": "The genre to filter by." }, "aiToolApplyFiltersTypeParamDesc": { "message": "The type of content to apply filters to. Must be 'movie' or 'series'." },
"aiToolApplyFiltersYearDesc": { "message": "The year to filter by." }, "aiToolApplyFiltersGenreParamDesc": { "message": "The name of the genre to filter by (e.g., 'Action', 'Drama')." },
"aiToolApplyFiltersSortDesc": { "message": "The order in which to sort the results." }, "aiToolApplyFiltersYearParamDesc": { "message": "The release year to filter by (e.g., '2023')." },
"aiToolPlayMusicByArtistDesc": { "message": "Plays music by a specific artist." }, "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)." },
"aiToolPlayMusicByArtistNameDesc": { "message": "The name of the artist." }, "aiToolPlayMusicByArtistDesc": { "message": "Opens the music player and starts playing songs by a specific artist from the user's library." },
"aiToolClearChatHistoryDesc": { "message": "Clears the chat history." }, "aiToolPlayMusicByArtistNameParamDesc": { "message": "The exact name of the artist whose songs are desired to be played." },
"aiToolDeleteDatabaseDesc": { "message": "Deletes the extension's database." }, "aiToolClearChatHistoryDesc": { "message": "Clears all message history from the current conversation with the AI assistant." },
"aiToolUpdateAllTokensDesc": { "message": "Updates all Plex tokens." }, "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." },
"aiToolAddPlexTokenDesc": { "message": "Adds a new Plex token." }, "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." },
"aiToolAddPlexTokenTokenDesc": { "message": "The Plex token to add." }, "aiToolAddPlexTokenDesc": { "message": "Adds a new X-Plex token to the extension's configuration, allowing the app to scan content from new Plex servers." },
"aiToolChangeRegionDesc": { "message": "Changes the region for content discovery." }, "aiToolAddPlexTokenTokenParamDesc": { "message": "The X-Plex token string to add." },
"aiToolChangeRegionRegionDesc": { "message": "The two-letter region code (e.g., US, ES, FR)." }, "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." },
"aiToolClearAllFavoritesDesc": { "message": "Clears all user favorites." }, "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)." },
"aiToolClearRecommendationsViewDesc": { "message": "Clears the recommendations view." }, "aiToolClearAllFavoritesDesc": { "message": "Removes all movies and series 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" } } },
"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" } } },
"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." },
"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" } } },
"aiToolFavoritesCleared": { "message": "Favorites cleared." }, "aiToolFavoritesCleared": { "message": "Favorites cleared." },
"aiToolFavoritesClearError": { "message": "Error clearing favorites: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolFavoritesClearError": { "message": "Error clearing favorites: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recommendations cleared." }, "aiToolRecommendationsCleared": { "message": "Recommendations cleared." },
"aiToolRecommendationsClearError": { "message": "Error clearing recommendations: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolRecommendationsClearError": { "message": "Error clearing recommendations: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Database deleted. The page will now reload." }, "aiToolDatabaseDeleted": { "message": "Database deleted. The page will reload." },
"aiToolDatabaseDeleteError": { "message": "Error deleting database: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolDatabaseDeleteError": { "message": "Error deleting database: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "Database deletion is blocked. Please close other tabs of the application." }, "aiToolDatabaseDeleteBlocked": { "message": "Database deletion is blocked. Close other app tabs." },
"aiToolUpdateAllTokensSuccess": { "message": "All tokens have been updated successfully." }, "aiToolUpdateAllTokensSuccess": { "message": "All tokens updated successfully." },
"aiToolUpdateAllTokensError": { "message": "Error updating tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolUpdateAllTokensError": { "message": "Error updating tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Plex token added successfully." }, "aiToolAddPlexTokenSuccess": { "message": "Plex token added successfully." },
"aiToolAddPlexTokenError": { "message": "Error adding Plex token: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolAddPlexTokenError": { "message": "Error adding Plex token: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Region changed to $region$. Content is being updated.", "placeholders": { "region": { "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" } } }, "aiToolChangeRegionError": { "message": "Error changing region: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v2": { "message": "You are an expert film and series assistant named CinePlex. Your main function is to help users interact with their media library and discover content. Follow these rules: 1. When a user asks for a list or recommendation (e.g., 'tell me 5 horror movies', 'the best science fiction series'), you MUST use your own knowledge to generate the list and present it in a numbered or bulleted format. DO NOT use tools for this initial discovery task. 2. After presenting the list, if the user asks you to download it, check it, or create an M3U, THEN and only then, use the 'generate_m3u_from_titles_list' tool, passing it the titles you just mentioned. 3. For any other action such as navigating the app, getting statistics, or searching for a SPECIFIC TITLE in the user's library, use the appropriate tools. Be concise, friendly, and efficient." }, "aiToolViewingHistoryCleared": { "message": "Viewing history cleared." },
"aiToolSearchLibraryDesc_v2": { "message": "The list of titles to process is empty." }, "aiToolViewingHistoryClearError": { "message": "Error clearing viewing history: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolM3UNoLocalMatches": { "message": "It seems you don't have any of the titles from that list on your local servers." }, "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." },
"aiToolGenerateM3UTypeDesc": { "message": "The type of content to search for: 'movie' or 'series'." },
"aiToolGenerateM3UFilenameDesc": { "message": "A custom filename for the downloaded M3U playlist." },
"aiToolGenerateM3USuccess": { "message": "Got it! I'm generating an M3U playlist with $1 items. The download should start shortly.", "placeholders": { "1": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "You are an expert film and series assistant named CinePlex. Your main function is to help users discover content and interact with their library. Follow these rules rigorously: 1. **NEVER** claim to have performed an action if you haven't used a tool for it. For example, do not say 'I have downloaded X' if you have not used the download tool. 2. For requests for recommendations or lists (e.g., 'give 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 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 like navigating, getting statistics, or searching for a specific title, use the appropriate tools. Always be concise, friendly, and efficient." },
"aiToolCheckAndDownloadDesc": { "message": "Checks a list of movie or series titles against the user's local servers and, if matches are found, generates and downloads an M3U playlist file." },
"aiToolGenerateM3UFromTitlesTitlesDesc": { "message": "A list of movie or series titles to check and download." },
"aiToolM3UNoTitlesProvided": { "message": "Please provide a list of titles to create the playlist." }, "aiToolM3UNoTitlesProvided": { "message": "Please provide a list of titles to create the playlist." },
"aiToolM3UCheckingTitles": { "message": "Checking the titles on your local servers..." }, "aiToolM3UCheckingTitles": { "message": "Checking titles on your local servers..." },
"aiToolM3UNoLocalMatchesForDownload": { "message": "I couldn't find any of the movies or series from the list 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 the $2 titles on your servers and have started the download of the M3U playlist.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } } "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" } } },
"backToProviders": { "message": "Back to Providers" },
"artistsCounterSingle": { "message": "$total$ Artist", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Loading..." },
"downloadingSong": { "message": "Starting download of \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" downloaded.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Error downloading \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"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" } } },
"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" } } },
"errorProcessingToken": { "message": "Error processing token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "FATAL ERROR: $message$", "placeholders": { "message": { "content": "$1" } } },
"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." },
"tokenAddedSuccessfully": { "message": "Token added successfully." },
"noStreamsFoundForSelection": { "message": "No streams found for selection." },
"autoplayBlocked": { "message": "Autoplay blocked." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Page" }
} }

View File

@ -16,6 +16,7 @@
"navHistory": { "message": "Historial" }, "navHistory": { "message": "Historial" },
"navRecommendations": { "message": "Recomendaciones" }, "navRecommendations": { "message": "Recomendaciones" },
"navMusic": { "message": "Música" }, "navMusic": { "message": "Música" },
"navM3uGenerator": { "message": "Generador M3U" },
"heroWelcome": { "message": "" }, "heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Explora miles de películas y series." }, "heroSubtitle": { "message": "Explora miles de películas y series." },
"addStream": { "message": "Añadir Stream" }, "addStream": { "message": "Añadir Stream" },
@ -50,7 +51,6 @@
"clearHistory": { "message": "Borrar Todo" }, "clearHistory": { "message": "Borrar Todo" },
"consoleTitle": { "message": "Consola de Escaneo Plex" }, "consoleTitle": { "message": "Consola de Escaneo Plex" },
"footerCredit": { "message": "Una interfaz para tu universo Plex." }, "footerCredit": { "message": "Una interfaz para tu universo Plex." },
"backButton": { "message": "Atrás" },
"closeTrailer": { "message": "Cerrar tráiler" }, "closeTrailer": { "message": "Cerrar tráiler" },
"close": { "message": "Cerrar" }, "close": { "message": "Cerrar" },
"photoViewer": { "message": "Visor de fotos" }, "photoViewer": { "message": "Visor de fotos" },
@ -66,8 +66,10 @@
"settingsApiServer": { "message": "Configuración de API y Servidor" }, "settingsApiServer": { "message": "Configuración de API y Servidor" },
"settingsTmdbApiLabel": { "message": "Clave de API de TMDB (Opcional)" }, "settingsTmdbApiLabel": { "message": "Clave de API de TMDB (Opcional)" },
"settingsTmdbApiPlaceholder": { "message": "Se usará la clave por defecto si se deja en blanco" }, "settingsTmdbApiPlaceholder": { "message": "Se usará la clave por defecto si se deja en blanco" },
"openaiApiKey": { "message": "Clave API de OpenAI" }, "settingsGoogleApiLabel": { "message": "Clave de API de Google Gemini (Opcional)" },
"settingsTmdbLangLabel": { "message": "Idioma para TMDB y la interfaz" }, "settingsGoogleApiPlaceholder": { "message": "Necesaria para usar el asistente de IA" },
"settingsRegionLabel": { "message": "Región para descubrimiento de contenido" },
"allRegions": { "message": "Todas las regiones" },
"settingsPhpUrlLabel": { "message": "URL del Servidor para Añadir Streams" }, "settingsPhpUrlLabel": { "message": "URL del Servidor para Añadir Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://tu-servidor.com/ruta/al/script.php" }, "settingsPhpUrlPlaceholder": { "message": "https://tu-servidor.com/ruta/al/script.php" },
"settingsInterface": { "message": "Interfaz" }, "settingsInterface": { "message": "Interfaz" },
@ -201,7 +203,7 @@
"sendingStreams": { "message": "Enviando $count$ stream(s) al servidor...", "placeholders": { "count": { "content": "$1" } } }, "sendingStreams": { "message": "Enviando $count$ stream(s) al servidor...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) añadido(s) con éxito." }, "streamAddedSuccess": { "message": "Stream(s) añadido(s) con éxito." },
"generatingM3U": { "message": "Generando M3U para \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "generatingM3U": { "message": "Generando M3U para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "\"\"$title$\" descargado.", "placeholders": { "title": { "content": "$1" } } }, "m3uDownloaded": { "message": "\"$title$\" descargado.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Error al generar M3U: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorGeneratingM3U": { "message": "Error al generar M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Ajustes guardados correctamente." }, "settingsSavedSuccess": { "message": "Ajustes guardados correctamente." },
"errorSavingSettings": { "message": "Error al guardar los ajustes en la base de datos." }, "errorSavingSettings": { "message": "Error al guardar los ajustes en la base de datos." },
@ -212,22 +214,11 @@
"plexScanStarting": { "message": "Iniciando escaneo Plex..." }, "plexScanStarting": { "message": "Iniciando escaneo Plex..." },
"noPlexTokens": { "message": "No hay tokens de Plex configurados." }, "noPlexTokens": { "message": "No hay tokens de Plex configurados." },
"clearingSections": { "message": "Limpiando secciones: $sections$", "placeholders": { "sections": { "content": "$1" } } }, "clearingSections": { "message": "Limpiando secciones: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"sectionsCleared": { "message": "Secciones limpiadas." },
"tokenFoundServers": { "message": "Token $token$... encontró $count$ servidores.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Error procesando token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"initialScanPhaseComplete": { "message": "Fase de escaneo inicial finalizada." }, "initialScanPhaseComplete": { "message": "Fase de escaneo inicial finalizada." },
"retryPhaseFinished": { "message": "Fase de reintentos finalizada." }, "retryPhaseFinished": { "message": "Fase de reintentos finalizada." },
"plexScanFinished": { "message": "Escaneo finalizado. Actualizando contenido..." }, "plexScanFinished": { "message": "Escaneo finalizado. Actualizando contenido..." },
"plexScanFatalError": { "message": "ERROR FATAL: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Error durante el escaneo: $message$", "placeholders": { "message": { "content": "$1" } } },
"scanCancelled": { "message": "Escaneo cancelado por el usuario." }, "scanCancelled": { "message": "Escaneo cancelado por el usuario." },
"scanCancelledInfo": { "message": "Escaneo cancelado." }, "scanCancelledInfo": { "message": "Escaneo cancelado." },
"retyingSection": { "message": "Reintentando sección \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[ÉXITO] Reintento de \"$title$\" completado.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERROR FINAL] Falló el reintento para \"$title$\": $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"noRetriesPending": { "message": "No hay reintentos pendientes." },
"startingRetryPhase": { "message": "Iniciando fase de reintentos para $count$ secciones...", "placeholders": { "count": { "content": "$1" } } },
"retryPhaseCancelled": { "message": "Fase de reintentos cancelada." },
"errorInitializingMusicPlayer": { "message": "Error inicializando el reproductor de música." }, "errorInitializingMusicPlayer": { "message": "Error inicializando el reproductor de música." },
"criticalErrorLoadingMusic": { "message": "Error crítico al cargar datos de música." }, "criticalErrorLoadingMusic": { "message": "Error crítico al cargar datos de música." },
"errorLoadingArtists": { "message": "Error al cargar artistas." }, "errorLoadingArtists": { "message": "Error al cargar artistas." },
@ -237,17 +228,8 @@
"errorFetchingArtistSongs": { "message": "Error al obtener las canciones del artista." }, "errorFetchingArtistSongs": { "message": "Error al obtener las canciones del artista." },
"errorLoadingSongs": { "message": "Error cargando canciones." }, "errorLoadingSongs": { "message": "Error cargando canciones." },
"noArtistsFound": { "message": "No se encontraron artistas." }, "noArtistsFound": { "message": "No se encontraron artistas." },
"artistsCounter": { "message": "$start$-$end$ de $total$", "placeholders": { "start": { "content": "$1" }, "end": { "content": "$2" }, "total": { "content": "$3" } } },
"artistsCounterSingle": { "message": "$total$ Artistas", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Cargando..." },
"noSongsFound": { "message": "No se encontraron canciones." },
"shuffleOn": { "message": "Modo aleatorio activado." }, "shuffleOn": { "message": "Modo aleatorio activado." },
"shuffleOff": { "message": "Modo aleatorio desactivado." }, "shuffleOff": { "message": "Modo aleatorio desactivado." },
"downloadingSong": { "message": "Iniciando descarga de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"\"$title$\" descargado.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Error al descargar \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Generando M3U para \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U para el álbum \"$artist$\" generado.", "placeholders": { "artist": { "content": "$1" } } },
"playbackError": { "message": "Error de reproducción" }, "playbackError": { "message": "Error de reproducción" },
"errorLabel": { "message": "Error" }, "errorLabel": { "message": "Error" },
"reloadingPage": { "message": "Recargando la página..." }, "reloadingPage": { "message": "Recargando la página..." },
@ -333,67 +315,85 @@
"activityCopyError": { "message": "Error al copiar el identificador." }, "activityCopyError": { "message": "Error al copiar el identificador." },
"noProvidersFound": { "message": "No se encontraron proveedores." }, "noProvidersFound": { "message": "No se encontraron proveedores." },
"availableOnPlex": { "message": "Disponible en Plex" }, "availableOnPlex": { "message": "Disponible en Plex" },
"navM3uGenerator": { "message": "Generador M3U" },
"m3uGeneratorTitle": { "message": "Generador de Listas M3U" }, "m3uGeneratorTitle": { "message": "Generador de Listas M3U" },
"selectAServer": { "message": "Selecciona un servidor..." }, "selectAServer": { "message": "Selecciona un servidor..." },
"downloadM3u": { "message": "Descargar M3U" }, "downloadM3u": { "message": "Descargar M3U" },
"m3uGenerator": { "message": "Generador M3U" }, "m3uGenerator": { "message": "Generador M3U" },
"selectServer": { "message": "Seleccionar Servidor" },
"selectLibraries": { "message": "Seleccionar Bibliotecas" }, "selectLibraries": { "message": "Seleccionar Bibliotecas" },
"howToUse": { "message": "Cómo Usar" }, "howToUse": { "message": "Cómo Usar" },
"m3uInstruction1": { "message": "Elige un servidor de la lista." }, "m3uInstruction1": { "message": "Elige un servidor de la lista." },
"m3uInstruction2": { "message": "Selecciona una o más bibliotecas para incluir." }, "m3uInstruction2": { "message": "Selecciona una o más bibliotecas para incluir." },
"m3uInstruction3": { "message": "Haz clic en el botón de descarga." }, "m3uInstruction3": { "message": "Haz clic en el botón de descarga." },
"m3uInstruction4": { "message": "Importa el archivo .m3u en tu reproductor compatible." }, "m3uInstruction4": { "message": "Importa el archivo .m3u en tu reproductor compatible." },
"settingsRegionLabel": { "message": "Región para descubrimiento de contenido" },
"allRegions": { "message": "Todas las regiones" },
"chatOpen": { "message": "Abrir Chat" }, "chatOpen": { "message": "Abrir Chat" },
"chatTitle": { "message": "Asistente IA" }, "chatTitle": { "message": "Asistente IA" },
"chatClose": { "message": "X" }, "chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Escribe tu mensaje..." }, "chatPlaceholder": { "message": "Escribe tu mensaje..." },
"chatSend": { "message": "➤" }, "chatSend": { "message": "➤" },
"chatGptError": { "message": "Lo siento, no pude obtener una respuesta. Inténtalo de nuevo." },
"chatWelcome": { "message": "¡Bienvenido! Soy tu asistente de CinePlex. Pregúntame sobre películas, series o cualquier otra cosa que quieras saber." }, "chatWelcome": { "message": "¡Bienvenido! Soy tu asistente de CinePlex. Pregúntame sobre películas, series o cualquier otra cosa que quieras saber." },
"chatApiKeyMissing": { "message": "La clave de la API de OpenAI no está configurada. Por favor, configúrala en los ajustes de la extensión." }, "chatGoogleApiKeyMissing": { "message": "La clave de la API de Google Gemini no está configurada. Por favor, configúrala en los ajustes de la extensión para usar el asistente de IA." },
"chatApiInvalidResponse": { "message": "La API ha devuelto una respuesta no válida. Por favor, inténtalo de nuevo." }, "chatApiInvalidResponse": { "message": "La API ha devuelto una respuesta no válida. Por favor, inténtalo de nuevo." },
"chatApiError": { "message": "Error al comunicarse con el asistente de IA" }, "chatApiError": { "message": "Error al comunicarse con el asistente de IA" },
"downloadAll": { "message": "Descargar todo" }, "downloadAll": { "message": "Descargar todo" },
"download": { "message": "Descargar" }, "download": { "message": "Descargar" },
"aiToolSearchLibraryDesc": { "message": "Busca en la biblioteca de Plex películas o series." }, "aiToolSearchLibraryDesc": { "message": "Busca en la biblioteca de Plex del usuario películas o series por título." },
"aiToolSearchLibraryQueryDesc": { "message": "El título a buscar." }, "aiToolSearchLibraryQueryParamDesc": { "message": "El título de la película o serie a buscar." },
"aiToolSearchLibraryTypeDesc": { "message": "El tipo de contenido a buscar (película o serie)." }, "aiToolSearchLibraryTypeParamDesc": { "message": "El tipo de contenido a buscar. Puede ser 'movie' para películas o 'series' para series. (Opcional)." },
"aiToolNavigateToPageDesc": { "message": "Navega a una página específica de la aplicación." }, "aiToolNavigateToPageDesc": { "message": "Navega al usuario a una página específica de la interfaz de la aplicación." },
"aiToolNavigateToPagePageDesc": { "message": "La página a la que navegar." }, "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 estadísticas del usuario." }, "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." },
"aiToolShowItemDetailsDesc": { "message": "Muestra los detalles de una película o serie." }, "aiToolShowItemDetailsDesc": { "message": "Muestra la página de detalles de una película o serie específica por su título y tipo." },
"aiToolShowItemDetailsTitleDesc": { "message": "El título de la película o serie." }, "aiToolShowItemDetailsTitleParamDesc": { "message": "El título exacto de la película o serie." },
"aiToolShowItemDetailsTypeDesc": { "message": "El tipo de contenido (película o serie)." }, "aiToolShowItemDetailsTypeParamDesc": { "message": "El tipo de contenido. Debe ser 'movie' o 'series'." },
"aiToolAddToPlaylistDesc": { "message": "Añade una película o serie a la lista de reproducción." }, "aiToolAddToPlaylistDesc": { "message": "Añade una película o serie a la lista de reproducción actual del usuario para transmitirla a un servidor PHP configurado." },
"aiToolAddToPlaylistTitleDesc": { "message": "El título de la película o serie." }, "aiToolAddToPlaylistTitleParamDesc": { "message": "El título de la película o serie a añadir." },
"aiToolAddToPlaylistTypeDesc": { "message": "El tipo de contenido (película o serie)." }, "aiToolAddToPlaylistTypeParamDesc": { "message": "El tipo de contenido. Debe ser 'movie' o 'series'." },
"aiToolDownloadPlaylistDesc": { "message": "Descarga la lista de reproducción de una película o serie." }, "aiToolCheckAndDownloadDesc": { "message": "Comprueba la disponibilidad de una lista de títulos de películas o series en los servidores locales del usuario y, si se encuentran, genera y descarga un archivo de lista de reproducción M3U con los streams encontrados." },
"aiToolDownloadPlaylistTitleDesc": { "message": "El título de la película o serie." }, "aiToolCheckAndDownloadTitlesParamDesc": { "message": "Una matriz de títulos de películas o series para buscar y descargar." },
"aiToolDownloadPlaylistTypeDesc": { "message": "El tipo de contenido (película o serie)." }, "aiToolCheckAndDownloadTypeParamDesc": { "message": "El tipo de contenido de la lista. Debe ser 'movie' o 'series'." },
"aiToolToggleFavoriteDesc": { "message": "Añade o quita una película o serie de favoritos." }, "aiToolCheckAndDownloadFilenameParamDesc": { "message": "El nombre del archivo M3U a descargar (por ejemplo, 'MiLista.m3u'). Si no se proporciona, se usará un nombre por defecto." },
"aiToolToggleFavoriteTitleDesc": { "message": "El título de la película o serie." }, "aiToolToggleFavoriteDesc": { "message": "Añade o quita una película o serie de la lista de favoritos del usuario." },
"aiToolToggleFavoriteTypeDesc": { "message": "El tipo de contenido (película o serie)." }, "aiToolToggleFavoriteTitleParamDesc": { "message": "El título de la película o serie." },
"aiToolGetRecommendationsDesc": { "message": "Obtiene recomendaciones para el usuario." }, "aiToolToggleFavoriteTypeParamDesc": { "message": "El tipo de contenido. Debe ser 'movie' o 'series'." },
"aiToolApplyFiltersDesc": { "message": "Aplica filtros a la vista actual." }, "aiToolGetRecommendationsDesc": { "message": "Genera y muestra una lista de recomendaciones de películas o series basadas en el historial de visualización y los favoritos del usuario." },
"aiToolApplyFiltersTypeDesc": { "message": "El tipo de contenido a filtrar (película o serie)." }, "aiToolApplyFiltersDesc": { "message": "Aplica filtros a la vista actual de películas o series, permitiendo refinar los resultados por tipo, género, año y orden de clasificación." },
"aiToolApplyFiltersGenreDesc": { "message": "El género a filtrar." }, "aiToolApplyFiltersTypeParamDesc": { "message": "El tipo de contenido al que aplicar los filtros. Debe ser 'movie' o 'series'." },
"aiToolApplyFiltersYearDesc": { "message": "El año a filtrar." }, "aiToolApplyFiltersGenreParamDesc": { "message": "El nombre del género por el que filtrar (por ejemplo, 'Acción', 'Drama')." },
"aiToolApplyFiltersSortDesc": { "message": "El orden en que se mostrarán los resultados." }, "aiToolApplyFiltersYearParamDesc": { "message": "El año de lanzamiento por el que filtrar (por ejemplo, '2023')." },
"aiToolPlayMusicByArtistDesc": { "message": "Reproduce música de un artista específico." }, "aiToolApplyFiltersSortParamDesc": { "message": "El criterio de ordenación para los resultados. Valores válidos: 'popularity.desc' (populares), 'vote_average.desc' (mejor valoradas), 'release_date.desc' (recientes para películas) o 'first_air_date.desc' (recientes para series)." },
"aiToolPlayMusicByArtistNameDesc": { "message": "El nombre del artista." }, "aiToolPlayMusicByArtistDesc": { "message": "Abre el reproductor de música y comienza a reproducir canciones de un artista específico de la biblioteca del usuario." },
"aiToolClearChatHistoryDesc": { "message": "Borra el historial de chat." }, "aiToolPlayMusicByArtistNameParamDesc": { "message": "El nombre exacto del artista cuyas canciones se desean reproducir." },
"aiToolDeleteDatabaseDesc": { "message": "Borra la base de datos de la extensión." }, "aiToolClearChatHistoryDesc": { "message": "Borra todo el historial de mensajes de la conversación actual con el asistente de IA." },
"aiToolUpdateAllTokensDesc": { "message": "Actualiza todos los tokens de Plex." }, "aiToolDeleteDatabaseDesc": { "message": "Elimina toda la base de datos local de la extensión, incluyendo el contenido escaneado, los ajustes y los favoritos. Esta acción es irreversible y recargará la aplicación." },
"aiToolAddPlexTokenDesc": { "message": "Añade un nuevo token de Plex." }, "aiToolUpdateAllTokensDesc": { "message": "Inicia un escaneo completo de todos los servidores y bibliotecas de Plex asociados con los tokens configurados en la extensión. Actualiza todas las películas, series, artistas y fotos." },
"aiToolAddPlexTokenTokenDesc": { "message": "El token de Plex a añadir." }, "aiToolAddPlexTokenDesc": { "message": "Añade un nuevo token X-Plex a la configuración de la extensión, permitiendo que la aplicación escanee contenido de nuevos servidores Plex." },
"aiToolChangeRegionDesc": { "message": "Cambia la región para el descubrimiento de contenido." }, "aiToolAddPlexTokenTokenParamDesc": { "message": "La cadena del token X-Plex que se desea añadir." },
"aiToolChangeRegionRegionDesc": { "message": "El código de región de dos letras (por ejemplo, US, ES, FR)." }, "aiToolChangeRegionDesc": { "message": "Cambia la región utilizada para el descubrimiento de contenido en la API de TMDB. Esto afectará a los resultados mostrados en las secciones de películas y series, así como a los proveedores de streaming." },
"aiToolClearAllFavoritesDesc": { "message": "Borra todos los favoritos del usuario." }, "aiToolChangeRegionRegionParamDesc": { "message": "El código de país ISO 3166-1 de dos letras para la nueva región (por ejemplo, 'US' para Estados Unidos, 'ES' para España, 'MX' para México)." },
"aiToolClearRecommendationsViewDesc": { "message": "Limpia la vista de recomendaciones." }, "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" } } },
"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" } } },
"aiToolRecommendationsSuccess": { "message": "Mostrando recomendaciones." },
"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" } } },
"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" } } },
"aiToolFavoritesCleared": { "message": "Favoritos eliminados." }, "aiToolFavoritesCleared": { "message": "Favoritos eliminados." },
"aiToolFavoritesClearError": { "message": "Error al eliminar los favoritos: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolFavoritesClearError": { "message": "Error al eliminar los favoritos: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recomendaciones eliminadas." }, "aiToolRecommendationsCleared": { "message": "Recomendaciones eliminadas." },
@ -407,17 +407,35 @@
"aiToolAddPlexTokenError": { "message": "Error al añadir el token de Plex: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolAddPlexTokenError": { "message": "Error al añadir el token de Plex: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Región cambiada a $region$. El contenido se está actualizando.", "placeholders": { "region": { "content": "$1" } } }, "aiToolChangeRegionSuccess": { "message": "Región cambiada a $region$. El contenido se está actualizando.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Error al cambiar la región: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolChangeRegionError": { "message": "Error al cambiar la región: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v2": { "message": "Eres un asistente experto en cine y series llamado CinePlex. Tu función principal es ayudar a los usuarios a interactuar con su biblioteca de medios y descubrir contenido. Sigue estas reglas: 1. Cuando un usuario pida una lista o recomendación (ej. 'dime 5 películas de terror', 'las mejores series de ciencia ficción'), DEBES usar tu propio conocimiento para generar la lista y presentarla en un formato numerado o con viñetas. NO uses herramientas para esta tarea inicial de descubrimiento. 2. Después de presentar la lista, si el usuario te pide que la descargues, la compruebes o crees un M3U, ENTONCES y solo entonces, utiliza la herramienta 'generate_m3u_from_titles_list' pasándole los títulos que acabas de mencionar. 3. Para cualquier otra acción como navegar por la app, obtener estadísticas o buscar un TÍTULO ESPECÍFICO en la biblioteca del usuario, utiliza las herramientas apropiadas. Sé conciso, amigable y eficiente." }, "aiToolViewingHistoryCleared": { "message": "Historial de visualización borrado." },
"aiToolSearchLibraryDesc_v2": { "message": "La lista de títulos para procesar está vacía." }, "aiToolViewingHistoryClearError": { "message": "Error al borrar el historial de visualización: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolM3UNoLocalMatches": { "message": "Parece que no tienes ninguno de los títulos de esa lista en tus servidores locales." },
"aiToolGenerateM3UTypeDesc": { "message": "El tipo de contenido a buscar: 'movie' o 'series'." },
"aiToolGenerateM3UFilenameDesc": { "message": "Un nombre de archivo personalizado para la lista de reproducción M3U descargada." },
"aiToolGenerateM3USuccess": { "message": "¡Entendido! Estoy generando una lista de reproducción M3U con $1 elementos. La descarga debería comenzar en breve.", "placeholders": { "1": { "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, usa las herramientas apropiadas. Sé siempre conciso, amigable y eficiente." },
"aiToolCheckAndDownloadDesc": { "message": "Comprueba una lista de títulos de películas o series en los servidores locales del usuario y, si se encuentran coincidencias, genera y descarga un archivo de lista de reproducción M3U." },
"aiToolGenerateM3UFromTitlesTitlesDesc": { "message": "Una lista de títulos de películas o series para comprobar y descargar." },
"aiToolM3UNoTitlesProvided": { "message": "Por favor, proporciona una lista de títulos para crear la lista de reproducción." }, "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..." }, "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." }, "aiToolM3UNoLocalMatchesForDownload": { "message": "No he encontrado ninguna de las películas o series de la lista en tus servidores locales." },
"aiToolM3UDownloadStarted": { "message": "¡Hecho! He encontrado $1 de los $2 títulos en tus servidores y he iniciado la descarga de la lista de reproducción M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } } "aiToolM3UDownloadStarted": { "message": "¡Hecho! He encontrado $1 de los $2 títulos en tus servidores y he iniciado la descarga de la lista de reproducción M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } },
"backToProviders": { "message": "Volver a Proveedores" },
"artistsCounterSingle": { "message": "$total$ Artista", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Cargando..." },
"downloadingSong": { "message": "Iniciando descarga de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"songDownloaded": { "message": "\"$title$\" descargado.", "placeholders": { "title": { "content": "$1" } } },
"errorDownloadingSong": { "message": "Error al descargar \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "Generando M3U para \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U para el álbum \"$artist$\" generado.", "placeholders": { "artist": { "content": "$1" } } },
"retyingSection": { "message": "Reintentando sección \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[ÉXITO] Reintento de \"$title$\" completado.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERROR FINAL] Falló el reintento para \"$title$\": $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"startingRetryPhase": { "message": "Iniciando fase de reintentos para $count$ secciones...", "placeholders": { "count": { "content": "$1" } } },
"tokenFoundServers": { "message": "Token $token$... encontró $count$ servidores.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Error procesando token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"plexScanFatalError": { "message": "ERROR FATAL: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Error durante el escaneo: $message$", "placeholders": { "message": { "content": "$1" } } },
"stoppingPlexScan": { "message": "Deteniendo escaneo Plex..." },
"invalidTokenProvided": { "message": "Token inválido proporcionado." },
"tokenAlreadyExists": { "message": "El token ya existe." },
"tokenAddedSuccessfully": { "message": "Token añadido correctamente." },
"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" }
} }

View File

@ -1,11 +1,11 @@
{ {
"appName": { "message": "CinePlex" }, "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 pour trouver du contenu et l'affiche dans l'interface" },
"appTagline": { "message": "Films, Séries & Musique" }, "appTagline": { "message": "Films, Séries et Musique" },
"appLocaleCode": { "message": "fr-FR" }, "appLocaleCode": { "message": "fr" },
"toggleNavigation": { "message": "Basculer la Navigation" }, "toggleNavigation": { "message": "Basculer la navigation" },
"searchPlaceholder": { "message": "Rechercher des films ou des séries..." }, "searchPlaceholder": { "message": "Rechercher des films ou des séries..." },
"openMusicPlayer": { "message": "Ouvrir le Lecteur de Musique" }, "openMusicPlayer": { "message": "Ouvrir le lecteur de musique" },
"settings": { "message": "Paramètres" }, "settings": { "message": "Paramètres" },
"navMovies": { "message": "Films" }, "navMovies": { "message": "Films" },
"navSeries": { "message": "Séries" }, "navSeries": { "message": "Séries" },
@ -16,11 +16,12 @@
"navHistory": { "message": "Historique" }, "navHistory": { "message": "Historique" },
"navRecommendations": { "message": "Recommandations" }, "navRecommendations": { "message": "Recommandations" },
"navMusic": { "message": "Musique" }, "navMusic": { "message": "Musique" },
"navM3uGenerator": { "message": "Générateur M3U" },
"heroWelcome": { "message": "" }, "heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Explorez des milliers de films et de séries." }, "heroSubtitle": { "message": "Explorez des milliers de films et de séries." },
"addStream": { "message": "Ajouter le flux" }, "addStream": { "message": "Ajouter un stream" },
"moreInfo": { "message": "Plus d'infos" }, "moreInfo": { "message": "Plus d'informations" },
"popularMovies": { "message": "Films Populaires" }, "popularMovies": { "message": "Films populaires" },
"allGenres": { "message": "Tous les genres" }, "allGenres": { "message": "Tous les genres" },
"allYears": { "message": "Toutes les années" }, "allYears": { "message": "Toutes les années" },
"sortPopular": { "message": "Les plus populaires" }, "sortPopular": { "message": "Les plus populaires" },
@ -28,206 +29,196 @@
"sortRecent": { "message": "Les plus récents" }, "sortRecent": { "message": "Les plus récents" },
"loadMore": { "message": "Charger plus" }, "loadMore": { "message": "Charger plus" },
"photosBreadcrumbHome": { "message": "Albums" }, "photosBreadcrumbHome": { "message": "Albums" },
"selectServer": { "message": "Sélectionnez un serveur" }, "selectServer": { "message": "Sélectionner un serveur" },
"loading": { "message": "Chargement..." }, "loading": { "message": "Chargement..." },
"loadingLibraries": { "message": "Chargement des bibliothèques..." }, "loadingLibraries": { "message": "Chargement des bibliothèques..." },
"photosEmptyState": { "message": "Aucun album ou photo trouvé." }, "photosEmptyState": { "message": "Aucun album ou photo trouvé." },
"photosEmptyStateSub": { "message": "Veuillez sélectionner un serveur ou vous assurer d'avoir une bibliothèque de photos dans Plex." }, "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" }, "statsTitle": { "message": "Statistiques de la bibliothèque" },
"statsAllTokens": { "message": "Tous les Tokens" }, "statsAllTokens": { "message": "Tous les jetons" },
"statsAnalyzing": { "message": "Analyse de votre bibliothèque..." }, "statsAnalyzing": { "message": "Analyse de votre bibliothèque..." },
"statsActiveTokens": { "message": "Tokens Actifs" }, "statsActiveTokens": { "message": "Jetons actifs" },
"statsServersFound": { "message": "Serveurs Trouvés" }, "statsServersFound": { "message": "Serveurs trouvés" },
"statsUniqueMovies": { "message": "Films Uniques" }, "statsUniqueMovies": { "message": "Films uniques" },
"statsUniqueSeries": { "message": "Séries Uniques" }, "statsUniqueSeries": { "message": "Séries uniques" },
"statsUniqueArtists": { "message": "Artistes Uniques" }, "statsUniqueArtists": { "message": "Artistes uniques" },
"statsTokenServers": { "message": "Serveurs du Token" }, "statsTokenServers": { "message": "Serveurs du jeton" },
"statsChartMoviesByGenre": { "message": "Contenu par Genre (Films)" }, "statsChartMoviesByGenre": { "message": "Contenu par genre (Films)" },
"statsChartSeriesByGenre": { "message": "Contenu par Genre (Séries)" }, "statsChartSeriesByGenre": { "message": "Contenu par genre (Séries)" },
"statsChartByDecade": { "message": "Contenu par Décennie" }, "statsChartByDecade": { "message": "Contenu par décennie" },
"recommendationsTitle": { "message": "Recommandations pour vous" }, "recommendationsTitle": { "message": "Recommandations pour vous" },
"historyTitle": { "message": "Historique de Visionnage" }, "historyTitle": { "message": "Historique de visionnage" },
"clearHistory": { "message": "Tout effacer" }, "clearHistory": { "message": "Tout effacer" },
"consoleTitle": { "message": "Console de Scan Plex" }, "consoleTitle": { "message": "Console de scan Plex" },
"footerCredit": { "message": "Une interface pour votre univers Plex." }, "footerCredit": { "message": "Une interface pour votre univers Plex." },
"backButton": { "message": "Retour" },
"closeTrailer": { "message": "Fermer la bande-annonce" }, "closeTrailer": { "message": "Fermer la bande-annonce" },
"close": { "message": "Fermer" }, "close": { "message": "Fermer" },
"photoViewer": { "message": "Visionneuse de photos" }, "photoViewer": { "message": "Visionneuse de photos" },
"previous": { "message": "Précédent" }, "previous": { "message": "Précédent" },
"next": { "message": "Suivant" }, "next": { "message": "Suivant" },
"notificationTemplateText": { "message": "Notification" }, "notificationTemplateText": { "message": "Notification" },
"settingsTitleFull": { "message": "Paramètres et Configuration" }, "settingsTitleFull": { "message": "Réglages et Configuration" },
"settingsTabGeneral": { "message": "Général" }, "settingsTabGeneral": { "message": "Général" },
"settingsTabPlex": { "message": "Plex" }, "settingsTabPlex": { "message": "Plex" },
"settingsTabJellyfin": { "message": "Jellyfin" }, "settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "Générateur PHP" }, "settingsTabPhpGen": { "message": "Générateur PHP" },
"settingsTabData": { "message": "Données" }, "settingsTabData": { "message": "Données" },
"settingsApiServer": { "message": "Configuration API et Serveur" }, "settingsApiServer": { "message": "Configuration API et serveur" },
"settingsTmdbApiLabel": { "message": "Clé API de TMDB (Optionnel)" }, "settingsTmdbApiLabel": { "message": "Clé API TMDB (Facultatif)" },
"settingsTmdbApiPlaceholder": { "message": "Utilisera la clé par défaut si laissé vide" }, "settingsTmdbApiPlaceholder": { "message": "La clé par défaut sera utilisée si laissée vide" },
"openaiApiKey": { "message": "Clé API OpenAI" }, "settingsGoogleApiLabel": { "message": "Clé API Google Gemini (Facultatif)" },
"settingsTmdbLangLabel": { "message": "Langue pour TMDB & UI" }, "settingsGoogleApiPlaceholder": { "message": "Nécessaire pour utiliser l'assistant IA" },
"settingsPhpUrlLabel": { "message": "URL du Serveur pour Ajout de Flux" }, "settingsRegionLabel": { "message": "Région pour la découverte de contenu" },
"settingsPhpUrlPlaceholder": { "message": "https://votre-serveur.com/chemin/vers/script.php" }, "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" }, "settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Mode Clair" }, "settingsLightTheme": { "message": "Mode clair" },
"settingsShowHero": { "message": "Afficher la section d'accueil \"Hero\"" }, "settingsShowHero": { "message": "Afficher la section de bienvenue 'Hero'" },
"settingsScanContent": { "message": "Scan de Contenu" }, "settingsScanContent": { "message": "Scan de contenu" },
"settingsScanDesc": { "message": "Sélectionnez ce que vous voulez scanner et appuyez sur le bouton." }, "settingsScanDesc": { "message": "Sélectionnez ce que vous voulez scanner et cliquez sur le bouton." },
"settingsScanMovies": { "message": "Films" }, "settingsScanMovies": { "message": "Films" },
"settingsScanShows": { "message": "Séries" }, "settingsScanShows": { "message": "Séries" },
"settingsScanArtists": { "message": "Musique" }, "settingsScanArtists": { "message": "Musique" },
"settingsScanPhotos": { "message": "Photos" }, "settingsScanPhotos": { "message": "Photos" },
"settingsSelectAll": { "message": "Tout sélectionner" }, "settingsSelectAll": { "message": "Tout sélectionner" },
"settingsStartScan": { "message": "Démarrer le Scan" }, "settingsStartScan": { "message": "Lancer le scan" },
"settingsPlexTokens": { "message": "Tokens Plex" }, "settingsPlexTokens": { "message": "Jetons Plex" },
"settingsPlexTokensDesc": { "message": "Modifiez la liste des tokens Plex (format JSON)." }, "settingsPlexTokensDesc": { "message": "Modifier la liste des jetons Plex (format JSON)." },
"settingsSaveTokens": { "message": "Sauvegarder les Tokens" }, "settingsSaveTokens": { "message": "Sauvegarder les jetons" },
"settingsJellyfinTitle": { "message": "Paramètres Jellyfin" }, "settingsJellyfinTitle": { "message": "Configuration Jellyfin" },
"settingsJellyfinDesc": { "message": "Ajoutez les informations de votre serveur Jellyfin pour scanner son contenu." }, "settingsJellyfinDesc": { "message": "Ajoutez les détails de votre serveur Jellyfin pour scanner son contenu." },
"jellyfinUrlLabel": { "message": "URL du serveur Jellyfin" }, "jellyfinUrlLabel": { "message": "URL du serveur Jellyfin" },
"jellyfinUserLabel": { "message": "Nom d'utilisateur" }, "jellyfinUserLabel": { "message": "Nom d'utilisateur" },
"jellyfinPassLabel": { "message": "Mot de passe" }, "jellyfinPassLabel": { "message": "Mot de passe" },
"jellyfinConnectAndScan": { "message": "Connecter et Scanner" }, "jellyfinConnectAndScan": { "message": "Connecter et scanner" },
"settingsPhpGenTitle": { "message": "Générateur de Script PHP pour Serveur" }, "settingsPhpGenTitle": { "message": "Générateur de script PHP pour le serveur" },
"settingsPhpFileOptions": { "message": "Options du Fichier" }, "settingsPhpFileOptions": { "message": "Options de fichier" },
"settingsPhpSavePathLabel": { "message": "Chemin de Sauvegarde sur le Serveur" }, "settingsPhpSavePathLabel": { "message": "Chemin de sauvegarde sur le serveur" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listes (vide pour le même dossier)" }, "settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listes (vide pour le même dossier)" },
"settingsPhpFilenameLabel": { "message": "Nom du Fichier" }, "settingsPhpFilenameLabel": { "message": "Nom de fichier" },
"settingsPhpFileAction": { "message": "Action sur le Fichier" }, "settingsPhpFileAction": { "message": "Action sur le fichier" },
"settingsPhpActionAppend": { "message": "Ajouter à la fin du fichier (cumulatif)" }, "settingsPhpActionAppend": { "message": "Ajouter à la fin du fichier (cumulatif)" },
"settingsPhpActionOverwrite": { "message": "Écraser le fichier (repartir à zéro)" }, "settingsPhpActionOverwrite": { "message": "Écraser le fichier (repartir de zéro)" },
"settingsPhpSecurity": { "message": "Sécurité (Optionnel)" }, "settingsPhpSecurity": { "message": "Sécurité (Facultatif)" },
"settingsPhpUseSecretKey": { "message": "Utiliser une clé secrète (Recommandé)" }, "settingsPhpUseSecretKey": { "message": "Utiliser une clé secrète (Recommandé)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Entrez une clé secrète sécurisée" }, "settingsPhpSecretKeyPlaceholder": { "message": "Saisissez une clé secrète sécurisée" },
"settingsPhpGeneratedCode": { "message": "Code Généré" }, "settingsPhpGeneratedCode": { "message": "Code généré" },
"settingsPhpGeneratedPlaceholder": { "message": "Le code PHP généré apparaîtra ici." }, "settingsPhpGeneratedPlaceholder": { "message": "Le code PHP généré apparaîtra ici." },
"settingsGenerateScript": { "message": "Générer le Script" }, "settingsGenerateScript": { "message": "Générer le script" },
"settingsCopyScript": { "message": "Copier le Script" }, "settingsCopyScript": { "message": "Copier le script" },
"settingsDataManagement": { "message": "Gestion de la Base de Données Locale" }, "settingsDataManagement": { "message": "Gestion de la base de données locale" },
"settingsImportDb": { "message": "Importer BD depuis un Fichier" }, "settingsImportDb": { "message": "Importer la base de données depuis un fichier" },
"settingsExportDb": { "message": "Exporter BD vers un Fichier" }, "settingsExportDb": { "message": "Exporter la base de données vers un fichier" },
"settingsClearContent": { "message": "Effacer les Données de Contenu Locales" }, "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 ou paramètres." }, "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" }, "settingsClose": { "message": "Fermer" },
"settingsSave": { "message": "Sauvegarder les Paramètres" }, "settingsSave": { "message": "Enregistrer les paramètres" },
"musicSidenavTitle": { "message": "Plex Musique" }, "musicSidenavTitle": { "message": "Musique de Plex" },
"musicAllServers": { "message": "Tous les Serveurs" }, "musicAllServers": { "message": "Tous les serveurs" },
"musicSearchArtistPlaceholder": { "message": "Rechercher un artiste..." }, "musicSearchArtistPlaceholder": { "message": "Rechercher un artiste..." },
"musicSearchDiscographyPlaceholder": { "message": "Rechercher dans la discographie..." }, "musicSearchDiscographyPlaceholder": { "message": "Rechercher dans la discographie..." },
"musicNothingPlaying": { "message": "Aucune lecture en cours" }, "musicNothingPlaying": { "message": "Rien ne joue" },
"musicSelectSong": { "message": "Sélectionnez une chanson" }, "musicSelectSong": { "message": "Sélectionnez une chanson" },
"musicToStart": { "message": "pour commencer la lecture" }, "musicToStart": { "message": "pour commencer à jouer" },
"miniplayerDownloadSong": { "message": "Télécharger la chanson" }, "miniplayerDownloadSong": { "message": "Télécharger la chanson" },
"miniplayerDownloadAlbum": { "message": "Télécharger l'album M3U" }, "miniplayerDownloadAlbum": { "message": "Télécharger l'album M3U" },
"miniplayerVolume": { "message": "Volume" }, "miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Aléatoire" }, "miniplayerShuffle": { "message": "Lecture aléatoire" },
"miniplayerEqualizer": { "message": "Égaliseur" }, "miniplayerEqualizer": { "message": "Égaliseur" },
"miniplayerOpenList": { "message": "Ouvrir la liste" }, "miniplayerOpenList": { "message": "Ouvrir la liste" },
"eqTitle": { "message": "Égaliseur Graphique" }, "eqTitle": { "message": "Égaliseur graphique" },
"eqPresetsLabel": { "message": "Préréglages" }, "eqPresetsLabel": { "message": "Préréglages" },
"eqPresetFlat": { "message": "Plat" }, "eqPresetFlat": { "message": "Plat" },
"eqPresetRock": { "message": "Rock" }, "eqPresetRock": { "message": "Rock" },
"eqPresetPop": { "message": "Pop" }, "eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" }, "eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Classique" }, "eqPresetClassical": { "message": "Classique" },
"eqPresetBassBoost": { "message": "Renforcement des Basses" }, "eqPresetBassBoost": { "message": "Accentuation des basses" },
"eqPreampLabel": { "message": "Pré-Amp" }, "eqPreampLabel": { "message": "Préamplificateur" },
"infoModalTitle": { "message": "Information" }, "infoModalTitle": { "message": "Informations" },
"infoModalFieldTitle": { "message": "Titre:" }, "infoModalFieldTitle": { "message": "Titre :" },
"infoModalFieldArtist": { "message": "Artiste:" }, "infoModalFieldArtist": { "message": "Artiste :" },
"infoModalFieldAlbum": { "message": "Album:" }, "infoModalFieldAlbum": { "message": "Album :" },
"infoModalFieldSong": { "message": "Chanson:" }, "infoModalFieldSong": { "message": "Chanson :" },
"infoModalFieldYear": { "message": "Année:" }, "infoModalFieldYear": { "message": "Année :" },
"infoModalFieldGenre": { "message": "Genre:" }, "infoModalFieldGenre": { "message": "Genre :" },
"lang_en": { "message": "Anglais" }, "lang_en": { "message": "Anglais" },
"lang_es": { "message": "Espagnol" }, "lang_es": { "message": "Espagnol" },
"lang_fr": { "message": "Français" }, "lang_fr": { "message": "Français" },
"lang_de": { "message": "Allemand" }, "lang_de": { "message": "Allemand" },
"lang_it": { "message": "Italien" }, "lang_it": { "message": "Italien" },
"lang_pt": { "message": "Portugais" }, "lang_pt": { "message": "Portugais" },
"essentialFeaturesNotSupported": { "message": "Votre navigateur ne prend pas en charge les fonctionnalités essentielles." }, "essentialFeaturesNotSupported": { "message": "Votre navigateur ne prend pas en charge les fonctions essentielles." },
"dbAccessError": { "message": "Erreur d'accès à la base de données locale." }, "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." }, "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." }, "dbBlocked": { "message": "Veuillez fermer les autres onglets de cette application pour continuer." },
"deletingContentData": { "message": "Suppression des données de contenu locales..." }, "deletingContentData": { "message": "Suppression des données de contenu local..." },
"noContentDataToDelete": { "message": "Aucune donnée de contenu à supprimer." }, "noContentDataToDelete": { "message": "Aucune donnée de contenu à supprimer." },
"contentDataDeleted": { "message": "Données de contenu supprimées de IndexedDB." }, "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" } } }, "errorDeletingData": { "message": "Erreur lors de la suppression des données : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Éditeur de texte non disponible." }, "aceEditorNotAvailable": { "message": "Éditeur de texte non disponible." },
"errorLoadingTokens": { "message": "Erreur lors du chargement des tokens pour l'édition." }, "errorLoadingTokens": { "message": "Erreur lors du chargement des jetons pour l'édition." },
"errorLoadingTokensMessage": { "message": "Erreur de chargement des tokens : $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingTokensMessage": { "message": "Erreur lors du chargement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Éditeur non disponible pour la sauvegarde." }, "aceEditorNotAvailableToSave": { "message": "Éditeur non disponible pour la sauvegarde." },
"invalidJsonFormat": { "message": "Format JSON invalide. Doit être { \"tokens\": [...] }" }, "invalidJsonFormat": { "message": "Format JSON invalide. Doit être { \"tokens\": [...] }" },
"tokensSaved": { "message": "Tokens sauvegardés avec succès." }, "tokensSaved": { "message": "Jetons enregistrés avec succès." },
"errorSavingTokens": { "message": "Erreur lors de la sauvegarde des tokens : $message$", "placeholders": { "message": { "content": "$1" } } }, "errorSavingTokens": { "message": "Erreur lors de l'enregistrement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB n'est pas disponible." }, "dbNotAvailable": { "message": "IndexedDB n'est pas disponible." },
"dbExported": { "message": "Base de données exportée avec succès." }, "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" } } }, "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 un objet JSON valide." }, "invalidJsonFile": { "message": "Le fichier ne contient pas d'objet JSON valide." },
"noDataToImport": { "message": "Le fichier ne contient pas de données pour les sections actuelles de la BD." }, "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." }, "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" } } }, "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..." }, "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 locales (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." }, "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 est irréversible." }, "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é." }, "historyCleared": { "message": "Historique de visionnage effacé." },
"historyItemDeleted": { "message": "Élément supprimé de l'historique." }, "historyItemDeleted": { "message": "Élément supprimé de l'historique." },
"errorGeneratingScript": { "message": "Générez d'abord un script avant de pouvoir le copier." }, "errorGeneratingScript": { "message": "Générez d'abord un script pour pouvoir le copier." },
"scriptCopied": { "message": "Script PHP copié dans le presse-papiers." }, "scriptCopied": { "message": "Script PHP copié dans le presse-papiers." },
"errorCopyingScript": { "message": "Erreur lors de la copie du script." }, "errorCopyingScript": { "message": "Erreur lors de la copie du script." },
"scriptGenerated": { "message": "Script PHP généré." }, "scriptGenerated": { "message": "Script PHP généré." },
"errorLoadingAlbum": { "message": "Erreur lors du chargement de l'album : $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingAlbum": { "message": "Erreur lors du chargement de l'album : $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Erreur : Aucun serveur de photos n'a été sélectionné." }, "noPhotoServerSelected": { "message": "Erreur : Aucun serveur photo n'a été sélectionné." },
"loadingGenres": { "message": "Chargement des genres..." }, "loadingGenres": { "message": "Chargement des genres..." },
"errorLoadingGenres": { "message": "Erreur de chargement" }, "errorLoadingGenres": { "message": "Erreur de chargement" },
"noContentFound": { "message": "Aucun résultat trouvé." }, "noContentFound": { "message": "Aucun résultat trouvé." },
"couldNotLoadContent": { "message": "Impossible de charger le contenu." }, "couldNotLoadContent": { "message": "Impossible de charger le contenu." },
"noFavorites": { "message": "Vous n'avez pas encore de favoris." }, "noFavorites": { "message": "Vous n'avez pas encore de favoris." },
"errorLoadingFavorites": { "message": "Erreur lors du chargement des favoris." }, "errorLoadingFavorites": { "message": "Erreur lors du chargement des favoris." },
"historyEmpty": { "message": "Votre historique est isEmpty." }, "historyEmpty": { "message": "Votre historique est vide." },
"historyEmptySub": { "message": "Parcourez et regardez du contenu pour qu'il apparaisse ici." }, "historyEmptySub": { "message": "Explorez et regardez du contenu pour qu'il apparaisse ici." },
"errorGeneratingRecommendations": { "message": "Erreur lors de la génération des recommandations." }, "errorGeneratingRecommendations": { "message": "Erreur lors de la génération des recommandations." },
"noRecommendations": { "message": "Nous avons besoin de mieux vous connaître pour vous faire 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." }, "errorGeneratingStats": { "message": "Erreur lors de la génération des statistiques." },
"noServersForToken": { "message": "Aucun serveur associé trouvé pour ce token." }, "noServersForToken": { "message": "Aucun serveur associé trouvé pour ce jeton." },
"searchingActorContent": { "message": "Recherche de contenu de $actorName$", "placeholders": { "actorName": { "content": "$1" } } }, "searchingActorContent": { "message": "Recherche de contenu de $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Impossible de charger le contenu pour $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 du ou des flux : $message$", "placeholders": { "message": { "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." }, "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" } } }, "searchingStreams": { "message": "Recherche de streams pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Envoi de $count$ flux au serveur...", "placeholders": { "count": { "content": "$1" } } }, "sendingStreams": { "message": "Envoi de $count$ stream(s) au serveur...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Flux ajouté(s) avec succès." }, "streamAddedSuccess": { "message": "Stream(s) ajouté(s) avec succès." },
"generatingM3U": { "message": "Génération du M3U pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "generatingM3U": { "message": "Génération M3U pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "M3U pour \"$title$\" téléchargé.", "placeholders": { "title": { "content": "$1" } } }, "m3uDownloaded": { "message": "\"$title$\" téléchargé.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Erreur lors de la génération du M3U : $message$", "placeholders": { "message": { "content": "$1" } } }, "errorGeneratingM3U": { "message": "Erreur lors de la génération M3U : $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Paramètres sauvegardés avec succès." }, "settingsSavedSuccess": { "message": "Paramètres enregistrés avec succès." },
"errorSavingSettings": { "message": "Erreur lors de la sauvegarde des paramètres dans la base de données." }, "errorSavingSettings": { "message": "Erreur lors de l'enregistrement des paramètres dans la base de données." },
"languageChangeReload": { "message": "Langue modifiée. L'application va maintenant se recharger." }, "languageChangeReload": { "message": "Langue changée. L'application va maintenant être rechargée." },
"addedToFavorites": { "message": "Ajouté aux favoris." }, "addedToFavorites": { "message": "Ajouté aux favoris." },
"removedFromFavorites": { "message": "Retiré des favoris." }, "removedFromFavorites": { "message": "Supprimé des favoris." },
"plexScanInProgress": { "message": "Le scan Plex est déjà en cours." }, "plexScanInProgress": { "message": "Le scan Plex est déjà en cours." },
"plexScanStarting": { "message": "Démarrage du scan Plex..." }, "plexScanStarting": { "message": "Démarrage du scan Plex..." },
"noPlexTokens": { "message": "Aucun token Plex configuré." }, "noPlexTokens": { "message": "Aucun jeton Plex configuré." },
"clearingSections": { "message": "Nettoyage des sections : $sections$", "placeholders": { "sections": { "content": "$1" } } }, "clearingSections": { "message": "Nettoyage des sections : $sections$", "placeholders": { "sections": { "content": "$1" } } },
"sectionsCleared": { "message": "Sections nettoyées." },
"tokenFoundServers": { "message": "Le token $token$... a trouvé $count$ serveurs.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } },
"errorProcessingToken": { "message": "Erreur lors du traitement du token $token$... : $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } },
"initialScanPhaseComplete": { "message": "Phase de scan initiale terminée." }, "initialScanPhaseComplete": { "message": "Phase de scan initiale terminée." },
"retryPhaseFinished": { "message": "Phase de relance terminée." }, "retryPhaseFinished": { "message": "Phase de réessais terminée." },
"plexScanFinished": { "message": "Scan terminé. Mise à jour du contenu..." }, "plexScanFinished": { "message": "Scan terminé. Mise à jour du contenu..." },
"plexScanFatalError": { "message": "ERREUR FATALE : $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Erreur pendant le scan : $message$", "placeholders": { "message": { "content": "$1" } } },
"scanCancelled": { "message": "Scan annulé par l'utilisateur." }, "scanCancelled": { "message": "Scan annulé par l'utilisateur." },
"scanCancelledInfo": { "message": "Scan annulé." }, "scanCancelledInfo": { "message": "Scan annulé." },
"retyingSection": { "message": "Nouvelle tentative pour la section \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"retrySuccess": { "message": "[SUCCÈS] Relance de \"$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" } } },
"noRetriesPending": { "message": "Aucune relance en attente." },
"startingRetryPhase": { "message": "Démarrage de la phase de relance pour $count$ sections...", "placeholders": { "count": { "content": "$1" } } },
"retryPhaseCancelled": { "message": "Phase de relance annulée." },
"errorInitializingMusicPlayer": { "message": "Erreur lors de l'initialisation du lecteur de musique." }, "errorInitializingMusicPlayer": { "message": "Erreur lors de l'initialisation du lecteur de musique." },
"criticalErrorLoadingMusic": { "message": "Erreur critique lors du chargement des données musicales." }, "criticalErrorLoadingMusic": { "message": "Erreur critique lors du chargement des données musicales." },
"errorLoadingArtists": { "message": "Erreur lors du chargement des artistes." }, "errorLoadingArtists": { "message": "Erreur lors du chargement des artistes." },
@ -237,23 +228,14 @@
"errorFetchingArtistSongs": { "message": "Erreur lors de la récupération des chansons de l'artiste." }, "errorFetchingArtistSongs": { "message": "Erreur lors de la récupération des chansons de l'artiste." },
"errorLoadingSongs": { "message": "Erreur lors du chargement des chansons." }, "errorLoadingSongs": { "message": "Erreur lors du chargement des chansons." },
"noArtistsFound": { "message": "Aucun artiste trouvé." }, "noArtistsFound": { "message": "Aucun artiste trouvé." },
"artistsCounter": { "message": "$start$-$end$ sur $total$", "placeholders": { "start": { "content": "$1" }, "end": { "content": "$2" }, "total": { "content": "$3" } } },
"artistsCounterSingle": { "message": "$total$ Artistes", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Chargement..." },
"noSongsFound": { "message": "Aucune chanson trouvée." },
"shuffleOn": { "message": "Mode aléatoire activé." }, "shuffleOn": { "message": "Mode aléatoire activé." },
"shuffleOff": { "message": "Mode aléatoire désactivé." }, "shuffleOff": { "message": "Mode aléatoire désactivé." },
"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 du M3U pour \"$artist$\"", "placeholders": { "artist": { "content": "$1" } } },
"albumM3UGenerated": { "message": "M3U de l'album \"$artist$\" généré.", "placeholders": { "artist": { "content": "$1" } } },
"playbackError": { "message": "Erreur de lecture" }, "playbackError": { "message": "Erreur de lecture" },
"errorLabel": { "message": "Erreur" }, "errorLabel": { "message": "Erreur" },
"reloadingPage": { "message": "Rechargement de la page..." }, "reloadingPage": { "message": "Rechargement de la page..." },
"viewed": { "message": "Vu" }, "viewed": { "message": "Vu" },
"local": { "message": "Local" }, "local": { "message": "Local" },
"topRatedSort": {"message": "Mieux notés"}, "topRatedSort": {"message": "Les mieux notés"},
"recentSort": {"message": "Récents"}, "recentSort": {"message": "Récents"},
"popularSort": {"message": "Populaires"}, "popularSort": {"message": "Populaires"},
"moviesSectionTitle": {"message": "Films"}, "moviesSectionTitle": {"message": "Films"},
@ -261,163 +243,199 @@
"searchResultsFor": {"message": "Résultats pour \"$query$\"", "placeholders": {"query": {"content": "$1"}}}, "searchResultsFor": {"message": "Résultats pour \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Contenu de $actor$", "placeholders": {"actor": {"content": "$1"}}}, "contentFrom": {"message": "Contenu de $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Explorer"}, "explore": {"message": "Explorer"},
"noGenre": {"message": "Non classé"}, "noGenre": {"message": "Sans catégorie"},
"synopsis": {"message": "Synopsis"}, "synopsis": {"message": "Synopsis"},
"noSynopsis": {"message": "Aucun synopsis disponible."}, "noSynopsis": {"message": "Aucune synopsis disponible."},
"director": {"message": "Réalisateur:"}, "director": {"message": "Réalisateur :"},
"writer": {"message": "Scénariste:"}, "writer": {"message": "Scénariste :"},
"viewOnImdb": {"message": "Voir sur IMDb"}, "viewOnImdb": {"message": "Voir sur IMDb"},
"watchTrailer": {"message": "Voir la bande-annonce"}, "watchTrailer": {"message": "Voir la bande-annonce"},
"addToFavorites": {"message": "Ajouter aux favoris"}, "addToFavorites": {"message": "Ajouter aux favoris"},
"removeFromFavorites": {"message": "Retirer des favoris"}, "removeFromFavorites": {"message": "Supprimer des favoris"},
"notAvailable": {"message": "Non disponible"}, "notAvailable": {"message": "Non disponible"},
"mainCast": {"message": "Distribution Principale"}, "mainCast": {"message": "Distribution principale"},
"seasonsAndEpisodes": {"message": "Saisons & Épisodes"}, "seasonsAndEpisodes": {"message": "Saisons et épisodes"},
"similarContent": {"message": "Contenu Similaire"}, "similarContent": {"message": "Contenu similaire"},
"episodesCount": {"message": "$count$ Épisodes", "placeholders": {"count": {"content": "$1"}}}, "episodesCount": {"message": "$count$ Épisodes", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Saisons", "placeholders": {"count": {"content": "$1"}}}, "seasonsCount": {"message": "$count$ Saisons", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}}, "runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Aucune bande-annonce n'a été trouvée pour ce titre."}, "noTrailerFound": {"message": "Aucune bande-annonce trouvée pour ce titre."},
"fatalInitError": {"message": "Erreur d'Initialisation Fatale"}, "fatalInitError": {"message": "Erreur d'initialisation fatale"},
"fatalInitErrorSub": {"message": "L'application n'a pas pu être chargée."}, "fatalInitErrorSub": {"message": "Impossible de charger l'application."},
"invalidStreamInfo": {"message": "Information invalide."}, "invalidStreamInfo": {"message": "Informations invalides."},
"dbUnavailableForStreams": {"message": "Base de données locale non disponible."}, "dbUnavailableForStreams": {"message": "Base de données locale non disponible."},
"noPlexServersForStreams": {"message": "Pas de serveurs Plex."}, "noPlexServersForStreams": {"message": "Aucun serveur Plex."},
"notFoundOnServers": {"message": "\"query$\" non trouvé sur les serveurs.", "placeholders": {"query": {"content": "$1"}}}, "notFoundOnServers": {"message": "Impossible de trouver \"$query$\" sur les serveurs Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "À l'instant" }, "relativeTime_justNow": { "message": "À l'instant" },
"relativeTime_minutesAgo": { "message": "Il y a $count$ minutes", "placeholders": { "count": { "content": "$1" } } }, "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_hoursAgo": { "message": "Il y a $count$ heures", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Hier" }, "relativeTime_yesterday": { "message": "Hier" },
"relativeTime_daysAgo": { "message": "Il y a $count$ jours", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_daysAgo": { "message": "Il y a $count$ jours", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Erreur de Chargement des Détails" }, "errorLoadingDetails": { "message": "Erreur lors du chargement des détails" },
"errorLoadingLocalContent": { "message": "Erreur lors du chargement du contenu local." }, "errorLoadingLocalContent": { "message": "Erreur lors du chargement du contenu local." },
"errorServerResponse": { "message": "Réponse non réussie du serveur." }, "errorServerResponse": { "message": "Réponse du serveur non réussie." },
"errorPlexApi": { "message": "Erreur $status$ de l'API Plex.", "placeholders": { "status": { "content": "$1" } } }, "errorPlexApi": { "message": "Erreur $status$ de l'API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Erreur d'analyse du XML de Plex." }, "errorParsingPlexXml": { "message": "Erreur lors de l'analyse du XML Plex." },
"untitled": { "message": "Sans titre" }, "untitled": { "message": "Sans titre" },
"itemCount": { "message": "$count$ éléments", "placeholders": { "count": { "content": "$1" } } }, "itemCount": { "message": "$count$ éléments", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Aucun serveur de photos" }, "noPhotoServers": { "message": "Aucun serveur photo" },
"jellyfinScanInProgress": { "message": "Le scan Jellyfin est déjà en cours." }, "jellyfinScanInProgress": { "message": "Le scan Jellyfin est déjà en cours." },
"jellyfinScanning": { "message": "Scan de Jellyfin en cours..." }, "jellyfinScanning": { "message": "Scan de Jellyfin en cours..." },
"jellyfinMissingCredentials": { "message": "Veuillez compléter l'URL et le nom d'utilisateur de Jellyfin." }, "jellyfinMissingCredentials": { "message": "Veuillez compléter l'URL et l'utilisateur de Jellyfin." },
"jellyfinConnecting": { "message": "Connexion à Jellyfin à : $url$", "placeholders": { "url": { "content": "$1" } } }, "jellyfinConnecting": { "message": "Connexion à Jellyfin en cours : $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Échec de l'authentification Jellyfin : $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinAuthFailed": { "message": "Échec de l'authentification Jellyfin : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Authentification Jellyfin réussie." }, "jellyfinAuthSuccess": { "message": "Authentification Jellyfin réussie." },
"jellyfinFetchingLibraries": { "message": "Récupération des bibliothèques..." }, "jellyfinFetchingLibraries": { "message": "Récupération des bibliothèques..." },
"jellyfinFetchFailed": { "message": "Échec de la récupération des bibliothèques : $message$", "placeholders": { "message": { "content": "$1" } } }, "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 sur Jellyfin." }, "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" } } }, "jellyfinLibrariesFound": { "message": "$count$ bibliothèque(s) multimédia(s) trouvée(s).", "placeholders": {"count": {"content": "$1"}}},
"jellyfinLibraryScanSuccess": { "message": "[Succès] '$libraryName scannée, $count$ titres ajoutés.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } }, "jellyfinLibraryScanSuccess": { "message": "[Succès] '$libraryName$' scanné, $count$ titres ajoutés.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Échec du scan de la bibliothèque '$libraryName.", "placeholders": { "libraryName": { "content": "$1" } } }, "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" } } }, "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." }, "noJellyfinCredentials": { "message": "Identifiants Jellyfin non configurés." },
"notFoundOnJellyfin": { "message": "\"query$\" non trouvé sur Jellyfin.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnJellyfin": { "message": "Impossible de trouver \"$query$\" sur Jellyfin.", "placeholders": {"query": {"content": "$1"}}},
"notFoundOnAnyServer": { "message": "\"query$\" non trouvé sur aucun serveur.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnAnyServer": { "message": "Impossible de trouver \"$query$\" sur aucun serveur.", "placeholders": {"query": {"content": "$1"}}},
"localOnPlex": { "message": "Sur Plex" }, "localOnPlex": { "message": "Sur Plex" },
"searchOnPlex": { "message": "Rechercher sur Plex" }, "searchOnPlex": { "message": "Rechercher sur Plex" },
"jellyfinTitle": { "message": "Contenu Jellyfin" }, "jellyfinTitle": { "message": "Contenu Jellyfin" },
"noJellyfinContent": { "message": "Aucun contenu Jellyfin trouvé." }, "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 scanné votre serveur Jellyfin dans les paramètres." },
"activityViewerTitle": { "message": "Visualiseur d'Activité du Serveur" }, "activityViewerTitle": { "message": "Visionneuse d'activité du serveur" },
"activitySelectServer": { "message": "Sélectionnez un serveur" }, "activitySelectServer": { "message": "Sélectionner un serveur" },
"activityCheckBtn": { "message": "Actualiser" }, "activityCheckBtn": { "message": "Actualiser" },
"activityNoSessions": { "message": "Aucune session active sur ce serveur." }, "activityNoSessions": { "message": "Aucune session active sur ce serveur." },
"activitySessionUser": { "message": "Utilisateur" }, "activitySessionUser": { "message": "Utilisateur" },
"activitySessionDevice": { "message": "Appareil" }, "activitySessionDevice": { "message": "Appareil" },
"activitySessionContent": { "message": "Contenu" }, "activitySessionContent": { "message": "Contenu" },
"activitySessionState": { "message": "État" }, "activitySessionState": { "message": "État" },
"activitySessionIdentifier": { "message": "Identifiant du Client" }, "activitySessionIdentifier": { "message": "Identifiant du client" },
"activityCopyID": { "message": "Copier l'ID" }, "activityCopyID": { "message": "Copier l'ID" },
"activityError": { "message": "Impossible de récupérer l'activité du serveur." }, "activityError": { "message": "Impossible d'obtenir l'activité du serveur." },
"activityCopied": { "message": "Identifiant copié dans le presse-papiers !" }, "activityCopied": { "message": "Identifiant copié dans le presse-papiers !" },
"activityCopyError": { "message": "Échec de la copie de l'identifiant." }, "activityCopyError": { "message": "Erreur lors de la copie de l'identifiant." },
"noProvidersFound": { "message": "Aucun fournisseur trouvé." }, "noProvidersFound": { "message": "Aucun fournisseur trouvé." },
"availableOnPlex": { "message": "Disponible sur Plex" }, "availableOnPlex": { "message": "Disponible sur Plex" },
"navM3uGenerator": { "message": "Générateur M3U" }, "m3uGeneratorTitle": { "message": "Générateur de listes M3U" },
"m3uGeneratorTitle": { "message": "Générateur de Listes de Lecture M3U" }, "selectAServer": { "message": "Sélectionner un serveur..." },
"selectAServer": { "message": "Sélectionnez un serveur..." },
"downloadM3u": { "message": "Télécharger M3U" }, "downloadM3u": { "message": "Télécharger M3U" },
"m3uGenerator": { "message": "Générateur M3U" }, "m3uGenerator": { "message": "Générateur M3U" },
"selectServer": { "message": "Sélectionner le Serveur" }, "selectLibraries": { "message": "Sélectionner les bibliothèques" },
"selectLibraries": { "message": "Sélectionner les Bibliothèques" }, "howToUse": { "message": "Comment utiliser" },
"howToUse": { "message": "Comment Utiliser" },
"m3uInstruction1": { "message": "Choisissez un serveur dans la liste." }, "m3uInstruction1": { "message": "Choisissez un serveur dans la liste." },
"m3uInstruction2": { "message": "Sélectionnez une ou plusieurs bibliothèques à inclure." }, "m3uInstruction2": { "message": "Sélectionnez une ou plusieurs bibliothèques à inclure." },
"m3uInstruction3": { "message": "Cliquez sur le bouton de téléchargement." }, "m3uInstruction3": { "message": "Cliquez sur le bouton de téléchargement." },
"m3uInstruction4": { "message": "Importez le fichier .m3u dans votre lecteur compatible." }, "m3uInstruction4": { "message": "Importez le fichier .m3u dans votre lecteur compatible." },
"settingsRegionLabel": { "message": "Région pour la découverte de contenu" },
"allRegions": { "message": "Toutes les régions" },
"chatOpen": { "message": "Ouvrir le chat" }, "chatOpen": { "message": "Ouvrir le chat" },
"chatTitle": { "message": "Assistant IA" }, "chatTitle": { "message": "Assistant IA" },
"chatClose": { "message": "X" }, "chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Écrivez votre message..." }, "chatPlaceholder": { "message": "Écrivez votre message..." },
"chatSend": { "message": "➤" }, "chatSend": { "message": "➤" },
"chatGptError": { "message": "Désolé, je n'ai pas pu obtenir de réponse. Veuillez réessayer." }, "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." },
"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 configurer dans les paramètres de l'extension pour utiliser l'assistant IA." },
"chatApiKeyMissing": { "message": "La clé API OpenAI n'est pas définie. Veuillez la configurer dans les paramètres de l'extension." }, "chatApiInvalidResponse": { "message": "L'API a renvoyé une réponse invalide. Veuillez réessayer." },
"chatApiInvalidResponse": { "message": "L'API a renvoyé une réponse non valide. Veuillez réessayer." },
"chatApiError": { "message": "Erreur de communication avec l'assistant IA" }, "chatApiError": { "message": "Erreur de communication avec l'assistant IA" },
"downloadAll": { "message": "Tout télécharger" }, "downloadAll": { "message": "Tout télécharger" },
"download": { "message": "Télécharger" }, "download": { "message": "Télécharger" },
"aiToolSearchLibraryDesc": { "message": "Recherche dans la bibliothèque Plex des films ou des séries." }, "aiToolSearchLibraryDesc": { "message": "Recherche dans la bibliothèque Plex de l'utilisateur des films ou séries par titre." },
"aiToolSearchLibraryQueryDesc": { "message": "Le titre à rechercher." }, "aiToolSearchLibraryQueryParamDesc": { "message": "Le titre du film ou de la série à rechercher." },
"aiToolSearchLibraryTypeDesc": { "message": "Le type de contenu à rechercher (film ou série)." }, "aiToolSearchLibraryTypeParamDesc": { "message": "Le type de contenu à rechercher. Peut être 'movie' pour les films ou 'series' pour les séries. (Facultatif)." },
"aiToolNavigateToPageDesc": { "message": "Navigue vers une page spécifique de l'application." }, "aiToolNavigateToPageDesc": { "message": "Navigue l'utilisateur vers une page spécifique de l'interface de l'application." },
"aiToolNavigateToPagePageDesc": { "message": "La page vers laquelle naviguer." }, "aiToolNavigateToPagePageParamDesc": { "message": "Le nom de la page à naviguer, par exemple : 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', ou 'm3u-generator'." },
"aiToolGetUserStatsDesc": { "message": "Obtient les statistiques de l'utilisateur." }, "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 les détails d'un film ou d'une série." }, "aiToolShowItemDetailsDesc": { "message": "Affiche la page de détails d'un film ou d'une série spécifique par son titre et son type." },
"aiToolShowItemDetailsTitleDesc": { "message": "Le titre du film ou de la série." }, "aiToolShowItemDetailsTitleParamDesc": { "message": "Le titre exact du film ou de la série." },
"aiToolShowItemDetailsTypeDesc": { "message": "Le type de contenu (film ou 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." }, "aiToolAddToPlaylistDesc": { "message": "Ajoute un film ou une série à la liste de lecture actuelle de l'utilisateur pour la diffuser à un serveur PHP configuré." },
"aiToolAddToPlaylistTitleDesc": { "message": "Le titre du film ou de la série." }, "aiToolAddToPlaylistTitleParamDesc": { "message": "Le titre du film ou de la série à ajouter." },
"aiToolAddToPlaylistTypeDesc": { "message": "Le type de contenu (film ou série)." }, "aiToolAddToPlaylistTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolDownloadPlaylistDesc": { "message": "Télécharge la liste de lecture d'un film ou d'une série." }, "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." },
"aiToolDownloadPlaylistTitleDesc": { "message": "Le titre du film ou de la série." }, "aiToolCheckAndDownloadTitlesParamDesc": { "message": "Un tableau de titres de films ou de séries à rechercher et télécharger." },
"aiToolDownloadPlaylistTypeDesc": { "message": "Le type de contenu (film ou série)." }, "aiToolCheckAndDownloadTypeParamDesc": { "message": "Le type de contenu de la liste. Doit être 'movie' ou 'series'." },
"aiToolToggleFavoriteDesc": { "message": "Ajoute ou supprime un film ou une série des favoris." }, "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é." },
"aiToolToggleFavoriteTitleDesc": { "message": "Le titre du film ou de la série." }, "aiToolToggleFavoriteDesc": { "message": "Ajoute ou retire un film ou une série de la liste des favoris de l'utilisateur." },
"aiToolToggleFavoriteTypeDesc": { "message": "Le type de contenu (film ou série)." }, "aiToolToggleFavoriteTitleParamDesc": { "message": "Le titre du film ou de la série." },
"aiToolGetRecommendationsDesc": { "message": "Obtient des recommandations pour l'utilisateur." }, "aiToolToggleFavoriteTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolApplyFiltersDesc": { "message": "Applique des filtres à la vue actuelle." }, "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." },
"aiToolApplyFiltersTypeDesc": { "message": "Le type de contenu à filtrer (film ou série)." }, "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." },
"aiToolApplyFiltersGenreDesc": { "message": "Le genre par lequel filtrer." }, "aiToolApplyFiltersTypeParamDesc": { "message": "Le type de contenu auquel appliquer les filtres. Doit être 'movie' ou 'series'." },
"aiToolApplyFiltersYearDesc": { "message": "L'année par laquelle filtrer." }, "aiToolApplyFiltersGenreParamDesc": { "message": "Le nom du genre par lequel filtrer (par exemple, 'Action', 'Drame')." },
"aiToolApplyFiltersSortDesc": { "message": "L'ordre dans lequel trier les résultats." }, "aiToolApplyFiltersYearParamDesc": { "message": "L'année de sortie par laquelle filtrer (par exemple, '2023')." },
"aiToolPlayMusicByArtistDesc": { "message": "Joue de la musique d'un artiste spécifique." }, "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)." },
"aiToolPlayMusicByArtistNameDesc": { "message": "Le nom de l'artiste." }, "aiToolPlayMusicByArtistDesc": { "message": "Ouvre le lecteur de musique et commence à jouer des chansons d'un artiste spécifique de la bibliothèque de l'utilisateur." },
"aiToolClearChatHistoryDesc": { "message": "Efface l'historique du chat." }, "aiToolPlayMusicByArtistNameParamDesc": { "message": "Le nom exact de l'artiste dont les chansons sont à jouer." },
"aiToolDeleteDatabaseDesc": { "message": "Supprime la base de données de l'extension." }, "aiToolClearChatHistoryDesc": { "message": "Efface tout l'historique des messages de la conversation actuelle avec l'assistant IA." },
"aiToolUpdateAllTokensDesc": { "message": "Met à jour tous les jetons Plex." }, "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." },
"aiToolAddPlexTokenDesc": { "message": "Ajoute un nouveau jeton Plex." }, "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." },
"aiToolAddPlexTokenTokenDesc": { "message": "Le jeton Plex à ajouter." }, "aiToolAddPlexTokenDesc": { "message": "Ajoute un nouveau jeton X-Plex à la configuration de l'extension, permettant à l'application de scanner le contenu des nouveaux serveurs Plex." },
"aiToolChangeRegionDesc": { "message": "Change la région pour la découverte de contenu." }, "aiToolAddPlexTokenTokenParamDesc": { "message": "La chaîne du jeton X-Plex à ajouter." },
"aiToolChangeRegionRegionDesc": { "message": "Le code de région à deux lettres (par exemple, US, ES, FR)." }, "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." },
"aiToolClearAllFavoritesDesc": { "message": "Efface tous les favoris de l'utilisateur." }, "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)." },
"aiToolClearRecommendationsViewDesc": { "message": "Efface la vue des recommandations." }, "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." }, "aiToolFavoritesCleared": { "message": "Favoris effacés." },
"aiToolFavoritesClearError": { "message": "Erreur lors de la suppression des favoris : $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolFavoritesClearError": { "message": "Erreur lors de l'effacement des favoris : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recommandations effacées." }, "aiToolRecommendationsCleared": { "message": "Recommandations effacées." },
"aiToolRecommendationsClearError": { "message": "Erreur lors de la suppression des recommandations : $message$", "placeholders": { "message": { "content": "$1" } } }, "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 maintenant se recharger." }, "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" } } }, "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. Veuillez fermer les autres onglets de l'application." }, "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." }, "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" } } }, "aiToolUpdateAllTokensError": { "message": "Erreur lors de la mise à jour des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Jeton Plex ajouté avec succès." }, "aiToolAddPlexTokenSuccess": { "message": "Jeton Plex ajouté avec succès." },
"aiToolAddPlexTokenError": { "message": "Erreur lors de l'ajout du jeton Plex : $message$", "placeholders": { "message": { "content": "$1" } } }, "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 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" } } }, "aiToolChangeRegionError": { "message": "Erreur lors du changement de région : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v2": { "message": "Vous êtes un assistant expert en films et séries nommé CinePlex. Votre fonction principale est d'aider les utilisateurs à interagir avec leur médiathèque et à découvrir du contenu. Suivez ces règles : 1. Lorsqu'un utilisateur demande une liste ou une recommandation (par exemple, 'donnez-moi 5 films d'horreur', 'les meilleures séries de science-fiction'), vous DEVEZ utiliser vos propres connaissances pour générer la liste et la présenter sous forme de liste numérotée ou à puces. N'UTILISEZ PAS d'outils pour cette tâche de découverte initiale. 2. Après avoir présenté la liste, si l'utilisateur vous demande de la télécharger, de la vérifier ou de créer un M3U, ALORS et seulement alors, utilisez l'outil 'generate_m3u_from_titles_list' en lui passant les titres que vous venez de mentionner. 3. Pour toute autre action telle que la navigation dans l'application, l'obtention de statistiques ou la recherche d'un TITRE SPÉCIFIQUE dans la bibliothèque de l'utilisateur, utilisez les outils appropriés. Soyez concis, amical et efficace." }, "aiToolViewingHistoryCleared": { "message": "Historique de visionnage effacé." },
"aiToolSearchLibraryDesc_v2": { "message": "La liste des titres à traiter est vide." }, "aiToolViewingHistoryClearError": { "message": "Erreur lors de l'effacement de l'historique de visionnage : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolM3UNoLocalMatches": { "message": "Il semble que vous n'ayez aucun des titres de cette liste sur vos serveurs locaux." }, "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." },
"aiToolGenerateM3UTypeDesc": { "message": "Le type de contenu à rechercher : 'movie' ou 'series'." }, "aiToolM3UNoTitlesProvided": { "message": "Veuillez fournir une liste de titres pour créer la playlist." },
"aiToolGenerateM3UFilenameDesc": { "message": "Un nom de fichier personnalisé pour la liste de lecture M3U téléchargée." },
"aiToolGenerateM3USuccess": { "message": "Compris ! Je génère une liste de lecture M3U avec $1 éléments. Le téléchargement devrait commencer sous peu.", "placeholders": { "1": { "content": "$1" } } },
"aiSystemPrompt_v3": { "message": "Vous êtes un assistant expert en films et séries nommé 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. **NE JAMAIS** prétendre 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 pro-activement à 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 la navigation, l'obtention de statistiques ou la recherche d'un titre spécifique, utilisez les outils appropriés. Soyez toujours concis, amical et efficace." },
"aiToolCheckAndDownloadDesc": { "message": "Vérifie une liste de titres de films ou de séries par rapport aux serveurs locaux de l'utilisateur et, si des correspondances sont trouvées, génère et télécharge un fichier de liste de lecture M3U." },
"aiToolGenerateM3UFromTitlesTitlesDesc": { "message": "Une liste de titres de films ou de séries à vérifier et à télécharger." },
"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..." }, "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." }, "aiToolM3UNoLocalMatchesForDownload": { "message": "Je n'ai trouvé aucun des films ou séries de la liste sur vos serveurs locaux." },
"aiToolM3UDownloadStarted": { "message": "Terminé ! J'ai trouvé $1 des $2 titres sur vos serveurs et j'ai commencé le téléchargement de la liste de lecture M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } } "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" }
} }

View File

@ -1,423 +1,441 @@
{ {
"appName": { "message": "CinePlex" }, "appName": { "message": "CinePlex" },
"appDescription": { "message": "Analizza i server Plex per trovare contenuti e li visualizza nell'interfaccia" }, "appDescription": { "message": "Scanne les serveurs Plex pour trouver du contenu et l'affiche dans l'interface" },
"appTagline": { "message": "Film, Serie TV e Musica" }, "appTagline": { "message": "Films, Séries et Musique" },
"appLocaleCode": { "message": "it-IT" }, "appLocaleCode": { "message": "fr" },
"toggleNavigation": { "message": "Mostra/Nascondi Navigazione" }, "toggleNavigation": { "message": "Basculer la navigation" },
"searchPlaceholder": { "message": "Cerca film o serie TV..." }, "searchPlaceholder": { "message": "Rechercher des films ou des séries..." },
"openMusicPlayer": { "message": "Apri Lettore Musicale" }, "openMusicPlayer": { "message": "Ouvrir le lecteur de musique" },
"settings": { "message": "Impostazioni" }, "settings": { "message": "Paramètres" },
"navMovies": { "message": "Film" }, "navMovies": { "message": "Films" },
"navSeries": { "message": "Serie TV" }, "navSeries": { "message": "Séries" },
"navProviders": { "message": "Fornitori" }, "navProviders": { "message": "Fournisseurs" },
"navPhotos": { "message": "Foto" }, "navPhotos": { "message": "Photos" },
"navStats": { "message": "Statistiche" }, "navStats": { "message": "Statistiques" },
"navFavorites": { "message": "Preferiti" }, "navFavorites": { "message": "Favoris" },
"navHistory": { "message": "Cronologia" }, "navHistory": { "message": "Historique" },
"navRecommendations": { "message": "Consigliati" }, "navRecommendations": { "message": "Recommandations" },
"navMusic": { "message": "Musica" }, "navMusic": { "message": "Musique" },
"navM3uGenerator": { "message": "Générateur M3U" },
"heroWelcome": { "message": "" }, "heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Esplora migliaia di film e serie TV." }, "heroSubtitle": { "message": "Explorez des milliers de films et de séries." },
"addStream": { "message": "Aggiungi Stream" }, "addStream": { "message": "Ajouter un stream" },
"moreInfo": { "message": "Più informazioni" }, "moreInfo": { "message": "Plus d'informations" },
"popularMovies": { "message": "Film Popolari" }, "popularMovies": { "message": "Films populaires" },
"allGenres": { "message": "Tutti i Generi" }, "allGenres": { "message": "Tous les genres" },
"allYears": { "message": "Tutti gli Anni" }, "allYears": { "message": "Toutes les années" },
"sortPopular": { "message": "Più Popolari" }, "sortPopular": { "message": "Les plus populaires" },
"sortTopRated": { "message": "Più Votati" }, "sortTopRated": { "message": "Les mieux notés" },
"sortRecent": { "message": "Più Recenti" }, "sortRecent": { "message": "Les plus récents" },
"loadMore": { "message": "Carica Altri" }, "loadMore": { "message": "Charger plus" },
"photosBreadcrumbHome": { "message": "Album" }, "photosBreadcrumbHome": { "message": "Albums" },
"selectServer": { "message": "Seleziona un server" }, "selectServer": { "message": "Sélectionner un serveur" },
"loading": { "message": "Caricamento in corso..." }, "loading": { "message": "Chargement..." },
"loadingLibraries": { "message": "Caricamento librerie in corso..." }, "loadingLibraries": { "message": "Chargement des bibliothèques..." },
"photosEmptyState": { "message": "Nessun album o foto trovati." }, "photosEmptyState": { "message": "Aucun album ou photo trouvé." },
"photosEmptyStateSub": { "message": "Seleziona un server o assicurati di avere una libreria di foto su Plex." }, "photosEmptyStateSub": { "message": "Veuillez sélectionner un serveur ou assurez-vous d'avoir une bibliothèque de photos dans Plex." },
"statsTitle": { "message": "Statistiche della Libreria" }, "statsTitle": { "message": "Statistiques de la bibliothèque" },
"statsAllTokens": { "message": "Tutti i Token" }, "statsAllTokens": { "message": "Tous les jetons" },
"statsAnalyzing": { "message": "Analisi della tua libreria in corso..." }, "statsAnalyzing": { "message": "Analyse de votre bibliothèque..." },
"statsActiveTokens": { "message": "Token Attivi" }, "statsActiveTokens": { "message": "Jetons actifs" },
"statsServersFound": { "message": "Server Trovati" }, "statsServersFound": { "message": "Serveurs trouvés" },
"statsUniqueMovies": { "message": "Film Unici" }, "statsUniqueMovies": { "message": "Films uniques" },
"statsUniqueSeries": { "message": "Serie TV Uniche" }, "statsUniqueSeries": { "message": "Séries uniques" },
"statsUniqueArtists": { "message": "Artisti Unici" }, "statsUniqueArtists": { "message": "Artistes uniques" },
"statsTokenServers": { "message": "Server del Token" }, "statsTokenServers": { "message": "Serveurs du jeton" },
"statsChartMoviesByGenre": { "message": "Contenuti per Genere (Film)" }, "statsChartMoviesByGenre": { "message": "Contenu par genre (Films)" },
"statsChartSeriesByGenre": { "message": "Contenuti per Genere (Serie TV)" }, "statsChartSeriesByGenre": { "message": "Contenu par genre (Séries)" },
"statsChartByDecade": { "message": "Contenuti per Decennio" }, "statsChartByDecade": { "message": "Contenu par décennie" },
"recommendationsTitle": { "message": "Consigliati per Te" }, "recommendationsTitle": { "message": "Recommandations pour vous" },
"historyTitle": { "message": "Cronologia di Visione" }, "historyTitle": { "message": "Historique de visionnage" },
"clearHistory": { "message": "Cancella Tutto" }, "clearHistory": { "message": "Tout effacer" },
"consoleTitle": { "message": "Console di Scansione Plex" }, "consoleTitle": { "message": "Console de scan Plex" },
"footerCredit": { "message": "Un'interfaccia per il tuo universo Plex." }, "footerCredit": { "message": "Une interface pour votre univers Plex." },
"backButton": { "message": "Indietro" }, "closeTrailer": { "message": "Fermer la bande-annonce" },
"closeTrailer": { "message": "Chiudi trailer" }, "close": { "message": "Fermer" },
"close": { "message": "Chiudi" }, "photoViewer": { "message": "Visionneuse de photos" },
"photoViewer": { "message": "Visualizzatore Foto" }, "previous": { "message": "Précédent" },
"previous": { "message": "Precedente" }, "next": { "message": "Suivant" },
"next": { "message": "Successivo" }, "notificationTemplateText": { "message": "Notification" },
"notificationTemplateText": { "message": "Notifica" }, "settingsTitleFull": { "message": "Réglages et Configuration" },
"settingsTitleFull": { "message": "Impostazioni e Configurazione" }, "settingsTabGeneral": { "message": "Général" },
"settingsTabGeneral": { "message": "Generale" },
"settingsTabPlex": { "message": "Plex" }, "settingsTabPlex": { "message": "Plex" },
"settingsTabJellyfin": { "message": "Jellyfin" }, "settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "Generatore PHP" }, "settingsTabPhpGen": { "message": "Générateur PHP" },
"settingsTabData": { "message": "Dati" }, "settingsTabData": { "message": "Données" },
"settingsApiServer": { "message": "Configurazione API e Server" }, "settingsApiServer": { "message": "Configuration API et serveur" },
"settingsTmdbApiLabel": { "message": "Chiave API TMDB (Opzionale)" }, "settingsTmdbApiLabel": { "message": "Clé API TMDB (Facultatif)" },
"settingsTmdbApiPlaceholder": { "message": "Verrà usata la chiave predefinita se lasciato vuoto" }, "settingsTmdbApiPlaceholder": { "message": "La clé par défaut sera utilisée si laissée vide" },
"openaiApiKey": { "message": "Chiave API OpenAI" }, "settingsGoogleApiLabel": { "message": "Clé API Google Gemini (Facultatif)" },
"settingsTmdbLangLabel": { "message": "Lingua per TMDB e Interfaccia" }, "settingsGoogleApiPlaceholder": { "message": "Nécessaire pour utiliser l'assistant IA" },
"settingsPhpUrlLabel": { "message": "URL del server per aggiungere gli stream" }, "settingsRegionLabel": { "message": "Région pour la découverte de contenu" },
"settingsPhpUrlPlaceholder": { "message": "https://tuo-server.com/percorso/dello/script.php" }, "allRegions": { "message": "Toutes les régions" },
"settingsInterface": { "message": "Interfaccia" }, "settingsPhpUrlLabel": { "message": "URL du serveur pour ajouter des streams" },
"settingsLightTheme": { "message": "Modalità Chiara" }, "settingsPhpUrlPlaceholder": { "message": "https://votre-serveur.com/chemin/vers/le-script.php" },
"settingsShowHero": { "message": "Mostra sezione di benvenuto 'Hero'" }, "settingsInterface": { "message": "Interface" },
"settingsScanContent": { "message": "Scansione Contenuti" }, "settingsLightTheme": { "message": "Mode clair" },
"settingsScanDesc": { "message": "Seleziona cosa scansionare e premi il pulsante." }, "settingsShowHero": { "message": "Afficher la section de bienvenue 'Hero'" },
"settingsScanMovies": { "message": "Film" }, "settingsScanContent": { "message": "Scan de contenu" },
"settingsScanShows": { "message": "Serie TV" }, "settingsScanDesc": { "message": "Sélectionnez ce que vous voulez scanner et cliquez sur le bouton." },
"settingsScanArtists": { "message": "Musica" }, "settingsScanMovies": { "message": "Films" },
"settingsScanPhotos": { "message": "Foto" }, "settingsScanShows": { "message": "Séries" },
"settingsSelectAll": { "message": "Seleziona Tutto" }, "settingsScanArtists": { "message": "Musique" },
"settingsStartScan": { "message": "Avvia Scansione" }, "settingsScanPhotos": { "message": "Photos" },
"settingsPlexTokens": { "message": "Token Plex" }, "settingsSelectAll": { "message": "Tout sélectionner" },
"settingsPlexTokensDesc": { "message": "Modifica la lista dei token Plex (formato JSON)." }, "settingsStartScan": { "message": "Lancer le scan" },
"settingsSaveTokens": { "message": "Salva Token" }, "settingsPlexTokens": { "message": "Jetons Plex" },
"settingsJellyfinTitle": { "message": "Impostazioni Jellyfin" }, "settingsPlexTokensDesc": { "message": "Modifier la liste des jetons Plex (format JSON)." },
"settingsJellyfinDesc": { "message": "Aggiungi i dati del tuo server Jellyfin per scansionarne il contenuto." }, "settingsSaveTokens": { "message": "Sauvegarder les jetons" },
"jellyfinUrlLabel": { "message": "URL Server Jellyfin" }, "settingsJellyfinTitle": { "message": "Configuration Jellyfin" },
"jellyfinUserLabel": { "message": "Nome utente" }, "settingsJellyfinDesc": { "message": "Ajoutez les détails de votre serveur Jellyfin pour scanner son contenu." },
"jellyfinPassLabel": { "message": "Password" }, "jellyfinUrlLabel": { "message": "URL du serveur Jellyfin" },
"jellyfinConnectAndScan": { "message": "Connetti e Scansiona" }, "jellyfinUserLabel": { "message": "Nom d'utilisateur" },
"settingsPhpGenTitle": { "message": "Generatore di Script PHP per Server" }, "jellyfinPassLabel": { "message": "Mot de passe" },
"settingsPhpFileOptions": { "message": "Opzioni File" }, "jellyfinConnectAndScan": { "message": "Connecter et scanner" },
"settingsPhpSavePathLabel": { "message": "Percorso di salvataggio sul server" }, "settingsPhpGenTitle": { "message": "Générateur de script PHP pour le serveur" },
"settingsPhpSavePathPlaceholder": { "message": "Es: /var/www/html/lists (vuoto per la stessa cartella)" }, "settingsPhpFileOptions": { "message": "Options de fichier" },
"settingsPhpFilenameLabel": { "message": "Nome file" }, "settingsPhpSavePathLabel": { "message": "Chemin de sauvegarde sur le serveur" },
"settingsPhpFileAction": { "message": "Azione sul file" }, "settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listes (vide pour le même dossier)" },
"settingsPhpActionAppend": { "message": "Aggiungi alla fine del file (cumulativo)" }, "settingsPhpFilenameLabel": { "message": "Nom de fichier" },
"settingsPhpActionOverwrite": { "message": "Sovrascrivi il file (ricomincia da capo)" }, "settingsPhpFileAction": { "message": "Action sur le fichier" },
"settingsPhpSecurity": { "message": "Sicurezza (Opzionale)" }, "settingsPhpActionAppend": { "message": "Ajouter à la fin du fichier (cumulatif)" },
"settingsPhpUseSecretKey": { "message": "Usa chiave segreta (Consigliato)" }, "settingsPhpActionOverwrite": { "message": "Écraser le fichier (repartir de zéro)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Inserisci una chiave segreta sicura" }, "settingsPhpSecurity": { "message": "Sécurité (Facultatif)" },
"settingsPhpGeneratedCode": { "message": "Codice Generato" }, "settingsPhpUseSecretKey": { "message": "Utiliser une clé secrète (Recommandé)" },
"settingsPhpGeneratedPlaceholder": { "message": "Il codice PHP generato apparirà qui." }, "settingsPhpSecretKeyPlaceholder": { "message": "Saisissez une clé secrète sécurisée" },
"settingsGenerateScript": { "message": "Genera Script" }, "settingsPhpGeneratedCode": { "message": "Code généré" },
"settingsCopyScript": { "message": "Copia Script" }, "settingsPhpGeneratedPlaceholder": { "message": "Le code PHP généré apparaîtra ici." },
"settingsDataManagement": { "message": "Gestione Database Locale" }, "settingsGenerateScript": { "message": "Générer le script" },
"settingsImportDb": { "message": "Importa DB da File" }, "settingsCopyScript": { "message": "Copier le script" },
"settingsExportDb": { "message": "Esporta DB su File" }, "settingsDataManagement": { "message": "Gestion de la base de données locale" },
"settingsClearContent": { "message": "Cancella Dati Locali dei Contenuti" }, "settingsImportDb": { "message": "Importer la base de données depuis un fichier" },
"settingsClearContentDesc": { "message": "Questa azione eliminerà film, serie TV e musica dal database locale, ma non influenzerà i tuoi preferiti o le impostazioni." }, "settingsExportDb": { "message": "Exporter la base de données vers un fichier" },
"settingsClose": { "message": "Chiudi" }, "settingsClearContent": { "message": "Effacer les données de contenu local" },
"settingsSave": { "message": "Salva Impostazioni" }, "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." },
"musicSidenavTitle": { "message": "Musica Plex" }, "settingsClose": { "message": "Fermer" },
"musicAllServers": { "message": "Tutti i Server" }, "settingsSave": { "message": "Enregistrer les paramètres" },
"musicSearchArtistPlaceholder": { "message": "Cerca artista..." }, "musicSidenavTitle": { "message": "Musique de Plex" },
"musicSearchDiscographyPlaceholder": { "message": "Cerca nella discografia..." }, "musicAllServers": { "message": "Tous les serveurs" },
"musicNothingPlaying": { "message": "Nessuna riproduzione in corso" }, "musicSearchArtistPlaceholder": { "message": "Rechercher un artiste..." },
"musicSelectSong": { "message": "Seleziona un brano" }, "musicSearchDiscographyPlaceholder": { "message": "Rechercher dans la discographie..." },
"musicToStart": { "message": "per avviare la riproduzione" }, "musicNothingPlaying": { "message": "Rien ne joue" },
"miniplayerDownloadSong": { "message": "Scarica brano" }, "musicSelectSong": { "message": "Sélectionnez une chanson" },
"miniplayerDownloadAlbum": { "message": "Scarica album M3U" }, "musicToStart": { "message": "pour commencer à jouer" },
"miniplayerDownloadSong": { "message": "Télécharger la chanson" },
"miniplayerDownloadAlbum": { "message": "Télécharger l'album M3U" },
"miniplayerVolume": { "message": "Volume" }, "miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Riproduzione Casuale" }, "miniplayerShuffle": { "message": "Lecture aléatoire" },
"miniplayerEqualizer": { "message": "Equalizzatore" }, "miniplayerEqualizer": { "message": "Égaliseur" },
"miniplayerOpenList": { "message": "Apri lista" }, "miniplayerOpenList": { "message": "Ouvrir la liste" },
"eqTitle": { "message": "Equalizzatore Grafico" }, "eqTitle": { "message": "Égaliseur graphique" },
"eqPresetsLabel": { "message": "Preimpostazioni" }, "eqPresetsLabel": { "message": "Préréglages" },
"eqPresetFlat": { "message": "Piatto" }, "eqPresetFlat": { "message": "Plat" },
"eqPresetRock": { "message": "Rock" }, "eqPresetRock": { "message": "Rock" },
"eqPresetPop": { "message": "Pop" }, "eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" }, "eqPresetJazz": { "message": "Jazz" },
"eqPresetClassical": { "message": "Classica" }, "eqPresetClassical": { "message": "Classique" },
"eqPresetBassBoost": { "message": "Aumento Bassi" }, "eqPresetBassBoost": { "message": "Accentuation des basses" },
"eqPreampLabel": { "message": "Pre-Amp" }, "eqPreampLabel": { "message": "Préamplificateur" },
"infoModalTitle": { "message": "Informazioni" }, "infoModalTitle": { "message": "Informations" },
"infoModalFieldTitle": { "message": "Titolo:" }, "infoModalFieldTitle": { "message": "Titre :" },
"infoModalFieldArtist": { "message": "Artista:" }, "infoModalFieldArtist": { "message": "Artiste :" },
"infoModalFieldAlbum": { "message": "Album:" }, "infoModalFieldAlbum": { "message": "Album :" },
"infoModalFieldSong": { "message": "Brano:" }, "infoModalFieldSong": { "message": "Chanson :" },
"infoModalFieldYear": { "message": "Anno:" }, "infoModalFieldYear": { "message": "Année :" },
"infoModalFieldGenre": { "message": "Genere:" }, "infoModalFieldGenre": { "message": "Genre :" },
"lang_en": { "message": "Inglese" }, "lang_en": { "message": "Anglais" },
"lang_es": { "message": "Spagnolo" }, "lang_es": { "message": "Espagnol" },
"lang_fr": { "message": "Francese" }, "lang_fr": { "message": "Français" },
"lang_de": { "message": "Tedesco" }, "lang_de": { "message": "Allemand" },
"lang_it": { "message": "Italiano" }, "lang_it": { "message": "Italien" },
"lang_pt": { "message": "Portoghese" }, "lang_pt": { "message": "Portugais" },
"essentialFeaturesNotSupported": { "message": "Il tuo browser non supporta le funzionalità essenziali." }, "essentialFeaturesNotSupported": { "message": "Votre navigateur ne prend pas en charge les fonctions essentielles." },
"dbAccessError": { "message": "Errore di accesso al database locale." }, "dbAccessError": { "message": "Erreur d'accès à la base de données locale." },
"dbUpdateNeeded": { "message": "Il database deve essere aggiornato, si prega di ricaricare la pagina." }, "dbUpdateNeeded": { "message": "La base de données doit être mise à jour, veuillez recharger la page." },
"dbBlocked": { "message": "Per continuare, chiudi le altre schede di questa applicazione." }, "dbBlocked": { "message": "Veuillez fermer les autres onglets de cette application pour continuer." },
"deletingContentData": { "message": "Cancellazione dei dati locali dei contenuti in corso..." }, "deletingContentData": { "message": "Suppression des données de contenu local..." },
"noContentDataToDelete": { "message": "Nessun dato di contenuto da cancellare." }, "noContentDataToDelete": { "message": "Aucune donnée de contenu à supprimer." },
"contentDataDeleted": { "message": "Dati dei contenuti cancellati da IndexedDB." }, "contentDataDeleted": { "message": "Données de contenu supprimées d'IndexedDB." },
"errorDeletingData": { "message": "Errore durante la cancellazione dei dati: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorDeletingData": { "message": "Erreur lors de la suppression des données : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Editor di testo non disponibile." }, "aceEditorNotAvailable": { "message": "Éditeur de texte non disponible." },
"errorLoadingTokens": { "message": "Errore nel caricamento dei token nell'editor." }, "errorLoadingTokens": { "message": "Erreur lors du chargement des jetons pour l'édition." },
"errorLoadingTokensMessage": { "message": "Errore nel caricamento dei token: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingTokensMessage": { "message": "Erreur lors du chargement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor non disponibile per il salvataggio." }, "aceEditorNotAvailableToSave": { "message": "Éditeur non disponible pour la sauvegarde." },
"invalidJsonFormat": { "message": "Formato JSON non valido. Deve essere { \"tokens\": [...] }" }, "invalidJsonFormat": { "message": "Format JSON invalide. Doit être { \"tokens\": [...] }" },
"tokensSaved": { "message": "Token salvati con successo." }, "tokensSaved": { "message": "Jetons enregistrés avec succès." },
"errorSavingTokens": { "message": "Errore nel salvataggio dei token: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorSavingTokens": { "message": "Erreur lors de l'enregistrement des jetons : $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "IndexedDB non è disponibile." }, "dbNotAvailable": { "message": "IndexedDB n'est pas disponible." },
"dbExported": { "message": "Database esportato con successo." }, "dbExported": { "message": "Base de données exportée avec succès." },
"errorExportingDb": { "message": "Errore durante l'esportazione del database: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorExportingDb": { "message": "Erreur lors de l'exportation de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "Il file non contiene un oggetto JSON valido." }, "invalidJsonFile": { "message": "Le fichier ne contient pas d'objet JSON valide." },
"noDataToImport": { "message": "Il file non contiene dati per le sezioni correnti del DB." }, "noDataToImport": { "message": "Le fichier ne contient pas de données pour les sections de la base de données actuelle." },
"dbImported": { "message": "Database importato con successo." }, "dbImported": { "message": "Base de données importée avec succès." },
"errorImportingDb": { "message": "Errore durante l'importazione del database: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorImportingDb": { "message": "Erreur lors de l'importation de la base de données : $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Aggiornamento della vista con i nuovi dati in corso..." }, "updatingView": { "message": "Mise à jour de la vue avec les nouvelles données..." },
"confirmClearContent": { "message": "Sei sicuro di voler cancellare i dati locali dei contenuti (Film, Serie TV, Musica, ecc.)? Preferiti e Impostazioni NON verranno eliminati." }, "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": "Nessun trailer trovato per questo titolo." }, "trailerNotFound": { "message": "Aucune bande-annonce trouvée pour ce titre." },
"confirmClearHistory": { "message": "Sei sicuro di voler cancellare tutta la cronologia di visione? Questa azione non può essere annullata." }, "confirmClearHistory": { "message": "Êtes-vous sûr de vouloir effacer tout votre historique de visionnage ? Cette action ne peut pas être annulée." },
"historyCleared": { "message": "Cronologia di visione cancellata." }, "historyCleared": { "message": "Historique de visionnage effacé." },
"historyItemDeleted": { "message": "Elemento cancellato dalla cronologia." }, "historyItemDeleted": { "message": "Élément supprimé de l'historique." },
"errorGeneratingScript": { "message": "Prima genera uno script per poterlo copiare." }, "errorGeneratingScript": { "message": "Générez d'abord un script pour pouvoir le copier." },
"scriptCopied": { "message": "Script PHP copiato negli appunti." }, "scriptCopied": { "message": "Script PHP copié dans le presse-papiers." },
"errorCopyingScript": { "message": "Errore durante la copia dello script." }, "errorCopyingScript": { "message": "Erreur lors de la copie du script." },
"scriptGenerated": { "message": "Script PHP generato." }, "scriptGenerated": { "message": "Script PHP généré." },
"errorLoadingAlbum": { "message": "Errore nel caricamento dell'album: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingAlbum": { "message": "Erreur lors du chargement de l'album : $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Errore: Nessun server di foto è stato selezionato." }, "noPhotoServerSelected": { "message": "Erreur : Aucun serveur photo n'a été sélectionné." },
"loadingGenres": { "message": "Caricamento generi in corso..." }, "loadingGenres": { "message": "Chargement des genres..." },
"errorLoadingGenres": { "message": "Errore nel caricamento" }, "errorLoadingGenres": { "message": "Erreur de chargement" },
"noContentFound": { "message": "Nessun risultato trovato." }, "noContentFound": { "message": "Aucun résultat trouvé." },
"couldNotLoadContent": { "message": "Impossibile caricare il contenuto." }, "couldNotLoadContent": { "message": "Impossible de charger le contenu." },
"noFavorites": { "message": "Non hai ancora nessun preferito." }, "noFavorites": { "message": "Vous n'avez pas encore de favoris." },
"errorLoadingFavorites": { "message": "Errore nel caricamento dei preferiti." }, "errorLoadingFavorites": { "message": "Erreur lors du chargement des favoris." },
"historyEmpty": { "message": "La tua cronologia è vuota." }, "historyEmpty": { "message": "Votre historique est vide." },
"historyEmptySub": { "message": "Sfoglia e guarda contenuti perché appaiano qui." }, "historyEmptySub": { "message": "Explorez et regardez du contenu pour qu'il apparaisse ici." },
"errorGeneratingRecommendations": { "message": "Errore nella generazione dei consigliati." }, "errorGeneratingRecommendations": { "message": "Erreur lors de la génération des recommandations." },
"noRecommendations": { "message": "Dobbiamo conoscerti meglio per darti dei consigli!" }, "noRecommendations": { "message": "Nous devons mieux vous connaître pour vous donner des recommandations !" },
"errorGeneratingStats": { "message": "Errore nella generazione delle statistiche." }, "errorGeneratingStats": { "message": "Erreur lors de la génération des statistiques." },
"noServersForToken": { "message": "Nessun server associato trovato per questo token." }, "noServersForToken": { "message": "Aucun serveur associé trouvé pour ce jeton." },
"searchingActorContent": { "message": "Ricerca dei contenuti di $actorName$ in corso", "placeholders": { "actorName": { "content": "$1" } } }, "searchingActorContent": { "message": "Recherche de contenu de $actorName$", "placeholders": { "actorName": { "content": "$1" } } },
"errorLoadingActorContent": { "message": "Impossibile caricare i contenuti di $actorName$.", "placeholders": { "actorName": { "content": "$1" } } }, "errorLoadingActorContent": { "message": "Impossible de charger le contenu pour $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Errore nell'aggiungere stream: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorAddingStream": { "message": "Erreur lors de l'ajout de stream(s) : $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "L'URL del server PHP non è configurato. Per favore, impostalo nelle Impostazioni." }, "phpUrlNotConfigured": { "message": "L'URL du serveur PHP n'est pas configurée. Veuillez la configurer dans les Paramètres." },
"searchingStreams": { "message": "Ricerca di stream per \"$title$\" in corso...", "placeholders": { "title": { "content": "$1" } } }, "searchingStreams": { "message": "Recherche de streams pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Invio di $count$ stream al server in corso...", "placeholders": { "count": { "content": "$1" } } }, "sendingStreams": { "message": "Envoi de $count$ stream(s) au serveur...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream aggiunti con successo." }, "streamAddedSuccess": { "message": "Stream(s) ajouté(s) avec succès." },
"generatingM3U": { "message": "Generazione M3U per \"$title$\" in corso...", "placeholders": { "title": { "content": "$1" } } }, "generatingM3U": { "message": "Génération M3U pour \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "M3U per \"$title$\" scaricato.", "placeholders": { "title": { "content": "$1" } } }, "m3uDownloaded": { "message": "\"$title$\" téléchargé.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Errore nella generazione dell'M3U: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorGeneratingM3U": { "message": "Erreur lors de la génération M3U : $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Impostazioni salvate con successo." }, "settingsSavedSuccess": { "message": "Paramètres enregistrés avec succès." },
"errorSavingSettings": { "message": "Errore nel salvataggio delle impostazioni nel database." }, "errorSavingSettings": { "message": "Erreur lors de l'enregistrement des paramètres dans la base de données." },
"languageChangeReload": { "message": "Lingua cambiata. L'applicazione verrà ora ricaricata." }, "languageChangeReload": { "message": "Langue changée. L'application va maintenant être rechargée." },
"addedToFavorites": { "message": "Aggiunto ai preferiti." }, "addedToFavorites": { "message": "Ajouté aux favoris." },
"removedFromFavorites": { "message": "Rimosso dai preferiti." }, "removedFromFavorites": { "message": "Supprimé des favoris." },
"plexScanInProgress": { "message": "Scansione Plex già in corso." }, "plexScanInProgress": { "message": "Le scan Plex est déjà en cours." },
"plexScanStarting": { "message": "Avvio scansione Plex in corso..." }, "plexScanStarting": { "message": "Démarrage du scan Plex..." },
"noPlexTokens": { "message": "Nessun token Plex configurato." }, "noPlexTokens": { "message": "Aucun jeton Plex configuré." },
"clearingSections": { "message": "Pulizia sezioni: $sections$", "placeholders": { "sections": { "content": "$1" } } }, "clearingSections": { "message": "Nettoyage des sections : $sections$", "placeholders": { "sections": { "content": "$1" } } },
"sectionsCleared": { "message": "Sezioni pulite." }, "initialScanPhaseComplete": { "message": "Phase de scan initiale terminée." },
"tokenFoundServers": { "message": "Token $token$... ha trovato $count$ server.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } }, "retryPhaseFinished": { "message": "Phase de réessais terminée." },
"errorProcessingToken": { "message": "Errore nell'elaborazione del token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } }, "plexScanFinished": { "message": "Scan terminé. Mise à jour du contenu..." },
"initialScanPhaseComplete": { "message": "Fase di scansione iniziale completata." }, "scanCancelled": { "message": "Scan annulé par l'utilisateur." },
"retryPhaseFinished": { "message": "Fase di nuovo tentativo terminata." }, "scanCancelledInfo": { "message": "Scan annulé." },
"plexScanFinished": { "message": "Scansione Plex terminata. Aggiornamento dei contenuti in corso..." }, "errorInitializingMusicPlayer": { "message": "Erreur lors de l'initialisation du lecteur de musique." },
"plexScanFatalError": { "message": "ERRORE FATALE: $message$", "placeholders": { "message": { "content": "$1" } } }, "criticalErrorLoadingMusic": { "message": "Erreur critique lors du chargement des données musicales." },
"errorDuringScan": { "message": "Errore durante la scansione: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingArtists": { "message": "Erreur lors du chargement des artistes." },
"scanCancelled": { "message": "Scansione annullata dall'utente." }, "dbUnavailableError": { "message": "Erreur : Base de données non disponible." },
"scanCancelledInfo": { "message": "Scansione annullata." }, "updatingMusicData": { "message": "Mise à jour des données musicales..." },
"retyingSection": { "message": "Nuovo tentativo per la sezione \"$title$\"...", "placeholders": { "title": { "content": "$1" } } }, "musicDataUpdated": { "message": "Données musicales mises à jour." },
"retrySuccess": { "message": "[SUCCESSO] Nuovo tentativo per \"$title$\" completato.", "placeholders": { "title": { "content": "$1" } } }, "errorFetchingArtistSongs": { "message": "Erreur lors de la récupération des chansons de l'artiste." },
"retryError": { "message": "[ERRORE FINALE] Nuovo tentativo fallito per \"$title$\": $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } }, "errorLoadingSongs": { "message": "Erreur lors du chargement des chansons." },
"noRetriesPending": { "message": "Nessun nuovo tentativo in sospeso." }, "noArtistsFound": { "message": "Aucun artiste trouvé." },
"startingRetryPhase": { "message": "Avvio fase di nuovo tentativo per $count$ sezioni...", "placeholders": { "count": { "content": "$1" } } }, "shuffleOn": { "message": "Mode aléatoire activé." },
"retryPhaseCancelled": { "message": "Fase di nuovo tentativo annullata." }, "shuffleOff": { "message": "Mode aléatoire désactivé." },
"errorInitializingMusicPlayer": { "message": "Errore durante l'inizializzazione del lettore musicale." }, "playbackError": { "message": "Erreur de lecture" },
"criticalErrorLoadingMusic": { "message": "Errore critico nel caricamento dei dati musicali." }, "errorLabel": { "message": "Erreur" },
"errorLoadingArtists": { "message": "Errore nel caricamento degli artisti." }, "reloadingPage": { "message": "Rechargement de la page..." },
"dbUnavailableError": { "message": "Errore: Database non disponibile." }, "viewed": { "message": "Vu" },
"updatingMusicData": { "message": "Aggiornamento dati musicali in corso..." }, "local": { "message": "Local" },
"musicDataUpdated": { "message": "Dati musicali aggiornati." }, "topRatedSort": {"message": "Les mieux notés"},
"errorFetchingArtistSongs": { "message": "Errore nel recupero dei brani dell'artista." }, "recentSort": {"message": "Récents"},
"errorLoadingSongs": { "message": "Errore nel caricamento dei brani." }, "popularSort": {"message": "Populaires"},
"noArtistsFound": { "message": "Nessun artista trovato." }, "moviesSectionTitle": {"message": "Films"},
"artistsCounter": { "message": "$start$-$end$ di $total$", "placeholders": { "start": { "content": "$1" }, "end": { "content": "$2" }, "total": { "content": "$3" } } }, "seriesSectionTitle": {"message": "Séries"},
"artistsCounterSingle": { "message": "$total$ Artisti", "placeholders": { "total": { "content": "$1" } } }, "searchResultsFor": {"message": "Résultats pour \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"artistsCounterLoading": { "message": "Caricamento..." }, "contentFrom": {"message": "Contenu de $actor$", "placeholders": {"actor": {"content": "$1"}}},
"noSongsFound": { "message": "Nessun brano trovato." }, "explore": {"message": "Explorer"},
"shuffleOn": { "message": "Modalità riproduzione casuale attivata." }, "noGenre": {"message": "Sans catégorie"},
"shuffleOff": { "message": "Modalità riproduzione casuale disattivata." }, "synopsis": {"message": "Synopsis"},
"downloadingSong": { "message": "Avvio download di \"$title$\"...", "placeholders": { "title": { "content": "$1" } } }, "noSynopsis": {"message": "Aucune synopsis disponible."},
"songDownloaded": { "message": "\"$title$\" scaricato.", "placeholders": { "title": { "content": "$1" } } }, "director": {"message": "Réalisateur :"},
"errorDownloadingSong": { "message": "Errore durante il download di \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "writer": {"message": "Scénariste :"},
"generatingAlbumM3U": { "message": "Generazione M3U per \"$artist$\"...", "placeholders": { "artist": { "content": "$1" } } }, "viewOnImdb": {"message": "Voir sur IMDb"},
"albumM3UGenerated": { "message": "M3U per l'album \"$artist$\" generato.", "placeholders": { "artist": { "content": "$1" } } }, "watchTrailer": {"message": "Voir la bande-annonce"},
"playbackError": { "message": "Errore di riproduzione" }, "addToFavorites": {"message": "Ajouter aux favoris"},
"errorLabel": { "message": "Errore" }, "removeFromFavorites": {"message": "Supprimer des favoris"},
"reloadingPage": { "message": "Ricaricamento pagina in corso..." }, "notAvailable": {"message": "Non disponible"},
"viewed": { "message": "Visto" }, "mainCast": {"message": "Distribution principale"},
"local": { "message": "Locale" }, "seasonsAndEpisodes": {"message": "Saisons et épisodes"},
"topRatedSort": {"message": "Più Votati"}, "similarContent": {"message": "Contenu similaire"},
"recentSort": {"message": "Recenti"}, "episodesCount": {"message": "$count$ Épisodes", "placeholders": {"count": {"content": "$1"}}},
"popularSort": {"message": "Popolari"}, "seasonsCount": {"message": "$count$ Saisons", "placeholders": {"count": {"content": "$1"}}},
"moviesSectionTitle": {"message": "Film"},
"seriesSectionTitle": {"message": "Serie TV"},
"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 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"},
"episodesCount": {"message": "$count$ Episodi", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Stagioni", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}}, "runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Nessun trailer trovato per questo titolo."}, "noTrailerFound": {"message": "Aucune bande-annonce trouvée pour ce titre."},
"fatalInitError": {"message": "Errore Fatale di Inizializzazione"}, "fatalInitError": {"message": "Erreur d'initialisation fatale"},
"fatalInitErrorSub": {"message": "Impossibile caricare l'applicazione."}, "fatalInitErrorSub": {"message": "Impossible de charger l'application."},
"invalidStreamInfo": {"message": "Informazioni non valide."}, "invalidStreamInfo": {"message": "Informations invalides."},
"dbUnavailableForStreams": {"message": "Database locale non disponibile."}, "dbUnavailableForStreams": {"message": "Base de données locale non disponible."},
"noPlexServersForStreams": {"message": "Nessun server Plex."}, "noPlexServersForStreams": {"message": "Aucun serveur Plex."},
"notFoundOnServers": {"message": "\"$query$\" non trovato sui server.", "placeholders": {"query": {"content": "$1"}}}, "notFoundOnServers": {"message": "Impossible de trouver \"$query$\" sur les serveurs Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Poco fa" }, "relativeTime_justNow": { "message": "À l'instant" },
"relativeTime_minutesAgo": { "message": "$count$ minuti fa", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_minutesAgo": { "message": "Il y a $count$ minutes", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "$count$ ore fa", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_hoursAgo": { "message": "Il y a $count$ heures", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Ieri" }, "relativeTime_yesterday": { "message": "Hier" },
"relativeTime_daysAgo": { "message": "$count$ giorni fa", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_daysAgo": { "message": "Il y a $count$ jours", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Errore nel Caricamento dei Dettagli" }, "errorLoadingDetails": { "message": "Erreur lors du chargement des détails" },
"errorLoadingLocalContent": { "message": "Errore nel caricamento del contenuto locale." }, "errorLoadingLocalContent": { "message": "Erreur lors du chargement du contenu local." },
"errorServerResponse": { "message": "Risposta non riuscita dal server." }, "errorServerResponse": { "message": "Réponse du serveur non réussie." },
"errorPlexApi": { "message": "Errore $status$ dall'API di Plex.", "placeholders": { "status": { "content": "$1" } } }, "errorPlexApi": { "message": "Erreur $status$ de l'API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Errore nell'analisi dell'XML di Plex." }, "errorParsingPlexXml": { "message": "Erreur lors de l'analyse du XML Plex." },
"untitled": { "message": "Senza titolo" }, "untitled": { "message": "Sans titre" },
"itemCount": { "message": "$count$ elementi", "placeholders": { "count": { "content": "$1" } } }, "itemCount": { "message": "$count$ éléments", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Nessun server di foto" }, "noPhotoServers": { "message": "Aucun serveur photo" },
"jellyfinScanInProgress": { "message": "Scansione Jellyfin già in corso." }, "jellyfinScanInProgress": { "message": "Le scan Jellyfin est déjà en cours." },
"jellyfinScanning": { "message": "Scansione di Jellyfin in corso..." }, "jellyfinScanning": { "message": "Scan de Jellyfin en cours..." },
"jellyfinMissingCredentials": { "message": "Per favor, completa l'URL e il nome utente di Jellyfin." }, "jellyfinMissingCredentials": { "message": "Veuillez compléter l'URL et l'utilisateur de Jellyfin." },
"jellyfinConnecting": { "message": "Connessione a Jellyfin a: $url$", "placeholders": { "url": { "content": "$1" } } }, "jellyfinConnecting": { "message": "Connexion à Jellyfin en cours : $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "Autenticazione Jellyfin fallita: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinAuthFailed": { "message": "Échec de l'authentification Jellyfin : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Autenticazione Jellyfin riuscita." }, "jellyfinAuthSuccess": { "message": "Authentification Jellyfin réussie." },
"jellyfinFetchingLibraries": { "message": "Recupero delle librerie..." }, "jellyfinFetchingLibraries": { "message": "Récupération des bibliothèques..." },
"jellyfinFetchFailed": { "message": "Recupero delle librerie fallito: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinFetchFailed": { "message": "Erreur lors de la récupération des bibliothèques : $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Nessuna libreria di film o serie trovata su Jellyfin." }, "jellyfinNoMediaLibraries": { "message": "Aucune bibliothèque de films ou de séries trouvée dans Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ libreria(e) multimediale(i) trovata(e).", "placeholders": { "count": { "content": "$1" } } }, "jellyfinLibrariesFound": { "message": "$count$ bibliothèque(s) multimédia(s) trouvée(s).", "placeholders": {"count": {"content": "$1"}}},
"jellyfinLibraryScanSuccess": { "message": "[Successo] Scansionata '$libraryName, aggiunti $count$ titoli.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } }, "jellyfinLibraryScanSuccess": { "message": "[Succès] '$libraryName$' scanné, $count$ titres ajoutés.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Scansione della libreria '$libraryName fallita.", "placeholders": { "libraryName": { "content": "$1" } } }, "jellyfinLibraryScanFailed": { "message": "Erreur lors du scan de la bibliothèque '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Scansione Jellyfin completata. Aggiunti $movies$ film e $series$ serie.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } }, "jellyfinScanSuccess": { "message": "Scan Jellyfin terminé. $movies$ films et $series$ séries ajoutés.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } },
"noJellyfinCredentials": { "message": "Credenziali di Jellyfin non configurate." }, "noJellyfinCredentials": { "message": "Identifiants Jellyfin non configurés." },
"notFoundOnJellyfin": { "message": "\"$query$\" non trovato su Jellyfin.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnJellyfin": { "message": "Impossible de trouver \"$query$\" sur Jellyfin.", "placeholders": {"query": {"content": "$1"}}},
"notFoundOnAnyServer": { "message": "\"$query$\" non trovato su nessun server.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnAnyServer": { "message": "Impossible de trouver \"$query$\" sur aucun serveur.", "placeholders": {"query": {"content": "$1"}}},
"localOnPlex": { "message": "Su Plex" }, "localOnPlex": { "message": "Sur Plex" },
"searchOnPlex": { "message": "Cerca su Plex" }, "searchOnPlex": { "message": "Rechercher sur Plex" },
"jellyfinTitle": { "message": "Contenuto Jellyfin" }, "jellyfinTitle": { "message": "Contenu Jellyfin" },
"noJellyfinContent": { "message": "Nessun contenuto Jellyfin trovato." }, "noJellyfinContent": { "message": "Aucun contenu Jellyfin trouvé." },
"noJellyfinContentSub": { "message": "Assicurati di aver scansionato il tuo server Jellyfin nelle impostazioni." }, "noJellyfinContentSub": { "message": "Assurez-vous d'avoir scanné votre serveur Jellyfin dans les paramètres." },
"activityViewerTitle": { "message": "Visualizzatore Attività Server" }, "activityViewerTitle": { "message": "Visionneuse d'activité du serveur" },
"activitySelectServer": { "message": "Seleziona un server" }, "activitySelectServer": { "message": "Sélectionner un serveur" },
"activityCheckBtn": { "message": "Aggiorna" }, "activityCheckBtn": { "message": "Actualiser" },
"activityNoSessions": { "message": "Nessuna sessione attiva su questo server." }, "activityNoSessions": { "message": "Aucune session active sur ce serveur." },
"activitySessionUser": { "message": "Utente" }, "activitySessionUser": { "message": "Utilisateur" },
"activitySessionDevice": { "message": "Dispositivo" }, "activitySessionDevice": { "message": "Appareil" },
"activitySessionContent": { "message": "Contenuto" }, "activitySessionContent": { "message": "Contenu" },
"activitySessionState": { "message": "Stato" }, "activitySessionState": { "message": "État" },
"activitySessionIdentifier": { "message": "Identificatore Client" }, "activitySessionIdentifier": { "message": "Identifiant du client" },
"activityCopyID": { "message": "Copia ID" }, "activityCopyID": { "message": "Copier l'ID" },
"activityError": { "message": "Impossibile recuperare l'attività del server." }, "activityError": { "message": "Impossible d'obtenir l'activité du serveur." },
"activityCopied": { "message": "Identificatore copiato negli appunti!" }, "activityCopied": { "message": "Identifiant copié dans le presse-papiers !" },
"activityCopyError": { "message": "Copia dell'identificatore non riuscita." }, "activityCopyError": { "message": "Erreur lors de la copie de l'identifiant." },
"noProvidersFound": { "message": "Nessun fornitore trovato." }, "noProvidersFound": { "message": "Aucun fournisseur trouvé." },
"availableOnPlex": { "message": "Disponibile su Plex" }, "availableOnPlex": { "message": "Disponible sur Plex" },
"navM3uGenerator": { "message": "Generatore M3U" }, "m3uGeneratorTitle": { "message": "Générateur de listes M3U" },
"m3uGeneratorTitle": { "message": "Generatore di Playlist M3U" }, "selectAServer": { "message": "Sélectionner un serveur..." },
"selectAServer": { "message": "Seleziona un server..." }, "downloadM3u": { "message": "Télécharger M3U" },
"downloadM3u": { "message": "Scarica M3U" }, "m3uGenerator": { "message": "Générateur M3U" },
"m3uGenerator": { "message": "Generatore M3U" }, "selectLibraries": { "message": "Sélectionner les bibliothèques" },
"selectServer": { "message": "Seleziona Server" }, "howToUse": { "message": "Comment utiliser" },
"selectLibraries": { "message": "Seleziona Librerie" }, "m3uInstruction1": { "message": "Choisissez un serveur dans la liste." },
"howToUse": { "message": "Come Usare" }, "m3uInstruction2": { "message": "Sélectionnez une ou plusieurs bibliothèques à inclure." },
"m3uInstruction1": { "message": "Scegli un server dalla lista." }, "m3uInstruction3": { "message": "Cliquez sur le bouton de téléchargement." },
"m3uInstruction2": { "message": "Seleziona una o più librerie da includere." }, "m3uInstruction4": { "message": "Importez le fichier .m3u dans votre lecteur compatible." },
"m3uInstruction3": { "message": "Clicca sul pulsante di download." }, "chatOpen": { "message": "Ouvrir le chat" },
"m3uInstruction4": { "message": "Importa il file .m3u nel tuo lettore compatibile." }, "chatTitle": { "message": "Assistant IA" },
"settingsRegionLabel": { "message": "Regione per la scoperta di contenuti" },
"allRegions": { "message": "Tutte le regioni" },
"chatOpen": { "message": "Apri chat" },
"chatTitle": { "message": "Assistente AI" },
"chatClose": { "message": "X" }, "chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Scrivi il tuo messaggio..." }, "chatPlaceholder": { "message": "Écrivez votre message..." },
"chatSend": { "message": "➤" }, "chatSend": { "message": "➤" },
"chatGptError": { "message": "Spiacenti, non sono riuscito a ottenere una risposta. Per favore, riprova." }, "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." },
"chatWelcome": { "message": "Benvenuto! Sono il tuo assistente CinePlex. Chiedimi di film, serie o qualsiasi altra cosa tu voglia sapere." }, "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." },
"chatApiKeyMissing": { "message": "La chiave API di OpenAI non è impostata. Configurala nelle impostazioni dell'estensione." }, "chatApiInvalidResponse": { "message": "L'API a renvoyé une réponse invalide. Veuillez réessayer." },
"chatApiInvalidResponse": { "message": "L'API ha restituito una risposta non valida. Per favore, riprova." }, "chatApiError": { "message": "Erreur de communication avec l'assistant IA" },
"chatApiError": { "message": "Errore di comunicazione con l'assistente AI" }, "downloadAll": { "message": "Tout télécharger" },
"downloadAll": { "message": "Scarica tutto" }, "download": { "message": "Télécharger" },
"download": { "message": "Scarica" }, "aiToolSearchLibraryDesc": { "message": "Recherche dans la bibliothèque Plex de l'utilisateur des films ou séries par titre." },
"aiToolSearchLibraryDesc": { "message": "Cerca nella libreria Plex film o serie." }, "aiToolSearchLibraryQueryParamDesc": { "message": "Le titre du film ou de la série à rechercher." },
"aiToolSearchLibraryQueryDesc": { "message": "Il titolo da cercare." }, "aiToolSearchLibraryTypeParamDesc": { "message": "Le type de contenu à rechercher. Peut être 'movie' pour les films ou 'series' pour les séries. (Facultatif)." },
"aiToolSearchLibraryTypeDesc": { "message": "Il tipo di contenuto da cercare (film o serie)." }, "aiToolNavigateToPageDesc": { "message": "Navigue l'utilisateur vers une page spécifique de l'interface de l'application." },
"aiToolNavigateToPageDesc": { "message": "Naviga a una pagina specifica dell'applicazione." }, "aiToolNavigateToPagePageParamDesc": { "message": "Le nom de la page à naviguer, par exemple : 'movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', ou 'm3u-generator'." },
"aiToolNavigateToPagePageDesc": { "message": "La pagina a cui navigare." }, "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." },
"aiToolGetUserStatsDesc": { "message": "Ottiene le statistiche dell'utente." }, "aiToolShowItemDetailsDesc": { "message": "Affiche la page de détails d'un film ou d'une série spécifique par son titre et son type." },
"aiToolShowItemDetailsDesc": { "message": "Mostra i dettagli di un film o di una serie." }, "aiToolShowItemDetailsTitleParamDesc": { "message": "Le titre exact du film ou de la série." },
"aiToolShowItemDetailsTitleDesc": { "message": "Il titolo del film o della serie." }, "aiToolShowItemDetailsTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolShowItemDetailsTypeDesc": { "message": "Il tipo di contenuto (film o serie)." }, "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": "Aggiunge un film o una serie alla playlist." }, "aiToolAddToPlaylistTitleParamDesc": { "message": "Le titre du film ou de la série à ajouter." },
"aiToolAddToPlaylistTitleDesc": { "message": "Il titolo del film o della serie." }, "aiToolAddToPlaylistTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolAddToPlaylistTypeDesc": { "message": "Il tipo di contenuto (film o serie)." }, "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." },
"aiToolDownloadPlaylistDesc": { "message": "Scarica la playlist di un film o di una serie." }, "aiToolCheckAndDownloadTitlesParamDesc": { "message": "Un tableau de titres de films ou de séries à rechercher et télécharger." },
"aiToolDownloadPlaylistTitleDesc": { "message": "Il titolo del film o della serie." }, "aiToolCheckAndDownloadTypeParamDesc": { "message": "Le type de contenu de la liste. Doit être 'movie' ou 'series'." },
"aiToolDownloadPlaylistTypeDesc": { "message": "Il tipo di contenuto (film o serie)." }, "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": "Aggiunge o rimuove un film o una serie dai preferiti." }, "aiToolToggleFavoriteDesc": { "message": "Ajoute ou retire un film ou une série de la liste des favoris de l'utilisateur." },
"aiToolToggleFavoriteTitleDesc": { "message": "Il titolo del film o della serie." }, "aiToolToggleFavoriteTitleParamDesc": { "message": "Le titre du film ou de la série." },
"aiToolToggleFavoriteTypeDesc": { "message": "Il tipo di contenuto (film o serie)." }, "aiToolToggleFavoriteTypeParamDesc": { "message": "Le type de contenu. Doit être 'movie' ou 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Ottiene consigli per l'utente." }, "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": "Applica filtri alla vista corrente." }, "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." },
"aiToolApplyFiltersTypeDesc": { "message": "Il tipo di contenuto da filtrare (film o serie)." }, "aiToolApplyFiltersTypeParamDesc": { "message": "Le type de contenu auquel appliquer les filtres. Doit être 'movie' ou 'series'." },
"aiToolApplyFiltersGenreDesc": { "message": "Il genere per cui filtrare." }, "aiToolApplyFiltersGenreParamDesc": { "message": "Le nom du genre par lequel filtrer (par exemple, 'Action', 'Drame')." },
"aiToolApplyFiltersYearDesc": { "message": "L'anno per cui filtrare." }, "aiToolApplyFiltersYearParamDesc": { "message": "L'année de sortie par laquelle filtrer (par exemple, '2023')." },
"aiToolApplyFiltersSortDesc": { "message": "L'ordine in cui ordinare i risultati." }, "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": "Riproduce la musica di un artista specifico." }, "aiToolPlayMusicByArtistDesc": { "message": "Ouvre le lecteur de musique et commence à jouer des chansons d'un artiste spécifique de la bibliothèque de l'utilisateur." },
"aiToolPlayMusicByArtistNameDesc": { "message": "Il nome dell'artista." }, "aiToolPlayMusicByArtistNameParamDesc": { "message": "Le nom exact de l'artiste dont les chansons sont à jouer." },
"aiToolClearChatHistoryDesc": { "message": "Cancella la cronologia della chat." }, "aiToolClearChatHistoryDesc": { "message": "Efface tout l'historique des messages de la conversation actuelle avec l'assistant IA." },
"aiToolDeleteDatabaseDesc": { "message": "Elimina il database dell'estensione." }, "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": "Aggiorna tutti i token Plex." }, "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": "Aggiunge un nuovo token Plex." }, "aiToolAddPlexTokenDesc": { "message": "Ajoute un nouveau jeton X-Plex à la configuration de l'extension, permettant à l'application de scanner le contenu des nouveaux serveurs Plex." },
"aiToolAddPlexTokenTokenDesc": { "message": "Il token Plex da aggiungere." }, "aiToolAddPlexTokenTokenParamDesc": { "message": "La chaîne du jeton X-Plex à ajouter." },
"aiToolChangeRegionDesc": { "message": "Cambia la regione per la scoperta di contenuti." }, "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." },
"aiToolChangeRegionRegionDesc": { "message": "Il codice regionale a due lettere (ad es. US, ES, FR)." }, "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": "Cancella tutti i preferiti dell'utente." }, "aiToolClearAllFavoritesDesc": { "message": "Supprime tous les films et séries que l'utilisateur a marqués comme favoris." },
"aiToolClearRecommendationsViewDesc": { "message": "Cancella la vista dei consigliati." }, "aiToolClearViewingHistoryDesc": { "message": "Efface l'historique de visionnage de l'utilisateur de la page d'historique." },
"aiToolFavoritesCleared": { "message": "Preferiti cancellati." }, "aiToolClearRecommendationsViewDesc": { "message": "Nettoie la vue des recommandations et supprime les recommandations mises en cache." },
"aiToolFavoritesClearError": { "message": "Errore durante la cancellazione dei preferiti: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolSearchNotFound": { "message": "Impossible de trouver '$query$' dans votre bibliothèque.", "placeholders": { "query": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Consigliati cancellati." }, "aiToolNavigateSuccess": { "message": "Navigué vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolRecommendationsClearError": { "message": "Errore durante la cancellazione dei consigliati: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolNavigateError": { "message": "Erreur lors de la navigation vers la page $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Database eliminato. La pagina verrà ricaricata." }, "aiToolStatsError": { "message": "Erreur lors de l'obtention des statistiques." },
"aiToolDatabaseDeleteError": { "message": "Errore durante l'eliminazione del database: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolItemNotFound": { "message": "L'élément '$title$' n'a pas été trouvé.", "placeholders": { "title": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "L'eliminazione del database è bloccata. Chiudere le altre schede dell'applicazione." }, "aiToolShowItemDetailsSuccess": { "message": "Affichage des détails de '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolUpdateAllTokensSuccess": { "message": "Tutti i token sono stati aggiornati con successo." }, "aiToolAddToPlaylistSuccess": { "message": "Ajouté '$title$' à la liste de lecture.", "placeholders": { "title": { "content": "$1" } } },
"aiToolUpdateAllTokensError": { "message": "Errore durante l'aggiornamento dei token: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolFavoriteAdded": { "message": "Ajouté '$title$' aux favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Token Plex aggiunto con successo." }, "aiToolFavoriteRemoved": { "message": "Supprimé '$title$' des favoris.", "placeholders": { "title": { "content": "$1" } } },
"aiToolAddPlexTokenError": { "message": "Errore durante l'aggiunta del token Plex: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolRecommendationsSuccess": { "message": "Affichage des recommandations." },
"aiToolChangeRegionSuccess": { "message": "Regione cambiata in $region$. Il contenuto è in fase di aggiornamento.", "placeholders": { "region": { "content": "$1" } } }, "aiToolApplyFiltersGenreNotFound": { "message": "Genre '$genre$' non trouvé.", "placeholders": { "genre": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Errore durante la modifica della regione: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolApplyFiltersSuccess": { "message": "Filtres appliqués avec succès." },
"aiSystemPrompt_v2": { "message": "Sei un assistente esperto di film e serie chiamato CinePlex. La tua funzione principale è aiutare gli utenti a interagire con la loro libreria multimediale e scoprire contenuti. Segui queste regole: 1. Quando un utente chiede un elenco o una raccomandazione (ad es. 'dimmi 5 film dell'orrore', 'le migliori serie di fantascienza'), DEVI usare le tue conoscenze per generare l'elenco e presentarlo in un formato numerato o puntato. NON usare strumenti per questa attività di scoperta iniziale. 2. Dopo aver presentato l'elenco, se l'utente ti chiede di scaricarlo, controllarlo o creare un M3U, ALLORA e solo allora, usa lo strumento 'generate_m3u_from_titles_list' passandogli i titoli che hai appena menzionato. 3. Per qualsiasi altra azione come navigare nell'app, ottenere statistiche o cercare un TITOLO SPECIFICO nella libreria dell'utente, usa gli strumenti appropriati. Sii conciso, amichevole ed efficiente." }, "aiToolPlayMusicNotReady": { "message": "Le lecteur de musique n'est pas prêt. Assurez-vous que votre bibliothèque musicale Plex a été scannée." },
"aiToolSearchLibraryDesc_v2": { "message": "L'elenco dei titoli da elaborare è vuoto." }, "aiToolPlayMusicArtistNotFound": { "message": "Artiste '$artist_name$' non trouvé.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolM3UNoLocalMatches": { "message": "Sembra che tu non abbia nessuno dei titoli di quell'elenco sui tuoi server locali." }, "aiToolPlayMusicNoSongs": { "message": "Aucune chanson trouvée pour '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolGenerateM3UTypeDesc": { "message": "Il tipo di contenuto da cercare: 'movie' o 'series'." }, "aiToolPlayMusicSuccess": { "message": "Lecture de musique de '$artist_name$'.", "placeholders": { "artist_name": { "content": "$1" } } },
"aiToolGenerateM3UFilenameDesc": { "message": "Un nome file personalizzato per la playlist M3U scaricata." }, "aiToolChatHistoryCleared": { "message": "Historique du chat effacé." },
"aiToolGenerateM3USuccess": { "message": "Capito! Sto generando una playlist M3U con $1 elementi. Il download dovrebbe iniziare a breve.", "placeholders": { "1": { "content": "$1" } } }, "aiToolConfirmDeleteDatabase": { "message": "Êtes-vous sûr de vouloir supprimer la base de données locale ? Cette action est irréversible." },
"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** affermare 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 raccomandazioni o elenchi (ad es. 'dammi 5 film dell'orrore'), usa le tue conoscenze per generare l'elenco. Presentalo in formato numerato o puntato. Dopo aver mostrato 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 o la ricerca di un titolo specifico, utilizza gli strumenti appropriati. Sii sempre conciso, amichevole ed efficiente." }, "aiToolDeleteDatabaseCancelled": { "message": "Suppression de la base de données annulée." },
"aiToolCheckAndDownloadDesc": { "message": "Controlla un elenco di titoli di film o serie rispetto ai server locali dell'utente e, se vengono trovate corrispondenze, genera e scarica un file di playlist M3U." }, "aiToolExecutionError": { "message": "Erreur lors de l'exécution de l'outil '$toolName$' : $message$", "placeholders": { "toolName": { "content": "$1" }, "message": { "content": "$2" } } },
"aiToolGenerateM3UFromTitlesTitlesDesc": { "message": "Un elenco di titoli di film o serie da controllare e scaricare." }, "aiToolUnknown": { "message": "Outil inconnu : '$toolName$'.", "placeholders": { "toolName": { "content": "$1" } } },
"aiToolM3UNoTitlesProvided": { "message": "Fornisci un elenco di titoli per creare la playlist." }, "aiToolFavoritesCleared": { "message": "Favoris effacés." },
"aiToolM3UCheckingTitles": { "message": "Controllo dei titoli sui tuoi server locali..." }, "aiToolFavoritesClearError": { "message": "Erreur lors de l'effacement des favoris : $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Non sono riuscito a trovare nessuno dei film o delle serie dell'elenco sui tuoi server locali." }, "aiToolRecommendationsCleared": { "message": "Recommandations effacées." },
"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" } } } "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" }
} }

View File

@ -1,133 +1,135 @@
{ {
"appName": { "message": "CinePlex" }, "appName": { "message": "CinePlex" },
"appDescription": { "message": "Analisa servidores Plex para encontrar conteúdo e o exibe na interface" }, "appDescription": { "message": "Scaneia servidores Plex para encontrar conteúdo e mostra-o na interface" },
"appTagline": { "message": "Filmes, Séries e Música" }, "appTagline": { "message": "Filmes, Séries e Música" },
"appLocaleCode": { "message": "pt-BR" }, "appLocaleCode": { "message": "pt-PT" },
"toggleNavigation": { "message": "Alternar Navegação" }, "toggleNavigation": { "message": "Alternar Navegação" },
"searchPlaceholder": { "message": "Pesquisar filmes ou séries..." }, "searchPlaceholder": { "message": "Pesquisar filmes ou séries..." },
"openMusicPlayer": { "message": "Abrir Player de Música" }, "openMusicPlayer": { "message": "Abrir Reprodutor de Música" },
"settings": { "message": "Configurações" }, "settings": { "message": "Definições" },
"navMovies": { "message": "Filmes" }, "navMovies": { "message": "Filmes" },
"navSeries": { "message": "Séries" }, "navSeries": { "message": "Séries" },
"navProviders": { "message": "Provedores" }, "navProviders": { "message": "Fornecedores" },
"navPhotos": { "message": "Fotos" }, "navPhotos": { "message": "Fotos" },
"navStats": { "message": "Estatísticas" }, "navStats": { "message": "Estatísticas" },
"navFavorites": { "message": "Favoritos" }, "navFavorites": { "message": "Favoritos" },
"navHistory": { "message": "Histórico" }, "navHistory": { "message": "Histórico" },
"navRecommendations": { "message": "Recomendações" }, "navRecommendations": { "message": "Recomendações" },
"navMusic": { "message": "Música" }, "navMusic": { "message": "Música" },
"navM3uGenerator": { "message": "Gerador M3U" },
"heroWelcome": { "message": "" }, "heroWelcome": { "message": "" },
"heroSubtitle": { "message": "Explore milhares de filmes e séries." }, "heroSubtitle": { "message": "Explore milhares de filmes e séries." },
"addStream": { "message": "Adicionar Stream" }, "addStream": { "message": "Adicionar Stream" },
"moreInfo": { "message": "Mais Informações" }, "moreInfo": { "message": "Mais informações" },
"popularMovies": { "message": "Filmes Populares" }, "popularMovies": { "message": "Filmes Populares" },
"allGenres": { "message": "Todos os neros" }, "allGenres": { "message": "Todos os neros" },
"allYears": { "message": "Todos os Anos" }, "allYears": { "message": "Todos os anos" },
"sortPopular": { "message": "Mais Populares" }, "sortPopular": { "message": "Mais populares" },
"sortTopRated": { "message": "Mais Bem Avaliados" }, "sortTopRated": { "message": "Melhor avaliados" },
"sortRecent": { "message": "Mais Recentes" }, "sortRecent": { "message": "Mais recentes" },
"loadMore": { "message": "Carregar Mais" }, "loadMore": { "message": "Carregar mais" },
"photosBreadcrumbHome": { "message": "Álbuns" }, "photosBreadcrumbHome": { "message": "Álbuns" },
"selectServer": { "message": "Selecione um servidor" }, "selectServer": { "message": "Selecionar um servidor" },
"loading": { "message": "Carregando..." }, "loading": { "message": "A carregar..." },
"loadingLibraries": { "message": "Carregando bibliotecas..." }, "loadingLibraries": { "message": "A carregar bibliotecas..." },
"photosEmptyState": { "message": "Nenhum álbum ou foto encontrado." }, "photosEmptyState": { "message": "Nenhum álbum ou foto encontrada." },
"photosEmptyStateSub": { "message": "Por favor, selecione um servidor ou certifique-se de que você tem uma biblioteca de fotos no Plex." }, "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" }, "statsTitle": { "message": "Estatísticas da Biblioteca" },
"statsAllTokens": { "message": "Todos os Tokens" }, "statsAllTokens": { "message": "Todos os Tokens" },
"statsAnalyzing": { "message": "Analisando sua biblioteca..." }, "statsAnalyzing": { "message": "A analisar a sua biblioteca..." },
"statsActiveTokens": { "message": "Tokens Ativos" }, "statsActiveTokens": { "message": "Tokens Ativos" },
"statsServersFound": { "message": "Servidores Encontrados" }, "statsServersFound": { "message": "Servidores Encontrados" },
"statsUniqueMovies": { "message": "Filmes Únicos" }, "statsUniqueMovies": { "message": "Filmes Únicos" },
"statsUniqueSeries": { "message": "Séries Únicas" }, "statsUniqueSeries": { "message": "Séries Únicas" },
"statsUniqueArtists": { "message": "Artistas Únicos" }, "statsUniqueArtists": { "message": "Artistas Únicos" },
"statsTokenServers": { "message": "Servidores do Token" }, "statsTokenServers": { "message": "Servidores do Token" },
"statsChartMoviesByGenre": { "message": "Conteúdo por Gênero (Filmes)" }, "statsChartMoviesByGenre": { "message": "Conteúdo por Género (Filmes)" },
"statsChartSeriesByGenre": { "message": "Conteúdo por Gênero (Séries)" }, "statsChartSeriesByGenre": { "message": "Conteúdo por Género (Séries)" },
"statsChartByDecade": { "message": "Conteúdo por Década" }, "statsChartByDecade": { "message": "Conteúdo por Década" },
"recommendationsTitle": { "message": "Recomendações para Você" }, "recommendationsTitle": { "message": "Recomendações para si" },
"historyTitle": { "message": "Histórico de Visualização" }, "historyTitle": { "message": "Histórico de Visualização" },
"clearHistory": { "message": "Limpar Tudo" }, "clearHistory": { "message": "Limpar Tudo" },
"consoleTitle": { "message": "Console de Análise do Plex" }, "consoleTitle": { "message": "Consola de Leitura Plex" },
"footerCredit": { "message": "Uma interface para o seu universo Plex." }, "footerCredit": { "message": "Uma interface para o seu universo Plex." },
"backButton": { "message": "Voltar" },
"closeTrailer": { "message": "Fechar trailer" }, "closeTrailer": { "message": "Fechar trailer" },
"close": { "message": "Fechar" }, "close": { "message": "Fechar" },
"photoViewer": { "message": "Visualizador de Fotos" }, "photoViewer": { "message": "Visualizador de fotos" },
"previous": { "message": "Anterior" }, "previous": { "message": "Anterior" },
"next": { "message": "Próximo" }, "next": { "message": "Próximo" },
"notificationTemplateText": { "message": "Notificação" }, "notificationTemplateText": { "message": "Notificação" },
"settingsTitleFull": { "message": "Configurações e Ajustes" }, "settingsTitleFull": { "message": "Definições e Configuração" },
"settingsTabGeneral": { "message": "Geral" }, "settingsTabGeneral": { "message": "Geral" },
"settingsTabPlex": { "message": "Plex" }, "settingsTabPlex": { "message": "Plex" },
"settingsTabJellyfin": { "message": "Jellyfin" }, "settingsTabJellyfin": { "message": "Jellyfin" },
"settingsTabPhpGen": { "message": "Gerador de PHP" }, "settingsTabPhpGen": { "message": "Gerador PHP" },
"settingsTabData": { "message": "Dados" }, "settingsTabData": { "message": "Dados" },
"settingsApiServer": { "message": "Configuração de API e Servidor" }, "settingsApiServer": { "message": "Configuração de API e Servidor" },
"settingsTmdbApiLabel": { "message": "Chave da API do TMDB (Opcional)" }, "settingsTmdbApiLabel": { "message": "Chave de API TMDB (Opcional)" },
"settingsTmdbApiPlaceholder": { "message": "Usará a chave padrão se deixado em branco" }, "settingsTmdbApiPlaceholder": { "message": "Será usada a chave padrão se deixado em branco" },
"openaiApiKey": { "message": "Chave da API OpenAI" }, "settingsGoogleApiLabel": { "message": "Chave de API Google Gemini (Opcional)" },
"settingsTmdbLangLabel": { "message": "Idioma para TMDB e Interface" }, "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" }, "settingsPhpUrlLabel": { "message": "URL do Servidor para Adicionar Streams" },
"settingsPhpUrlPlaceholder": { "message": "https://seu-servidor.com/caminho/para/script.php" }, "settingsPhpUrlPlaceholder": { "message": "https://o-seu-servidor.com/caminho/para/o-script.php" },
"settingsInterface": { "message": "Interface" }, "settingsInterface": { "message": "Interface" },
"settingsLightTheme": { "message": "Modo Claro" }, "settingsLightTheme": { "message": "Modo Claro" },
"settingsShowHero": { "message": "Mostrar seção de boas-vindas 'Hero'" }, "settingsShowHero": { "message": "Mostrar secção de boas-vindas 'Hero'" },
"settingsScanContent": { "message": "Análise de Conteúdo" }, "settingsScanContent": { "message": "Análise de Conteúdo" },
"settingsScanDesc": { "message": "Selecione o que analisar e pressione o botão." }, "settingsScanDesc": { "message": "Selecione o que analisar e clique no botão." },
"settingsScanMovies": { "message": "Filmes" }, "settingsScanMovies": { "message": "Filmes" },
"settingsScanShows": { "message": "Séries" }, "settingsScanShows": { "message": "Séries" },
"settingsScanArtists": { "message": "Música" }, "settingsScanArtists": { "message": "Música" },
"settingsScanPhotos": { "message": "Fotos" }, "settingsScanPhotos": { "message": "Fotos" },
"settingsSelectAll": { "message": "Selecionar Tudo" }, "settingsSelectAll": { "message": "Selecionar Tudo" },
"settingsStartScan": { "message": "Iniciar Análise" }, "settingsStartScan": { "message": "Iniciar Análise" },
"settingsPlexTokens": { "message": "Tokens do Plex" }, "settingsPlexTokens": { "message": "Tokens Plex" },
"settingsPlexTokensDesc": { "message": "Edite a lista de tokens do Plex (formato JSON)." }, "settingsPlexTokensDesc": { "message": "Editar a lista de tokens Plex (formato JSON)." },
"settingsSaveTokens": { "message": "Salvar Tokens" }, "settingsSaveTokens": { "message": "Guardar Tokens" },
"settingsJellyfinTitle": { "message": "Configurações do Jellyfin" }, "settingsJellyfinTitle": { "message": "Configuração Jellyfin" },
"settingsJellyfinDesc": { "message": "Adicione os detalhes do seu servidor Jellyfin para analisar seu conteúdo." }, "settingsJellyfinDesc": { "message": "Adicione os dados do seu servidor Jellyfin para analisar o seu conteúdo." },
"jellyfinUrlLabel": { "message": "URL do Servidor Jellyfin" }, "jellyfinUrlLabel": { "message": "URL do Servidor Jellyfin" },
"jellyfinUserLabel": { "message": "Nome de usuário" }, "jellyfinUserLabel": { "message": "Nome de Utilizador" },
"jellyfinPassLabel": { "message": "Senha" }, "jellyfinPassLabel": { "message": "Palavra-passe" },
"jellyfinConnectAndScan": { "message": "Conectar e Analisar" }, "jellyfinConnectAndScan": { "message": "Ligar e Analisar" },
"settingsPhpGenTitle": { "message": "Gerador de Script PHP para Servidor" }, "settingsPhpGenTitle": { "message": "Gerador de Script PHP para o Servidor" },
"settingsPhpFileOptions": { "message": "Opções de Arquivo" }, "settingsPhpFileOptions": { "message": "Opções do Ficheiro" },
"settingsPhpSavePathLabel": { "message": "Caminho para Salvar no Servidor" }, "settingsPhpSavePathLabel": { "message": "Caminho de Gravação no Servidor" },
"settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listas (em branco para a mesma pasta)" }, "settingsPhpSavePathPlaceholder": { "message": "Ex: /var/www/html/listas (em branco para a mesma pasta)" },
"settingsPhpFilenameLabel": { "message": "Nome do Arquivo" }, "settingsPhpFilenameLabel": { "message": "Nome do Ficheiro" },
"settingsPhpFileAction": { "message": "Ação no Arquivo" }, "settingsPhpFileAction": { "message": "Ação no Ficheiro" },
"settingsPhpActionAppend": { "message": "Anexar ao final do arquivo (cumulativo)" }, "settingsPhpActionAppend": { "message": "Adicionar ao fim do ficheiro (cumulativo)" },
"settingsPhpActionOverwrite": { "message": "Sobrescrever o arquivo (começar do zero)" }, "settingsPhpActionOverwrite": { "message": "Sobrescrever o ficheiro (começar de novo)" },
"settingsPhpSecurity": { "message": "Segurança (Opcional)" }, "settingsPhpSecurity": { "message": "Segurança (Opcional)" },
"settingsPhpUseSecretKey": { "message": "Usar chave secreta (Recomendado)" }, "settingsPhpUseSecretKey": { "message": "Usar chave secreta (Recomendado)" },
"settingsPhpSecretKeyPlaceholder": { "message": "Digite uma chave secreta segura" }, "settingsPhpSecretKeyPlaceholder": { "message": "Introduza uma chave secreta segura" },
"settingsPhpGeneratedCode": { "message": "Código Gerado" }, "settingsPhpGeneratedCode": { "message": "Código Gerado" },
"settingsPhpGeneratedPlaceholder": { "message": "O código PHP gerado aparecerá aqui." }, "settingsPhpGeneratedPlaceholder": { "message": "O código PHP gerado aparecerá aqui." },
"settingsGenerateScript": { "message": "Gerar Script" }, "settingsGenerateScript": { "message": "Gerar Script" },
"settingsCopyScript": { "message": "Copiar Script" }, "settingsCopyScript": { "message": "Copiar Script" },
"settingsDataManagement": { "message": "Gerenciamento do Banco de Dados Local" }, "settingsDataManagement": { "message": "Gestão da Base de Dados Local" },
"settingsImportDb": { "message": "Importar BD de um Arquivo" }, "settingsImportDb": { "message": "Importar BD de Ficheiro" },
"settingsExportDb": { "message": "Exportar BD para um Arquivo" }, "settingsExportDb": { "message": "Exportar BD para Ficheiro" },
"settingsClearContent": { "message": "Limpar Dados de Conteúdo Local" }, "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 configurações." }, "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." },
"settingsClose": { "message": "Fechar" }, "settingsClose": { "message": "Fechar" },
"settingsSave": { "message": "Salvar Configurações" }, "settingsSave": { "message": "Guardar Definições" },
"musicSidenavTitle": { "message": "Música do Plex" }, "musicSidenavTitle": { "message": "Música do Plex" },
"musicAllServers": { "message": "Todos os Servidores" }, "musicAllServers": { "message": "Todos os Servidores" },
"musicSearchArtistPlaceholder": { "message": "Pesquisar artista..." }, "musicSearchArtistPlaceholder": { "message": "Pesquisar artista..." },
"musicSearchDiscographyPlaceholder": { "message": "Pesquisar na discografia..." }, "musicSearchDiscographyPlaceholder": { "message": "Pesquisar na discografia..." },
"musicNothingPlaying": { "message": "Nada tocando" }, "musicNothingPlaying": { "message": "Nada a reproduzir" },
"musicSelectSong": { "message": "Selecione uma música" }, "musicSelectSong": { "message": "Selecionar uma canção" },
"musicToStart": { "message": "para começar a tocar" }, "musicToStart": { "message": "para começar a reproduzir" },
"miniplayerDownloadSong": { "message": "Baixar música" }, "miniplayerDownloadSong": { "message": "Descarregar canção" },
"miniplayerDownloadAlbum": { "message": "Baixar álbum M3U" }, "miniplayerDownloadAlbum": { "message": "Descarregar álbum M3U" },
"miniplayerVolume": { "message": "Volume" }, "miniplayerVolume": { "message": "Volume" },
"miniplayerShuffle": { "message": "Aleatório" }, "miniplayerShuffle": { "message": "Aleatório" },
"miniplayerEqualizer": { "message": "Equalizador" }, "miniplayerEqualizer": { "message": "Equalizador" },
"miniplayerOpenList": { "message": "Abrir lista" }, "miniplayerOpenList": { "message": "Abrir lista" },
"eqTitle": { "message": "Equalizador Gráfico" }, "eqTitle": { "message": "Equalizador Gráfico" },
"eqPresetsLabel": { "message": "Predefinições" }, "eqPresetsLabel": { "message": "Predefinições" },
"eqPresetFlat": { "message": "Plano (Flat)" }, "eqPresetFlat": { "message": "Plano" },
"eqPresetRock": { "message": "Rock" }, "eqPresetRock": { "message": "Rock" },
"eqPresetPop": { "message": "Pop" }, "eqPresetPop": { "message": "Pop" },
"eqPresetJazz": { "message": "Jazz" }, "eqPresetJazz": { "message": "Jazz" },
@ -138,122 +140,102 @@
"infoModalFieldTitle": { "message": "Título:" }, "infoModalFieldTitle": { "message": "Título:" },
"infoModalFieldArtist": { "message": "Artista:" }, "infoModalFieldArtist": { "message": "Artista:" },
"infoModalFieldAlbum": { "message": "Álbum:" }, "infoModalFieldAlbum": { "message": "Álbum:" },
"infoModalFieldSong": { "message": "Música:" }, "infoModalFieldSong": { "message": "Canção:" },
"infoModalFieldYear": { "message": "Ano:" }, "infoModalFieldYear": { "message": "Ano:" },
"infoModalFieldGenre": { "message": "Gênero:" }, "infoModalFieldGenre": { "message": "Género:" },
"lang_en": { "message": "Inglês" }, "lang_en": { "message": "Inglês" },
"lang_es": { "message": "Espanhol" }, "lang_es": { "message": "Espanhol" },
"lang_fr": { "message": "Francês" }, "lang_fr": { "message": "Francês" },
"lang_de": { "message": "Alemão" }, "lang_de": { "message": "Alemão" },
"lang_it": { "message": "Italiano" }, "lang_it": { "message": "Italiano" },
"lang_pt": { "message": "Português" }, "lang_pt": { "message": "Português" },
"essentialFeaturesNotSupported": { "message": "Seu navegador não suporta recursos essenciais." }, "essentialFeaturesNotSupported": { "message": "O seu navegador não suporta funções essenciais." },
"dbAccessError": { "message": "Erro ao acessar o banco de dados local." }, "dbAccessError": { "message": "Erro ao aceder à base de dados local." },
"dbUpdateNeeded": { "message": "O banco de dados precisa ser atualizado, por favor, recarregue a página." }, "dbUpdateNeeded": { "message": "A base de dados precisa de ser atualizada, por favor, recarregue a página." },
"dbBlocked": { "message": "Por favor, feche outras abas desta aplicação para continuar." }, "dbBlocked": { "message": "Por favor, feche outros separadores desta aplicação para continuar." },
"deletingContentData": { "message": "Excluindo dados de conteúdo local..." }, "deletingContentData": { "message": "A apagar dados de conteúdo locais..." },
"noContentDataToDelete": { "message": "Nenhum dado de conteúdo para excluir." }, "noContentDataToDelete": { "message": "Não há dados de conteúdo para apagar." },
"contentDataDeleted": { "message": "Dados de conteúdo excluídos do IndexedDB." }, "contentDataDeleted": { "message": "Dados de conteúdo apagados do IndexedDB." },
"errorDeletingData": { "message": "Erro ao excluir dados: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorDeletingData": { "message": "Erro ao apagar dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailable": { "message": "Editor de texto não disponível." }, "aceEditorNotAvailable": { "message": "Editor de texto não disponível." },
"errorLoadingTokens": { "message": "Erro ao carregar tokens no editor." }, "errorLoadingTokens": { "message": "Erro ao carregar tokens para edição." },
"errorLoadingTokensMessage": { "message": "Erro ao carregar tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingTokensMessage": { "message": "Erro ao carregar tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aceEditorNotAvailableToSave": { "message": "Editor não disponível para salvar." }, "aceEditorNotAvailableToSave": { "message": "Editor não disponível para guardar." },
"invalidJsonFormat": { "message": "Formato JSON inválido. Deve ser { \"tokens\": [...] }" }, "invalidJsonFormat": { "message": "Formato JSON inválido. Deve ser { \"tokens\": [...] }" },
"tokensSaved": { "message": "Tokens salvos com sucesso." }, "tokensSaved": { "message": "Tokens guardados com sucesso." },
"errorSavingTokens": { "message": "Erro ao salvar tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorSavingTokens": { "message": "Erro ao guardar tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"dbNotAvailable": { "message": "O IndexedDB não está disponível." }, "dbNotAvailable": { "message": "IndexedDB não está disponível." },
"dbExported": { "message": "Banco de dados exportado com sucesso." }, "dbExported": { "message": "Base de dados exportada com sucesso." },
"errorExportingDb": { "message": "Erro ao exportar banco de dados: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorExportingDb": { "message": "Erro ao exportar a base de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"invalidJsonFile": { "message": "O arquivo não contém um objeto JSON válido." }, "invalidJsonFile": { "message": "O ficheiro não contém um objeto JSON válido." },
"noDataToImport": { "message": "O arquivo não contém dados para as seções atuais do BD." }, "noDataToImport": { "message": "O ficheiro não contém dados para as secções da BD atual." },
"dbImported": { "message": "Banco de dados importado com sucesso." }, "dbImported": { "message": "Base de dados importada com sucesso." },
"errorImportingDb": { "message": "Erro ao importar banco de dados: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorImportingDb": { "message": "Erro ao importar a base de dados: $message$", "placeholders": { "message": { "content": "$1" } } },
"updatingView": { "message": "Atualizando a visualização com novos dados..." }, "updatingView": { "message": "A atualizar a vista com os 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." }, "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": "Nenhum trailer encontrado para este título." }, "trailerNotFound": { "message": "Não foi encontrado trailer para este título." },
"confirmClearHistory": { "message": "Tem certeza de que deseja excluir todo o seu histórico de visualização? Esta ação não pode ser desfeita." }, "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 limpo." }, "historyCleared": { "message": "Histórico de visualização apagado." },
"historyItemDeleted": { "message": "Item excluído do histórico." }, "historyItemDeleted": { "message": "Item apagado do histórico." },
"errorGeneratingScript": { "message": "Primeiro, gere um script para poder copiá-lo." }, "errorGeneratingScript": { "message": "Primeiro, gere um script para poder copiá-lo." },
"scriptCopied": { "message": "Script PHP copiado para a área de transferência." }, "scriptCopied": { "message": "Script PHP copiado para a área de transferência." },
"errorCopyingScript": { "message": "Erro ao copiar o script." }, "errorCopyingScript": { "message": "Erro ao copiar o script." },
"scriptGenerated": { "message": "Script PHP gerado." }, "scriptGenerated": { "message": "Script PHP gerado." },
"errorLoadingAlbum": { "message": "Erro ao carregar o álbum: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorLoadingAlbum": { "message": "Erro ao carregar álbum: $message$", "placeholders": { "message": { "content": "$1" } } },
"noPhotoServerSelected": { "message": "Erro: Nenhum servidor de fotos foi selecionado." }, "noPhotoServerSelected": { "message": "Erro: Nenhum servidor de fotos foi selecionado." },
"loadingGenres": { "message": "Carregando gêneros..." }, "loadingGenres": { "message": "A carregar géneros..." },
"errorLoadingGenres": { "message": "Erro ao carregar" }, "errorLoadingGenres": { "message": "Erro ao carregar" },
"noContentFound": { "message": "Nenhum resultado encontrado." }, "noContentFound": { "message": "Não foram encontrados resultados." },
"couldNotLoadContent": { "message": "Não foi possível carregar o conteúdo." }, "couldNotLoadContent": { "message": "Não foi possível carregar o conteúdo." },
"noFavorites": { "message": "Você ainda não tem favoritos." }, "noFavorites": { "message": "Ainda não tem favoritos." },
"errorLoadingFavorites": { "message": "Erro ao carregar os favoritos." }, "errorLoadingFavorites": { "message": "Erro ao carregar favoritos." },
"historyEmpty": { "message": "Seu histórico está vazio." }, "historyEmpty": { "message": "O seu histórico está vazio." },
"historyEmptySub": { "message": "Navegue e assista a conteúdos para que eles apareçam aqui." }, "historyEmptySub": { "message": "Explore e veja conteúdo para que apareça aqui." },
"errorGeneratingRecommendations": { "message": "Erro ao gerar recomendações." }, "errorGeneratingRecommendations": { "message": "Erro ao gerar recomendações." },
"noRecommendations": { "message": "Precisamos te conhecer melhor para dar recomendações!" }, "noRecommendations": { "message": "Precisamos de o conhecer melhor para lhe dar recomendações!" },
"errorGeneratingStats": { "message": "Erro ao gerar estatísticas." }, "errorGeneratingStats": { "message": "Erro ao gerar estatísticas." },
"noServersForToken": { "message": "Nenhum servidor associado encontrado para este token." }, "noServersForToken": { "message": "Não foram encontrados servidores associados para este token." },
"searchingActorContent": { "message": "Buscando conteúdo de $actorName$", "placeholders": { "actorName": { "content": "$1" } } }, "searchingActorContent": { "message": "A procurar 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" } } }, "errorLoadingActorContent": { "message": "Não foi possível carregar o conteúdo para $actorName$.", "placeholders": { "actorName": { "content": "$1" } } },
"errorAddingStream": { "message": "Erro ao adicionar stream(s): $message$", "placeholders": { "message": { "content": "$1" } } }, "errorAddingStream": { "message": "Erro ao adicionar stream(s): $message$", "placeholders": { "message": { "content": "$1" } } },
"phpUrlNotConfigured": { "message": "A URL do servidor PHP não está configurada. Por favor, configure-a nas Configurações." }, "phpUrlNotConfigured": { "message": "O URL do servidor PHP não está configurado. Por favor, configure-o em Definições." },
"searchingStreams": { "message": "Buscando streams para \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "searchingStreams": { "message": "A procurar streams para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"sendingStreams": { "message": "Enviando $count$ stream(s) para o servidor...", "placeholders": { "count": { "content": "$1" } } }, "sendingStreams": { "message": "A enviar $count$ stream(s) para o servidor...", "placeholders": { "count": { "content": "$1" } } },
"streamAddedSuccess": { "message": "Stream(s) adicionado(s) com sucesso." }, "streamAddedSuccess": { "message": "Stream(s) adicionado(s) com sucesso." },
"generatingM3U": { "message": "Gerando M3U para \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "generatingM3U": { "message": "A gerar M3U para \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"m3uDownloaded": { "message": "M3U para \"$title$\" baixado.", "placeholders": { "title": { "content": "$1" } } }, "m3uDownloaded": { "message": "\"$title$\" descarregado.", "placeholders": { "title": { "content": "$1" } } },
"errorGeneratingM3U": { "message": "Erro ao gerar M3U: $message$", "placeholders": { "message": { "content": "$1" } } }, "errorGeneratingM3U": { "message": "Erro ao gerar M3U: $message$", "placeholders": { "message": { "content": "$1" } } },
"settingsSavedSuccess": { "message": "Configurações salvas com sucesso." }, "settingsSavedSuccess": { "message": "Definições guardadas com sucesso." },
"errorSavingSettings": { "message": "Erro ao salvar as configurações no banco de dados." }, "errorSavingSettings": { "message": "Erro ao guardar as definições na base de dados." },
"languageChangeReload": { "message": "Idioma alterado. A aplicação será recarregada agora." }, "languageChangeReload": { "message": "Idioma alterado. A aplicação será recarregada agora." },
"addedToFavorites": { "message": "Adicionado aos favoritos." }, "addedToFavorites": { "message": "Adicionado aos favoritos." },
"removedFromFavorites": { "message": "Removido dos favoritos." }, "removedFromFavorites": { "message": "Removido dos favoritos." },
"plexScanInProgress": { "message": "A análise do Plex já está em andamento." }, "plexScanInProgress": { "message": "A análise do Plex já está em curso." },
"plexScanStarting": { "message": "Iniciando análise do Plex..." }, "plexScanStarting": { "message": "A iniciar análise do Plex..." },
"noPlexTokens": { "message": "Nenhum token do Plex configurado." }, "noPlexTokens": { "message": "Não há tokens Plex configurados." },
"clearingSections": { "message": "Limpando seções: $sections$", "placeholders": { "sections": { "content": "$1" } } }, "clearingSections": { "message": "A limpar secções: $sections$", "placeholders": { "sections": { "content": "$1" } } },
"sectionsCleared": { "message": "Seções limpas." }, "initialScanPhaseComplete": { "message": "Fase inicial de análise concluída." },
"tokenFoundServers": { "message": "Token $token$... encontrou $count$ servidores.", "placeholders": { "token": { "content": "$1" }, "count": { "content": "$2" } } }, "retryPhaseFinished": { "message": "Fase de retentativas concluída." },
"errorProcessingToken": { "message": "Erro ao processar o token $token$...: $message$", "placeholders": { "token": { "content": "$1" }, "message": { "content": "$2" } } }, "plexScanFinished": { "message": "Análise concluída. A atualizar conteúdo..." },
"initialScanPhaseComplete": { "message": "Fase de análise inicial concluída." }, "scanCancelled": { "message": "Análise cancelada pelo utilizador." },
"retryPhaseFinished": { "message": "Fase de nova tentativa concluída." },
"plexScanFinished": { "message": "Análise do Plex concluída. Atualizando conteúdo..." },
"plexScanFatalError": { "message": "ERRO FATAL: $message$", "placeholders": { "message": { "content": "$1" } } },
"errorDuringScan": { "message": "Erro durante a análise: $message$", "placeholders": { "message": { "content": "$1" } } },
"scanCancelled": { "message": "Análise cancelada pelo usuário." },
"scanCancelledInfo": { "message": "Análise cancelada." }, "scanCancelledInfo": { "message": "Análise cancelada." },
"retyingSection": { "message": "Tentando novamente a seção \"$title$\"", "placeholders": { "title": { "content": "$1" } } }, "errorInitializingMusicPlayer": { "message": "Erro ao iniciar o reprodutor de música." },
"retrySuccess": { "message": "[SUCESSO] Nova tentativa de \"$title$\" concluída.", "placeholders": { "title": { "content": "$1" } } },
"retryError": { "message": "[ERRO FINAL] A nova tentativa falhou para \"$title$\": $message$", "placeholders": { "title": { "content": "$1" }, "message": { "content": "$2" } } },
"noRetriesPending": { "message": "Nenhuma nova tentativa pendente." },
"startingRetryPhase": { "message": "Iniciando fase de nova tentativa para $count$ seções...", "placeholders": { "count": { "content": "$1" } } },
"retryPhaseCancelled": { "message": "Fase de nova tentativa cancelada." },
"errorInitializingMusicPlayer": { "message": "Erro ao inicializar o player de música." },
"criticalErrorLoadingMusic": { "message": "Erro crítico ao carregar dados de música." }, "criticalErrorLoadingMusic": { "message": "Erro crítico ao carregar dados de música." },
"errorLoadingArtists": { "message": "Erro ao carregar artistas." }, "errorLoadingArtists": { "message": "Erro ao carregar artistas." },
"dbUnavailableError": { "message": "Erro: Banco de dados não disponível." }, "dbUnavailableError": { "message": "Erro: Base de dados não disponível." },
"updatingMusicData": { "message": "Atualizando dados de música..." }, "updatingMusicData": { "message": "A atualizar dados de música..." },
"musicDataUpdated": { "message": "Dados de música atualizados." }, "musicDataUpdated": { "message": "Dados de música atualizados." },
"errorFetchingArtistSongs": { "message": "Erro ao obter as músicas do artista." }, "errorFetchingArtistSongs": { "message": "Erro ao obter as canções do artista." },
"errorLoadingSongs": { "message": "Erro ao carregar as músicas." }, "errorLoadingSongs": { "message": "Erro ao carregar canções." },
"noArtistsFound": { "message": "Nenhum artista encontrado." }, "noArtistsFound": { "message": "Não foram encontrados artistas." },
"artistsCounter": { "message": "$start$-$end$ de $total$", "placeholders": { "start": { "content": "$1" }, "end": { "content": "$2" }, "total": { "content": "$3" } } },
"artistsCounterSingle": { "message": "$total$ Artistas", "placeholders": { "total": { "content": "$1" } } },
"artistsCounterLoading": { "message": "Carregando..." },
"noSongsFound": { "message": "Nenhuma música encontrada." },
"shuffleOn": { "message": "Modo aleatório ativado." }, "shuffleOn": { "message": "Modo aleatório ativado." },
"shuffleOff": { "message": "Modo aleatório desativado." }, "shuffleOff": { "message": "Modo aleatório desativado." },
"downloadingSong": { "message": "Iniciando 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" } } },
"playbackError": { "message": "Erro de reprodução" }, "playbackError": { "message": "Erro de reprodução" },
"errorLabel": { "message": "Erro" }, "errorLabel": { "message": "Erro" },
"reloadingPage": { "message": "Recarregando página..." }, "reloadingPage": { "message": "A recarregar a página..." },
"viewed": { "message": "Visto" }, "viewed": { "message": "Visto" },
"local": { "message": "Local" }, "local": { "message": "Local" },
"topRatedSort": {"message": "Mais Bem Avaliados"}, "topRatedSort": {"message": "Melhor Avaliados"},
"recentSort": {"message": "Recentes"}, "recentSort": {"message": "Recentes"},
"popularSort": {"message": "Populares"}, "popularSort": {"message": "Populares"},
"moviesSectionTitle": {"message": "Filmes"}, "moviesSectionTitle": {"message": "Filmes"},
@ -261,163 +243,199 @@
"searchResultsFor": {"message": "Resultados para \"$query$\"", "placeholders": {"query": {"content": "$1"}}}, "searchResultsFor": {"message": "Resultados para \"$query$\"", "placeholders": {"query": {"content": "$1"}}},
"contentFrom": {"message": "Conteúdo de $actor$", "placeholders": {"actor": {"content": "$1"}}}, "contentFrom": {"message": "Conteúdo de $actor$", "placeholders": {"actor": {"content": "$1"}}},
"explore": {"message": "Explorar"}, "explore": {"message": "Explorar"},
"noGenre": {"message": "Sem Categoria"}, "noGenre": {"message": "Sem categoria"},
"synopsis": {"message": "Sinopse"}, "synopsis": {"message": "Sinopse"},
"noSynopsis": {"message": "Nenhuma sinopse disponível."}, "noSynopsis": {"message": "Não há sinopse disponível."},
"director": {"message": "Diretor:"}, "director": {"message": "Realizador:"},
"writer": {"message": "Roteirista:"}, "writer": {"message": "Argumentista:"},
"viewOnImdb": {"message": "Ver no IMDb"}, "viewOnImdb": {"message": "Ver no IMDb"},
"watchTrailer": {"message": "Assistir ao Trailer"}, "watchTrailer": {"message": "Ver Trailer"},
"addToFavorites": {"message": "Favoritar"}, "addToFavorites": {"message": "Adicionar aos favoritos"},
"removeFromFavorites": {"message": "Desfavoritar"}, "removeFromFavorites": {"message": "Remover dos favoritos"},
"notAvailable": {"message": "Não Disponível"}, "notAvailable": {"message": "Não disponível"},
"mainCast": {"message": "Elenco Principal"}, "mainCast": {"message": "Elenco Principal"},
"seasonsAndEpisodes": {"message": "Temporadas e Episódios"}, "seasonsAndEpisodes": {"message": "Temporadas e Episódios"},
"similarContent": {"message": "Conteúdo Similar"}, "similarContent": {"message": "Conteúdo Semelhante"},
"episodesCount": {"message": "$count$ Episódios", "placeholders": {"count": {"content": "$1"}}}, "episodesCount": {"message": "$count$ Episódios", "placeholders": {"count": {"content": "$1"}}},
"seasonsCount": {"message": "$count$ Temporadas", "placeholders": {"count": {"content": "$1"}}}, "seasonsCount": {"message": "$count$ Temporadas", "placeholders": {"count": {"content": "$1"}}},
"runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}}, "runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}},
"noTrailerFound": {"message": "Nenhum trailer foi encontrado para este título."}, "noTrailerFound": {"message": "Não foi encontrado trailer para este título."},
"fatalInitError": {"message": "Erro Fatal de Inicialização"}, "fatalInitError": {"message": "Erro fatal de inicialização"},
"fatalInitErrorSub": {"message": "A aplicação não pôde ser carregada."}, "fatalInitErrorSub": {"message": "Não foi possível carregar a aplicação."},
"invalidStreamInfo": {"message": "Informação inválida."}, "invalidStreamInfo": {"message": "Informação inválida."},
"dbUnavailableForStreams": {"message": "Banco de dados local não disponível."}, "dbUnavailableForStreams": {"message": "Base de dados local não disponível."},
"noPlexServersForStreams": {"message": "Nenhum servidor Plex."}, "noPlexServersForStreams": {"message": "Não há servidores Plex."},
"notFoundOnServers": {"message": "\"$query$\" não encontrado nos servidores.", "placeholders": {"query": {"content": "$1"}}}, "notFoundOnServers": {"message": "Não foi encontrado \"$query$\" nos servidores Plex.", "placeholders": {"query": {"content": "$1"}}},
"relativeTime_justNow": { "message": "Agora mesmo" }, "relativeTime_justNow": { "message": "Agora mesmo" },
"relativeTime_minutesAgo": { "message": "há $count$ minutos", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_minutesAgo": { "message": "Há $count$ minutos", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_hoursAgo": { "message": "há $count$ horas", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_hoursAgo": { "message": "Há $count$ horas", "placeholders": { "count": { "content": "$1" } } },
"relativeTime_yesterday": { "message": "Ontem" }, "relativeTime_yesterday": { "message": "Ontem" },
"relativeTime_daysAgo": { "message": "há $count$ dias", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_daysAgo": { "message": "Há $count$ dias", "placeholders": { "count": { "content": "$1" } } },
"errorLoadingDetails": { "message": "Erro ao Carregar Detalhes" }, "errorLoadingDetails": { "message": "Erro ao Carregar Detalhes" },
"errorLoadingLocalContent": { "message": "Erro ao carregar conteúdo local." }, "errorLoadingLocalContent": { "message": "Erro ao carregar o conteúdo local." },
"errorServerResponse": { "message": "Resposta sem sucesso do servidor." }, "errorServerResponse": { "message": "Resposta não bem-sucedida do servidor." },
"errorPlexApi": { "message": "Erro $status$ da API do Plex.", "placeholders": { "status": { "content": "$1" } } }, "errorPlexApi": { "message": "Erro $status$ da API Plex.", "placeholders": { "status": { "content": "$1" } } },
"errorParsingPlexXml": { "message": "Erro ao analisar o XML do Plex." }, "errorParsingPlexXml": { "message": "Erro ao analisar o XML Plex." },
"untitled": { "message": "Sem título" }, "untitled": { "message": "Sem título" },
"itemCount": { "message": "$count$ itens", "placeholders": { "count": { "content": "$1" } } }, "itemCount": { "message": "$count$ elementos", "placeholders": { "count": { "content": "$1" } } },
"noPhotoServers": { "message": "Nenhum servidor de fotos" }, "noPhotoServers": { "message": "Não há servidores de fotos" },
"jellyfinScanInProgress": { "message": "A análise do Jellyfin já está em andamento." }, "jellyfinScanInProgress": { "message": "A análise do Jellyfin já está em curso." },
"jellyfinScanning": { "message": "Analisando Jellyfin..." }, "jellyfinScanning": { "message": "A analisar Jellyfin..." },
"jellyfinMissingCredentials": { "message": "Por favor, complete a URL e o nome de usuário do Jellyfin." }, "jellyfinMissingCredentials": { "message": "Por favor, preencha o URL e o utilizador do Jellyfin." },
"jellyfinConnecting": { "message": "Conectando ao Jellyfin em: $url$", "placeholders": { "url": { "content": "$1" } } }, "jellyfinConnecting": { "message": "A ligar ao Jellyfin em: $url$", "placeholders": { "url": { "content": "$1" } } },
"jellyfinAuthFailed": { "message": "A autenticação do Jellyfin falhou: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinAuthFailed": { "message": "Autenticação Jellyfin falhada: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinAuthSuccess": { "message": "Autenticação do Jellyfin bem-sucedida." }, "jellyfinAuthSuccess": { "message": "Autenticação Jellyfin bem-sucedida." },
"jellyfinFetchingLibraries": { "message": "Buscando bibliotecas..." }, "jellyfinFetchingLibraries": { "message": "A obter bibliotecas..." },
"jellyfinFetchFailed": { "message": "Falha ao buscar bibliotecas: $message$", "placeholders": { "message": { "content": "$1" } } }, "jellyfinFetchFailed": { "message": "Erro ao obter bibliotecas: $message$", "placeholders": { "message": { "content": "$1" } } },
"jellyfinNoMediaLibraries": { "message": "Nenhuma biblioteca de filmes ou séries encontrada no Jellyfin." }, "jellyfinNoMediaLibraries": { "message": "Não foram encontradas bibliotecas de filmes ou séries no Jellyfin." },
"jellyfinLibrariesFound": { "message": "$count$ biblioteca(s) de mídia encontrada(s).", "placeholders": { "count": { "content": "$1" } } }, "jellyfinLibrariesFound": { "message": "$count$ biblioteca(s) de multimédia encontrada(s).", "placeholders": { "count": { "content": "$1" } } },
"jellyfinLibraryScanSuccess": { "message": "[Sucesso] Análise de '$libraryName' concluída, $count$ títulos adicionados.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } }, "jellyfinLibraryScanSuccess": { "message": "[Sucesso] '$libraryName$' analisada, $count$ títulos adicionados.", "placeholders": { "libraryName": { "content": "$1" }, "count": { "content": "$2" } } },
"jellyfinLibraryScanFailed": { "message": "Falha ao analisar a biblioteca '$libraryName'.", "placeholders": { "libraryName": { "content": "$1" } } }, "jellyfinLibraryScanFailed": { "message": "Erro ao analisar a biblioteca '$libraryName$'.", "placeholders": { "libraryName": { "content": "$1" } } },
"jellyfinScanSuccess": { "message": "Análise do Jellyfin concluída. Adicionados $movies$ filmes e $series$ séries.", "placeholders": { "movies": { "content": "$1" }, "series": { "content": "$2" } } }, "jellyfinScanSuccess": { "message": "Análise 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." }, "noJellyfinCredentials": { "message": "Credenciais Jellyfin não configuradas." },
"notFoundOnJellyfin": { "message": "\"$query$\" não encontrado no Jellyfin.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnJellyfin": { "message": "Não foi encontrado \"$query$\" no Jellyfin.", "placeholders": { "query": { "content": "$1" } } },
"notFoundOnAnyServer": { "message": "\"$query$\" não encontrado em nenhum servidor.", "placeholders": { "query": { "content": "$1" } } }, "notFoundOnAnyServer": { "message": "Não foi encontrado \"$query$\" em nenhum servidor.", "placeholders": { "query": { "content": "$1" } } },
"localOnPlex": { "message": "No Plex" }, "localOnPlex": { "message": "No Plex" },
"searchOnPlex": { "message": "Pesquisar no Plex" }, "searchOnPlex": { "message": "Pesquisar no Plex" },
"jellyfinTitle": { "message": "Conteúdo do Jellyfin" }, "jellyfinTitle": { "message": "Conteúdo do Jellyfin" },
"noJellyfinContent": { "message": "Nenhum conteúdo do Jellyfin encontrado." }, "noJellyfinContent": { "message": "Não foi encontrado conteúdo do Jellyfin." },
"noJellyfinContentSub": { "message": "Certifique-se de que você analisou seu servidor Jellyfin nas configurações." }, "noJellyfinContentSub": { "message": "Certifique-se de que analisou o seu servidor Jellyfin nas definições." },
"activityViewerTitle": { "message": "Visualizador de Atividade do Servidor" }, "activityViewerTitle": { "message": "Visualizador de Atividade do Servidor" },
"activitySelectServer": { "message": "Selecione um servidor" }, "activitySelectServer": { "message": "Selecionar um servidor" },
"activityCheckBtn": { "message": "Atualizar" }, "activityCheckBtn": { "message": "Atualizar" },
"activityNoSessions": { "message": "Nenhuma sessão ativa neste servidor." }, "activityNoSessions": { "message": "Não há sessões ativas neste servidor." },
"activitySessionUser": { "message": "Usuário" }, "activitySessionUser": { "message": "Utilizador" },
"activitySessionDevice": { "message": "Dispositivo" }, "activitySessionDevice": { "message": "Dispositivo" },
"activitySessionContent": { "message": "Conteúdo" }, "activitySessionContent": { "message": "Conteúdo" },
"activitySessionState": { "message": "Estado" }, "activitySessionState": { "message": "Estado" },
"activitySessionIdentifier": { "message": "Identificador do Cliente" }, "activitySessionIdentifier": { "message": "Identificador do Cliente" },
"activityCopyID": { "message": "Copiar ID" }, "activityCopyID": { "message": "Copiar ID" },
"activityError": { "message": "Não foi possível buscar a atividade do servidor." }, "activityError": { "message": "Não foi possível obter a atividade do servidor." },
"activityCopied": { "message": "Identificador copiado para a área de transferência!" }, "activityCopied": { "message": "Identificador copiado para a área de transferência!" },
"activityCopyError": { "message": "Falha ao copiar o identificador." }, "activityCopyError": { "message": "Erro ao copiar o identificador." },
"noProvidersFound": { "message": "Nenhum provedor encontrado." }, "noProvidersFound": { "message": "Não foram encontrados fornecedores." },
"availableOnPlex": { "message": "Disponível no Plex" }, "availableOnPlex": { "message": "Disponível no Plex" },
"navM3uGenerator": { "message": "Gerador M3U" }, "m3uGeneratorTitle": { "message": "Gerador de Listas M3U" },
"m3uGeneratorTitle": { "message": "Gerador de Lista de Reprodução M3U" }, "selectAServer": { "message": "Selecionar um servidor..." },
"selectAServer": { "message": "Selecione um servidor..." }, "downloadM3u": { "message": "Descarregar M3U" },
"downloadM3u": { "message": "Baixar M3U" },
"m3uGenerator": { "message": "Gerador M3U" }, "m3uGenerator": { "message": "Gerador M3U" },
"selectServer": { "message": "Selecionar Servidor" },
"selectLibraries": { "message": "Selecionar Bibliotecas" }, "selectLibraries": { "message": "Selecionar Bibliotecas" },
"howToUse": { "message": "Como Usar" }, "howToUse": { "message": "Como Usar" },
"m3uInstruction1": { "message": "Escolha um servidor da lista." }, "m3uInstruction1": { "message": "Escolha um servidor da lista." },
"m3uInstruction2": { "message": "Selecione uma ou mais bibliotecas para incluir." }, "m3uInstruction2": { "message": "Selecione uma ou mais bibliotecas para incluir." },
"m3uInstruction3": { "message": "Clique no botão de download." }, "m3uInstruction3": { "message": "Clique no botão de descarregar." },
"m3uInstruction4": { "message": "Importe o arquivo .m3u para o seu reprodutor compatível." }, "m3uInstruction4": { "message": "Importe o ficheiro .m3u para o seu reprodutor compatível." },
"settingsRegionLabel": { "message": "Região para descoberta de conteúdo" }, "chatOpen": { "message": "Abrir Chat" },
"allRegions": { "message": "Todas as regiões" }, "chatTitle": { "message": "Assistente IA" },
"chatOpen": { "message": "Abrir chat" },
"chatTitle": { "message": "Assistente de IA" },
"chatClose": { "message": "X" }, "chatClose": { "message": "X" },
"chatPlaceholder": { "message": "Digite sua mensagem..." }, "chatPlaceholder": { "message": "Escreva a sua mensagem..." },
"chatSend": { "message": "➤" }, "chatSend": { "message": "➤" },
"chatGptError": { "message": "Desculpe, não consegui obter uma resposta. Por favor, tente novamente." }, "chatWelcome": { "message": "Bem-vindo! Sou o seu assistente CinePlex. Pergunte-me sobre filmes, séries ou qualquer outra coisa que queira saber." },
"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 da API Google Gemini não está configurada. Por favor, configure-a nas definições da extensão para usar o assistente de IA." },
"chatApiKeyMissing": { "message": "A chave da API OpenAI não está definida. Configure-a nas configurações da extensão." }, "chatApiInvalidResponse": { "message": "A API devolveu uma resposta inválida. Por favor, tente novamente." },
"chatApiInvalidResponse": { "message": "A API retornou uma resposta inválida. Por favor, tente novamente." }, "chatApiError": { "message": "Erro ao comunicar com o assistente de IA" },
"chatApiError": { "message": "Erro ao se comunicar com o assistente de IA" }, "downloadAll": { "message": "Descarregar tudo" },
"downloadAll": { "message": "Baixar tudo" }, "download": { "message": "Descarregar" },
"download": { "message": "Baixar" }, "aiToolSearchLibraryDesc": { "message": "Pesquisa na biblioteca Plex do utilizador filmes ou séries por título." },
"aiToolSearchLibraryDesc": { "message": "Pesquisa na biblioteca Plex por filmes ou séries." }, "aiToolSearchLibraryQueryParamDesc": { "message": "O título do filme ou série a pesquisar." },
"aiToolSearchLibraryQueryDesc": { "message": "O título a ser pesquisado." }, "aiToolSearchLibraryTypeParamDesc": { "message": "O tipo de conteúdo a pesquisar. Pode ser 'movie' para filmes ou 'series' para séries. (Opcional)." },
"aiToolSearchLibraryTypeDesc": { "message": "O tipo de conteúdo a ser pesquisado (filme ou série)." }, "aiToolNavigateToPageDesc": { "message": "Navega o utilizador para uma página específica da interface da aplicação." },
"aiToolNavigateToPageDesc": { "message": "Navega para uma página específica no 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'." },
"aiToolNavigateToPagePageDesc": { "message": "A página para a qual navegar." }, "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." },
"aiToolGetUserStatsDesc": { "message": "Obtém estatísticas do usuário." }, "aiToolShowItemDetailsDesc": { "message": "Mostra a página de detalhes de um filme ou série específica pelo seu título e tipo." },
"aiToolShowItemDetailsDesc": { "message": "Mostra os detalhes de um filme ou série." }, "aiToolShowItemDetailsTitleParamDesc": { "message": "O título exato do filme ou série." },
"aiToolShowItemDetailsTitleDesc": { "message": "O título do filme ou série." }, "aiToolShowItemDetailsTypeParamDesc": { "message": "O tipo de conteúdo. Deve ser 'movie' ou 'series'." },
"aiToolShowItemDetailsTypeDesc": { "message": "O tipo de conteúdo (filme ou série)." }, "aiToolAddToPlaylistDesc": { "message": "Adiciona um filme ou série à lista de reprodução atual do utilizador para transmitir para um servidor PHP configurado." },
"aiToolAddToPlaylistDesc": { "message": "Adiciona um filme ou série à lista de reprodução." }, "aiToolAddToPlaylistTitleParamDesc": { "message": "O título do filme ou série a adicionar." },
"aiToolAddToPlaylistTitleDesc": { "message": "O título do filme ou série." }, "aiToolAddToPlaylistTypeParamDesc": { "message": "O tipo de conteúdo. Deve ser 'movie' ou 'series'." },
"aiToolAddToPlaylistTypeDesc": { "message": "O tipo de conteúdo (filme ou série)." }, "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." },
"aiToolDownloadPlaylistDesc": { "message": "Baixa a lista de reprodução de um filme ou série." }, "aiToolCheckAndDownloadTitlesParamDesc": { "message": "Uma matriz de títulos de filmes ou séries para pesquisar e descarregar." },
"aiToolDownloadPlaylistTitleDesc": { "message": "O título do filme ou série." }, "aiToolCheckAndDownloadTypeParamDesc": { "message": "O tipo de conteúdo da lista. Deve ser 'movie' ou 'series'." },
"aiToolDownloadPlaylistTypeDesc": { "message": "O tipo de conteúdo (filme ou série)." }, "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 dos favoritos." }, "aiToolToggleFavoriteDesc": { "message": "Adiciona ou remove um filme ou série da lista de favoritos do utilizador." },
"aiToolToggleFavoriteTitleDesc": { "message": "O título do filme ou série." }, "aiToolToggleFavoriteTitleParamDesc": { "message": "O título do filme ou série." },
"aiToolToggleFavoriteTypeDesc": { "message": "O tipo de conteúdo (filme ou série)." }, "aiToolToggleFavoriteTypeParamDesc": { "message": "O tipo de conteúdo. Deve ser 'movie' ou 'series'." },
"aiToolGetRecommendationsDesc": { "message": "Obtém recomendações para o usuário." }, "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 à visualização atual." }, "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." },
"aiToolApplyFiltersTypeDesc": { "message": "O tipo de conteúdo a ser filtrado (filme ou série)." }, "aiToolApplyFiltersTypeParamDesc": { "message": "O tipo de conteúdo ao qual aplicar os filtros. Deve ser 'movie' ou 'series'." },
"aiToolApplyFiltersGenreDesc": { "message": "O gênero pelo qual filtrar." }, "aiToolApplyFiltersGenreParamDesc": { "message": "O nome do género pelo qual filtrar (por exemplo, 'Ação', 'Drama')." },
"aiToolApplyFiltersYearDesc": { "message": "O ano pelo qual filtrar." }, "aiToolApplyFiltersYearParamDesc": { "message": "O ano de lançamento pelo qual filtrar (por exemplo, '2023')." },
"aiToolApplyFiltersSortDesc": { "message": "A ordem na qual os resultados devem ser classificados." }, "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": "Toca música de um artista específico." }, "aiToolPlayMusicByArtistDesc": { "message": "Abre o reprodutor de música e começa a reproduzir canções de um artista específico da biblioteca do utilizador." },
"aiToolPlayMusicByArtistNameDesc": { "message": "O nome do artista." }, "aiToolPlayMusicByArtistNameParamDesc": { "message": "O nome exato do artista cujas canções se deseja reproduzir." },
"aiToolClearChatHistoryDesc": { "message": "Limpa o histórico de bate-papo." }, "aiToolClearChatHistoryDesc": { "message": "Limpa todo o histórico de mensagens da conversa atual com o assistente de IA." },
"aiToolDeleteDatabaseDesc": { "message": "Exclui o banco de dados da extensão." }, "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": "Atualiza todos os tokens do Plex." }, "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 do Plex." }, "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." },
"aiToolAddPlexTokenTokenDesc": { "message": "O token do Plex a ser adicionado." }, "aiToolAddPlexTokenTokenParamDesc": { "message": "A string do token X-Plex que se deseja adicionar." },
"aiToolChangeRegionDesc": { "message": "Altera a região para descoberta de conteúdo." }, "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." },
"aiToolChangeRegionRegionDesc": { "message": "O código de região de duas letras (por exemplo, US, ES, FR)." }, "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": "Limpa todos os favoritos do usuário." }, "aiToolClearAllFavoritesDesc": { "message": "Elimina todos os filmes e séries que o utilizador marcou como favoritos." },
"aiToolClearRecommendationsViewDesc": { "message": "Limpa a visualização de recomendações." }, "aiToolClearViewingHistoryDesc": { "message": "Apaga o histórico de visualização do utilizador da página de histórico." },
"aiToolFavoritesCleared": { "message": "Favoritos limpos." }, "aiToolClearRecommendationsViewDesc": { "message": "Limpa a vista de recomendações e elimina as recomendações em cache." },
"aiToolFavoritesClearError": { "message": "Erro ao limpar favoritos: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolSearchNotFound": { "message": "Não foi encontrado '$query$' na sua biblioteca.", "placeholders": { "query": { "content": "$1" } } },
"aiToolRecommendationsCleared": { "message": "Recomendações limpas." }, "aiToolNavigateSuccess": { "message": "Navegado para a página de $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolRecommendationsClearError": { "message": "Erro ao limpar recomendações: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolNavigateError": { "message": "Erro ao navegar para a página de $page$.", "placeholders": { "page": { "content": "$1" } } },
"aiToolDatabaseDeleted": { "message": "Banco de dados excluído. A página será recarregada agora." }, "aiToolStatsError": { "message": "Erro ao obter estatísticas." },
"aiToolDatabaseDeleteError": { "message": "Erro ao excluir o banco de dados: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolItemNotFound": { "message": "Não foi encontrado o item '$title$'.", "placeholders": { "title": { "content": "$1" } } },
"aiToolDatabaseDeleteBlocked": { "message": "A exclusão do banco de dados está bloqueada. Feche outras abas do aplicativo." }, "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" } } },
"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" } } },
"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." },
"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." },
"aiToolUpdateAllTokensSuccess": { "message": "Todos os tokens foram atualizados com sucesso." }, "aiToolUpdateAllTokensSuccess": { "message": "Todos os tokens foram atualizados com sucesso." },
"aiToolUpdateAllTokensError": { "message": "Erro ao atualizar tokens: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolUpdateAllTokensError": { "message": "Erro ao atualizar os tokens: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolAddPlexTokenSuccess": { "message": "Token do Plex adicionado com sucesso." }, "aiToolAddPlexTokenSuccess": { "message": "Token Plex adicionado com sucesso." },
"aiToolAddPlexTokenError": { "message": "Erro ao adicionar token do Plex: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolAddPlexTokenError": { "message": "Erro ao adicionar o token Plex: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolChangeRegionSuccess": { "message": "Região alterada para $region$. O conteúdo está sendo atualizado.", "placeholders": { "region": { "content": "$1" } } }, "aiToolChangeRegionSuccess": { "message": "Região alterada para $region$. O conteúdo está a ser atualizado.", "placeholders": { "region": { "content": "$1" } } },
"aiToolChangeRegionError": { "message": "Erro ao alterar a região: $message$", "placeholders": { "message": { "content": "$1" } } }, "aiToolChangeRegionError": { "message": "Erro ao alterar a região: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiSystemPrompt_v2": { "message": "Você é um assistente especialista em filmes e séries chamado CinePlex. Sua função principal é ajudar os usuários a interagir com sua biblioteca de mídia e descobrir conteúdo. Siga estas regras: 1. Quando um usuário pedir uma lista ou recomendação (por exemplo, 'diga-me 5 filmes de terror', 'as melhores séries de ficção científica'), você DEVE usar seu próprio conhecimento para gerar a lista e apresentá-la em formato numerado ou com marcadores. NÃO use ferramentas para esta tarefa inicial de descoberta. 2. Depois de apresentar a lista, se o usuário pedir para você baixá-la, verificá-la ou criar um M3U, ENTÃO e somente então, use a ferramenta 'generate_m3u_from_titles_list', passando a ela os títulos que você acabou de mencionar. 3. Para qualquer outra ação, como navegar no aplicativo, obter estatísticas ou pesquisar um TÍTULO ESPECÍFICO na biblioteca do usuário, use as ferramentas apropriadas. Seja conciso, amigável e eficiente." }, "aiToolViewingHistoryCleared": { "message": "Histórico de visualização apagado." },
"aiToolSearchLibraryDesc_v2": { "message": "A lista de títulos a processar está vazia." }, "aiToolViewingHistoryClearError": { "message": "Erro ao apagar o histórico de visualização: $message$", "placeholders": { "message": { "content": "$1" } } },
"aiToolM3UNoLocalMatches": { "message": "Parece que você não tem nenhum dos títulos dessa lista em seus servidores locais." }, "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." },
"aiToolGenerateM3UTypeDesc": { "message": "O tipo de conteúdo a ser pesquisado: 'movie' ou 'series'." }, "aiToolM3UNoTitlesProvided": { "message": "Por favor, forneça uma lista de títulos para criar a lista de reprodução." },
"aiToolGenerateM3UFilenameDesc": { "message": "Um nome de arquivo personalizado para a lista de reprodução M3U baixada." }, "aiToolM3UCheckingTitles": { "message": "A verificar os títulos nos seus servidores locais..." },
"aiToolGenerateM3USuccess": { "message": "Entendido! Estou gerando uma lista de reprodução M3U com $1 itens. O download deve começar em breve.", "placeholders": { "1": { "content": "$1" } } }, "aiToolM3UNoLocalMatchesForDownload": { "message": "Não encontrei nenhum dos filmes ou séries da lista nos seus servidores locais." },
"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** afirme ter realizado uma ação se não tiver usado uma ferramenta para isso. Por exemplo, não diga 'eu baixei X' se não tiver usado a ferramenta de download. 2. Para solicitações de recomendações ou listas (por exemplo, 'me dê 5 filmes de terror'), use seu próprio conhecimento para gerar a lista. Apresente-a em formato numerado ou com marcadores. Após mostrar 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 ou pesquisar um título específico, use as ferramentas apropriadas. Seja sempre conciso, amigável e eficiente." }, "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" } } },
"aiToolCheckAndDownloadDesc": { "message": "Verifica uma lista de títulos de filmes ou séries nos servidores locais do usuário e, se encontrar correspondências, gera e baixa um arquivo de lista de reprodução M3U." }, "backToProviders": { "message": "Voltar aos Fornecedores" },
"aiToolGenerateM3UFromTitlesTitlesDesc": { "message": "Uma lista de títulos de filmes ou séries para verificar e baixar." }, "artistsCounterSingle": { "message": "$total$ Artista", "placeholders": { "total": { "content": "$1" } } },
"aiToolM3UNoTitlesProvided": { "message": "Forneça uma lista de títulos para criar a lista de reprodução." }, "artistsCounterLoading": { "message": "A carregar..." },
"aiToolM3UCheckingTitles": { "message": "Verificando os títulos em seus servidores locais..." }, "downloadingSong": { "message": "A iniciar descarregamento de \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"aiToolM3UNoLocalMatchesForDownload": { "message": "Não consegui encontrar nenhum dos filmes ou séries da lista em seus servidores locais." }, "songDownloaded": { "message": "\"$title$\" descarregado.", "placeholders": { "title": { "content": "$1" } } },
"aiToolM3UDownloadStarted": { "message": "Feito! Encontrei $1 dos $2 títulos em seus servidores e iniciei o download da lista de reprodução M3U.", "placeholders": { "1": { "content": "$1" }, "2": { "content": "$2" } } } "errorDownloadingSong": { "message": "Erro ao descarregar \"$title$\"", "placeholders": { "title": { "content": "$1" } } },
"generatingAlbumM3U": { "message": "A gerar 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" } } },
"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..." },
"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." },
"autoplayBlocked": { "message": "Reprodução automática bloqueada." },
"welcomeToCinePlex": { "message": "" },
"page": { "message": "Página" }
} }

View File

@ -15,229 +15,175 @@ export class AITools {
get toolDefinitions() { get toolDefinitions() {
return [ return [
{ {
type: 'function', name: 'search_library',
function: { description: _('aiToolSearchLibraryDesc'),
name: 'search_library', parameters: {
description: _('aiToolSearchLibraryDesc'), type: 'object',
parameters: { properties: {
type: 'object', query: { type: 'string', description: _('aiToolSearchLibraryQueryParamDesc') },
properties: { type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolSearchLibraryTypeParamDesc') }
query: { type: 'string', description: _('aiToolSearchLibraryQueryDesc') }, },
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolSearchLibraryTypeDesc') } required: ['query']
}
},
{
name: 'navigate_to_page',
description: _('aiToolNavigateToPageDesc'),
parameters: {
type: 'object',
properties: {
page: {
type: 'string',
enum: ['movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', 'm3u-generator'],
description: _('aiToolNavigateToPagePageParamDesc')
}
},
required: ['page']
}
},
{
name: 'get_user_stats',
description: _('aiToolGetUserStatsDesc'),
parameters: { type: 'object', properties: {} }
},
{
name: 'show_item_details',
description: _('aiToolShowItemDetailsDesc'),
parameters: {
type: 'object',
properties: {
title: { type: 'string', description: _('aiToolShowItemDetailsTitleParamDesc') },
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolShowItemDetailsTypeParamDesc') }
},
required: ['title', 'type']
}
},
{
name: 'add_to_playlist',
description: _('aiToolAddToPlaylistDesc'),
parameters: {
type: 'object',
properties: {
title: { type: 'string', description: _('aiToolAddToPlaylistTitleParamDesc') },
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolAddToPlaylistTypeParamDesc') }
},
required: ['title', 'type']
}
},
{
name: 'check_and_download_titles_list',
description: _('aiToolCheckAndDownloadDesc'),
parameters: {
type: 'object',
properties: {
titles: {
type: 'array',
items: { type: 'string' },
description: _('aiToolCheckAndDownloadTitlesParamDesc')
}, },
required: ['query'] type: {
} type: 'string',
} enum: ['movie', 'series'],
}, description: _('aiToolCheckAndDownloadTypeParamDesc')
{
type: 'function',
function: {
name: 'navigate_to_page',
description: _('aiToolNavigateToPageDesc'),
parameters: {
type: 'object',
properties: {
page: {
type: 'string',
enum: ['movies', 'series', 'stats', 'favorites', 'history', 'recommendations', 'photos', 'providers', 'm3u-generator'],
description: _('aiToolNavigateToPagePageDesc')
}
}, },
required: ['page'] filename: { type: 'string', description: _('aiToolCheckAndDownloadFilenameParamDesc') }
} },
required: ['titles', 'type']
} }
}, },
{ {
type: 'function', name: 'toggle_favorite',
function: { description: _('aiToolToggleFavoriteDesc'),
name: 'get_user_stats', parameters: {
description: _('aiToolGetUserStatsDesc'), type: 'object',
parameters: { type: 'object', properties: {} } properties: {
title: { type: 'string', description: _('aiToolToggleFavoriteTitleParamDesc') },
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolToggleFavoriteTypeParamDesc') }
},
required: ['title', 'type']
} }
}, },
{ {
type: 'function', name: 'get_recommendations',
function: { description: _('aiToolGetRecommendationsDesc'),
name: 'show_item_details', parameters: { type: 'object', properties: {} }
description: _('aiToolShowItemDetailsDesc'), },
parameters: { {
type: 'object', name: 'apply_filters',
properties: { description: _('aiToolApplyFiltersDesc'),
title: { type: 'string', description: _('aiToolShowItemDetailsTitleDesc') }, parameters: {
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolShowItemDetailsTypeDesc') } type: 'object',
}, properties: {
required: ['title', 'type'] type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolApplyFiltersTypeParamDesc') },
} genre: { type: 'string', description: _('aiToolApplyFiltersGenreParamDesc') },
year: { type: 'string', description: _('aiToolApplyFiltersYearParamDesc') },
sort: { type: 'string', enum: ['popularity.desc', 'vote_average.desc', 'release_date.desc', 'first_air_date.desc'], description: _('aiToolApplyFiltersSortParamDesc') }
},
required: ['type']
} }
}, },
{ {
type: 'function', name: 'play_music_by_artist',
function: { description: _('aiToolPlayMusicByArtistDesc'),
name: 'add_to_playlist', parameters: {
description: _('aiToolAddToPlaylistDesc'), type: 'object',
parameters: { properties: {
type: 'object', artist_name: { type: 'string', description: _('aiToolPlayMusicByArtistNameParamDesc') }
properties: { },
title: { type: 'string', description: _('aiToolAddToPlaylistTitleDesc') }, required: ['artist_name']
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolAddToPlaylistTypeDesc') }
},
required: ['title', 'type']
}
} }
}, },
{ {
type: 'function', name: 'clear_chat_history',
function: { description: _('aiToolClearChatHistoryDesc'),
name: 'check_and_download_titles_list', parameters: { type: 'object', properties: {} }
description: _('aiToolCheckAndDownloadDesc'), },
parameters: { {
type: 'object', name: 'delete_database',
properties: { description: _('aiToolDeleteDatabaseDesc'),
titles: { parameters: { type: 'object', properties: {} }
type: 'array', },
items: { type: 'string' }, {
description: _('aiToolGenerateM3UFromTitlesTitlesDesc') name: 'update_all_tokens',
}, description: _('aiToolUpdateAllTokensDesc'),
type: { parameters: { type: 'object', properties: {} }
type: 'string', },
enum: ['movie', 'series'], {
description: _('aiToolGenerateM3UTypeDesc') name: 'add_plex_token',
}, description: _('aiToolAddPlexTokenDesc'),
filename: { type: 'string', description: _('aiToolGenerateM3UFilenameDesc') } parameters: {
}, type: 'object',
required: ['titles', 'type'] properties: {
} token: { type: 'string', description: _('aiToolAddPlexTokenTokenParamDesc') }
},
required: ['token']
} }
}, },
{ {
type: 'function', name: 'change_region',
function: { description: _('aiToolChangeRegionDesc'),
name: 'toggle_favorite', parameters: {
description: _('aiToolToggleFavoriteDesc'), type: 'object',
parameters: { properties: {
type: 'object', region: { type: 'string', description: _('aiToolChangeRegionRegionParamDesc') }
properties: { },
title: { type: 'string', description: _('aiToolToggleFavoriteTitleDesc') }, required: ['region']
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolToggleFavoriteTypeDesc') }
},
required: ['title', 'type']
}
} }
}, },
{ {
type: 'function', name: 'clear_all_favorites',
function: { description: _('aiToolClearAllFavoritesDesc'),
name: 'get_recommendations', parameters: { type: 'object', properties: {} }
description: _('aiToolGetRecommendationsDesc'),
parameters: { type: 'object', properties: {} }
}
}, },
{ {
type: 'function', name: 'clear_viewing_history',
function: { description: _('aiToolClearViewingHistoryDesc'),
name: 'apply_filters', parameters: { type: 'object', properties: {} }
description: _('aiToolApplyFiltersDesc'),
parameters: {
type: 'object',
properties: {
type: { type: 'string', enum: ['movie', 'series'], description: _('aiToolApplyFiltersTypeDesc') },
genre: { type: 'string', description: _('aiToolApplyFiltersGenreDesc') },
year: { type: 'string', description: _('aiToolApplyFiltersYearDesc') },
sort: { type: 'string', enum: ['popularity.desc', 'vote_average.desc', 'release_date.desc', 'first_air_date.desc'], description: _('aiToolApplyFiltersSortDesc') }
},
required: ['type']
}
}
}, },
{ {
type: 'function', name: 'clear_recommendations_view',
function: { description: _('aiToolClearRecommendationsViewDesc'),
name: 'play_music_by_artist', parameters: { type: 'object', properties: {} }
description: _('aiToolPlayMusicByArtistDesc'),
parameters: {
type: 'object',
properties: {
artist_name: { type: 'string', description: _('aiToolPlayMusicByArtistNameDesc') }
},
required: ['artist_name']
}
}
},
{
type: 'function',
function: {
name: 'clear_chat_history',
description: _('aiToolClearChatHistoryDesc'),
parameters: { type: 'object', properties: {} }
}
},
{
type: 'function',
function: {
name: 'delete_database',
description: _('aiToolDeleteDatabaseDesc'),
parameters: { type: 'object', properties: {} }
}
},
{
type: 'function',
function: {
name: 'update_all_tokens',
description: _('aiToolUpdateAllTokensDesc'),
parameters: { type: 'object', properties: {} }
}
},
{
type: 'function',
function: {
name: 'add_plex_token',
description: _('aiToolAddPlexTokenDesc'),
parameters: {
type: 'object',
properties: {
token: { type: 'string', description: _('aiToolAddPlexTokenTokenDesc') }
},
required: ['token']
}
}
},
{
type: 'function',
function: {
name: 'change_region',
description: _('aiToolChangeRegionDesc'),
parameters: {
type: 'object',
properties: {
region: { type: 'string', description: _('aiToolChangeRegionRegionDesc') }
},
required: ['region']
}
}
},
{
type: 'function',
function: {
name: 'clear_all_favorites',
description: _('aiToolClearAllFavoritesDesc'),
parameters: { type: 'object', properties: {} }
}
},
{
type: 'function',
function: {
name: 'clear_viewing_history',
description: "Clears the user's content viewing history from the history page.",
parameters: { type: 'object', properties: {} }
}
},
{
type: 'function',
function: {
name: 'clear_recommendations_view',
description: _('aiToolClearRecommendationsViewDesc'),
parameters: { type: 'object', properties: {} }
}
} }
]; ];
} }
@ -483,9 +429,9 @@ export class AITools {
async "clear_viewing_history"() { async "clear_viewing_history"() {
try { try {
clearAllHistory(); clearAllHistory();
return JSON.stringify({ success: true, message: "Viewing history has been cleared." }); return JSON.stringify({ success: true, message: _('aiToolViewingHistoryCleared') });
} catch (error) { } catch (error) {
return JSON.stringify({ success: false, message: `Failed to clear viewing history: ${error.message}` }); return JSON.stringify({ success: false, message: _('aiToolViewingHistoryClearError', error.message) });
} }
} }
@ -537,7 +483,7 @@ export class AITools {
async executeTool(toolCall) { async executeTool(toolCall) {
const functionName = toolCall.function.name; const functionName = toolCall.function.name;
const args = JSON.parse(toolCall.function.arguments); const args = toolCall.function.arguments;
if (typeof this[functionName] === 'function') { if (typeof this[functionName] === 'function') {
this.chat.addTypingIndicator(); this.chat.addTypingIndicator();
@ -545,7 +491,7 @@ export class AITools {
const result = await this[functionName](args); const result = await this[functionName](args);
return result; return result;
} catch (error) { } catch (error) {
const errorMessage = _('aiToolExecutionError', functionName, error.message); const errorMessage = _('aiToolExecutionError', [functionName, error.message]);
this.chat.addMessage(errorMessage, 'tool-result', true, functionName); this.chat.addMessage(errorMessage, 'tool-result', true, functionName);
return JSON.stringify({ success: false, error: errorMessage }); return JSON.stringify({ success: false, error: errorMessage });
} finally { } finally {

View File

@ -62,7 +62,7 @@ export class Chat {
if (this.conversationHistory.length === 0) { if (this.conversationHistory.length === 0) {
const welcomeMessage = _('chatWelcome'); const welcomeMessage = _('chatWelcome');
this.addMessage(welcomeMessage, 'assistant'); this.addMessage(welcomeMessage, 'assistant');
this.conversationHistory.push({ role: 'assistant', content: welcomeMessage }); this.conversationHistory.push({ role: 'model', parts: [{ text: welcomeMessage }] });
} }
} }
@ -80,7 +80,7 @@ export class Chat {
if (!userInput) return; if (!userInput) return;
this.addMessage(userInput, 'user'); this.addMessage(userInput, 'user');
this.conversationHistory.push({ role: 'user', content: userInput }); this.conversationHistory.push({ role: 'user', parts: [{ text: userInput }] });
this.dom.input.value = ''; this.dom.input.value = '';
this.autoResizeTextarea(); this.autoResizeTextarea();
this.dom.sendBtn.disabled = true; this.dom.sendBtn.disabled = true;
@ -88,12 +88,12 @@ export class Chat {
this.addTypingIndicator(); this.addTypingIndicator();
try { try {
const response = await this.getOpenAIResponseWithTools(); const response = await this.getAIResponseWithTools();
this.removeTypingIndicator(); this.removeTypingIndicator();
if (response) { if (response) {
this.addMessage(response, 'assistant'); this.addMessage(response, 'assistant');
this.conversationHistory.push({ role: 'assistant', content: response }); this.conversationHistory.push({ role: 'model', parts: [{ text: response }] });
} }
} catch (error) { } catch (error) {
@ -119,7 +119,7 @@ export class Chat {
if (sender === 'assistant') { if (sender === 'assistant') {
icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm-2.5-5h5v2h-5v-2z"/></svg>'; icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm-2.5-5h5v2h-5v-2z"/></svg>';
} else { } else {
icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></svg>'; icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="20" height="20"><path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12-.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></svg>';
} }
avatar.innerHTML = icon; avatar.innerHTML = icon;
wrapper.appendChild(avatar); wrapper.appendChild(avatar);
@ -162,61 +162,86 @@ export class Chat {
if (indicator) indicator.remove(); if (indicator) indicator.remove();
} }
async getOpenAIResponseWithTools() { async getAIResponseWithTools() {
const apiKey = state.settings.openaiApiKey; const apiKey = state.settings.googleApiKey;
if (!apiKey) { if (!apiKey) {
return _('chatApiKeyMissing'); return _('chatGoogleApiKeyMissing');
} }
const systemPrompt = _('aiSystemPrompt_v3'); const systemPrompt = _('aiSystemPrompt_v3');
const messagesForApi = [ const tools = [{
{ role: 'system', content: systemPrompt }, functionDeclarations: this.aiTools.toolDefinitions
...this.conversationHistory }];
];
const model = "gemini-2.5-flash";
const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`;
try { try {
const response = await fetch('https://api.proxyapi.ru/openai/v1/chat/completions', { const response = await fetch(url, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}` 'x-goog-api-key': apiKey
}, },
body: JSON.stringify({ body: JSON.stringify({
model: 'gpt-3.5-turbo', contents: this.conversationHistory,
messages: messagesForApi, tools: tools,
tools: this.aiTools.toolDefinitions, system_instruction: {
tool_choice: 'auto', parts: [{ text: systemPrompt }]
max_tokens: 400, }
temperature: 0.7
}) })
}); });
if (!response.ok) { if (!response.ok) {
const errorData = await response.json().catch(() => ({})); const errorData = await response.json().catch(() => ({}));
throw new Error(errorData?.error?.message || `Error HTTP ${response.status}`); const errorMessage = errorData?.error?.message || `Error HTTP ${response.status}`;
throw new Error(errorMessage);
} }
const data = await response.json(); const data = await response.json();
const message = data.choices[0].message;
if (!data.candidates || !data.candidates.length || !data.candidates[0].content || !data.candidates[0].content.parts) {
console.error("Respuesta inesperada de la API:", data);
throw new Error(_('chatApiInvalidResponse'));
}
if (message.tool_calls) { const candidate = data.candidates[0];
this.conversationHistory.push(message); const part = candidate.content.parts[0];
for (const toolCall of message.tool_calls) {
const toolResult = await this.aiTools.executeTool(toolCall); if (part.functionCall) {
this.conversationHistory.push({ role: 'tool', tool_call_id: toolCall.id, name: toolCall.function.name, content: toolResult }); this.conversationHistory.push(candidate.content);
} const toolCall = {
// Now call the API again with the tool results id: `call_${Date.now()}`,
return await this.getOpenAIResponseWithTools(); function: {
} else if (message.content) { name: part.functionCall.name,
return message.content; arguments: part.functionCall.args,
},
};
const toolResult = await this.aiTools.executeTool(toolCall);
this.conversationHistory.push({
role: 'tool',
parts: [{
functionResponse: {
name: part.functionCall.name,
response: JSON.parse(toolResult)
}
}]
});
return await this.getAIResponseWithTools();
} else if (part.text) {
return part.text;
} else { } else {
return _('chatApiInvalidResponse'); return _('chatApiNoTextResponse');
} }
} catch (error) { } catch (error) {
console.error('OpenAI API call failed:', error); console.error('Fallo en la llamada a la API de Google AI:', error);
showNotification(_('chatApiError') + `: ${error.message}`, 'error'); const errorMessage = _('chatApiError') + `: ${error.message}`;
return _('chatApiError') + `: ${error.message}`; showNotification(errorMessage, 'error');
return errorMessage;
} }
} }
@ -276,6 +301,6 @@ export class Chat {
this.dom.messagesContainer.innerHTML = ''; this.dom.messagesContainer.innerHTML = '';
const welcomeMessage = _('chatWelcome'); const welcomeMessage = _('chatWelcome');
this.addMessage(welcomeMessage, 'assistant'); this.addMessage(welcomeMessage, 'assistant');
this.conversationHistory.push({ role: 'assistant', content: welcomeMessage }); this.conversationHistory.push({ role: 'model', parts: [{ text: welcomeMessage }] });
} }
} }

View File

@ -2,5 +2,4 @@ export const config = {
defaultApiKey: '4e44d9029b1270a757cddc766a1bcb63', defaultApiKey: '4e44d9029b1270a757cddc766a1bcb63',
dbName: 'PlexDB', dbName: 'PlexDB',
dbVersion: 9, dbVersion: 9,
defaultOpenaiApiKey: 'sk-r5HgSL5o102oGaXEuF13P5sNqpLtDVDq',
}; };

View File

@ -7,7 +7,7 @@ export const state = {
settings: { settings: {
id: 'user_settings', id: 'user_settings',
apiKey: '', apiKey: '',
openaiApiKey: config.defaultOpenaiApiKey || '', googleApiKey: '',
theme: 'dark', theme: 'dark',
showHero: true, showHero: true,
language: 'es', language: 'es',

View File

@ -1571,7 +1571,7 @@ export function activateSettingsTab(tabId) {
export function openSettingsModal() { export function openSettingsModal() {
document.getElementById('tmdbApiKey').value = state.settings.apiKey; document.getElementById('tmdbApiKey').value = state.settings.apiKey;
document.getElementById('openaiApiKey').value = state.settings.openaiApiKey || ''; document.getElementById('googleApiKey').value = state.settings.googleApiKey || '';
document.getElementById('phpScriptUrl').value = state.settings.phpScriptUrl || ''; document.getElementById('phpScriptUrl').value = state.settings.phpScriptUrl || '';
document.getElementById('lightModeToggle').checked = state.settings.theme === 'light'; document.getElementById('lightModeToggle').checked = state.settings.theme === 'light';
document.getElementById('showHeroToggle').checked = state.settings.showHero; document.getElementById('showHeroToggle').checked = state.settings.showHero;
@ -1598,7 +1598,7 @@ export async function saveSettings() {
const newSettings = { const newSettings = {
id: 'user_settings', id: 'user_settings',
apiKey: document.getElementById('tmdbApiKey').value.trim(), apiKey: document.getElementById('tmdbApiKey').value.trim(),
openaiApiKey: document.getElementById('openaiApiKey').value.trim(), googleApiKey: document.getElementById('googleApiKey').value.trim(),
theme: document.getElementById('lightModeToggle').checked ? 'light' : 'dark', theme: document.getElementById('lightModeToggle').checked ? 'light' : 'dark',
showHero: document.getElementById('showHeroToggle').checked, showHero: document.getElementById('showHeroToggle').checked,
phpScriptUrl: document.getElementById('phpScriptUrl').value.trim(), phpScriptUrl: document.getElementById('phpScriptUrl').value.trim(),

View File

@ -399,9 +399,8 @@
<input type="password" class="form-control" id="tmdbApiKey" placeholder="__MSG_settingsTmdbApiPlaceholder__"> <input type="password" class="form-control" id="tmdbApiKey" placeholder="__MSG_settingsTmdbApiPlaceholder__">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="openaiApiKey" class="form-label">__MSG_settingsOpenAiApiLabel__</label> <label for="googleApiKey" class="form-label">__MSG_settingsGoogleApiLabel__</label>
<label for="openaiApiKey" class="form-label">__MSG_openaiApiKey__</label> <input type="password" class="form-control" id="googleApiKey" placeholder="__MSG_settingsGoogleApiPlaceholder__">
<input type="password" class="form-control" id="openaiApiKey" placeholder="__MSG_settingsOpenAiApiPlaceholder__">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="region-filter" class="form-label">__MSG_settingsRegionLabel__</label> <label for="region-filter" class="form-label">__MSG_settingsRegionLabel__</label>