@@ -3602,6 +3612,17 @@ function initializeIsbnImport() {
} catch (err) {
}
+ // Auto-set tipo_media from scraped data
+ try {
+ if (data.tipo_media) {
+ const tipoMediaSelect = document.getElementById('tipo_media');
+ if (tipoMediaSelect) {
+ tipoMediaSelect.value = data.tipo_media;
+ }
+ }
+ } catch (err) {
+ }
+
// Handle series (collana)
try {
if (data.series) {
@@ -3729,12 +3750,13 @@ function initializeIsbnImport() {
} catch (err) {
}
- // Handle keywords (parole_chiave) - categories from Google Books
+ // Handle keywords (parole_chiave) - from Google Books, Discogs, MusicBrainz
try {
- if (data.keywords) {
+ const kw = data.keywords || data.parole_chiave;
+ if (kw) {
const keywordsInput = document.querySelector('input[name="parole_chiave"]');
if (keywordsInput) {
- keywordsInput.value = data.keywords;
+ keywordsInput.value = kw;
}
}
} catch (err) {
diff --git a/app/Views/libri/scheda_libro.php b/app/Views/libri/scheda_libro.php
index 0dd4960e..d4288544 100644
--- a/app/Views/libri/scheda_libro.php
+++ b/app/Views/libri/scheda_libro.php
@@ -5,6 +5,10 @@
$libro = $libro ?? [];
$isCatalogueMode = ConfigStore::isCatalogueMode();
+// Resolve tipo_media once for badge display and dynamic labels
+$resolvedTipoMedia = \App\Support\MediaLabels::resolveTipoMedia($libro['formato'] ?? null, $libro['tipo_media'] ?? null);
+$isMusic = $resolvedTipoMedia === 'disco';
+
$status = strtolower((string)($libro['stato'] ?? ''));
$statusClasses = [
'disponibile' => 'inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold bg-green-500 text-white',
@@ -66,6 +70,10 @@
@@ -141,7 +149,7 @@ class="max-h-80 object-contain rounded-lg shadow" />
@@ -331,7 +339,7 @@ class="text-gray-900 hover:text-gray-600 hover:underline font-semibold">= App\
-
= __("Anno pubblicazione") ?>
+ = \App\Support\MediaLabels::label('anno_pubblicazione', $libro['formato'] ?? null, $libro['tipo_media'] ?? null) ?>
@@ -360,7 +368,7 @@ class="text-gray-700 hover:text-gray-900 hover:underline transition-colors">
-
= __("Pagine") ?>
+ = \App\Support\MediaLabels::label('numero_pagine', $libro['formato'] ?? null, $libro['tipo_media'] ?? null) ?>
@@ -373,7 +381,7 @@ class="text-gray-700 hover:text-gray-900 hover:underline transition-colors">
= __("Formato") ?>
-
+
@@ -586,13 +594,22 @@ class="inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full
-
+
+ /i', "\n", $libro['descrizione']);
+ $descText = preg_replace('/<\/(?:p|div|li|h[1-6])>/i', "\n", (string) $descText);
+ $descText = strip_tags((string) $descText);
+ ?>
+ = \App\Support\MediaLabels::formatTracklist($descText) ?>
+
+
+
diff --git a/data/dewey/dewey_completo_it.json b/data/dewey/dewey_completo_it.json
index 95ba3790..e352890e 100644
--- a/data/dewey/dewey_completo_it.json
+++ b/data/dewey/dewey_completo_it.json
@@ -6822,6 +6822,12 @@
"name": "Narrativa inglese",
"level": 3,
"children": [
+ {
+ "code": "823.7",
+ "name": "Narrativa Inglese, 1800-1837",
+ "level": 4,
+ "children": []
+ },
{
"code": "823.9",
"name": "Narrativa Inglese",
diff --git a/installer/classes/Installer.php b/installer/classes/Installer.php
index 85d32788..69c6eebb 100755
--- a/installer/classes/Installer.php
+++ b/installer/classes/Installer.php
@@ -646,7 +646,7 @@ public function importOptimizationIndexes(): bool
'idx_isbn10' => 'isbn10',
'idx_genere_scaffale' => 'genere_id, scaffale_id',
'idx_sottogenere_scaffale' => 'sottogenere_id, scaffale_id',
- 'idx_libri_deleted_at' => 'deleted_at',
+ 'idx_libri_tipo_media_deleted_at' => 'deleted_at, tipo_media',
],
'libri_autori' => [
'idx_libro_autore' => 'libro_id, autore_id',
diff --git a/installer/database/migrations/migrate_0.5.4.sql b/installer/database/migrations/migrate_0.5.4.sql
new file mode 100644
index 00000000..6428d942
--- /dev/null
+++ b/installer/database/migrations/migrate_0.5.4.sql
@@ -0,0 +1,111 @@
+-- Add tipo_media column to libri table
+-- FULLY IDEMPOTENT
+
+SET @col_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND COLUMN_NAME = 'tipo_media');
+SET @formato_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND COLUMN_NAME = 'formato');
+SET @sql = IF(@col_exists = 0,
+ IF(@formato_exists > 0,
+ "ALTER TABLE libri ADD COLUMN tipo_media ENUM('libro','disco','audiolibro','dvd','altro') NOT NULL DEFAULT 'libro' AFTER formato",
+ "ALTER TABLE libri ADD COLUMN tipo_media ENUM('libro','disco','audiolibro','dvd','altro') NOT NULL DEFAULT 'libro'"),
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- Composite index for media filtering + soft delete
+SET @idx_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND INDEX_NAME = 'idx_libri_tipo_media_deleted_at');
+SET @idx_order_ok = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND INDEX_NAME = 'idx_libri_tipo_media_deleted_at'
+ AND ((SEQ_IN_INDEX = 1 AND COLUMN_NAME = 'deleted_at')
+ OR (SEQ_IN_INDEX = 2 AND COLUMN_NAME = 'tipo_media')));
+SET @sql = IF(@idx_exists > 0 AND @idx_order_ok <> 2,
+ 'ALTER TABLE libri DROP INDEX idx_libri_tipo_media_deleted_at',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @idx_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND INDEX_NAME = 'idx_libri_tipo_media_deleted_at');
+SET @sql = IF(@idx_exists = 0,
+ 'ALTER TABLE libri ADD INDEX idx_libri_tipo_media_deleted_at (deleted_at, tipo_media)',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @old_tipo_idx_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND INDEX_NAME = 'idx_libri_tipo_media');
+SET @sql = IF(@old_tipo_idx_exists > 0,
+ 'ALTER TABLE libri DROP INDEX idx_libri_tipo_media',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @old_deleted_idx_exists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE()
+ AND TABLE_NAME = 'libri'
+ AND INDEX_NAME = 'idx_libri_deleted_at');
+SET @sql = IF(@old_deleted_idx_exists > 0,
+ 'ALTER TABLE libri DROP INDEX idx_libri_deleted_at',
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+-- Auto-populate from existing formato values (only if formato column exists)
+-- Use specific patterns to avoid false positives (%cd% matches CD-ROM, %lp% matches 'help')
+SET @sql = IF(@formato_exists > 0,
+ "UPDATE libri SET tipo_media = 'disco'
+ WHERE tipo_media = 'libro'
+ AND (LOWER(formato) LIKE '%cd audio%' OR LOWER(formato) LIKE '%cd_audio%'
+ OR LOWER(formato) LIKE '%cd-audio%' OR LOWER(formato) = 'cd'
+ OR LOWER(formato) LIKE '%compact disc%'
+ OR LOWER(formato) LIKE '%vinyl%' OR LOWER(formato) LIKE '%vinile%'
+ OR LOWER(formato) = 'lp' OR LOWER(formato) LIKE '%lp %' OR LOWER(formato) LIKE '% lp'
+ OR LOWER(formato) LIKE '%cassett%'
+ OR LOWER(formato) LIKE '%audio cassetta%' OR LOWER(formato) LIKE '%audio-cassetta%'
+ OR LOWER(formato) LIKE '%audiocassetta%'
+ OR LOWER(formato) REGEXP '\\\\bmusic\\\\b'
+ OR LOWER(formato) REGEXP '\\\\bmusik\\\\b')
+ AND LOWER(formato) NOT LIKE '%audiolibro%' AND LOWER(formato) NOT LIKE '%audiobook%'",
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @sql = IF(@formato_exists > 0,
+ "UPDATE libri SET tipo_media = 'audiolibro'
+ WHERE tipo_media = 'libro'
+ AND (LOWER(formato) LIKE '%audiolibro%' OR LOWER(formato) LIKE '%audiobook%' OR LOWER(formato) LIKE '%audio book%')",
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+SET @sql = IF(@formato_exists > 0,
+ "UPDATE libri SET tipo_media = 'dvd'
+ WHERE tipo_media = 'libro'
+ AND (LOWER(formato) LIKE '%dvd%' OR LOWER(formato) LIKE '%blu-ray%'
+ OR LOWER(formato) LIKE '%blu_ray%' OR LOWER(formato) LIKE '%blu ray%'
+ OR LOWER(formato) LIKE '%bluray%')",
+ 'SELECT 1');
+PREPARE stmt FROM @sql;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
diff --git a/installer/database/schema.sql b/installer/database/schema.sql
index 465d4948..a47e21f6 100755
--- a/installer/database/schema.sql
+++ b/installer/database/schema.sql
@@ -368,6 +368,7 @@ CREATE TABLE `libri` (
`private_comment` text COLLATE utf8mb4_unicode_ci COMMENT 'Private comment (LibraryThing)',
`parole_chiave` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`formato` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'cartaceo',
+ `tipo_media` enum('libro','disco','audiolibro','dvd','altro') NOT NULL DEFAULT 'libro',
`peso` float DEFAULT NULL,
`dimensioni` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`physical_description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Physical description (LibraryThing)',
@@ -417,10 +418,10 @@ CREATE TABLE `libri` (
KEY `idx_libri_titolo_sottotitolo` (`titolo`,`sottotitolo`),
KEY `editore_id` (`editore_id`),
KEY `idx_libri_stato` (`stato`),
+ KEY `idx_libri_tipo_media_deleted_at` (`deleted_at`,`tipo_media`),
KEY `fk_libri_mensola` (`mensola_id`),
KEY `idx_libri_scaffale_mensola` (`scaffale_id`,`mensola_id`),
KEY `idx_libri_posizione_progressiva` (`posizione_progressiva`),
- KEY `idx_libri_deleted_at` (`deleted_at`),
KEY `idx_collana` (`collana`),
KEY `idx_lt_rating` (`rating`),
KEY `idx_lt_date_read` (`date_read`),
diff --git a/locale/de_DE.json b/locale/de_DE.json
index bc79bf69..5e8e92f7 100644
--- a/locale/de_DE.json
+++ b/locale/de_DE.json
@@ -2,9 +2,6 @@
"\"%s\" prestato a %s è in ritardo di %d giorni": "\"%s\" ausgeliehen an %s ist %d Tage überfällig",
"$1": "$1",
"$2": "$2",
- "%d Indici Mancanti": "%d fehlende Indizes",
- "%d Problemi": "%d Probleme",
- "%d Tabelle Mancanti": "%d fehlende Tabellen",
"%d autori eliminati": "%d Autoren gelöscht",
"%d copie disponibili su %d": "%d Exemplare von %d verfügbar",
"%d editori eliminati": "%d Verlage gelöscht",
@@ -14,8 +11,11 @@
"%d import registrati": "%d Importe aufgezeichnet",
"%d import registrato": "%d Import aufgezeichnet",
"%d indici creati con successo": "%d Indizes erfolgreich erstellt",
+ "%d Indici Mancanti": "%d fehlende Indizes",
"%d indici mancanti trovati": "%d fehlende Indizes gefunden",
+ "%d libri assegnati alla collana \"%s\"": "%d Bücher der Reihe \"%s\" zugewiesen",
"%d libri eliminati": "%d Bücher gelöscht",
+ "%d libri importati, %d aggiornati": "%d Bücher importiert, %d aktualisiert",
"%d minuti fa": "vor %d Minuten",
"%d minuto fa": "vor %d Minute",
"%d notifica non letta": "%d ungelesene Benachrichtigung",
@@ -30,33 +30,37 @@
"%d prestito attivo": "%d aktive Ausleihe",
"%d prestito in ritardo": "%d überfällige Ausleihe",
"%d prestito passato": "%d vergangene Ausleihe",
+ "%d Problemi": "%d Probleme",
"%d problemi rilevati": "%d Probleme erkannt",
"%d recensione": "%d Rezension",
"%d recensioni": "%d Rezensionen",
"%d richiesta in sospeso": "%d ausstehende Anfrage",
"%d richieste in sospeso": "%d ausstehende Anfragen",
"%d tabelle create con successo": "%d Tabellen erfolgreich erstellt",
+ "%d Tabelle Mancanti": "%d fehlende Tabellen",
"%d titoli": "%d Titel",
+ "%s deve essere di almeno 8 caratteri": "%s muss mindestens 8 Zeichen lang sein",
"%s ha prenotato \"%s\"": "%s hat \"%s\" vorgemerkt",
+ "%s non può superare i 72 caratteri": "%s darf nicht länger als 72 Zeichen sein",
"%s non è valido": "%s ist ungültig",
- "%s è richiesto": "%s ist erforderlich",
"%s è richiesta": "%s ist erforderlich",
- "%s deve essere di almeno 8 caratteri": "%s muss mindestens 8 Zeichen lang sein",
- "%s non può superare i 72 caratteri": "%s darf nicht länger als 72 Zeichen sein",
+ "%s è richiesto": "%s ist erforderlich",
"(codici ISO e nomi inglesi accettati)": "(ISO-Codes und englische Namen akzeptiert)",
"(filtrati da _MAX_ libri totali)": "(gefiltert von insgesamt _MAX_ Büchern)",
- "(opzionale - URL completo)": "(optional – vollständige URL)",
"(opzionale - max 160 caratteri)": "(optional – max. 160 Zeichen)",
"(opzionale - max 200 caratteri)": "(optional - max. 200 Zeichen)",
"(opzionale - max 60 caratteri)": "(optional – max. 60 Zeichen)",
"(opzionale - max 70 caratteri)": "(optional - max. 70 Zeichen)",
"(opzionale - separate da virgola)": "(optional – kommagetrennt)",
+ "(opzionale - URL completo)": "(optional – vollständige URL)",
"(opzionale)": "(optional)",
"(percorso legacy)": "(Legacy-Pfad)",
"+ 15 campi aggiuntivi disponibili (vedi CSV di esempio)": "+ 15 zusätzliche Felder verfügbar (siehe Beispiel-CSV)",
"+ Aggiungi da preset...": "+ Aus Vorlage hinzufügen...",
"+39 02 1234567": "+49 30 1234567",
"+39 123 456 7890": "+49 123 456 7890",
+ ", %d autori creati": ", %d Autoren erstellt",
+ ", %d editori creati": ", %d Verlage erstellt",
", %d errori": ", %d Fehler",
", %d libri arricchiti con scraping": ", %d Bücher per Scraping angereichert",
"-- Seleziona --": "-- Auswählen --",
@@ -84,30 +88,18 @@
": attiva per ordinare la colonna in ordine decrescente": ": aktivieren, um die Spalte absteigend zu sortieren",
"A": "A",
"AA Testo Grande": "AA Großer Text",
- "API": "API",
- "API Key": "API-Schlüssel",
- "API Key già configurata": "API-Schlüssel bereits konfiguriert",
- "API Keys": "API-Schlüssel",
- "API Pubblica": "Öffentliche API",
- "API abilitata con successo.": "API erfolgreich aktiviert.",
- "API configurata": "API konfiguriert",
- "API disabilitata con successo.": "API erfolgreich deaktiviert.",
- "API key creata con successo.": "API-Schlüssel erfolgreich erstellt.",
- "API key eliminata con successo.": "API-Schlüssel erfolgreich gelöscht.",
- "APP_CANONICAL_URL configurato con valore non valido: '%s'. Link nelle email potrebbero non funzionare. Valore suggerito: %s": "APP_CANONICAL_URL mit ungültigem Wert konfiguriert: '%s'. E-Mail-Links funktionieren möglicherweise nicht. Empfohlener Wert: %s",
- "APP_CANONICAL_URL configurato ma vuoto nel file .env. Link nelle email useranno fallback a HTTP_HOST. Valore suggerito: %s": "APP_CANONICAL_URL konfiguriert, aber leer in der .env-Datei. E-Mail-Links verwenden HTTP_HOST als Fallback. Empfohlener Wert: %s",
- "APP_CANONICAL_URL non configurato nel file .env. Link nelle email potrebbero non funzionare correttamente. Valore suggerito: %s": "APP_CANONICAL_URL nicht in der .env-Datei konfiguriert. Links in E-Mails funktionieren möglicherweise nicht korrekt. Empfohlener Wert: %s",
- "ATTENZIONE: Disinstallazione Irreversibile": "ACHTUNG: Unwiderrufliche Deinstallation",
- "AVVISO Trigger:": "Trigger-WARNUNG:",
+ "Abbiamo ricevuto una richiesta di reset della password per il tuo account.": "Wir haben eine Anfrage zum Zurücksetzen des Passworts für Ihr Konto erhalten.",
"Abilita": "Aktivieren",
"Abilita Client SRU": "SRU-Client aktivieren",
"Abilita Cookie Banner": "Cookie-Banner aktivieren",
"Abilita HSTS": "HSTS aktivieren",
+ "Abilita l'arricchimento automatico tramite cron. I libri verranno arricchiti in background a intervalli regolari.": "Automatische Anreicherung über Cron aktivieren. Bücher werden im Hintergrund in regelmäßigen Abständen angereichert.",
+ "Abilita llms.txt": "llms.txt aktivieren",
"Abilita Modalità Catalogo": "Katalogmodus aktivieren",
"Abilita Modalità Solo Catalogo": "Reinen Katalogmodus aktivieren",
+ "Abilita o disabilita l'accesso all'API pubblica": "Öffentlichen API-Zugang aktivieren oder deaktivieren",
"Abilita Plugin": "Plugin aktivieren",
"Abilita Server SRU": "SRU-Server aktivieren",
- "Abilita o disabilita l'accesso all'API pubblica": "Öffentlichen API-Zugang aktivieren oder deaktivieren",
"Abilitata": "Aktiviert",
"Abilitata - Visibile nel frontend": "Aktiviert – Im Frontend sichtbar",
"Abilitato": "Aktiviert",
@@ -117,41 +109,42 @@
"Accedi al tuo account": "Melden Sie sich bei Ihrem Konto an",
"Accedi all'area admin con le credenziali sopra indicate": "Melden Sie sich mit den oben angegebenen Zugangsdaten im Adminbereich an",
"Accedi e Procedi": "Anmelden und fortfahren",
- "Accedi per Prenotare": "Anmelden zum Vormerken",
"Accedi per aggiungere ai Preferiti": "Melden Sie sich an, um zu den Favoriten hinzuzufügen",
+ "Accedi per Prenotare": "Anmelden zum Vormerken",
"Accento": "Akzent",
"Accesso": "Anmeldung",
- "Accesso Richiesto": "Anmeldung erforderlich",
"Accesso in corso...": "Anmeldung läuft...",
"Accesso negato. Permessi insufficienti.": "Zugriff verweigert. Unzureichende Berechtigungen.",
"Accesso non autorizzato": "Unbefugter Zugriff",
+ "Accesso Richiesto": "Anmeldung erforderlich",
"Accetta selezionati": "Ausgewählte akzeptieren",
"Accetta tutti": "Alle akzeptieren",
"Accetto la": "Ich akzeptiere die",
"Account": "Konto",
- "Account In Attesa": "Konto ausstehend",
- "Account Sospeso": "Konto gesperrt",
"Account attivato": "Konto aktiviert",
"Account creato con successo! Verifica la tua email.": "Konto erfolgreich erstellt! Überprüfen Sie Ihre E-Mail.",
"Account creato! In attesa di approvazione da parte dell'amministratore.": "Konto erstellt! Warten auf Genehmigung durch den Administrator.",
+ "Account In Attesa": "Konto ausstehend",
+ "Account Sospeso": "Konto gesperrt",
"Acquisito a": "Erworben um",
"Acquisito da": "Erworben von",
"Acquisto": "Kauf",
+ "acquisto": "Kauf",
"Adesso": "Gerade eben",
"Admin": "Admin",
"Admin Dewey": "Dewey-Verwaltung",
"Aggiorna": "Aktualisieren",
+ "Aggiorna da ISBN": "Von ISBN aktualisieren",
"Aggiorna Dati": "Daten aktualisieren",
"Aggiorna Evento": "Veranstaltung aktualisieren",
- "Aggiorna Ora": "Jetzt aktualisieren",
- "Aggiorna Statistiche": "Statistiken aktualisieren",
- "Aggiorna da ISBN": "Von ISBN aktualisieren",
"Aggiorna i dettagli del libro:": "Buchdetails aktualisieren:",
"Aggiorna i dettagli dell'autore: %s": "Autorendetails aktualisieren: %s",
"Aggiorna i dettagli dell'editore:": "Verlagsdetails aktualisieren:",
"Aggiorna il conteggio delle copie disponibili": "Anzahl der verfügbaren Exemplare aktualisieren",
"Aggiorna le informazioni del profilo selezionato.": "Ausgewählte Profilinformationen aktualisieren.",
+ "Aggiorna Ora": "Jetzt aktualisieren",
"Aggiorna password": "Passwort aktualisieren",
+ "Aggiorna Statistiche": "Statistiken aktualisieren",
"Aggiornamenti": "Aktualisierungen",
"Aggiornamento alla versione %s completato": "Aktualisierung auf Version %s abgeschlossen",
"Aggiornamento completato con successo": "Aktualisierung erfolgreich abgeschlossen",
@@ -165,34 +158,38 @@
"Aggiornata in base a scaffale, mensola e posizione.": "Aktualisiert basierend auf Regal, Regalboden und Position.",
"Aggiornate %d righe": "%d Zeilen aktualisiert",
"Aggiornati": "Aktualisiert",
+ "Aggiunge badge cliccabili alla scheda libro per cercare su Anna's Archive, Z-Library e Project Gutenberg con un click. Ispirato all'estensione browser GoodLib.": "Fügt anklickbare Badges zur Buchdetailseite hinzu, um mit einem Klick auf Anna's Archive, Z-Library und Project Gutenberg zu suchen. Inspiriert von der GoodLib-Browsererweiterung.",
"Aggiungere una Nuova Lingua": "Eine neue Sprache hinzufügen",
"Aggiungi": "Hinzufügen",
- "Aggiungi Genere Rapido": "Genre schnell hinzufügen",
- "Aggiungi Lingua": "Sprache hinzufügen",
- "Aggiungi Nuova Lingua": "Neue Sprache hinzufügen",
- "Aggiungi Nuovo Autore": "Neuen Autor hinzufügen",
- "Aggiungi Nuovo Editore": "Neuen Verlag hinzufügen",
- "Aggiungi Nuovo Libro": "Neues Buch hinzufügen",
- "Aggiungi Prima Lingua": "Erste Sprache hinzufügen",
- "Aggiungi Sottogenere": "Untergenre hinzufügen",
"Aggiungi ai Preferiti": "Zu Favoriten hinzufügen",
"Aggiungi al file .env: APP_CANONICAL_URL=%s": "In der .env-Datei hinzufügen: APP_CANONICAL_URL=%s",
"Aggiungi alla collezione": "Zur Sammlung hinzufügen",
"Aggiungi decimale": "Dezimalstelle hinzufügen",
"Aggiungi eventuali note sul prestito": "Fügen Sie eventuelle Anmerkungen zur Ausleihe hinzu",
"Aggiungi eventuali note...": "Anmerkungen hinzufügen...",
+ "Aggiungi Genere Rapido": "Genre schnell hinzufügen",
"Aggiungi i libri che ti interessano dalla scheda di dettaglio per ricevere un promemoria quando tornano disponibili.": "Fügen Sie Bücher, die Sie interessieren, über die Detailseite hinzu, um eine Erinnerung zu erhalten, wenn sie wieder verfügbar sind.",
"Aggiungi la tua API key per interrogare Google Books quando importi un ISBN. Google viene utilizzato prima di Open Library, ma dopo Scraping Pro.": "Fügen Sie Ihren API-Schlüssel hinzu, um Google Books bei ISBN-Importen abzufragen. Google wird vor Open Library, aber nach Scraping Pro verwendet.",
"Aggiungi le mensole (livelli) a ogni scaffale": "Fügen Sie jedem Regal Regalböden (Ebenen) hinzu",
+ "Aggiungi Lingua": "Sprache hinzufügen",
+ "Aggiungi Nuova Lingua": "Neue Sprache hinzufügen",
+ "Aggiungi Nuovo Autore": "Neuen Autor hinzufügen",
+ "Aggiungi Nuovo Editore": "Neuen Verlag hinzufügen",
+ "Aggiungi Nuovo Libro": "Neues Buch hinzufügen",
"Aggiungi nuovo libro": "Neues Buch hinzufügen",
+ "Aggiungi Prima Lingua": "Erste Sprache hinzufügen",
"Aggiungi primo libro": "Erstes Buch hinzufügen",
"Aggiungi scaffali e mensole per la tua biblioteca": "Fügen Sie Regale und Regalböden für Ihre Bibliothek hinzu",
+ "Aggiungi Sottogenere": "Untergenre hinzufügen",
"Aggiungi un motivo (opzionale)": "Grund hinzufügen (optional)",
"Aggiungi un nuovo titolo per arricchire il catalogo di questo editore.": "Fügen Sie einen neuen Titel hinzu, um den Katalog dieses Verlags zu erweitern.",
+ "Aggiungi volume": "Band hinzufügen",
"Aggiunti di recente al catalogo": "Kürzlich zum Katalog hinzugefügt",
"Aggiunto il": "Hinzugefügt am",
+ "agosto": "August",
"Aiuto": "Hilfe",
"Al": "Bis",
+ "al": "bis",
"Al momento non ci sono eventi attivi. Continua a seguirci per restare aggiornato sui prossimi appuntamenti.": "Derzeit gibt es keine aktiven Veranstaltungen. Folgen Sie uns weiterhin, um über kommende Termine informiert zu bleiben.",
"Al momento non ci sono eventi programmati. Torna a visitare questa pagina per scoprire i prossimi appuntamenti.": "Derzeit sind keine Veranstaltungen geplant. Besuchen Sie diese Seite erneut, um kommende Termine zu entdecken.",
"Al:": "Bis:",
@@ -202,11 +199,14 @@
"Alert prestito in ritardo (Admin)": "Überfällige Ausleihe – Warnung (Admin)",
"Allegato": "Anhang",
"Almeno uno dei seguenti parametri è richiesto:": "Mindestens einer der folgenden Parameter ist erforderlich:",
+ "altamente consigliato": "dringend empfohlen",
"Altri eventi in programma": "Weitere geplante Veranstaltungen",
"Altri filtri": "Weitere Filter",
"Altro": "Sonstiges",
+ "Altro Numero di Chiamata": "Andere Signatur",
"Amministratore": "Administrator",
"Analitici:": "Analyse:",
+ "Anna's Archive": "Anna's Archive",
"Anni di Vita": "Lebensjahre",
"Anno": "Jahr",
"Anno (YYYY)": "Jahr (JJJJ)",
@@ -214,6 +214,7 @@
"Anno da": "Jahr von",
"Anno di Pubblicazione": "Erscheinungsjahr",
"Anno di pubblicazione": "Erscheinungsjahr",
+ "Anno di Uscita": "Erscheinungsjahr",
"Anno max": "Jahr max.",
"Anno min": "Jahr min.",
"Anno numerico (usato per filtri e ordinamento)": "Numerisches Jahr (wird für Filter und Sortierung verwendet)",
@@ -222,9 +223,9 @@
"Anno pubblicazione da": "Erscheinungsjahr von",
"Anno:": "Jahr:",
"Annulla": "Abbrechen",
+ "Annulla prenotazione": "Vormerkung stornieren",
"Annulla Prestito": "Ausleihe stornieren",
"Annulla Prestito Scaduto": "Überfällige Ausleihe stornieren",
- "Annulla prenotazione": "Vormerkung stornieren",
"Annullare il prestito scaduto?": "Die überfällige Ausleihe stornieren?",
"Annullare questa prenotazione?": "Diese Vormerkung stornieren?",
"Annullata": "Storniert",
@@ -236,21 +237,34 @@
"Anteprima logo": "Logo-Vorschau",
"Anteprima non disponibile": "Vorschau nicht verfügbar",
"Anteprima:": "Vorschau:",
+ "API": "API",
+ "API abilitata con successo.": "API erfolgreich aktiviert.",
+ "API configurata": "API konfiguriert",
+ "API disabilitata con successo.": "API erfolgreich deaktiviert.",
+ "API Key": "API-Schlüssel",
+ "API key creata con successo.": "API-Schlüssel erfolgreich erstellt.",
+ "API key eliminata con successo.": "API-Schlüssel erfolgreich gelöscht.",
+ "API Key già configurata": "API-Schlüssel bereits konfiguriert",
+ "API Keys": "API-Schlüssel",
+ "API Pubblica": "Öffentliche API",
+ "APP_CANONICAL_URL configurato con valore non valido: '%s'. Link nelle email potrebbero non funzionare. Valore suggerito: %s": "APP_CANONICAL_URL mit ungültigem Wert konfiguriert: '%s'. E-Mail-Links funktionieren möglicherweise nicht. Empfohlener Wert: %s",
+ "APP_CANONICAL_URL configurato ma vuoto nel file .env. Link nelle email useranno fallback a HTTP_HOST. Valore suggerito: %s": "APP_CANONICAL_URL konfiguriert, aber leer in der .env-Datei. E-Mail-Links verwenden HTTP_HOST als Fallback. Empfohlener Wert: %s",
+ "APP_CANONICAL_URL non configurato nel file .env. Link nelle email potrebbero non funzionare correttamente. Valore suggerito: %s": "APP_CANONICAL_URL nicht in der .env-Datei konfiguriert. Links in E-Mails funktionieren möglicherweise nicht korrekt. Empfohlener Wert: %s",
"Apparirà nei risultati di ricerca Google. Se vuoto, usa il titolo hero o il nome dell'app.": "Erscheint in den Google-Suchergebnissen. Wenn leer, wird der Hero-Titel oder der App-Name verwendet.",
"Apparirà sotto il titolo nei risultati di ricerca. Se vuoto, usa il sottotitolo hero o una descrizione generica.": "Erscheint unter dem Titel in den Suchergebnissen. Wenn leer, wird der Hero-Untertitel oder eine allgemeine Beschreibung verwendet.",
"Applica": "Anwenden",
"Applica Filtri": "Filter anwenden",
"Applica Fix": "Fix anwenden",
- "Applicazione Già Installata": "Anwendung bereits installiert",
"Applicazione configurata:": "Anwendung konfiguriert:",
"Applicazione del fix...": "Fix wird angewendet...",
+ "Applicazione Già Installata": "Anwendung bereits installiert",
"Applicazione già installata": "Anwendung bereits installiert",
"Approva": "Genehmigen",
- "Approva Prestiti": "Ausleihen genehmigen",
- "Approva Prestito?": "Ausleihe genehmigen?",
"Approva e Invia Email Attivazione": "Genehmigen und Aktivierungs-E-Mail senden",
"Approva o rifiuta le recensioni degli utenti": "Benutzerrezensionen genehmigen oder ablehnen",
"Approva o rifiuta le richieste degli utenti": "Benutzeranfragen genehmigen oder ablehnen",
+ "Approva Prestiti": "Ausleihen genehmigen",
+ "Approva Prestito?": "Ausleihe genehmigen?",
"Approva prestito?": "Ausleihe genehmigen?",
"Approva recensione": "Rezension genehmigen",
"Approvata": "Genehmigt",
@@ -261,18 +275,34 @@
"Approverai questa richiesta di prestito?": "Möchten Sie diese Ausleihanfrage genehmigen?",
"Apri": "Öffnen",
"Apri Editor": "Editor öffnen",
- "Apri Google Cloud Console": "Google Cloud Console öffnen",
"Apri file": "Datei öffnen",
+ "Apri Google Cloud Console": "Google Cloud Console öffnen",
"Apri menu": "Menü öffnen",
+ "aprile": "April",
"Archivia": "Archivieren",
"Archiviato": "Archiviert",
"Archivio": "Archiv",
+ "Arricchimento": "Anreicherung",
+ "Arricchimento Automatico": "Automatische Anreicherung",
"Arricchimento automatico dati": "Automatische Datenanreicherung",
+ "Arricchimento Manuale": "Manuelle Anreicherung",
+ "Arricchimento Massivo": "Massenanreicherung",
+ "Arricchimento massivo ISBN": "ISBN-Massenanreicherung",
+ "Arricchisci Adesso": "Jetzt anreichern",
+ "Arricchisci automaticamente i libri con ISBN cercando copertine e descrizioni mancanti": "Bücher mit ISBN automatisch anreichern, indem fehlende Cover und Beschreibungen gesucht werden",
"Arricchisci dati con scraping web (copertine, descrizioni, etc.)": "Daten mit Web-Scraping anreichern (Cover, Beschreibungen usw.)",
+ "Arricchiti": "Angereichert",
+ "Arricchito": "Angereichert",
"Article (Articolo/Blog)": "Article (Artikel/Blog)",
"Articolo": "Artikel",
+ "Artista": "Künstler",
+ "Artista sconosciuto": "Unbekannter Künstler",
+ "Artisti": "Künstler",
+ "Ascolta": "Anhören",
"Ascolta Audiobook": "Hörbuch anhören",
"Ascolta l'audiobook": "Hörbuch anhören",
+ "Assegna": "Zuweisen",
+ "Assegna collana": "Reihe zuweisen",
"Assicurati che corrisponda al tipo di carta per etichette che utilizzi.": "Stellen Sie sicher, dass es mit dem von Ihnen verwendeten Etikettenpapier übereinstimmt.",
"Assicurati che il path assoluto dello script sia corretto": "Stellen Sie sicher, dass der absolute Pfad zum Skript korrekt ist",
"Assicurati che sia configurato correttamente per evitare URL duplicati.": "Stellen Sie sicher, dass die Konfiguration korrekt ist, um doppelte URLs zu vermeiden.",
@@ -285,6 +315,7 @@
"Attenzione: %d prestiti in ritardo": "Achtung: %d überfällige Ausleihen",
"Attenzione: %d prestito in ritardo": "Achtung: %d überfällige Ausleihe",
"Attenzione: Azione Manuale Richiesta": "Achtung: Manueller Eingriff erforderlich",
+ "ATTENZIONE: Disinstallazione Irreversibile": "ACHTUNG: Unwiderrufliche Deinstallation",
"Attenzione: Non è stato possibile rimuovere tutte le copie richieste. Alcune copie sono attualmente in prestito.": "Achtung: Es konnten nicht alle angeforderten Exemplare entfernt werden. Einige Exemplare sind derzeit ausgeliehen.",
"Attiva": "Aktiv",
"Attiva Direttamente": "Direkt aktivieren",
@@ -293,6 +324,7 @@
"Attiva questa opzione solo se il tuo server supporta HTTPS. Se il tuo hosting forza già HTTPS automaticamente, non è necessario abilitarla (potrebbe causare redirect loop).": "Aktivieren Sie diese Option nur, wenn Ihr Server HTTPS unterstützt. Falls Ihr Hosting bereits automatisch HTTPS erzwingt, müssen Sie sie nicht aktivieren (könnte eine Weiterleitungsschleife verursachen).",
"Attivando questa modalità verranno disabilitati completamente i prestiti, le prenotazioni e la wishlist. Gli utenti potranno solo consultare il catalogo.": "Durch Aktivierung dieses Modus werden Ausleihen, Vormerkungen und Wunschliste vollständig deaktiviert. Benutzer können nur den Katalog einsehen.",
"Attivare questo tema?": "Dieses Theme aktivieren?",
+ "attivata": "aktiviert",
"Attivato:": "Aktiviert:",
"Attivi": "Aktiv",
"Attività": "Aktivität",
@@ -306,11 +338,13 @@
"Audiobook (MP3/M4A/OGG)": "Hörbuch (MP3/M4A/OGG)",
"Audiobook caricato!": "Hörbuch hochgeladen!",
"Audiobook disponibile": "Hörbuch verfügbar",
+ "Audiolibro": "Hörbuch",
"Aumenta Copie": "Exemplare erhöhen",
"Autenticazione": "Authentifizierung",
"Autenticazione Admin Richiesta": "Admin-Authentifizierung erforderlich",
"Autenticazione Richiesta": "Authentifizierung erforderlich",
"Autenticazione richiesta.": "Authentifizierung erforderlich.",
+ "Autenticazione utente": "Benutzeranmeldung",
"Auto": "Auto",
"Auto-attivazione:": "Auto-Aktivierung:",
"Auto-attivazione: Se compili questo campo, il toggle \"Mostra Cookie Analitici\" in Privacy verrà attivato automaticamente.": "Automatische Aktivierung: Wenn Sie dieses Feld ausfüllen, wird der Schalter \"Analyse-Cookies anzeigen\" unter Datenschutz automatisch aktiviert.",
@@ -323,14 +357,15 @@
"Autore \"%s\" pronto per essere creato": "Autor \"%s\" bereit zur Erstellung",
"Autore \"%s\" è già selezionato": "Autor \"%s\" ist bereits ausgewählt",
"Autore A-Z": "Autor A–Z",
- "Autore Z-A": "Autor Z–A",
"Autore eliminato con successo.": "Autor erfolgreich gelöscht.",
"Autore non specificato": "Autor nicht angegeben",
"Autore principale": "Hauptautor",
"Autore sconosciuto": "Unbekannter Autor",
+ "Autore Z-A": "Autor Z–A",
"Autore/i:": "Autor(en):",
"Autore:": "Autor:",
"Autori": "Autoren",
+ "autori": "Autoren",
"Autori con biografie": "Autoren mit Biografien",
"Autori ed editori vengono creati automaticamente": "Autoren und Verlage werden automatisch erstellt",
"Autori multipli separati da %s": "Mehrere Autoren getrennt durch %s",
@@ -338,24 +373,27 @@
"Autori pubblicati": "Veröffentlichte Autoren",
"Autori uniti": "Autoren zusammengeführt",
"Autori uniti con successo": "Autoren erfolgreich zusammengeführt",
+ "autori. Questa azione non può essere annullata.": "Autoren. Diese Aktion kann nicht rückgängig gemacht werden.",
+ "autori. Tutti i libri verranno assegnati all'autore risultante.": "Autoren. Alle Bücher werden dem resultierenden Autor zugeordnet.",
"Autori:": "Autoren:",
"Avanti": "Weiter",
"Avanzate": "Erweitert",
+ "Avvia manualmente l'arricchimento di un batch di 20 libri. Verranno cercate copertine e descrizioni mancanti.": "Startet manuell die Anreicherung eines Stapels von 20 Büchern. Fehlende Cover und Beschreibungen werden gesucht.",
"Avvio aggiornamento": "Aktualisierung wird gestartet",
"Avvio backup database": "Datenbank-Backup wird gestartet",
"Avvisa gli amministratori quando un prestito entra in ritardo.": "Warnt Administratoren, wenn eine Ausleihe überfällig wird.",
"Avvisi scadenza prestiti (configurabile in Impostazioni → Avanzate, default 3 giorni prima)": "Erinnerungen zum Ablauf der Ausleihe (konfigurierbar unter Einstellungen → Erweitert, Standard 3 Tage vorher)",
"Avviso": "Warnung",
+ "AVVISO Trigger:": "Trigger-WARNUNG:",
"Azione richiesta:": "Erforderliche Aktion:",
"Azioni": "Aktionen",
- "Azioni Rapide": "Schnellaktionen",
- "Azioni Veloci": "Schnellaktionen",
"Azioni di Approvazione": "Genehmigungsaktionen",
"Azioni di Manutenzione": "Wartungsaktionen",
+ "Azioni Rapide": "Schnellaktionen",
+ "Azioni Veloci": "Schnellaktionen",
"Azzera": "Zurücksetzen",
"Backup": "Backup",
"Backup Automatico": "Automatisches Backup",
- "Backup Salvati": "Gespeicherte Backups",
"Backup completato": "Backup abgeschlossen",
"Backup creato con successo": "Backup erfolgreich erstellt",
"Backup creato!": "Sicherung erstellt!",
@@ -368,8 +406,12 @@
"Backup non trovato": "Backup nicht gefunden",
"Backup non trovato.": "Sicherung nicht gefunden.",
"Backup ripristinato con successo.": "Sicherung erfolgreich wiederhergestellt.",
+ "Backup Salvati": "Gespeicherte Backups",
"Backup tabella": "Tabelle wird gesichert",
+ "Barcode": "Barcode",
+ "Barcode fisico": "Physischer Barcode",
"Barra laterale": "Seitenleiste",
+ "BCID": "BCID",
"Benvenuto": "Willkommen",
"Benvenuto nell'Installer": "Willkommen beim Installer",
"Benvenuto, %s!": "Willkommen, %s!",
@@ -378,34 +420,34 @@
"Biblioteca Digitale - La tua biblioteca online": "Digitale Bibliothek – Ihre Online-Bibliothek",
"Biblioteca Digitale - Scopri e Prenota i Tuoi Libri Preferiti": "Digitale Bibliothek – Entdecken und reservieren Sie Ihre Lieblingsbücher",
"Biblioteca digitale con catalogo completo di libri disponibili per il prestito": "Digitale Bibliothek mit vollständigem Katalog ausleihbarer Bücher",
+ "biblioteca, prestito libri, catalogo online, scopri libri, prenotazioni": "Bibliothek, Buchausleihe, Online-Katalog, Bücher entdecken, Vormerkungen",
"Biografia": "Biografie",
"Biografia dell'autore": "Autorenbiografie",
+ "Blu-ray": "Blu-ray",
"Bluesky": "Bluesky",
"Books": "Books",
"Bottone": "Schaltfläche",
"Bottone CTA": "CTA-Schaltfläche",
"Bottone Primario": "Primäre Schaltfläche",
+ "bottoni nelle card": "Schaltflächen in Karten",
+ "bottoni principali": "Hauptschaltflächen",
"Breadcrumb": "Breadcrumb",
"Breve descrizione per i motori di ricerca": "Kurzbeschreibung für Suchmaschinen",
"Breve descrizione per i motori di ricerca (max 160 caratteri)": "Kurzbeschreibung für Suchmaschinen (max. 160 Zeichen)",
"Buono": "Gut",
- "CAP": "PLZ",
- "CMS": "CMS",
- "CSRF": "CSRF",
- "CSRF Fallito": "CSRF fehlgeschlagen",
- "CSRF non valido.": "Ungültiges CSRF-Token.",
- "CSS Personalizzato": "Benutzerdefiniertes CSS",
- "CSV": "CSV",
"Calendario Disponibilità": "Verfügbarkeitskalender",
- "Calendario Prestiti e Prenotazioni": "Kalender für Ausleihen und Vormerkungen",
"Calendario eventi": "Veranstaltungskalender",
+ "Calendario eventi culturali": "Kulturveranstaltungskalender",
"Calendario non disponibile": "Kalender nicht verfügbar",
+ "Calendario Prestiti e Prenotazioni": "Kalender für Ausleihen und Vormerkungen",
"Call to Action": "Call to Action",
"Call to Action (CTA)": "Call to Action (CTA)",
"Cambia lingua": "Sprache ändern",
"Cambia password": "Passwort ändern",
"Cambia vista": "Ansicht wechseln",
+ "Campi Aggiornati": "Aktualisierte Felder",
"Campi Database": "Datenbankfelder",
+ "Campi estesi per l'integrazione con LibraryThing": "Erweiterte Felder für die LibraryThing-Integration",
"Campi Supportati": "Unterstützte Felder",
"Campo": "Feld",
"Campo %s obbligatorio": "Feld %s ist erforderlich",
@@ -416,6 +458,7 @@
"Cancella": "Löschen",
"Cancella filtri": "Filter löschen",
"Cancella tutti i filtri": "Alle Filter löschen",
+ "CAP": "PLZ",
"Caratteristica": "Eigenschaft",
"Carica": "Hochladen",
"Carica %{smart_count} file": "%{smart_count} Datei hochladen",
@@ -423,12 +466,12 @@
"Carica File CSV": "CSV-Datei hochladen",
"Carica File JSON": "JSON-Datei hochladen",
"Carica File LibraryThing": "LibraryThing-Datei hochladen",
- "Carica Nuovo File JSON": "Neue JSON-Datei hochladen",
- "Carica Plugin": "Plugin hochladen",
"Carica il file JSON di traduzione (opzionale)": "Übersetzungs-JSON-Datei hochladen (optional)",
"Carica il file usando l'uploader": "Laden Sie die Datei mit dem Uploader hoch",
"Carica logo (PNG, JPG, SVG)": "Logo hochladen (PNG, JPG, SVG)",
+ "Carica Nuovo File JSON": "Neue JSON-Datei hochladen",
"Carica o collega eBook (PDF/ePub) e audiobook (MP3/M4A) per renderli disponibili agli utenti.": "Laden Sie E-Books (PDF/ePub) und Hörbücher (MP3/M4A) hoch oder verknüpfen Sie diese, um sie den Benutzern zur Verfügung zu stellen.",
+ "Carica Plugin": "Plugin hochladen",
"Carica un file CSV per importare più libri contemporaneamente": "Laden Sie eine CSV-Datei hoch, um mehrere Bücher gleichzeitig zu importieren",
"Carica un file ZIP contenente il plugin. Il file deve includere un %s con le informazioni del plugin.": "Laden Sie eine ZIP-Datei mit dem Plugin hoch. Die Datei muss eine %s mit den Plugin-Informationen enthalten.",
"Carica un nuovo file per aggiornare le traduzioni (opzionale). Verrà creato un backup del file precedente.": "Laden Sie eine neue Datei hoch, um die Übersetzungen zu aktualisieren (optional). Ein Backup der vorherigen Datei wird erstellt.",
@@ -447,23 +490,25 @@
"Caricamento sessioni...": "Sitzungen werden geladen...",
"Caricamento...": "Wird geladen...",
"Caroselli Generi": "Genre-Karussells",
+ "Cartaceo": "Druckausgabe",
"Casa Editrice": "Verlag",
"Case editrici": "Verlage",
+ "Cassetta": "Kassette",
"Catalogo": "Katalog",
+ "Catalogo bibliotecario gestito con [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Disponibile in: %s.": "Bibliothekskatalog betrieben mit [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Verfügbar in: %s.",
"Catalogo Completo Libri - Biblioteca Digitale": "Vollständiger Buchkatalog – Digitale Bibliothek",
"Catalogo Libri": "Buchkatalog",
- "Catalogo Libri - Biblioteca": "Buchkatalog – Bibliothek",
"Catalogo libri": "Buchkatalog",
+ "Catalogo Libri - Biblioteca": "Buchkatalog – Bibliothek",
+ "Catalogo pubblico": "Öffentlicher Katalog",
"Català (CA)": "Katalanisch (CA)",
"Categoria": "Kategorie",
"Categorie": "Kategorien",
"Categorie Cookie": "Cookie-Kategorien",
+ "CD Audio": "Audio-CD",
"Centro Impostazioni": "Einstellungscenter",
"Cerca": "Suchen",
- "Cerca IP...": "IP suchen...",
- "Cerca Libri": "Bücher suchen",
- "Cerca Libro": "Buch suchen",
- "Cerca Utente": "Benutzer suchen",
+ "Cerca \"%s\" su %s": "Suche \"%s\" auf %s",
"Cerca autore...": "Autor suchen...",
"Cerca autori esistenti o aggiungine di nuovi...": "Vorhandene Autoren suchen oder neue hinzufügen...",
"Cerca codice o nome...": "Code oder Name suchen...",
@@ -471,16 +516,21 @@
"Cerca editore...": "Verlag suchen...",
"Cerca email...": "E-Mail suchen...",
"Cerca genere...": "Genre suchen...",
+ "Cerca globale": "Globale Suche",
"Cerca icona... (es. user, home, book)": "Symbol suchen... (z. B. user, home, book)",
- "Cerca libri, autori, ISBN...": "Bücher, Autoren, ISBN suchen...",
+ "Cerca IP...": "IP suchen...",
+ "Cerca Libri": "Bücher suchen",
"Cerca libri, autori, editori, utenti...": "Bücher, Autoren, Verlage, Benutzer suchen...",
"Cerca libri, autori, editori...": "Bücher, Autoren, Verlage suchen...",
+ "Cerca libri, autori, ISBN...": "Bücher, Autoren, ISBN suchen...",
"Cerca libri, autori...": "Bücher, Autoren suchen...",
"Cerca libri...": "Bücher suchen...",
+ "Cerca Libro": "Buch suchen",
+ "Cerca libro": "Buch suchen",
"Cerca nella biblioteca": "In der Bibliothek suchen",
+ "Cerca per codice EAN": "Nach EAN-Code suchen",
"Cerca per ISBN-10": "Nach ISBN-10 suchen",
"Cerca per ISBN-13": "Nach ISBN-13 suchen",
- "Cerca per codice EAN": "Nach EAN-Code suchen",
"Cerca per nome autore (corrispondenza parziale)": "Nach Autorenname suchen (Teilübereinstimmung)",
"Cerca per nome, cognome, telefono, email o tessera": "Nach Name, Nachname, Telefon, E-Mail oder Ausweis suchen",
"Cerca per nome...": "Nach Name suchen...",
@@ -491,31 +541,43 @@
"Cerca posizione...": "Standort suchen...",
"Cerca pseudonimo...": "Pseudonym suchen...",
"Cerca rapido...": "Schnellsuche...",
+ "Cerca su:": "Suche auf:",
"Cerca testo": "Text suchen",
"Cerca titoli": "Titel suchen",
"Cerca titoli, autori, ISBN...": "Titel, Autoren, ISBN suchen...",
+ "Cerca Utente": "Benutzer suchen",
"Cerca...": "Suchen...",
"Cerca:": "Suchen:",
"Certificato SSL/TLS valido": "Gültiges SSL/TLS-Zertifikat",
"Chi Siamo": "Über uns",
"Chiave": "Schlüssel",
"Chiave API Google Books": "Google Books API-Schlüssel",
+ "Chiave di cifratura non configurata (PLUGIN_ENCRYPTION_KEY o APP_KEY)": "Verschlüsselungsschlüssel nicht konfiguriert (PLUGIN_ENCRYPTION_KEY oder APP_KEY)",
"Chiave Google Books aggiornata.": "Google Books-Schlüssel aktualisiert.",
"Chiave Google Books rimossa.": "Google Books-Schlüssel entfernt.",
"Chiave Google Books salvata correttamente.": "Google Books-Schlüssel erfolgreich gespeichert.",
"Chiave Route": "Routen-Schlüssel",
+ "chiavi": "Schlüssel",
+ "chiavi tradotte": "übersetzte Schlüssel",
"Chiedi al tuo amministratore di database di eseguire i comandi contenuti nel file": "Bitten Sie Ihren Datenbankadministrator, die in der Datei enthaltenen Befehle auszuführen",
"Chiudi": "Schließen",
- "Chiudi Player": "Player schließen",
"Chiudi alternative": "Alternativen schließen",
"Chiudi menu": "Menü schließen",
+ "Chiudi Player": "Player schließen",
+ "Chiudi popup": "Popup schließen",
+ "Chiudi Visualizzatore": "Viewer schließen",
+ "Ciao": "Hallo",
"Citazione": "Zitat",
"Città": "Stadt",
"Classe (000-900)": "Klasse (000–900)",
+ "classe principale": "Hauptklasse",
"Classe principale mancante: %s.": "Fehlende Hauptklasse: %s.",
"Classi principali": "Hauptklassen",
"Classificazione Dewey": "Dewey-Klassifikation",
+ "Classificazione LC": "LC-Klassifikation",
"Classificazione selezionata:": "Ausgewählte Klassifikation:",
+ "Classificazioni": "Klassifikationen",
+ "Classificazioni Bibliotecarie": "Bibliothekarische Klassifikationen",
"Clicca o trascina per caricare un logo": "Klicken oder ziehen Sie, um ein Logo hochzuladen",
"Clicca per selezionare": "Zum Auswählen klicken",
"Clicca su \"Esegui Manutenzione\" per correggere automaticamente i problemi riparabili.": "Klicken Sie auf \"Wartung ausführen\", um behebbare Probleme automatisch zu korrigieren.",
@@ -523,50 +585,66 @@
"Clicca su \\": "Klicken Sie auf \\",
"Clicca su \\\"Esegui Manutenzione\\\" per correggere automaticamente i problemi riparabili.": "Klicken Sie auf \\\"Wartung ausführen\\\", um behebbare Probleme automatisch zu korrigieren.",
"Clicca su un'icona per selezionarla": "Klicken Sie auf ein Symbol, um es auszuwählen",
+ "Clicca sul pulsante qui sotto per resettare la tua password:": "Klicken Sie auf die Schaltfläche unten, um Ihr Passwort zurückzusetzen:",
"Close menu": "Menü schließen",
+ "CMS": "CMS",
"Coda": "Warteschlange",
"Codice": "Code",
"Codice *": "Code *",
+ "Codice a Barre": "Barcode",
"Codice CSS": "CSS-Code",
"Codice CSS da applicare a tutte le pagine del frontend": "CSS-Code, der auf alle Frontend-Seiten angewendet wird",
"Codice Dewey": "Dewey-Code",
"Codice Dewey non trovato": "Dewey-Code nicht gefunden",
"Codice Dewey selezionato:": "Ausgewählter Dewey-Code:",
"Codice Dewey trovato e impostato": "Dewey-Code gefunden und gesetzt",
+ "Codice embed completo": "Vollständiger Einbettungscode",
"Codice Fiscale": "Steuernummer",
+ "Codice fiscale": "Steuernummer",
+ "Codice fiscale dell'editore (opzionale)": "Steuernummer des Verlags (optional)",
+ "Codice fiscale italiano (opzionale)": "Italienische Steuernummer (optional)",
"Codice ISBN o EAN": "ISBN- oder EAN-Code",
"Codice ISO 2 lettere (es: IT, FR, GB)": "ISO-2-Buchstaben-Code (z. B. IT, FR, GB)",
"Codice JavaScript": "JavaScript-Code",
"Codice JavaScript Analytics": "Analytics-JavaScript-Code",
"Codice Lingua": "Sprachcode",
- "Codice Tessera": "Ausweisnummer",
- "Codice Tessera:": "Ausweisnummer:",
- "Codice embed completo": "Vollständiger Einbettungscode",
- "Codice fiscale": "Steuernummer",
- "Codice fiscale dell'editore (opzionale)": "Steuernummer des Verlags (optional)",
- "Codice fiscale italiano (opzionale)": "Italienische Steuernummer (optional)",
"Codice parent non trovato.": "Übergeordneter Code nicht gefunden.",
"Codice postale...": "Postleitzahl...",
"Codice scaffale obbligatorio": "Regalcode erforderlich",
+ "Codice Tessera": "Ausweisnummer",
"Codice tessera": "Ausweisnummer",
+ "Codice Tessera:": "Ausweisnummer:",
"Cognome": "Nachname",
"Collana": "Reihe",
+ "Collana \"%s\" creata": "Reihe \"%s\" erstellt",
+ "Collana \"%s\" eliminata (%d libri aggiornati)": "Reihe \"%s\" gelöscht (%d Bücher aktualisiert)",
+ "Collana assegnata": "Reihe zugewiesen",
+ "Collana rinominata: %d libri aggiornati": "Reihe umbenannt: %d Bücher aktualisiert",
+ "Collane": "Reihen",
+ "Collane totali": "Reihen insgesamt",
+ "Collane unite: %d libri spostati in \"%s\"": "Reihen zusammengeführt: %d Bücher in \"%s\" verschoben",
+ "Collezione: %d libri, %d autori, %d editori.": "Sammlung: %d Bücher, %d Autoren, %d Verlage.",
"Collocazione": "Standort",
"Collocazione calcolata": "Berechneter Standort",
"Collocazione suggerita": "Vorgeschlagener Standort",
"Collocazione:": "Standort:",
"Colonne": "Spalten",
"Colore Bottoni CTA": "CTA-Schaltflächenfarbe",
+ "Colore non valido": "Ungültige Farbe",
"Colore Primario": "Primärfarbe",
"Colore Secondario": "Sekundärfarbe",
"Colore Testo Bottoni": "Schaltflächen-Textfarbe",
- "Colore non valido": "Ungültige Farbe",
- "Colori Tema": "Theme-Farben",
"Colori ripristinati ai valori predefiniti": "Farben auf Standardwerte zurückgesetzt",
+ "Colori Tema": "Theme-Farben",
"Come Esportare da LibraryThing": "So exportieren Sie aus LibraryThing",
"Come Funziona": "So funktioniert es",
+ "Come Nuovo": "Wie neu",
+ "come nuovo autore": "als neuer Autor",
"Come ottenere il codice": "So erhalten Sie den Code",
"Commento": "Kommentar",
+ "Commento Privato": "Privater Kommentar",
+ "Commento Pubblico": "Öffentlicher Kommentar",
+ "Commento pubblico...": "Öffentlicher Kommentar...",
"Communication error with the server": "Kommunikationsfehler mit dem Server",
"Compila con i dati dei tuoi libri": "Füllen Sie die Daten Ihrer Bücher aus",
"Compila i dettagli del libro per aggiungerlo alla biblioteca": "Füllen Sie die Buchdetails aus, um es zur Bibliothek hinzuzufügen",
@@ -578,6 +656,7 @@
"Compila tutti i campi per creare una nuova prenotazione": "Füllen Sie alle Felder aus, um eine neue Vormerkung zu erstellen",
"Compila tutti i campi richiesti": "Füllen Sie alle erforderlichen Felder aus",
"Completamento": "Fertigstellung",
+ "completamento": "Abschluss",
"Completata": "Abgeschlossen",
"Completati": "Abgeschlossen",
"Completato": "Abgeschlossen",
@@ -586,27 +665,40 @@
"Completo": "Vollständig",
"Complimenti!": "Herzlichen Glückwunsch!",
"Componente": "Komponente",
+ "con successo": "erfolgreich",
"Con valore 3, un prestito che scade il 15 Gennaio riceverà l'avviso il 12 Gennaio": "Bei Wert 3 erhält eine Ausleihe, die am 15. Januar abläuft, die Benachrichtigung am 12. Januar",
"Condividi": "Teilen",
"Condividi la tua opinione su questo libro...": "Teilen Sie Ihre Meinung zu diesem Buch...",
+ "Condividi su Bluesky": "Auf Bluesky teilen",
"Condividi su Facebook": "Auf Facebook teilen",
+ "Condividi su LINE": "Auf LINE teilen",
+ "Condividi su LinkedIn": "Auf LinkedIn teilen",
+ "Condividi su Pinterest": "Auf Pinterest teilen",
+ "Condividi su Reddit": "Auf Reddit teilen",
+ "Condividi su Telegram": "Auf Telegram teilen",
+ "Condividi su Threads": "Auf Threads teilen",
+ "Condividi su Tumblr": "Auf Tumblr teilen",
"Condividi su Twitter": "Auf Twitter teilen",
+ "Condividi su VK": "Auf VK teilen",
"Condividi su WhatsApp": "Auf WhatsApp teilen",
+ "Condividi su X": "Auf X teilen",
+ "Condivisione": "Teilen",
"Condiviso": "Geteilt",
+ "Condizione Fisica": "Physischer Zustand",
"Condizioni": "Bedingungen",
"Conferma": "Bestätigen",
"Conferma Aggiornamento": "Aktualisierung bestätigen",
+ "Conferma aggiornamento": "Aktualisierung bestätigen",
"Conferma Annullamento": "Stornierung bestätigen",
"Conferma Disinstallazione": "Deinstallation bestätigen",
- "Conferma Password": "Passwort bestätigen",
- "Conferma Ritiro": "Abholung bestätigen",
- "Conferma Salvataggio": "Speichern bestätigen",
- "Conferma aggiornamento": "Aktualisierung bestätigen",
"Conferma eliminazione": "Löschung bestätigen",
"Conferma la tua email": "Bestätigen Sie Ihre E-Mail",
"Conferma modifica": "Änderung bestätigen",
+ "Conferma Password": "Passwort bestätigen",
"Conferma password": "Passwort bestätigen",
"Conferma restituzione": "Rückgabe bestätigen",
+ "Conferma Ritiro": "Abholung bestätigen",
+ "Conferma Salvataggio": "Speichern bestätigen",
"Confermare il ritiro?": "Abholung bestätigen?",
"Confermi di voler attivare direttamente questo utente senza richiedere verifica email?": "Möchten Sie diesen Benutzer wirklich direkt aktivieren, ohne eine E-Mail-Verifizierung zu verlangen?",
"Confermi di voler attivare direttamente questo utente?": "Sind Sie sicher, dass Sie diesen Benutzer direkt aktivieren möchten?",
@@ -615,28 +707,31 @@
"Confermi?": "Bestätigen?",
"Confermo di voler disinstallare il plugin e di aver effettuato un backup dei dati": "Ich bestätige, dass ich das Plugin deinstallieren möchte und eine Datensicherung durchgeführt habe",
"Configura API": "API konfigurieren",
+ "Configura come opera multi-volume": "Als mehrbändiges Werk konfigurieren",
+ "Configura Fonti": "Quellen konfigurieren",
"Configura Google Books": "Google Books konfigurieren",
- "Configura Z39.50": "Z39.50 konfigurieren",
"Configura i testi mostrati all'interno del pannello delle preferenze dei cookie.": "Konfigurieren Sie die Texte, die im Cookie-Einstellungen-Panel angezeigt werden.",
"Configura i testi visualizzati agli utenti in ogni parte del cookie banner.": "Konfigurieren Sie die Texte, die den Benutzern in jedem Teil des Cookie-Banners angezeigt werden.",
"Configura i testi visualizzati agli utenti nel banner iniziale.": "Konfigurieren Sie die Texte, die den Benutzern im anfänglichen Banner angezeigt werden.",
"Configura l'identità dell'applicazione, i metodi di invio email e personalizza i template delle notifiche automatiche.": "Konfigurieren Sie die Anwendungsidentität, E-Mail-Versandmethoden und passen Sie die Vorlagen für automatische Benachrichtigungen an.",
+ "Configura l'integrazione con le API di Discogs per lo scraping di metadati musicali.": "Konfigurieren Sie die Integration mit der Discogs-API für das Scraping von Musik-Metadaten.",
"Configura le date della prenotazione": "Vormerkungsdaten konfigurieren",
"Configura le impostazioni di sicurezza per le connessioni HTTPS": "Sicherheitseinstellungen für HTTPS-Verbindungen konfigurieren",
"Configura le impostazioni email per l'invio di notifiche agli utenti.": "Konfigurieren Sie die E-Mail-Einstellungen für den Versand von Benachrichtigungen an Benutzer.",
"Configura le impostazioni rimanenti (privacy, contatti, etc.)": "Konfigurieren Sie die verbleibenden Einstellungen (Datenschutz, Kontakte usw.)",
"Configura quando inviare l'avviso di scadenza prestiti agli utenti": "Konfigurieren Sie, wann die Fälligkeitserinnerung für Ausleihen an die Benutzer gesendet werden soll",
+ "Configura Z39.50": "Z39.50 konfigurieren",
"Configurazione": "Konfiguration",
+ "Configurazione aggiornata con successo!": "Konfiguration erfolgreich aktualisiert!",
"Configurazione Cron Job": "Cron-Job-Konfiguration",
"Configurazione Database": "Datenbank-Konfiguration",
+ "Configurazione del banner cookie": "Cookie-Banner-Konfiguration",
"Configurazione Email": "E-Mail-Konfiguration",
"Configurazione Etichette Libri": "Buchetiketten-Konfiguration",
- "Configurazione SMTP": "SMTP-Konfiguration",
- "Configurazione aggiornata con successo!": "Konfiguration erfolgreich aktualisiert!",
- "Configurazione del banner cookie": "Cookie-Banner-Konfiguration",
"Configurazione guidata in pochi passaggi.": "Geführte Konfiguration in wenigen Schritten.",
"Configurazione invio": "Versandkonfiguration",
"Configurazione sistema": "Systemkonfiguration",
+ "Configurazione SMTP": "SMTP-Konfiguration",
"Confirm?": "Bestätigen?",
"Connessione al database fallita": "Datenbankverbindung fehlgeschlagen",
"Connessione database non disponibile": "Datenbankverbindung nicht verfügbar",
@@ -660,12 +755,12 @@
"Contenuti homepage aggiornati con successo!": "Homepage-Inhalte erfolgreich aktualisiert!",
"Contenuto": "Inhalt",
"Contenuto Cookie Policy": "Cookie-Richtlinie Inhalt",
- "Contenuto Pagina": "Seiteninhalt",
- "Contenuto Privacy Policy": "Datenschutzrichtlinie Inhalt",
- "Contenuto Testuale": "Textinhalt",
"Contenuto della pagina": "Seiteninhalt",
"Contenuto della pagina /cookies accessibile dal banner": "Inhalt der Seite /cookies, erreichbar über das Banner",
+ "Contenuto Pagina": "Seiteninhalt",
"Contenuto pagina": "Seiteninhalt",
+ "Contenuto Privacy Policy": "Datenschutzrichtlinie Inhalt",
+ "Contenuto Testuale": "Textinhalt",
"Contenuto testuale HTML con editor avanzato": "HTML-Textinhalt mit erweitertem Editor",
"Continua": "Weiter",
"Contrasto": "Kontrast",
@@ -676,12 +771,12 @@
"Controllo pre-aggiornamento fallito": "Vorab-Aktualisierungsprüfung fehlgeschlagen",
"Cookie Analitici": "Analyse-Cookies",
"Cookie Banner": "Cookie-Banner",
- "Cookie Essenziali": "Essentielle Cookies",
"Cookie di Marketing": "Marketing-Cookies",
+ "Cookie Essenziali": "Essentielle Cookies",
"Cookies": "Cookies",
"Copertina": "Cover",
- "Copertina Attuale": "Aktuelles Cover",
"Copertina applicata": "Cover übernommen",
+ "Copertina Attuale": "Aktuelles Cover",
"Copertina attuale": "Aktuelles Cover",
"Copertina del Libro": "Buchcover",
"Copertina del libro": "Buchcover",
@@ -693,70 +788,78 @@
"Copertine scaricate (LibraryThing):": "Heruntergeladene Cover (LibraryThing):",
"Copertine scaricate:": "Cover abgerufen:",
"Copertine sincronizzate: %s": "Synchronisierte Cover: %s",
+ "copi": "Exemplar(e)",
"Copia": "Kopieren",
+ "copia": "Exemplar",
"Copia %d di %d": "Exemplar %d von %d",
- "Copia Link": "Link kopieren",
"Copia eliminata con successo.": "Exemplar erfolgreich gelöscht.",
+ "Copia Link": "Link kopieren",
+ "Copia link": "Link kopieren",
"Copia link negli appunti": "Link in die Zwischenablage kopieren",
"Copia non trovata.": "Exemplar nicht gefunden.",
"Copiato!": "Kopiert!",
"Copie": "Exemplare",
+ "copie": "Exemplare",
"Copie Aggiunte!": "Exemplare hinzugefügt!",
"Copie Disponibili": "Verfügbare Exemplare",
+ "Copie disponibili": "Verfügbare Exemplare",
+ "Copie disponibili:": "Verfügbare Exemplare:",
"Copie Eccessive": "Überschüssige Exemplare",
"Copie Fisiche": "Physische Exemplare",
"Copie Negative": "Negative Exemplare",
"Copie Totali": "Exemplare gesamt",
- "Copie disponibili": "Verfügbare Exemplare",
- "Copie disponibili:": "Verfügbare Exemplare:",
"Copie totali": "Exemplare gesamt",
"Copie totali:": "Exemplare gesamt:",
"Copyright": "Copyright",
"Corpo Email": "E-Mail-Text",
"Corpo email": "E-Mail-Text",
+ "Correggi nel file .env: APP_CANONICAL_URL=%s": "In der .env-Datei korrigieren: APP_CANONICAL_URL=%s",
"Correggi Permessi Automaticamente": "Berechtigungen automatisch korrigieren",
"Correggi Problemi": "Probleme beheben",
- "Correggi nel file .env: APP_CANONICAL_URL=%s": "In der .env-Datei korrigieren: APP_CANONICAL_URL=%s",
"Corrente": "Aktuell",
"Correzione Automatica Permessi": "Automatische Berechtigungskorrektur",
"Correzione Manuale via SSH (se automatica fallisce)": "Manuelle Korrektur per SSH (falls automatisch fehlschlägt)",
"Correzione parziale:": "Teilweise Korrektur:",
"Correzioni applicate: %d record aggiornati": "Korrekturen angewendet: %d Datensätze aktualisiert",
"Cos'è la Collocazione?": "Was ist die Standortbezeichnung?",
+ "Cos'è llms.txt:": "Was ist llms.txt:",
"Cosa fare:": "Was zu tun ist:",
"Cosa ne pensi di questo libro?": "Was denken Sie über dieses Buch?",
"Cosa sono le Route?": "Was sind Routen?",
"Cosa viene nascosto:": "Was ausgeblendet wird:",
"Cover": "Cover",
"Crea": "Erstellen",
- "Crea API Key": "API-Key erstellen",
"Crea Admin": "Admin erstellen",
+ "Crea API Key": "API-Key erstellen",
"Crea Backup": "Sicherung erstellen",
"Crea Backup Manuale": "Manuelles Backup erstellen",
+ "Crea e gestisci gli eventi della biblioteca": "Erstellen und verwalten Sie Bibliotheksveranstaltungen",
"Crea Evento": "Veranstaltung erstellen",
+ "Crea gli scaffali (es: A, B, C)": "Erstellen Sie Regale (z.B.: A, B, C)",
+ "Crea il primo utente amministratore. Questo account avrà accesso completo a tutte le funzionalità del sistema.": "Erstellen Sie den ersten Administratorbenutzer. Dieses Konto hat vollen Zugriff auf alle Systemfunktionen.",
+ "Crea il tuo primo evento": "Erstellen Sie Ihre erste Veranstaltung",
"Crea Indici Automaticamente": "Indizes automatisch erstellen",
+ "Crea la cartella logs se non esiste:
mkdir -p logs": "Erstellen Sie den Ordner logs, falls er nicht existiert:
mkdir -p logs",
"Crea Nuova API Key": "Neuen API-Key erstellen",
"Crea Nuova Prenotazione": "Neue Vormerkung erstellen",
+ "Crea nuovo": "Neu erstellen",
+ "Crea nuovo \"${item.label}\"": "Neu erstellen \"${item.label}\"",
"Crea Nuovo Evento": "Neue Veranstaltung erstellen",
"Crea Nuovo Genere": "Neues Genre erstellen",
"Crea Nuovo Prestito": "Neue Ausleihe erstellen",
+ "Crea opera": "Werk erstellen",
+ "Crea opera multi-volume": "Mehrbändiges Werk erstellen",
"Crea Prenotazione": "Vormerkung erstellen",
"Crea Prestito": "Ausleihe erstellen",
"Crea Prima API Key": "Ersten API-Key erstellen",
"Crea Primo Genere": "Erstes Genre erstellen",
"Crea Tabelle Mancanti": "Fehlende Tabellen erstellen",
+ "Crea un backup manuale o attendi il prossimo aggiornamento.": "Erstellen Sie ein manuelles Backup oder warten Sie auf die nächste Aktualisierung.",
+ "Crea un libro padre che raccoglie tutti i volumi di questa collana.": "Erstellen Sie ein übergeordnetes Buch, das alle Bände dieser Reihe enthält.",
+ "Crea un nuovo account": "Neues Konto erstellen",
+ "Crea un nuovo profilo amministratore o lettore.": "Erstellen Sie ein neues Administrator- oder Leserprofil.",
"Crea Utente Admin": "Admin-Benutzer erstellen",
"Crea Utente Amministratore": "Administratorbenutzer erstellen",
- "Crea e gestisci gli eventi della biblioteca": "Erstellen und verwalten Sie Bibliotheksveranstaltungen",
- "Crea gli scaffali (es: A, B, C)": "Erstellen Sie Regale (z.B.: A, B, C)",
- "Crea il primo utente amministratore. Questo account avrà accesso completo a tutte le funzionalità del sistema.": "Erstellen Sie den ersten Administratorbenutzer. Dieses Konto hat vollen Zugriff auf alle Systemfunktionen.",
- "Crea il tuo primo evento": "Erstellen Sie Ihre erste Veranstaltung",
- "Crea la cartella logs se non esiste:
mkdir -p logs": "Erstellen Sie den Ordner logs, falls er nicht existiert:
mkdir -p logs",
- "Crea nuovo": "Neu erstellen",
- "Crea nuovo \"${item.label}\"": "Neu erstellen \"${item.label}\"",
- "Crea un backup manuale o attendi il prossimo aggiornamento.": "Erstellen Sie ein manuelles Backup oder warten Sie auf die nächste Aktualisierung.",
- "Crea un nuovo account": "Neues Konto erstellen",
- "Crea un nuovo profilo amministratore o lettore.": "Erstellen Sie ein neues Administrator- oder Leserprofil.",
"Creare backup?": "Backup erstellen?",
"Creata": "Erstellt",
"Creata il": "Erstellt am",
@@ -776,77 +879,92 @@
"Crittografia": "Verschlüsselung",
"Cronologia": "Verlauf",
"Cronologia Aggiornamenti": "Update-Verlauf",
- "Cronologia Import": "Importverlauf",
"Cronologia degli aggiornamenti eseguiti": "Verlauf der durchgeführten Aktualisierungen",
+ "Cronologia Import": "Importverlauf",
+ "crontab -e": "crontab -e",
+ "CSRF": "CSRF",
+ "CSRF Fallito": "CSRF fehlgeschlagen",
+ "CSRF non valido.": "Ungültiges CSRF-Token.",
+ "CSS Personalizzato": "Benutzerdefiniertes CSS",
+ "CSV": "CSV",
+ "CSV Standard": "Standard-CSV",
+ "Curatore": "Kurator",
"Da": "Von",
"Da %s (%s)": "Von %s (%s)",
- "Da Inventariare": "Zu inventarisieren",
- "Da Ritirare": "Zur Abholung bereit",
"Da approvare": "Zu genehmigen",
"Da approvare o rifiutare": "Zu genehmigen oder abzulehnen",
"Da consegnare": "Auszuliefern",
"Da creare": "Zu erstellen",
+ "Da Dove Acquisito": "Erworben von",
+ "Da Inventariare": "Zu inventarisieren",
"Da prenotazione": "Aus Vormerkung",
"Da prenotazioni": "Aus Vormerkungen",
"Da qui puoi gestire tutte le lingue disponibili nell'applicazione. Carica file JSON di traduzione e abilita/disabilita lingue.": "Von hier aus können Sie alle verfügbaren Sprachen in der Anwendung verwalten. Laden Sie JSON-Übersetzungsdateien hoch und aktivieren/deaktivieren Sie Sprachen.",
+ "Da Ritirare": "Zur Abholung bereit",
"Da ritirare": "Zur Abholung bereit",
"Dal": "Vom",
"Dal %s al %s": "Vom %s bis %s",
"Dal:": "Vom:",
"Danneggiato": "Beschädigt",
+ "danneggiato": "beschädigt",
"Dansk (DA)": "Dänisch (DA)",
"Dashboard": "Dashboard",
"Data": "Datum",
"Data Acq.": "Erw.-Datum",
"Data Acquisizione": "Erwerbungsdatum",
- "Data Evento": "Veranstaltungsdatum",
- "Data Fine": "Enddatum",
- "Data Inizio": "Startdatum",
- "Data Prenotazione": "Vormerkungsdatum",
- "Data Prestito": "Ausleihdatum",
- "Data Prestito:": "Ausleihdatum:",
- "Data Pubblicazione": "Erscheinungsdatum",
- "Data Restituzione": "Rückgabedatum",
- "Data Restituzione:": "Rückgabedatum:",
- "Data Scadenza": "Fälligkeitsdatum",
- "Data Scadenza:": "Fälligkeitsdatum:",
"Data acquisizione": "Erwerbungsdatum",
"Data acquisizione a": "Erwerbungsdatum bis",
"Data acquisizione da": "Erwerbungsdatum von",
"Data creazione": "Erstellt am",
- "Data di Pubblicazione": "Erscheinungsdatum",
"Data di inizio della prenotazione (default: oggi)": "Startdatum der Vormerkung (Standard: heute)",
"Data di morte": "Sterbedatum",
"Data di nascita": "Geburtsdatum",
+ "Data di Pubblicazione": "Erscheinungsdatum",
"Data di pubblicazione": "Erscheinungsdatum",
"Data di scadenza della prenotazione (default: +30 giorni)": "Ablaufdatum der Vormerkung (Standard: +30 Tage)",
+ "Data Evento": "Veranstaltungsdatum",
+ "Data Fine": "Enddatum",
"Data fine": "Enddatum",
+ "Data Fine Lettura": "Lesedatum Ende",
+ "Data Fine Prestito": "Leihfrist-Ende",
+ "Data Inizio": "Startdatum",
"Data inizio": "Startdatum",
+ "Data Inizio Lettura": "Lesedatum Beginn",
+ "Data Inizio Prestito": "Leihfrist-Beginn",
"Data inizio richiesta mancante": "Angefordertes Startdatum fehlt",
+ "Data Inserimento LibraryThing": "LibraryThing-Eingabedatum",
"Data morte a": "Sterbedatum bis",
"Data morte da": "Sterbedatum von",
"Data nascita a": "Geburtsdatum bis",
"Data nascita da": "Geburtsdatum von",
"Data non valida.": "Ungültiges Datum.",
"Data originale di pubblicazione (formato italiano)": "Ursprüngliches Erscheinungsdatum (italienisches Format)",
+ "Data Prenotazione": "Vormerkungsdatum",
+ "Data Prestito": "Ausleihdatum",
"Data prestito": "Ausleihdatum",
"Data prestito (A)": "Ausleihdatum (Bis)",
"Data prestito (Da)": "Ausleihdatum (Von)",
+ "Data Prestito:": "Ausleihdatum:",
+ "Data Pubblicazione": "Erscheinungsdatum",
"Data pubblicazione da": "Erscheinungsdatum von",
+ "Data Restituzione": "Rückgabedatum",
+ "Data Restituzione:": "Rückgabedatum:",
+ "Data Scadenza": "Fälligkeitsdatum",
"Data scadenza prevista": "Voraussichtliches Fälligkeitsdatum",
+ "Data Scadenza:": "Fälligkeitsdatum:",
"Data/Ora": "Datum/Uhrzeit",
"Data:": "Datum:",
- "DataIntegrity warning (store loan)": "DataIntegrity-Warnung (Ausleihe speichern)",
"Database": "Datenbank",
"Database '%s' non esiste. Crealo prima di procedere.": "Datenbank '%s' existiert nicht. Bitte erstellen Sie sie, bevor Sie fortfahren.",
"Database installato (30 tabelle)": "Datenbank installiert (30 Tabellen)",
"Database installato (41 tabelle)": "Datenbank installiert (41 Tabellen)",
"Database installato (46 tabelle)": "Datenbank installiert (46 Tabellen)",
"Database:": "Datenbank:",
+ "DataIntegrity warning (store loan)": "DataIntegrity-Warnung (Ausleihe speichern)",
"Date": "Termine",
+ "Date di Lettura": "Lesedaten",
"Date Non Valide": "Ungültige Daten",
"Dati Account": "Kontodaten",
- "Dati Utente": "Benutzerdetails",
"Dati alternativi disponibili": "Alternative Daten verfügbar",
"Dati bibliografici completi (titolo, sottotitolo, ISBN, EAN, ecc.)": "Vollständige bibliografische Daten (Titel, Untertitel, ISBN, EAN usw.)",
"Dati della Prenotazione": "Vormerkungsdetails",
@@ -857,6 +975,7 @@
"Dati libro recuperati con successo da Open Library": "Buchdaten erfolgreich von Open Library abgerufen",
"Dati mancanti": "Fehlende Daten",
"Dati personali": "Persönliche Daten",
+ "Dati Utente": "Benutzerdetails",
"Dati validi.": "Gültige Daten.",
"Debug": "Debug",
"Debug Log:": "Debug-Log:",
@@ -865,16 +984,11 @@
"Decrescente": "Absteigend",
"Default: un mese dopo la data inizio": "Standard: ein Monat nach dem Startdatum",
"Definisce i privilegi dell'utente.": "Definiert die Berechtigungen des Benutzers.",
+ "della lingua desiderata.": "der gewünschten Sprache.",
"Demo": "Demo",
"Descrivi l'utilizzo di questa API key...": "Beschreiben Sie die Verwendung dieses API-Keys...",
"Descrizione": "Beschreibung",
"Descrizione Banner": "Banner-Beschreibung",
- "Descrizione Evento": "Veranstaltungsbeschreibung",
- "Descrizione Modale": "Modal-Beschreibung",
- "Descrizione OG": "OG-Beschreibung",
- "Descrizione Open Graph": "Open-Graph-Beschreibung",
- "Descrizione SEO": "SEO-Beschreibung",
- "Descrizione Twitter": "Twitter-Beschreibung",
"Descrizione banner": "Banner-Beschreibung",
"Descrizione breve": "Kurzbeschreibung",
"Descrizione completa dell'evento con possibilità di formattazione HTML": "Vollständige Veranstaltungsbeschreibung mit HTML-Formatierungsmöglichkeiten",
@@ -882,37 +996,53 @@
"Descrizione cookie essenziali": "Beschreibung der essentiellen Cookies",
"Descrizione cookie marketing": "Beschreibung der Marketing-Cookies",
"Descrizione del libro...": "Buchbeschreibung...",
+ "Descrizione della collana...": "Beschreibung der Reihe...",
+ "Descrizione Dewey": "Dewey-Beschreibung",
+ "Descrizione Evento": "Veranstaltungsbeschreibung",
+ "Descrizione Fisica": "Physische Beschreibung",
"Descrizione footer": "Footer-Beschreibung",
+ "Descrizione Modale": "Modal-Beschreibung",
"Descrizione modale": "Modal-Beschreibung",
"Descrizione nella modale preferenze. Puoi usare HTML.": "Beschreibung im Einstellungen-Modal. Sie können HTML verwenden.",
- "Descrizione per Twitter/X. Se vuoto, usa la descrizione Open Graph.": "Beschreibung für Twitter/X. Wenn leer, wird die Open Graph-Beschreibung verwendet.",
+ "Descrizione OG": "OG-Beschreibung",
+ "Descrizione Open Graph": "Open-Graph-Beschreibung",
"Descrizione per anteprima social. Se vuoto, usa la descrizione SEO.": "Beschreibung für die Social-Media-Vorschau. Wenn leer, wird die SEO-Beschreibung verwendet.",
+ "Descrizione per Twitter/X. Se vuoto, usa la descrizione Open Graph.": "Beschreibung für Twitter/X. Wenn leer, wird die Open Graph-Beschreibung verwendet.",
+ "Descrizione salvata": "Beschreibung gespeichert",
+ "Descrizione SEO": "SEO-Beschreibung",
"Descrizione troppo lunga (max 2000 caratteri)": "Beschreibung zu lang (max. 2000 Zeichen)",
+ "Descrizione Twitter": "Twitter-Beschreibung",
"Descrizione:": "Beschreibung:",
"Deseleziona tutti": "Alle abwählen",
"Dettagli": "Details",
"Dettagli Acquisizione": "Erwerbungsdetails",
+ "Dettagli del Prestito": "Ausleihdetails",
+ "Dettagli evento": "Veranstaltungsdetails",
"Dettagli Fisici": "Physische Details",
"Dettagli Libro": "Buchdetails",
"Dettagli Messaggio": "Nachrichtendetails",
- "Dettagli del Prestito": "Ausleihdetails",
- "Dettagli evento": "Veranstaltungsdetails",
"Dettagli principali dell'evento": "Wichtigste Veranstaltungsdetails",
"Dettagli restituzione": "Rückgabedetails",
"Deutsch (DE)": "Deutsch (DE)",
"Deve contenere maiuscole, minuscole e numeri": "Muss Groß-, Kleinbuchstaben und Zahlen enthalten",
"Deve iniziare con": "Muss beginnen mit",
+ "deve iniziare con": "muss beginnen mit",
"Devi accettare la Privacy Policy per procedere": "Sie müssen die Datenschutzrichtlinie akzeptieren, um fortzufahren",
"Devi elencare manualmente i cookie tracciati da questi script nella": "Sie müssen die von diesen Skripten erfassten Cookies manuell auflisten in der",
"Devi eseguire": "Sie müssen ausführen",
"Dewey": "Dewey",
+ "di": "von",
+ "di %s": "von %s",
+ "dicembre": "Dezember",
+ "Digitale": "Digital",
"Dimensione": "Größe",
"Dimensioni": "Abmessungen",
"Dipendenze": "Abhängigkeiten",
- "Directory Upload Pubblici": "Verzeichnis für öffentliche Uploads",
+ "directory": "Verzeichnisse",
"Directory non scrivibile: %s": "Verzeichnis nicht beschreibbar: %s",
"Directory plugin già esistente.": "Plugin-Verzeichnis existiert bereits.",
"Directory sorgente non trovata": "Quellverzeichnis nicht gefunden",
+ "Directory Upload Pubblici": "Verzeichnis für öffentliche Uploads",
"Disabilita": "Deaktivieren",
"Disabilita prestiti, prenotazioni e wishlist. Gli utenti potranno solo consultare il catalogo.": "Deaktiviert Ausleihen, Vormerkungen und Wunschliste. Die Benutzer können nur den Katalog durchsuchen.",
"Disabilita se il tuo sito non usa cookie analitici (es. Google Analytics)": "Deaktivieren, wenn Ihre Website keine Analyse-Cookies verwendet (z.B. Google Analytics)",
@@ -924,12 +1054,19 @@
"Disattiva": "Deaktivieren",
"Disattiva modalità manutenzione": "Wartungsmodus deaktivieren",
"Disattivata": "Inaktiv",
+ "disattivata": "deaktiviert",
+ "Disattivato": "Deaktiviert",
+ "Disattivo": "Deaktiviert",
+ "Disco": "Schallplatte",
+ "Discografia": "Diskografie",
"Disconnesso": "Getrennt",
"Disconnetti": "Abmelden",
"Disconnetti tutti": "Alle abmelden",
+ "Discreto": "Befriedigend",
"Disinstalla": "Deinstallieren",
"Disinstalla Plugin": "Plugin deinstallieren",
"Disponibile": "Verfügbar",
+ "disponibile": "verfügbar",
"Disponibile dal:": "Verfügbar ab:",
"Disponibile nella data selezionata": "Am gewählten Datum verfügbar",
"Disponibile ora": "Jetzt verfügbar",
@@ -937,6 +1074,7 @@
"Disponibile solo con driver SMTP": "Nur mit SMTP-Treiber verfügbar",
"Disponibili": "Verfügbar",
"Disponibili e in prestito": "Verfügbar und ausgeliehen",
+ "disponibili ora": "jetzt verfügbar",
"Disponibilità": "Verfügbarkeit",
"Disponibilità copie": "Exemplarverfügbarkeit",
"Dispositivo sconosciuto": "Unbekanntes Gerät",
@@ -948,7 +1086,12 @@
"Documentazione API": "API-Dokumentation",
"Documento": "Dokument",
"Documento generato il %s alle %s": "Dokument erstellt am %s um %s",
+ "Domini mirror": "Mirror-Domains",
+ "Dominio non valido. Inserisci solo host o host:porta, senza percorsi.": "Ungültige Domain. Geben Sie nur Host oder Host:Port ohne Pfade ein.",
+ "Dominio personalizzato...": "Benutzerdefinierte Domain...",
"Donazione": "Spende",
+ "donazione": "Spende",
+ "dopo aver completato l'installazione.": "nach Abschluss der Installation.",
"Dopo la conferma, un amministratore approverà la tua iscrizione.": "Nach der Bestätigung wird ein Administrator Ihre Registrierung genehmigen.",
"Dopo la rigenerazione, invia l'URL della sitemap a Google Search Console e Bing Webmaster Tools": "Senden Sie nach der Neugenerierung die Sitemap-URL an Google Search Console und Bing Webmaster Tools",
"Download aggiornamento": "Update wird heruntergeladen",
@@ -958,9 +1101,13 @@
"Driver": "Treiber",
"Driver Email": "E-Mail-Treiber",
"Durata": "Dauer",
+ "DVD": "DVD",
"EAN": "EAN",
"EAN:": "EAN:",
- "ERRORE:": "FEHLER:",
+ "eBook": "eBook",
+ "eBook (PDF/ePub)": "eBook (PDF/ePub)",
+ "eBook caricato!": "eBook hochgeladen!",
+ "eBook disponibile": "eBook verfügbar",
"Eccellente": "Ausgezeichnet",
"Eccezione creazione %s su %s:": "Ausnahme beim Erstellen von %s auf %s:",
"Eccezione creazione tabella %s:": "Ausnahme beim Erstellen der Tabelle %s:",
@@ -980,13 +1127,20 @@
"Editore:": "Verlag:",
"Editore: %s": "Verlag: %s",
"Editori": "Verlage",
+ "editori": "Verlage",
"Editori uniti": "Verlage zusammengeführt",
"Editori uniti con successo": "Verlage erfolgreich zusammengeführt",
+ "editori. Questa azione non può essere annullata.": "Verlage. Diese Aktion kann nicht rückgängig gemacht werden.",
+ "editori. Tutti i libri verranno assegnati all'editore risultante.": "Verlage. Alle Bücher werden dem resultierenden Verlag zugeordnet.",
"Edizione": "Ausgabe",
+ "Elaborati": "Verarbeitet",
"Elaborato da": "Bearbeitet von",
+ "Elaborazione in corso...": "Verarbeitung läuft...",
"Elaborazione lista attesa fallita": "Wartelistenverarbeitung fehlgeschlagen",
"Elaborazione...": "Verarbeitung...",
"Elementi": "Elemente",
+ "elementi": "Elemente",
+ "elemento": "Element",
"Elenco Autori": "Autorenliste",
"Elenco Autori - Biblioteca": "Autorenliste – Bibliothek",
"Elenco Editori": "Verlagsliste",
@@ -997,11 +1151,13 @@
"Elenco Utenti": "Benutzerliste",
"Elenco Utenti - Biblioteca": "Benutzerliste – Bibliothek",
"Elimina": "Löschen",
+ "Elimina collana": "Reihe löschen",
+ "Elimina copia": "Exemplar löschen",
+ "Elimina il file .installed dalla root del progetto e riprova": "Löschen Sie die Datei .installed aus dem Projektstammverzeichnis und versuchen Sie es erneut",
"Elimina Installer": "Installer löschen",
"Elimina Installer (Richiede Composer)": "Installer löschen (erfordert Composer)",
+ "elimina la cartella": "den Ordner löschen",
"Elimina Lingua": "Sprache löschen",
- "Elimina copia": "Exemplar löschen",
- "Elimina il file .installed dalla root del progetto e riprova": "Löschen Sie die Datei .installed aus dem Projektstammverzeichnis und versuchen Sie es erneut",
"Elimina questa lingua. Questa azione non può essere annullata.": "Diese Sprache löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
"Elimina recensione": "Rezension löschen",
"Eliminare i libri selezionati?": "Ausgewählte Bücher löschen?",
@@ -1017,22 +1173,22 @@
"Email": "E-Mail",
"Email *": "E-Mail *",
"Email Admin": "Admin-E-Mail",
- "Email Contatto": "Kontakt-E-Mail",
- "Email Non Valida": "Ungültige E-Mail",
- "Email Non Verificata": "Nicht verifizierte E-Mail",
- "Email Referente": "E-Mail der Kontaktperson",
"Email associata al tuo account": "Mit Ihrem Konto verknüpfte E-Mail",
"Email configurata": "E-Mail konfiguriert",
+ "Email Contatto": "Kontakt-E-Mail",
"Email di contatto": "Kontakt-E-Mail",
"Email di recupero inviata con successo!": "Wiederherstellungs-E-Mail erfolgreich gesendet!",
"Email dove ricevere i messaggi dal form contatti": "E-Mail-Adresse für den Empfang von Nachrichten aus dem Kontaktformular",
"Email e telefono visibili sulla pagina contatti": "E-Mail und Telefon sichtbar auf der Kontaktseite",
"Email già registrata": "E-Mail bereits registriert",
"Email non trovata nel nostro sistema": "E-Mail in unserem System nicht gefunden",
+ "Email Non Valida": "Ungültige E-Mail",
"Email non valida. Verifica il formato": "Ungültige E-Mail. Überprüfen Sie das Format",
+ "Email Non Verificata": "Nicht verifizierte E-Mail",
"Email non verificata. Controlla la tua casella di posta e clicca sul link di verifica": "E-Mail nicht verifiziert. Überprüfen Sie Ihren Posteingang und klicken Sie auf den Bestätigungslink",
"Email o password non corretti. Verifica le credenziali e riprova": "E-Mail oder Passwort falsch. Überprüfen Sie Ihre Zugangsdaten und versuchen Sie es erneut",
"Email per notifiche": "E-Mail für Benachrichtigungen",
+ "Email Referente": "E-Mail der Kontaktperson",
"Email troppo lunga (massimo 255 caratteri)": "E-Mail zu lang (maximal 255 Zeichen)",
"Email utente": "Benutzer-E-Mail",
"Email verificata con successo! Il tuo account è ora in attesa di approvazione da parte dell'amministratore. Riceverai un'email quando sarà attivato.": "E-Mail erfolgreich verifiziert! Ihr Konto wartet nun auf die Genehmigung durch den Administrator. Sie erhalten eine E-Mail, wenn es aktiviert wird.",
@@ -1046,9 +1202,6 @@
"Endpoint SRU:": "SRU-Endpoint:",
"English (EN)": "Englisch (EN)",
"Errore": "Fehler",
- "Errore Installazione": "Installationsfehler",
- "Errore SQL durante migrazione %s: %s": "SQL-Fehler bei Migration %s: %s",
- "Errore Upload": "Upload-Fehler",
"Errore aggiornamento log": "Fehler beim Aktualisieren des Protokolls",
"Errore annullamento prenotazione": "Fehler bei der Stornierung der Vormerkung",
"Errore annullamento prestito": "Fehler bei der Stornierung der Ausleihe",
@@ -1064,13 +1217,16 @@
"Errore creazione tabella %s:": "Fehler beim Erstellen der Tabelle %s:",
"Errore creazione tabella migrazioni": "Fehler beim Erstellen der Migrationstabelle",
"Errore creazione tabella update_logs": "Fehler beim Erstellen der Tabelle update_logs",
+ "Errore database": "Datenbankfehler",
"Errore database:": "Datenbankfehler:",
- "Errore del Server": "Serverfehler",
"Errore del database": "Datenbankfehler",
"Errore del database durante la registrazione. Riprova più tardi": "Datenbankfehler bei der Registrierung. Bitte versuchen Sie es später erneut",
+ "Errore del Server": "Serverfehler",
"Errore del server": "Serverfehler",
"Errore del server. Riprova più tardi.": "Serverfehler. Bitte versuchen Sie es später erneut.",
+ "Errore del server. Riprova.": "Serverfehler. Bitte erneut versuchen.",
"Errore di comunicazione con il server": "Kommunikationsfehler mit dem Server",
+ "errore di comunicazione con il server": "Kommunikationsfehler mit dem Server",
"Errore di configurazione del server.": "Serverkonfigurationsfehler.",
"Errore di configurazione.": "Konfigurationsfehler.",
"Errore di connessione": "Verbindungsfehler",
@@ -1102,15 +1258,20 @@
"Errore durante il salvataggio:": "Fehler beim Speichern:",
"Errore durante il seed": "Fehler beim Seeding",
"Errore durante l'aggiornamento": "Fehler bei der Aktualisierung",
+ "Errore durante l'aggiornamento del profilo.": "Fehler beim Aktualisieren des Profils.",
"Errore durante l'aggiornamento dell'evento.": "Fehler beim Aktualisieren der Veranstaltung.",
"Errore durante l'aggiornamento della chiave Google Books.": "Fehler beim Aktualisieren des Google-Books-Schlüssels.",
+ "Errore durante l'aggiornamento delle copie": "Fehler beim Aktualisieren der Exemplare",
+ "Errore durante l'aggiornamento dello stato": "Fehler beim Aktualisieren des Status",
"Errore durante l'annullamento del ritiro": "Fehler beim Stornieren der Abholung",
"Errore durante l'applicazione del fix:": "Fehler beim Anwenden des Fixes:",
"Errore durante l'approvazione": "Fehler bei der Genehmigung",
+ "Errore durante l'arricchimento": "Fehler bei der Anreicherung",
"Errore durante l'attivazione": "Fehler bei der Aktivierung",
"Errore durante l'attivazione del plugin.": "Fehler beim Aktivieren des Plugins.",
"Errore durante l'attivazione del tema": "Fehler bei der Aktivierung des Themes",
"Errore durante l'attivazione: %s": "Fehler bei der Aktivierung: %s",
+ "Errore durante l'eliminazione del libro. Riprova.": "Fehler beim Löschen des Buches. Bitte erneut versuchen.",
"Errore durante l'eliminazione dell'evento.": "Fehler beim Löschen der Veranstaltung.",
"Errore durante l'estrazione del plugin.": "Fehler beim Entpacken des Plugins.",
"Errore durante l'import: %s": "Importfehler: %s",
@@ -1150,15 +1311,17 @@
"Errore elaborazione ritiro scaduto": "Fehler bei der Verarbeitung der abgelaufenen Abholung",
"Errore export CSV": "CSV-Export-Fehler",
"Errore fatale durante aggiornamento": "Schwerwiegender Fehler bei der Aktualisierung",
- "Errore generazione PDF prestito": "Fehler bei der Erstellung des Ausleih-PDF",
"Errore generazione calendario": "Fehler bei der Kalendererstellung",
+ "Errore generazione PDF prestito": "Fehler bei der Erstellung des Ausleih-PDF",
"Errore gestione cambio stato copia": "Fehler bei der Verarbeitung der Exemplar-Statusänderung",
"Errore gestione copia non disponibile": "Fehler bei der Behandlung des nicht verfügbaren Exemplars",
"Errore imprevisto durante l'unione degli autori": "Unerwarteter Fehler beim Zusammenführen der Autoren",
"Errore imprevisto durante l'unione degli editori": "Unerwarteter Fehler beim Zusammenführen der Verlage",
+ "Errore Installazione": "Installationsfehler",
"Errore interno del database": "Interner Datenbankfehler",
"Errore interno del database durante la verifica": "Interner Datenbankfehler während der Überprüfung",
"Errore interno del database. Riprova più tardi.": "Interner Datenbankfehler. Bitte versuchen Sie es später erneut.",
+ "Errore interno durante acquisizione lock.": "Interner Fehler beim Erwerb der Sperre.",
"Errore interno durante l'approvazione": "Interner Fehler bei der Genehmigung",
"Errore interno: %s": "Interner Fehler: %s",
"Errore invio notifica differita": "Fehler beim Senden der verzögerten Benachrichtigung",
@@ -1169,39 +1332,12 @@
"Errore nel caricamento dei backup.": "Fehler beim Laden der Sicherungen.",
"Errore nel caricamento dei libri": "Fehler beim Laden der Bücher",
"Errore nel caricamento del file": "Fehler beim Hochladen der Datei",
- "Aggiunge badge cliccabili alla scheda libro per cercare su Anna's Archive, Z-Library e Project Gutenberg con un click. Ispirato all'estensione browser GoodLib.": "Fügt anklickbare Badges zur Buchdetailseite hinzu, um mit einem Klick auf Anna's Archive, Z-Library und Project Gutenberg zu suchen. Inspiriert von der GoodLib-Browsererweiterung.",
- "Anna's Archive": "Anna's Archive",
- "Catalogo pubblico": "Öffentlicher Katalog",
- "Configura Fonti": "Quellen konfigurieren",
- "Domini mirror": "Mirror-Domains",
- "Dominio non valido. Inserisci solo host o host:porta, senza percorsi.": "Ungültige Domain. Geben Sie nur Host oder Host:Port ohne Pfade ein.",
- "Dominio personalizzato...": "Benutzerdefinierte Domain...",
- "Errore durante l'aggiornamento del profilo.": "Fehler beim Aktualisieren des Profils.",
- "Cerca su:": "Suche auf:",
- "Predefinita del sito": "Website-Standard",
- "Cerca \"%s\" su %s": "Suche \"%s\" auf %s",
- "Fonti attive": "Aktive Quellen",
- "GoodLib — External Sources": "GoodLib — Externe Quellen",
- "GoodLib — Fonti Esterne": "GoodLib — Externe Quellen",
- "Impostazioni GoodLib salvate correttamente.": "GoodLib-Einstellungen erfolgreich gespeichert.",
- "Mostra badge nella pagina dettaglio libro": "Badge auf der Buchdetailseite anzeigen",
- "Mostra badge nell'area amministrazione": "Badge im Administrationsbereich anzeigen",
- "Mostra i badge nella pagina dettaglio libro del catalogo": "Badges auf der Buchdetailseite im Katalog anzeigen",
- "Mostra i badge nella scheda libro dell'area amministrazione": "Badges auf der Buchseite im Administrationsbereich anzeigen",
- "Project Gutenberg": "Project Gutenberg",
- "Puoi scegliere un mirror suggerito oppure selezionare dominio personalizzato.": "Sie können einen vorgeschlagenen Mirror auswählen oder eine benutzerdefinierte Domain wählen.",
- "Puoi usare i mirror suggeriti oppure inserire un dominio custom.": "Sie können die vorgeschlagenen Mirror verwenden oder eine benutzerdefinierte Domain eingeben.",
- "Questi siti cambiano dominio spesso. Seleziona un mirror funzionante.": "Diese Seiten ändern ihre Domain häufig. Wählen Sie einen funktionierenden Mirror aus.",
- "Scheda libro admin": "Admin-Buchseite",
- "Sono accettati anche domini personalizzati; se incolli un URL completo verrà salvato solo l'host.": "Benutzerdefinierte Domains werden ebenfalls akzeptiert; wenn Sie eine vollständige URL einfügen, wird nur der Host gespeichert.",
- "Visibilita": "Sichtbarkeit",
- "Visibilità": "Sichtbarkeit",
- "Z-Library": "Z-Library",
"Errore nel caricamento del file JSON": "Fehler beim Laden der JSON-Datei",
"Errore nel caricamento.": "Fehler beim Laden.",
"Errore nel caricamento. Riprova.": "Fehler beim Laden. Bitte versuchen Sie es erneut.",
"Errore nel download della copertina.": "Fehler beim Herunterladen des Covers.",
"Errore nel parsing del file JSON.": "Fehler beim Parsen der JSON-Datei.",
+ "Errore nel parsing della risposta": "Fehler beim Parsen der Antwort",
"Errore nel recupero dati tabella %s": "Fehler beim Abrufen der Tabellendaten für %s",
"Errore nel recupero dei figli": "Fehler beim Abrufen der Unterkategorien",
"Errore nel recupero delle categorie.": "Fehler beim Abrufen der Kategorien.",
@@ -1217,8 +1353,10 @@
"Errore nel salvataggio del file route": "Fehler beim Speichern der Route-Datei",
"Errore nel salvataggio del file.": "Fehler beim Speichern der Datei.",
"Errore nel salvataggio del tema": "Fehler beim Speichern des Themes",
+ "Errore nel salvataggio del token": "Fehler beim Speichern des Tokens",
"Errore nel salvataggio dell'immagine.": "Fehler beim Speichern des Bildes.",
"Errore nel salvataggio dell'ordine. Ricarica la pagina e riprova.": "Fehler beim Speichern der Reihenfolge. Bitte laden Sie die Seite neu und versuchen Sie es erneut.",
+ "Errore nel salvataggio delle impostazioni.": "Fehler beim Speichern der Einstellungen.",
"Errore nell'aggiornamento del template": "Fehler beim Aktualisieren der Vorlage",
"Errore nell'aggiornamento dello stato dell'API key: %s": "Fehler beim Aktualisieren des API-Key-Status: %s",
"Errore nell'aggiornamento:": "Fehler bei der Aktualisierung:",
@@ -1227,7 +1365,6 @@
"Errore nell'eliminazione dell'API key: %s": "Fehler beim Löschen des API-Keys: %s",
"Errore nell'eliminazione:": "Fehler beim Löschen:",
"Errore nell'operazione:": "Fehler beim Vorgang:",
- "Errore nella Verifica dell'Installazione": "Fehler bei der Installationsüberprüfung",
"Errore nella codifica JSON.": "JSON-Kodierungsfehler.",
"Errore nella comunicazione con il server": "Kommunikationsfehler mit dem Server",
"Errore nella conferma del ritiro": "Fehler bei der Abholungsbestätigung",
@@ -1236,6 +1373,7 @@
"Errore nella copia: ": "Fehler beim Kopieren: ",
"Errore nella creazione del genere.": "Fehler beim Erstellen des Genres.",
"Errore nella creazione dell'API key: %s": "Fehler beim Erstellen des API-Keys: %s",
+ "Errore nella creazione dell'opera": "Fehler beim Erstellen des Werks",
"Errore nella creazione della recensione": "Fehler beim Erstellen der Rezension",
"Errore nella creazione della richiesta di prestito": "Fehler beim Erstellen der Ausleihanfrage",
"Errore nella creazione:": "Fehler beim Erstellen:",
@@ -1248,6 +1386,7 @@
"Errore nella ricerca": "Suchfehler",
"Errore nella ricerca.": "Fehler bei der Suche.",
"Errore nella richiesta di prestito.": "Fehler bei der Ausleihanfrage.",
+ "Errore nella Verifica dell'Installazione": "Fehler bei der Installationsüberprüfung",
"Errore prenotazione": "Vormerkungsfehler",
"Errore preparazione completamento log": "Fehler beim Vorbereiten des Protokollabschlusses",
"Errore preparazione insert migrazione": "Fehler beim Vorbereiten des Migrationseintrags",
@@ -1261,35 +1400,80 @@
"Errore richiesta prestito": "Fehler bei der Ausleihanfrage",
"Errore salvataggio immagine": "Fehler beim Speichern des Bildes",
"Errore sconosciuto durante il caricamento": "Unbekannter Fehler beim Hochladen",
+ "Errore SQL durante migrazione %s: %s": "SQL-Fehler bei Migration %s: %s",
"Errore suggerimento": "Vorschlagsfehler",
+ "Errore Upload": "Upload-Fehler",
"Errore validazione prestito:": "Fehler bei der Ausleihe-Validierung:",
"Errore verifica tabelle: %s": "Fehler bei der Tabellenüberprüfung: %s",
"Errore!": "Fehler!",
+ "ERRORE:": "FEHLER:",
"Errore:": "Fehler:",
"Errore: ": "Fehler: ",
- "Errore: Utente non trovato": "Fehler: Benutzer nicht gefunden",
"Errore: la data di scadenza deve essere successiva alla data di prestito.": "Fehler: Das Fälligkeitsdatum muss nach dem Ausleihdatum liegen.",
"Errore: tutti i campi obbligatori devono essere compilati.": "Fehler: Alle Pflichtfelder müssen ausgefüllt werden.",
- "Errori Totali": "Gesamtfehler",
+ "Errore: Utente non trovato": "Fehler: Benutzer nicht gefunden",
+ "Errori": "Fehler",
"Errori di validazione dopo il merge.": "Validierungsfehler nach dem Zusammenführen.",
"Errori di validazione nel file importato.": "Validierungsfehler in der importierten Datei.",
"Errori di validazione.": "Validierungsfehler.",
"Errori durante l'import": "Importfehler",
+ "Errori durante l'import dei dati (%d). Primi errori:\n%s": "Fehler beim Datenimport (%d). Erste Fehler:\n%s",
+ "Errori Totali": "Gesamtfehler",
"Errori:": "Fehler:",
+ "es. 0.450": "z. B. 0,450",
+ "es. 1234-5678": "z.B. 1234-5678",
+ "es. 15": "z. B. 15",
+ "es. 19.90": "z. B. 19,90",
+ "es. 2020": "z. B. 2020",
+ "es. 2024": "z. B. 2024",
+ "es. 2025": "z. B. 2025",
+ "es. 21x14 cm": "z. B. 21x14 cm",
+ "es. 25.00": "z.B. 25,00",
+ "es. 26 agosto 2025": "z. B. 26. August 2025",
+ "es. 320": "z. B. 320",
+ "es. 599.9, 004.6782, 641.5945": "z.B. 599.9, 004.6782, 641.5945",
+ "es. 599.9, 004.6782, 641.5945, 599.1": "z.B. 599.9, 004.6782, 641.5945, 599.1",
+ "es. 8842935786": "z. B. 8842935786",
+ "es. 978-88-429-3578-0": "z. B. 978-88-429-3578-0",
+ "es. 9788842935780": "z. B. 9788842935780",
+ "es. Acquisto, Donazione, Prestito": "z. B. Kauf, Spende, Ausleihe",
+ "es. Amazon, Libreria XYZ": "z.B. Amazon, Buchhandlung XYZ",
+ "es. Biblioteca Civica": "z. B. Stadtbibliothek",
"Es. Biblioteca Digitale - Migliaia di libri da esplorare": "Z.B. Digitale Bibliothek – Tausende Bücher zum Entdecken",
+ "Es. biblioteca digitale, prestito libri, catalogo online, libri gratis": "Z.B. digitale Bibliothek, Buchausleihe, Online-Katalog, kostenlose Bücher",
+ "es. Copertina rigida, Brossura": "z. B. Hardcover, Taschenbuch",
+ "es. English, Italian": "z.B. English, Italian",
"Es. Esplora migliaia di libri, prenota online e gestisci i tuoi prestiti.": "Z.B. Entdecken Sie Tausende von Büchern, reservieren Sie online und verwalten Sie Ihre Ausleihen.",
+ "es. Fantasy contemporaneo": "z. B. Zeitgenössische Fantasy",
+ "es. Gianni De Conno": "z. B. Gianni De Conno",
+ "es. Hardcover, 500 pages": "z.B. Hardcover, 500 Seiten",
+ "es. Harry Potter": "z.B. Harry Potter",
+ "es. History & geography > History of Asia > ...": "z.B. History & geography > History of Asia > ...",
+ "Es. https://tuosito.com": "Z.B. https://ihreseite.com",
+ "Es. https://tuosito.com/uploads/og-image.jpg": "Z.B. https://ihreseite.com/uploads/og-image.jpg",
+ "es. I Classici": "z. B. Die Klassiker",
+ "es. Integrazione Sito Web": "z. B. Website-Integration",
+ "es. INV-2024-001": "z. B. INV-2024-001",
"Es. Italiana, Americana, Francese...": "Z.B. Italienisch, Amerikanisch, Französisch...",
"Es. Italiana, Americana...": "Z.B. Italienische, Amerikanische...",
"Es. Italiana...": "Z.B. Italienisch...",
+ "es. Italiano, Inglese": "z. B. Italienisch, Englisch",
+ "es. La morale anarchica": "z. B. Die anarchistische Moral",
"Es. La Tua Biblioteca Digitale": "Z.B. Ihre Digitale Bibliothek",
+ "es. Mario Rossi": "z. B. Max Mustermann",
"Es. Milano...": "Z.B. München...",
+ "es. Noir mediterraneo": "z. B. Mediterraner Noir",
+ "es. noreply@biblioteca.local": "z. B. noreply@bibliothek.local",
"Es. Presentazione libro \"Il Nome della Rosa\"": "Z.B. Buchvorstellung \"Der Name der Rose\"",
+ "es. Prima edizione": "z. B. Erstausgabe",
+ "es. PS3566.A686": "z.B. PS3566.A686",
+ "es. romanzo, fantasy, avventura (separare con virgole)": "z. B. Roman, Fantasy, Abenteuer (mit Kommas trennen)",
+ "es. RSSMRA80A01H501U": "z. B. RSSMRA80A01H501U",
"Es. Scopri il nostro catalogo digitale con migliaia di libri disponibili per il prestito. Registrati gratuitamente e inizia a leggere oggi stesso.": "Z.B. Entdecken Sie unseren digitalen Katalog mit Tausenden von Büchern, die zur Ausleihe verfügbar sind. Registrieren Sie sich kostenlos und beginnen Sie noch heute zu lesen.",
+ "es. Umberto Eco": "z.B. Umberto Eco",
"Es. Un libro fantastico!": "Z.B. Ein fantastisches Buch!",
"Es. Un libro straordinario!": "Z.B. Ein außergewöhnliches Buch!",
- "Es. biblioteca digitale, prestito libri, catalogo online, libri gratis": "Z.B. digitale Bibliothek, Buchausleihe, Online-Katalog, kostenlose Bücher",
- "Es. https://tuosito.com": "Z.B. https://ihreseite.com",
- "Es. https://tuosito.com/uploads/og-image.jpg": "Z.B. https://ihreseite.com/uploads/og-image.jpg",
+ "es. Urban fantasy": "z. B. Urban Fantasy",
"Esauriti tentativi riassegnazione copia": "Neuzuweisungsversuche für Exemplar erschöpft",
"Esci": "Abmelden",
"Esecuzione ogni 30 minuti (consigliato)": "Ausführung alle 30 Minuten (empfohlen)",
@@ -1345,8 +1529,10 @@
"Etichette interne grandi (Herma 4630, Avery 3490)": "Große interne Etiketten (Herma 4630, Avery 3490)",
"European Article Number (opzionale)": "European Article Number (optional)",
"Eventi": "Veranstaltungen",
- "Eventi Recenti": "Aktuelle Veranstaltungen",
+ "eventi": "Veranstaltungen",
"Eventi e Incontri": "Veranstaltungen und Treffen",
+ "Eventi Recenti": "Aktuelle Veranstaltungen",
+ "eventi, biblioteca, cultura": "Veranstaltungen, Bibliothek, Kultur",
"Evento": "Veranstaltung",
"Evento aggiornato con successo!": "Veranstaltung erfolgreich aktualisiert!",
"Evento creato con successo!": "Veranstaltung erfolgreich erstellt!",
@@ -1360,11 +1546,13 @@
"Export per LibraryThing": "Export für LibraryThing",
"Exporting %d filtered users out of %d total": "Export von %d gefilterten Benutzern von insgesamt %d",
"Exporting all %d users": "Export aller %d Benutzer",
- "FAQ": "FAQ",
- "FATAL ERROR:": "FATALER FEHLER:",
"Facebook": "Facebook",
"Fallimento": "Fehlschlag",
+ "fallite.": "fehlgeschlagen.",
"Fallito": "Fehlgeschlagen",
+ "FAQ": "FAQ",
+ "fas fa-users": "fas fa-users",
+ "FATAL ERROR:": "FATALER FEHLER:",
"Fatal Error:": "Fataler Fehler:",
"Fatto!": "Fertig!",
"Feature %d": "Funktion %d",
@@ -1373,6 +1561,9 @@
"Feature 3": "Funktion 3",
"Feature 4": "Funktion 4",
"Features - Caratteristiche": "Funktionen - Merkmale",
+ "febbraio": "Februar",
+ "Feed e Scoperta": "Feeds & Entdecken",
+ "Feed RSS": "RSS-Feed",
"Femmina": "Weiblich",
"File": "Datei",
"File \"%s\" pronto per l'upload": "Datei \"%s\" bereit zum Hochladen",
@@ -1381,42 +1572,43 @@
"File .env:": ".env-Datei:",
"File .htaccess creato": ".htaccess-Datei erstellt",
"File .installed:": ".installed-Datei:",
+ "File attuale": "Aktuelle Datei",
+ "File backup non trovato": "Sicherungsdatei nicht gefunden",
+ "File caricato con successo": "Datei erfolgreich hochgeladen",
"File CSV (max 10MB)": "CSV-Datei (max. 10 MB)",
"File CSV non valido: usa \";\" o \",\" come separatore.": "Ungültige CSV-Datei: Verwenden Sie \";\" oder \",\" als Trennzeichen.",
+ "File CSV non valido: usa \";\", \",\" o TAB come separatore.": "Ungültige CSV-Datei: \";\", \",\" oder TAB als Trennzeichen verwenden.",
"File CSV vuoto o formato non valido": "Leere CSV-Datei oder ungültiges Format",
+ "File dati iniziali per la lingua selezionata non trovato: %s": "Anfangsdatendatei für die ausgewählte Sprache nicht gefunden: %s",
"File Dewey esistente non è un JSON valido o è corrotto.": "Die vorhandene Dewey-Datei ist kein gültiges JSON oder ist beschädigt.",
"File Dewey non trovato.": "Dewey-Datei nicht gefunden.",
- "File JSON con le traduzioni (opzionale). Puoi caricarlo anche in seguito.": "JSON-Datei mit Übersetzungen (optional). Sie können sie auch später hochladen.",
- "File JSON non valido": "Ungültige JSON-Datei",
- "File Principale:": "Hauptdatei:",
- "File URL": "Datei-URL",
- "File ZIP con struttura plugin valida": "ZIP-Datei mit gültiger Plugin-Struktur",
- "File ZIP non trovato.": "ZIP-Datei nicht gefunden.",
- "File ZIP troppo grande. Dimensione massima: 100 MB.": "ZIP-Datei zu groß. Maximale Größe: 100 MB.",
- "File attuale": "Aktuelle Datei",
- "File backup non trovato": "Sicherungsdatei nicht gefunden",
- "File caricato con successo": "Datei erfolgreich hochgeladen",
- "File dati iniziali per la lingua selezionata non trovato: %s": "Anfangsdatendatei für die ausgewählte Sprache nicht gefunden: %s",
+ "File di aggiornamento non valido": "Ungültige Aktualisierungsdatei",
+ "File di aggiornamento non valido (troppo piccolo)": "Ungültige Aktualisierungsdatei (zu klein)",
"File di Esempio": "Beispieldatei",
+ "File di log non trovato": "Protokolldatei nicht gefunden",
"File di Traduzione": "Übersetzungsdatei",
"File di Traduzione Attuale": "Aktuelle Übersetzungsdatei",
"File di Traduzione JSON": "JSON-Übersetzungsdatei",
- "File di aggiornamento non valido": "Ungültige Aktualisierungsdatei",
- "File di aggiornamento non valido (troppo piccolo)": "Ungültige Aktualisierungsdatei (zu klein)",
- "File di log non trovato": "Protokolldatei nicht gefunden",
"File di traduzione non trovato": "Übersetzungsdatei nicht gefunden",
"File esistente (data modifica)": "Vorhandene Datei (Änderungsdatum)",
+ "File JSON con le traduzioni (opzionale). Puoi caricarlo anche in seguito.": "JSON-Datei mit Übersetzungen (optional). Sie können sie auch später hochladen.",
+ "File JSON non valido": "Ungültige JSON-Datei",
"File non trovato nell'upload.": "Datei im Upload nicht gefunden.",
"File non valido o corrotto.": "Ungültige oder beschädigte Datei.",
"File plugin.json non trovato nel pacchetto.": "Datei plugin.json nicht im Paket gefunden.",
"File plugin.json non valido.": "Ungültige plugin.json-Datei.",
- "File principale PHP specificato in %s": "In %s angegebene PHP-Hauptdatei",
"File principale del plugin non trovato.": "Plugin-Hauptdatei nicht gefunden.",
+ "File principale PHP specificato in %s": "In %s angegebene PHP-Hauptdatei",
+ "File Principale:": "Hauptdatei:",
"File sitemap non trovato": "Sitemap-Datei nicht gefunden",
"File sitemap presente": "Sitemap-Datei vorhanden",
"File troppo grande. Dimensione massima 10MB.": "Datei zu groß. Maximale Größe 10 MB.",
"File troppo grande. Dimensione massima 5MB.": "Datei zu groß. Maximale Größe 5 MB.",
+ "File URL": "Datei-URL",
"File vuoto o formato non valido": "Leere Datei oder ungültiges Format",
+ "File ZIP con struttura plugin valida": "ZIP-Datei mit gültiger Plugin-Struktur",
+ "File ZIP non trovato.": "ZIP-Datei nicht gefunden.",
+ "File ZIP troppo grande. Dimensione massima: 100 MB.": "ZIP-Datei zu groß. Maximale Größe: 100 MB.",
"File:": "Datei:",
"Filtra": "Filtern",
"Filtra mensole per scaffale": "Regale nach Bücherregal filtern",
@@ -1428,37 +1620,39 @@
"Filtri cancellati": "Filter zurückgesetzt",
"Filtri di Ricerca": "Suchfilter",
"Filtri salvati": "Filter gespeichert",
- "Filtro Libro": "Buchfilter",
- "Filtro Utente": "Benutzerfilter",
- "Filtro genere attivo": "Genrefilter aktiv",
"Filtro attivo": "Aktiver Filter",
+ "Filtro genere attivo": "Genrefilter aktiv",
+ "Filtro Libro": "Buchfilter",
"Filtro sottogenere attivo": "Subgenre-Filter aktiv",
+ "Filtro Utente": "Benutzerfilter",
"Fine": "Fertig",
"Fine:": "Ende:",
"Fino a quando? (opzionale):": "Bis wann? (optional):",
"Fix applicato": "Fix angewendet",
"Fonte dati:": "Datenquelle:",
+ "Fonte/Venditore": "Quelle/Verkäufer",
+ "Fonti attive": "Aktive Quellen",
"Fonti consultate:": "Abgefragte Quellen:",
"Footer": "Fußzeile",
"Formati supportati: JPG, PNG, GIF, WebP. Dimensione massima: 5MB": "Unterstützte Formate: JPG, PNG, GIF, WebP. Maximale Größe: 5 MB",
"Formati supportati: MP3, M4A, OGG • Dimensione massima: 500 MB": "Unterstützte Formate: MP3, M4A, OGG • Max. Größe: 500 MB",
"Formati supportati: PDF, ePub • Dimensione massima: 100 MB": "Unterstützte Formate: PDF, ePub • Max. Größe: 100 MB",
"Formato": "Format",
- "Formato CSV Dettagliato": "Detailliertes CSV-Format",
- "Formato Etichetta": "Etikettenformat",
- "Formato File JSON": "JSON-Dateiformat",
- "Formato ISBN non valido.": "Ungültiges ISBN-Format.",
- "Formato JSON non valido": "Ungültiges JSON-Format",
"Formato biblioteche scolastiche (compatibile A4)": "Schulbibliotheksformat (A4-kompatibel)",
"Formato biblioteche scolastiche (compatibili A4)": "Schulbibliotheksformat (A4-kompatibel)",
"Formato codice non valido": "Ungültiges Code-Format",
"Formato codice non valido. Usa formato: 599 oppure 599.9 oppure 599.93": "Ungültiges Code-Format. Format verwenden: 599 oder 599.9 oder 599.93",
"Formato codice non valido. Usa: XXX.Y (es. 599.1)": "Ungültiges Code-Format. Verwenden Sie: XXX.Y (z.B. 599.1)",
+ "Formato CSV Dettagliato": "Detailliertes CSV-Format",
"Formato dati non valido.": "Ungültiges Datenformat.",
+ "Formato Etichetta": "Etikettenformat",
+ "Formato File JSON": "JSON-Dateiformat",
"Formato immagine non supportato": "Nicht unterstütztes Bildformat",
"Formato immagine non supportato. Usa JPG, PNG o WebP.": "Bildformat nicht unterstützt. Verwenden Sie JPG, PNG oder WebP.",
"Formato impostazioni non valido.": "Ungültiges Einstellungsformat.",
- "Formato orizzontale per dorso": "Horizontales Format für Buchrücken",
+ "Formato ISBN non valido.": "Ungültiges ISBN-Format.",
+ "Formato JSON non valido": "Ungültiges JSON-Format",
+ "Formato orizzontale per dorso": "Horizontales Format für Buchrücken",
"Formato quadrato Tirrenia": "Tirrenia-Quadratformat",
"Formato richiesta non valido": "Ungültiges Anfrageformat",
"Formato: CSV con separatore %s • Max 10MB": "Format: CSV mit Trennzeichen %s • Max. 10 MB",
@@ -1469,8 +1663,11 @@
"From Email": "Absender-E-Mail",
"From Name": "Absendername",
"Funzionamento automatico:": "Automatischer Betrieb:",
+ "Funzionamento:": "Funktionsweise:",
"Fuori Catalogo": "Nicht im Katalog",
"Genera automaticamente": "Automatisch generieren",
+ "Genera automaticamente un file llms.txt per rendere la biblioteca comprensibile ai modelli linguistici (LLM)": "Automatische Generierung einer llms.txt-Datei, damit die Bibliothek für große Sprachmodelle (LLMs) verständlich wird",
+ "Genera il tuo token su": "Erstellen Sie Ihr Token unter",
"Generato il": "Generiert am",
"Generato il:": "Generiert am:",
"Generazione CSV in corso...": "CSV wird generiert...",
@@ -1483,10 +1680,15 @@
"Genere principale": "Hauptgenre",
"Genere:": "Genre:",
"Generi": "Genres",
- "Generi Principali": "Hauptgenres",
"Generi e sottogeneri": "Genres und Subgenres",
+ "Generi Principali": "Hauptgenres",
+ "gennaio": "Januar",
"Gestione Autori": "Autorenverwaltung",
+ "Gestione autori": "Autorenverwaltung",
"Gestione Biblioteca": "Bibliotheksverwaltung",
+ "Gestione classificazione Dewey: seed e statistiche": "Dewey-Klassifikationsverwaltung: Seed und Statistiken",
+ "Gestione Collane": "Reihenverwaltung",
+ "Gestione collezione": "Sammlungsverwaltung",
"Gestione Collocazione": "Standortverwaltung",
"Gestione Contenuti (CMS)": "Inhaltsverwaltung (CMS)",
"Gestione Editori": "Verlagsverwaltung",
@@ -1501,18 +1703,14 @@
"Gestione Plugin LibraryThing": "LibraryThing-Plugin-Verwaltung",
"Gestione Prenotazioni": "Vormerkungsverwaltung",
"Gestione Prestiti": "Ausleihverwaltung",
+ "Gestione prestiti": "Ausleihverwaltung",
"Gestione Recensioni": "Rezensionsverwaltung",
+ "Gestione recensioni": "Rezensionsverwaltung",
"Gestione Temi": "Theme-Verwaltung",
"Gestione Utenti": "Benutzerverwaltung",
- "Gestione autori": "Autorenverwaltung",
- "Gestione classificazione Dewey: seed e statistiche": "Dewey-Klassifikationsverwaltung: Seed und Statistiken",
- "Gestione collezione": "Sammlungsverwaltung",
- "Gestione prestiti": "Ausleihverwaltung",
- "Gestione recensioni": "Rezensionsverwaltung",
"Gestione utenti": "Benutzerverwaltung",
"Gestisci": "Verwalten",
"Gestisci Eventi": "Veranstaltungen verwalten",
- "Gestisci Restituzione": "Rückgabe verwalten",
"Gestisci gli aggiornamenti dell'applicazione": "Anwendungsupdates verwalten",
"Gestisci gli autori della collezione": "Autoren der Sammlung verwalten",
"Gestisci gli eventi della biblioteca: crea, modifica ed elimina eventi con immagini e descrizioni": "Bibliotheksveranstaltungen verwalten: Erstellen, bearbeiten und löschen Sie Veranstaltungen mit Bildern und Beschreibungen",
@@ -1528,14 +1726,18 @@
"Gestisci la visibilità delle categorie di cookie nel banner. I cookie essenziali sono sempre visibili e obbligatori.": "Verwalten Sie die Sichtbarkeit der Cookie-Kategorien im Banner. Essentielle Cookies sind immer sichtbar und erforderlich.",
"Gestisci le case editrici": "Verlage verwalten",
"Gestisci le classificazioni Dewey per italiano e inglese": "Dewey-Klassifikationen für Italienisch und Englisch verwalten",
+ "Gestisci le collane e le serie di libri": "Buchreihen und Serien verwalten",
"Gestisci le estensioni dell'applicazione": "Anwendungserweiterungen verwalten",
"Gestisci preferenze cookie": "Cookie-Einstellungen verwalten",
+ "Gestisci Restituzione": "Rückgabe verwalten",
"Gestisci restituzione": "Rückgabe verwalten",
"Gestisci tutte": "Alle verwalten",
"Gestisci tutti": "Alle verwalten",
"Gestito da": "Verwaltet von",
"Giorni di preavviso per scadenza prestito": "Tage der Vorankündigung vor Ablauf der Ausleihe",
"Giorni per ritirare un prestito approvato": "Tage zur Abholung einer genehmigten Ausleihe",
+ "giorni prima della scadenza": "Tage vor Ablauf",
+ "giugno": "Juni",
"Già Installato": "Bereits installiert",
"Già presenti o senza ISBN:": "Bereits vorhanden oder ohne ISBN:",
"Già presenti:": "Bereits vorhanden:",
@@ -1548,6 +1750,8 @@
"Gli script JavaScript sono divisi in 3 categorie in base alla tipologia di cookie:": "JavaScript-Skripte sind in 3 Kategorien nach Cookie-Typ unterteilt:",
"Gli utenti possono selezionare questa lingua": "Benutzer können diese Sprache auswählen",
"Globale": "Global",
+ "GoodLib — External Sources": "GoodLib — Externe Quellen",
+ "GoodLib — Fonti Esterne": "GoodLib — Externe Quellen",
"Google Books API": "Google Books API",
"Google Books API collegata": "Google Books API verbunden",
"Google Books Configurato": "Google Books konfiguriert",
@@ -1557,7 +1761,8 @@
"Guida": "Anleitung",
"Guida alla Gestione Lingue": "Anleitung zur Sprachverwaltung",
"Guida alle Route": "Route-Anleitung",
- "HTTP Strict Transport Security forza i browser a usare solo connessioni HTTPS per 1 anno (raccomandato per produzione con SSL valido).": "HTTP Strict Transport Security zwingt Browser, nur HTTPS-Verbindungen für 1 Jahr zu verwenden (empfohlen für Produktion mit gültigem SSL).",
+ "Guida online": "Online-Leitfaden",
+ "Ha priorità 8, viene interrogato dopo le fonti di scraping standard.": "Hat Priorität 8, wird nach den Standard-Scraping-Quellen abgefragt.",
"Hai aggiunto %s copie a \"%s\"": "Sie haben %s Exemplare zu \"%s\" hinzugefügt",
"Hai già un account?": "Haben Sie bereits ein Konto?",
"Hai già un prestito attivo o in attesa per questo libro": "Sie haben bereits eine aktive oder ausstehende Ausleihe für dieses Buch",
@@ -1579,12 +1784,14 @@
"Homepage": "Startseite",
"Host": "Host",
"Host Database": "Datenbank-Host",
- "I Cookie Essenziali sono sempre visibili e non possono essere disabilitati poiché necessari per il funzionamento del sito.": "Essentielle Cookies sind immer sichtbar und können nicht deaktiviert werden, da sie für den Betrieb der Website erforderlich sind.",
- "I Miei Preferiti": "Meine Favoriten",
+ "HTTP Strict Transport Security forza i browser a usare solo connessioni HTTPS per 1 anno (raccomandato per produzione con SSL valido).": "HTTP Strict Transport Security zwingt Browser, nur HTTPS-Verbindungen für 1 Jahr zu verwenden (empfohlen für Produktion mit gültigem SSL).",
+ "https://www.editore.com": "https://www.verlag.de",
"I backup sono salvati in:": "Backups werden gespeichert in:",
"I campi con * sono obbligatori": "Felder mit * sind Pflichtfelder",
"I campi null indicano dati non disponibili": "Null-Felder zeigen nicht verfügbare Daten an",
+ "I campi selezionati saranno visibili nella pagina pubblica del libro. I commenti privati sono sempre nascosti nel frontend.": "Die ausgewählten Felder werden auf der öffentlichen Buchseite sichtbar sein. Private Kommentare sind im Frontend immer ausgeblendet.",
"I contenitori fisici principali dove sono organizzati i libri": "Die physischen Hauptbehälter, in denen die Bücher organisiert sind",
+ "I Cookie Essenziali sono sempre visibili e non possono essere disabilitati poiché necessari per il funzionamento del sito.": "Essentielle Cookies sind immer sichtbar und können nicht deaktiviert werden, da sie für den Betrieb der Website erforderlich sind.",
"I dati attuali verranno sostituiti.": "Die aktuellen Daten werden ersetzt.",
"I dati devono essere un array non vuoto.": "Die Daten müssen ein nicht leeres Array sein.",
"I dati provengono dal file JSON, nessun seeding necessario.": "Die Daten stammen aus der JSON-Datei, kein Seeding erforderlich.",
@@ -1595,52 +1802,33 @@
"I libri degli altri editori verranno assegnati a questo": "Bücher der anderen Verlage werden diesem zugeordnet",
"I livelli (ripiani) all'interno di ogni scaffale": "Die Ebenen (Regalböden) innerhalb jedes Bücherregals",
"I log vengono conservati per 90 giorni per conformità GDPR": "Protokolle werden 90 Tage lang gemäß DSGVO aufbewahrt",
+ "I Miei Preferiti": "Meine Favoriten",
"I miei preferiti": "Meine Favoriten",
"I tuoi preferiti": "Ihre Favoriten",
+ "Icona FontAwesome": "FontAwesome-Symbol",
+ "icone disponibili": "verfügbare Symbole",
"ID": "ID",
- "ID Editore": "Verlags-ID",
- "ID Prestito": "Ausleih-ID",
- "ID Prestito:": "Ausleih-ID:",
"ID autori non validi": "Ungültige Autoren-IDs",
+ "ID Editore": "Verlags-ID",
"ID editori non validi": "Ungültige Verlags-IDs",
"ID genere non valido": "Ungültige Genre-ID",
"ID import mancante": "Fehlende Import-ID",
"ID libri non validi": "Ungültige Buch-IDs",
+ "ID Libro": "Buch-ID",
"ID libro non valido": "Ungültige Buch-ID",
"ID libro:": "Buch-ID:",
+ "ID Prestito": "Ausleih-ID",
"ID prestito non valido": "Ungültige Ausleih-ID",
+ "ID Prestito:": "Ausleih-ID:",
"ID sessione non valido": "Ungültige Sitzungs-ID",
"ID utente:": "Benutzer-ID:",
"ID:": "ID:",
- "IN RITARDO": "ÜBERFÄLLIG",
- "IP": "IP",
- "IP Address": "IP-Adresse",
- "ISBN": "ISBN",
- "ISBN 10": "ISBN 10",
- "ISBN 13": "ISBN 13",
- "ISBN Mancante": "Fehlende ISBN",
- "ISBN a 13 cifre (univoco)": "13-stellige ISBN (eindeutig)",
- "ISBN non trovato nelle fonti disponibili.": "ISBN in den verfügbaren Quellen nicht gefunden.",
- "ISBN non trovato. Fonti consultate: %s": "ISBN nicht gefunden. Abgefragte Quellen: %s",
- "ISBN non valido. Specifica 10 o 13 cifre (eventualmente con X finale).": "Ungültige ISBN. Bitte geben Sie 10 oder 13 Ziffern an (X am Ende erlaubt).",
- "ISBN o EAN...": "ISBN oder EAN...",
- "ISBN-13:": "ISBN-13:",
- "ISBN10": "ISBN10",
- "ISBN10 Non Valido": "Ungültige ISBN10",
- "ISBN10 deve contenere esattamente 10 caratteri (9 cifre + 1 cifra o X).": "ISBN10 muss genau 10 Zeichen enthalten (9 Ziffern + 1 Ziffer oder X).",
- "ISBN10 o ISBN13": "ISBN10 oder ISBN13",
- "ISBN13": "ISBN13",
- "ISBN13 Non Valido": "Ungültige ISBN13",
- "ISBN13 deve contenere esattamente 13 cifre.": "ISBN13 muss genau 13 Ziffern enthalten.",
- "ISBN13: %s": "ISBN13: %s",
- "ISBN:": "ISBN:",
- "IT": "IT",
- "Icona FontAwesome": "FontAwesome-Symbol",
+ "Identificatori": "Kennungen",
+ "Identificatori Catalogo": "Katalog-Identifikatoren",
"Identità": "Identität",
"Identità Applicazione": "Anwendungsidentität",
"Ieri": "Gestern",
"Ieri alle %s": "Gestern um %s",
- "Il Mio Profilo": "Mein Profil",
"Il campo è obbligatorio": "Dieses Feld ist erforderlich",
"Il catalogo SBN (OPAC Nazionale Italiano) è già integrato e viene interrogato automaticamente durante l'importazione ISBN. Non è necessario aggiungerlo come server esterno.": "Der SBN-Katalog (Italienischer National-OPAC) ist bereits integriert und wird beim ISBN-Import automatisch abgefragt. Es ist nicht nötig, ihn als externen Server hinzuzufügen.",
"Il codice %s ha un formato non valido.": "Code %s hat ein ungültiges Format.",
@@ -1663,24 +1851,28 @@
"Il database è stato installato, ma mancano le librerie PHP necessarie per eseguire l'applicazione.": "Die Datenbank wurde installiert, aber die zum Betrieb der Anwendung erforderlichen PHP-Bibliotheken fehlen.",
"Il download dovrebbe iniziare automaticamente": "Der Download sollte automatisch beginnen",
"Il file": "Die Datei",
- "Il file JSON deve contenere coppie chiave-valore:": "Die JSON-Datei muss Schlüssel-Wert-Paare enthalten:",
- "Il file JSON non è valido:": "Die JSON-Datei ist ungültig:",
+ "Il file caricato non è un archivio ZIP valido": "Die hochgeladene Datei ist kein gültiges ZIP-Archiv",
"Il file deve avere estensione .csv": "Die Datei muss die Erweiterung .csv haben",
"Il file deve avere estensione .tsv, .csv o .txt": "Die Datei muss die Erweiterung .tsv, .csv oder .txt haben",
"Il file deve contenere coppie chiave (italiano) - valore (traduzione).": "Die Datei muss Schlüssel (Italienisch) - Wert (Übersetzung) Paare enthalten.",
"Il file deve essere un JSON valido": "Die Datei muss gültiges JSON sein",
"Il file generato si trova in": "Die generierte Datei befindet sich in",
"Il file generato si trova in
public/sitemap.xml": "Die generierte Datei befindet sich unter
public/sitemap.xml",
+ "Il file JSON deve contenere coppie chiave-valore:": "Die JSON-Datei muss Schlüssel-Wert-Paare enthalten:",
+ "Il file JSON non è valido:": "Die JSON-Datei ist ungültig:",
+ "Il file non sembra essere in formato LibraryThing": "Die Datei scheint nicht im LibraryThing-Format zu sein",
"Il file non sembra essere in formato LibraryThing. Colonne richieste: Book Id, Title, Primary Author, ISBNs": "Die Datei scheint nicht im LibraryThing-Format zu sein. Erforderliche Spalten: Book Id, Title, Primary Author, ISBNs",
"Il file supera la dimensione massima consentita": "Die Datei überschreitet die maximal zulässige Größe",
"Il file supera la dimensione massima di %s MB": "Die Datei überschreitet die maximale Größe von %s MB",
"Il formato scelto verrà utilizzato per generare i PDF delle etichette con codice a barre.": "Das gewählte Format wird zur Erstellung der Etiketten-PDFs mit Barcode verwendet.",
"Il formato selezionato verrà applicato a tutte le etichette generate dal sistema.": "Das ausgewählte Format wird auf alle vom System generierten Etiketten angewendet.",
+ "Il libro non sarà eliminato, solo la relazione.": "Das Buch wird nicht gelöscht, nur die Verknüpfung.",
"Il libro selezionato è già in prestito. Seleziona un altro libro.": "Das ausgewählte Buch ist bereits ausgeliehen. Wählen Sie ein anderes Buch aus.",
"Il libro viene consegnato subito all'utente. Se deselezionato, il prestito rimarrà in stato 'Da ritirare' fino alla conferma del ritiro.": "Das Buch wird dem Benutzer sofort übergeben. Wenn deaktiviert, bleibt die Ausleihe im Status 'Zur Abholung bereit', bis die Abholung bestätigt wird.",
"Il link di verifica email è scaduto o non valido. Registrati nuovamente per ricevere un nuovo link.": "Der E-Mail-Bestätigungslink ist abgelaufen oder ungültig. Bitte registrieren Sie sich erneut, um einen neuen Link zu erhalten.",
"Il link di verifica non è valido. Assicurati di aver copiato l'intero link dall'email.": "Der Bestätigungslink ist ungültig. Stellen Sie sicher, dass Sie den vollständigen Link aus der E-Mail kopiert haben.",
"Il logo verrà ridimensionato automaticamente": "Das Logo wird automatisch angepasst",
+ "Il Mio Profilo": "Mein Profil",
"Il mio profilo": "Mein Profil",
"Il nome del genere è obbligatorio.": "Der Genrename ist erforderlich.",
"Il nome dell'": "Der Name des/der",
@@ -1711,44 +1903,44 @@
"Il titolo principale della pagina": "Der Haupttitel der Seite",
"Il titolo verrà utilizzato anche per generare l'URL della pagina": "Der Titel wird auch zur Generierung der Seiten-URL verwendet",
"Il titolo è obbligatorio.": "Der Titel ist erforderlich.",
+ "Il token di accesso personale non è obbligatorio, ma aumenta il limite di richieste da 25 a 60 al minuto.": "Das persönliche Zugriffstoken ist nicht erforderlich, erhöht aber das Anfragelimit von 25 auf 60 pro Minute.",
"Il tuo account è in attesa di approvazione. Riceverai un'email quando sarà attivato": "Ihr Konto wartet auf Freigabe. Sie erhalten eine E-Mail, wenn es aktiviert wird",
"Il tuo account è stato sospeso. Contatta l'amministratore per maggiori informazioni": "Ihr Konto wurde gesperrt. Wenden Sie sich an den Administrator für weitere Informationen",
"Il tuo browser non supporta la riproduzione audio.": "Ihr Browser unterstützt keine Audiowiedergabe.",
"Il tuo sistema Pinakes per catalogare, gestire e condividere la tua collezione libraria.": "Ihr Pinakes-System zum Katalogisieren, Verwalten und Teilen Ihrer Buchsammlung.",
"Illustratore": "Illustrator",
- "Curatore": "Kurator",
- "Nome del curatore dell'opera (se applicabile)": "Name des Kurators (falls zutreffend)",
"Immagine": "Bild",
- "Immagine Caricata!": "Bild hochgeladen!",
- "Immagine Open Graph": "Open-Graph-Bild",
- "Immagine Twitter": "Twitter-Bild",
"Immagine attuale": "Aktuelles Bild",
+ "Immagine Caricata!": "Bild hochgeladen!",
"Immagine di copertina della pagina (opzionale)": "Seitentitelbild (optional)",
"Immagine di sfondo Hero": "Hero-Hintergrundbild",
"Immagine in Evidenza": "Hervorgehobenes Bild",
"Immagine mostrata quando condividi la pagina su social media (Facebook, Twitter, LinkedIn). Se vuoto, usa l'immagine hero di sfondo. Dimensioni consigliate: 1200x630px (rapporto 1.91:1).": "Bild, das beim Teilen der Seite in sozialen Medien angezeigt wird (Facebook, Twitter, LinkedIn). Wenn leer, wird das Hero-Hintergrundbild verwendet. Empfohlene Größe: 1200x630px (Verhältnis 1,91:1).",
"Immagine mostrata quando condividi su social. Dimensioni consigliate: 1200x630px (rapporto 1.91:1). Se vuoto, usa l'immagine hero di sfondo.": "Bild, das beim Teilen in sozialen Medien angezeigt wird. Empfohlene Größe: 1200x630px (Verhältnis 1,91:1). Wenn leer, wird das Hero-Hintergrundbild verwendet.",
"Immagine non valida": "Ungültiges Bild",
+ "Immagine Open Graph": "Open-Graph-Bild",
"Immagine per Twitter/X. Dimensioni consigliate: 1200x675px o 1200x1200px. Se vuoto, usa l'immagine Open Graph.": "Bild für Twitter/X. Empfohlene Abmessungen: 1200x675px oder 1200x1200px. Wenn leer, wird das Open Graph-Bild verwendet.",
+ "Immagine Twitter": "Twitter-Bild",
"Immagini JPG, PNG o WebP (max 5MB)": "JPG-, PNG- oder WebP-Bilder (max. 5 MB)",
"Import": "Import",
+ "Import completato: %d libri nuovi, %d libri aggiornati, %d autori creati, %d editori creati": "Import abgeschlossen: %d neue Bücher, %d aktualisierte Bücher, %d Autoren erstellt, %d Verlage erstellt",
"Import CSV": "CSV-Import",
"Import CSV Standard": "Standard-CSV-Import",
- "Import LibraryThing": "LibraryThing-Import",
- "Import Libri da CSV": "Bücher aus CSV importieren",
- "Import Massivo Libri": "Massenbuchimport",
- "Import completato: %d libri nuovi, %d libri aggiornati, %d autori creati, %d editori creati": "Import abgeschlossen: %d neue Bücher, %d aktualisierte Bücher, %d Autoren erstellt, %d Verlage erstellt",
"Import da LibraryThing": "Import aus LibraryThing",
"Import dati iniziali...": "Importiere Anfangsdaten...",
"Import in corso...": "Import läuft...",
+ "Import LibraryThing": "LibraryThing-Import",
+ "Import LibraryThing completato: %d libri nuovi, %d libri aggiornati, %d autori creati, %d editori creati": "LibraryThing-Import abgeschlossen: %d neue Bücher, %d aktualisierte Bücher, %d Autoren erstellt, %d Verlage erstellt",
+ "Import Libri da CSV": "Bücher aus CSV importieren",
"Import massivo da CSV": "Massenimport aus CSV",
+ "Import Massivo Libri": "Massenbuchimport",
"Import schema in corso...": "Schema wird importiert...",
"Import trigger...": "Trigger werden importiert...",
"Importa": "Importieren",
- "Importa Dati": "Daten importieren",
- "Importa Libri": "Bücher importieren",
"Importa da ISBN": "Aus ISBN importieren",
+ "Importa Dati": "Daten importieren",
"Importa i tuoi libri esportati da LibraryThing.com (formato TSV)": "Importieren Sie Ihre von LibraryThing.com exportierten Bücher (TSV-Format)",
+ "Importa Libri": "Bücher importieren",
"Importante:": "Wichtig:",
"Importati": "Importiert",
"Importato": "Importiert",
@@ -1766,11 +1958,16 @@
"Impossibile aprire file di backup per scrittura": "Backup-Datei konnte nicht zum Schreiben geöffnet werden",
"Impossibile aprire il file": "Datei kann nicht geöffnet werden",
"Impossibile aprire il file CSV": "Die CSV-Datei konnte nicht geöffnet werden",
+ "Impossibile aprire il file CSV salvato": "Die gespeicherte CSV-Datei konnte nicht geöffnet werden",
"Impossibile aprire il file ZIP.": "Die ZIP-Datei konnte nicht geöffnet werden.",
+ "Impossibile aprire il pacchetto ZIP": "Das ZIP-Paket konnte nicht geöffnet werden",
"Impossibile archiviare il messaggio.": "Die Nachricht konnte nicht archiviert werden.",
+ "Impossibile attivare la nuova versione del plugin: %s": "Die neue Plugin-Version konnte nicht aktiviert werden: %s",
"Impossibile caricare configurazione database": "Datenbankkonfiguration kann nicht geladen werden",
"Impossibile caricare gli editori. Controlla la console per i dettagli.": "Verlage konnten nicht geladen werden. Überprüfen Sie die Konsole für Details.",
"Impossibile caricare i libri. Controlla la console per i dettagli.": "Bücher konnten nicht geladen werden. Überprüfen Sie die Konsole für Details.",
+ "Impossibile cifrare il token GitHub": "Das GitHub-Token konnte nicht verschlüsselt werden",
+ "Impossibile cifrare il token GitHub: salvataggio annullato": "GitHub-Token konnte nicht verschlüsselt werden: Speichern abgebrochen",
"Impossibile completare l'operazione. Riprova più tardi.": "Der Vorgang konnte nicht abgeschlossen werden. Bitte versuchen Sie es später erneut.",
"Impossibile comunicare con il server. Riprova più tardi.": "Kommunikation mit dem Server nicht möglich. Bitte versuchen Sie es später erneut.",
"Impossibile configurare autocomplete: elementi mancanti": "Autovervollständigung konnte nicht konfiguriert werden: fehlende Elemente",
@@ -1779,8 +1976,11 @@
"Impossibile creare directory di backup": "Backup-Verzeichnis konnte nicht erstellt werden",
"Impossibile creare directory di backup applicazione": "Anwendungs-Backup-Verzeichnis konnte nicht erstellt werden",
"Impossibile creare directory di backup: %s": "Backup-Verzeichnis konnte nicht erstellt werden: %s",
+ "Impossibile creare directory di estrazione": "Extraktionsverzeichnis konnte nicht erstellt werden",
"Impossibile creare directory temporanea": "Temporäres Verzeichnis konnte nicht erstellt werden",
+ "Impossibile creare directory temporanea per upload": "Temporäres Verzeichnis für den Upload konnte nicht erstellt werden",
"Impossibile creare directory: %s": "Verzeichnis konnte nicht erstellt werden: %s",
+ "Impossibile creare il backup del plugin: %s": "Plugin-Backup konnte nicht erstellt werden: %s",
"Impossibile creare il file .env. Verifica i permessi.": "Die .env-Datei konnte nicht erstellt werden. Überprüfen Sie die Berechtigungen.",
"Impossibile creare il file di lock per l'aggiornamento": "Aktualisierungs-Lock-Datei konnte nicht erstellt werden",
"Impossibile creare la cartella di upload.": "Das Upload-Verzeichnis konnte nicht erstellt werden.",
@@ -1812,6 +2012,7 @@
"Impossibile inizializzare Uppy per i contenuti digitali.": "Uppy für digitale Inhalte konnte nicht initialisiert werden.",
"Impossibile inviare la recensione": "Die Rezension konnte nicht gesendet werden",
"Impossibile inviare la recensione.": "Die Rezension konnte nicht gesendet werden.",
+ "Impossibile leggere i dati del modulo. Riprova.": "Formulardaten konnten nicht gelesen werden. Bitte erneut versuchen.",
"Impossibile leggere il file .env": ".env-Datei kann nicht gelesen werden",
"Impossibile leggere il file caricato": "Die hochgeladene Datei konnte nicht gelesen werden",
"Impossibile leggere il file di backup": "Backup-Datei konnte nicht gelesen werden",
@@ -1829,18 +2030,24 @@
"Impossibile ridurre le copie a %d. Ci sono %d copie non disponibili (in prestito, perse o danneggiate). Il numero minimo di copie totali è %d.": "Die Exemplare können nicht auf %d reduziert werden. Es gibt %d nicht verfügbare Exemplare (ausgeliehen, verloren oder beschädigt). Die Mindestanzahl der Gesamtexemplare beträgt %d.",
"Impossibile rifiutare la recensione": "Die Rezension konnte nicht abgelehnt werden",
"Impossibile rigenerare la sitemap: %s": "Die Sitemap konnte nicht regeneriert werden: %s",
+ "Impossibile rimuovere directory: %s": "Verzeichnis konnte nicht entfernt werden: %s",
+ "Impossibile rimuovere file: %s": "Datei konnte nicht entfernt werden: %s",
+ "Impossibile ripristinare il plugin precedente: %s": "Das vorherige Plugin konnte nicht wiederhergestellt werden: %s",
+ "Impossibile risolvere il percorso della directory plugins.": "Der Pfad zum Plugins-Verzeichnis konnte nicht aufgelöst werden.",
+ "Impossibile salvare il file CSV caricato": "Die hochgeladene CSV-Datei konnte nicht gespeichert werden",
"Impossibile salvare il file di aggiornamento": "Aktualisierungsdatei konnte nicht gespeichert werden",
"Impossibile salvare l'utente. Riprova più tardi.": "Der Benutzer konnte nicht gespeichert werden. Bitte versuchen Sie es später erneut.",
"Impossibile salvare le impostazioni.": "Einstellungen können nicht gespeichert werden.",
"Impossibile scaricare (libro senza ISBN):": "Download nicht möglich (Buch ohne ISBN):",
+ "Impossibile scaricare (senza ISBN/barcode):": "Download nicht möglich (kein ISBN/Barcode):",
"Impossibile scrivere file di backup": "Backup-Datei konnte nicht geschrieben werden",
"Impossibile scrivere nel file .env": ".env-Datei kann nicht beschrieben werden",
"Impossibile segnare come letta la notifica.": "Die Benachrichtigung konnte nicht als gelesen markiert werden.",
"Impossibile segnare tutte le notifiche come lette.": "Alle Benachrichtigungen konnten nicht als gelesen markiert werden.",
"Impossibile segnare tutti i messaggi come letti.": "Alle Nachrichten konnten nicht als gelesen markiert werden.",
- "Imposta come Predefinita": "Als Standard festlegen",
"Imposta come attiva o predefinita": "Als aktiv oder Standard festlegen",
"Imposta come lingua predefinita per nuovi utenti": "Als Standardsprache für neue Benutzer festlegen",
+ "Imposta come Predefinita": "Als Standard festlegen",
"Imposta il nome mostrato nel backend e il logo utilizzato nel layout.": "Legen Sie den im Backend angezeigten Namen und das im Layout verwendete Logo fest.",
"Imposta nel file .env: APP_CANONICAL_URL=%s": "In der .env-Datei setzen: APP_CANONICAL_URL=%s",
"Imposta password": "Passwort festlegen",
@@ -1849,22 +2056,24 @@
"Impostazioni": "Einstellungen",
"Impostazioni API Book Scraper salvate correttamente.": "Book Scraper API-Einstellungen erfolgreich gespeichert.",
"Impostazioni Applicazione": "Anwendungseinstellungen",
- "Impostazioni Date": "Datumseinstellungen",
- "Impostazioni SEO": "SEO-Einstellungen",
- "Impostazioni Z39.50 salvate correttamente.": "Z39.50-Einstellungen erfolgreich gespeichert.",
"Impostazioni avanzate aggiornate correttamente.": "Erweiterte Einstellungen erfolgreich aktualisiert.",
"Impostazioni contatti aggiornate correttamente.": "Kontakteinstellungen erfolgreich aktualisiert.",
+ "Impostazioni Date": "Datumseinstellungen",
+ "Impostazioni di condivisione aggiornate.": "Freigabeeinstellungen aktualisiert.",
+ "Impostazioni Discogs salvate correttamente.": "Discogs-Einstellungen erfolgreich gespeichert.",
"Impostazioni email aggiornate correttamente.": "E-Mail-Einstellungen erfolgreich aktualisiert.",
"Impostazioni generali aggiornate correttamente.": "Allgemeine Einstellungen erfolgreich aktualisiert.",
+ "Impostazioni GoodLib salvate correttamente.": "GoodLib-Einstellungen erfolgreich gespeichert.",
"Impostazioni privacy aggiornate correttamente.": "Datenschutzeinstellungen erfolgreich aktualisiert.",
"Impostazioni salvate.": "Einstellungen gespeichert.",
+ "Impostazioni SEO": "SEO-Einstellungen",
+ "Impostazioni Z39.50 salvate correttamente.": "Z39.50-Einstellungen erfolgreich gespeichert.",
"In Attesa": "Ausstehend",
- "In Attesa di Approvazione": "Genehmigung ausstehend",
- "In Corso": "In Bearbeitung",
- "In Riparazione": "In Reparatur",
- "In Ritardo": "Überfällig",
"In attesa": "Ausstehend",
+ "in attesa": "ausstehend",
+ "In Attesa di Approvazione": "Genehmigung ausstehend",
"In attesa di approvazione": "Genehmigung ausstehend",
+ "In Corso": "In Bearbeitung",
"In corso": "In Bearbeitung",
"In corso di restituzione": "Rückgabe ausstehend",
"In corso...": "In Bearbeitung...",
@@ -1872,11 +2081,17 @@
"In prestito": "Ausgeliehen",
"In prestito fino al": "Ausgeliehen bis",
"In questa pagina trovi tutti gli eventi, gli incontri e i laboratori organizzati dalla biblioteca.": "Auf dieser Seite finden Sie alle Veranstaltungen, Treffen und Workshops, die von der Bibliothek organisiert werden.",
+ "In Riparazione": "In Reparatur",
+ "IN RITARDO": "ÜBERFÄLLIG",
+ "In Ritardo": "Überfällig",
"In ritardo": "Überfällig",
"In scadenza": "Bald fällig",
+ "in_corso": "laufend",
+ "in_ritardo": "überfällig",
"Inattivo": "Inaktiv",
"Incompleto": "Unvollständig",
"Indice %s creato su %s": "Index %s erstellt auf %s",
+ "Indice completo degli URL": "Vollständiges URL-Verzeichnis",
"Indice ISBN": "ISBN-Index",
"Indici creati con successo": "Indizes erfolgreich erstellt",
"Indici creati:": "Erstellte Indizes:",
@@ -1888,29 +2103,35 @@
"Indirizzo:": "Adresse:",
"Info": "Info",
"Info HSTS:": "HSTS-Info:",
+ "info@editore.com": "info@verlag.de",
+ "Informativa sulla privacy": "Datenschutzerklärung",
"Informazione": "Information",
"Informazioni": "Informationen",
+ "Informazioni Aggiuntive": "Zusätzliche Informationen",
"Informazioni Base": "Basisinformationen",
+ "Informazioni di Contatto": "Kontaktinformationen",
+ "Informazioni di contatto": "Kontaktinformationen",
+ "Informazioni editore": "Verlagsinformationen",
"Informazioni Evento": "Veranstaltungsinformationen",
+ "Informazioni generali": "Allgemeine Informationen",
"Informazioni Importanti": "Wichtige Informationen",
+ "Informazioni LibraryThing": "LibraryThing-Informationen",
"Informazioni Libro": "Buchinformationen",
"Informazioni Personali": "Persönliche Informationen",
+ "Informazioni personali": "Persönliche Informationen",
+ "Informazioni Plugin": "Plugin-Informationen",
"Informazioni Prestito": "Ausleihinformationen",
"Informazioni Report": "Berichtsinformationen",
- "Informazioni di Contatto": "Kontaktinformationen",
- "Informazioni di contatto": "Kontaktinformationen",
- "Informazioni editore": "Verlagsinformationen",
- "Informazioni generali": "Allgemeine Informationen",
- "Informazioni personali": "Persönliche Informationen",
+ "Informazioni sulla biblioteca": "Über diese Bibliothek",
"Informazioni sullo Storico Import": "Informationen zur Importhistorie",
"Informazioni tessera": "Ausweisinformationen",
"Informazioni utili per il personale": "Nützliche Informationen für das Personal",
- "Inizia Installazione": "Installation starten",
"Inizia ad aggiungere libri al catalogo": "Beginnen Sie, Bücher zum Katalog hinzuzufügen",
"Inizia aggiungendo il primo libro alla collezione": "Beginnen Sie, indem Sie das erste Buch zur Sammlung hinzufügen",
"Inizia aggiungendo la prima lingua.": "Beginnen Sie, indem Sie die erste Sprache hinzufügen.",
"Inizia caricando il tuo primo plugin": "Beginnen Sie, indem Sie Ihr erstes Plugin hochladen",
"Inizia creando il primo genere letterario": "Beginnen Sie, indem Sie das erste literarische Genre erstellen",
+ "Inizia Installazione": "Installation starten",
"Inizia la Tua Avventura Letteraria": "Starten Sie Ihr literarisches Abenteuer",
"Inizializzazione...": "Initialisierung...",
"Inizio": "Beginn",
@@ -1933,6 +2154,7 @@
"Inserisci solo script che NON tracciano utenti. Per analytics/marketing usa le sezioni dedicate.": "Fügen Sie nur Skripte ein, die Benutzer NICHT verfolgen. Für Analytics/Marketing verwenden Sie die entsprechenden Bereiche.",
"Inserisci un codice Dewey": "Geben Sie einen Dewey-Code ein",
"Inserisci un codice ISBN per continuare.": "Geben Sie einen ISBN-Code ein, um fortzufahren.",
+ "Inserisci un nome": "Namen eingeben",
"Inserisci un numero valido di copie": "Geben Sie eine gültige Anzahl von Exemplaren ein",
"Inserisci una breve biografia dell'autore...": "Geben Sie eine kurze Biografie des Autors ein...",
"Instagram": "Instagram",
@@ -1942,33 +2164,38 @@
"Installato:": "Installiert:",
"Installazione": "Installation",
"Installazione Completata": "Installation abgeschlossen",
+ "Installazione completata": "Installation abgeschlossen",
"Installazione Completata!": "Installation abgeschlossen!",
"Installazione Cron Job": "Cron-Job-Installation",
"Installazione Database": "Datenbankinstallation",
- "Installazione Guidata": "Geführte Installation",
- "Installazione completata": "Installation abgeschlossen",
"Installazione database non completa. Tabelle mancanti: %s": "Datenbankinstallation unvollständig. Fehlende Tabellen: %s",
"Installazione database non completa. Trovate %d tabelle, attese %d": "Datenbankinstallation unvollständig. %d Tabellen gefunden, %d erwartet",
"Installazione delle tabelle del database e configurazione iniziale...": "Datenbanktabellen und Erstkonfiguration werden installiert...",
"Installazione fallita": "Installation fehlgeschlagen",
"Installazione file": "Dateien werden installiert",
+ "Installazione Guidata": "Geführte Installation",
"Installazione in corso...": "Installation läuft...",
+ "installazione inglese usa": "Englische Installation verwendet",
"Installazione italiana usa": "Italienische Installation verwendet",
"Installazione plugin Open Library...": "Open Library Plugin wird installiert...",
- "Installer Pinakes": "Pinakes Installer",
"Installer eliminato con successo!": "Installer erfolgreich gelöscht!",
+ "Installer Pinakes": "Pinakes Installer",
"Insufficiente": "Unzureichend",
"Integrità dati": "Datenintegrität",
"Internal server error": "Interner Serverfehler",
+ "International Standard Serial Number (per periodici)": "International Standard Serial Number (für Zeitschriften)",
+ "Interoperabilità bibliotecaria (MARCXML, Dublin Core)": "Bibliotheksinteroperabilität (MARCXML, Dublin Core)",
"Intestazione": "Kopfzeile",
"Intestazione sezione": "Abschnittsüberschrift",
"Inventario": "Inventar",
"Invia Email": "E-Mail senden",
- "Invia Richiesta": "Anfrage senden",
"Invia link": "Link senden",
"Invia link di reset": "Zurücksetzungslink senden",
"Invia messaggio": "Nachricht senden",
+ "Invia per email": "Per E-Mail senden",
"Invia recensione": "Rezension einreichen",
+ "Invia Richiesta": "Anfrage senden",
+ "Invia via SMS": "Per SMS senden",
"Inviaci un messaggio": "Senden Sie uns eine Nachricht",
"Inviata agli amministratori quando viene ricevuta una nuova recensione da approvare.": "Wird an Administratoren gesendet, wenn eine neue Rezension zur Genehmigung eingeht.",
"Inviata agli utenti quando un libro nella wishlist torna disponibile. Il libro rimane nella wishlist ma non riceverà altre notifiche per lo stesso libro.": "Wird an Benutzer gesendet, wenn ein Buch auf ihrer Wunschliste wieder verfügbar wird. Das Buch bleibt auf der Wunschliste, es werden jedoch keine weiteren Benachrichtigungen für dasselbe Buch gesendet.",
@@ -1988,24 +2215,50 @@
"Invio notifica prenotazione fallito": "Senden der Vormerkungsbenachrichtigung fehlgeschlagen",
"Invita gli utenti a registrarsi": "Benutzer zur Registrierung einladen",
"Invito amministratore": "Administratoreinladung",
+ "IP": "IP",
+ "IP Address": "IP-Adresse",
+ "ISBN": "ISBN",
+ "ISBN 10": "ISBN 10",
+ "ISBN 13": "ISBN 13",
+ "ISBN a 13 cifre (univoco)": "13-stellige ISBN (eindeutig)",
+ "ISBN Mancante": "Fehlende ISBN",
+ "ISBN non trovato nelle fonti disponibili.": "ISBN in den verfügbaren Quellen nicht gefunden.",
+ "ISBN non trovato. Fonti consultate: %s": "ISBN nicht gefunden. Abgefragte Quellen: %s",
+ "ISBN non valido. Specifica 10 o 13 cifre (eventualmente con X finale).": "Ungültige ISBN. Bitte geben Sie 10 oder 13 Ziffern an (X am Ende erlaubt).",
+ "ISBN o EAN...": "ISBN oder EAN...",
+ "ISBN-13:": "ISBN-13:",
+ "ISBN10": "ISBN10",
+ "ISBN10 deve contenere esattamente 10 caratteri (9 cifre + 1 cifra o X).": "ISBN10 muss genau 10 Zeichen enthalten (9 Ziffern + 1 Ziffer oder X).",
+ "ISBN10 Non Valido": "Ungültige ISBN10",
+ "ISBN10 o ISBN13": "ISBN10 oder ISBN13",
+ "ISBN13": "ISBN13",
+ "ISBN13 deve contenere esattamente 13 cifre.": "ISBN13 muss genau 13 Ziffern enthalten.",
+ "ISBN13 Non Valido": "Ungültige ISBN13",
+ "ISBN13: %s": "ISBN13: %s",
+ "ISBN:": "ISBN:",
+ "ISSN": "ISSN",
+ "ISSN deve essere nel formato XXXX-XXXX (8 cifre, l'ultima può essere X).": "ISSN muss im Format XXXX-XXXX sein (8 Ziffern, die letzte kann X sein).",
+ "ISSN Non Valido": "Ungültige ISSN",
+ "ISSN non valido. Il formato corretto è XXXX-XXXX (8 cifre, l'ultima può essere X).": "Ungültige ISSN. Das korrekte Format ist XXXX-XXXX (8 Ziffern; die letzte kann X sein).",
+ "IT": "IT",
"Italiano (IT)": "Italienisch (IT)",
- "JPG, PNG, GIF, WEBP - Max 5MB": "JPG, PNG, GIF, WEBP – Max. 5 MB",
- "JSON non valido.": "Ungültiges JSON.",
"JavaScript Analitici": "Analyse-JavaScript",
"JavaScript Essenziali": "Essentielles JavaScript",
"JavaScript Marketing": "Marketing-JavaScript",
+ "JPG, PNG, GIF, WEBP - Max 5MB": "JPG, PNG, GIF, WEBP – Max. 5 MB",
+ "JSON non valido.": "Ungültiges JSON.",
+ "kg": "kg",
+ "L'accesso alla cartella installer è automaticamente bloccato dopo l'installazione.": "Der Zugriff auf den Installer-Ordner wird nach der Installation automatisch gesperrt.",
"L'API key può essere fornita in due modi:": "Der API-Schlüssel kann auf zwei Arten bereitgestellt werden:",
+ "L'API key viene criptata con AES-256-GCM prima di essere salvata.": "Der API-Schlüssel wird vor dem Speichern mit AES-256-GCM verschlüsselt.",
"L'API è limitata a 50 risultati per richiesta": "Die API ist auf 50 Ergebnisse pro Anfrage begrenzt",
- "L'ID primario deve essere presente nella lista degli autori da unire": "Die primäre ID muss in der Liste der zusammenzuführenden Autoren vorhanden sein",
- "L'ID primario deve essere presente nella lista degli editori da unire": "Die primäre ID muss in der Liste der zusammenzuführenden Verlage vorhanden sein",
- "L'URL canonico non è valido. Deve iniziare con http:// o https://": "Die kanonische URL ist ungültig. Sie muss mit http:// oder https:// beginnen",
- "L'URL del calendario è stato copiato negli appunti.": "Die Kalender-URL wurde in die Zwischenablage kopiert.",
- "L'URL fornito non è valido": "Die angegebene URL ist ungültig",
- "L'accesso alla cartella installer è automaticamente bloccato dopo l'installazione.": "Der Zugriff auf den Installer-Ordner wird nach der Installation automatisch gesperrt.",
"L'applicazione NON può funzionare senza questo passaggio!": "Die Anwendung kann NICHT ohne diesen Schritt funktionieren!",
"L'applicazione risulta correttamente configurata.": "Die Anwendung ist korrekt konfiguriert.",
"L'applicazione è stata installata correttamente e tutte le verifiche sono andate a buon fine.": "Die Anwendung wurde erfolgreich installiert und alle Prüfungen wurden bestanden.",
+ "L'archivio ZIP è vuoto": "Das ZIP-Archiv ist leer",
"L'email di attivazione è stata inviata. L'utente potrà verificare il proprio account cliccando il link ricevuto (valido 7 giorni).": "Die Aktivierungs-E-Mail wurde gesendet. Der Benutzer kann sein Konto durch Klicken auf den erhaltenen Link verifizieren (7 Tage gültig).",
+ "L'ID primario deve essere presente nella lista degli autori da unire": "Die primäre ID muss in der Liste der zusammenzuführenden Autoren vorhanden sein",
+ "L'ID primario deve essere presente nella lista degli editori da unire": "Die primäre ID muss in der Liste der zusammenzuführenden Verlage vorhanden sein",
"L'immagine verrà scaricata al salvataggio": "Das Bild wird beim Speichern heruntergeladen",
"L'immagine è troppo grande. Max 5MB.": "Das Bild ist zu groß. Max. 5 MB.",
"L'indirizzo email deve essere valido.": "Die E-Mail-Adresse muss gültig sein.",
@@ -2015,6 +2268,9 @@
"L'ora dell'evento deve essere nel formato corretto (HH:MM).": "Die Uhrzeit des Ereignisses muss im korrekten Format vorliegen (HH:MM).",
"L'ora deve essere nel formato corretto (HH:MM).": "Die Uhrzeit muss im korrekten Format vorliegen (HH:MM).",
"L'ultima sezione che invita all'azione": "Der abschließende Call-to-Action-Bereich",
+ "L'URL canonico non è valido. Deve iniziare con http:// o https://": "Die kanonische URL ist ungültig. Sie muss mit http:// oder https:// beginnen",
+ "L'URL del calendario è stato copiato negli appunti.": "Die Kalender-URL wurde in die Zwischenablage kopiert.",
+ "L'URL fornito non è valido": "Die angegebene URL ist ungültig",
"L'utente del database non ha i permessi per creare i TRIGGER. L'installazione è stata completata, ma per garantire la piena integrità dei dati è necessario installarli manualmente.": "Der Datenbankbenutzer hat keine Berechtigung zum Erstellen von TRIGGERN. Die Installation wurde abgeschlossen, aber um die vollständige Datenintegrität zu gewährleisten, müssen diese manuell installiert werden.",
"L'utente ha ritirato il libro?": "Hat der Benutzer das Buch abgeholt?",
"L'utente non è in stato sospeso. Solo gli utenti sospesi richiedono approvazione.": "Der Benutzer befindet sich nicht im gesperrten Status. Nur gesperrte Benutzer erfordern eine Genehmigung.",
@@ -2024,7 +2280,6 @@
"L'utente sarà attivato immediatamente e riceverà un'email di benvenuto. Potrà accedere subito.": "Der Benutzer wird sofort aktiviert und erhält eine Willkommens-E-Mail. Er kann sich sofort anmelden.",
"L'utente è stato attivato e può già effettuare il login. È stata inviata un'email di benvenuto.": "Der Benutzer wurde aktiviert und kann sich bereits anmelden. Eine Willkommens-E-Mail wurde gesendet.",
"L'utente è stato eliminato.": "Der Benutzer wurde gelöscht.",
- "La Tua Biblioteca Digitale": "Ihre digitale Bibliothek",
"La cartella vendor/ esiste e contiene le librerie necessarie.": "Der Ordner vendor/ existiert und enthält die erforderlichen Bibliotheken.",
"La classificazione Dewey è utilizzata per organizzare i libri per argomento secondo standard internazionali": "Die Dewey-Klassifikation wird verwendet, um Bücher nach Thema gemäß internationalen Standards zu organisieren",
"La collocazione può essere assegnata automaticamente o inserita manualmente durante la creazione/modifica del libro": "Der Standort kann automatisch zugewiesen oder bei der Erstellung/Bearbeitung des Buches manuell eingegeben werden",
@@ -2042,6 +2297,7 @@
"La modalità manutenzione non era attiva": "Der Wartungsmodus war nicht aktiv",
"La pagina che stai cercando non esiste o è stata spostata.": "Die Seite, die Sie suchen, existiert nicht oder wurde verschoben.",
"La pagina che stai cercando non esiste.": "Die von Ihnen gesuchte Seite existiert nicht.",
+ "La password attuale non è corretta.": "Das aktuelle Passwort ist falsch.",
"La password deve contenere almeno 8 caratteri, lettere maiuscole, minuscole e numeri": "Das Passwort muss mindestens 8 Zeichen mit Groß- und Kleinbuchstaben sowie Zahlen enthalten",
"La password deve contenere almeno una lettera maiuscola, una minuscola e un numero": "Das Passwort muss mindestens einen Großbuchstaben, einen Kleinbuchstaben und eine Zahl enthalten",
"La password deve contenere almeno una lettera maiuscola, una minuscola e un numero.": "Das Passwort muss mindestens einen Großbuchstaben, einen Kleinbuchstaben und eine Zahl enthalten.",
@@ -2050,7 +2306,6 @@
"La password deve essere lunga almeno 8 caratteri!": "Das Passwort muss mindestens 8 Zeichen lang sein!",
"La password deve essere lunga almeno 8 caratteri.": "Das Passwort muss mindestens 8 Zeichen lang sein.",
"La password non può superare i 72 caratteri.": "Das Passwort darf nicht länger als 72 Zeichen sein.",
- "La password attuale non è corretta.": "Das aktuelle Passwort ist falsch.",
"La posizione fisica è indipendente dalla classificazione Dewey e indica dove si trova il libro sugli scaffali.": "Die physische Position ist unabhängig von der Dewey-Klassifikation und gibt an, wo sich das Buch in den Regalen befindet.",
"La posizione in coda sarà calcolata automaticamente in base alle prenotazioni esistenti": "Die Warteschlangenposition wird automatisch anhand der bestehenden Vormerkungen berechnet",
"La posizione viene assegnata automaticamente": "Die Position wird automatisch zugewiesen",
@@ -2065,8 +2320,10 @@
"La sezione principale che appare per prima sulla home": "Der Hauptbereich, der als Erstes auf der Startseite erscheint",
"La sitemap viene aggiornata automaticamente quando premi il pulsante oppure tramite lo script CLI": "Die Sitemap wird automatisch aktualisiert, wenn Sie die Schaltfläche drücken oder über das CLI-Skript",
"La sitemap viene aggiornata automaticamente quando premi il pulsante oppure tramite lo script CLI
php scripts/generate-sitemap.php. Usa questa azione dopo aver importato un grande numero di libri o modifiche ai contenuti CMS.": "Die Sitemap wird automatisch aktualisiert, wenn Sie die Schaltfläche drücken oder über das CLI-Skript
php scripts/generate-sitemap.php. Verwenden Sie diese Aktion nach dem Import vieler Bücher oder Änderungen an CMS-Inhalten.",
+ "La Tua Biblioteca Digitale": "Ihre digitale Bibliothek",
"La tua biblioteca digitale...": "Ihre digitale Bibliothek...",
"La tua prenotazione per \"%s\" è stata messa in attesa. %s. Verrai notificato quando sarà disponibile una nuova copia.": "Ihre Vormerkung für \"%s\" wurde in die Warteschlange gestellt. %s. Sie werden benachrichtigt, wenn ein neues Exemplar verfügbar ist.",
+ "La tua recensione del libro...": "Ihre Buchrezension...",
"La tua richiesta di prestito è stata inviata. Riceverai una notifica quando verrà approvata.": "Ihre Ausleihanfrage wurde gesendet. Sie erhalten eine Benachrichtigung, wenn sie genehmigt wird.",
"La tua sessione è scaduta. Per motivi di sicurezza, effettua nuovamente l'accesso": "Ihre Sitzung ist abgelaufen. Bitte melden Sie sich aus Sicherheitsgründen erneut an",
"La tua sessione è scaduta. Per motivi di sicurezza, ricarica la pagina e riprova": "Ihre Sitzung ist abgelaufen. Bitte laden Sie aus Sicherheitsgründen die Seite neu und versuchen Sie es erneut",
@@ -2086,13 +2343,14 @@
"Lascia vuoto per nascondere il titolo": "Leer lassen, um den Titel auszublenden",
"Lascia vuoto per non modificare": "Leer lassen, um nicht zu ändern",
"Lascia vuoto se l'autore è vivente": "Leer lassen, wenn der Autor noch lebt",
+ "LCCN": "LCCN",
"Le API key disattivate restituiranno errore 401": "Deaktivierte API-Schlüssel geben Fehler 401 zurück",
- "Le Mie Prenotazioni": "Meine Vormerkungen",
- "Le Mie Recensioni": "Meine Rezensionen",
"Le copie disponibili vengono calcolate automaticamente": "Verfügbare Exemplare werden automatisch berechnet",
"Le date rosse non sono disponibili. La richiesta verrà valutata da un amministratore.": "Rot markierte Daten sind nicht verfügbar. Ihre Anfrage wird von einem Administrator geprüft.",
"Le date rosse o arancioni non sono disponibili. La richiesta verrà valutata da un amministratore.": "Rote oder orangefarbene Daten sind nicht verfügbar. Die Anfrage wird von einem Administrator geprüft.",
+ "Le Mie Prenotazioni": "Meine Vormerkungen",
"Le mie prenotazioni": "Meine Vormerkungen",
+ "Le Mie Recensioni": "Meine Rezensionen",
"Le password non coincidono": "Die Passwörter stimmen nicht überein",
"Le password non coincidono!": "Die Passwörter stimmen nicht überein!",
"Le password non coincidono.": "Die Passwörter stimmen nicht überein.",
@@ -2102,69 +2360,88 @@
"Le route sono gli URL usati nell'applicazione. Traducendole, puoi avere URL in italiano o inglese in base alla lingua dell'installazione.": "Routen sind die URLs, die in der Anwendung verwendet werden. Durch Übersetzung können Sie URLs je nach Installationssprache auf Italienisch oder Englisch haben.",
"Le sessioni scadono automaticamente per proteggere i tuoi dati.": "Sitzungen laufen automatisch ab, um Ihre Daten zu schützen.",
"Le tue recensioni": "Ihre Rezensionen",
+ "Leggi PDF": "PDF lesen",
"Letta": "Gelesen",
"Letto": "Gelesen",
"Lettore": "Leser",
"Libero": "Frei",
"Library Management System": "Bibliotheksverwaltungssystem",
+ "Library of Congress Control Number": "Library of Congress Control Number",
+ "LibraryThing": "LibraryThing",
"LibraryThing TSV": "LibraryThing TSV",
+ "LibraryThing Work ID": "LibraryThing Work ID",
"Librerie di upload non caricate. Ricarica la pagina.": "Upload-Bibliotheken nicht geladen. Bitte laden Sie die Seite neu.",
"Libri": "Bücher",
+ "libri": "Bücher",
+ "Libri attualmente in prestito": "Derzeit ausgeliehene Bücher",
+ "Libri con ISBN": "Bücher mit ISBN",
"Libri Disponibili": "Verfügbare Bücher",
+ "libri eliminati": "Bücher gelöscht",
"Libri Importati": "Importierte Bücher",
- "Libri Prestati": "Ausgeliehene Bücher",
- "Libri Totali": "Bücher gesamt",
- "Libri attualmente in prestito": "Derzeit ausgeliehene Bücher",
+ "Libri nelle collane": "Bücher in Reihen",
"Libri per Collocazione": "Bücher nach Standort",
"Libri prenotati dagli utenti": "Von Benutzern vorgemerkte Bücher",
+ "Libri Prestati": "Ausgeliehene Bücher",
+ "Libri Totali": "Bücher gesamt",
+ "libri trovati": "Bücher gefunden",
+ "libri. Questa azione non può essere annullata.": "Bücher. Diese Aktion kann nicht rückgängig gemacht werden.",
"Libro": "Buch",
+ "libro": "Buch",
"Libro '%s' (ID: %d) ha copie disponibili negative: %d": "Buch '%s' (ID: %d) hat negative verfügbare Exemplare: %d",
"Libro '%s' (ID: %d) ha più copie disponibili (%d) che totali (%d)": "Buch '%s' (ID: %d) hat mehr verfügbare Exemplare (%d) als Gesamtexemplare (%d)",
"Libro '%s' (ID: %d) ha stato '%s' ma copie disponibili: %d": "Buch '%s' (ID: %d) hat Status '%s', aber verfügbare Exemplare: %d",
- "Libro Esistente:": "Vorhandenes Buch:",
- "Libro Già Esistente": "Buch bereits vorhanden",
- "Libro ID %d ha posizioni coda non sequenziali: %s": "Buch ID %d hat nicht-sequenzielle Warteschlangenpositionen: %s",
"Libro aggiornato con successo!": "Buch erfolgreich aktualisiert!",
"Libro aggiunto con successo!": "Buch erfolgreich hinzugefügt!",
"Libro da prenotare": "Vorzumerkendes Buch",
"Libro disponibile per la prenotazione": "Buch zur Vormerkung verfügbar",
"Libro e utente sono campi obbligatori.": "Buch und Benutzer sind Pflichtfelder.",
+ "Libro Esistente:": "Vorhandenes Buch:",
+ "Libro Già Esistente": "Buch bereits vorhanden",
+ "Libro ID %d ha posizioni coda non sequenziali: %s": "Buch ID %d hat nicht-sequenzielle Warteschlangenpositionen: %s",
"Libro non disponibile": "Buch nicht verfügbar",
"Libro non trovato": "Buch nicht gefunden",
"Libro non trovato nel database Open Library": "Buch nicht in der Open Library-Datenbank gefunden",
"Libro non trovato su Open Library.": "Buch nicht auf Open Library gefunden.",
"Libro non trovato.": "Buch nicht gefunden.",
+ "Libro non valido o eliminato": "Ungültiges oder gelöschtes Buch",
"Libro prenotato disponibile": "Vorgemerktes Buch verfügbar",
"Libro senza titolo": "Buch ohne Titel",
+ "libro trovato": "Buch gefunden",
"Libro:": "Buch:",
"Licenza": "Lizenz",
"Limite massimo rinnovi raggiunto": "Maximale Anzahl an Verlängerungen erreicht",
"Limiti: massimo 50 libri con scraping attivo, timeout 5 minuti": "Grenzen: maximal 50 Bücher mit aktivem Scraping, Timeout 5 Minuten",
+ "linea": "Zeile",
"Lingua": "Sprache",
+ "Lingua aggiornata con successo": "Sprache erfolgreich aktualisiert",
"Lingua App": "App-Sprache",
"Lingua Attiva": "Aktive Sprache",
- "Lingua Predefinita": "Standardsprache",
- "Lingua Predefinita:": "Standardsprache:",
- "Lingua aggiornata con successo": "Sprache erfolgreich aktualisiert",
"Lingua creata con successo": "Sprache erfolgreich erstellt",
+ "Lingua e Provenienza": "Sprache und Herkunft",
"Lingua eliminata con successo": "Sprache erfolgreich gelöscht",
"Lingua non supportata": "Nicht unterstützte Sprache",
"Lingua non trovata": "Sprache nicht gefunden",
"Lingua originale del libro": "Originalsprache des Buches",
+ "Lingua Predefinita": "Standardsprache",
"Lingua predefinita impostata con successo": "Standardsprache erfolgreich festgelegt",
+ "Lingua Predefinita:": "Standardsprache:",
"Lingue": "Sprachen",
+ "lingue": "Sprachen",
"Lingue Configurate": "Konfigurierte Sprachen",
+ "Lingue Originali": "Originalsprachen",
"Lingue valide": "Gültige Sprachen",
+ "lingue. Errori:": "Sprachen. Fehler:",
"Link": "Link",
- "Link Cookie Statement": "Link zur Cookie-Erklärung",
- "Link Cookie Technologies": "Link zu Cookie-Technologien",
- "Link Social Media": "Social-Media-Links",
"Link al file digitale (se disponibile)": "Link zur digitalen Datei (falls verfügbar)",
"Link all'audiolibro (se disponibile)": "Link zum Hörbuch (falls verfügbar)",
+ "Link Cookie Statement": "Link zur Cookie-Erklärung",
+ "Link Cookie Technologies": "Link zu Cookie-Technologien",
"Link copiato!": "Link kopiert!",
"Link di esempio": "Beispiel-Link",
"Link di reset non valido o scaduto": "Zurücksetzungslink ungültig oder abgelaufen",
"Link pulsante": "Schaltflächen-Link",
+ "Link Social Media": "Social-Media-Links",
+ "link, accenti": "Links, Akzente",
"LinkedIn": "LinkedIn",
"Lista": "Liste",
"Livello": "Ebene",
@@ -2182,17 +2459,18 @@
"Locale non supportato.": "Nicht unterstützte Sprache.",
"Lock file creato (installazione protetta)": "Lock-Datei erstellt (Installation geschützt)",
"Log": "Log",
- "Log Sicurezza": "Sicherheitsprotokolle",
"Log di Sicurezza": "Sicherheitsprotokoll",
+ "Log Sicurezza": "Sicherheitsprotokolle",
"Login": "Anmeldung",
"Login Riuscito": "Anmeldung erfolgreich",
"Logo": "Logo",
"Logo Applicazione (opzionale)": "Anwendungslogo (optional)",
"Logout effettuato con successo": "Abmeldung erfolgreich",
- "MP3, M4A o OGG, max 500 MB": "MP3, M4A oder OGG, max. 500 MB",
+ "LP": "LP",
+ "luglio": "Juli",
+ "maggio": "Mai",
"Mai generata": "Nie generiert",
"Mai utilizzata": "Nie verwendet",
- "MaintenanceService ICS non generato": "MaintenanceService ICS nicht generiert",
"MaintenanceService connessione database fallita": "MaintenanceService Datenbankverbindung fehlgeschlagen",
"MaintenanceService errore attivazione prestiti": "MaintenanceService Fehler bei Ausleihe-Aktivierung",
"MaintenanceService errore attivazione prestito": "MaintenanceService Fehler bei Ausleihe-Aktivierung",
@@ -2207,6 +2485,7 @@
"MaintenanceService errore scadenza prenotazione": "MaintenanceService Fehler bei Vormerkungsablauf",
"MaintenanceService errore scadenza ritiro": "MaintenanceService Fehler bei Abholfristablauf",
"MaintenanceService eseguito al login admin": "MaintenanceService bei Admin-Anmeldung ausgeführt",
+ "MaintenanceService ICS non generato": "MaintenanceService ICS nicht generiert",
"MaintenanceService prenotazione convertita in prestito": "MaintenanceService Vormerkung in Ausleihe umgewandelt",
"MaintenanceService prenotazione scaduta": "MaintenanceService Vormerkung abgelaufen",
"MaintenanceService ritiro scaduto": "MaintenanceService Abholung abgelaufen",
@@ -2214,15 +2493,18 @@
"Mantieni in ritardo": "Als überfällig beibehalten",
"Manuale": "Manuell",
"Manutenzione": "Wartung",
+ "manutenzione": "Wartung",
"Manutenzione Completa": "Vollständige Wartung",
"Manutenzione completata: %d record corretti": "Wartung abgeschlossen: %d Datensätze korrigiert",
"Manutenzione disattivata": "Wartung deaktiviert",
"Manutenzione giornaliera del database": "Tägliche Datenbankwartung",
- "Mappa Interattiva": "Interaktive Karte",
"Mappa del sito per i motori di ricerca": "Sitemap für Suchmaschinen",
+ "Mappa Interattiva": "Interaktive Karte",
"Mappa non disponibile": "Karte nicht verfügbar",
"Mario": "Max",
+ "mario.rossi@email.it": "max.mustermann@email.de",
"Marketing:": "Marketing:",
+ "marzo": "März",
"Maschio": "Männlich",
"Max 10.000 righe • Max 100 copie per libro": "Max. 10.000 Zeilen • Max. 100 Exemplare pro Buch",
"Mediocre": "Mäßig",
@@ -2250,14 +2532,15 @@
"Migrazione database": "Datenbankmigration",
"Minimo 8 caratteri": "Mindestens 8 Zeichen",
"Minimo 8 caratteri, con lettere maiuscole, minuscole e numeri": "Mindestens 8 Zeichen, mit Groß- und Kleinbuchstaben sowie Zahlen",
+ "minuti fa": "vor Minuten",
"Mittente": "Absender",
"Mittente (email)": "Absender (E-Mail)",
"Mittente (nome)": "Absender (Name)",
"Modalità Catalogo": "Katalogmodus",
- "Modalità Solo Catalogo": "Nur-Katalog-Modus",
"Modalità di importazione": "Importmodus",
"Modalità manutenzione disattivata": "Wartungsmodus deaktiviert",
"Modalità manutenzione rimossa automaticamente (scaduta)": "Wartungsmodus automatisch entfernt (abgelaufen)",
+ "Modalità Solo Catalogo": "Nur-Katalog-Modus",
"Moderatore": "Moderator",
"Modifica": "Bearbeiten",
"Modifica %s": "%s bearbeiten",
@@ -2268,39 +2551,47 @@
"Modifica Evento": "Veranstaltung bearbeiten",
"Modifica Evento: %s": "Veranstaltung bearbeiten: %s",
"Modifica Homepage": "Startseite bearbeiten",
+ "Modifica i contenuti della homepage: hero, features, CTA e immagine di sfondo": "Inhalte der Startseite bearbeiten: Hero, Features, CTA und Hintergrundbild",
+ "Modifica il contenuto e le impostazioni della pagina": "Seiteninhalt und Einstellungen bearbeiten",
+ "Modifica le informazioni dell'evento": "Veranstaltungsinformationen bearbeiten",
+ "Modifica le pagine statiche del sito": "Statische Seiten der Website bearbeiten",
"Modifica Libro": "Buch bearbeiten",
"Modifica Lingua:": "Sprache bearbeiten:",
"Modifica Prenotazione": "Vormerkung bearbeiten",
"Modifica Prenotazione #%s": "Vormerkung #%s bearbeiten",
+ "Modifica prestito": "Ausleihe bearbeiten",
+ "Modifica prestito #%s": "Ausleihe #%s bearbeiten",
+ "Modifica profilo": "Profil bearbeiten",
"Modifica Route": "Route bearbeiten",
"Modifica Route Tradotte": "Übersetzte Routen bearbeiten",
+ "Modifica stato": "Status bearbeiten",
"Modifica Stato Copia": "Exemplar-Status bearbeiten",
"Modifica Utente": "Benutzer bearbeiten",
- "Modifica i contenuti della homepage: hero, features, CTA e immagine di sfondo": "Inhalte der Startseite bearbeiten: Hero, Features, CTA und Hintergrundbild",
- "Modifica il contenuto e le impostazioni della pagina": "Seiteninhalt und Einstellungen bearbeiten",
- "Modifica le informazioni dell'evento": "Veranstaltungsinformationen bearbeiten",
- "Modifica le pagine statiche del sito": "Statische Seiten der Website bearbeiten",
- "Modifica prestito": "Ausleihe bearbeiten",
- "Modifica prestito #%s": "Ausleihe #%s bearbeiten",
- "Modifica profilo": "Profil bearbeiten",
- "Modifica stato": "Status bearbeiten",
"Modifica utente": "Benutzer bearbeiten",
"Modifiche non salvate": "Nicht gespeicherte Änderungen",
"Modulo": "Modul",
"Molto buono": "Sehr gut",
+ "Molto Buono": "Sehr gut",
"Mondadori": "Mondadori",
"Monitora tentativi di login e eventi di sicurezza": "Anmeldeversuche und Sicherheitsereignisse überwachen",
"Mostra": "Anzeigen",
+ "Mostra _MENU_ libri": "_MENU_ Bücher anzeigen",
"Mostra API Key": "API-Schlüssel anzeigen",
+ "Mostra badge nell'area amministrazione": "Badge im Administrationsbereich anzeigen",
+ "Mostra badge nella pagina dettaglio libro": "Badge auf der Buchdetailseite anzeigen",
+ "Mostra categoria \\": "Kategorie anzeigen \\",
"Mostra Cookie Analitici": "Analyse-Cookies anzeigen",
"Mostra Cookie di Marketing": "Marketing-Cookies anzeigen",
- "Mostra _MENU_ libri": "_MENU_ Bücher anzeigen",
- "Mostra categoria \\": "Kategorie anzeigen \\",
"Mostra filtri": "Filter anzeigen",
"Mostra gli ultimi libri aggiunti al catalogo": "Die zuletzt zum Katalog hinzugefügten Bücher anzeigen",
+ "Mostra i badge nella pagina dettaglio libro del catalogo": "Badges auf der Buchdetailseite im Katalog anzeigen",
+ "Mostra i badge nella scheda libro dell'area amministrazione": "Badges auf der Buchseite im Administrationsbereich anzeigen",
"Mostra questa guida": "Diese Anleitung anzeigen",
+ "Mostra scorciatoie": "Tastaturkürzel anzeigen",
+ "Mostra/nascondi token": "Token anzeigen/verbergen",
"Motivo del rifiuto (opzionale)": "Ablehnungsgrund (optional)",
"Motivo del rifiuto (opzionale):": "Ablehnungsgrund (optional):",
+ "MP3, M4A o OGG, max 500 MB": "MP3, M4A oder OGG, max. 500 MB",
"N. Inventario": "Inventar-Nr.",
"N. Libri": "Anz. Bücher",
"N/D": "k. A.",
@@ -2314,11 +2605,16 @@
"Nascondi se il sito non utilizza strumenti di analytics (es. Google Analytics)": "Ausblenden, wenn die Website keine Analysetools verwendet (z. B. Google Analytics)",
"Nascosto": "Verborgen",
"Nato il %s": "Geboren am %s",
+ "Navigazione": "Navigation",
"Nazionalità": "Nationalität",
"Nederlands (NL)": "Niederländisch (NL)",
"Nei Preferiti": "In Favoriten",
+ "nell'header. Non includere i tag": "im Header. Fügen Sie keine Tags ein",
"Nella collezione": "In der Sammlung",
- "Nessun Problema": "Keine Probleme",
+ "nella directory dell'applicazione.": "im Anwendungsverzeichnis.",
+ "nella nostra biblioteca.": "in unserer Bibliothek.",
+ "nella root del progetto impedisce qualsiasi accesso non autorizzato.": "im Projektstammverzeichnis verhindert jeden unbefugten Zugriff.",
+ "Nella stessa collana": "In derselben Reihe",
"Nessun aggiornamento": "Keine Aktualisierungen",
"Nessun aggiornamento registrato": "Keine Aktualisierungen verzeichnet",
"Nessun autore selezionato": "Keine Autoren ausgewählt",
@@ -2340,10 +2636,12 @@
"Nessun file caricato.": "Keine Datei hochgeladen.",
"Nessun file di traduzione caricato. Carica un file JSON per abilitare questa lingua.": "Keine Übersetzungsdatei hochgeladen. Laden Sie eine JSON-Datei hoch, um diese Sprache zu aktivieren.",
"Nessun genere trovato": "Keine Genres gefunden",
+ "Nessun import in corso": "Kein Import läuft",
"Nessun import registrato": "Keine Importe aufgezeichnet",
"Nessun libro": "Keine Bücher",
"Nessun libro ancora inserito": "Noch keine Bücher hinzugefügt",
"Nessun libro con collocazione trovato": "Keine Bücher mit Standort gefunden",
+ "Nessun libro da arricchire": "Keine Bücher zum Anreichern",
"Nessun libro nel database": "Keine Bücher in der Datenbank",
"Nessun libro recente": "Keine aktuellen Bücher",
"Nessun libro recente disponibile": "Keine aktuellen Bücher verfügbar",
@@ -2364,6 +2662,8 @@
"Nessun prestito scaduto": "Keine überfälligen Ausleihen",
"Nessun prestito trovato": "Keine Ausleihen gefunden",
"Nessun prestito trovato.": "Keine Ausleihen gefunden.",
+ "Nessun Problema": "Keine Probleme",
+ "Nessun pulsante selezionato": "Keine Schaltflächen ausgewählt",
"Nessun risultato": "Keine Ergebnisse",
"Nessun risultato trovato": "Keine Ergebnisse gefunden",
"Nessun risultato trovato con i filtri applicati": "Keine Ergebnisse mit den angewendeten Filtern gefunden",
@@ -2377,8 +2677,9 @@
"Nessun suggerimento disponibile": "Kein Vorschlag verfügbar",
"Nessun titolo corrisponde al filtro corrente.": "Kein Titel entspricht dem aktuellen Filter.",
"Nessuna": "Keine",
- "Nessuna API key configurata": "Keine API-Schlüssel konfiguriert",
"Nessuna alternativa disponibile": "Keine Alternativen verfügbar",
+ "Nessuna API key configurata": "Keine API-Schlüssel konfiguriert",
+ "Nessuna collana trovata. Aggiungi una collana a un libro per iniziare.": "Keine Reihen gefunden. Fügen Sie einem Buch eine Reihe hinzu.",
"Nessuna collocazione trovata": "Keine Standorte gefunden",
"Nessuna copertina caricata": "Kein Cover hochgeladen",
"Nessuna copertina da scaricare": "Keine Cover zum Abrufen vorhanden",
@@ -2408,6 +2709,7 @@
"Nessuna richiesta in attesa di approvazione.": "Keine Anfragen zur Genehmigung ausstehend.",
"Nessuna selezione": "Keine Auswahl",
"Nessuna sessione attiva. Le sessioni vengono create quando accedi con 'Ricordami' selezionato.": "Keine aktiven Sitzungen. Sitzungen werden erstellt, wenn Sie sich mit aktiviertem 'Angemeldet bleiben' anmelden.",
+ "Nessuna valutazione": "Keine Bewertung",
"Nessuno": "Keine",
"Nessuno scaffale. Creane uno per iniziare!": "Keine Regalgestelle vorhanden. Erstellen Sie eines, um zu beginnen!",
"Nessuno storico": "Kein Verlauf",
@@ -2416,46 +2718,49 @@
"Nome": "Vorname",
"Nome *": "Name *",
"Nome Applicazione": "Anwendungsname",
- "Nome Categoria": "Kategoriename",
- "Nome Cognome": "Vor- und Nachname",
- "Nome Database": "Datenbankname",
- "Nome Editore": "Verlagsname",
- "Nome File": "Dateiname",
- "Nome Indice": "Indexname",
- "Nome Inglese": "Englischer Name",
- "Nome Nativo": "Einheimischer Name",
- "Nome Referente": "Name der Kontaktperson",
- "Nome Server": "Servername",
"Nome applicazione": "Anwendungsname",
"Nome autore": "Autorenname",
"Nome backup non specificato": "Backup-Name nicht angegeben",
"Nome backup non valido": "Ungültiger Backup-Name",
+ "Nome Categoria": "Kategoriename",
"Nome categoria esistente": "Vorhandener Kategoriename",
+ "Nome Cognome": "Vor- und Nachname",
+ "Nome collana di destinazione": "Name der Zielreihe",
+ "Nome collana non valido": "Ungültiger Reihenname",
"Nome completo": "Vollständiger Name",
"Nome cookie analitici": "Name der Analyse-Cookies",
"Nome cookie essenziali": "Name der essentiellen Cookies",
"Nome cookie marketing": "Name der Marketing-Cookies",
"Nome d'arte o pseudonimo": "Künstlername oder Pseudonym",
+ "Nome Database": "Datenbankname",
+ "Nome del curatore dell'opera (se applicabile)": "Name des Kurators (falls zutreffend)",
+ "Nome del prestatore": "Name des Ausleihers",
"Nome del traduttore (se applicabile)": "Name des Übersetzers (falls zutreffend)",
"Nome dell'editore": "Verlagsname",
"Nome dell'illustratore (se applicabile)": "Name des Illustrators (falls zutreffend)",
"Nome della casa editrice": "Verlagsname",
"Nome della classificazione": "Name der Klassifikation",
+ "Nome della collana": "Reihenname",
"Nome della lingua in inglese (es. Italian, English, Spanish)": "Name der Sprache auf Englisch (z. B. Italian, English, Spanish)",
"Nome della lingua nella lingua stessa (es. Italiano, English, Español)": "Name der Sprache in der Sprache selbst (z. B. Italiano, English, Español)",
"Nome e cognome del referente": "Vor- und Nachname der Kontaktperson",
"Nome e cognome dell'autore": "Vor- und Nachname des Autors",
"Nome e cognome sono obbligatori.": "Vor- und Nachname sind erforderlich.",
+ "Nome Editore": "Verlagsname",
"Nome editore": "Verlagsname",
"Nome editore...": "Verlagsname...",
+ "Nome File": "Dateiname",
"Nome file non valido.": "Ungültiger Dateiname.",
+ "Nome Indice": "Indexname",
+ "Nome Inglese": "Englischer Name",
+ "Nome Nativo": "Einheimischer Name",
"Nome o cognome troppo lungo (massimo 100 caratteri)": "Vor- oder Nachname zu lang (maximal 100 Zeichen)",
"Nome plugin non valido. Usa solo lettere, numeri, trattini o underscore.": "Ungültiger Plugin-Name. Verwenden Sie nur Buchstaben, Zahlen, Bindestriche oder Unterstriche.",
+ "Nome Referente": "Name der Kontaktperson",
+ "Nome Server": "Servername",
"Nome, cognome, email...": "Name, Nachname, E-Mail...",
"Nome, pseudonimo, biografia...": "Name, Pseudonym, Biografie...",
"Nome:": "Name:",
- "Non Disponibile": "Nicht verfügbar",
- "Non Disponibili": "Nicht verfügbar",
"Non ancora restituito": "Noch nicht zurückgegeben",
"Non assegnata": "Nicht zugewiesen",
"Non autenticato": "Nicht authentifiziert",
@@ -2467,9 +2772,11 @@
"Non ci sono nuovi arrivi al momento.": "Derzeit gibt es keine Neuerscheinungen.",
"Non ci sono recensioni in attesa di approvazione.": "Keine Rezensionen zur Genehmigung ausstehend.",
"Non ci sono richieste di prestito in attesa di approvazione.": "Keine Ausleih-Anfragen zur Genehmigung ausstehend.",
+ "Non Disponibile": "Nicht verfügbar",
"Non disponibile": "Nicht verfügbar",
"Non disponibile nella data selezionata": "Am gewählten Datum nicht verfügbar",
"Non disponibile ora": "Derzeit nicht verfügbar",
+ "Non Disponibili": "Nicht verfügbar",
"Non eliminabile": "Nicht löschbar",
"Non hai ancora creato nessun evento. Inizia creando il tuo primo evento.": "Sie haben noch keine Veranstaltungen erstellt. Beginnen Sie mit der Erstellung Ihrer ersten Veranstaltung.",
"Non hai ancora lasciato recensioni": "Sie haben noch keine Rezensionen verfasst",
@@ -2478,34 +2785,43 @@
"Non hai prestiti in corso al momento.": "Sie haben derzeit keine aktiven Ausleihen.",
"Non hai prestiti passati": "Sie haben keine vergangenen Ausleihen",
"Non hai un account?": "Sie haben noch kein Konto?",
+ "Non in prestito": "Nicht ausgeliehen",
"Non includere tag": "Keine Tags einfügen",
"Non includere tag ": "Keine -Tags einfügen",
"Non installato": "Nicht installiert",
"Non letto": "Ungelesen",
"Non puoi eliminare l'installer finché non completi l'installazione delle dipendenze PHP.": "Sie können den Installer erst löschen, wenn die Installation der PHP-Abhängigkeiten abgeschlossen ist.",
"Non puoi recensire questo libro (devi averlo preso in prestito e non averlo già recensito)": "Sie können dieses Buch nicht rezensieren (Sie müssen es ausgeliehen haben und dürfen es nicht bereits rezensiert haben)",
+ "non può contenere spazi": "darf keine Leerzeichen enthalten",
+ "non può essere vuota": "darf nicht leer sein",
"Non rinnovabile: prestito in ritardo": "Nicht verlängerbar: Ausleihe überfällig",
"Non scrivibile": "Nicht beschreibbar",
"Non selezionato": "Nicht ausgewählt",
"Non specificata": "Nicht angegeben",
"Non specificato": "Nicht angegeben",
+ "Non trovati": "Nicht gefunden",
+ "Non trovato": "Nicht gefunden",
"Non usare spazi nelle route": "Verwenden Sie keine Leerzeichen in Routen",
"Non è possibile creare la directory: %s": "Verzeichnis kann nicht erstellt werden: %s",
"Non è stato possibile eliminare l'utente. Controlla la console.": "Der Benutzer konnte nicht gelöscht werden. Überprüfen Sie die Konsole.",
"Non è stato trovato alcun aggiornamento": "Keine Aktualisierungen gefunden",
"Nota:": "Hinweis:",
+ "Nota: Data acquisizione è nel campo nativo 'Data Acquisizione' sopra": "Hinweis: Erwerbsdatum befindet sich im nativen Feld 'Erwerbsdatum' oben",
+ "Nota: Il prezzo di acquisto è nel campo 'Prezzo' della sezione 'Dati di Acquisizione'": "Hinweis: Kaufpreis befindet sich im Feld 'Preis' des Abschnitts 'Erwerbsdaten'",
"Nota: Impostare come predefinita disattiverà lo status di predefinita per tutte le altre lingue.": "Hinweis: Das Festlegen als Standard deaktiviert den Standardstatus für alle anderen Sprachen.",
"Nota: in produzione limita questa funzione agli amministratori.": "Hinweis: In der Produktionsumgebung diese Funktion auf Administratoren beschränken.",
+ "Nota: Peso e dimensioni sono nei campi nativi dell'app (sezione Dati Fisici)": "Hinweis: Gewicht und Abmessungen befinden sich in den nativen Feldern der App (Abschnitt Physische Daten)",
"Note": "Notizen",
"Note (opzionali)": "Notizen (optional)",
- "Note Importanti": "Wichtige Hinweise",
- "Note Varie": "Verschiedene Notizen",
"Note aggiuntive o osservazioni particolari...": "Zusätzliche Notizen oder besondere Anmerkungen...",
+ "Note Importanti": "Wichtige Hinweise",
"Note importanti:": "Wichtige Hinweise:",
"Note interne": "Interne Notizen",
+ "Note private...": "Private Notizen...",
"Note sul prestito": "Ausleihe-Notizen",
"Note sulla restituzione": "Rückgabe-Notizen",
"Note tecniche": "Technische Hinweise",
+ "Note Varie": "Verschiedene Notizen",
"Notifica agli amministratori quando viene inoltrata una nuova richiesta di prestito.": "Benachrichtigt Administratoren, wenn eine neue Ausleihanfrage eingereicht wird.",
"Notifica agli utenti quando il prestito è scaduto e deve essere restituito.": "Benachrichtigt die Benutzer, wenn die Ausleihe abgelaufen ist und das Buch zurückgegeben werden muss.",
"Notifica copia non disponibile creata": "Benachrichtigung über nicht verfügbares Exemplar erstellt",
@@ -2514,24 +2830,28 @@
"Notifica richiesta prestito fallita": "Benachrichtigung über Ausleihanfrage fehlgeschlagen",
"Notifiche": "Benachrichtigungen",
"Notifiche Automatiche": "Automatische Benachrichtigungen",
- "Notifiche Prestiti": "Ausleihe-Benachrichtigungen",
"Notifiche disponibilità libri in wishlist": "Benachrichtigungen zur Verfügbarkeit von Büchern auf der Wunschliste",
+ "Notifiche Prestiti": "Ausleihe-Benachrichtigungen",
"Notifiche prestiti scaduti": "Benachrichtigungen über überfällige Ausleihen",
+ "novembre": "November",
"Novità nelle versioni successive": "Neuigkeiten in kommenden Versionen",
- "Numero Inventario": "Inventarnummer",
- "Numero Libri": "Anzahl Bücher",
- "Numero Pagine": "Seitenzahl",
- "Numero Serie": "Reihennummer",
- "Numero di Pagine": "Seitenzahl",
+ "Numero colonne non valido": "Ungültige Spaltenanzahl",
"Numero di copie non valido.": "Ungültige Anzahl von Exemplaren.",
"Numero di libri": "Anzahl der Bücher",
+ "Numero di Pagine": "Seitenzahl",
+ "Numero Inventario": "Inventarnummer",
"Numero inventario": "Inventarnummer",
+ "Numero Libri": "Anzahl Bücher",
"Numero massimo di righe superato (%d)": "Maximale Zeilenanzahl überschritten (%d)",
"Numero massimo di righe superato (%d). Dividi il file in parti più piccole.": "Maximale Zeilenanzahl überschritten (%d). Teilen Sie die Datei in kleinere Teile auf.",
"Numero o descrizione dell'edizione": "Ausgabenummer oder -beschreibung",
+ "Numero Pagine": "Seitenzahl",
"Numero prenotazioni attive": "Anzahl aktiver Vormerkungen",
+ "Numero Serie": "Reihennummer",
"Numero serie": "Reihennummer",
"Numero tessera": "Ausweisnummer",
+ "Numero volume": "Bandnummer",
+ "Nuova Collana": "Neue Reihe",
"Nuova Collocazione": "Neuer Standort",
"Nuova Password": "Neues Passwort",
"Nuova password": "Neues Passwort",
@@ -2542,28 +2862,30 @@
"Nuova ricerca": "Neue Suche",
"Nuova richiesta di prestito": "Neue Ausleih-Anfrage",
"Nuovo": "Neu",
+ "Nuovo aggiornamento disponibile!": "Neue Aktualisierung verfügbar!",
"Nuovo Autore": "Neuer Autor",
"Nuovo Editore": "Neuer Verlag",
+ "Nuovo editore:": "Neuer Verlag:",
"Nuovo Evento": "Neue Veranstaltung",
"Nuovo Genere": "Neues Genre",
"Nuovo Libro": "Neues Buch",
- "Nuovo Prestito": "Neue Ausleihe",
- "Nuovo Utente": "Neuer Benutzer",
- "Nuovo aggiornamento disponibile!": "Neue Aktualisierung verfügbar!",
- "Nuovo editore:": "Neuer Verlag:",
"Nuovo libro": "Neues Buch",
"Nuovo messaggio di contatto": "Neue Kontaktnachricht",
"Nuovo nome (opzionale)": "Neuer Name (optional)",
+ "Nuovo Prestito": "Neue Ausleihe",
+ "Nuovo Utente": "Neuer Benutzer",
"Nuovo utente": "Neuer Benutzer",
- "OFF": "Aus",
- "OK": "OK",
- "ON": "Ein",
+ "o multipli separati da |": "oder mehrere getrennt durch |",
+ "o multipli: Engels;Marx": "oder mehrere: Engels;Marx",
"Obbligatorio": "Erforderlich",
"Obbligatorio per utenti non amministratori.": "Erforderlich für Benutzer ohne Administratorrechte.",
"Obsoleto": "Veraltet",
"Occupato": "Belegt",
"Occupato (in ritardo)": "Belegt (überfällig)",
"Occupato (prestito attivo)": "Belegt (aktive Ausleihe)",
+ "OCLC": "OCLC",
+ "OCLC number": "OCLC-Nummer",
+ "OFF": "Aus",
"Offline": "Offline",
"Oggetto": "Betreff",
"Oggetto dell'email": "E-Mail-Betreff",
@@ -2571,9 +2893,12 @@
"Ogni 15 minuti nei giorni lavorativi (8:00-18:00)": "Alle 15 Minuten an Werktagen (8:00–18:00)",
"Ogni errore include: numero riga, titolo libro, tipo errore e messaggio dettagliato": "Jeder Fehler enthält: Zeilennummer, Buchtitel, Fehlertyp und detaillierte Meldung",
"Ogni route deve iniziare con": "Jede Route muss beginnen mit",
+ "OK": "OK",
+ "ON": "Ein",
"Online": "Online",
"Open Graph (Facebook)": "Open Graph (Facebook)",
"Open Graph (Facebook, LinkedIn)": "Open Graph (Facebook, LinkedIn)",
+ "Opera \"%s\" creata con %d volumi": "Werk \"%s\" erstellt mit %d Bänden",
"Operation completed": "Vorgang abgeschlossen",
"Operation failed": "Vorgang fehlgeschlagen",
"Operatore": "Operator",
@@ -2585,24 +2910,29 @@
"Operazioni": "Vorgänge",
"Opere": "Werke",
"Oppure accedere a /installer/?force=1 per forzare una nuova procedura": "Oder gehen Sie zu /installer/?force=1, um eine Neuinstallation zu erzwingen",
+ "Oppure copia e incolla questo link nel tuo browser:": "Oder kopieren Sie diesen Link und fügen Sie ihn in Ihren Browser ein:",
"Oppure naviga per categorie": "Oder nach Kategorien durchsuchen",
"Oppure naviga per categorie:": "Oder nach Kategorien durchsuchen:",
"Oppure usa il terminale SSH del tuo hosting (cPanel, Plesk, etc.)": "Oder verwenden Sie das SSH-Terminal Ihres Hostings (cPanel, Plesk, etc.)",
"Ops, qualcosa è andato storto": "Hoppla, etwas ist schiefgelaufen",
"Opzionale": "Optional",
+ "opzionale": "optional",
"Opzionale per amministratori": "Optional für Administratoren",
+ "opzionali": "optional",
"Opzione 1:": "Option 1:",
"Opzione 2:": "Option 2:",
"Opzione 3:": "Option 3:",
"Ora Evento": "Veranstaltungszeit",
"Ora puoi accedere con la tua nuova password.": "Sie können sich jetzt mit Ihrem neuen Passwort anmelden.",
"Ora puoi ricaricare questa pagina - il warning sparirà se tutto è OK.": "Sie können diese Seite jetzt neu laden – die Warnung verschwindet, wenn alles in Ordnung ist.",
- "Ordina Sezioni Homepage": "Homepage-Bereiche sortieren",
"Ordina per": "Sortieren nach",
+ "Ordina Sezioni Homepage": "Homepage-Bereiche sortieren",
"Ordinamento": "Sortierung",
"Ordinamento libri": "Büchersortierung",
"Ordine salvato con successo!": "Reihenfolge erfolgreich gespeichert!",
"Ordine:": "Reihenfolge:",
+ "ordine:": "Reihenfolge:",
+ "ore fa": "vor Stunden",
"Organizza e gestisci i generi letterari della biblioteca": "Literarische Genres der Bibliothek organisieren und verwalten",
"Organizza scaffali, mensole e posizioni per la biblioteca fisica": "Regale, Regalböden und Positionen für die physische Bibliothek organisieren",
"Ospite": "Gast",
@@ -2613,29 +2943,27 @@
"Ottimizzazione Indici Database": "Datenbank-Indexoptimierung",
"Ottimizzazione SEO (Meta Tags)": "SEO-Optimierung (Meta-Tags)",
"Ottimizzazione SEO e Social Media": "SEO- und Social-Media-Optimierung",
+ "Ottimo": "Ausgezeichnet",
+ "ottobre": "Oktober",
"Output atteso: cartella vendor/ con sottocartelle (slim, monolog, etc.)": "Erwartete Ausgabe: Ordner vendor/ mit Unterordnern (slim, monolog, etc.)",
- "PDF": "PDF",
- "PDF generato!": "PDF erstellt!",
- "PDF o ePub, max 100 MB": "PDF oder ePub, max. 100 MB",
- "PDF prestito non generato": "Ausleih-PDF nicht erstellt",
- "PHP mail()": "PHP mail()",
- "PHP mail() - Predefinito": "PHP mail() – Standard",
- "PHPMailer": "PHPMailer",
- "PNG, SVG, JPG o WebP (max 2MB)": "PNG, SVG, JPG oder WebP (max. 2 MB)",
+ "Pacchetto caricato non trovato": "Hochgeladenes Paket nicht gefunden",
"Pacchetto di aggiornamento non valido: manca %s": "Ungültiges Aktualisierungspaket: %s fehlt",
"Paese": "Land",
"Pagina": "Seite",
- "Pagina Cookie": "Cookie-Seite",
- "Pagina Cookie Policy": "Cookie-Richtlinien-Seite",
- "Pagina Non Trovata": "Seite nicht gefunden",
+ "pagina": "Seite",
"Pagina \\": "Seite \\",
"Pagina aggiornata con successo.": "Seite erfolgreich aktualisiert.",
"Pagina attiva (visibile sul sito)": "Aktive Seite (auf der Website sichtbar)",
+ "Pagina Cookie": "Cookie-Seite",
+ "Pagina Cookie Policy": "Cookie-Richtlinien-Seite",
+ "Pagina Non Trovata": "Seite nicht gefunden",
"Pagina non trovata.": "Seite nicht gefunden.",
"Pagina precedente": "Vorherige Seite",
"Pagina successiva": "Nächste Seite",
"Paginazione eventi": "Veranstaltungspaginierung",
"Pagine": "Seiten",
+ "pagine": "Seiten",
+ "Pagine Principali": "Hauptseiten",
"Pannello": "Bereich",
"Panoramica completa di prestiti, ritiri e prenotazioni": "Vollständige Übersicht über Ausleihen, Abholungen und Vormerkungen",
"Panoramica generale": "Allgemeine Übersicht",
@@ -2644,16 +2972,18 @@
"Paragraph": "Absatz",
"Parametri di Ricerca": "Suchparameter",
"Parametri non validi": "Ungültige Parameter.",
- "Parametro ISBN mancante.": "Fehlender ISBN-Parameter.",
+ "Parametri non validi per l'unione": "Ungültige Parameter für Zusammenführung",
"Parametro category_id obbligatorio.": "Parameter category_id ist erforderlich.",
"Parametro code obbligatorio.": "Parameter code ist erforderlich.",
"Parametro cover_url mancante.": "Fehlender Parameter cover_url.",
"Parametro division_id obbligatorio.": "Parameter division_id ist erforderlich.",
+ "Parametro ISBN mancante.": "Fehlender ISBN-Parameter.",
+ "Parola chiave": "Schlagwort",
"Parole Chiave": "Schlüsselwörter",
- "Parole Chiave SEO": "SEO-Schlüsselwörter",
"Parole chiave": "Schlüsselwörter",
- "Parole chiave SEO": "SEO-Schlüsselwörter",
"Parole chiave per i motori di ricerca (impatto SEO limitato). Separate da virgola.": "Schlüsselwörter für Suchmaschinen (begrenzter SEO-Einfluss). Durch Komma getrennt.",
+ "Parole Chiave SEO": "SEO-Schlüsselwörter",
+ "Parole chiave SEO": "SEO-Schlüsselwörter",
"Passo": "Schritt",
"Password": "Passwort",
"Password aggiornata con successo.": "Passwort erfolgreich aktualisiert.",
@@ -2663,13 +2993,22 @@
"Password resettata con successo!": "Passwort erfolgreich zurückgesetzt!",
"Password troppo lunga (massimo 128 caratteri)": "Passwort zu lang (maximal 128 Zeichen)",
"Pattern URL": "URL-Muster",
+ "Payload JSON non valido": "Ungültiger JSON-Payload",
+ "PDF": "PDF",
+ "PDF generato!": "PDF erstellt!",
+ "PDF o ePub, max 100 MB": "PDF oder ePub, max. 100 MB",
+ "PDF prestito non generato": "Ausleih-PDF nicht erstellt",
"Pendente": "Ausstehend",
"Pending": "Ausstehend",
"Per aggiornare automaticamente la sitemap ogni giorno:": "Um die Sitemap täglich automatisch zu aktualisieren:",
"Per assistenza, contatta l'amministrazione della biblioteca.": "Für Unterstützung wenden Sie sich an die Bibliotheksverwaltung.",
+ "per conformità GDPR.": "zur DSGVO-Konformität.",
+ "per evitare blocchi (delay di 3 secondi tra ogni richiesta).": "um Blockierungen zu vermeiden (3 Sekunden Verzögerung zwischen jeder Anfrage).",
+ "per il giorno": "für den Tag",
"Per inserire il codice JavaScript Analytics (Google Analytics, Matomo, ecc.), vai su
sospeso e richiede approvazione. Scegli un'opzione:": "Dieser Benutzer ist im Status gesperrt und erfordert Genehmigung. Wählen Sie eine Option:",
"Radice": "Stammverzeichnis",
"Rallenta l'importazione": "Verlangsamt den Import",
"Recati in biblioteca durante gli orari di apertura per ritirare il libro.": "Besuchen Sie die Bibliothek während der Öffnungszeiten, um das Buch abzuholen.",
+ "recensione": "Rezension",
+ "Recensione": "Rezension",
"Recensione (opzionale)": "Rezension (optional)",
"Recensione approvata": "Rezension genehmigt",
"Recensione del": "Rezension vom",
+ "Recensione e Valutazione": "Rezension und Bewertung",
"Recensione eliminata": "Rezension gelöscht",
"Recensione inviata con successo!": "Rezension erfolgreich eingereicht!",
"Recensione inviata con successo! Sarà pubblicata dopo l'approvazione di un amministratore.": "Rezension erfolgreich eingereicht! Sie wird nach der Genehmigung durch einen Administrator veröffentlicht.",
@@ -2947,14 +3325,17 @@
"Recensione per \"%s\" da %s - %s": "Rezension für \"%s\" von %s – %s",
"Recensione rifiutata": "Rezension abgelehnt",
"Recensioni": "Rezensionen",
+ "recensioni": "Rezensionen",
"Recensioni Approvate": "Genehmigte Rezensionen",
"Recensioni Rifiutate": "Abgelehnte Rezensionen",
"Recensioni utenti": "Benutzerrezensionen",
"Recente": "Aktuell",
+ "Recupera la tua password": "Stellen Sie Ihr Passwort wieder her",
"Recupera Password": "Passwort wiederherstellen",
"Referente": "Ansprechperson",
- "Registra Restituzione": "Rückgabe erfassen",
+ "referente@editore.com": "kontakt@verlag.de",
"Registra prestito": "Ausleihe erfassen",
+ "Registra Restituzione": "Rückgabe erfassen",
"Registra restituzione": "Rückgabe erfassen",
"Registra restituzione prestito": "Ausleih-Rückgabe erfassen",
"Registra una prenotazione per permettere ad un utente di riservare un libro specifico": "Erfassen Sie eine Vormerkung, um einem Benutzer die Reservierung eines bestimmten Buches zu ermöglichen",
@@ -2966,16 +3347,19 @@
"Registrazione Completata": "Registrierung abgeschlossen",
"Registrazione completata": "Registrierung abgeschlossen",
"Registrazione completata! Effettua l'accesso": "Registrierung abgeschlossen! Bitte melden Sie sich an",
+ "Registrazione nuovo utente": "Neue Benutzerregistrierung",
"Registrazione ricevuta": "Registrierung eingegangen",
"Registro delle migrazioni database applicate": "Register der angewendeten Datenbankmigrationen",
"Reimposta password": "Passwort zurücksetzen",
"Reindirizza automaticamente tutte le richieste HTTP a HTTPS": "Alle HTTP-Anfragen automatisch auf HTTPS umleiten",
"Reindirizzamento verso dominio non autorizzato bloccato.": "Weiterleitung zu einer nicht autorisierten Domain blockiert.",
"Reinstalla da Capo": "Von Grund auf neu installieren",
+ "Relazione ciclica: questo libro è già opera padre del libro selezionato": "Zyklische Beziehung: Dieses Buch ist bereits ein übergeordnetes Werk des ausgewählten Buches",
"Remoto": "Remote",
+ "Rende disponibile /llms.txt e lo aggiunge a robots.txt": "Macht /llms.txt verfügbar und fügt es zur robots.txt hinzu",
"Report": "Bericht",
- "Report Integrità Dati": "Datenintegritätsbericht",
"Report e analisi": "Berichte und Analysen",
+ "Report Integrità Dati": "Datenintegritätsbericht",
"Requisiti": "Anforderungen",
"Requisiti del plugin:": "Plugin-Anforderungen:",
"Requisiti di Sistema": "Systemanforderungen",
@@ -2983,17 +3367,11 @@
"Requisiti:": "Voraussetzungen:",
"Requisito '%s' non soddisfatto": "Voraussetzung '%s' nicht erfüllt",
"Reset": "Zurücksetzen",
- "Reset Filtri": "Filter zurücksetzen",
"Reset anni": "Jahre zurücksetzen",
+ "Reset Filtri": "Filter zurücksetzen",
"Resetta Password": "Passwort zurücksetzen",
- "Recupera la tua password": "Stellen Sie Ihr Passwort wieder her",
- "Abbiamo ricevuto una richiesta di reset della password per il tuo account.": "Wir haben eine Anfrage zum Zurücksetzen des Passworts für Ihr Konto erhalten.",
- "Clicca sul pulsante qui sotto per resettare la tua password:": "Klicken Sie auf die Schaltfläche unten, um Ihr Passwort zurückzusetzen:",
- "Oppure copia e incolla questo link nel tuo browser:": "Oder kopieren Sie diesen Link und fügen Sie ihn in Ihren Browser ein:",
- "Questo link scadrà tra 2 ore.": "Dieser Link läuft in 2 Stunden ab.",
- "Se non hai richiesto il reset della password, puoi ignorare questa email. Il tuo account rimane sicuro.": "Wenn Sie kein Zurücksetzen des Passworts angefordert haben, können Sie diese E-Mail ignorieren. Ihr Konto bleibt sicher.",
- "Ciao": "Hallo",
"Restituito": "Zurückgegeben",
+ "restituito": "zurückgegeben",
"Restituito in ritardo": "Verspätet zurückgegeben",
"Restituito regolarmente": "Fristgerecht zurückgegeben",
"Restituzione": "Rückgabe",
@@ -3007,10 +3385,10 @@
"Ricarica Dewey (seed)": "Dewey neu laden (Seed)",
"Ricarica Pagina": "Seite neu laden",
"Ricerca": "Suche",
- "Ricerca Libro": "Buch suchen",
- "Ricerca Utente": "Benutzer suchen",
"Ricerca in corso...": "Suche läuft...",
+ "Ricerca Libro": "Buch suchen",
"Ricerca rapida": "Schnellsuche",
+ "Ricerca Utente": "Benutzer suchen",
"Ricerche recenti": "Kürzliche Suchen",
"Riceverai un link di reset via email. Il link sarà valido per 24 ore.": "Sie erhalten einen Zurücksetzungslink per E-Mail. Der Link ist 24 Stunden gültig.",
"Riceverai una conferma via email appena la richiesta sarà approvata.": "Sie erhalten eine E-Mail-Bestätigung, sobald die Anfrage genehmigt wurde.",
@@ -3019,12 +3397,9 @@
"Ricevuto": "Empfangen",
"Richiede App:": "Erfordert App:",
"Richiede PHP:": "Erfordert PHP:",
- "Richiedi Prestito": "Ausleihe anfordern",
"Richiedi approvazione admin dopo la conferma email": "Administrator-Genehmigung nach E-Mail-Bestätigung erforderlich",
+ "Richiedi Prestito": "Ausleihe anfordern",
"Richiedono attenzione immediata": "Erfordern sofortige Aufmerksamkeit",
- "Richiesta Inviata!": "Anfrage gesendet!",
- "Richiesta Pendente": "Ausstehende Anfrage",
- "Richiesta Prestito": "Ausleihanfrage",
"Richiesta del %s": "Anfrage vom %s",
"Richiesta di prestito dal %1$s al %2$s": "Ausleihanfrage vom %1$s bis %2$s",
"Richiesta di prestito dal %s per 1 mese": "Ausleihanfrage ab %s für 1 Monat",
@@ -3032,18 +3407,23 @@
"Richiesta di prestito per \"%s\" da %s dal %s al %s": "Ausleihanfrage für \"%s\" von %s vom %s bis %s",
"Richiesta di prestito per \\": "Ausleihanfrage für \\",
"Richiesta fallita:": "Anfrage fehlgeschlagen:",
+ "richiesta in sospeso": "ausstehende Anfrage",
"Richiesta inviata con successo!": "Anfrage erfolgreich gesendet!",
+ "Richiesta Inviata!": "Anfrage gesendet!",
"Richiesta inviata!": "Anfrage gesendet!",
"Richiesta manuale": "Manuelle Anfrage",
+ "Richiesta Pendente": "Ausstehende Anfrage",
+ "Richiesta Prestito": "Ausleihanfrage",
"Richiesta prestito": "Ausleihanfrage",
"Richiesta rifiutata": "Anfrage abgelehnt",
- "Richieste Manuali": "Manuelle Anfragen",
- "Richieste Pendenti": "Ausstehende Anfragen",
"Richieste di Prestito": "Ausleihanfragen",
"Richieste di Prestito in Attesa": "Ausstehende Ausleihanfragen",
"Richieste in Attesa": "Ausstehende Anfragen",
"Richieste in Sospeso": "Ausstehende Anfragen",
"Richieste in sospeso": "Ausstehende Anfragen",
+ "richieste in sospeso": "ausstehende Anfragen",
+ "Richieste Manuali": "Manuelle Anfragen",
+ "Richieste Pendenti": "Ausstehende Anfragen",
"Richieste pendenti": "Ausstehende Anfragen",
"Richiesto": "Erforderlich",
"Richiesto il": "Angefordert am",
@@ -3054,9 +3434,9 @@
"Riepilogo Installazione": "Installationszusammenfassung",
"Riepilogo wishlist": "Wunschlisten-Zusammenfassung",
"Rifiuta": "Ablehnen",
- "Rifiuta Prestito?": "Ausleihe ablehnen?",
"Rifiuta non essenziali": "Nicht-essentielle ablehnen",
"Rifiuta prestito": "Ausleihe ablehnen",
+ "Rifiuta Prestito?": "Ausleihe ablehnen?",
"Rifiuta recensione": "Rezension ablehnen",
"Rifiutata": "Abgelehnt",
"Rifiutata il": "Abgelehnt am",
@@ -3064,12 +3444,14 @@
"Rifiuterai questa richiesta di prestito?": "Möchten Sie diese Ausleihanfrage ablehnen?",
"Riga %d (%s): %s": "Zeile %d (%s): %s",
"Riga %d: numero di colonne non corrispondente": "Zeile %d: Spaltenanzahl stimmt nicht überein",
- "Rigenera Sitemap": "Sitemap neu generieren",
"Rigenera adesso": "Jetzt neu generieren",
+ "Rigenera Sitemap": "Sitemap neu generieren",
+ "Rimuove la collana da tutti i libri. I libri non verranno eliminati.": "Entfernen Sie die Reihe von allen Büchern. Die Bücher werden nicht gelöscht.",
"Rimuovere dalla wishlist?": "Von der Wunschliste entfernen?",
"Rimuovere i libri associati prima di eliminare l'autore": "Entfernen Sie die zugehörigen Bücher, bevor Sie den Autor löschen",
"Rimuovere i libri dell'editore prima di eliminarlo": "Entfernen Sie die Bücher des Verlags, bevor Sie ihn löschen",
"Rimuovi": "Entfernen",
+ "Rimuovi classificazione Dewey": "Dewey-Klassifikation entfernen",
"Rimuovi dai Preferiti": "Aus Favoriten entfernen",
"Rimuovi dalla wishlist": "Von der Wunschliste entfernen",
"Rimuovi editore": "Verlag entfernen",
@@ -3078,15 +3460,19 @@
"Rimuovi immagine attuale": "Aktuelles Bild entfernen",
"Rimuovi immagine di sfondo attuale": "Aktuelles Hintergrundbild entfernen",
"Rimuovi logo attuale": "Aktuelles Logo entfernen",
+ "Rimuovi Token": "Token entfernen",
"Rimuovi tutti i filtri": "Alle Filter entfernen",
+ "Rimuovi volume?": "Band entfernen?",
"Rinnova": "Verlängern",
"Rinnova prestito (+14 giorni)": "Ausleihe verlängern (+14 Tage)",
"Rinnova prestito?": "Ausleihe verlängern?",
"Rinnovare il prestito? La scadenza verrà estesa di 14 giorni.": "Ausleihe verlängern? Das Fälligkeitsdatum wird um 14 Tage verlängert.",
"Rinnovi": "Verlängerungen",
- "Rinnovi Effettuati:": "Durchgeführte Verlängerungen:",
"Rinnovi effettuati": "Durchgeführte Verlängerungen",
+ "Rinnovi Effettuati:": "Durchgeführte Verlängerungen:",
"Rinnovo prestito fallito": "Ausleihverlängerung fehlgeschlagen",
+ "Rinomina": "Umbenennen",
+ "Rinomina collana": "Reihe umbenennen",
"Riordina trascinando gli elementi": "Durch Ziehen der Elemente neu anordnen",
"Ripara automaticamente gli errori rilevati": "Erkannte Fehler automatisch reparieren",
"Ripeti la password": "Passwort wiederholen",
@@ -3108,7 +3494,10 @@
"Risposta non valida dal servizio ISBN.": "Ungültige Antwort vom ISBN-Dienst.",
"Risposta non valida. Controlla la console per dettagli.": "Ungültige Antwort. Überprüfen Sie die Konsole für Details.",
"Risultati": "Ergebnisse",
+ "risultati": "Ergebnisse",
"Risultati per '%s' - Catalogo Biblioteca": "Ergebnisse für '%s' – Bibliothekskatalog",
+ "Risultati Ultimo Batch": "Ergebnisse des letzten Stapels",
+ "risultato": "Ergebnis",
"Ritiri da Confermare": "Zu bestätigende Abholungen",
"Ritiri scaduti elaborati": "Abgelaufene Abholungen verarbeitet",
"Ritiro annullato": "Abholung storniert",
@@ -3122,50 +3511,41 @@
"Ritiro scaduto": "Abholung abgelaufen",
"Ritiro scaduto il": "Abholung abgelaufen am",
"Rossi": "Mustermann",
+ "Route aggiornate con successo": "Routen erfolgreich aktualisiert",
"Route Comuni": "Allgemeine Routen",
"Route Tradotte": "Übersetzte Routen",
- "Route aggiornate con successo": "Routen erfolgreich aktualisiert",
"Ruolo": "Rolle",
"Ruolo:": "Rolle:",
- "SBN Italia - Integrato": "SBN Italien - Integriert",
- "SDK": "SDK",
- "SEO - Meta Description": "SEO – Meta-Beschreibung",
- "SEO Base": "SEO-Grundlagen",
- "SEO Base (Meta Tags)": "SEO-Grundlagen (Meta-Tags)",
- "SMTP (custom)": "SMTP (benutzerdefiniert)",
- "SMTP Host": "SMTP-Host",
- "SMTP Password": "SMTP-Passwort",
- "SMTP Personalizzato": "Benutzerdefiniertes SMTP",
- "SMTP Port": "SMTP-Port",
- "SMTP Username": "SMTP-Benutzername",
- "SMTP personalizzato": "Benutzerdefiniertes SMTP",
- "SSL": "SSL",
+ "Saltato": "Übersprungen",
"Salva": "Speichern",
"Salva API Key": "API-Schlüssel speichern",
"Salva Autore": "Autor speichern",
"Salva Configurazione": "Konfiguration speichern",
"Salva Contatti": "Kontakte speichern",
+ "Salva descrizione": "Beschreibung speichern",
"Salva Editore": "Verlag speichern",
+ "Salva filtri correnti": "Aktuelle Filter speichern",
"Salva Identità": "Identität speichern",
+ "Salva identità": "Identität speichern",
"Salva Impostazioni": "Einstellungen speichern",
"Salva Impostazioni Avanzate": "Erweiterte Einstellungen speichern",
- "Salva Libro": "Buch speichern",
- "Salva Lingua": "Sprache speichern",
- "Salva Modifiche": "Änderungen speichern",
- "Salva Privacy Policy": "Datenschutzerklärung speichern",
- "Salva Route": "Routen speichern",
- "Salva Template": "Vorlage speichern",
- "Salva Testi Cookie Banner": "Cookie-Banner-Texte speichern",
- "Salva filtri correnti": "Aktuelle Filter speichern",
- "Salva identità": "Identität speichern",
+ "Salva impostazioni condivisione": "Freigabeeinstellungen speichern",
"Salva impostazioni email": "E-Mail-Einstellungen speichern",
"Salva impostazioni etichette": "Etiketteneinstellungen speichern",
"Salva in UTF-8": "Als UTF-8 speichern",
"Salva la API key in un luogo sicuro. Non sarà possibile visualizzarla nuovamente dopo la creazione.": "Speichern Sie den API-Schlüssel an einem sicheren Ort. Er kann nach der Erstellung nicht erneut angezeigt werden.",
+ "Salva Libro": "Buch speichern",
+ "Salva Lingua": "Sprache speichern",
+ "Salva Modifiche": "Änderungen speichern",
"Salva modifiche": "Änderungen speichern",
"Salva modifiche Homepage": "Homepage-Änderungen speichern",
+ "Salva Privacy Policy": "Datenschutzerklärung speichern",
+ "Salva Route": "Routen speichern",
+ "Salva su Pocket": "Auf Pocket speichern",
+ "Salva Template": "Vorlage speichern",
"Salva template": "Vorlage speichern",
"Salva testi banner": "Banner-Texte speichern",
+ "Salva Testi Cookie Banner": "Cookie-Banner-Texte speichern",
"Salva utente": "Benutzer speichern",
"Salvataggio in corso...": "Wird gespeichert...",
"Salvataggio...": "Wird gespeichert...",
@@ -3173,6 +3553,7 @@
"Sarà pubblicata dopo l'approvazione di un amministratore.": "Wird nach der Genehmigung durch einen Administrator veröffentlicht.",
"Sarà utilizzata per accedere al sistema": "Wird für die Anmeldung am System verwendet",
"Sarà visualizzato nell'header e in tutto il sito": "Wird in der Kopfzeile und auf der gesamten Website angezeigt",
+ "SBN Italia - Integrato": "SBN Italien - Integriert",
"Scade": "Läuft ab",
"Scadenza": "Fälligkeitsdatum",
"Scadenza Mancante": "Fehlendes Fälligkeitsdatum",
@@ -3188,44 +3569,46 @@
"Scaduto il:": "Abgelaufen am:",
"Scaffale": "Regal",
"Scaffale *": "Regal *",
- "Scaffale Narrativa": "Belletristik-Regal",
"Scaffale creato": "Schrank erstellt",
"Scaffale eliminato": "Schrank gelöscht",
+ "Scaffale Narrativa": "Belletristik-Regal",
"Scaffale obbligatorio": "Schrank erforderlich",
"Scaffali": "Regale",
"Scaffali e mensole": "Regale und Regalböden",
"Scarica": "Herunterladen",
"Scarica Audiobook": "Hörbuch herunterladen",
- "Scarica Errori": "Fehler herunterladen",
- "Scarica JSON": "JSON herunterladen",
- "Scarica PDF": "PDF herunterladen",
- "Scarica Ricevuta PDF": "PDF-Quittung herunterladen",
- "Scarica Script SQL": "SQL-Skript herunterladen",
"Scarica automaticamente la ricevuta PDF dopo la creazione del prestito.": "Die PDF-Quittung nach der Erstellung der Ausleihe automatisch herunterladen.",
"Scarica copertine": "Cover abrufen",
"Scarica eBook": "eBook herunterladen",
+ "Scarica Errori": "Fehler herunterladen",
"Scarica esempio_import_libri.csv": "beispiel_import_buecher.csv herunterladen",
"Scarica il CSV di esempio con 3 libri già compilati per capire il formato corretto e iniziare subito.": "Laden Sie die Beispiel-CSV-Datei mit 3 vorausgefüllten Büchern herunter, um das richtige Format zu verstehen und sofort loszulegen.",
"Scarica il file CSV di esempio": "Beispiel-CSV-Datei herunterladen",
"Scarica il report CSV per analizzare gli errori in dettaglio": "Laden Sie den CSV-Bericht herunter, um Fehler im Detail zu analysieren",
+ "Scarica JSON": "JSON herunterladen",
"Scarica l'eBook in formato digitale": "Das eBook im digitalen Format herunterladen",
+ "Scarica PDF": "PDF herunterladen",
+ "Scarica Ricevuta PDF": "PDF-Quittung herunterladen",
"Scarica ricevuta PDF": "PDF-Quittung herunterladen",
+ "Scarica Script SQL": "SQL-Skript herunterladen",
"Scaricamento copertine...": "Cover werden abgerufen...",
"Scarso": "Mangelhaft",
"Scegli": "Auswählen",
- "Scegli Icona Font Awesome": "Font Awesome Icon auswählen",
"Scegli come inviare le email dal sistema. Puoi usare la funzione PHP mail(), PHPMailer o un server SMTP esterno.": "Wählen Sie, wie E-Mails vom System gesendet werden sollen. Sie können die PHP-Funktion mail(), PHPMailer oder einen externen SMTP-Server verwenden.",
"Scegli come inviare le email dal sistema. Puoi usare la funzione PHP chmod +x cron/automatic-notifications.php": "Überprüfen Sie die Ausführungsberechtigungen: chmod +x cron/automatic-notifications.php",
"Verifica in corso...": "Überprüfung läuft...",
"Verifica installazione...": "Installation wird überprüft...",
+ "Verifica Leggibilità": "Lesbarkeit prüfen",
"Verifica reCAPTCHA fallita. Riprova.": "reCAPTCHA-Überprüfung fehlgeschlagen. Bitte versuchen Sie es erneut.",
"Verifica versioni": "Versionen prüfen",
"Verificato": "Verifiziert",
+ "verranno automaticamente selezionati.": "werden automatisch ausgewählt.",
"Verrà creato automaticamente un backup prima dell'aggiornamento.": "Vor der Aktualisierung wird automatisch ein Backup erstellt.",
"Verrà creato un backup completo del database.": "Es wird ein vollständiges Datenbank-Backup erstellt.",
"Versione": "Version",
@@ -3898,26 +4287,37 @@
"Via, numero...": "Straße, Nummer...",
"Video": "Video",
"Video tutorial": "Video-Tutorial",
+ "Vinile": "Schallplatte",
"Visibile": "Sichtbar",
"Visibile pubblicamente sulla pagina contatti": "Öffentlich sichtbar auf der Kontaktseite",
- "Visibilità Sezione Eventi": "Sichtbarkeit des Veranstaltungsbereichs",
+ "Visibilita": "Sichtbarkeit",
+ "Visibilità": "Sichtbarkeit",
"Visibilità aggiornata!": "Sichtbarkeit aktualisiert!",
+ "Visibilità nel Frontend": "Frontend-Sichtbarkeit",
+ "Visibilità Sezione Eventi": "Sichtbarkeit des Veranstaltungsbereichs",
"Visita il sito ufficiale": "Offizielle Website besuchen",
"Vista griglia": "Rasteransicht",
"Vista tabella": "Tabellenansicht",
"Visualizza": "Anzeigen",
- "Visualizza Libro": "Buch anzeigen",
- "Visualizza Tutte le Categorie": "Alle Kategorien anzeigen",
- "Visualizza Tutto il Catalogo": "Gesamten Katalog anzeigen",
"Visualizza dettagli": "Details anzeigen",
"Visualizza dettagli libro": "Buchdetails anzeigen",
"Visualizza e esporta l'elenco dei libri per posizione fisica": "Bücherliste nach physischem Standort anzeigen und exportieren",
"Visualizza e gestisci tutti i prestiti della biblioteca": "Alle Ausleihen der Bibliothek anzeigen und verwalten",
"Visualizza la cronologia degli import CSV e LibraryThing con report errori dettagliati": "Zeigen Sie den Verlauf der CSV- und LibraryThing-Importe mit detaillierten Fehlerberichten an",
+ "Visualizza Libro": "Buch anzeigen",
"Visualizza pagina live": "Live-Seite anzeigen",
+ "Visualizza Tutte le Categorie": "Alle Kategorien anzeigen",
+ "Visualizza Tutto il Catalogo": "Gesamten Katalog anzeigen",
+ "Visualizzatore PDF": "PDF-Viewer",
"Visualizzazione da _START_ a _END_ di _TOTAL_ libri": "Anzeige von _START_ bis _END_ von _TOTAL_ Büchern",
"Visualizzazione gerarchica di generi e sottogeneri": "Hierarchische Ansicht von Genres und Untergenres",
+ "visualizzazione per copia": "Ansicht nach Exemplar",
"Voci totali": "Einträge gesamt",
+ "Volume aggiunto": "Band hinzugefügt",
+ "Volume rimosso": "Band entfernt",
+ "volumi": "Bände",
+ "Volumi": "Bände",
+ "Volumi di quest'opera": "Bände dieses Werks",
"Vuoi aggiornare il libro \"${title}\"?": "Möchten Sie das Buch \"${title}\" aktualisieren?",
"Vuoi aggiornare il libro \"%s\"?": "Möchten Sie das Buch \"%s\" aktualisieren?",
"Vuoi aggiornare lo stato di questa copia?": "Möchten Sie den Status dieses Exemplars aktualisieren?",
@@ -3943,170 +4343,9 @@
"Working...": "In Bearbeitung...",
"Yes, fix": "Ja, beheben",
"Yes, run": "Ja, ausführen",
+ "Z-Library": "Z-Library",
"Zona Pericolosa": "Gefahrenbereich",
- "acquisto": "Kauf",
- "agosto": "August",
- "al": "bis",
- "altamente consigliato": "dringend empfohlen",
- "aprile": "April",
- "attivata": "aktiviert",
- "autori": "Autoren",
- "autori. Questa azione non può essere annullata.": "Autoren. Diese Aktion kann nicht rückgängig gemacht werden.",
- "autori. Tutti i libri verranno assegnati all'autore risultante.": "Autoren. Alle Bücher werden dem resultierenden Autor zugeordnet.",
- "biblioteca, prestito libri, catalogo online, scopri libri, prenotazioni": "Bibliothek, Buchausleihe, Online-Katalog, Bücher entdecken, Vormerkungen",
- "bottoni nelle card": "Schaltflächen in Karten",
- "bottoni principali": "Hauptschaltflächen",
- "chiavi": "Schlüssel",
- "chiavi tradotte": "übersetzte Schlüssel",
- "classe principale": "Hauptklasse",
- "come nuovo autore": "als neuer Autor",
- "completamento": "Abschluss",
- "con successo": "erfolgreich",
- "copi": "Exemplar(e)",
- "copia": "Exemplar",
- "copie": "Exemplare",
- "crontab -e": "crontab -e",
- "danneggiato": "beschädigt",
- "della lingua desiderata.": "der gewünschten Sprache.",
- "deve iniziare con": "muss beginnen mit",
- "di": "von",
- "di %s": "von %s",
- "dicembre": "Dezember",
- "directory": "Verzeichnisse",
- "disattivata": "deaktiviert",
- "disponibile": "verfügbar",
- "disponibili ora": "jetzt verfügbar",
- "donazione": "Spende",
- "dopo aver completato l'installazione.": "nach Abschluss der Installation.",
- "eBook (PDF/ePub)": "eBook (PDF/ePub)",
- "eBook caricato!": "eBook hochgeladen!",
- "eBook disponibile": "eBook verfügbar",
- "editori": "Verlage",
- "editori. Questa azione non può essere annullata.": "Verlage. Diese Aktion kann nicht rückgängig gemacht werden.",
- "editori. Tutti i libri verranno assegnati all'editore risultante.": "Verlage. Alle Bücher werden dem resultierenden Verlag zugeordnet.",
- "elementi": "Elemente",
- "elemento": "Element",
- "elimina la cartella": "den Ordner löschen",
- "errore di comunicazione con il server": "Kommunikationsfehler mit dem Server",
- "es. 0.450": "z. B. 0,450",
- "es. 15": "z. B. 15",
- "es. 19.90": "z. B. 19,90",
- "es. 2020": "z. B. 2020",
- "es. 2024": "z. B. 2024",
- "es. 2025": "z. B. 2025",
- "es. 21x14 cm": "z. B. 21x14 cm",
- "es. 26 agosto 2025": "z. B. 26. August 2025",
- "es. 320": "z. B. 320",
- "es. 599.9, 004.6782, 641.5945": "z.B. 599.9, 004.6782, 641.5945",
- "es. 599.9, 004.6782, 641.5945, 599.1": "z.B. 599.9, 004.6782, 641.5945, 599.1",
- "es. 8842935786": "z. B. 8842935786",
- "es. 978-88-429-3578-0": "z. B. 978-88-429-3578-0",
- "es. 9788842935780": "z. B. 9788842935780",
- "es. Acquisto, Donazione, Prestito": "z. B. Kauf, Spende, Ausleihe",
- "es. Biblioteca Civica": "z. B. Stadtbibliothek",
- "es. Copertina rigida, Brossura": "z. B. Hardcover, Taschenbuch",
- "es. Fantasy contemporaneo": "z. B. Zeitgenössische Fantasy",
- "es. Gianni De Conno": "z. B. Gianni De Conno",
- "es. I Classici": "z. B. Die Klassiker",
- "es. INV-2024-001": "z. B. INV-2024-001",
- "es. Integrazione Sito Web": "z. B. Website-Integration",
- "es. Italiano, Inglese": "z. B. Italienisch, Englisch",
- "es. La morale anarchica": "z. B. Die anarchistische Moral",
- "es. Mario Rossi": "z. B. Max Mustermann",
- "es. Noir mediterraneo": "z. B. Mediterraner Noir",
- "es. Prima edizione": "z. B. Erstausgabe",
- "es. RSSMRA80A01H501U": "z. B. RSSMRA80A01H501U",
- "es. Urban fantasy": "z. B. Urban Fantasy",
- "es. noreply@biblioteca.local": "z. B. noreply@bibliothek.local",
- "es. romanzo, fantasy, avventura (separare con virgole)": "z. B. Roman, Fantasy, Abenteuer (mit Kommas trennen)",
- "eventi": "Veranstaltungen",
- "eventi, biblioteca, cultura": "Veranstaltungen, Bibliothek, Kultur",
- "fallite.": "fehlgeschlagen.",
- "fas fa-users": "fas fa-users",
- "febbraio": "Februar",
- "gennaio": "Januar",
- "giorni prima della scadenza": "Tage vor Ablauf",
- "giugno": "Juni",
- "https://www.editore.com": "https://www.verlag.de",
- "icone disponibili": "verfügbare Symbole",
- "in attesa": "ausstehend",
- "in_corso": "laufend",
- "in_ritardo": "überfällig",
- "info@editore.com": "info@verlag.de",
- "installazione inglese usa": "Englische Installation verwendet",
- "kg": "kg",
- "libri": "Bücher",
- "libri eliminati": "Bücher gelöscht",
- "libri trovati": "Bücher gefunden",
- "libri. Questa azione non può essere annullata.": "Bücher. Diese Aktion kann nicht rückgängig gemacht werden.",
- "libro": "Buch",
- "libro trovato": "Buch gefunden",
- "linea": "Zeile",
- "lingue": "Sprachen",
- "lingue. Errori:": "Sprachen. Fehler:",
- "link, accenti": "Links, Akzente",
- "luglio": "Juli",
- "maggio": "Mai",
- "manutenzione": "Wartung",
- "mario.rossi@email.it": "max.mustermann@email.de",
- "marzo": "März",
- "minuti fa": "vor Minuten",
- "nell'header. Non includere i tag": "im Header. Fügen Sie keine Tags ein",
- "nella directory dell'applicazione.": "im Anwendungsverzeichnis.",
- "nella nostra biblioteca.": "in unserer Bibliothek.",
- "nella root del progetto impedisce qualsiasi accesso non autorizzato.": "im Projektstammverzeichnis verhindert jeden unbefugten Zugriff.",
- "non può contenere spazi": "darf keine Leerzeichen enthalten",
- "non può essere vuota": "darf nicht leer sein",
- "novembre": "November",
- "o multipli separati da |": "oder mehrere getrennt durch |",
- "o multipli: Engels;Marx": "oder mehrere: Engels;Marx",
- "opzionale": "optional",
- "opzionali": "optional",
- "ordine:": "Reihenfolge:",
- "ore fa": "vor Stunden",
- "ottobre": "Oktober",
- "pagina": "Seite",
- "pagine": "Seiten",
- "per conformità GDPR.": "zur DSGVO-Konformität.",
- "per evitare blocchi (delay di 3 secondi tra ogni richiesta).": "um Blockierungen zu vermeiden (3 Sekunden Verzögerung zwischen jeder Anfrage).",
- "per il giorno": "für den Tag",
- "per pagina": "pro Seite",
- "perso": "verloren",
- "preferiti": "Favoriten",
- "premi Invio per crearne uno nuovo.": "drücken Sie die Eingabetaste, um einen neuen zu erstellen.",
- "prenotato": "vorgemerkt",
- "prenotazione attiva": "aktive Vormerkung",
- "prenotazioni": "Vormerkungen",
- "prenotazioni attive": "aktive Vormerkungen",
- "prestato": "ausgeliehen",
- "prestiti attivi": "aktive Ausleihen",
- "prestiti passati": "vergangene Ausleihen",
- "prestiti totali": "Ausleihen gesamt",
- "prestito attivo": "aktive Ausleihe",
- "prestito passato": "vergangene Ausleihe",
- "prima di procedere.": "bevor Sie fortfahren.",
- "recensione": "Rezension",
- "recensioni": "Rezensionen",
- "referente@editore.com": "kontakt@verlag.de",
- "restituito": "zurückgegeben",
- "richiesta in sospeso": "ausstehende Anfrage",
- "richieste in sospeso": "ausstehende Anfragen",
- "risultati": "Ergebnisse",
- "risultato": "Ergebnis",
- "secondi (min: 5, max: 60)": "Sekunden (min: 5, max: 60)",
- "seleziona": "durchsuchen",
- "seleziona file": "Datei auswählen",
- "selezionati": "ausgewählt",
- "sessioni attive": "aktive Sitzungen",
- "settembre": "September",
- "sfoglia": "durchsuchen",
- "sottogeneri": "Untergenres",
- "sul server tramite SSH.": "auf dem Server über SSH.",
- "titoli": "Titel",
- "utente@example.com": "benutzer@beispiel.de",
- "utenti": "Benutzer",
- "verranno automaticamente selezionati.": "werden automatisch ausgewählt.",
- "visualizzazione per copia": "Ansicht nach Exemplar",
+ "È uno standard emergente (llmstxt.org) che fornisce ai motori AI un sommario strutturato del sito in formato Markdown. Quando attivo, il file viene generato dinamicamente con le statistiche della biblioteca, le pagine pubbliche e le informazioni API.": "Ein aufkommender Standard (
llmstxt.org), der KI-Systemen eine strukturierte Markdown-Zusammenfassung der Website bereitstellt. Wenn aktiviert, wird die Datei dynamisch mit Bibliotheksstatistiken, öffentlichen Seiten und API-Informationen generiert.",
"Български (BG)": "Bulgarisch (BG)",
"עברית (HE)": "Hebräisch (HE)",
"– Nessuno –": "– Keine –",
@@ -4124,49 +4363,5 @@
"💡 Non hai accesso SSH?": "💡 Sie haben keinen SSH-Zugang?",
"📋 Importante: Devi elencare manualmente i cookie tracciati da questi script nella
Pagina Cookie per conformità GDPR.": "📋 Wichtig: Sie müssen die von diesen Skripten erfassten Cookies manuell auf der
Cookie-Seite auflisten, um die DSGVO-Konformität zu gewährleisten.",
"📋 Istruzioni SSH (Click per espandere/chiudere)": "📋 SSH-Anleitung (Klicken zum Ein-/Ausklappen)",
- "🔒 Sicurezza Importante": "🔒 Wichtige Sicherheit",
- "Leggi PDF": "PDF lesen",
- "Chiudi Visualizzatore": "Viewer schließen",
- "Visualizzatore PDF": "PDF-Viewer",
- "Usa la funzione di ricerca del browser per trovare testo nel documento": "Verwenden Sie die Suchfunktion des Browsers, um Text im Dokument zu finden",
- "Usa il controllo schermo intero del viewer o del browser": "Verwenden Sie die Vollbildsteuerung des Viewers oder Browsers",
- "Condivisione": "Teilen",
- "Seleziona i pulsanti di condivisione da mostrare nella pagina del libro.": "Wählen Sie die Teilen-Schaltflächen aus, die auf der Buchseite angezeigt werden sollen.",
- "Nessun pulsante selezionato": "Keine Schaltflächen ausgewählt",
- "Salva impostazioni condivisione": "Freigabeeinstellungen speichern",
- "Impostazioni di condivisione aggiornate.": "Freigabeeinstellungen aktualisiert.",
- "Condividi su X": "Auf X teilen",
- "Condividi su Telegram": "Auf Telegram teilen",
- "Condividi su LinkedIn": "Auf LinkedIn teilen",
- "Condividi su Reddit": "Auf Reddit teilen",
- "Condividi su Pinterest": "Auf Pinterest teilen",
- "Condividi su Threads": "Auf Threads teilen",
- "Condividi su Bluesky": "Auf Bluesky teilen",
- "Condividi su Tumblr": "Auf Tumblr teilen",
- "Salva su Pocket": "Auf Pocket speichern",
- "Condividi su VK": "Auf VK teilen",
- "Condividi su LINE": "Auf LINE teilen",
- "Invia via SMS": "Per SMS senden",
- "Invia per email": "Per E-Mail senden",
- "Copia link": "Link kopieren",
- "Collezione: %d libri, %d autori, %d editori.": "Sammlung: %d Bücher, %d Autoren, %d Verlage.",
- "Catalogo bibliotecario gestito con [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Disponibile in: %s.": "Bibliothekskatalog betrieben mit [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Verfügbar in: %s.",
- "Pagine Principali": "Hauptseiten",
- "Sfoglia e cerca la collezione completa": "Die gesamte Buchsammlung durchsuchen",
- "Informazioni sulla biblioteca": "Über diese Bibliothek",
- "Calendario eventi culturali": "Kulturveranstaltungskalender",
- "Informativa sulla privacy": "Datenschutzerklärung",
- "Feed e Scoperta": "Feeds & Entdecken",
- "Feed RSS": "RSS-Feed",
- "Ultime aggiunte al catalogo (RSS 2.0)": "Neueste Katalogeinträge (RSS 2.0)",
- "Indice completo degli URL": "Vollständiges URL-Verzeichnis",
- "Interoperabilità bibliotecaria (MARCXML, Dublin Core)": "Bibliotheksinteroperabilität (MARCXML, Dublin Core)",
- "Autenticazione utente": "Benutzeranmeldung",
- "Registrazione nuovo utente": "Neue Benutzerregistrierung",
- "Genera automaticamente un file llms.txt per rendere la biblioteca comprensibile ai modelli linguistici (LLM)": "Automatische Generierung einer llms.txt-Datei, damit die Bibliothek für große Sprachmodelle (LLMs) verständlich wird",
- "Cos'è llms.txt:": "Was ist llms.txt:",
- "È uno standard emergente (
llmstxt.org) che fornisce ai motori AI un sommario strutturato del sito in formato Markdown. Quando attivo, il file viene generato dinamicamente con le statistiche della biblioteca, le pagine pubbliche e le informazioni API.": "Ein aufkommender Standard (
llmstxt.org), der KI-Systemen eine strukturierte Markdown-Zusammenfassung der Website bereitstellt. Wenn aktiviert, wird die Datei dynamisch mit Bibliotheksstatistiken, öffentlichen Seiten und API-Informationen generiert.",
- "Abilita llms.txt": "llms.txt aktivieren",
- "Rende disponibile /llms.txt e lo aggiunge a robots.txt": "Macht /llms.txt verfügbar und fügt es zur robots.txt hinzu",
- "Disattivato": "Deaktiviert"
+ "🔒 Sicurezza Importante": "🔒 Wichtige Sicherheit"
}
diff --git a/locale/en_US.json b/locale/en_US.json
index 37d825d9..def7d7a5 100644
--- a/locale/en_US.json
+++ b/locale/en_US.json
@@ -2,7 +2,20 @@
"\"%s\" prestato a %s è in ritardo di %d giorni": "\"%s\" loaned to %s is %d days overdue",
"$1": "$1",
"$2": "$2",
- "%d Problemi": "%d Issues",
+ "%d autori eliminati": "%d authors deleted",
+ "%d copie disponibili su %d": "%d copies available out of %d",
+ "%d editori eliminati": "%d publishers deleted",
+ "%d file sensibili protetti": "%d sensitive files protected",
+ "%d giorni": "%d days",
+ "%d import logs eliminati (più vecchi di %d giorni)": "%d import logs deleted (older than %d days)",
+ "%d import registrati": "%d imports recorded",
+ "%d import registrato": "%d import recorded",
+ "%d indici creati con successo": "%d indexes created successfully",
+ "%d Indici Mancanti": "%d Missing Indexes",
+ "%d indici mancanti trovati": "%d missing indexes found",
+ "%d libri assegnati alla collana \"%s\"": "%d books assigned to series \"%s\"",
+ "%d libri eliminati": "%d books deleted",
+ "%d libri importati, %d aggiornati": "%d books imported, %d updated",
"%d minuti fa": "%d minutes ago",
"%d minuto fa": "%d minute ago",
"%d notifica non letta": "%d unread notification",
@@ -17,21 +30,37 @@
"%d prestito attivo": "%d active loan",
"%d prestito in ritardo": "%d overdue loan",
"%d prestito passato": "%d past loan",
+ "%d Problemi": "%d Issues",
"%d problemi rilevati": "%d issues detected",
"%d recensione": "%d review",
"%d recensioni": "%d reviews",
"%d richiesta in sospeso": "%d pending request",
"%d richieste in sospeso": "%d pending requests",
+ "%d tabelle create con successo": "%d tables created successfully",
+ "%d Tabelle Mancanti": "%d Missing Tables",
"%d titoli": "%d titles",
+ "%s deve essere di almeno 8 caratteri": "%s must be at least 8 characters",
"%s ha prenotato \"%s\"": "%s has reserved \"%s\"",
+ "%s non può superare i 72 caratteri": "%s cannot exceed 72 characters",
+ "%s non è valido": "%s is not valid",
+ "%s è richiesta": "%s is required",
+ "%s è richiesto": "%s is required",
+ "(codici ISO e nomi inglesi accettati)": "(ISO codes and English names accepted)",
"(filtrati da _MAX_ libri totali)": "(filtered from _MAX_ total books)",
- "(opzionale - URL completo)": "(optional - full URL)",
"(opzionale - max 160 caratteri)": "(optional - max 160 characters)",
+ "(opzionale - max 200 caratteri)": "(optional - max 200 characters)",
"(opzionale - max 60 caratteri)": "(optional - max 60 characters)",
+ "(opzionale - max 70 caratteri)": "(optional - max 70 characters)",
"(opzionale - separate da virgola)": "(optional - comma separated)",
+ "(opzionale - URL completo)": "(optional - full URL)",
+ "(opzionale)": "(optional)",
+ "(percorso legacy)": "(legacy path)",
"+ 15 campi aggiuntivi disponibili (vedi CSV di esempio)": "+ 15 additional fields available (see example CSV)",
+ "+ Aggiungi da preset...": "+ Add from preset...",
"+39 02 1234567": "+1 (555) 123-4567",
"+39 123 456 7890": "+1 123 456 7890",
+ ", %d autori creati": ", %d authors created",
+ ", %d editori creati": ", %d publishers created",
", %d errori": ", %d errors",
", %d libri arricchiti con scraping": ", %d books enriched via scraping",
"-- Seleziona --": "-- Select --",
@@ -44,6 +73,8 @@
"// Script marketing (es. Facebook Pixel)\n// Esempio Facebook Pixel:\n// !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n// n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;\n// n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;\n// t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,\n// document,'script','https://connect.facebook.net/en_US/fbevents.js');\n// fbq('init', 'YOUR_PIXEL_ID');\n// fbq('track', 'PageView');": "// Marketing scripts (e.g. Facebook Pixel)\n// Facebook Pixel Example:\n// !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n// n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;\n// n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;\n// t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,\n// document,'script','https://connect.facebook.net/en_US/fbevents.js');\n// fbq('init', 'YOUR_PIXEL_ID');\n// fbq('track', 'PageView');",
"/catalogo": "/catalog",
"0-10 libri": "0-10 books",
+ "1 copia disponibile su %d": "1 copy available out of %d",
+ "1 evento": "1 event",
"1. Accesso al server": "1. Server Access",
"1. Collegati al server via SSH:": "1. Connect to the server via SSH:",
"101-500 libri": "101-500 books",
@@ -56,156 +87,134 @@
": attiva per ordinare la colonna in ordine crescente": ": activate to sort column ascending",
": attiva per ordinare la colonna in ordine decrescente": ": activate to sort column descending",
"A": "A",
- "API": "API",
- "API Keys": "API Keys",
- "API Pubblica": "Public API",
- "API abilitata con successo.": "API enabled successfully.",
- "API disabilitata con successo.": "API disabled successfully.",
- "API key creata con successo.": "API key created successfully.",
- "API key eliminata con successo.": "API key deleted successfully.",
- "AVVISO Trigger:": "Trigger WARNING:",
+ "AA Testo Grande": "AA Large Text",
+ "Abbiamo ricevuto una richiesta di reset della password per il tuo account.": "We received a request to reset the password for your account.",
"Abilita": "Enable",
+ "Abilita Client SRU": "Enable SRU Client",
"Abilita Cookie Banner": "Enable Cookie Banner",
+ "Abilita HSTS": "Enable HSTS",
+ "Abilita l'arricchimento automatico tramite cron. I libri verranno arricchiti in background a intervalli regolari.": "Enable automatic enrichment via cron. Books will be enriched in the background at regular intervals.",
+ "Abilita llms.txt": "Enable llms.txt",
"Abilita Modalità Catalogo": "Enable Catalogue Mode",
"Abilita Modalità Solo Catalogo": "Enable Catalogue Only Mode",
"Abilita o disabilita l'accesso all'API pubblica": "Enable or disable public API access",
- "Abilitata - Visibile nel frontend": "Enabled - Visible in frontend",
+ "Abilita Plugin": "Enable Plugin",
+ "Abilita Server SRU": "Enable SRU Server",
"Abilitata": "Enabled",
+ "Abilitata - Visibile nel frontend": "Enabled - Visible in frontend",
"Abilitato": "Enabled",
"Accedi": "Login",
- "Directory Upload Pubblici": "Public Uploads Directory",
"Accedi a /installer/?force=1 per forzare una reinstallazione": "Go to /installer/?force=1 to force a reinstallation",
"Accedi al server tramite SSH e modifica il crontab:": "Access the server via SSH and edit the crontab:",
"Accedi al tuo account": "Sign in to your account",
"Accedi all'area admin con le credenziali sopra indicate": "Log in to the admin area with the credentials above",
+ "Accedi e Procedi": "Login and Continue",
"Accedi per aggiungere ai Preferiti": "Log in to add to Favorites",
+ "Accedi per Prenotare": "Login to Reserve",
+ "Accento": "Accent",
"Accesso": "Login",
- "Accesso Richiesto": "Login Required",
"Accesso in corso...": "Signing in...",
+ "Accesso negato. Permessi insufficienti.": "Access denied. Insufficient permissions.",
"Accesso non autorizzato": "Unauthorized access",
+ "Accesso Richiesto": "Login Required",
"Accetta selezionati": "Accept Selected",
"Accetta tutti": "Accept All",
"Accetto la": "I accept the",
"Account": "Account",
- "Account In Attesa": "Pending Account",
- "Account Sospeso": "Suspended Account",
+ "Account attivato": "Account activated",
"Account creato con successo! Verifica la tua email.": "Account created successfully! Check your email.",
"Account creato! In attesa di approvazione da parte dell'amministratore.": "Account created! Awaiting administrator approval.",
+ "Account In Attesa": "Pending Account",
+ "Account Sospeso": "Suspended Account",
+ "Acquisito a": "Acquired at",
+ "Acquisito da": "Acquired from",
"Acquisto": "Purchase",
+ "acquisto": "purchase",
"Adesso": "Just now",
"Admin": "Admin",
"Admin Dewey": "Dewey Admin",
"Aggiorna": "Refresh",
+ "Aggiorna da ISBN": "Update from ISBN",
"Aggiorna Dati": "Update Data",
"Aggiorna Evento": "Update Event",
- "Aggiorna Statistiche": "Refresh Statistics",
- "Aggiorna da ISBN": "Update from ISBN",
"Aggiorna i dettagli del libro:": "Update book details:",
"Aggiorna i dettagli dell'autore: %s": "Update author details: %s",
"Aggiorna i dettagli dell'editore:": "Update publisher details:",
+ "Aggiorna il conteggio delle copie disponibili": "Update available copy counts",
"Aggiorna le informazioni del profilo selezionato.": "Update selected profile information.",
- "Aggiorna password": "Update password",
"Aggiorna Ora": "Update Now",
+ "Aggiorna password": "Update password",
+ "Aggiorna Statistiche": "Refresh Statistics",
+ "Aggiornamenti": "Updates",
"Aggiornamento alla versione %s completato": "Update to version %s completed",
- "Aggiornamento completato!": "Update completed!",
"Aggiornamento completato con successo": "Update completed successfully",
+ "Aggiornamento completato!": "Update completed!",
+ "Aggiornamento disponibile!": "Update available!",
"Aggiornamento fallito": "Update failed",
"Aggiornamento già in corso": "Update already in progress",
- "Avvio aggiornamento": "Starting update",
- "Avvio backup database": "Starting database backup",
- "Backup completato": "Backup completed",
- "Backup database completato": "Database backup completed",
- "Backup tabella": "Backing up table",
- "Download completato": "Download completed",
- "Errore backup database": "Database backup error",
- "Errore fatale durante aggiornamento": "Fatal error during update",
- "Impossibile aprire file di backup per scrittura": "Unable to open backup file for writing",
- "Impossibile creare lock file": "Unable to create lock file",
- "Installazione completata": "Installation completed",
- "Memory limit aumentato": "Memory limit increased",
- "Modalità manutenzione rimossa automaticamente (scaduta)": "Maintenance mode automatically removed (expired)",
- "Step 1: Creazione backup": "Step 1: Creating backup",
- "Step 2: Download aggiornamento": "Step 2: Downloading update",
- "Step 3: Installazione aggiornamento": "Step 3: Installing update",
- "Trovate tabelle da backuppare": "Found tables to backup",
- "Errore SQL durante migrazione %s: %s": "SQL error during migration %s: %s",
- "Errore preparazione query migrazioni": "Error preparing migrations query",
- "Errore recupero risultati migrazioni": "Error fetching migrations results",
- "Errore recupero batch migrazioni": "Error fetching migrations batch",
- "Errore preparazione insert migrazione": "Error preparing migration insert",
- "Errore creazione tabella migrazioni": "Error creating migrations table",
- "Errore creazione tabella update_logs": "Error creating update_logs table",
- "Errore nel recupero delle tabelle": "Error retrieving tables",
- "Errore nel recupero struttura tabella %s": "Error retrieving structure for table %s",
- "Errore nel recupero dati tabella %s": "Error retrieving data for table %s",
- "Pacchetto di aggiornamento non valido: manca %s": "Invalid update package: missing %s",
- "Errore preparazione log aggiornamento": "Error preparing update log",
- "Errore preparazione completamento log": "Error preparing log completion",
- "Errore aggiornamento log": "Error updating log",
- "URL di download non trovato": "Download URL not found",
- "File di aggiornamento non valido": "Invalid update file",
- "Impossibile creare directory di backup": "Unable to create backup directory",
- "Impossibile creare directory di backup applicazione": "Unable to create application backup directory",
- "Impossibile creare directory di backup: %s": "Unable to create backup directory: %s",
- "Impossibile creare directory temporanea": "Unable to create temporary directory",
- "Impossibile salvare il file di aggiornamento": "Unable to save update file",
- "Impossibile creare il file di lock per l'aggiornamento": "Unable to create update lock file",
- "Estrazione del pacchetto fallita": "Package extraction failed",
- "Impossibile scrivere file di backup": "Unable to write backup file",
- "Directory sorgente non trovata": "Source directory not found",
- "Impossibile recuperare informazioni sulla release": "Unable to retrieve release information",
- "Impossibile connettersi a GitHub": "Unable to connect to GitHub",
- "Percorso non valido nel pacchetto: %s": "Invalid path in package: %s",
- "Impossibile creare directory: %s": "Unable to create directory: %s",
- "Errore nella copia del file: %s": "Error copying file: %s",
- "Errore durante il controllo": "Error during check",
- "Aggiornamento in corso...": "Updating...",
"Aggiornamento in corso. Riprova tra qualche minuto.": "Update in progress. Please try again in a few minutes.",
+ "Aggiornamento in corso...": "Updating...",
"Aggiornamento...": "Updating...",
- "Aggiornamenti": "Updates",
"Aggiornata in base a scaffale, mensola e posizione.": "Updated based on shelf, rack and position.",
"Aggiornate %d righe": "Updated %d rows",
+ "Aggiornati": "Updated",
+ "Aggiunge badge cliccabili alla scheda libro per cercare su Anna's Archive, Z-Library e Project Gutenberg con un click. Ispirato all'estensione browser GoodLib.": "Adds clickable badges to the book detail page to search on Anna's Archive, Z-Library, and Project Gutenberg in one click. Inspired by the GoodLib browser extension.",
"Aggiungere una Nuova Lingua": "Adding a New Language",
"Aggiungi": "Add",
- "Aggiungi Genere Rapido": "Quick Add Genre",
- "Aggiungi Lingua": "Add Language",
- "Aggiungi Nuova Lingua": "Add New Language",
- "Aggiungi Nuovo Autore": "Add New Author",
- "Aggiungi Nuovo Editore": "Add New Publisher",
- "Aggiungi Nuovo Libro": "Add New Book",
- "Aggiungi Prima Lingua": "Add First Language",
- "Aggiungi Sottogenere": "Add Subgenre",
"Aggiungi ai Preferiti": "Add to Favorites",
+ "Aggiungi al file .env: APP_CANONICAL_URL=%s": "Add to .env file: APP_CANONICAL_URL=%s",
"Aggiungi alla collezione": "Add to collection",
+ "Aggiungi decimale": "Add decimal",
"Aggiungi eventuali note sul prestito": "Add any loan notes",
"Aggiungi eventuali note...": "Add any notes...",
+ "Aggiungi Genere Rapido": "Quick Add Genre",
"Aggiungi i libri che ti interessano dalla scheda di dettaglio per ricevere un promemoria quando tornano disponibili.": "Add books you're interested in from the detail page to receive a reminder when they become available.",
"Aggiungi la tua API key per interrogare Google Books quando importi un ISBN. Google viene utilizzato prima di Open Library, ma dopo Scraping Pro.": "Add your API key to query Google Books when importing an ISBN. Google is used before Open Library but after Scraping Pro.",
"Aggiungi le mensole (livelli) a ogni scaffale": "Add levels (shelves) to each bookcase",
+ "Aggiungi Lingua": "Add Language",
+ "Aggiungi Nuova Lingua": "Add New Language",
+ "Aggiungi Nuovo Autore": "Add New Author",
+ "Aggiungi Nuovo Editore": "Add New Publisher",
+ "Aggiungi Nuovo Libro": "Add New Book",
"Aggiungi nuovo libro": "Add new book",
+ "Aggiungi Prima Lingua": "Add First Language",
"Aggiungi primo libro": "Add first book",
"Aggiungi scaffali e mensole per la tua biblioteca": "Add shelves and racks for your library",
+ "Aggiungi Sottogenere": "Add Subgenre",
"Aggiungi un motivo (opzionale)": "Add a reason (optional)",
"Aggiungi un nuovo titolo per arricchire il catalogo di questo editore.": "Add a new title to enrich this publisher's catalog.",
+ "Aggiungi volume": "Add volume",
+ "Aggiunti di recente al catalogo": "Recently added to catalog",
"Aggiunto il": "Added on",
+ "agosto": "August",
"Aiuto": "Help",
+ "Al": "To",
+ "al": "to",
"Al momento non ci sono eventi attivi. Continua a seguirci per restare aggiornato sui prossimi appuntamenti.": "There are no active events at the moment. Keep following us to stay updated on upcoming appointments.",
"Al momento non ci sono eventi programmati. Torna a visitare questa pagina per scoprire i prossimi appuntamenti.": "There are currently no scheduled events. Come back to this page to discover upcoming events.",
- "Al": "To",
"Al:": "To:",
"Alcune date richieste non sono disponibili": "Some requested dates are not available",
"Alcuni mancanti": "Some missing",
"Alcuni requisiti non sono soddisfatti. Risolvi i problemi prima di continuare.": "Some requirements are not met. Fix the issues before continuing.",
+ "Alert prestito in ritardo (Admin)": "Overdue loan alert (Admin)",
"Allegato": "Attachment",
"Almeno uno dei seguenti parametri è richiesto:": "At least one of the following parameters is required:",
+ "altamente consigliato": "highly recommended",
"Altri eventi in programma": "Other upcoming events",
"Altri filtri": "More filters",
"Altro": "Other",
+ "Altro Numero di Chiamata": "Other Call Number",
"Amministratore": "Administrator",
+ "Analitici:": "Analytics:",
+ "Anna's Archive": "Anna's Archive",
+ "Anni di Vita": "Years of Life",
"Anno": "Year",
"Anno (YYYY)": "Year (YYYY)",
+ "Anno a": "Year to",
+ "Anno da": "Year from",
"Anno di Pubblicazione": "Publication Year",
"Anno di pubblicazione": "Publication year",
+ "Anno di Uscita": "Release Year",
"Anno max": "Year max",
"Anno min": "Year min",
"Anno numerico (usato per filtri e ordinamento)": "Numeric year (used for filters and sorting)",
@@ -215,6 +224,9 @@
"Anno:": "Year:",
"Annulla": "Cancel",
"Annulla prenotazione": "Cancel reservation",
+ "Annulla Prestito": "Cancel Loan",
+ "Annulla Prestito Scaduto": "Cancel Expired Loan",
+ "Annullare il prestito scaduto?": "Cancel the expired loan?",
"Annullare questa prenotazione?": "Cancel this reservation?",
"Annullata": "Cancelled",
"Annullato": "Cancelled",
@@ -225,37 +237,72 @@
"Anteprima logo": "Logo preview",
"Anteprima non disponibile": "Preview not available",
"Anteprima:": "Preview:",
+ "API": "API",
+ "API abilitata con successo.": "API enabled successfully.",
+ "API configurata": "API configured",
+ "API disabilitata con successo.": "API disabled successfully.",
+ "API Key": "API Key",
+ "API key creata con successo.": "API key created successfully.",
+ "API key eliminata con successo.": "API key deleted successfully.",
+ "API Key già configurata": "API Key already configured",
+ "API Keys": "API Keys",
+ "API Pubblica": "Public API",
+ "APP_CANONICAL_URL configurato con valore non valido: '%s'. Link nelle email potrebbero non funzionare. Valore suggerito: %s": "APP_CANONICAL_URL configured with invalid value: '%s'. Email links may not work. Suggested value: %s",
+ "APP_CANONICAL_URL configurato ma vuoto nel file .env. Link nelle email useranno fallback a HTTP_HOST. Valore suggerito: %s": "APP_CANONICAL_URL configured but empty in .env file. Email links will use HTTP_HOST fallback. Suggested value: %s",
+ "APP_CANONICAL_URL non configurato nel file .env. Link nelle email potrebbero non funzionare correttamente. Valore suggerito: %s": "APP_CANONICAL_URL not configured in .env file. Email links may not work correctly. Suggested value: %s",
"Apparirà nei risultati di ricerca Google. Se vuoto, usa il titolo hero o il nome dell'app.": "Will appear in Google search results. If empty, uses the hero title or app name.",
"Apparirà sotto il titolo nei risultati di ricerca. Se vuoto, usa il sottotitolo hero o una descrizione generica.": "Will appear under the title in search results. If empty, uses the hero subtitle or a generic description.",
"Applica": "Apply",
"Applica Filtri": "Apply Filters",
- "Applicazione Già Installata": "Application Already Installed",
+ "Applica Fix": "Apply Fix",
"Applicazione configurata:": "Application configured:",
+ "Applicazione del fix...": "Applying fix...",
+ "Applicazione Già Installata": "Application Already Installed",
+ "Applicazione già installata": "Application already installed",
"Approva": "Approve",
- "Approva Prestiti": "Approve Loans",
- "Approva Prestito?": "Approve Loan?",
"Approva e Invia Email Attivazione": "Approve and Send Activation Email",
"Approva o rifiuta le recensioni degli utenti": "Approve or reject user reviews",
"Approva o rifiuta le richieste degli utenti": "Approve or reject user requests",
+ "Approva Prestiti": "Approve Loans",
+ "Approva Prestito?": "Approve Loan?",
"Approva prestito?": "Approve loan?",
"Approva recensione": "Approve review",
"Approvata": "Approved",
"Approvata il": "Approved on",
"Approvato": "Approved",
+ "Approvato il %s": "Approved on %s",
"Approvato!": "Approved!",
"Approverai questa richiesta di prestito?": "Will you approve this loan request?",
"Apri": "Open",
"Apri Editor": "Open Editor",
- "Apri Google Cloud Console": "Open Google Cloud Console",
"Apri file": "Open file",
+ "Apri Google Cloud Console": "Open Google Cloud Console",
"Apri menu": "Open menu",
+ "aprile": "April",
"Archivia": "Archive",
"Archiviato": "Archived",
"Archivio": "Archive",
+ "Arricchimento": "Enrichment",
+ "Arricchimento Automatico": "Automatic Enrichment",
"Arricchimento automatico dati": "Automatic Data Enrichment",
+ "Arricchimento Manuale": "Manual Enrichment",
+ "Arricchimento Massivo": "Bulk Enrichment",
+ "Arricchimento massivo ISBN": "Bulk ISBN enrichment",
+ "Arricchisci Adesso": "Enrich Now",
+ "Arricchisci automaticamente i libri con ISBN cercando copertine e descrizioni mancanti": "Automatically enrich ISBN-tagged books by fetching missing covers and descriptions",
+ "Arricchisci dati con scraping web (copertine, descrizioni, etc.)": "Enrich data with web scraping (covers, descriptions, etc.)",
+ "Arricchiti": "Enriched",
+ "Arricchito": "Enriched",
+ "Article (Articolo/Blog)": "Article (Article/Blog)",
"Articolo": "Article",
+ "Artista": "Artist",
+ "Artista sconosciuto": "Unknown artist",
+ "Artisti": "Artists",
+ "Ascolta": "Listen",
"Ascolta Audiobook": "Listen to Audiobook",
"Ascolta l'audiobook": "Listen to the audiobook",
+ "Assegna": "Assign",
+ "Assegna collana": "Assign series",
"Assicurati che corrisponda al tipo di carta per etichette che utilizzi.": "Make sure it matches the type of label paper you use.",
"Assicurati che il path assoluto dello script sia corretto": "Make sure the absolute path to the script is correct",
"Assicurati che sia configurato correttamente per evitare URL duplicati.": "Make sure it's configured correctly to avoid duplicate URLs.",
@@ -268,10 +315,16 @@
"Attenzione: %d prestiti in ritardo": "Warning: %d overdue loans",
"Attenzione: %d prestito in ritardo": "Warning: %d overdue loan",
"Attenzione: Azione Manuale Richiesta": "Warning: Manual Action Required",
+ "ATTENZIONE: Disinstallazione Irreversibile": "WARNING: Irreversible Uninstallation",
"Attenzione: Non è stato possibile rimuovere tutte le copie richieste. Alcune copie sono attualmente in prestito.": "Warning: Could not remove all requested copies. Some copies are currently on loan.",
- "Attivando questa modalità verranno disabilitati completamente i prestiti, le prenotazioni e la wishlist. Gli utenti potranno solo consultare il catalogo.": "Enabling this mode will completely disable loans, reservations and wishlist. Users will only be able to browse the catalogue.",
"Attiva": "Active",
"Attiva Direttamente": "Activate Directly",
+ "Attiva HTTP Strict Transport Security (max-age: 1 anno, include sottodomini)": "Enable HTTP Strict Transport Security (max-age: 1 year, includes subdomains)",
+ "Attiva HTTPS solo se hai un certificato SSL valido installato. Attivare HSTS rende permanente il reindirizzamento HTTPS nel browser.": "Enable HTTPS only if you have a valid SSL certificate installed. Enabling HSTS makes HTTPS redirection permanent in the browser.",
+ "Attiva questa opzione solo se il tuo server supporta HTTPS. Se il tuo hosting forza già HTTPS automaticamente, non è necessario abilitarla (potrebbe causare redirect loop).": "Enable this option only if your server supports HTTPS. If your hosting already forces HTTPS automatically, you don't need to enable it (may cause redirect loop).",
+ "Attivando questa modalità verranno disabilitati completamente i prestiti, le prenotazioni e la wishlist. Gli utenti potranno solo consultare il catalogo.": "Enabling this mode will completely disable loans, reservations and wishlist. Users will only be able to browse the catalogue.",
+ "Attivare questo tema?": "Activate this theme?",
+ "attivata": "activated",
"Attivato:": "Activated:",
"Attivi": "Active",
"Attività": "Activity",
@@ -285,9 +338,15 @@
"Audiobook (MP3/M4A/OGG)": "Audiobook (MP3/M4A/OGG)",
"Audiobook caricato!": "Audiobook uploaded!",
"Audiobook disponibile": "Audiobook available",
+ "Audiolibro": "Audiobook",
"Aumenta Copie": "Increase Copies",
"Autenticazione": "Authentication",
+ "Autenticazione Admin Richiesta": "Admin Authentication Required",
+ "Autenticazione Richiesta": "Authentication Required",
+ "Autenticazione richiesta.": "Authentication required.",
+ "Autenticazione utente": "User authentication",
"Auto": "Auto",
+ "Auto-attivazione:": "Auto-activation:",
"Auto-attivazione: Se compili questo campo, il toggle \"Mostra Cookie Analitici\" in Privacy verrà attivato automaticamente.": "Auto-activation: If you fill this field, the \"Show Analytics Cookies\" toggle in Privacy will be automatically activated.",
"Auto-attivazione: Se compili questo campo, il toggle \"Mostra Cookie Marketing\" in Privacy verrà attivato automaticamente.": "Auto-activation: If you fill this field, the \"Show Marketing Cookies\" toggle in Privacy will be automatically activated.",
"Auto-detect se vuoto": "Auto-detect if empty",
@@ -298,13 +357,15 @@
"Autore \"%s\" pronto per essere creato": "Author \"%s\" ready to be created",
"Autore \"%s\" è già selezionato": "Author \"%s\" is already selected",
"Autore A-Z": "Author A-Z",
- "Autore Z-A": "Author Z-A",
"Autore eliminato con successo.": "Author deleted successfully.",
+ "Autore non specificato": "Author not specified",
"Autore principale": "Primary author",
"Autore sconosciuto": "Unknown author",
+ "Autore Z-A": "Author Z-A",
"Autore/i:": "Author(s):",
"Autore:": "Author:",
"Autori": "Authors",
+ "autori": "authors",
"Autori con biografie": "Authors with biographies",
"Autori ed editori vengono creati automaticamente": "Authors and publishers are created automatically",
"Autori multipli separati da %s": "Multiple authors separated by %s",
@@ -312,39 +373,45 @@
"Autori pubblicati": "Published Authors",
"Autori uniti": "Authors merged",
"Autori uniti con successo": "Authors merged successfully",
+ "autori. Questa azione non può essere annullata.": "authors. This action cannot be undone.",
+ "autori. Tutti i libri verranno assegnati all'autore risultante.": "authors. All books will be assigned to the resulting author.",
"Autori:": "Authors:",
"Avanti": "Next",
"Avanzate": "Advanced",
+ "Avvia manualmente l'arricchimento di un batch di 20 libri. Verranno cercate copertine e descrizioni mancanti.": "Manually start enrichment of a batch of 20 books. Missing covers and descriptions will be fetched.",
+ "Avvio aggiornamento": "Starting update",
+ "Avvio backup database": "Starting database backup",
+ "Avvisa gli amministratori quando un prestito entra in ritardo.": "Alerts administrators when a loan becomes overdue.",
"Avvisi scadenza prestiti (configurabile in Impostazioni → Avanzate, default 3 giorni prima)": "Loan expiration warnings (configurable in Settings → Advanced, default 3 days before)",
"Avviso": "Warning",
+ "AVVISO Trigger:": "Trigger WARNING:",
"Azione richiesta:": "Action required:",
"Azioni": "Actions",
- "Azioni Rapide": "Quick Actions",
- "Azioni Veloci": "Quick Actions",
"Azioni di Approvazione": "Approval Actions",
"Azioni di Manutenzione": "Maintenance Actions",
+ "Azioni Rapide": "Quick Actions",
+ "Azioni Veloci": "Quick Actions",
"Azzera": "Clear",
"Backup": "Backup",
"Backup Automatico": "Automatic Backup",
+ "Backup completato": "Backup completed",
"Backup creato con successo": "Backup created successfully",
+ "Backup creato!": "Backup created!",
+ "Backup database completato": "Database backup completed",
"Backup disponibili": "Available backups",
"Backup e Sicurezza": "Backup and Security",
- "I backup sono salvati in:": "Backups are saved in:",
- "Backup fallito": "Backup failed",
- "Backup Salvati": "Saved Backups",
"Backup eliminato": "Backup deleted",
+ "Backup eliminato con successo": "Backup deleted successfully",
+ "Backup fallito": "Backup failed",
"Backup non trovato": "Backup not found",
- "Caricamento backup...": "Loading backups...",
- "Crea un backup manuale o attendi il prossimo aggiornamento.": "Create a manual backup or wait for the next update.",
- "Eliminare questo backup?": "Delete this backup?",
- "Eliminazione in corso...": "Deleting...",
- "Impossibile eliminare il backup": "Unable to delete backup",
- "Impossibile leggere il file di backup": "Unable to read backup file",
- "Nessun backup disponibile": "No backups available",
- "Nome File": "File Name",
- "Nome backup non specificato": "Backup name not specified",
- "Nome backup non valido": "Invalid backup name",
+ "Backup non trovato.": "Backup not found.",
+ "Backup ripristinato con successo.": "Backup restored successfully.",
+ "Backup Salvati": "Saved Backups",
+ "Backup tabella": "Backing up table",
+ "Barcode": "Barcode",
+ "Barcode fisico": "Physical barcode",
"Barra laterale": "Sidebar",
+ "BCID": "BCID",
"Benvenuto": "Welcome",
"Benvenuto nell'Installer": "Welcome to the Installer",
"Benvenuto, %s!": "Welcome, %s!",
@@ -353,224 +420,324 @@
"Biblioteca Digitale - La tua biblioteca online": "Digital Library - Your Online Library",
"Biblioteca Digitale - Scopri e Prenota i Tuoi Libri Preferiti": "Digital Library - Discover and Reserve Your Favorite Books",
"Biblioteca digitale con catalogo completo di libri disponibili per il prestito": "Digital library with complete catalog of books available for loan",
+ "biblioteca, prestito libri, catalogo online, scopri libri, prenotazioni": "library, book lending, online catalog, discover books, reservations",
"Biografia": "Biography",
"Biografia dell'autore": "Author Biography",
+ "Blu-ray": "Blu-ray",
"Bluesky": "Bluesky",
"Books": "Books",
+ "Bottone": "Button",
+ "Bottone CTA": "CTA Button",
+ "Bottone Primario": "Primary Button",
+ "bottoni nelle card": "buttons in cards",
+ "bottoni principali": "main buttons",
"Breadcrumb": "Breadcrumb",
"Breve descrizione per i motori di ricerca": "Short description for search engines",
"Breve descrizione per i motori di ricerca (max 160 caratteri)": "Short description for search engines (max 160 characters)",
"Buono": "Good",
- "CMS": "CMS",
- "CSRF Fallito": "CSRF Failed",
- "CSRF non valido.": "Invalid CSRF token.",
- "CSS Personalizzato": "Custom CSS",
- "CSV": "CSV",
+ "Calendario Disponibilità": "Availability Calendar",
"Calendario eventi": "Events calendar",
+ "Calendario eventi culturali": "Cultural events calendar",
+ "Calendario non disponibile": "Calendar not available",
+ "Calendario Prestiti e Prenotazioni": "Loans and Reservations Calendar",
"Call to Action": "Call to Action",
"Call to Action (CTA)": "Call to Action (CTA)",
"Cambia lingua": "Change language",
"Cambia password": "Change password",
+ "Cambia vista": "Change view",
+ "Campi Aggiornati": "Updated Fields",
+ "Campi Database": "Database Fields",
+ "Campi estesi per l'integrazione con LibraryThing": "Extended fields for LibraryThing integration",
+ "Campi Supportati": "Supported Fields",
"Campo": "Field",
"Campo %s obbligatorio": "%s field required",
"Campo Obbligatorio": "Required Field",
"Campo obbligatorio": "Required field",
"Campo obbligatorio mancante: %s": "Missing required field: %s",
+ "Cancel": "Cancel",
+ "Cancella": "Clear",
"Cancella filtri": "Clear filters",
"Cancella tutti i filtri": "Clear all filters",
+ "CAP": "ZIP Code",
"Caratteristica": "Feature",
"Carica": "Upload",
"Carica %{smart_count} file": "Upload %{smart_count} file",
"Carica Altri": "Load More",
"Carica File CSV": "Upload CSV File",
"Carica File JSON": "Upload JSON File",
- "Carica Nuovo File JSON": "Upload New JSON File",
- "Carica Plugin": "Upload Plugin",
+ "Carica File LibraryThing": "Upload LibraryThing File",
"Carica il file JSON di traduzione (opzionale)": "Upload the translation JSON file (optional)",
"Carica il file usando l'uploader": "Upload the file using the uploader",
"Carica logo (PNG, JPG, SVG)": "Upload logo (PNG, JPG, SVG)",
+ "Carica Nuovo File JSON": "Upload New JSON File",
"Carica o collega eBook (PDF/ePub) e audiobook (MP3/M4A) per renderli disponibili agli utenti.": "Upload or link eBooks (PDF/ePub) and audiobooks (MP3/M4A) to make them available to users.",
+ "Carica Plugin": "Upload Plugin",
"Carica un file CSV per importare più libri contemporaneamente": "Upload a CSV file to import multiple books at once",
"Carica un file ZIP contenente il plugin. Il file deve includere un %s con le informazioni del plugin.": "Upload a ZIP file containing the plugin. The file must include a %s with the plugin information.",
"Carica un nuovo file per aggiornare le traduzioni (opzionale). Verrà creato un backup del file precedente.": "Upload a new file to update translations (optional). A backup of the previous file will be created.",
"Caricamento .env...": "Loading .env...",
+ "Caricamento automatico:": "Automatic loading:",
+ "Caricamento backup...": "Loading backups...",
"Caricamento categorie...": "Loading categories...",
"Caricamento completato": "Upload completed",
"Caricamento condizionale:": "Conditional loading:",
+ "Caricamento del logo non riuscito. Verifica le dimensioni e il formato del file.": "Logo upload failed. Check file size and format.",
"Caricamento fallito": "Upload failed",
"Caricamento file...": "Uploading file...",
"Caricamento in corso...": "Uploading...",
"Caricamento libri...": "Loading books...",
"Caricamento non riuscito. Riprova.": "Upload failed. Please try again.",
+ "Caricamento sessioni...": "Loading sessions...",
"Caricamento...": "Loading...",
"Caroselli Generi": "Genre Carousels",
+ "Cartaceo": "Print",
"Casa Editrice": "Publisher",
"Case editrici": "Publishing houses",
+ "Cassetta": "Cassette",
"Catalogo": "Catalog",
+ "Catalogo bibliotecario gestito con [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Disponibile in: %s.": "Library catalog powered by [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Available in: %s.",
"Catalogo Completo Libri - Biblioteca Digitale": "Complete Book Catalog - Digital Library",
"Catalogo Libri": "Book Catalog",
- "Catalogo Libri - Biblioteca": "Book Catalog - Library",
"Catalogo libri": "Book Catalog",
+ "Catalogo Libri - Biblioteca": "Book Catalog - Library",
+ "Catalogo pubblico": "Public catalog",
"Català (CA)": "Catalan (CA)",
"Categoria": "Category",
"Categorie": "Categories",
"Categorie Cookie": "Cookie Categories",
+ "CD Audio": "Audio CD",
"Centro Impostazioni": "Settings Center",
"Cerca": "Search",
- "Cerca IP...": "Search IP...",
- "Cerca Libri": "Search Books",
- "Cerca Libro": "Search Book",
- "Cerca Utente": "Search User",
+ "Cerca \"%s\" su %s": "Search \"%s\" on %s",
"Cerca autore...": "Search author...",
- "Cerca codice o nome...": "Search code or name...",
"Cerca autori esistenti o aggiungine di nuovi...": "Search for existing authors or add new ones...",
+ "Cerca codice o nome...": "Search code or name...",
"Cerca editore esistente o inserisci nuovo...": "Search for existing publisher or enter new...",
"Cerca editore...": "Search publisher...",
"Cerca email...": "Search email...",
"Cerca genere...": "Search genre...",
+ "Cerca globale": "Global search",
"Cerca icona... (es. user, home, book)": "Search icon... (e.g. user, home, book)",
+ "Cerca IP...": "Search IP...",
+ "Cerca Libri": "Search Books",
"Cerca libri, autori, editori, utenti...": "Search books, authors, publishers, users...",
"Cerca libri, autori, editori...": "Search books, authors, publishers...",
- "Cerca libri, autori...": "Search books, authors...",
"Cerca libri, autori, ISBN...": "Search books, authors, ISBN...",
+ "Cerca libri, autori...": "Search books, authors...",
"Cerca libri...": "Search books...",
+ "Cerca Libro": "Search Book",
+ "Cerca libro": "Search for a book",
"Cerca nella biblioteca": "Search the library",
+ "Cerca per codice EAN": "Search by EAN code",
"Cerca per ISBN-10": "Search by ISBN-10",
"Cerca per ISBN-13": "Search by ISBN-13",
- "Cerca per codice EAN": "Search by EAN code",
"Cerca per nome autore (corrispondenza parziale)": "Search by author name (partial match)",
"Cerca per nome, cognome, telefono, email o tessera": "Search by name, surname, phone, email or card",
"Cerca per nome...": "Search by name...",
"Cerca per pseudonimo...": "Search by pseudonym...",
- "Cerca pseudonimo...": "Search pseudonym...",
"Cerca per titolo o sottotitolo": "Search by title or subtitle",
"Cerca per titolo o stato (es. disponibile)": "Search by title or status (e.g. available)",
+ "Cerca per titolo, ISBN o EAN": "Search by title, ISBN or EAN",
"Cerca posizione...": "Search location...",
+ "Cerca pseudonimo...": "Search pseudonym...",
"Cerca rapido...": "Quick search...",
+ "Cerca su:": "Search on:",
"Cerca testo": "Search text",
"Cerca titoli": "Search Titles",
"Cerca titoli, autori, ISBN...": "Search titles, authors, ISBN...",
+ "Cerca Utente": "Search User",
+ "Cerca...": "Search...",
"Cerca:": "Search:",
+ "Certificato SSL/TLS valido": "Valid SSL/TLS certificate",
"Chi Siamo": "About Us",
"Chiave": "Key",
"Chiave API Google Books": "Google Books API key",
+ "Chiave di cifratura non configurata (PLUGIN_ENCRYPTION_KEY o APP_KEY)": "Encryption key not configured (PLUGIN_ENCRYPTION_KEY or APP_KEY)",
"Chiave Google Books aggiornata.": "Google Books key updated.",
"Chiave Google Books rimossa.": "Google Books key removed.",
"Chiave Google Books salvata correttamente.": "Google Books key saved successfully.",
"Chiave Route": "Route Key",
+ "chiavi": "keys",
+ "chiavi tradotte": "translated keys",
"Chiedi al tuo amministratore di database di eseguire i comandi contenuti nel file": "Ask your database administrator to execute the commands contained in the file",
"Chiudi": "Close",
- "Chiudi Player": "Close Player",
- "Chiudi menu": "Close menu",
"Chiudi alternative": "Close alternatives",
+ "Chiudi menu": "Close menu",
+ "Chiudi Player": "Close Player",
+ "Chiudi popup": "Close popup",
+ "Chiudi Visualizzatore": "Close Viewer",
+ "Ciao": "Hello",
"Citazione": "Quote",
"Città": "City",
"Classe (000-900)": "Class (000-900)",
- "Classificazione Dewey": "Dewey Classification",
- "Classi principali": "Main classes",
"classe principale": "main class",
+ "Classe principale mancante: %s.": "Missing main class: %s.",
+ "Classi principali": "Main classes",
+ "Classificazione Dewey": "Dewey Classification",
+ "Classificazione LC": "LC Classification",
+ "Classificazione selezionata:": "Selected classification:",
+ "Classificazioni": "Classifications",
+ "Classificazioni Bibliotecarie": "Library Classifications",
"Clicca o trascina per caricare un logo": "Click or drag to upload a logo",
"Clicca per selezionare": "Click to select",
"Clicca su \"Esegui Manutenzione\" per correggere automaticamente i problemi riparabili.": "Click \"Run Maintenance\" to automatically fix repairable issues.",
"Clicca su 'Aggiungi Lingua'": "Click on 'Add Language'",
"Clicca su \\": "Click on \\",
+ "Clicca su \\\"Esegui Manutenzione\\\" per correggere automaticamente i problemi riparabili.": "Click \\\"Run Maintenance\\\" to automatically fix resolvable issues.",
"Clicca su un'icona per selezionarla": "Click on an icon to select it",
+ "Clicca sul pulsante qui sotto per resettare la tua password:": "Click the button below to reset your password:",
+ "Close menu": "Close menu",
+ "CMS": "CMS",
+ "Coda": "Queue",
"Codice": "Code",
"Codice *": "Code *",
+ "Codice a Barre": "Barcode",
"Codice CSS": "CSS Code",
"Codice CSS da applicare a tutte le pagine del frontend": "CSS code to apply to all frontend pages",
+ "Codice Dewey": "Dewey Code",
+ "Codice Dewey non trovato": "Dewey code not found",
"Codice Dewey selezionato:": "Selected Dewey code:",
+ "Codice Dewey trovato e impostato": "Dewey code found and set",
+ "Codice embed completo": "Full embed code",
"Codice Fiscale": "Tax ID",
+ "Codice fiscale": "Tax code",
+ "Codice fiscale dell'editore (opzionale)": "Publisher's tax code (optional)",
+ "Codice fiscale italiano (opzionale)": "Italian tax ID (optional)",
"Codice ISBN o EAN": "ISBN or EAN Code",
"Codice ISO 2 lettere (es: IT, FR, GB)": "ISO 2-letter code (e.g. IT, FR, GB)",
"Codice JavaScript": "JavaScript Code",
"Codice JavaScript Analytics": "Analytics JavaScript Code",
"Codice Lingua": "Language Code",
- "Codice Tessera": "Card Number",
- "Codice Tessera:": "Membership Code:",
- "Codice embed completo": "Full embed code",
- "Codice fiscale": "Tax code",
- "Codice fiscale dell'editore (opzionale)": "Publisher's tax code (optional)",
- "Codice fiscale italiano (opzionale)": "Italian tax ID (optional)",
+ "Codice parent non trovato.": "Parent code not found.",
"Codice postale...": "ZIP code...",
+ "Codice scaffale obbligatorio": "Shelf code required",
+ "Codice Tessera": "Card Number",
"Codice tessera": "Card Code",
+ "Codice Tessera:": "Membership Code:",
"Cognome": "Last Name",
"Collana": "Series",
+ "Collana \"%s\" creata": "Series \"%s\" created",
+ "Collana \"%s\" eliminata (%d libri aggiornati)": "Series \"%s\" deleted (%d books updated)",
+ "Collana assegnata": "Series assigned",
+ "Collana rinominata: %d libri aggiornati": "Series renamed: %d books updated",
+ "Collane": "Series",
+ "Collane totali": "Total series",
+ "Collane unite: %d libri spostati in \"%s\"": "Series merged: %d books moved to \"%s\"",
+ "Collezione: %d libri, %d autori, %d editori.": "Collection: %d books, %d authors, %d publishers.",
"Collocazione": "Location",
"Collocazione calcolata": "Calculated location",
"Collocazione suggerita": "Suggested location",
- "Segui l'installazione guidata per completare la configurazione.": "Follow the guided installation to complete the configuration.",
+ "Collocazione:": "Location:",
+ "Colonne": "Columns",
+ "Colore Bottoni CTA": "CTA Button Color",
+ "Colore non valido": "Invalid color",
+ "Colore Primario": "Primary Color",
+ "Colore Secondario": "Secondary Color",
+ "Colore Testo Bottoni": "Button Text Color",
+ "Colori ripristinati ai valori predefiniti": "Colors reset to defaults",
+ "Colori Tema": "Theme Colors",
+ "Come Esportare da LibraryThing": "How to Export from LibraryThing",
"Come Funziona": "How It Works",
+ "Come Nuovo": "Like New",
+ "come nuovo autore": "as new author",
"Come ottenere il codice": "How to get the code",
"Commento": "Comment",
+ "Commento Privato": "Private Comment",
+ "Commento Pubblico": "Public Comment",
+ "Commento pubblico...": "Public comment...",
+ "Communication error with the server": "Communication error with the server",
"Compila con i dati dei tuoi libri": "Fill in with your book data",
"Compila i dettagli del libro per aggiungerlo alla biblioteca": "Fill in the book details to add it to the library",
"Compila i dettagli dell'autore per aggiungerlo alla biblioteca": "Fill in the author details to add them to the library",
"Compila i dettagli della casa editrice per aggiungerla alla biblioteca": "Fill in the publishing house details to add it to the library",
+ "Compila nome e URL per tutti i server.": "Fill in name and URL for all servers.",
"Compila tutti i campi obbligatori prima di salvare.": "Fill in all required fields before saving.",
+ "Compila tutti i campi obbligatori.": "Fill in all required fields.",
"Compila tutti i campi per creare una nuova prenotazione": "Fill in all fields to create a new reservation",
"Compila tutti i campi richiesti": "Fill in all required fields",
- "Compila nome e URL per tutti i server.": "Fill in name and URL for all servers.",
"Completamento": "Completion",
+ "completamento": "completion",
"Completata": "Completed",
"Completati": "Completed",
"Completato": "Completed",
"Completato!": "Completed!",
+ "Complete": "Complete",
+ "Completo": "Complete",
"Complimenti!": "Congratulations!",
"Componente": "Component",
+ "con successo": "successfully",
"Con valore 3, un prestito che scade il 15 Gennaio riceverà l'avviso il 12 Gennaio": "With value 3, a loan expiring on January 15 will receive the notice on January 12",
"Condividi": "Share",
"Condividi la tua opinione su questo libro...": "Share your opinion about this book...",
+ "Condividi su Bluesky": "Share on Bluesky",
"Condividi su Facebook": "Share on Facebook",
+ "Condividi su LINE": "Share on LINE",
+ "Condividi su LinkedIn": "Share on LinkedIn",
+ "Condividi su Pinterest": "Share on Pinterest",
+ "Condividi su Reddit": "Share on Reddit",
+ "Condividi su Telegram": "Share on Telegram",
+ "Condividi su Threads": "Share on Threads",
+ "Condividi su Tumblr": "Share on Tumblr",
"Condividi su Twitter": "Share on Twitter",
+ "Condividi su VK": "Share on VK",
"Condividi su WhatsApp": "Share on WhatsApp",
+ "Condividi su X": "Share on X",
+ "Condivisione": "Sharing",
"Condiviso": "Shared",
+ "Condizione Fisica": "Physical Condition",
"Condizioni": "Conditions",
- "Consegna immediata": "Immediate delivery",
"Conferma": "Confirm",
"Conferma Aggiornamento": "Confirm Update",
"Conferma aggiornamento": "Confirm update",
- "Controlla Aggiornamenti": "Check for Updates",
- "Controllo aggiornamenti": "Checking for updates",
- "Crea Backup Manuale": "Create Manual Backup",
- "Creazione backup database": "Creating database backup",
- "Creazione backup...": "Creating backup...",
- "Creare backup?": "Create backup?",
- "Cronologia Aggiornamenti": "Update History",
"Conferma Annullamento": "Confirm Cancellation",
"Conferma Disinstallazione": "Confirm Uninstallation",
"Conferma eliminazione": "Confirm deletion",
- "Conferma Password": "Confirm Password",
- "Conferma Salvataggio": "Confirm Save",
"Conferma la tua email": "Confirm your email",
"Conferma modifica": "Confirm change",
+ "Conferma Password": "Confirm Password",
"Conferma password": "Confirm password",
"Conferma restituzione": "Confirm return",
+ "Conferma Ritiro": "Confirm Pickup",
+ "Conferma Salvataggio": "Confirm Save",
+ "Confermare il ritiro?": "Confirm pickup?",
+ "Confermi di voler attivare direttamente questo utente senza richiedere verifica email?": "Are you sure you want to directly activate this user without requiring email verification?",
+ "Confermi di voler attivare direttamente questo utente?": "Are you sure you want to activate this user directly?",
"Confermi l'eliminazione dell'editore?": "Confirm publisher deletion?",
"Confermi l'operazione?": "Confirm the operation?",
"Confermi?": "Confirm?",
+ "Confermo di voler disinstallare il plugin e di aver effettuato un backup dei dati": "I confirm I want to uninstall the plugin and have made a backup of the data",
+ "Configura API": "Configure API",
+ "Configura come opera multi-volume": "Configure as multi-volume work",
+ "Configura Fonti": "Configure Sources",
"Configura Google Books": "Configure Google Books",
"Configura i testi mostrati all'interno del pannello delle preferenze dei cookie.": "Configure the texts shown inside the cookie preferences panel.",
"Configura i testi visualizzati agli utenti in ogni parte del cookie banner.": "Configure the texts displayed to users in every part of the cookie banner.",
"Configura i testi visualizzati agli utenti nel banner iniziale.": "Configure the texts displayed to users in the initial banner.",
"Configura l'identità dell'applicazione, i metodi di invio email e personalizza i template delle notifiche automatiche.": "Configure application identity, email sending methods and customize automatic notification templates.",
+ "Configura l'integrazione con le API di Discogs per lo scraping di metadati musicali.": "Configure integration with the Discogs API for music metadata scraping.",
"Configura le date della prenotazione": "Configure reservation dates",
+ "Configura le impostazioni di sicurezza per le connessioni HTTPS": "Configure security settings for HTTPS connections",
"Configura le impostazioni email per l'invio di notifiche agli utenti.": "Configure email settings for sending notifications to users.",
"Configura le impostazioni rimanenti (privacy, contatti, etc.)": "Configure the remaining settings (privacy, contacts, etc.)",
"Configura quando inviare l'avviso di scadenza prestiti agli utenti": "Configure when to send loan expiry warning to users",
+ "Configura Z39.50": "Configure Z39.50",
"Configurazione": "Configuration",
+ "Configurazione aggiornata con successo!": "Configuration updated successfully!",
"Configurazione Cron Job": "Cron Job Configuration",
"Configurazione Database": "Database Configuration",
+ "Configurazione del banner cookie": "Cookie banner configuration",
"Configurazione Email": "Email Configuration",
"Configurazione Etichette Libri": "Book Labels Configuration",
- "Configurazione SMTP": "SMTP Configuration",
- "Configurazione del banner cookie": "Cookie banner configuration",
"Configurazione guidata in pochi passaggi.": "Guided configuration in a few steps.",
"Configurazione invio": "Sending Configuration",
"Configurazione sistema": "System configuration",
+ "Configurazione SMTP": "SMTP Configuration",
+ "Confirm?": "Confirm?",
"Connessione al database fallita": "Database connection failed",
+ "Connessione database non disponibile": "Database connection not available",
"Connessione fallita": "Connection failed",
"Connesso": "Connected",
+ "Consegna immediata": "Immediate delivery",
"Conserva queste informazioni in un luogo sicuro!": "Keep this information in a safe place!",
"Consigliato": "Recommended",
"Consigliato JPG o PNG ad alta risoluzione (min 1920x1080px). Max 5MB.": "Recommended high-resolution JPG or PNG (min 1920x1080px). Max 5MB.",
@@ -579,6 +746,7 @@
"Consigliato: 150-160 caratteri": "Recommended: 150-160 characters",
"Consigliato: 50-60 caratteri": "Recommended: 50-60 characters",
"Consigliato: PHP mail() per semplicità, SMTP per maggiore controllo": "Recommended: PHP mail() for simplicity, SMTP for more control",
+ "Consigliato: Summary Large Image per homepage.": "Recommended: Summary Large Image for homepage.",
"Contatta il tuo provider di hosting e chiedi di eseguire": "Contact your hosting provider and ask them to run",
"Contattaci": "Contact Us",
"Contatti": "Contacts",
@@ -587,164 +755,240 @@
"Contenuti homepage aggiornati con successo!": "Homepage content updated successfully!",
"Contenuto": "Content",
"Contenuto Cookie Policy": "Cookie Policy Content",
+ "Contenuto della pagina": "Page content",
+ "Contenuto della pagina /cookies accessibile dal banner": "Content of /cookies page accessible from banner",
"Contenuto Pagina": "Page Content",
+ "Contenuto pagina": "Page content",
"Contenuto Privacy Policy": "Privacy Policy Content",
"Contenuto Testuale": "Text Content",
- "Contenuto della pagina /cookies accessibile dal banner": "Content of /cookies page accessible from banner",
- "Contenuto pagina": "Page content",
"Contenuto testuale HTML con editor avanzato": "HTML text content with advanced editor",
"Continua": "Continue",
+ "Contrasto": "Contrast",
+ "Contrasto insufficiente tra bottone e testo (minimo 3:1). Attuale": "Insufficient contrast between button and text (minimum 3:1). Current",
+ "Controlla Aggiornamenti": "Check for Updates",
+ "Controlla la tua casella di posta e clicca sul link per resettare la password. Il link sarà valido per 2 ore.": "Check your inbox and click the link to reset your password. The link will be valid for 2 hours.",
+ "Controllo aggiornamenti": "Checking for updates",
+ "Controllo pre-aggiornamento fallito": "Pre-update check failed",
"Cookie Analitici": "Analytics Cookies",
"Cookie Banner": "Cookie Banner",
- "Cookie Essenziali": "Essential Cookies",
"Cookie di Marketing": "Marketing Cookies",
+ "Cookie Essenziali": "Essential Cookies",
"Cookies": "Cookies",
"Copertina": "Cover",
+ "Copertina applicata": "Cover applied",
"Copertina Attuale": "Current Cover",
"Copertina attuale": "Current cover",
"Copertina del Libro": "Book Cover",
"Copertina del libro": "Book cover",
+ "Copertina del libro \"%s\"": "Book cover for \"%s\"",
+ "Copertina non trovata online:": "Cover not found online:",
"Copertina recuperata automaticamente": "Cover automatically retrieved",
+ "Copertina:": "Cover:",
+ "Copertine già presenti: %s": "Covers already present: %s",
+ "Copertine scaricate (LibraryThing):": "Covers downloaded (LibraryThing):",
+ "Copertine scaricate:": "Covers fetched:",
+ "Copertine sincronizzate: %s": "Covers synced: %s",
+ "copi": "copi",
"Copia": "Copy",
+ "copia": "copy",
+ "Copia %d di %d": "Copy %d of %d",
+ "Copia eliminata con successo.": "Copy deleted successfully.",
+ "Copia Link": "Copy Link",
+ "Copia link": "Copy link",
"Copia link negli appunti": "Copy link to clipboard",
+ "Copia non trovata.": "Copy not found.",
"Copiato!": "Copied!",
"Copie": "Copies",
+ "copie": "copies",
"Copie Aggiunte!": "Copies Added!",
"Copie Disponibili": "Available Copies",
+ "Copie disponibili": "Copies available",
+ "Copie disponibili:": "Available copies:",
"Copie Eccessive": "Excess Copies",
"Copie Fisiche": "Physical Copies",
"Copie Negative": "Negative Copies",
"Copie Totali": "Total Copies",
- "Copie disponibili:": "Available copies:",
+ "Copie totali": "Total copies",
"Copie totali:": "Total copies:",
"Copyright": "Copyright",
"Corpo Email": "Email Body",
"Corpo email": "Email body",
+ "Correggi nel file .env: APP_CANONICAL_URL=%s": "Fix in .env file: APP_CANONICAL_URL=%s",
"Correggi Permessi Automaticamente": "Fix Permissions Automatically",
+ "Correggi Problemi": "Fix Issues",
"Corrente": "Current",
"Correzione Automatica Permessi": "Auto-fix Permissions",
"Correzione Manuale via SSH (se automatica fallisce)": "Manual Fix via SSH (if automatic fails)",
"Correzione parziale:": "Partial fix:",
"Correzioni applicate: %d record aggiornati": "Corrections applied: %d records updated",
"Cos'è la Collocazione?": "What is Location?",
+ "Cos'è llms.txt:": "What is llms.txt:",
"Cosa fare:": "What to do:",
"Cosa ne pensi di questo libro?": "What do you think about this book?",
"Cosa sono le Route?": "What are Routes?",
"Cosa viene nascosto:": "What will be hidden:",
+ "Cover": "Cover",
"Crea": "Create",
- "Crea API Key": "Create API Key",
"Crea Admin": "Create Admin",
+ "Crea API Key": "Create API Key",
+ "Crea Backup": "Create Backup",
+ "Crea Backup Manuale": "Create Manual Backup",
+ "Crea e gestisci gli eventi della biblioteca": "Create and manage library events",
"Crea Evento": "Create Event",
+ "Crea gli scaffali (es: A, B, C)": "Create shelves (e.g.: A, B, C)",
+ "Crea il primo utente amministratore. Questo account avrà accesso completo a tutte le funzionalità del sistema.": "Create the first administrator user. This account will have full access to all system features.",
+ "Crea il tuo primo evento": "Create your first event",
+ "Crea Indici Automaticamente": "Create Indexes Automatically",
+ "Crea la cartella logs se non esiste:
mkdir -p logs": "Create the logs folder if it doesn't exist:
mkdir -p logs",
"Crea Nuova API Key": "Create New API Key",
"Crea Nuova Prenotazione": "Create New Reservation",
+ "Crea nuovo": "Create new",
+ "Crea nuovo \"${item.label}\"": "Create new \"${item.label}\"",
"Crea Nuovo Evento": "Create New Event",
"Crea Nuovo Genere": "Create New Genre",
"Crea Nuovo Prestito": "Create New Loan",
+ "Crea opera": "Create work",
+ "Crea opera multi-volume": "Create multi-volume work",
"Crea Prenotazione": "Create Reservation",
"Crea Prestito": "Create Loan",
"Crea Prima API Key": "Create First API Key",
"Crea Primo Genere": "Create First Genre",
- "Crea Utente Admin": "Create Admin User",
- "Crea Utente Amministratore": "Create Administrator User",
- "Crea e gestisci gli eventi della biblioteca": "Create and manage library events",
- "Crea gli scaffali (es: A, B, C)": "Create shelves (e.g.: A, B, C)",
- "Crea il primo utente amministratore. Questo account avrà accesso completo a tutte le funzionalità del sistema.": "Create the first administrator user. This account will have full access to all system features.",
- "Crea il tuo primo evento": "Create your first event",
- "Crea la cartella logs se non esiste:
mkdir -p logs": "Create the logs folder if it doesn't exist:
mkdir -p logs",
- "Crea nuovo": "Create new",
- "Crea nuovo \"${item.label}\"": "Create new \"${item.label}\"",
+ "Crea Tabelle Mancanti": "Create Missing Tables",
+ "Crea un backup manuale o attendi il prossimo aggiornamento.": "Create a manual backup or wait for the next update.",
+ "Crea un libro padre che raccoglie tutti i volumi di questa collana.": "Create a parent book that collects all volumes of this series.",
"Crea un nuovo account": "Create a new account",
"Crea un nuovo profilo amministratore o lettore.": "Create a new administrator or reader profile.",
+ "Crea Utente Admin": "Create Admin User",
+ "Crea Utente Amministratore": "Create Administrator User",
+ "Creare backup?": "Create backup?",
+ "Creata": "Created",
+ "Creata il": "Created on",
"Creata:": "Created:",
"Creato il": "Created on",
+ "Creazione backup database": "Creating database backup",
+ "Creazione backup...": "Creating backup...",
+ "Creazione indici di ottimizzazione...": "Creating optimization indexes...",
+ "Creazione indici...": "Creating indexes...",
+ "Creazione tabelle...": "Creating tables...",
+ "Credenziali": "Credentials",
"Credenziali Admin:": "Admin Credentials:",
"Credenziali Errate": "Invalid Credentials",
+ "Credenziali non valide o utente non admin": "Invalid credentials or user is not admin",
"Crediti": "Credits",
"Crescente": "Ascending",
"Crittografia": "Encryption",
"Cronologia": "History",
+ "Cronologia Aggiornamenti": "Update History",
+ "Cronologia degli aggiornamenti eseguiti": "History of executed updates",
+ "Cronologia Import": "Import History",
+ "crontab -e": "crontab -e",
+ "CSRF": "CSRF",
+ "CSRF Fallito": "CSRF Failed",
+ "CSRF non valido.": "Invalid CSRF token.",
+ "CSS Personalizzato": "Custom CSS",
+ "CSV": "CSV",
+ "CSV Standard": "Standard CSV",
+ "Curatore": "Curator",
"Da": "From",
- "Da Inventariare": "To Be Inventoried",
+ "Da %s (%s)": "From %s (%s)",
"Da approvare": "To approve",
+ "Da approvare o rifiutare": "To approve or reject",
"Da consegnare": "To deliver",
"Da creare": "To be created",
+ "Da Dove Acquisito": "Acquired From",
+ "Da Inventariare": "To Be Inventoried",
"Da prenotazione": "From reservation",
"Da prenotazioni": "From reservations",
- "Da %s (%s)": "From %s (%s)",
"Da qui puoi gestire tutte le lingue disponibili nell'applicazione. Carica file JSON di traduzione e abilita/disabilita lingue.": "From here you can manage all available languages in the application. Upload JSON translation files and enable/disable languages.",
+ "Da Ritirare": "Ready for Pickup",
+ "Da ritirare": "Ready for pickup",
"Dal": "From",
"Dal %s al %s": "From %s to %s",
"Dal:": "From:",
"Danneggiato": "Damaged",
+ "danneggiato": "damaged",
"Dansk (DA)": "Danish (DA)",
"Dashboard": "Dashboard",
"Data": "Date",
"Data Acq.": "Acq. Date",
"Data Acquisizione": "Acquisition Date",
- "Data Evento": "Event Date",
- "Data Fine": "End Date",
- "Data Inizio": "Start Date",
- "Data Prenotazione": "Reservation Date",
- "Data Prestito": "Loan Date",
- "Data Prestito:": "Loan Date:",
- "Data Pubblicazione": "Publication Date",
- "Data Restituzione:": "Return Date:",
- "Data Scadenza": "Due Date",
- "Data Scadenza:": "Due Date:",
"Data acquisizione": "Acquisition date",
"Data acquisizione a": "Acquisition date to",
"Data acquisizione da": "Acquisition date from",
- "Data di Pubblicazione": "Publication Date",
+ "Data creazione": "Created at",
"Data di inizio della prenotazione (default: oggi)": "Reservation start date (default: today)",
"Data di morte": "Date of Death",
"Data di nascita": "Date of Birth",
+ "Data di Pubblicazione": "Publication Date",
"Data di pubblicazione": "Publication date",
"Data di scadenza della prenotazione (default: +30 giorni)": "Reservation expiry date (default: +30 days)",
- "Data fine": "End date",
+ "Data Evento": "Event Date",
+ "Data Fine": "End Date",
+ "Data fine": "End date",
+ "Data Fine Lettura": "Reading End Date",
+ "Data Fine Prestito": "Loan End Date",
+ "Data Inizio": "Start Date",
"Data inizio": "Start date",
+ "Data Inizio Lettura": "Reading Start Date",
+ "Data Inizio Prestito": "Loan Start Date",
"Data inizio richiesta mancante": "Request start date missing",
+ "Data Inserimento LibraryThing": "LibraryThing Entry Date",
"Data morte a": "Death date to",
"Data morte da": "Death date from",
"Data nascita a": "Birth date to",
"Data nascita da": "Birth date from",
+ "Data non valida.": "Invalid date.",
"Data originale di pubblicazione (formato italiano)": "Original publication date (Italian format)",
+ "Data Prenotazione": "Reservation Date",
+ "Data Prestito": "Loan Date",
"Data prestito": "Loan date",
"Data prestito (A)": "Loan date (To)",
"Data prestito (Da)": "Loan date (From)",
+ "Data Prestito:": "Loan Date:",
+ "Data Pubblicazione": "Publication Date",
"Data pubblicazione da": "Publication date from",
+ "Data Restituzione": "Return Date",
+ "Data Restituzione:": "Return Date:",
+ "Data Scadenza": "Due Date",
"Data scadenza prevista": "Expected due date",
+ "Data Scadenza:": "Due Date:",
+ "Data/Ora": "Date/Time",
"Data:": "Date:",
+ "Database": "Database",
+ "Database '%s' non esiste. Crealo prima di procedere.": "Database '%s' does not exist. Please create it before proceeding.",
"Database installato (30 tabelle)": "Database installed (30 tables)",
+ "Database installato (41 tabelle)": "Database installed (41 tables)",
+ "Database installato (46 tabelle)": "Database installed (46 tables)",
"Database:": "Database:",
+ "DataIntegrity warning (store loan)": "DataIntegrity warning (store loan)",
"Date": "Dates",
+ "Date di Lettura": "Reading Dates",
"Date Non Valide": "Invalid Dates",
"Dati Account": "Account Data",
+ "Dati alternativi disponibili": "Alternative data available",
"Dati bibliografici completi (titolo, sottotitolo, ISBN, EAN, ecc.)": "Complete bibliographic data (title, subtitle, ISBN, EAN, etc.)",
"Dati della Prenotazione": "Reservation Details",
+ "Dati di classificazione mancanti": "Classification data missing",
"Dati essenziali caricati": "Essential data loaded",
- "Database installato (41 tabelle)": "Database installed (41 tables)",
+ "Dati generi mancanti": "Genre data missing",
"Dati iniziali importati OK": "Initial data imported OK",
+ "Dati libro recuperati con successo da Open Library": "Book data successfully retrieved from Open Library",
"Dati mancanti": "Missing data",
"Dati personali": "Personal data",
"Dati Utente": "User Details",
+ "Dati validi.": "Valid data.",
"Debug": "Debug",
"Debug Log:": "Debug Log:",
"Deceduto il %s": "Died on %s",
+ "Decimali": "Decimals",
"Decrescente": "Descending",
"Default: un mese dopo la data inizio": "Default: one month after start date",
"Definisce i privilegi dell'utente.": "Defines user privileges.",
+ "della lingua desiderata.": "of the desired language.",
"Demo": "Demo",
- "Deseleziona tutti": "Deselect all",
- "Decimali": "Decimals",
"Descrivi l'utilizzo di questa API key...": "Describe the usage of this API key...",
"Descrizione": "Description",
"Descrizione Banner": "Banner Description",
- "Descrizione Evento": "Event Description",
- "Descrizione Modale": "Modal Description",
- "Descrizione OG": "OG Description",
- "Descrizione Open Graph": "Open Graph Description",
- "Descrizione SEO": "SEO Description",
- "Descrizione Twitter": "Twitter Description",
"Descrizione banner": "Banner description",
"Descrizione breve": "Short description",
"Descrizione completa dell'evento con possibilità di formattazione HTML": "Full event description with HTML formatting options",
@@ -752,87 +996,151 @@
"Descrizione cookie essenziali": "Essential cookies description",
"Descrizione cookie marketing": "Marketing cookies description",
"Descrizione del libro...": "Book description...",
+ "Descrizione della collana...": "Series description...",
+ "Descrizione Dewey": "Dewey Description",
+ "Descrizione Evento": "Event Description",
+ "Descrizione Fisica": "Physical Description",
"Descrizione footer": "Footer description",
+ "Descrizione Modale": "Modal Description",
"Descrizione modale": "Modal description",
"Descrizione nella modale preferenze. Puoi usare HTML.": "Description in the preferences modal. You can use HTML.",
+ "Descrizione OG": "OG Description",
+ "Descrizione Open Graph": "Open Graph Description",
"Descrizione per anteprima social. Se vuoto, usa la descrizione SEO.": "Description for social preview. If empty, uses the SEO description.",
+ "Descrizione per Twitter/X. Se vuoto, usa la descrizione Open Graph.": "Description for Twitter/X. If empty, uses Open Graph description.",
+ "Descrizione salvata": "Description saved",
+ "Descrizione SEO": "SEO Description",
"Descrizione troppo lunga (max 2000 caratteri)": "Description too long (max 2000 characters)",
+ "Descrizione Twitter": "Twitter Description",
"Descrizione:": "Description:",
+ "Deseleziona tutti": "Deselect all",
"Dettagli": "Details",
"Dettagli Acquisizione": "Acquisition Details",
+ "Dettagli del Prestito": "Loan Details",
+ "Dettagli evento": "Event details",
"Dettagli Fisici": "Physical Details",
"Dettagli Libro": "Book Details",
"Dettagli Messaggio": "Message Details",
- "Dettagli del Prestito": "Loan Details",
- "Dettagli evento": "Event details",
"Dettagli principali dell'evento": "Main event details",
"Dettagli restituzione": "Return details",
"Deutsch (DE)": "German (DE)",
"Deve contenere maiuscole, minuscole e numeri": "Must contain uppercase, lowercase and numbers",
"Deve iniziare con": "Must start with",
+ "deve iniziare con": "must start with",
"Devi accettare la Privacy Policy per procedere": "You must accept the Privacy Policy to proceed",
+ "Devi elencare manualmente i cookie tracciati da questi script nella": "You must manually list the cookies tracked by these scripts in the",
"Devi eseguire": "You must run",
"Dewey": "Dewey",
+ "di": "of",
+ "di %s": "of %s",
+ "dicembre": "December",
+ "Digitale": "Digital",
"Dimensione": "Size",
"Dimensioni": "Dimensions",
"Dipendenze": "Dependencies",
+ "directory": "directories",
+ "Directory non scrivibile: %s": "Directory not writable: %s",
"Directory plugin già esistente.": "Plugin directory already exists.",
+ "Directory sorgente non trovata": "Source directory not found",
+ "Directory Upload Pubblici": "Public Uploads Directory",
"Disabilita": "Disable",
+ "Disabilita prestiti, prenotazioni e wishlist. Gli utenti potranno solo consultare il catalogo.": "Disable loans, reservations and wishlist. Users will only be able to browse the catalogue.",
"Disabilita se il tuo sito non usa cookie analitici (es. Google Analytics)": "Disable if your site doesn't use analytics cookies (e.g. Google Analytics)",
"Disabilita se il tuo sito non usa cookie di marketing/advertising": "Disable if your site doesn't use marketing/advertising cookies",
- "Disabilitata - Nascosta nel frontend": "Disabled - Hidden in frontend",
- "Disabilitata": "Disabled",
- "Disabilita prestiti, prenotazioni e wishlist. Gli utenti potranno solo consultare il catalogo.": "Disable loans, reservations and wishlist. Users will only be able to browse the catalogue.",
"Disabilita tutte le funzionalità di prestito e prenotazione": "Disable all loan and reservation features",
+ "Disabilitata": "Disabled",
+ "Disabilitata - Nascosta nel frontend": "Disabled - Hidden in frontend",
"Disabilitato": "Disabled",
"Disattiva": "Deactivate",
"Disattiva modalità manutenzione": "Disable maintenance mode",
"Disattivata": "Inactive",
+ "disattivata": "disabled",
+ "Disattivato": "Disabled",
+ "Disattivo": "Disabled",
+ "Disco": "Disc",
+ "Discografia": "Discography",
"Disconnesso": "Disconnected",
+ "Disconnetti": "Sign out",
+ "Disconnetti tutti": "Sign out all",
+ "Discreto": "Fair",
"Disinstalla": "Uninstall",
- "Divisioni": "Divisions",
+ "Disinstalla Plugin": "Uninstall Plugin",
"Disponibile": "Available",
+ "disponibile": "available",
"Disponibile dal:": "Available from:",
+ "Disponibile nella data selezionata": "Available on selected date",
"Disponibile ora": "Available Now",
"Disponibile per il prestito.": "Available for loan.",
"Disponibile solo con driver SMTP": "Available only with SMTP driver",
"Disponibili": "Available",
"Disponibili e in prestito": "Available and on loan",
+ "disponibili ora": "available now",
"Disponibilità": "Availability",
"Disponibilità copie": "Copy availability",
+ "Dispositivo sconosciuto": "Unknown device",
"Divisione (010-990)": "Division (010-990)",
+ "Divisioni": "Divisions",
+ "Do you want to automatically fix the detected integrity issues?": "Do you want to automatically fix the detected integrity issues?",
+ "Do you want to run full system maintenance? This may take a few minutes.": "Do you want to run full system maintenance? This may take a few minutes.",
"Documentazione": "Documentation",
"Documentazione API": "API Documentation",
"Documento": "Document",
"Documento generato il %s alle %s": "Document generated on %s at %s",
+ "Domini mirror": "Mirror domains",
+ "Dominio non valido. Inserisci solo host o host:porta, senza percorsi.": "Invalid domain. Enter only host or host:port, without paths.",
+ "Dominio personalizzato...": "Custom domain...",
"Donazione": "Donation",
+ "donazione": "donation",
+ "dopo aver completato l'installazione.": "after completing the installation.",
"Dopo la conferma, un amministratore approverà la tua iscrizione.": "After confirmation, an administrator will approve your registration.",
"Dopo la rigenerazione, invia l'URL della sitemap a Google Search Console e Bing Webmaster Tools": "After regeneration, submit sitemap URL to Google Search Console and Bing Webmaster Tools",
+ "Download aggiornamento": "Downloading update",
+ "Download completato": "Download completed",
+ "Download copertina fallito": "Cover download failed",
+ "Download fallito": "Download failed",
"Driver": "Driver",
"Driver Email": "Email Driver",
+ "Durata": "Duration",
+ "DVD": "DVD",
"EAN": "EAN",
"EAN:": "EAN:",
- "ERRORE:": "ERROR:",
+ "eBook": "eBook",
+ "eBook (PDF/ePub)": "eBook (PDF/ePub)",
+ "eBook caricato!": "eBook uploaded!",
+ "eBook disponibile": "eBook available",
"Eccellente": "Excellent",
+ "Eccezione creazione %s su %s:": "Exception creating %s on %s:",
+ "Eccezione creazione tabella %s:": "Exception creating table %s:",
"Editor Classificazione Dewey": "Dewey Classification Editor",
"Editore": "Publisher",
"Editore \"${item.label}\" selezionato": "Publisher \"${item.label}\" selected",
"Editore \"${value}\" pronto per essere creato": "Publisher \"${value}\" ready to be created",
"Editore \"%s\" pronto per essere creato": "Publisher \"%s\" ready to be created",
"Editore \"%s\" selezionato": "Publisher \"%s\" selected",
+ "Editore %s": "Publisher %s",
+ "Editore applicato": "Publisher applied",
"Editore eliminato con successo.": "Publisher deleted successfully.",
+ "Editore principale": "Primary publisher",
"Editore sconosciuto": "Unknown publisher",
"Editore selezionato:": "Selected publisher:",
"Editore trovato:": "Publisher found:",
"Editore:": "Publisher:",
"Editore: %s": "Publisher: %s",
"Editori": "Publishers",
+ "editori": "publishers",
"Editori uniti": "Publishers merged",
"Editori uniti con successo": "Publishers merged successfully",
- "Editore principale": "Primary publisher",
+ "editori. Questa azione non può essere annullata.": "publishers. This action cannot be undone.",
+ "editori. Tutti i libri verranno assegnati all'editore risultante.": "publishers. All books will be assigned to the resulting publisher.",
"Edizione": "Edition",
+ "Elaborati": "Processed",
"Elaborato da": "Processed by",
+ "Elaborazione in corso...": "Processing...",
+ "Elaborazione lista attesa fallita": "Waitlist processing failed",
+ "Elaborazione...": "Processing...",
"Elementi": "Items",
+ "elementi": "items",
+ "elemento": "item",
"Elenco Autori": "Authors List",
"Elenco Autori - Biblioteca": "Author List - Library",
"Elenco Editori": "Publishers List",
@@ -843,38 +1151,47 @@
"Elenco Utenti": "Users List",
"Elenco Utenti - Biblioteca": "Users List - Library",
"Elimina": "Delete",
+ "Elimina collana": "Delete series",
+ "Elimina copia": "Delete copy",
+ "Elimina il file .installed dalla root del progetto e riprova": "Delete the .installed file from the project root and try again",
"Elimina Installer": "Delete Installer",
"Elimina Installer (Richiede Composer)": "Delete Installer (Requires Composer)",
+ "elimina la cartella": "delete the folder",
"Elimina Lingua": "Delete Language",
- "Elimina copia": "Delete copy",
- "Elimina il file .installed dalla root del progetto e riprova": "Delete the .installed file from the project root and try again",
"Elimina questa lingua. Questa azione non può essere annullata.": "Delete this language. This action cannot be undone.",
+ "Elimina recensione": "Delete review",
+ "Eliminare i libri selezionati?": "Delete selected books?",
+ "Eliminare il file .installed dalla root del progetto e rieseguire l'installer": "Delete the .installed file from the project root and run the installer again",
"Eliminare il libro?": "Delete book?",
"Eliminare l'utente?": "Delete the user?",
"Eliminare questa mensola? (Solo se vuota)": "Delete this shelf? (Only if empty)",
+ "Eliminare questo backup?": "Delete this backup?",
"Eliminare questo scaffale? (Solo se vuoto)": "Delete this bookcase? (Only if empty)",
- "Eliminato!": "Deleted!",
"Eliminati": "Deleted",
+ "Eliminato!": "Deleted!",
+ "Eliminazione in corso...": "Deleting...",
"Email": "Email",
"Email *": "Email *",
- "Email Contatto": "Contact Email",
- "Email Non Valida": "Invalid Email",
- "Email Non Verificata": "Unverified Email",
- "Email Referente": "Contact Person Email",
+ "Email Admin": "Admin Email",
"Email associata al tuo account": "Email associated with your account",
"Email configurata": "Email configured",
+ "Email Contatto": "Contact Email",
"Email di contatto": "Contact email",
"Email di recupero inviata con successo!": "Recovery email sent successfully!",
"Email dove ricevere i messaggi dal form contatti": "Email where to receive messages from contact form",
"Email e telefono visibili sulla pagina contatti": "Email and phone visible on contact page",
"Email già registrata": "Email already registered",
"Email non trovata nel nostro sistema": "Email not found in our system",
+ "Email Non Valida": "Invalid Email",
"Email non valida. Verifica il formato": "Invalid email. Check the format",
+ "Email Non Verificata": "Unverified Email",
"Email non verificata. Controlla la tua casella di posta e clicca sul link di verifica": "Email not verified. Check your inbox and click the verification link",
"Email o password non corretti. Verifica le credenziali e riprova": "Email or password incorrect. Check your credentials and try again",
"Email per notifiche": "Email for notifications",
+ "Email Referente": "Contact Person Email",
"Email troppo lunga (massimo 255 caratteri)": "Email too long (maximum 255 characters)",
"Email utente": "User email",
+ "Email verificata con successo! Il tuo account è ora in attesa di approvazione da parte dell'amministratore. Riceverai un'email quando sarà attivato.": "Email verified successfully! Your account is now pending administrator approval. You will receive an email when it is activated.",
"Email:": "Email:",
"Embed della mappa (Google Maps o OpenStreetMap). Puoi inserire l'URL o il codice iframe completo.": "Map embed (Google Maps or OpenStreetMap). You can insert the URL or full iframe code.",
"Emoji Bandiera": "Flag Emoji",
@@ -882,53 +1199,83 @@
"Emoji della bandiera del paese (opzionale, default: 🌐)": "Country flag emoji (optional, default: 🌐)",
"Encryption": "Encryption",
"Endpoint": "Endpoint",
- "Es. Italiana...": "E.g. Italian...",
- "Es. Milano...": "E.g. Milan...",
+ "Endpoint SRU:": "SRU Endpoint:",
"English (EN)": "English (EN)",
"Errore": "Error",
- "Errore Installazione": "Installation Error",
- "Errore Upload": "Upload Error",
+ "Errore aggiornamento log": "Error updating log",
+ "Errore annullamento prenotazione": "Reservation cancellation error",
+ "Errore annullamento prestito": "Loan cancellation error",
+ "Errore attivazione prestito schedulato": "Scheduled loan activation error",
+ "Errore backup database": "Database backup error",
"Errore caricamento Audiobook": "Audiobook upload error",
"Errore caricamento classificazione Dewey": "Error loading Dewey classification",
"Errore caricamento eBook": "eBook upload error",
+ "Errore connessione database": "Database connection error",
+ "Errore correzione dati:": "Data correction error:",
+ "Errore creazione %s su %s:": "Error creating %s on %s:",
+ "Errore creazione indici:": "Index creation error:",
+ "Errore creazione tabella %s:": "Error creating table %s:",
+ "Errore creazione tabella migrazioni": "Error creating migrations table",
+ "Errore creazione tabella update_logs": "Error creating update_logs table",
+ "Errore database": "Database error",
"Errore database:": "Database error:",
- "Errore del Server": "Server Error",
"Errore del database": "Database error",
"Errore del database durante la registrazione. Riprova più tardi": "Database error during registration. Please try again later",
+ "Errore del Server": "Server Error",
"Errore del server": "Server error",
"Errore del server. Riprova più tardi.": "Server error. Please try again later.",
+ "Errore del server. Riprova.": "Server error. Please try again.",
"Errore di comunicazione con il server": "Server communication error",
+ "errore di comunicazione con il server": "server communication error",
"Errore di configurazione del server.": "Server configuration error.",
"Errore di configurazione.": "Configuration error.",
"Errore di connessione": "Connection error",
"Errore di connessione durante l'importazione": "Connection error during import",
"Errore di connessione:": "Connection error:",
+ "Errore di rete": "Network error",
"Errore di salvataggio": "Save error",
+ "Errore di salvataggio. Riprova più tardi.": "Save error. Please try again later.",
"Errore di sicurezza": "Security error",
"Errore di sicurezza, riprova": "Security error, try again",
"Errore di sicurezza. Aggiorna la pagina e riprova": "Security error. Refresh the page and try again",
+ "Errore di sicurezza. Ricarica la pagina e riprova": "Security error. Reload the page and try again",
"Errore di sicurezza. Ricarica la pagina e riprova.": "Security error. Reload the page and try again.",
+ "Errore di sicurezza. Riprova.": "Security error. Please try again.",
"Errore di sistema.": "System error.",
"Errore durante il caricamento dei dettagli del plugin.": "Error loading plugin details.",
"Errore durante il caricamento del file (code: %s).": "Error uploading file (code: %s).",
"Errore durante il caricamento del file.": "Error during file upload.",
+ "Errore durante il controllo": "Error during check",
+ "Errore durante il recupero dei dati": "Error retrieving data",
+ "Errore durante il recupero delle sessioni": "Error retrieving sessions",
"Errore durante il ricalcolo:": "Error during recalculation:",
"Errore durante il rifiuto": "Error during rejection",
"Errore durante il salvataggio": "Error while saving",
+ "Errore durante il salvataggio delle impostazioni.": "Error saving settings.",
"Errore durante il salvataggio delle impostazioni:": "Error saving settings:",
"Errore durante il salvataggio nel database.": "Error saving to database.",
"Errore durante il salvataggio.": "Error during save.",
"Errore durante il salvataggio:": "Error during save:",
"Errore durante il seed": "Error during seed",
"Errore durante l'aggiornamento": "Error during update",
+ "Errore durante l'aggiornamento del profilo.": "Error updating profile.",
"Errore durante l'aggiornamento dell'evento.": "Error updating event.",
"Errore durante l'aggiornamento della chiave Google Books.": "Error updating Google Books key.",
+ "Errore durante l'aggiornamento delle copie": "Error updating copies",
+ "Errore durante l'aggiornamento dello stato": "Error updating status",
+ "Errore durante l'annullamento del ritiro": "Error cancelling pickup",
+ "Errore durante l'applicazione del fix:": "Error while applying fix:",
"Errore durante l'approvazione": "Error during approval",
+ "Errore durante l'arricchimento": "Error during enrichment",
+ "Errore durante l'attivazione": "Error during activation",
"Errore durante l'attivazione del plugin.": "Error activating plugin.",
+ "Errore durante l'attivazione del tema": "Error activating theme",
"Errore durante l'attivazione: %s": "Error during activation: %s",
+ "Errore durante l'eliminazione del libro. Riprova.": "Error deleting the book. Please try again.",
"Errore durante l'eliminazione dell'evento.": "Error deleting event.",
"Errore durante l'estrazione del plugin.": "Error extracting plugin.",
"Errore durante l'import: %s": "Import error: %s",
+ "Errore durante l'importazione (HTTP": "Error during import (HTTP",
"Errore durante l'importazione (HTTP %d)": "Import error (HTTP %d)",
"Errore durante l'importazione dati": "Error during data import",
"Errore durante l'installazione del plugin.": "Error installing plugin.",
@@ -937,64 +1284,79 @@
"Errore durante l'invio dell'email. Riprova più tardi": "Error sending the email. Please try again later",
"Errore durante l'unione degli autori": "Error merging authors",
"Errore durante l'unione degli editori": "Error merging publishers",
- "Errore imprevisto durante l'unione degli autori": "Unexpected error merging authors",
- "Errore imprevisto durante l'unione degli editori": "Unexpected error merging publishers",
"Errore durante l'upload.": "Upload error.",
+ "Errore durante la conferma del ritiro": "Error confirming pickup",
"Errore durante la correzione:": "Error during correction:",
+ "Errore durante la creazione degli indici": "Error while creating indexes",
+ "Errore durante la creazione degli indici:": "Error while creating indexes:",
"Errore durante la creazione del prestito.": "Error creating the loan.",
"Errore durante la creazione dell'evento.": "Error creating event.",
"Errore durante la creazione dell'utente:": "Error during user creation:",
+ "Errore durante la creazione delle tabelle:": "Error creating tables:",
"Errore durante la disattivazione del plugin.": "Error during plugin deactivation.",
"Errore durante la disattivazione: %s": "Error during deactivation: %s",
"Errore durante la disinstallazione del plugin.": "Error during plugin uninstallation.",
"Errore durante la finalizzazione:": "Error during finalization:",
"Errore durante la manutenzione:": "Error during maintenance:",
+ "Errore durante la prenotazione": "Error during reservation",
"Errore durante la registrazione": "Registration error",
+ "Errore durante la revoca della sessione": "Error revoking session",
+ "Errore durante la revoca delle sessioni": "Error revoking sessions",
+ "Errore durante la ricerca": "Error during search",
"Errore durante la ricerca su": "Error during search on",
"Errore durante la rimozione dal database.": "Error removing from database.",
+ "Errore durante la verifica dei libri associati": "Error verifying associated books",
+ "Errore durante la verifica dei prestiti attivi": "Error verifying active loans",
+ "Errore elaborazione restituzione": "Return processing error",
+ "Errore elaborazione ritiro scaduto": "Expired pickup processing error",
+ "Errore export CSV": "CSV export error",
+ "Errore fatale durante aggiornamento": "Fatal error during update",
+ "Errore generazione calendario": "Calendar generation error",
+ "Errore generazione PDF prestito": "Error generating loan PDF",
+ "Errore gestione cambio stato copia": "Copy status change handling error",
+ "Errore gestione copia non disponibile": "Copy unavailable handling error",
+ "Errore imprevisto durante l'unione degli autori": "Unexpected error merging authors",
+ "Errore imprevisto durante l'unione degli editori": "Unexpected error merging publishers",
+ "Errore Installazione": "Installation Error",
+ "Errore interno del database": "Internal database error",
+ "Errore interno del database durante la verifica": "Internal database error during verification",
"Errore interno del database. Riprova più tardi.": "Internal database error. Please try again later.",
+ "Errore interno durante acquisizione lock.": "Internal error while acquiring lock.",
"Errore interno durante l'approvazione": "Internal error during approval",
"Errore interno: %s": "Internal error: %s",
+ "Errore invio notifica differita": "Deferred notification send error",
+ "Errore invio notifica ritiro pronto": "Error sending pickup ready notification",
+ "Errore invio notifica ritiro scaduto": "Error sending pickup expired notification",
+ "Errore lettura calendario": "Calendar read error",
+ "Errore modifica data prenotazione": "Reservation date change error",
+ "Errore nel caricamento dei backup.": "Error loading backups.",
"Errore nel caricamento dei libri": "Error loading books",
"Errore nel caricamento del file": "Error while uploading the file",
- "Aggiunge badge cliccabili alla scheda libro per cercare su Anna's Archive, Z-Library e Project Gutenberg con un click. Ispirato all'estensione browser GoodLib.": "Adds clickable badges to the book detail page to search on Anna's Archive, Z-Library, and Project Gutenberg in one click. Inspired by the GoodLib browser extension.",
- "Anna's Archive": "Anna's Archive",
- "Catalogo pubblico": "Public catalog",
- "Configura Fonti": "Configure Sources",
- "Domini mirror": "Mirror domains",
- "Dominio non valido. Inserisci solo host o host:porta, senza percorsi.": "Invalid domain. Enter only host or host:port, without paths.",
- "Dominio personalizzato...": "Custom domain...",
- "Errore durante l'aggiornamento del profilo.": "Error updating profile.",
- "Cerca su:": "Search on:",
- "Predefinita del sito": "Site default",
- "Cerca \"%s\" su %s": "Search \"%s\" on %s",
- "Fonti attive": "Active sources",
- "GoodLib — External Sources": "GoodLib — External Sources",
- "GoodLib — Fonti Esterne": "GoodLib — External Sources",
- "Impostazioni GoodLib salvate correttamente.": "GoodLib settings saved successfully.",
- "Mostra badge nella pagina dettaglio libro": "Show badges on the book detail page",
- "Mostra badge nell'area amministrazione": "Show badges in the admin area",
- "Mostra i badge nella pagina dettaglio libro del catalogo": "Show badges on the catalog book detail page",
- "Mostra i badge nella scheda libro dell'area amministrazione": "Show badges on the admin book page",
- "Project Gutenberg": "Project Gutenberg",
- "Puoi scegliere un mirror suggerito oppure selezionare dominio personalizzato.": "You can choose a suggested mirror or select a custom domain.",
- "Puoi usare i mirror suggeriti oppure inserire un dominio custom.": "You can use the suggested mirrors or enter a custom domain.",
- "Questi siti cambiano dominio spesso. Seleziona un mirror funzionante.": "These sites often change domain. Select a working mirror.",
- "Scheda libro admin": "Admin book page",
- "Sono accettati anche domini personalizzati; se incolli un URL completo verrà salvato solo l'host.": "Custom domains are also accepted; if you paste a full URL, only the host will be saved.",
- "Visibilita": "Visibility",
- "Visibilità": "Visibility",
- "Z-Library": "Z-Library",
"Errore nel caricamento del file JSON": "Error loading JSON file",
+ "Errore nel caricamento.": "Error loading.",
"Errore nel caricamento. Riprova.": "Error loading. Please try again.",
"Errore nel download della copertina.": "Error downloading the cover.",
+ "Errore nel parsing del file JSON.": "Error parsing JSON file.",
+ "Errore nel parsing della risposta": "Error parsing the response",
+ "Errore nel recupero dati tabella %s": "Error retrieving data for table %s",
+ "Errore nel recupero dei figli": "Error retrieving children",
"Errore nel recupero delle categorie.": "Error fetching the categories.",
"Errore nel recupero delle divisioni.": "Error fetching the divisions.",
"Errore nel recupero delle specifiche.": "Error fetching the specific sections.",
+ "Errore nel recupero delle tabelle": "Error retrieving tables",
+ "Errore nel recupero struttura tabella %s": "Error retrieving structure for table %s",
"Errore nel rifiuto": "Error in rejection",
"Errore nel rifiuto della richiesta": "Error while rejecting the request",
+ "Errore nel ripristino dei colori": "Error resetting colors",
+ "Errore nel ripristino.": "Error during restore.",
+ "Errore nel salvataggio del file di traduzione": "Error saving translation file",
+ "Errore nel salvataggio del file route": "Error saving route file",
+ "Errore nel salvataggio del file.": "Error saving file.",
+ "Errore nel salvataggio del tema": "Error saving theme",
+ "Errore nel salvataggio del token": "Error saving the token",
"Errore nel salvataggio dell'immagine.": "Error saving the image.",
"Errore nel salvataggio dell'ordine. Ricarica la pagina e riprova.": "Error saving order. Please reload the page and try again.",
+ "Errore nel salvataggio delle impostazioni.": "Error saving settings.",
"Errore nell'aggiornamento del template": "Error updating template",
"Errore nell'aggiornamento dello stato dell'API key: %s": "Error updating API key status: %s",
"Errore nell'aggiornamento:": "Error updating:",
@@ -1003,39 +1365,116 @@
"Errore nell'eliminazione dell'API key: %s": "Error deleting API key: %s",
"Errore nell'eliminazione:": "Error deleting:",
"Errore nell'operazione:": "Error in operation:",
- "Errore nella Verifica dell'Installazione": "Installation Verification Error",
+ "Errore nella codifica JSON.": "JSON encoding error.",
"Errore nella comunicazione con il server": "Server communication error",
+ "Errore nella conferma del ritiro": "Error confirming pickup",
+ "Errore nella copia del file: %s": "Error copying file: %s",
"Errore nella copia:": "Copy error:",
"Errore nella copia: ": "Copy error: ",
"Errore nella creazione del genere.": "Error while creating the genre.",
"Errore nella creazione dell'API key: %s": "Error creating API key: %s",
+ "Errore nella creazione dell'opera": "Error creating the work",
"Errore nella creazione della recensione": "Error creating review",
"Errore nella creazione della richiesta di prestito": "Error creating loan request",
"Errore nella creazione:": "Error creating:",
+ "Errore nella lettura del backup.": "Error reading backup file.",
+ "Errore nella lettura del file Dewey esistente.": "Error reading existing Dewey file.",
+ "Errore nella lettura del file.": "Error reading file.",
"Errore nella prenotazione": "Reservation error",
+ "Errore nella prenotazione.": "Error creating reservation.",
"Errore nella query.": "Query error.",
"Errore nella ricerca": "Search error",
- "Errore suggerimento": "Suggestion error",
- "Errore!": "Error!",
- "Errore:": "Error:",
- "Errore: ": "Error: ",
- "Errore: Utente non trovato": "Error: User not found",
- "Errore: la data di scadenza deve essere successiva alla data di prestito.": "Error: the due date must be after the loan date.",
- "Errore: tutti i campi obbligatori devono essere compilati.": "Error: all required fields must be filled.",
- "Errori durante l'import": "Import Errors",
- "Errori di validazione dopo il merge.": "Validation errors after merge.",
- "Es. Biblioteca Digitale - Migliaia di libri da esplorare": "E.g. Digital Library - Thousands of books to explore",
- "Es. Esplora migliaia di libri, prenota online e gestisci i tuoi prestiti.": "E.g. Explore thousands of books, book online and manage your loans.",
- "Es. Italiana, Americana, Francese...": "E.g. Italian, American, French...",
- "Es. Italiana, Americana...": "E.g. Italian, American...",
- "Es. La Tua Biblioteca Digitale": "E.g. Your Digital Library",
- "Es. Presentazione libro \"Il Nome della Rosa\"": "E.g. Book presentation \"The Name of the Rose\"",
- "Es. Scopri il nostro catalogo digitale con migliaia di libri disponibili per il prestito. Registrati gratuitamente e inizia a leggere oggi stesso.": "E.g. Discover our digital catalog with thousands of books available for loan. Register for free and start reading today.",
- "Es. Un libro fantastico!": "E.g. An amazing book!",
- "Es. Un libro straordinario!": "E.g. An extraordinary book!",
+ "Errore nella ricerca.": "Error during search.",
+ "Errore nella richiesta di prestito.": "Error creating loan request.",
+ "Errore nella Verifica dell'Installazione": "Installation Verification Error",
+ "Errore prenotazione": "Reservation error",
+ "Errore preparazione completamento log": "Error preparing log completion",
+ "Errore preparazione insert migrazione": "Error preparing migration insert",
+ "Errore preparazione log aggiornamento": "Error preparing update log",
+ "Errore preparazione query migrazioni": "Error preparing migrations query",
+ "Errore processamento immagine": "Image processing error",
+ "Errore recupero batch migrazioni": "Error fetching migrations batch",
+ "Errore recupero risultati migrazioni": "Error fetching migrations results",
+ "Errore riassegnazione copia": "Copy reassignment error",
+ "Errore riassegnazione copia persa": "Lost copy reassignment error",
+ "Errore richiesta prestito": "Loan request error",
+ "Errore salvataggio immagine": "Image save error",
+ "Errore sconosciuto durante il caricamento": "Unknown error during upload",
+ "Errore SQL durante migrazione %s: %s": "SQL error during migration %s: %s",
+ "Errore suggerimento": "Suggestion error",
+ "Errore Upload": "Upload Error",
+ "Errore validazione prestito:": "Loan validation error:",
+ "Errore verifica tabelle: %s": "Error verifying tables: %s",
+ "Errore!": "Error!",
+ "ERRORE:": "ERROR:",
+ "Errore:": "Error:",
+ "Errore: ": "Error: ",
+ "Errore: la data di scadenza deve essere successiva alla data di prestito.": "Error: the due date must be after the loan date.",
+ "Errore: tutti i campi obbligatori devono essere compilati.": "Error: all required fields must be filled.",
+ "Errore: Utente non trovato": "Error: User not found",
+ "Errori": "Errors",
+ "Errori di validazione dopo il merge.": "Validation errors after merge.",
+ "Errori di validazione nel file importato.": "Validation errors in imported file.",
+ "Errori di validazione.": "Validation errors.",
+ "Errori durante l'import": "Import Errors",
+ "Errori durante l'import dei dati (%d). Primi errori:\n%s": "Errors during data import (%d). First errors:\n%s",
+ "Errori Totali": "Total Errors",
+ "Errori:": "Errors:",
+ "es. 0.450": "e.g. 0.450",
+ "es. 1234-5678": "e.g. 1234-5678",
+ "es. 15": "e.g. 15",
+ "es. 19.90": "e.g. 19.90",
+ "es. 2020": "e.g. 2020",
+ "es. 2024": "e.g. 2024",
+ "es. 2025": "e.g. 2025",
+ "es. 21x14 cm": "e.g. 21x14 cm",
+ "es. 25.00": "e.g. 25.00",
+ "es. 26 agosto 2025": "e.g. August 26, 2025",
+ "es. 320": "e.g. 320",
+ "es. 599.9, 004.6782, 641.5945": "e.g. 599.9, 004.6782, 641.5945",
+ "es. 599.9, 004.6782, 641.5945, 599.1": "e.g. 599.9, 004.6782, 641.5945, 599.1",
+ "es. 8842935786": "e.g. 8842935786",
+ "es. 978-88-429-3578-0": "e.g. 978-88-429-3578-0",
+ "es. 9788842935780": "e.g. 9788842935780",
+ "es. Acquisto, Donazione, Prestito": "e.g. Purchase, Donation, Loan",
+ "es. Amazon, Libreria XYZ": "e.g. Amazon, Bookstore XYZ",
+ "es. Biblioteca Civica": "e.g. Public Library",
+ "Es. Biblioteca Digitale - Migliaia di libri da esplorare": "E.g. Digital Library - Thousands of books to explore",
"Es. biblioteca digitale, prestito libri, catalogo online, libri gratis": "E.g. digital library, book loan, online catalog, free books",
+ "es. Copertina rigida, Brossura": "e.g. Hardcover, Paperback",
+ "es. English, Italian": "e.g. English, Italian",
+ "Es. Esplora migliaia di libri, prenota online e gestisci i tuoi prestiti.": "E.g. Explore thousands of books, book online and manage your loans.",
+ "es. Fantasy contemporaneo": "e.g. Contemporary Fantasy",
+ "es. Gianni De Conno": "e.g. Gianni De Conno",
+ "es. Hardcover, 500 pages": "e.g. Hardcover, 500 pages",
+ "es. Harry Potter": "e.g. Harry Potter",
+ "es. History & geography > History of Asia > ...": "e.g. History & geography > History of Asia > ...",
"Es. https://tuosito.com": "E.g. https://yoursite.com",
"Es. https://tuosito.com/uploads/og-image.jpg": "E.g. https://yoursite.com/uploads/og-image.jpg",
+ "es. I Classici": "e.g. The Classics",
+ "es. Integrazione Sito Web": "e.g. Website Integration",
+ "es. INV-2024-001": "e.g. INV-2024-001",
+ "Es. Italiana, Americana, Francese...": "E.g. Italian, American, French...",
+ "Es. Italiana, Americana...": "E.g. Italian, American...",
+ "Es. Italiana...": "E.g. Italian...",
+ "es. Italiano, Inglese": "e.g. Italian, English",
+ "es. La morale anarchica": "e.g. The Anarchist Morality",
+ "Es. La Tua Biblioteca Digitale": "E.g. Your Digital Library",
+ "es. Mario Rossi": "e.g. Mario Rossi",
+ "Es. Milano...": "E.g. Milan...",
+ "es. Noir mediterraneo": "e.g. Mediterranean Noir",
+ "es. noreply@biblioteca.local": "e.g. noreply@library.local",
+ "Es. Presentazione libro \"Il Nome della Rosa\"": "E.g. Book presentation \"The Name of the Rose\"",
+ "es. Prima edizione": "e.g. First edition",
+ "es. PS3566.A686": "e.g. PS3566.A686",
+ "es. romanzo, fantasy, avventura (separare con virgole)": "e.g. novel, fantasy, adventure (separate with commas)",
+ "es. RSSMRA80A01H501U": "e.g. RSSMRA80A01H501U",
+ "Es. Scopri il nostro catalogo digitale con migliaia di libri disponibili per il prestito. Registrati gratuitamente e inizia a leggere oggi stesso.": "E.g. Discover our digital catalog with thousands of books available for loan. Register for free and start reading today.",
+ "es. Umberto Eco": "e.g. Umberto Eco",
+ "Es. Un libro fantastico!": "E.g. An amazing book!",
+ "Es. Un libro straordinario!": "E.g. An extraordinary book!",
+ "es. Urban fantasy": "e.g. Urban fantasy",
+ "Esauriti tentativi riassegnazione copia": "Exhausted copy reassignment attempts",
"Esci": "Logout",
"Esecuzione ogni 30 minuti (consigliato)": "Execute every 30 minutes (recommended)",
"Esecuzione ogni ora (8:00-20:00)": "Execute every hour (8:00-20:00)",
@@ -1043,12 +1482,15 @@
"Esegue la rigenerazione ogni giorno alle 02:00 e registra il log in
storage/logs/sitemap.log.": "Executes regeneration daily at 02:00 and logs to
storage/logs/sitemap.log.",
"Esegui": "Run",
"Esegui Manutenzione": "Run Maintenance",
+ "Esegui tutte le operazioni di manutenzione": "Run all maintenance operations",
"Eseguito da": "Executed by",
"Esempio": "Example",
"Esempio di Chiamata": "Request Example",
"Esempio route inglese:": "English route example:",
"Esempio route italiana:": "Italian route example:",
"Esempio:": "Example:",
+ "Esiste già un altro libro con lo stesso identificatore (ISBN/EAN).": "Another book with the same identifier (ISBN/EAN) already exists.",
+ "Esiste già un libro con lo stesso identificatore (ISBN/EAN).": "A book with the same identifier (ISBN/EAN) already exists.",
"Esistente": "Existing",
"Esito restituzione": "Return outcome",
"Español (ES)": "Spanish (ES)",
@@ -1060,35 +1502,37 @@
"Esplora e gestisci la collezione della biblioteca": "Explore and manage the library collection",
"Esplora i generi principali": "Explore the main genres",
"Esplora il catalogo": "Explore the catalog",
+ "Esplora il catalogo e scopri nuovi titoli.": "Explore the catalog and discover new titles.",
+ "Esplora il nostro catalogo digitale": "Explore our digital catalog",
"Esplora il nostro vasto catalogo di libri, prenota i tuoi titoli preferiti e scopri nuove letture": "Explore our vast catalog of books, reserve your favorite titles and discover new reads",
"Esplora il nostro vasto catalogo di libri, prenota i tuoi titoli preferiti e scopri nuove letture. Sistema di prestito moderno e intuitivo con ricerca avanzata e categorie organizzate.": "Explore our vast book catalog, reserve your favorite titles and discover new reads. Modern and intuitive lending system with advanced search and organized categories.",
"Esplora per Categoria": "Explore by Category",
+ "Espone il catalogo locale via protocollo SRU per altre biblioteche.": "Exposes local catalog via SRU protocol for other libraries.",
"Esporta": "Export",
"Esporta CSV": "Export CSV",
- "Esporta Prestiti": "Export Loans",
- "Seleziona gli stati dei prestiti da esportare:": "Select the loan statuses to export:",
- "Seleziona almeno 2 autori da unire": "Select at least 2 authors to merge",
- "Seleziona almeno 2 autori": "Select at least 2 authors",
- "Seleziona almeno 2 editori": "Select at least 2 publishers",
- "Seleziona almeno 2 editori da unire": "Select at least 2 publishers to merge",
- "Seleziona almeno uno stato": "Select at least one status",
"Esporta CSV (formato compatibile per import)": "Export CSV (compatible format for import)",
"Esporta Excel": "Export Excel",
"Esporta PDF": "Export PDF",
+ "Esporta Prestiti": "Export Loans",
"Esporta selezionati": "Export selected",
- "Esportazione di %d utenti filtrati su %d totali": "Exporting %d filtered users out of %d total",
- "Esportazione di tutti i %d utenti": "Exporting all %d users",
"Esportazione di %d libri filtrati su %d totali": "Exporting %d filtered books out of %d total",
+ "Esportazione di %d utenti filtrati su %d totali": "Exporting %d filtered users out of %d total",
"Esportazione di tutti i %d libri del catalogo": "Exporting all %d books from the catalog",
+ "Esportazione di tutti i %d utenti": "Exporting all %d users",
+ "Essenziali:": "Essential:",
"Estensione": "Extension",
"Estensione del file non valida.": "Invalid file extension.",
"Estensioni": "Extensions",
+ "Estrazione del pacchetto fallita": "Package extraction failed",
"Etichetta": "Label",
"Etichette": "Labels",
"Etichette interne grandi (Herma 4630, Avery 3490)": "Large internal labels (Herma 4630, Avery 3490)",
"European Article Number (opzionale)": "European Article Number (optional)",
"Eventi": "Events",
+ "eventi": "events",
+ "Eventi e Incontri": "Events and Meetings",
"Eventi Recenti": "Recent Events",
+ "eventi, biblioteca, cultura": "events, library, culture",
"Evento": "Event",
"Evento aggiornato con successo!": "Event updated successfully!",
"Evento creato con successo!": "Event created successfully!",
@@ -1098,12 +1542,17 @@
"Evento visibile sul sito": "Event visible on website",
"Eventuali annotazioni sullo stato del libro...": "Any notes on book condition...",
"Excel": "Excel",
+ "Export": "Export",
+ "Export per LibraryThing": "Export for LibraryThing",
"Exporting %d filtered users out of %d total": "Exporting %d filtered users out of %d total",
"Exporting all %d users": "Exporting all %d users",
- "FAQ": "FAQ",
- "FATAL ERROR:": "FATAL ERROR:",
"Facebook": "Facebook",
"Fallimento": "Failure",
+ "fallite.": "failed.",
+ "Fallito": "Failed",
+ "FAQ": "FAQ",
+ "fas fa-users": "fas fa-users",
+ "FATAL ERROR:": "FATAL ERROR:",
"Fatal Error:": "Fatal Error:",
"Fatto!": "Done!",
"Feature %d": "Feature %d",
@@ -1112,97 +1561,134 @@
"Feature 3": "Feature 3",
"Feature 4": "Feature 4",
"Features - Caratteristiche": "Features - Features",
+ "febbraio": "February",
+ "Feed e Scoperta": "Feeds & Discovery",
+ "Feed RSS": "RSS Feed",
"Femmina": "Female",
"File": "File",
"File \"%s\" pronto per l'upload": "File \"%s\" ready for upload",
"File %s nella directory root": "File %s in the root directory",
+ "File .env non trovato": ".env file not found",
"File .env:": ".env file:",
"File .htaccess creato": ".htaccess file created",
"File .installed:": ".installed file:",
+ "File attuale": "Current file",
+ "File backup non trovato": "Backup file not found",
+ "File caricato con successo": "File uploaded successfully",
"File CSV (max 10MB)": "CSV file (max 10MB)",
"File CSV non valido: usa \";\" o \",\" come separatore.": "Invalid CSV file: use ';' or ',' as delimiter.",
+ "File CSV non valido: usa \";\", \",\" o TAB come separatore.": "Invalid CSV file: use \";\", \",\" or TAB as separator.",
"File CSV vuoto o formato non valido": "Empty CSV file or invalid format",
- "File JSON con le traduzioni (opzionale). Puoi caricarlo anche in seguito.": "JSON file with translations (optional). You can upload it later.",
- "File JSON non valido": "Invalid JSON file",
- "File Principale:": "Main File:",
- "File URL": "File URL",
- "File ZIP con struttura plugin valida": "ZIP file with valid plugin structure",
- "File ZIP non trovato.": "ZIP file not found.",
- "File ZIP troppo grande. Dimensione massima: 100 MB.": "ZIP file too large. Maximum size: 100 MB.",
- "File attuale": "Current file",
+ "File dati iniziali per la lingua selezionata non trovato: %s": "Initial data file for the selected language not found: %s",
+ "File Dewey esistente non è un JSON valido o è corrotto.": "Existing Dewey file is not valid JSON or is corrupted.",
+ "File Dewey non trovato.": "Dewey file not found.",
+ "File di aggiornamento non valido": "Invalid update file",
+ "File di aggiornamento non valido (troppo piccolo)": "Invalid update file (too small)",
"File di Esempio": "Example File",
+ "File di log non trovato": "Log file not found",
"File di Traduzione": "Translation File",
"File di Traduzione Attuale": "Current Translation File",
"File di Traduzione JSON": "JSON Translation File",
"File di traduzione non trovato": "Translation file not found",
"File esistente (data modifica)": "Existing file (modification date)",
+ "File JSON con le traduzioni (opzionale). Puoi caricarlo anche in seguito.": "JSON file with translations (optional). You can upload it later.",
+ "File JSON non valido": "Invalid JSON file",
"File non trovato nell'upload.": "File not found in upload.",
"File non valido o corrotto.": "Invalid or corrupted file.",
"File plugin.json non trovato nel pacchetto.": "plugin.json file not found in package.",
"File plugin.json non valido.": "Invalid plugin.json file.",
- "File principale PHP specificato in %s": "Main PHP file specified in %s",
"File principale del plugin non trovato.": "Plugin main file not found.",
+ "File principale PHP specificato in %s": "Main PHP file specified in %s",
+ "File Principale:": "Main File:",
"File sitemap non trovato": "Sitemap file not found",
"File sitemap presente": "Sitemap file present",
"File troppo grande. Dimensione massima 10MB.": "File too large. Maximum size 10MB.",
+ "File troppo grande. Dimensione massima 5MB.": "File too large. Maximum size 5MB.",
+ "File URL": "File URL",
+ "File vuoto o formato non valido": "Empty file or invalid format",
+ "File ZIP con struttura plugin valida": "ZIP file with valid plugin structure",
+ "File ZIP non trovato.": "ZIP file not found.",
+ "File ZIP troppo grande. Dimensione massima: 100 MB.": "ZIP file too large. Maximum size: 100 MB.",
"File:": "File:",
"Filtra": "Filter",
+ "Filtra mensole per scaffale": "Filter shelves by bookcase",
"Filtra per Mensola": "Filter by Shelf",
"Filtra per Scaffale": "Filter by Bookcase",
"Filtra per tipo": "Filter by type",
- "Filtra mensole per scaffale": "Filter shelves by bookcase",
"Filtri": "Filters",
"Filtri attivi:": "Active filters:",
"Filtri cancellati": "Filters cleared",
"Filtri di Ricerca": "Search Filters",
"Filtri salvati": "Filters saved",
- "Filtro Libro": "Book Filter",
- "Filtro Utente": "User Filter",
- "Filtro genere attivo": "Genre filter active",
"Filtro attivo": "Active filter",
+ "Filtro genere attivo": "Genre filter active",
+ "Filtro Libro": "Book Filter",
"Filtro sottogenere attivo": "Subgenre filter active",
- "Fallito": "Failed",
+ "Filtro Utente": "User Filter",
"Fine": "Finish",
"Fine:": "End:",
"Fino a quando? (opzionale):": "Until when? (optional):",
+ "Fix applicato": "Fix applied",
+ "Fonte dati:": "Data source:",
+ "Fonte/Venditore": "Source/Vendor",
+ "Fonti attive": "Active sources",
+ "Fonti consultate:": "Sources consulted:",
"Footer": "Footer",
"Formati supportati: JPG, PNG, GIF, WebP. Dimensione massima: 5MB": "Supported formats: JPG, PNG, GIF, WebP. Maximum size: 5MB",
"Formati supportati: MP3, M4A, OGG • Dimensione massima: 500 MB": "Supported formats: MP3, M4A, OGG • Max size: 500 MB",
"Formati supportati: PDF, ePub • Dimensione massima: 100 MB": "Supported formats: PDF, ePub • Max size: 100 MB",
"Formato": "Format",
+ "Formato biblioteche scolastiche (compatibile A4)": "School library format (A4 compatible)",
+ "Formato biblioteche scolastiche (compatibili A4)": "School library format (A4 compatible)",
+ "Formato codice non valido": "Invalid code format",
+ "Formato codice non valido. Usa formato: 599 oppure 599.9 oppure 599.93": "Invalid code format. Use format: 599 or 599.9 or 599.93",
+ "Formato codice non valido. Usa: XXX.Y (es. 599.1)": "Invalid code format. Use: XXX.Y (e.g. 599.1)",
"Formato CSV Dettagliato": "Detailed CSV Format",
+ "Formato dati non valido.": "Invalid data format.",
"Formato Etichetta": "Label Format",
"Formato File JSON": "JSON File Format",
- "Formato ISBN non valido.": "Invalid ISBN format.",
- "Formato biblioteche scolastiche (compatibile A4)": "School library format (A4 compatible)",
- "Formato biblioteche scolastiche (compatibili A4)": "School library format (A4 compatible)",
+ "Formato immagine non supportato": "Unsupported image format",
"Formato immagine non supportato. Usa JPG, PNG o WebP.": "Image format not supported. Use JPG, PNG or WebP.",
"Formato impostazioni non valido.": "Invalid settings format.",
+ "Formato ISBN non valido.": "Invalid ISBN format.",
+ "Formato JSON non valido": "Invalid JSON format",
"Formato orizzontale per dorso": "Horizontal format for spine",
"Formato quadrato Tirrenia": "Tirrenia square format",
+ "Formato richiesta non valido": "Invalid request format",
"Formato: CSV con separatore %s • Max 10MB": "Format: CSV with %s separator • Max 10MB",
"Formato: xx_XX (es. it_IT, en_US, es_ES)": "Format: xx_XX (e.g. it_IT, en_US, es_ES)",
+ "Forza HTTPS": "Force HTTPS",
"Français (FR)": "French (FR)",
"Frecce ↑ ↓ per il volume": "↑ ↓ arrows for volume",
"From Email": "From Email",
"From Name": "From Name",
+ "Funzionamento automatico:": "Automatic operation:",
+ "Funzionamento:": "How it works:",
"Fuori Catalogo": "Out of Catalog",
"Genera automaticamente": "Generate automatically",
+ "Genera automaticamente un file llms.txt per rendere la biblioteca comprensibile ai modelli linguistici (LLM)": "Automatically generate an llms.txt file to make the library understandable by large language models (LLMs)",
+ "Genera il tuo token su": "Generate your token at",
"Generato il": "Generated on",
"Generato il:": "Generated on:",
"Generazione CSV in corso...": "Generating CSV...",
"Generazione...": "Generating...",
"Genere": "Genre",
+ "Genere creato con successo!": "Genre created successfully!",
"Genere letterario": "Literary genre",
"Genere letterario del libro": "Literary genre of the book",
"Genere padre (opz.)": "Parent genre (opt.)",
"Genere principale": "Main genre",
"Genere:": "Genre:",
"Generi": "Genres",
- "Generi Principali": "Main Genres",
"Generi e sottogeneri": "Genres and subgenres",
+ "Generi Principali": "Main Genres",
+ "gennaio": "January",
"Gestione Autori": "Authors Management",
+ "Gestione autori": "Authors management",
"Gestione Biblioteca": "Library Management",
+ "Gestione classificazione Dewey: seed e statistiche": "Dewey classification management: seed and statistics",
+ "Gestione Collane": "Series Management",
+ "Gestione collezione": "Collection management",
"Gestione Collocazione": "Location Management",
"Gestione Contenuti (CMS)": "Content Management (CMS)",
"Gestione Editori": "Publishers Management",
@@ -1214,24 +1700,24 @@
"Gestione Lingue": "Language Management",
"Gestione Multilingua": "Multilingual Management",
"Gestione Plugin": "Plugin Management",
+ "Gestione Plugin LibraryThing": "LibraryThing Plugin Management",
"Gestione Prenotazioni": "Reservation Management",
"Gestione Prestiti": "Loans Management",
- "Gestione Recensioni": "Reviews Management",
- "Gestione Utenti": "Users Management",
- "Gestione autori": "Authors management",
- "Gestione classificazione Dewey: seed e statistiche": "Dewey classification management: seed and statistics",
- "Gestione collezione": "Collection management",
"Gestione prestiti": "Loans management",
+ "Gestione Recensioni": "Reviews Management",
"Gestione recensioni": "Reviews management",
+ "Gestione Temi": "Theme Management",
+ "Gestione Utenti": "Users Management",
"Gestione utenti": "Users management",
"Gestisci": "Manage",
"Gestisci Eventi": "Manage Events",
- "Gestisci Restituzione": "Manage Return",
"Gestisci gli aggiornamenti dell'applicazione": "Manage application updates",
"Gestisci gli autori della collezione": "Manage collection authors",
"Gestisci gli eventi della biblioteca: crea, modifica ed elimina eventi con immagini e descrizioni": "Manage library events: create, edit and delete events with images and descriptions",
+ "Gestisci i dispositivi su cui hai effettuato l'accesso con 'Ricordami'. Puoi disconnetterti da singoli dispositivi o da tutti contemporaneamente.": "Manage the devices you've logged in with 'Remember Me'. You can sign out from individual devices or all at once.",
"Gestisci i generi letterari": "Manage literary genres",
"Gestisci i prestiti attivi e storici": "Manage active and historical loans",
+ "Gestisci i tuoi prestiti, esplora il catalogo e scopri nuovi titoli.": "Manage your loans, explore the catalog and discover new titles.",
"Gestisci i tuoi titoli preferiti, scopri quando tornano disponibili e accedi rapidamente ai dettagli del libro.": "Manage your favorite titles, find out when they become available, and quickly access book details.",
"Gestisci il contenuto della pagina Chi Siamo con testo e immagine": "Manage the About Us page content with text and image",
"Gestisci il contenuto della pagina Chi Siamo con testo e immagine personalizzati": "Manage About Us page content with custom text and image",
@@ -1240,20 +1726,34 @@
"Gestisci la visibilità delle categorie di cookie nel banner. I cookie essenziali sono sempre visibili e obbligatori.": "Manage cookie category visibility in banner. Essential cookies are always visible and mandatory.",
"Gestisci le case editrici": "Manage publishers",
"Gestisci le classificazioni Dewey per italiano e inglese": "Manage Dewey classifications for Italian and English",
+ "Gestisci le collane e le serie di libri": "Manage book series and collections",
"Gestisci le estensioni dell'applicazione": "Manage application extensions",
"Gestisci preferenze cookie": "Manage cookie preferences",
+ "Gestisci Restituzione": "Manage Return",
"Gestisci restituzione": "Manage return",
"Gestisci tutte": "Manage all",
+ "Gestisci tutti": "Manage all",
"Gestito da": "Managed by",
"Giorni di preavviso per scadenza prestito": "Days of advance warning for loan expiry",
+ "Giorni per ritirare un prestito approvato": "Days to pick up an approved loan",
+ "giorni prima della scadenza": "days before expiry",
+ "giugno": "June",
"Già Installato": "Already Installed",
+ "Già presenti o senza ISBN:": "Already present or no ISBN:",
+ "Già presenti:": "Already present:",
"Già recensito": "Already reviewed",
"Gli amministratori non richiedono tessera e riceveranno un invito per impostare la password.": "Administrators do not require a library card and will receive an invitation to set their password.",
"Gli appuntamenti della biblioteca": "Library events",
+ "Gli import CSV e LibraryThing verranno visualizzati qui": "CSV and LibraryThing imports will be displayed here",
+ "Gli import vengono tracciati automaticamente durante l'elaborazione": "Imports are tracked automatically during processing",
+ "Gli indici migliorano significativamente le performance delle query, specialmente su tabelle con molti record. Le installazioni recenti li includono già, ma le installazioni più vecchie potrebbero non averli.": "Indexes significantly improve query performance, especially on tables with many records. Recent installations already include them, but older installations may not have them.",
"Gli script JavaScript sono divisi in 3 categorie in base alla tipologia di cookie:": "JavaScript scripts are divided into 3 categories based on cookie type:",
"Gli utenti possono selezionare questa lingua": "Users can select this language",
"Globale": "Global",
+ "GoodLib — External Sources": "GoodLib — External Sources",
+ "GoodLib — Fonti Esterne": "GoodLib — External Sources",
"Google Books API": "Google Books API",
+ "Google Books API collegata": "Google Books API connected",
"Google Books Configurato": "Google Books configured",
"Google reCAPTCHA v3": "Google reCAPTCHA v3",
"Grazie per aver scelto Pinakes!": "Thank you for choosing Pinakes!",
@@ -1261,8 +1761,13 @@
"Guida": "Guide",
"Guida alla Gestione Lingue": "Language Management Guide",
"Guida alle Route": "Route Guide",
+ "Guida online": "Online guide",
+ "Ha priorità 8, viene interrogato dopo le fonti di scraping standard.": "Has priority 8, queried after the standard scraping sources.",
"Hai aggiunto %s copie a \"%s\"": "You added %s copies to \"%s\"",
"Hai già un account?": "Already have an account?",
+ "Hai già un prestito attivo o in attesa per questo libro": "You already have an active or pending loan for this book",
+ "Hai già una prenotazione attiva per questo libro.": "You already have an active reservation for this book.",
+ "Hai già una richiesta di prestito in attesa per questo libro": "You already have a pending loan request for this book",
"Hai libri che dovevano essere restituiti. Restituiscili al più presto per evitare sanzioni.": "You have books that should have been returned. Return them as soon as possible to avoid penalties.",
"Hai modifiche non salvate che andranno perse. Continuare?": "You have unsaved changes that will be lost. Continue?",
"Hai modifiche non salvate. I dati attuali verranno sostituiti.": "You have unsaved changes. Current data will be replaced.",
@@ -1279,81 +1784,95 @@
"Homepage": "Homepage",
"Host": "Host",
"Host Database": "Database Host",
- "I Cookie Essenziali sono sempre visibili e non possono essere disabilitati poiché necessari per il funzionamento del sito.": "Essential Cookies are always visible and cannot be disabled as they are necessary for site functionality.",
- "I Miei Preferiti": "My Favorites",
+ "HTTP Strict Transport Security forza i browser a usare solo connessioni HTTPS per 1 anno (raccomandato per produzione con SSL valido).": "HTTP Strict Transport Security forces browsers to use only HTTPS connections for 1 year (recommended for production with valid SSL).",
+ "https://www.editore.com": "https://www.publisher.com",
+ "I backup sono salvati in:": "Backups are saved in:",
"I campi con * sono obbligatori": "Fields with * are required",
"I campi null indicano dati non disponibili": "Null fields indicate unavailable data",
+ "I campi selezionati saranno visibili nella pagina pubblica del libro. I commenti privati sono sempre nascosti nel frontend.": "The selected fields will be visible on the public book page. Private comments are always hidden on the frontend.",
"I contenitori fisici principali dove sono organizzati i libri": "The main physical containers where books are organized",
+ "I Cookie Essenziali sono sempre visibili e non possono essere disabilitati poiché necessari per il funzionamento del sito.": "Essential Cookies are always visible and cannot be disabled as they are necessary for site functionality.",
+ "I dati attuali verranno sostituiti.": "Current data will be replaced.",
+ "I dati devono essere un array non vuoto.": "Data must be a non-empty array.",
"I dati provengono dal file JSON, nessun seeding necessario.": "Data comes from the JSON file, no seeding required.",
"I doppioni (per ID, ISBN13 o EAN) vengono aggiornati senza modificare le copie fisiche": "Duplicates (by ID, ISBN13 or EAN) are updated without modifying physical copies",
"I filtri correnti sono stati salvati nell'URL": "Current filters have been saved in the URL",
"I filtri vengono applicati automaticamente mentre digiti": "Filters are applied automatically as you type",
+ "I libri degli altri autori verranno assegnati a questo": "Books from other authors will be assigned to this one",
+ "I libri degli altri editori verranno assegnati a questo": "Books from other publishers will be assigned to this one",
"I livelli (ripiani) all'interno di ogni scaffale": "The levels (shelves) within each bookcase",
+ "I log vengono conservati per 90 giorni per conformità GDPR": "Logs are retained for 90 days for GDPR compliance",
+ "I Miei Preferiti": "My Favorites",
"I miei preferiti": "My Favorites",
"I tuoi preferiti": "Your Favorites",
+ "Icona FontAwesome": "FontAwesome Icon",
+ "icone disponibili": "icons available",
"ID": "ID",
- "ID:": "ID:",
+ "ID autori non validi": "Invalid author IDs",
"ID Editore": "Publisher ID",
- "ID Prestito": "Loan ID",
- "ID Prestito:": "Loan ID:",
+ "ID editori non validi": "Invalid publisher IDs",
+ "ID genere non valido": "Invalid genre ID",
+ "ID import mancante": "Missing import ID",
+ "ID libri non validi": "Invalid book IDs",
+ "ID Libro": "Book ID",
"ID libro non valido": "Invalid book ID",
"ID libro:": "Book ID:",
+ "ID Prestito": "Loan ID",
"ID prestito non valido": "Invalid loan ID",
+ "ID Prestito:": "Loan ID:",
+ "ID sessione non valido": "Invalid session ID",
"ID utente:": "User ID:",
- "IP": "IP",
- "IP Address": "IP Address",
- "ISBN": "ISBN",
- "ISBN 10": "ISBN 10",
- "ISBN 13": "ISBN 13",
- "ISBN Mancante": "Missing ISBN",
- "ISBN a 13 cifre (univoco)": "13-digit ISBN (unique)",
- "ISBN non trovato nelle fonti disponibili.": "ISBN not found in available sources.",
- "ISBN non valido. Specifica 10 o 13 cifre (eventualmente con X finale).": "Invalid ISBN. Please provide 10 or 13 digits (X allowed at the end).",
- "ISBN-13:": "ISBN-13:",
- "ISBN10": "ISBN10",
- "ISBN10 Non Valido": "Invalid ISBN10",
- "ISBN10 deve contenere esattamente 10 caratteri (9 cifre + 1 cifra o X).": "ISBN10 must contain exactly 10 characters (9 digits + 1 digit or X).",
- "ISBN10 o ISBN13": "ISBN10 or ISBN13",
- "ISBN13": "ISBN13",
- "ISBN13 Non Valido": "Invalid ISBN13",
- "ISBN13 deve contenere esattamente 13 cifre.": "ISBN13 must contain exactly 13 digits.",
- "ISBN13: %s": "ISBN13: %s",
- "ISBN:": "ISBN:",
- "IT": "IT",
- "Icona FontAwesome": "FontAwesome Icon",
+ "ID:": "ID:",
+ "Identificatori": "Identifiers",
+ "Identificatori Catalogo": "Catalog Identifiers",
"Identità": "Identity",
"Identità Applicazione": "Application Identity",
"Ieri": "Yesterday",
"Ieri alle %s": "Yesterday at %s",
- "Il Mio Profilo": "My Profile",
- "Prima di ogni aggiornamento viene creato automaticamente un backup del database.": "Before each update, a database backup is automatically created.",
- "Pinakes è aggiornato": "Pinakes is up to date",
- "Pinakes è stato aggiornato con successo.": "Pinakes has been successfully updated.",
- "Pinakes è stato installato con successo ed è pronto per essere utilizzato.": "Pinakes has been successfully installed and is ready to use.",
"Il campo è obbligatorio": "This field is required",
+ "Il catalogo SBN (OPAC Nazionale Italiano) è già integrato e viene interrogato automaticamente durante l'importazione ISBN. Non è necessario aggiungerlo come server esterno.": "The SBN catalog (Italian National OPAC) is already integrated and automatically queried during ISBN import. No need to add it as an external server.",
+ "Il codice %s ha un formato non valido.": "Code %s has an invalid format.",
+ "Il codice %s ha un livello non valido (deve essere 1-7).": "Code %s has an invalid level (must be 1-7).",
+ "Il codice %s ha un nome non valido (minimo 2 caratteri).": "Code %s has an invalid name (minimum 2 characters).",
+ "Il codice %s non è un figlio valido di %s.": "Code %s is not a valid child of %s.",
+ "Il codice %s è duplicato.": "Code %s is duplicated.",
+ "Il codice deve iniziare con le stesse tre cifre della classe principale": "The code must start with the same three digits of the main class",
"Il codice lingua non può essere modificato dopo la creazione.": "The language code cannot be modified after creation.",
"Il codice lingua è obbligatorio (es. it_IT, en_US)": "Language code is required (e.g. it_IT, en_US)",
"Il codice scaffale \"%s\" esiste già. Usa un codice diverso.": "Shelf code \"%s\" already exists. Use a different code.",
"Il codice tessera sarà generato automaticamente (formato: ADMIN-YYYYMMDD-XXX).": "The membership code will be generated automatically (format: ADMIN-YYYYMMDD-XXX).",
- "Il codice deve iniziare con le stesse tre cifre della classe principale": "The code must start with the same three digits of the main class",
+ "Il codice verrà inserito in un tag": "The code will be inserted in a tag",
"Il codice verrà inserito in un tag ": "The code will be inserted in a tags",
"Il cron utilizza gli stessi permessi dell'utente di sistema che lo esegue": "Cron uses same permissions as system user executing it",
"Il database '%s' non è vuoto. Deve essere un database vuoto.": "The database '%s' is not empty. It must be an empty database.",
"Il database deve essere vuoto.": "The database must be empty.",
"Il database è coerente e non sono stati rilevati problemi.": "The database is consistent and no issues were found.",
+ "Il database è già ottimizzato!": "The database is already optimized!",
"Il database è stato installato, ma mancano le librerie PHP necessarie per eseguire l'applicazione.": "The database has been installed, but the PHP libraries needed to run the application are missing.",
- "Il file JSON deve contenere coppie chiave-valore:": "The JSON file must contain key-value pairs:",
- "Il file JSON non è valido:": "JSON file is not valid:",
+ "Il download dovrebbe iniziare automaticamente": "Download should start automatically",
+ "Il file": "The file",
+ "Il file caricato non è un archivio ZIP valido": "The uploaded file is not a valid ZIP archive",
"Il file deve avere estensione .csv": "The file must have a .csv extension",
+ "Il file deve avere estensione .tsv, .csv o .txt": "File must have .tsv, .csv or .txt extension",
"Il file deve contenere coppie chiave (italiano) - valore (traduzione).": "The file must contain key (Italian) - value (translation) pairs.",
"Il file deve essere un JSON valido": "File must be a valid JSON",
"Il file generato si trova in": "Generated file is located in",
"Il file generato si trova in
public/sitemap.xml": "Generated file is located at
public/sitemap.xml",
+ "Il file JSON deve contenere coppie chiave-valore:": "The JSON file must contain key-value pairs:",
+ "Il file JSON non è valido:": "JSON file is not valid:",
+ "Il file non sembra essere in formato LibraryThing": "The file does not appear to be in LibraryThing format",
+ "Il file non sembra essere in formato LibraryThing. Colonne richieste: Book Id, Title, Primary Author, ISBNs": "File does not appear to be in LibraryThing format. Required columns: Book Id, Title, Primary Author, ISBNs",
+ "Il file supera la dimensione massima consentita": "File exceeds maximum allowed size",
+ "Il file supera la dimensione massima di %s MB": "File exceeds maximum size of %s MB",
"Il formato scelto verrà utilizzato per generare i PDF delle etichette con codice a barre.": "The chosen format will be used to generate label PDFs with barcodes.",
"Il formato selezionato verrà applicato a tutte le etichette generate dal sistema.": "The selected format will be applied to all labels generated by the system.",
+ "Il libro non sarà eliminato, solo la relazione.": "The book will not be deleted, only the relationship.",
"Il libro selezionato è già in prestito. Seleziona un altro libro.": "The selected book is already on loan. Select another book.",
"Il libro viene consegnato subito all'utente. Se deselezionato, il prestito rimarrà in stato 'Da ritirare' fino alla conferma del ritiro.": "The book is delivered immediately to the user. If unchecked, the loan will remain in 'Ready for pickup' status until pickup is confirmed.",
+ "Il link di verifica email è scaduto o non valido. Registrati nuovamente per ricevere un nuovo link.": "The email verification link has expired or is invalid. Please register again to receive a new link.",
+ "Il link di verifica non è valido. Assicurati di aver copiato l'intero link dall'email.": "The verification link is not valid. Make sure you copied the entire link from the email.",
"Il logo verrà ridimensionato automaticamente": "The logo will be automatically resized",
+ "Il Mio Profilo": "My Profile",
"Il mio profilo": "My Profile",
"Il nome del genere è obbligatorio.": "Genre name is required.",
"Il nome dell'": "The name of",
@@ -1368,152 +1887,260 @@
"Il nostro team è stato notificato e sta lavorando per risolvere il problema.": "Our team has been notified and is working to resolve the issue.",
"Il pacchetto contiene percorsi non validi.": "Package contains invalid paths.",
"Il pacchetto non contiene file validi.": "Package does not contain valid files.",
+ "Il plugin è attualmente installato e funzionante.": "The plugin is currently installed and working.",
"Il prestito è stato approvato con successo.": "The loan has been successfully approved.",
"Il prestito è stato rifiutato.": "The loan has been rejected.",
+ "Il server ha restituito una risposta non valida. Controlla i log per dettagli.": "The server returned an invalid response. Check the logs for details.",
"Il sistema creerà automaticamente libri, autori ed editori": "The system will automatically create books, authors, and publishers",
+ "Il sistema di aggiornamento è pronto.": "The update system is ready.",
"Il sistema include un cron job che gestisce automaticamente:": "The system includes a cron job that automatically handles:",
"Il sistema invierà automaticamente una email di promemoria agli utenti prima della scadenza del prestito. Il valore predefinito è 3 giorni.": "The system will automatically send a reminder email to users before the loan expires. Default value is 3 days.",
- "Il server ha restituito una risposta non valida. Controlla i log per dettagli.": "The server returned an invalid response. Check the logs for details.",
"Il sito web deve essere un URL valido (es. https://www.esempio.com).": "Website must be a valid URL (e.g. https://www.example.com).",
"Il sito web deve essere un URL valido.": "Website must be a valid URL.",
+ "Il termine per il ritiro è scaduto": "The pickup deadline has passed",
+ "Il termine per il ritiro è scaduto. Vuoi annullare questo prestito?": "The pickup deadline has passed. Do you want to cancel this loan?",
"Il titolo del libro è obbligatorio.": "The book title is required.",
"Il titolo principale della pagina": "The main page title",
"Il titolo verrà utilizzato anche per generare l'URL della pagina": "The title will also be used to generate the page URL",
"Il titolo è obbligatorio.": "Title is required.",
+ "Il token di accesso personale non è obbligatorio, ma aumenta il limite di richieste da 25 a 60 al minuto.": "The personal access token is not required, but it increases the request limit from 25 to 60 per minute.",
"Il tuo account è in attesa di approvazione. Riceverai un'email quando sarà attivato": "Your account is pending approval. You will receive an email when it is activated",
"Il tuo account è stato sospeso. Contatta l'amministratore per maggiori informazioni": "Your account has been suspended. Contact the administrator for more information",
"Il tuo browser non supporta la riproduzione audio.": "Your browser does not support audio playback.",
+ "Il tuo sistema Pinakes per catalogare, gestire e condividere la tua collezione libraria.": "Your Pinakes system to catalog, manage, and share your book collection.",
+ "Illustratore": "Illustrator",
"Immagine": "Image",
- "Immagine Caricata!": "Image Uploaded!",
- "Immagine Open Graph": "Open Graph Image",
"Immagine attuale": "Current Image",
+ "Immagine Caricata!": "Image Uploaded!",
"Immagine di copertina della pagina (opzionale)": "Page cover image (optional)",
"Immagine di sfondo Hero": "Hero Background Image",
"Immagine in Evidenza": "Featured Image",
"Immagine mostrata quando condividi la pagina su social media (Facebook, Twitter, LinkedIn). Se vuoto, usa l'immagine hero di sfondo. Dimensioni consigliate: 1200x630px (rapporto 1.91:1).": "Image shown when sharing the page on social media (Facebook, Twitter, LinkedIn). If empty, uses the hero background image. Recommended size: 1200x630px (1.91:1 ratio).",
"Immagine mostrata quando condividi su social. Dimensioni consigliate: 1200x630px (rapporto 1.91:1). Se vuoto, usa l'immagine hero di sfondo.": "Image shown when sharing on social media. Recommended dimensions: 1200x630px (1.91:1 ratio). If empty, uses the hero background image.",
+ "Immagine non valida": "Invalid image",
+ "Immagine Open Graph": "Open Graph Image",
+ "Immagine per Twitter/X. Dimensioni consigliate: 1200x675px o 1200x1200px. Se vuoto, usa l'immagine Open Graph.": "Image for Twitter/X. Recommended dimensions: 1200x675px or 1200x1200px. If empty, uses Open Graph image.",
+ "Immagine Twitter": "Twitter Image",
"Immagini JPG, PNG o WebP (max 5MB)": "JPG, PNG or WebP images (max 5MB)",
- "Import CSV": "CSV Import",
- "Import Libri da CSV": "Import Books from CSV",
- "Import Massivo Libri": "Bulk Book Import",
+ "Import": "Import",
"Import completato: %d libri nuovi, %d libri aggiornati, %d autori creati, %d editori creati": "Import completed: %d new books, %d updated books, %d authors created, %d publishers created",
+ "Import CSV": "CSV Import",
+ "Import CSV Standard": "Standard CSV Import",
+ "Import da LibraryThing": "Import from LibraryThing",
"Import dati iniziali...": "Importing initial data...",
+ "Import in corso...": "Importing...",
+ "Import LibraryThing": "Import LibraryThing",
+ "Import LibraryThing completato: %d libri nuovi, %d libri aggiornati, %d autori creati, %d editori creati": "LibraryThing import completed: %d new books, %d updated books, %d authors created, %d publishers created",
+ "Import Libri da CSV": "Import Books from CSV",
"Import massivo da CSV": "Bulk import from CSV",
+ "Import Massivo Libri": "Bulk Book Import",
"Import schema in corso...": "Importing schema...",
"Import trigger...": "Importing triggers...",
"Importa": "Import",
- "Importa Dati": "Import Data",
"Importa da ISBN": "Import from ISBN",
+ "Importa Dati": "Import Data",
+ "Importa i tuoi libri esportati da LibraryThing.com (formato TSV)": "Import your books exported from LibraryThing.com (TSV format)",
+ "Importa Libri": "Import Books",
+ "Importante:": "Important:",
+ "Importati": "Imported",
+ "Importato": "Imported",
+ "Importato con successo. %d voci totali.": "Imported successfully. %d total entries.",
"Importazione completata con successo!": "Import completed successfully!",
"Importazione in corso...": "Import in progress...",
"Importazione libro": "Importing book",
"Importazione...": "Importing...",
+ "Impossibile acquisire il lock. Riprova tra qualche secondo.": "Unable to acquire lock. Please try again in a few seconds.",
"Impossibile aggiornare l'utente. Riprova più tardi.": "Unable to update user. Please try again later.",
"Impossibile aggiornare la chiave Google Books.": "Unable to update the Google Books key.",
"Impossibile aggiornare la posizione automatica": "Unable to update automatic position",
"Impossibile aggiornare le copie.": "Unable to update copies.",
"Impossibile approvare la recensione": "Unable to approve the review",
+ "Impossibile aprire file di backup per scrittura": "Unable to open backup file for writing",
+ "Impossibile aprire il file": "Unable to open file",
"Impossibile aprire il file CSV": "Unable to open the CSV file",
+ "Impossibile aprire il file CSV salvato": "Unable to open the saved CSV file",
"Impossibile aprire il file ZIP.": "Unable to open ZIP file.",
+ "Impossibile aprire il pacchetto ZIP": "Unable to open the ZIP package",
"Impossibile archiviare il messaggio.": "Unable to archive the message.",
+ "Impossibile attivare la nuova versione del plugin: %s": "Unable to activate the new plugin version: %s",
+ "Impossibile caricare configurazione database": "Unable to load database configuration",
"Impossibile caricare gli editori. Controlla la console per i dettagli.": "Unable to load publishers. Check console for details.",
"Impossibile caricare i libri. Controlla la console per i dettagli.": "Unable to load books. Check console for details.",
+ "Impossibile cifrare il token GitHub": "Unable to encrypt the GitHub token",
+ "Impossibile cifrare il token GitHub: salvataggio annullato": "Unable to encrypt the GitHub token: save cancelled",
"Impossibile completare l'operazione. Riprova più tardi.": "Unable to complete the operation. Try again later.",
"Impossibile comunicare con il server. Riprova più tardi.": "Unable to communicate with the server. Please try again later.",
"Impossibile configurare autocomplete: elementi mancanti": "Unable to configure autocomplete: missing elements",
+ "Impossibile connettersi a GitHub": "Unable to connect to GitHub",
"Impossibile contattare il servizio di scraping. Riprova più tardi.": "Unable to contact the scraping service. Please try again later.",
+ "Impossibile creare directory di backup": "Unable to create backup directory",
+ "Impossibile creare directory di backup applicazione": "Unable to create application backup directory",
+ "Impossibile creare directory di backup: %s": "Unable to create backup directory: %s",
+ "Impossibile creare directory di estrazione": "Unable to create extraction directory",
+ "Impossibile creare directory temporanea": "Unable to create temporary directory",
+ "Impossibile creare directory temporanea per upload": "Unable to create temporary directory for upload",
+ "Impossibile creare directory: %s": "Unable to create directory: %s",
+ "Impossibile creare il backup del plugin: %s": "Unable to create plugin backup: %s",
"Impossibile creare il file .env. Verifica i permessi.": "Unable to create the .env file. Check permissions.",
+ "Impossibile creare il file di lock per l'aggiornamento": "Unable to create update lock file",
"Impossibile creare la cartella di upload.": "Unable to create the upload directory.",
"Impossibile creare la directory del plugin.": "Unable to create plugin directory.",
+ "Impossibile creare la mensola. Riprova più tardi.": "Unable to create shelf. Please try again later.",
"Impossibile creare la prenotazione": "Unable to create reservation",
"Impossibile creare la struttura del plugin.": "Unable to create plugin structure.",
+ "Impossibile creare lo scaffale. Riprova più tardi.": "Unable to create bookcase. Please try again later.",
+ "Impossibile creare lock file": "Unable to create lock file",
+ "Impossibile determinare l'ID del plugin Open Library.": "Unable to determine Open Library plugin ID.",
+ "Impossibile eliminare il backup": "Unable to delete backup",
"Impossibile eliminare il file di manutenzione": "Unable to delete maintenance file",
+ "Impossibile eliminare il libro: ci sono prestiti o prenotazioni attive. Termina prima i prestiti/prenotazioni.": "Cannot delete book: there are active loans or reservations. End loans/reservations first.",
"Impossibile eliminare il messaggio.": "Unable to delete the message.",
"Impossibile eliminare l'autore: sono presenti libri associati.": "Cannot delete the author: there are books associated with them.",
"Impossibile eliminare l'editore: sono presenti libri associati.": "Cannot delete the publisher: there are books associated with it.",
"Impossibile eliminare l'installer:": "Cannot delete the installer:",
"Impossibile eliminare l'installer: devi prima installare le dipendenze PHP con": "Cannot delete the installer: you must first install the PHP dependencies with",
"Impossibile eliminare la notifica.": "Unable to delete the notification.",
+ "Impossibile eliminare la recensione": "Unable to delete the review",
+ "Impossibile eliminare una copia attualmente in prestito.": "Cannot delete a copy currently on loan.",
+ "Impossibile eliminare: alcuni editori hanno libri associati": "Cannot delete: some publishers have associated books",
+ "Impossibile eliminare: alcuni libri hanno prestiti attivi": "Cannot delete: some books have active loans",
+ "Impossibile eliminare: la mensola contiene libri": "Cannot delete: shelf contains books",
+ "Impossibile eliminare: lo scaffale contiene libri": "Cannot delete: bookcase contains books",
+ "Impossibile eliminare: lo scaffale contiene mensole": "Cannot delete: bookcase contains shelves",
"Impossibile generare la risposta JSON.": "Unable to generate the JSON response.",
"Impossibile importare i dati per questo ISBN.": "Unable to import data for this ISBN.",
"Impossibile inizializzare Uppy per i contenuti digitali.": "Unable to initialize Uppy for digital content.",
"Impossibile inviare la recensione": "Unable to submit review",
"Impossibile inviare la recensione.": "Unable to submit review.",
+ "Impossibile leggere i dati del modulo. Riprova.": "Unable to read form data. Please try again.",
+ "Impossibile leggere il file .env": "Cannot read .env file",
"Impossibile leggere il file caricato": "Unable to read the uploaded file",
+ "Impossibile leggere il file di backup": "Unable to read backup file",
+ "Impossibile leggere il file di log": "Unable to read log file",
+ "Impossibile modificare una copia attualmente in prestito. Prima termina il prestito o imposta lo stato su \"Disponibile\" per chiuderlo automaticamente.": "Cannot edit a copy currently on loan. First end the loan or set status to \"Available\" to close it automatically.",
+ "Impossibile notificare utente copia non disponibile": "Cannot notify user copy unavailable",
+ "Impossibile notificare utente: dati mancanti": "Cannot notify user: missing data",
"Impossibile processare l'immagine.": "Unable to process the image.",
+ "Impossibile recuperare i dati degli autori": "Unable to retrieve author data",
+ "Impossibile recuperare i dati degli editori": "Unable to retrieve publisher data",
+ "Impossibile recuperare informazioni sulla release": "Unable to retrieve release information",
+ "Impossibile revocare la sessione": "Unable to revoke session",
+ "Impossibile riaprire il file ZIP": "Unable to reopen ZIP file",
+ "Impossibile ricalcolare la disponibilità del libro.": "Unable to recalculate book availability.",
"Impossibile ridurre le copie a %d. Ci sono %d copie non disponibili (in prestito, perse o danneggiate). Il numero minimo di copie totali è %d.": "Cannot reduce the copies to %d. There are %d unavailable copies (on loan, lost, or damaged). The minimum total number of copies is %d.",
"Impossibile rifiutare la recensione": "Unable to reject the review",
"Impossibile rigenerare la sitemap: %s": "Unable to regenerate sitemap: %s",
+ "Impossibile rimuovere directory: %s": "Unable to remove directory: %s",
+ "Impossibile rimuovere file: %s": "Unable to remove file: %s",
+ "Impossibile ripristinare il plugin precedente: %s": "Unable to restore the previous plugin: %s",
+ "Impossibile risolvere il percorso della directory plugins.": "Unable to resolve the plugins directory path.",
+ "Impossibile salvare il file CSV caricato": "Unable to save the uploaded CSV file",
+ "Impossibile salvare il file di aggiornamento": "Unable to save update file",
"Impossibile salvare l'utente. Riprova più tardi.": "Unable to save user. Please try again later.",
+ "Impossibile salvare le impostazioni.": "Unable to save settings.",
+ "Impossibile scaricare (libro senza ISBN):": "Cannot download (book has no ISBN):",
+ "Impossibile scaricare (senza ISBN/barcode):": "Cannot download (no ISBN/barcode):",
+ "Impossibile scrivere file di backup": "Unable to write backup file",
+ "Impossibile scrivere nel file .env": "Cannot write to .env file",
"Impossibile segnare come letta la notifica.": "Unable to mark the notification as read.",
"Impossibile segnare tutte le notifiche come lette.": "Unable to mark all notifications as read.",
"Impossibile segnare tutti i messaggi come letti.": "Unable to mark all messages as read.",
- "Impossibile recuperare i dati degli autori": "Unable to retrieve author data",
- "Impossibile recuperare i dati degli editori": "Unable to retrieve publisher data",
- "Imposta come Predefinita": "Set as Default",
"Imposta come attiva o predefinita": "Set as active or default",
"Imposta come lingua predefinita per nuovi utenti": "Set as default language for new users",
+ "Imposta come Predefinita": "Set as Default",
"Imposta il nome mostrato nel backend e il logo utilizzato nel layout.": "Set the name shown in the backend and the logo used in the layout.",
+ "Imposta nel file .env: APP_CANONICAL_URL=%s": "Set in .env file: APP_CANONICAL_URL=%s",
+ "Imposta password": "Set password",
"Impostare questa lingua come predefinita?\n\nQuesta diventerà la lingua dell'intera applicazione per tutti gli utenti.": "Set this language as default?\n\nThis will become the language of the entire application for all users.",
"Impostare questa lingua come predefinita?\\n\\nQuesta diventerà la lingua dell'intera applicazione per tutti gli utenti.": "Set this language as default?\\n\\nThis will become the language of the entire application for all users.",
"Impostazioni": "Settings",
+ "Impostazioni API Book Scraper salvate correttamente.": "Book Scraper API settings saved successfully.",
"Impostazioni Applicazione": "Application Settings",
- "Impostazioni Date": "Date Settings",
- "Impostazioni SEO": "SEO Settings",
"Impostazioni avanzate aggiornate correttamente.": "Advanced settings updated successfully.",
"Impostazioni contatti aggiornate correttamente.": "Contact settings updated successfully.",
+ "Impostazioni Date": "Date Settings",
+ "Impostazioni di condivisione aggiornate.": "Sharing settings updated.",
+ "Impostazioni Discogs salvate correttamente.": "Discogs settings saved successfully.",
"Impostazioni email aggiornate correttamente.": "Email settings updated successfully.",
"Impostazioni generali aggiornate correttamente.": "General settings updated successfully.",
+ "Impostazioni GoodLib salvate correttamente.": "GoodLib settings saved successfully.",
"Impostazioni privacy aggiornate correttamente.": "Privacy settings updated successfully.",
"Impostazioni salvate.": "Settings saved.",
- "In Attesa di Approvazione": "Pending Approval",
- "In Corso": "In Progress",
- "In Riparazione": "Under Repair",
- "In Ritardo": "Overdue",
+ "Impostazioni SEO": "SEO Settings",
+ "Impostazioni Z39.50 salvate correttamente.": "Z39.50 settings saved successfully.",
"In attesa": "Pending",
+ "in attesa": "pending",
+ "In Attesa": "Pending",
+ "In Attesa di Approvazione": "Pending Approval",
"In attesa di approvazione": "Pending approval",
+ "In Corso": "In Progress",
"In corso": "In progress",
"In corso di restituzione": "Pending return",
"In corso...": "In progress...",
"In manutenzione": "Under maintenance",
"In prestito": "On loan",
+ "In prestito fino al": "On loan until",
"In questa pagina trovi tutti gli eventi, gli incontri e i laboratori organizzati dalla biblioteca.": "On this page you will find every event, talk, and workshop organized by the library.",
+ "In Riparazione": "Under Repair",
+ "In Ritardo": "Overdue",
"In ritardo": "Overdue",
+ "IN RITARDO": "OVERDUE",
+ "In scadenza": "Expiring soon",
+ "in_corso": "in progress",
+ "in_ritardo": "overdue",
"Inattivo": "Inactive",
+ "Incompleto": "Incomplete",
+ "Indice %s creato su %s": "Index %s created on %s",
+ "Indice completo degli URL": "Complete URL index",
+ "Indice ISBN": "ISBN Index",
+ "Indici creati con successo": "Indexes created successfully",
+ "Indici creati:": "Indexes created:",
+ "Indici di ottimizzazione creati OK": "Optimization indexes created OK",
"Indietro": "Back",
"Indirizzo": "Address",
- "Indirizzo:": "Address:",
"Indirizzo completo": "Full Address",
"Indirizzo completo *": "Full address *",
+ "Indirizzo:": "Address:",
"Info": "Info",
+ "Info HSTS:": "HSTS Info:",
+ "info@editore.com": "info@publisher.com",
+ "Informativa sulla privacy": "Privacy policy",
"Informazione": "Information",
"Informazioni": "Information",
+ "Informazioni Aggiuntive": "Additional Information",
"Informazioni Base": "Basic Information",
+ "Informazioni di Contatto": "Contact Information",
+ "Informazioni di contatto": "Contact information",
+ "Informazioni editore": "Publisher information",
"Informazioni Evento": "Event Information",
+ "Informazioni generali": "General Information",
"Informazioni Importanti": "Important Information",
+ "Informazioni LibraryThing": "LibraryThing Information",
"Informazioni Libro": "Book Information",
"Informazioni Personali": "Personal Information",
+ "Informazioni personali": "Personal Information",
+ "Informazioni Plugin": "Plugin Information",
"Informazioni Prestito": "Loan Information",
"Informazioni Report": "Report Info",
- "Informazioni di Contatto": "Contact Information",
- "Informazioni di contatto": "Contact information",
- "Informazioni editore": "Publisher information",
- "Informazioni generali": "General Information",
- "Informazioni personali": "Personal Information",
+ "Informazioni sulla biblioteca": "About this library",
+ "Informazioni sullo Storico Import": "Import History Information",
"Informazioni tessera": "Card information",
"Informazioni utili per il personale": "Useful information for staff",
- "Inizia Installazione": "Start Installation",
"Inizia ad aggiungere libri al catalogo": "Start adding books to the catalog",
"Inizia aggiungendo il primo libro alla collezione": "Start by adding the first book to the collection",
"Inizia aggiungendo la prima lingua.": "Start by adding the first language.",
"Inizia caricando il tuo primo plugin": "Get started by uploading your first plugin",
"Inizia creando il primo genere letterario": "Start by creating your first literary genre",
+ "Inizia Installazione": "Start Installation",
"Inizia la Tua Avventura Letteraria": "Start Your Literary Adventure",
"Inizializzazione...": "Initializing...",
+ "Inizio": "Start",
"Inizio installazione...": "Starting installation...",
"Inizio:": "Start:",
+ "Inserimento Manuale Dewey": "Manual Dewey Entry",
"Inserisci $1": "Enter $1",
"Inserisci codice locale (es. es_ES per Spagnolo)": "Enter locale code (e.g. es_ES for Spanish)",
+ "Inserisci il codice Dewey completo (supporta fino a 4 decimali)": "Enter the complete Dewey code (supports up to 4 decimal digits)",
"Inserisci il motivo del rifiuto...": "Enter the reason for rejection...",
"Inserisci il titolo": "Enter title",
"Inserisci la data di inizio (YYYY-MM-DD)": "Enter the start date (YYYY-MM-DD)",
@@ -1523,64 +2150,129 @@
"Inserisci le credenziali del tuo database MySQL. Assicurati che il database sia già stato creato e sia vuoto.": "Enter your MySQL database credentials. Make sure the database has been created and is empty.",
"Inserisci le informazioni del nuovo evento": "Enter the information for the new event",
"Inserisci parole chiave separate da virgole per facilitare la ricerca": "Enter keywords separated by commas to facilitate searching",
+ "Inserisci qualsiasi codice Dewey (anche se non presente nell'elenco)": "Enter any Dewey code (even if not in the list)",
"Inserisci solo script che NON tracciano utenti. Per analytics/marketing usa le sezioni dedicate.": "Only insert scripts that DO NOT track users. For analytics/marketing use the dedicated sections.",
+ "Inserisci un codice Dewey": "Enter a Dewey code",
"Inserisci un codice ISBN per continuare.": "Enter an ISBN code to continue.",
+ "Inserisci un nome": "Enter a name",
"Inserisci un numero valido di copie": "Enter a valid number of copies",
+ "Inserisci una breve biografia dell'autore...": "Enter a brief author biography...",
"Instagram": "Instagram",
"Installa": "Install",
"Installa Plugin": "Install Plugin",
"Installato": "Installed",
"Installato:": "Installed:",
"Installazione": "Installation",
+ "Installazione completata": "Installation completed",
"Installazione Completata": "Installation Completed",
"Installazione Completata!": "Installation Completed!",
"Installazione Cron Job": "Cron Job Installation",
"Installazione Database": "Database Installation",
- "Installazione Guidata": "Guided Installation",
+ "Installazione database non completa. Tabelle mancanti: %s": "Database installation incomplete. Missing tables: %s",
+ "Installazione database non completa. Trovate %d tabelle, attese %d": "Database installation incomplete. Found %d tables, expected %d",
"Installazione delle tabelle del database e configurazione iniziale...": "Installing database tables and initial configuration...",
"Installazione fallita": "Installation failed",
"Installazione file": "Installing files",
+ "Installazione Guidata": "Guided Installation",
"Installazione in corso...": "Installation in progress...",
+ "installazione inglese usa": "English installation uses",
"Installazione italiana usa": "Italian installation uses",
"Installazione plugin Open Library...": "Installing Open Library plugin...",
- "Installer Pinakes": "Pinakes Installer",
"Installer eliminato con successo!": "Installer deleted successfully!",
+ "Installer Pinakes": "Pinakes Installer",
+ "Insufficiente": "Insufficient",
"Integrità dati": "Data integrity",
"Internal server error": "Internal server error",
+ "International Standard Serial Number (per periodici)": "International Standard Serial Number (for periodicals)",
+ "Interoperabilità bibliotecaria (MARCXML, Dublin Core)": "Library interoperability (MARCXML, Dublin Core)",
"Intestazione": "Header",
"Intestazione sezione": "Section Header",
"Inventario": "Inventory",
- "Invia Richiesta": "Submit Request",
+ "Invia Email": "Send Email",
"Invia link": "Send link",
"Invia link di reset": "Send reset link",
"Invia messaggio": "Send message",
+ "Invia per email": "Send by email",
"Invia recensione": "Submit review",
+ "Invia Richiesta": "Submit Request",
+ "Invia via SMS": "Send via SMS",
"Inviaci un messaggio": "Send us a message",
+ "Inviata agli amministratori quando viene ricevuta una nuova recensione da approvare.": "Sent to administrators when a new review is received for approval.",
+ "Inviata agli utenti quando un libro nella wishlist torna disponibile. Il libro rimane nella wishlist ma non riceverà altre notifiche per lo stesso libro.": "Sent to users when a book on their wishlist becomes available. The book remains on the wishlist but will not receive further notifications for the same book.",
+ "Inviata agli utenti quando un libro nella wishlist torna disponibile. Il libro viene automaticamente rimosso dalla wishlist dopo l'invio della notifica per evitare duplicati.": "Sent to users when a book on their wishlist becomes available. The book is automatically removed from the wishlist after the notification to avoid duplicates.",
+ "Inviata ai nuovi utenti per impostare la password del loro account.": "Sent to new users to set up their account password.",
+ "Inviata all'utente al termine della registrazione per confermare la ricezione e l'attesa di approvazione.": "Sent to the user after registration to confirm receipt and waiting for approval.",
+ "Inviata all'utente quando un amministratore approva l'account.": "Sent to the user when an administrator approves the account.",
+ "Inviata all'utente quando un amministratore approva una richiesta di prestito.": "Sent to the user when an administrator approves a loan request.",
+ "Inviata all'utente quando un amministratore rifiuta una richiesta di prestito.": "Sent to the user when an administrator rejects a loan request.",
+ "Inviata quando il tempo per ritirare un libro è scaduto e il prestito è stato annullato.": "Sent when the pickup deadline has passed and the loan has been cancelled.",
+ "Inviata quando un libro prenotato diventa disponibile e viene convertito in prestito pendente.": "Sent when a reserved book becomes available and is converted to a pending loan.",
+ "Inviata quando un prestito è stato approvato e il libro è pronto per il ritiro.": "Sent when a loan has been approved and the book is ready for pickup.",
+ "Inviata quando un ritiro viene annullato dall'amministratore.": "Sent when a pickup is cancelled by an administrator.",
+ "Inviata quando un utente viene invitato come amministratore.": "Sent when a user is invited as an administrator.",
"Inviato": "Sent",
"Invio in corso...": "Sending...",
+ "Invio notifica prenotazione fallito": "Reservation notification failed",
"Invita gli utenti a registrarsi": "Invite users to register",
+ "Invito amministratore": "Administrator invitation",
+ "IP": "IP",
+ "IP Address": "IP Address",
+ "ISBN": "ISBN",
+ "ISBN 10": "ISBN 10",
+ "ISBN 13": "ISBN 13",
+ "ISBN a 13 cifre (univoco)": "13-digit ISBN (unique)",
+ "ISBN Mancante": "Missing ISBN",
+ "ISBN non trovato nelle fonti disponibili.": "ISBN not found in available sources.",
+ "ISBN non trovato. Fonti consultate: %s": "ISBN not found. Sources consulted: %s",
+ "ISBN non valido. Specifica 10 o 13 cifre (eventualmente con X finale).": "Invalid ISBN. Please provide 10 or 13 digits (X allowed at the end).",
+ "ISBN o EAN...": "ISBN or EAN...",
+ "ISBN-13:": "ISBN-13:",
+ "ISBN10": "ISBN10",
+ "ISBN10 deve contenere esattamente 10 caratteri (9 cifre + 1 cifra o X).": "ISBN10 must contain exactly 10 characters (9 digits + 1 digit or X).",
+ "ISBN10 Non Valido": "Invalid ISBN10",
+ "ISBN10 o ISBN13": "ISBN10 or ISBN13",
+ "ISBN13": "ISBN13",
+ "ISBN13 deve contenere esattamente 13 cifre.": "ISBN13 must contain exactly 13 digits.",
+ "ISBN13 Non Valido": "Invalid ISBN13",
+ "ISBN13: %s": "ISBN13: %s",
+ "ISBN:": "ISBN:",
+ "ISSN": "ISSN",
+ "ISSN deve essere nel formato XXXX-XXXX (8 cifre, l'ultima può essere X).": "ISSN must be in the format XXXX-XXXX (7 digits plus a check character (digit or X)).",
+ "ISSN Non Valido": "Invalid ISSN",
+ "ISSN non valido. Il formato corretto è XXXX-XXXX (8 cifre, l'ultima può essere X).": "Invalid ISSN. The correct format is XXXX-XXXX (7 digits plus a check character (digit or X)).",
+ "IT": "IT",
"Italiano (IT)": "Italian (IT)",
- "JPG, PNG, GIF, WEBP - Max 5MB": "JPG, PNG, GIF, WEBP - Max 5MB",
"JavaScript Analitici": "Analytics JavaScript",
"JavaScript Essenziali": "Essential JavaScript",
"JavaScript Marketing": "Marketing JavaScript",
+ "JPG, PNG, GIF, WEBP - Max 5MB": "JPG, PNG, GIF, WEBP - Max 5MB",
+ "JSON non valido.": "Invalid JSON.",
+ "kg": "kg",
+ "L'accesso alla cartella installer è automaticamente bloccato dopo l'installazione.": "Access to the installer folder is automatically blocked after installation.",
"L'API key può essere fornita in due modi:": "API key can be provided in two ways:",
+ "L'API key viene criptata con AES-256-GCM prima di essere salvata.": "The API key is encrypted with AES-256-GCM before being saved.",
"L'API è limitata a 50 risultati per richiesta": "API is limited to 50 results per request",
"L'applicazione NON può funzionare senza questo passaggio!": "The application CANNOT work without this step!",
+ "L'applicazione risulta correttamente configurata.": "The application is correctly configured.",
"L'applicazione è stata installata correttamente e tutte le verifiche sono andate a buon fine.": "The application has been successfully installed and all checks have passed.",
+ "L'archivio ZIP è vuoto": "The ZIP archive is empty",
"L'email di attivazione è stata inviata. L'utente potrà verificare il proprio account cliccando il link ricevuto (valido 7 giorni).": "Activation email has been sent. User can verify their account by clicking the link received (valid for 7 days).",
+ "L'ID primario deve essere presente nella lista degli autori da unire": "The primary ID must be present in the list of authors to merge",
+ "L'ID primario deve essere presente nella lista degli editori da unire": "The primary ID must be present in the list of publishers to merge",
"L'immagine verrà scaricata al salvataggio": "The image will be downloaded on save",
"L'immagine è troppo grande. Max 5MB.": "Image is too large. Max 5MB.",
"L'indirizzo email deve essere valido.": "Email address must be valid.",
"L'installazione non è completa o valida.": "The installation is not complete or valid.",
+ "L'installazione è stata completata correttamente e tutte le verifiche sono andate a buon fine.": "Installation completed successfully and all verifications passed.",
"L'installazione è stata completata senza errori.": "The installation has been completed without errors.",
- "L'ID primario deve essere presente nella lista degli autori da unire": "The primary ID must be present in the list of authors to merge",
- "L'ID primario deve essere presente nella lista degli editori da unire": "The primary ID must be present in the list of publishers to merge",
"L'ora dell'evento deve essere nel formato corretto (HH:MM).": "Event time must be in the correct format (HH:MM).",
"L'ora deve essere nel formato corretto (HH:MM).": "Time must be in the correct format (HH:MM).",
- "L'URL canonico non è valido. Deve iniziare con http:// o https://": "Canonical URL is not valid. It must start with http:// or https://",
"L'ultima sezione che invita all'azione": "The final call-to-action section",
+ "L'URL canonico non è valido. Deve iniziare con http:// o https://": "Canonical URL is not valid. It must start with http:// or https://",
+ "L'URL del calendario è stato copiato negli appunti.": "The calendar URL has been copied to clipboard.",
+ "L'URL fornito non è valido": "The provided URL is not valid",
"L'utente del database non ha i permessi per creare i TRIGGER. L'installazione è stata completata, ma per garantire la piena integrità dei dati è necessario installarli manualmente.": "The database user does not have permissions to create TRIGGERS. The installation has been completed, but to ensure full data integrity it is necessary to install them manually.",
+ "L'utente ha ritirato il libro?": "Has the user picked up the book?",
"L'utente non è in stato sospeso. Solo gli utenti sospesi richiedono approvazione.": "User is not in suspended state. Only suspended users require approval.",
"L'utente riceverà un'email con link di verifica (valido 7 giorni) e potrà attivare autonomamente l'account.": "User will receive an email with verification link (valid for 7 days) and can activate the account autonomously.",
"L'utente riceverà una notifica via email della prenotazione creata": "User will receive email notification of the created reservation",
@@ -1588,39 +2280,56 @@
"L'utente sarà attivato immediatamente e riceverà un'email di benvenuto. Potrà accedere subito.": "User will be activated immediately and will receive a welcome email. Can log in right away.",
"L'utente è stato attivato e può già effettuare il login. È stata inviata un'email di benvenuto.": "User has been activated and can already log in. A welcome email has been sent.",
"L'utente è stato eliminato.": "The user has been deleted.",
- "La Tua Biblioteca Digitale": "Your Digital Library",
"La cartella vendor/ esiste e contiene le librerie necessarie.": "The vendor/ folder exists and contains the necessary libraries.",
"La classificazione Dewey è utilizzata per organizzare i libri per argomento secondo standard internazionali": "The Dewey classification is used to organize books by subject according to international standards",
"La collocazione può essere assegnata automaticamente o inserita manualmente durante la creazione/modifica del libro": "Location can be assigned automatically or entered manually during book creation/editing",
"La collocazione è l'indirizzo fisico che identifica dove si trova un libro nella biblioteca.": "Location is the physical address that identifies where a book is located in the library.",
"La copertina verrà rimossa al salvataggio del libro": "The cover will be removed when saving the book",
+ "La copia assegnata è stata segnalata come persa o danneggiata": "The assigned copy has been reported as lost or damaged",
+ "La copia non è più disponibile": "The copy is no longer available",
+ "La cronologia degli aggiornamenti apparirà qui": "The update history will appear here",
"La data dell'evento è obbligatoria e deve essere nel formato corretto.": "Event date is required and must be in the correct format.",
"La data dell'evento è obbligatoria.": "Event date is required.",
"La data di nascita deve essere precedente alla data di morte.": "Birth date must be before death date.",
+ "La data non può essere nel passato.": "Date cannot be in the past.",
"La lingua contrassegnata come 'Predefinita' verrà usata in tutta l'applicazione per tutti gli utenti. Per cambiare la lingua dell'intera app, clicca sull'icona stella": "The language marked as 'Default' will be used throughout the application for all users. To change the language of the entire app, click the star icon",
+ "La mia bacheca": "My Dashboard",
+ "La modalità manutenzione non era attiva": "Maintenance mode was not active",
"La pagina che stai cercando non esiste o è stata spostata.": "The page you are looking for does not exist or has been moved.",
+ "La pagina che stai cercando non esiste.": "The page you are looking for does not exist.",
+ "La password attuale non è corretta.": "Current password is incorrect.",
"La password deve contenere almeno 8 caratteri, lettere maiuscole, minuscole e numeri": "Password must contain at least 8 characters with uppercase letters, lowercase letters, and numbers",
"La password deve contenere almeno una lettera maiuscola, una minuscola e un numero": "Password must contain at least one uppercase letter, one lowercase letter and one number",
+ "La password deve contenere almeno una lettera maiuscola, una minuscola e un numero.": "Password must contain at least one uppercase letter, one lowercase letter and a number.",
+ "La password deve contenere maiuscole, minuscole e numeri.": "Password must contain uppercase, lowercase and numbers.",
"La password deve essere lunga almeno 8 caratteri": "Password must be at least 8 characters long",
"La password deve essere lunga almeno 8 caratteri!": "Password must be at least 8 characters long!",
+ "La password deve essere lunga almeno 8 caratteri.": "Password must be at least 8 characters long.",
+ "La password non può superare i 72 caratteri.": "Password cannot exceed 72 characters.",
"La posizione fisica è indipendente dalla classificazione Dewey e indica dove si trova il libro sugli scaffali.": "The physical position is independent of the Dewey classification and indicates where the book is located on the shelves.",
"La posizione in coda sarà calcolata automaticamente in base alle prenotazioni esistenti": "Queue position will be calculated automatically based on existing reservations",
"La posizione viene assegnata automaticamente": "Position is assigned automatically",
+ "La prenotazione è scaduta": "The reservation has expired",
"La recensione è stata approvata e pubblicata con successo.": "The review has been approved and published successfully.",
+ "La recensione è stata eliminata definitivamente.": "The review has been permanently deleted.",
"La recensione è stata rifiutata e non sarà pubblicata.": "The review has been rejected and will not be published.",
+ "La richiesta ha impiegato troppo tempo. Riprova.": "The request took too long. Please try again.",
"La risposta include tutti i dati del libro:": "Response includes all book data:",
"La scadenza verrà estesa di 14 giorni": "The due date will be extended by 14 days",
"La sessione è scaduta. Aggiorna la pagina e riprova.": "The session has expired. Refresh the page and try again.",
"La sezione principale che appare per prima sulla home": "The main section that appears first on the homepage",
"La sitemap viene aggiornata automaticamente quando premi il pulsante oppure tramite lo script CLI": "Sitemap is updated automatically when you press the button or via CLI script",
"La sitemap viene aggiornata automaticamente quando premi il pulsante oppure tramite lo script CLI
php scripts/generate-sitemap.php. Usa questa azione dopo aver importato un grande numero di libri o modifiche ai contenuti CMS.": "Sitemap is automatically updated when you press button or via CLI script
php scripts/generate-sitemap.php. Use this action after importing many books or CMS content changes.",
- "La cronologia degli aggiornamenti apparirà qui": "The update history will appear here",
+ "La Tua Biblioteca Digitale": "Your Digital Library",
"La tua biblioteca digitale...": "Your digital library...",
- "La versione %s è disponibile. Prima di aggiornare, verrà creato un backup automatico del database.": "Version %s is available. Before updating, an automatic database backup will be created.",
+ "La tua prenotazione per \"%s\" è stata messa in attesa. %s. Verrai notificato quando sarà disponibile una nuova copia.": "Your reservation for \"%s\" has been put on hold. %s. You will be notified when a new copy becomes available.",
+ "La tua recensione del libro...": "Your book review...",
+ "La tua richiesta di prestito è stata inviata. Riceverai una notifica quando verrà approvata.": "Your loan request has been sent. You will receive a notification when it is approved.",
"La tua sessione è scaduta. Per motivi di sicurezza, effettua nuovamente l'accesso": "Your session has expired. For security reasons, please sign in again",
"La tua sessione è scaduta. Per motivi di sicurezza, ricarica la pagina e riprova": "Your session has expired. For security reasons, refresh the page and try again",
"La tua sessione è scaduta. Per motivi di sicurezza, ricarica la pagina ed effettua nuovamente l'accesso.": "Your session has expired. For security reasons, reload the page and log in again.",
"La tua wishlist è vuota": "Your wishlist is empty",
+ "La versione %s è disponibile. Prima di aggiornare, verrà creato un backup automatico del database.": "Version %s is available. Before updating, an automatic database backup will be created.",
"Lascia una recensione": "Leave a review",
"Lascia vuoto o usa \"Genera\" per assegnare automaticamente la prossima posizione disponibile.": "Leave empty or use \"Generate\" to automatically assign the next available position.",
"Lascia vuoto o usa \\": "Leave empty or use \\",
@@ -1628,72 +2337,113 @@
"Lascia vuoto per auto-rilevamento. Necessario solo su macOS/Linux con socket personalizzati.": "Leave empty for auto-detection. Only needed on macOS/Linux with custom sockets.",
"Lascia vuoto per generare automaticamente": "Leave blank to generate automatically",
"Lascia vuoto per inviare un link di impostazione": "Leave blank to send a setup link",
+ "Lascia vuoto per mantenere il nome attuale": "Leave empty to keep the current name",
+ "Lascia vuoto per mantenere la chiave esistente. Inserisci un nuovo valore per aggiornarla.": "Leave empty to keep the existing key. Enter a new value to update it.",
"Lascia vuoto per nascondere il social dal footer": "Leave empty to hide the social from footer",
"Lascia vuoto per nascondere il titolo": "Leave empty to hide the title",
- "Lascia vuoto per mantenere la chiave esistente. Inserisci un nuovo valore per aggiornarla.": "Leave empty to keep the existing key. Enter a new value to update it.",
- "Lascia vuoto per mantenere il nome attuale": "Leave empty to keep the current name",
"Lascia vuoto per non modificare": "Leave empty to not modify",
"Lascia vuoto se l'autore è vivente": "Leave blank if the author is alive",
+ "LCCN": "LCCN",
"Le API key disattivate restituiranno errore 401": "Disabled API keys will return 401 error",
- "Le Mie Prenotazioni": "My Reservations",
- "Le Mie Recensioni": "My Reviews",
"Le copie disponibili vengono calcolate automaticamente": "Available copies are calculated automatically",
"Le date rosse non sono disponibili. La richiesta verrà valutata da un amministratore.": "Red dates are unavailable. Your request will be reviewed by an administrator.",
+ "Le date rosse o arancioni non sono disponibili. La richiesta verrà valutata da un amministratore.": "Red or orange dates are not available. The request will be evaluated by an administrator.",
+ "Le Mie Prenotazioni": "My Reservations",
"Le mie prenotazioni": "My Reservations",
+ "Le Mie Recensioni": "My Reviews",
"Le password non coincidono": "Passwords do not match",
"Le password non coincidono!": "Passwords do not match!",
+ "Le password non coincidono.": "Passwords do not match.",
+ "Le password non corrispondono": "Passwords do not match",
"Le posizioni si generano automaticamente": "Positions are generated automatically",
"Le route non possono contenere spazi": "Routes cannot contain spaces",
"Le route sono gli URL usati nell'applicazione. Traducendole, puoi avere URL in italiano o inglese in base alla lingua dell'installazione.": "Routes are the URLs used in the application. By translating them, you can have URLs in Italian or English based on the installation language.",
+ "Le sessioni scadono automaticamente per proteggere i tuoi dati.": "Sessions expire automatically to protect your data.",
"Le tue recensioni": "Your reviews",
+ "Leggi PDF": "Read PDF",
+ "Letta": "Read",
"Letto": "Read",
"Lettore": "Reader",
"Libero": "Free",
+ "Library Management System": "Library Management System",
+ "Library of Congress Control Number": "Library of Congress Control Number",
+ "LibraryThing": "LibraryThing",
+ "LibraryThing TSV": "LibraryThing TSV",
+ "LibraryThing Work ID": "LibraryThing Work ID",
"Librerie di upload non caricate. Ricarica la pagina.": "Upload libraries not loaded. Please reload the page.",
"Libri": "Books",
+ "libri": "books",
+ "Libri attualmente in prestito": "Books currently on loan",
+ "Libri con ISBN": "Books with ISBN",
"Libri Disponibili": "Available Books",
+ "libri eliminati": "books deleted",
+ "Libri Importati": "Books Imported",
+ "Libri nelle collane": "Books in series",
+ "Libri per Collocazione": "Books by Location",
+ "Libri prenotati dagli utenti": "Books reserved by users",
"Libri Prestati": "Loaned Books",
"Libri Totali": "Total Books",
- "Libri per Collocazione": "Books by Location",
+ "libri trovati": "books found",
+ "libri. Questa azione non può essere annullata.": "books. This action cannot be undone.",
"Libro": "Book",
- "Libro Esistente:": "Existing Book:",
- "Libro Già Esistente": "Book Already Exists",
+ "libro": "book",
+ "Libro '%s' (ID: %d) ha copie disponibili negative: %d": "Book '%s' (ID: %d) has negative available copies: %d",
+ "Libro '%s' (ID: %d) ha più copie disponibili (%d) che totali (%d)": "Book '%s' (ID: %d) has more available copies (%d) than total (%d)",
+ "Libro '%s' (ID: %d) ha stato '%s' ma copie disponibili: %d": "Book '%s' (ID: %d) has status '%s' but available copies: %d",
"Libro aggiornato con successo!": "Book updated successfully!",
"Libro aggiunto con successo!": "Book added successfully!",
"Libro da prenotare": "Book to reserve",
+ "Libro disponibile per la prenotazione": "Book available for reservation",
"Libro e utente sono campi obbligatori.": "Book and user are required fields.",
+ "Libro Esistente:": "Existing Book:",
+ "Libro Già Esistente": "Book Already Exists",
+ "Libro ID %d ha posizioni coda non sequenziali: %s": "Book ID %d has non-sequential queue positions: %s",
"Libro non disponibile": "Book not available",
+ "Libro non trovato": "Book not found",
+ "Libro non trovato nel database Open Library": "Book not found in Open Library database",
"Libro non trovato su Open Library.": "Book not found on Open Library.",
"Libro non trovato.": "Book not found.",
- "Libro non trovato": "Book not found",
+ "Libro non valido o eliminato": "Invalid or deleted book",
+ "Libro prenotato disponibile": "Reserved book available",
"Libro senza titolo": "Untitled book",
+ "libro trovato": "book found",
"Libro:": "Book:",
"Licenza": "License",
"Limite massimo rinnovi raggiunto": "Maximum renewal limit reached",
"Limiti: massimo 50 libri con scraping attivo, timeout 5 minuti": "Limits: maximum 50 books with scraping enabled, 5 minute timeout",
+ "linea": "line",
"Lingua": "Language",
+ "Lingua aggiornata con successo": "Language updated successfully",
"Lingua App": "App Language",
"Lingua Attiva": "Active Language",
- "Lingua Predefinita": "Default Language",
- "Lingua Predefinita:": "Default Language:",
- "Lingua aggiornata con successo": "Language updated successfully",
"Lingua creata con successo": "Language created successfully",
+ "Lingua e Provenienza": "Language and Provenance",
"Lingua eliminata con successo": "Language deleted successfully",
+ "Lingua non supportata": "Unsupported language",
"Lingua non trovata": "Language not found",
"Lingua originale del libro": "Original language of the book",
+ "Lingua Predefinita": "Default Language",
"Lingua predefinita impostata con successo": "Default language set successfully",
+ "Lingua Predefinita:": "Default Language:",
"Lingue": "Languages",
+ "lingue": "languages",
"Lingue Configurate": "Configured Languages",
+ "Lingue Originali": "Original Languages",
+ "Lingue valide": "Valid languages",
+ "lingue. Errori:": "languages. Errors:",
"Link": "Link",
- "Link Cookie Statement": "Cookie Statement Link",
- "Link Cookie Technologies": "Cookie Technologies Link",
- "Link Social Media": "Social Media Links",
"Link al file digitale (se disponibile)": "Link to digital file (if available)",
"Link all'audiolibro (se disponibile)": "Link to audiobook (if available)",
+ "Link Cookie Statement": "Cookie Statement Link",
+ "Link Cookie Technologies": "Cookie Technologies Link",
"Link copiato!": "Link copied!",
+ "Link di esempio": "Example link",
"Link di reset non valido o scaduto": "Reset link invalid or expired",
"Link pulsante": "Button Link",
+ "Link Social Media": "Social Media Links",
+ "link, accenti": "links, accents",
"LinkedIn": "LinkedIn",
+ "Lista": "List",
"Livello": "Level",
"Livello ${m.numero_livello}": "Level ${m.numero_livello}",
"Livello *": "Level *",
@@ -1706,24 +2456,21 @@
"Lo stato della prenotazione sarà impostato automaticamente come \\": "Reservation status will be automatically set as \\",
"Loans": "Loans",
"Locale": "Local",
+ "Locale non supportato.": "Unsupported locale.",
"Lock file creato (installazione protetta)": "Lock file created (installation protected)",
"Log": "Log",
- "Log Sicurezza": "Security Logs",
"Log di Sicurezza": "Security Log",
+ "Log Sicurezza": "Security Logs",
"Login": "Login",
"Login Riuscito": "Login Successful",
"Logo": "Logo",
"Logo Applicazione (opzionale)": "Application Logo (optional)",
"Logout effettuato con successo": "Logout successful",
- "MP3, M4A o OGG, max 500 MB": "MP3, M4A or OGG, max 500 MB",
+ "LP": "LP",
+ "luglio": "July",
+ "maggio": "May",
"Mai generata": "Never generated",
"Mai utilizzata": "Never used",
- "Mancante": "Missing",
- "Mantieni in ritardo": "Keep overdue",
- "Manuale": "Manual",
- "Manutenzione": "Maintenance",
- "Manutenzione completata: %d record corretti": "Maintenance completed: %d records fixed",
- "Manutenzione giornaliera del database": "Daily database maintenance",
"MaintenanceService connessione database fallita": "MaintenanceService database connection failed",
"MaintenanceService errore attivazione prestiti": "MaintenanceService loan activation error",
"MaintenanceService errore attivazione prestito": "MaintenanceService loan activation error",
@@ -1734,28 +2481,47 @@
"MaintenanceService errore notifiche": "MaintenanceService notification error",
"MaintenanceService errore prenotazioni scadute": "MaintenanceService expired reservations error",
"MaintenanceService errore prestiti in ritardo": "MaintenanceService overdue loans error",
+ "MaintenanceService errore ritiri scaduti": "MaintenanceService expired pickups error",
"MaintenanceService errore scadenza prenotazione": "MaintenanceService reservation expiration error",
+ "MaintenanceService errore scadenza ritiro": "MaintenanceService pickup expiration error",
"MaintenanceService eseguito al login admin": "MaintenanceService executed on admin login",
"MaintenanceService ICS non generato": "MaintenanceService ICS not generated",
"MaintenanceService prenotazione convertita in prestito": "MaintenanceService reservation converted to loan",
"MaintenanceService prenotazione scaduta": "MaintenanceService reservation expired",
+ "MaintenanceService ritiro scaduto": "MaintenanceService pickup expired",
+ "Mancante": "Missing",
+ "Mantieni in ritardo": "Keep overdue",
+ "Manuale": "Manual",
+ "Manutenzione": "Maintenance",
+ "manutenzione": "maintenance",
+ "Manutenzione Completa": "Full Maintenance",
+ "Manutenzione completata: %d record corretti": "Maintenance completed: %d records fixed",
"Manutenzione disattivata": "Maintenance disabled",
- "Mappa Interattiva": "Interactive Map",
+ "Manutenzione giornaliera del database": "Daily database maintenance",
"Mappa del sito per i motori di ricerca": "Site map for search engines",
+ "Mappa Interattiva": "Interactive Map",
"Mappa non disponibile": "Map not available",
"Mario": "John",
+ "mario.rossi@email.it": "john.doe@email.com",
+ "Marketing:": "Marketing:",
+ "marzo": "March",
"Maschio": "Male",
"Max 10.000 righe • Max 100 copie per libro": "Max 10,000 rows • Max 100 copies per book",
"Mediocre": "Fair",
"Membro": "Member",
+ "Memory limit aumentato": "Memory limit increased",
"Mensola": "Shelf",
"Mensola creata e %d posizioni generate.": "Shelf created and %d positions generated.",
"Mensola creata.": "Shelf created.",
+ "Mensola eliminata": "Shelf deleted",
"Mensole": "Shelves",
"Menu": "Menu",
- "Menu Principale": "Main Menu",
"Menu \"Prestiti\" nell'admin sidebar": "\"Loans\" menu in admin sidebar",
- "Migrazione database": "Database migration",
+ "Menu Principale": "Main Menu",
+ "Merge - Aggiungi e aggiorna (mantiene dati esistenti)": "Merge - Add and update (keeps existing data)",
+ "Merge completato": "Merge completed",
+ "Merge completato: %d aggiunti, %d aggiornati, %d invariati. Totale: %d voci.": "Merge completed: %d added, %d updated, %d unchanged. Total: %d entries.",
+ "Mese": "Month",
"Messaggi": "Messages",
"Messaggi di Contatto": "Contact Messages",
"Messaggio": "Message",
@@ -1763,18 +2529,19 @@
"Messaggio non trovato.": "Message not found.",
"Metadati:": "Metadata:",
"Metodo di invio": "Sending method",
+ "Migrazione database": "Database migration",
"Minimo 8 caratteri": "Minimum 8 characters",
"Minimo 8 caratteri, con lettere maiuscole, minuscole e numeri": "Minimum 8 characters, with uppercase, lowercase and numbers",
+ "minuti fa": "minutes ago",
"Mittente": "From",
"Mittente (email)": "Sender (email)",
"Mittente (nome)": "Sender (name)",
- "Moderatore": "Moderator",
"Modalità Catalogo": "Catalogue Mode",
- "Modalità Solo Catalogo": "Catalogue Only Mode",
"Modalità di importazione": "Import mode",
- "Merge - Aggiungi e aggiorna (mantiene dati esistenti)": "Merge - Add and update (keeps existing data)",
- "Merge completato": "Merge completed",
- "Merge completato: %d aggiunti, %d aggiornati, %d invariati. Totale: %d voci.": "Merge completed: %d added, %d updated, %d unchanged. Total: %d entries.",
+ "Modalità manutenzione disattivata": "Maintenance mode disabled",
+ "Modalità manutenzione rimossa automaticamente (scaduta)": "Maintenance mode automatically removed (expired)",
+ "Modalità Solo Catalogo": "Catalogue Only Mode",
+ "Moderatore": "Moderator",
"Modifica": "Edit",
"Modifica %s": "Edit %s",
"Modifica Autore": "Edit Author",
@@ -1784,73 +2551,102 @@
"Modifica Evento": "Edit Event",
"Modifica Evento: %s": "Edit Event: %s",
"Modifica Homepage": "Edit Homepage",
- "Modifica Libro": "Edit Book",
- "Modifica Lingua:": "Edit Language:",
- "Modifica Prenotazione": "Edit Reservation",
- "Modifica Prenotazione #%s": "Edit Reservation #%s",
- "Modifica Route Tradotte": "Edit Translated Routes",
- "Modifica Stato Copia": "Edit Copy Status",
- "Modifica Utente": "Edit User",
"Modifica i contenuti della homepage: hero, features, CTA e immagine di sfondo": "Edit homepage content: hero, features, CTA and background image",
"Modifica il contenuto e le impostazioni della pagina": "Edit page content and settings",
"Modifica le informazioni dell'evento": "Edit the event information",
"Modifica le pagine statiche del sito": "Edit static site pages",
+ "Modifica Libro": "Edit Book",
+ "Modifica Lingua:": "Edit Language:",
+ "Modifica Prenotazione": "Edit Reservation",
+ "Modifica Prenotazione #%s": "Edit Reservation #%s",
"Modifica prestito": "Edit loan",
"Modifica prestito #%s": "Edit Loan #%s",
"Modifica profilo": "Edit profile",
+ "Modifica Route": "Edit Route",
+ "Modifica Route Tradotte": "Edit Translated Routes",
"Modifica stato": "Edit status",
+ "Modifica Stato Copia": "Edit Copy Status",
+ "Modifica Utente": "Edit User",
"Modifica utente": "Edit user",
+ "Modifiche non salvate": "Unsaved changes",
"Modulo": "Module",
"Molto buono": "Very good",
+ "Molto Buono": "Very Good",
"Mondadori": "Mondadori",
"Monitora tentativi di login e eventi di sicurezza": "Monitor login attempts and security events",
"Mostra": "Show",
+ "Mostra _MENU_ libri": "Show _MENU_ books",
"Mostra API Key": "Show API Key",
+ "Mostra badge nell'area amministrazione": "Show badges in the admin area",
+ "Mostra badge nella pagina dettaglio libro": "Show badges on the book detail page",
+ "Mostra categoria \\": "Show category \\",
"Mostra Cookie Analitici": "Show Analytics Cookies",
"Mostra Cookie di Marketing": "Show Marketing Cookies",
- "Mostra _MENU_ libri": "Show _MENU_ books",
- "Mostra categoria \\": "Show category \\",
"Mostra filtri": "Show filters",
"Mostra gli ultimi libri aggiunti al catalogo": "Show the latest books added to the catalog",
+ "Mostra i badge nella pagina dettaglio libro del catalogo": "Show badges on the catalog book detail page",
+ "Mostra i badge nella scheda libro dell'area amministrazione": "Show badges on the admin book page",
+ "Mostra questa guida": "Show this guide",
+ "Mostra scorciatoie": "Show shortcuts",
+ "Mostra/nascondi token": "Show/hide token",
"Motivo del rifiuto (opzionale)": "Reason for rejection (optional)",
"Motivo del rifiuto (opzionale):": "Reason for rejection (optional):",
+ "MP3, M4A o OGG, max 500 MB": "MP3, M4A or OGG, max 500 MB",
+ "N. Inventario": "Inventory No.",
"N. Libri": "No. of Books",
"N/D": "N/A",
"Narrativa": "Fiction",
+ "Nascita a": "Birth date to",
+ "Nascita da": "Birth date from",
"Nascondi": "Hide",
"Nascondi API Key": "Hide API Key",
"Nascondi filtri": "Hide filters",
"Nascondi se il sito non utilizza cookie di marketing o advertising": "Hide if site does not use marketing or advertising cookies",
"Nascondi se il sito non utilizza strumenti di analytics (es. Google Analytics)": "Hide if site does not use analytics tools (e.g. Google Analytics)",
- "Nascita a": "Birth date to",
- "Nascita da": "Birth date from",
"Nascosto": "Hidden",
"Nato il %s": "Born on %s",
+ "Navigazione": "Navigation",
"Nazionalità": "Nationality",
"Nederlands (NL)": "Dutch (NL)",
"Nei Preferiti": "In Favorites",
+ "nell'header. Non includere i tag": "in the header. Do not include tags",
"Nella collezione": "In collection",
+ "nella directory dell'applicazione.": "in the application directory.",
+ "nella nostra biblioteca.": "in our library.",
+ "nella root del progetto impedisce qualsiasi accesso non autorizzato.": "in the project root prevents any unauthorized access.",
+ "Nella stessa collana": "In the same series",
"Nessun aggiornamento": "No updates",
- "Nessun Problema": "No Issues",
+ "Nessun aggiornamento registrato": "No updates recorded",
+ "Nessun autore selezionato": "No authors selected",
"Nessun autore trovato": "No authors found",
"Nessun autore trovato, premi Invio per aggiungerne uno nuovo": "No author found, press Enter to add a new one",
+ "Nessun backup disponibile": "No backups available",
"Nessun dato": "No data",
"Nessun dato trovato su LibreriaUniversitaria/Feltrinelli.": "No data found on LibreriaUniversitaria/Feltrinelli.",
+ "Nessun dato.": "No data.",
+ "Nessun editore selezionato": "No publishers selected",
"Nessun editore trovato": "No publishers found",
+ "Nessun editore trovato per": "No publisher found for",
"Nessun editore trovato per \"${query}\" — premi Invio per crearne uno nuovo.": "No publisher found for \"${query}\" — press Enter to create a new one.",
"Nessun elemento trovato": "No items found",
+ "Nessun errore": "No errors",
"Nessun evento": "No events",
"Nessun evento in programma": "No events scheduled",
"Nessun file caricato": "No file uploaded",
"Nessun file caricato.": "No file uploaded.",
"Nessun file di traduzione caricato. Carica un file JSON per abilitare questa lingua.": "No translation file uploaded. Upload a JSON file to enable this language.",
"Nessun genere trovato": "No genres found",
+ "Nessun import in corso": "No import in progress",
+ "Nessun import registrato": "No imports recorded",
"Nessun libro": "No books",
"Nessun libro ancora inserito": "No books added yet",
"Nessun libro con collocazione trovato": "No books with location found",
+ "Nessun libro da arricchire": "No books to enrich",
"Nessun libro nel database": "No books in database",
+ "Nessun libro recente": "No recent books",
"Nessun libro recente disponibile": "No recent books available",
"Nessun libro registrato": "No books registered",
+ "Nessun libro selezionato": "No books selected",
"Nessun libro trovato": "No books found",
"Nessun log disponibile": "No logs available",
"Nessun logo caricato": "No logo uploaded",
@@ -1859,35 +2655,46 @@
"Nessun plugin installato": "No plugins installed",
"Nessun prestito attivo": "No active loans",
"Nessun prestito disponibile per generare il grafico": "No loans available to generate chart",
+ "Nessun prestito in attesa di ritiro": "No loans waiting for pickup",
"Nessun prestito in corso": "No active loans",
"Nessun prestito passato": "No past loans",
"Nessun prestito registrato": "No loans registered",
"Nessun prestito scaduto": "No overdue loans",
"Nessun prestito trovato": "No loans found",
"Nessun prestito trovato.": "No loans found.",
- "Nessun ritiro": "No pickups",
+ "Nessun Problema": "No Issues",
+ "Nessun pulsante selezionato": "No buttons selected",
"Nessun risultato": "No results",
"Nessun risultato trovato": "No results found",
"Nessun risultato trovato con i filtri applicati": "No results found with applied filters",
+ "Nessun risultato trovato per": "No results found for",
"Nessun risultato trovato per la ricerca.": "No results found for search.",
+ "Nessun ritiro": "No pickups",
+ "Nessun server configurato. Aggiungine uno per iniziare.": "No servers configured. Add one to get started.",
"Nessun sottogenere": "No subgenre",
"Nessun sottogenere definito": "No subgenres defined",
"Nessun suggerimento": "No suggestion",
"Nessun suggerimento disponibile": "No suggestion available",
"Nessun titolo corrisponde al filtro corrente.": "No titles match the current filter.",
"Nessuna": "None",
- "Nessun aggiornamento registrato": "No updates recorded",
+ "Nessuna alternativa disponibile": "No alternatives available",
"Nessuna API key configurata": "No API keys configured",
+ "Nessuna collana trovata. Aggiungi una collana a un libro per iniziare.": "No series found. Add a series to a book to get started.",
"Nessuna collocazione trovata": "No locations found",
- "Nessuna copia attualmente disponibile": "No copy currently available",
"Nessuna copertina caricata": "No cover uploaded",
- "Nessuna copia disponibile per questo libro": "No copy available for this book",
+ "Nessuna copertina da scaricare": "No covers to fetch",
+ "Nessuna copia attualmente disponibile": "No copy currently available",
+ "Nessuna copia disponibile nelle date richieste": "No copies available for the requested dates",
+ "Nessuna copia disponibile per il periodo richiesto": "No copy available for the requested period",
"Nessuna copia disponibile per il periodo richiesto.": "No copy available for the requested period.",
+ "Nessuna copia disponibile per questo libro": "No copy available for this book",
+ "Nessuna copia registrata": "No copies registered",
"Nessuna descrizione disponibile": "No description available",
"Nessuna descrizione disponibile per questo libro.": "No description available for this book.",
+ "Nessuna fonte di scraping disponibile. Installa almeno un plugin di scraping (es. Open Library o Scraping Pro).": "No scraping source available. Install at least one scraping plugin (e.g. Open Library or Scraping Pro).",
"Nessuna lingua configurata": "No languages configured",
- "Nessuna mensola. Creane una per iniziare!": "No shelves. Create one to get started!",
"Nessuna mensola per questo scaffale. Creane una!": "No shelves for this bookcase. Create one!",
+ "Nessuna mensola. Creane una per iniziare!": "No shelves. Create one to get started!",
"Nessuna notifica": "No notifications",
"Nessuna prenotazione": "No reservations",
"Nessuna prenotazione attiva": "No active reservations",
@@ -1895,221 +2702,289 @@
"Nessuna recensione approvata": "No approved reviews",
"Nessuna recensione in attesa": "No pending reviews",
"Nessuna recensione rifiutata": "No rejected reviews",
+ "Nessuna ricerca recente": "No recent searches",
"Nessuna richiesta": "No requests",
+ "Nessuna richiesta da approvare": "No requests to approve",
"Nessuna richiesta in attesa": "No pending requests",
"Nessuna richiesta in attesa di approvazione.": "No requests pending approval.",
"Nessuna selezione": "No selection",
+ "Nessuna sessione attiva. Le sessioni vengono create quando accedi con 'Ricordami' selezionato.": "No active sessions. Sessions are created when you log in with 'Remember Me' selected.",
+ "Nessuna valutazione": "No rating",
"Nessuno": "None",
"Nessuno scaffale. Creane uno per iniziare!": "No bookcases. Create one to get started!",
"Nessuno storico": "No history",
"No": "No",
+ "Nodo mancante di codice a profondità %d.": "Node missing code at depth %d.",
"Nome": "First Name",
"Nome *": "Name *",
"Nome Applicazione": "Application Name",
- "Nome Categoria": "Category Name",
- "Nome Cognome": "First Last Name",
- "Nome Database": "Database Name",
- "Nome Editore": "Publisher Name",
- "Nome Inglese": "English Name",
- "Nome Nativo": "Native Name",
- "Nome Referente": "Contact Person Name",
"Nome applicazione": "Application name",
"Nome autore": "Author name",
- "Nome editore...": "Publisher name...",
- "Nome, pseudonimo, biografia...": "Name, pseudonym, biography...",
+ "Nome backup non specificato": "Backup name not specified",
+ "Nome backup non valido": "Invalid backup name",
+ "Nome Categoria": "Category Name",
"Nome categoria esistente": "Existing category name",
+ "Nome Cognome": "First Last Name",
+ "Nome collana di destinazione": "Target series name",
+ "Nome collana non valido": "Invalid series name",
"Nome completo": "Full Name",
"Nome cookie analitici": "Analytics cookies name",
"Nome cookie essenziali": "Essential cookies name",
"Nome cookie marketing": "Marketing cookies name",
"Nome d'arte o pseudonimo": "Stage name or pseudonym",
+ "Nome Database": "Database Name",
+ "Nome del curatore dell'opera (se applicabile)": "Curator name (if applicable)",
+ "Nome del prestatore": "Borrower name",
+ "Nome del traduttore (se applicabile)": "Translator name (if applicable)",
"Nome dell'editore": "Publisher name",
+ "Nome dell'illustratore (se applicabile)": "Illustrator name (if applicable)",
"Nome della casa editrice": "Publisher name",
+ "Nome della classificazione": "Classification name",
+ "Nome della collana": "Series name",
"Nome della lingua in inglese (es. Italian, English, Spanish)": "Name of the language in English (e.g. Italian, English, Spanish)",
"Nome della lingua nella lingua stessa (es. Italiano, English, Español)": "Name of the language in the language itself (e.g. Italiano, English, Español)",
"Nome e cognome del referente": "Contact person name",
"Nome e cognome dell'autore": "Author's full name",
+ "Nome e cognome sono obbligatori.": "First name and last name are required.",
+ "Nome Editore": "Publisher Name",
"Nome editore": "Publisher name",
+ "Nome editore...": "Publisher name...",
+ "Nome File": "File Name",
+ "Nome file non valido.": "Invalid filename.",
+ "Nome Indice": "Index Name",
+ "Nome Inglese": "English Name",
+ "Nome Nativo": "Native Name",
"Nome o cognome troppo lungo (massimo 100 caratteri)": "Name or surname too long (maximum 100 characters)",
"Nome plugin non valido. Usa solo lettere, numeri, trattini o underscore.": "Invalid plugin name. Use only letters, numbers, hyphens or underscores.",
+ "Nome Referente": "Contact Person Name",
+ "Nome Server": "Server Name",
"Nome, cognome, email...": "Name, surname, email...",
+ "Nome, pseudonimo, biografia...": "Name, pseudonym, biography...",
"Nome:": "Name:",
- "Non Disponibile": "Not Available",
- "Non Disponibili": "Unavailable",
"Non ancora restituito": "Not yet returned",
"Non assegnata": "Not assigned",
"Non autenticato": "Not authenticated",
+ "Non autorizzato": "Unauthorized",
"Non autorizzato.": "Unauthorized.",
+ "Non chiudere questa finestra": "Do not close this window",
+ "Non ci sono azioni urgenti da completare.": "No urgent actions to complete.",
"Non ci sono dati da esportare": "There is no data to export",
+ "Non ci sono nuovi arrivi al momento.": "No new arrivals at the moment.",
"Non ci sono recensioni in attesa di approvazione.": "There are no reviews waiting for approval.",
"Non ci sono richieste di prestito in attesa di approvazione.": "There are no loan requests pending approval.",
+ "Non Disponibile": "Not Available",
"Non disponibile": "Not available",
+ "Non disponibile nella data selezionata": "Not available on selected date",
"Non disponibile ora": "Not available now",
+ "Non Disponibili": "Unavailable",
"Non eliminabile": "Cannot Delete",
"Non hai ancora creato nessun evento. Inizia creando il tuo primo evento.": "You haven't created any events yet. Start by creating your first event.",
"Non hai ancora lasciato recensioni": "You have not left any reviews yet",
"Non hai libri in prestito al momento": "You have no books on loan at the moment",
"Non hai prenotazioni attive al momento": "You have no active reservations at the moment",
+ "Non hai prestiti in corso al momento.": "You have no active loans at the moment.",
"Non hai prestiti passati": "You have no past loans",
"Non hai un account?": "Don't have an account?",
+ "Non in prestito": "Not on loan",
+ "Non includere tag": "Do not include tags",
"Non includere tag ": "Do not include tags",
+ "Non installato": "Not installed",
"Non letto": "Unread",
"Non puoi eliminare l'installer finché non completi l'installazione delle dipendenze PHP.": "You cannot delete the installer until you complete the PHP dependencies installation.",
"Non puoi recensire questo libro (devi averlo preso in prestito e non averlo già recensito)": "You cannot review this book (you must have borrowed it and not already reviewed it)",
+ "non può contenere spazi": "cannot contain spaces",
+ "non può essere vuota": "cannot be empty",
"Non rinnovabile: prestito in ritardo": "Not renewable: loan overdue",
- "Non installato": "Not installed",
"Non scrivibile": "Not writable",
"Non selezionato": "Not selected",
"Non specificata": "Not specified",
"Non specificato": "Not specified",
+ "Non trovati": "Not found",
+ "Non trovato": "Not found",
"Non usare spazi nelle route": "Do not use spaces in routes",
+ "Non è possibile creare la directory: %s": "Cannot create directory: %s",
"Non è stato possibile eliminare l'utente. Controlla la console.": "Unable to delete the user. Check the console.",
"Non è stato trovato alcun aggiornamento": "No updates found",
"Nota:": "Note:",
+ "Nota: Data acquisizione è nel campo nativo 'Data Acquisizione' sopra": "Note: Acquisition date is in the native 'Acquisition Date' field above",
+ "Nota: Il prezzo di acquisto è nel campo 'Prezzo' della sezione 'Dati di Acquisizione'": "Note: Purchase price is in the 'Price' field of the 'Acquisition Data' section",
"Nota: Impostare come predefinita disattiverà lo status di predefinita per tutte le altre lingue.": "Note: Setting as default will disable the default status for all other languages.",
"Nota: in produzione limita questa funzione agli amministratori.": "Note: in production limit this function to administrators.",
+ "Nota: Peso e dimensioni sono nei campi nativi dell'app (sezione Dati Fisici)": "Note: Weight and dimensions are in the app's native fields (Physical Data section)",
"Note": "Notes",
"Note (opzionali)": "Notes (optional)",
- "Note Importanti": "Important Notes",
- "Note Varie": "Miscellaneous Notes",
"Note aggiuntive o osservazioni particolari...": "Additional notes or special observations...",
+ "Note Importanti": "Important Notes",
"Note importanti:": "Important notes:",
"Note interne": "Internal Notes",
+ "Note private...": "Private notes...",
"Note sul prestito": "Loan notes",
"Note sulla restituzione": "Return notes",
"Note tecniche": "Technical notes",
+ "Note Varie": "Miscellaneous Notes",
+ "Notifica agli amministratori quando viene inoltrata una nuova richiesta di prestito.": "Notifies administrators when a new loan request is submitted.",
+ "Notifica agli utenti quando il prestito è scaduto e deve essere restituito.": "Notifies users when the loan has expired and must be returned.",
+ "Notifica copia non disponibile creata": "Copy unavailable notification created",
+ "Notifica prenotazione disponibile inviata": "Reservation available notification sent",
+ "Notifica prestito fallita": "Loan notification failed",
+ "Notifica richiesta prestito fallita": "Loan request notification failed",
"Notifiche": "Notifications",
"Notifiche Automatiche": "Automatic Notifications",
- "Notifiche Prestiti": "Loan Notifications",
"Notifiche disponibilità libri in wishlist": "Wishlist book availability notifications",
+ "Notifiche Prestiti": "Loan Notifications",
"Notifiche prestiti scaduti": "Overdue loan notifications",
- "N. Inventario": "Inventory No.",
- "Numero Inventario": "Inventory Number",
- "Numero Libri": "Number of Books",
- "Numero Pagine": "Number of Pages",
- "Numero Serie": "Series Number",
- "Numero di Pagine": "Number of Pages",
+ "novembre": "November",
+ "Novità nelle versioni successive": "What's new in upcoming versions",
+ "Numero colonne non valido": "Invalid column count",
"Numero di copie non valido.": "Invalid number of copies.",
"Numero di libri": "Number of books",
+ "Numero di Pagine": "Number of Pages",
+ "Numero Inventario": "Inventory Number",
"Numero inventario": "Inventory number",
+ "Numero Libri": "Number of Books",
+ "Numero massimo di righe superato (%d)": "Maximum number of rows exceeded (%d)",
"Numero massimo di righe superato (%d). Dividi il file in parti più piccole.": "Maximum number of rows exceeded (%d). Split the file into smaller parts.",
"Numero o descrizione dell'edizione": "Edition number or description",
+ "Numero Pagine": "Number of Pages",
"Numero prenotazioni attive": "Number of active reservations",
+ "Numero Serie": "Series Number",
"Numero serie": "Series number",
"Numero tessera": "Card number",
+ "Numero volume": "Volume number",
+ "Nuova Collana": "New Series",
"Nuova Collocazione": "New Location",
"Nuova Password": "New Password",
"Nuova password": "New password",
"Nuova prenotazione": "New Reservation",
+ "Nuova recensione (Admin)": "New review (Admin)",
"Nuova recensione da approvare": "New review to approve",
"Nuova registrazione utente": "New User Registration",
+ "Nuova ricerca": "New search",
"Nuova richiesta di prestito": "New loan request",
"Nuovo": "New",
- "Novità nelle versioni successive": "What's new in upcoming versions",
- "Non chiudere questa finestra": "Do not close this window",
"Nuovo aggiornamento disponibile!": "New update available!",
"Nuovo Autore": "New Author",
"Nuovo Editore": "New Publisher",
+ "Nuovo editore:": "New publisher:",
"Nuovo Evento": "New Event",
"Nuovo Genere": "New Genre",
"Nuovo Libro": "New Book",
+ "Nuovo libro": "New book",
"Nuovo messaggio di contatto": "New Contact Message",
+ "Nuovo nome (opzionale)": "New name (optional)",
"Nuovo Prestito": "New Loan",
"Nuovo Utente": "New User",
- "Nuovo editore:": "New publisher:",
"Nuovo utente": "New User",
- "Nuovo nome (opzionale)": "New name (optional)",
- "OFF": "Off",
- "OK": "OK",
- "ON": "On",
+ "o multipli separati da |": "or multiple separated by |",
+ "o multipli: Engels;Marx": "or multiple: Engels;Marx",
"Obbligatorio": "Required",
"Obbligatorio per utenti non amministratori.": "Required for non-administrator users.",
"Obsoleto": "Obsolete",
"Occupato": "Busy",
- "Occupato (prestito attivo)": "Occupied (active loan)",
"Occupato (in ritardo)": "Occupied (overdue)",
- "Prenota questo libro": "Reserve this book",
- "Seleziona le date per la tua prenotazione. La richiesta verrà inviata alla biblioteca per approvazione.": "Select dates for your reservation. The request will be sent to the library for approval.",
- "Accedi per Prenotare": "Login to Reserve",
- "Libro disponibile per la prenotazione": "Book available for reservation",
- "Richiesta inviata!": "Request sent!",
- "La tua richiesta di prestito è stata inviata. Riceverai una notifica quando verrà approvata.": "Your loan request has been sent. You will receive a notification when it is approved.",
- "Richiesta inviata con successo!": "Request sent successfully!",
- "Errore durante la prenotazione": "Error during reservation",
+ "Occupato (prestito attivo)": "Occupied (active loan)",
+ "OCLC": "OCLC",
+ "OCLC number": "OCLC number",
+ "OFF": "Off",
"Offline": "Offline",
"Oggetto": "Subject",
"Oggetto dell'email": "Email subject",
+ "Oggi": "Today",
"Ogni 15 minuti nei giorni lavorativi (8:00-18:00)": "Every 15 minutes on weekdays (8:00-18:00)",
+ "Ogni errore include: numero riga, titolo libro, tipo errore e messaggio dettagliato": "Each error includes: line number, book title, error type and detailed message",
"Ogni route deve iniziare con": "Each route must start with",
+ "OK": "OK",
+ "ON": "On",
"Online": "Online",
"Open Graph (Facebook)": "Open Graph (Facebook)",
"Open Graph (Facebook, LinkedIn)": "Open Graph (Facebook, LinkedIn)",
+ "Opera \"%s\" creata con %d volumi": "Work \"%s\" created with %d volumes",
+ "Operation completed": "Operation completed",
+ "Operation failed": "Operation failed",
"Operatore": "Operator",
"Operazione annullata": "Operation cancelled",
"Operazione completata": "Operation completed",
+ "Operazione fallita": "Operation failed",
"Operazione non consentita": "Operation not allowed",
+ "Operazione non riuscita": "Operation failed",
"Operazioni": "Operations",
"Opere": "Works",
+ "Oppure accedere a /installer/?force=1 per forzare una nuova procedura": "Or go to /installer/?force=1 to force a new installation",
+ "Oppure copia e incolla questo link nel tuo browser:": "Or copy and paste this link in your browser:",
+ "Oppure naviga per categorie": "Or browse by categories",
+ "Oppure naviga per categorie:": "Or browse by categories:",
"Oppure usa il terminale SSH del tuo hosting (cPanel, Plesk, etc.)": "Or use your hosting's SSH terminal (cPanel, Plesk, etc.)",
"Ops, qualcosa è andato storto": "Oops, something went wrong",
"Opzionale": "Optional",
+ "opzionale": "optional",
"Opzionale per amministratori": "Optional for administrators",
+ "opzionali": "optional",
"Opzione 1:": "Option 1:",
"Opzione 2:": "Option 2:",
"Opzione 3:": "Option 3:",
"Ora Evento": "Event Time",
"Ora puoi accedere con la tua nuova password.": "You can now sign in with your new password.",
"Ora puoi ricaricare questa pagina - il warning sparirà se tutto è OK.": "Now you can reload this page - the warning will disappear if everything is OK.",
- "Ordina Sezioni Homepage": "Sort Homepage Sections",
"Ordina per": "Sort by",
+ "Ordina Sezioni Homepage": "Sort Homepage Sections",
"Ordinamento": "Sorting",
"Ordinamento libri": "Book sorting",
"Ordine salvato con successo!": "Order saved successfully!",
"Ordine:": "Order:",
+ "ordine:": "order:",
+ "ore fa": "hours ago",
"Organizza e gestisci i generi letterari della biblioteca": "Organize and manage library literary genres",
"Organizza scaffali, mensole e posizioni per la biblioteca fisica": "Organize shelves, levels, and positions for the physical library",
"Ospite": "Guest",
"Ottieni le chiavi da Google reCAPTCHA": "Get keys from Google reCAPTCHA",
"Ottimizza l'evento per i motori di ricerca e i social media": "Optimize event for search engines and social media",
+ "Ottimizzato": "Optimized",
"Ottimizzazione": "Optimization",
+ "Ottimizzazione Indici Database": "Database Index Optimization",
"Ottimizzazione SEO (Meta Tags)": "SEO Optimization (Meta Tags)",
"Ottimizzazione SEO e Social Media": "SEO and Social Media Optimization",
+ "Ottimo": "Excellent",
+ "ottobre": "October",
"Output atteso: cartella vendor/ con sottocartelle (slim, monolog, etc.)": "Expected output: vendor/ folder with subfolders (slim, monolog, etc.)",
- "PDF": "PDF",
- "PDF o ePub, max 100 MB": "PDF or ePub, max 100 MB",
- "PHP mail()": "PHP mail()",
- "PHP mail() - Predefinito": "PHP mail() - Default",
- "PHPMailer": "PHPMailer",
- "PNG, SVG, JPG o WebP (max 2MB)": "PNG, SVG, JPG or WebP (max 2MB)",
+ "Pacchetto caricato non trovato": "Uploaded package not found",
+ "Pacchetto di aggiornamento non valido: manca %s": "Invalid update package: missing %s",
"Paese": "Country",
"Pagina": "Page",
- "Pagina Cookie Policy": "Cookie Policy Page",
- "Pagina Non Trovata": "Page Not Found",
+ "pagina": "page",
"Pagina \\": "Page \\",
"Pagina aggiornata con successo.": "Page updated successfully.",
"Pagina attiva (visibile sul sito)": "Active page (visible on site)",
+ "Pagina Cookie": "Cookie Page",
+ "Pagina Cookie Policy": "Cookie Policy Page",
+ "Pagina Non Trovata": "Page Not Found",
"Pagina non trovata.": "Page not found.",
"Pagina precedente": "Previous page",
"Pagina successiva": "Next page",
"Paginazione eventi": "Events pagination",
"Pagine": "Pages",
+ "pagine": "pages",
+ "Pagine Principali": "Main Pages",
"Pannello": "Panel",
+ "Panoramica completa di prestiti, ritiri e prenotazioni": "Complete overview of loans, pickups and reservations",
"Panoramica generale": "General overview",
"Panoramica generale di Pinakes": "General overview of Pinakes",
- "Panoramica completa di prestiti, ritiri e prenotazioni": "Complete overview of loans, pickups and reservations",
"Paragrafo": "Paragraph",
"Paragraph": "Paragraph",
"Parametri di Ricerca": "Search Parameters",
"Parametri non validi": "Invalid parameters.",
- "Parametro ISBN mancante.": "Missing ISBN parameter.",
+ "Parametri non validi per l'unione": "Invalid parameters for merge",
"Parametro category_id obbligatorio.": "Parameter category_id is required.",
+ "Parametro code obbligatorio.": "Code parameter required.",
"Parametro cover_url mancante.": "Missing cover_url parameter.",
"Parametro division_id obbligatorio.": "Parameter division_id is required.",
+ "Parametro ISBN mancante.": "Missing ISBN parameter.",
+ "Parola chiave": "Keyword",
"Parole Chiave": "Keywords",
- "Parole Chiave SEO": "SEO Keywords",
"Parole chiave": "Keywords",
- "Parole chiave SEO": "SEO Keywords",
"Parole chiave per i motori di ricerca (impatto SEO limitato). Separate da virgola.": "Keywords for search engines (limited SEO impact). Comma separated.",
+ "Parole Chiave SEO": "SEO Keywords",
+ "Parole chiave SEO": "SEO Keywords",
+ "Passo": "Step",
"Password": "Password",
"Password aggiornata con successo.": "Password updated successfully.",
"Password dimenticata": "Forgot password",
@@ -2118,38 +2993,56 @@
"Password resettata con successo!": "Password reset successfully!",
"Password troppo lunga (massimo 128 caratteri)": "Password too long (maximum 128 characters)",
"Pattern URL": "URL Pattern",
+ "Payload JSON non valido": "Invalid JSON payload",
+ "PDF": "PDF",
+ "PDF generato!": "PDF generated!",
+ "PDF o ePub, max 100 MB": "PDF or ePub, max 100 MB",
+ "PDF prestito non generato": "Loan PDF not generated",
"Pendente": "Pending",
"Pending": "Pending",
"Per aggiornare automaticamente la sitemap ogni giorno:": "To automatically update sitemap daily:",
"Per assistenza, contatta l'amministrazione della biblioteca.": "For assistance, contact the library administration.",
+ "per conformità GDPR.": "for GDPR compliance.",
+ "per evitare blocchi (delay di 3 secondi tra ogni richiesta).": "to avoid blocks (3 second delay between each request).",
+ "per il giorno": "for the day",
"Per inserire il codice JavaScript Analytics (Google Analytics, Matomo, ecc.), vai su
sospeso e richiede approvazione. Scegli un'opzione:": "This user is in suspended state and requires approval. Choose an option:",
"Radice": "Root",
"Rallenta l'importazione": "Slows down import",
+ "Recati in biblioteca durante gli orari di apertura per ritirare il libro.": "Visit the library during opening hours to pick up the book.",
+ "recensione": "review",
+ "Recensione": "Review",
"Recensione (opzionale)": "Review (optional)",
"Recensione approvata": "Review approved",
"Recensione del": "Review on",
+ "Recensione e Valutazione": "Review and Rating",
+ "Recensione eliminata": "Review deleted",
"Recensione inviata con successo!": "Review submitted successfully!",
"Recensione inviata con successo! Sarà pubblicata dopo l'approvazione di un amministratore.": "Review successfully submitted! It will be published after administrator approval.",
"Recensione inviata!": "Review submitted!",
"Recensione per \"%s\" da %s - %s": "Review for \"%s\" by %s - %s",
"Recensione rifiutata": "Review rejected",
- "Recensione eliminata": "Review deleted",
- "La recensione è stata eliminata definitivamente.": "The review has been permanently deleted.",
- "Elimina recensione": "Delete review",
- "Vuoi eliminare definitivamente questa recensione? Questa azione non può essere annullata.": "Do you want to permanently delete this review? This action cannot be undone.",
- "Impossibile eliminare la recensione": "Unable to delete the review",
- "Operazione non riuscita": "Operation failed",
"Recensioni": "Reviews",
+ "recensioni": "reviews",
"Recensioni Approvate": "Approved Reviews",
"Recensioni Rifiutate": "Rejected Reviews",
"Recensioni utenti": "User reviews",
"Recente": "Recent",
+ "Recupera la tua password": "Recover your password",
"Recupera Password": "Recover Password",
"Referente": "Contact Person",
- "Registra Restituzione": "Register Return",
+ "referente@editore.com": "contact@publisher.com",
"Registra prestito": "Register loan",
+ "Registra Restituzione": "Register Return",
"Registra restituzione": "Register return",
"Registra restituzione prestito": "Register loan return",
"Registra una prenotazione per permettere ad un utente di riservare un libro specifico": "Register a reservation to allow a user to reserve a specific book",
@@ -2351,93 +3347,111 @@
"Registrazione Completata": "Registration Completed",
"Registrazione completata": "Registration completed",
"Registrazione completata! Effettua l'accesso": "Registration completed! Please sign in",
+ "Registrazione nuovo utente": "New user registration",
+ "Registrazione ricevuta": "Registration received",
+ "Registro delle migrazioni database applicate": "Registry of applied database migrations",
"Reimposta password": "Reset password",
+ "Reindirizza automaticamente tutte le richieste HTTP a HTTPS": "Automatically redirect all HTTP requests to HTTPS",
"Reindirizzamento verso dominio non autorizzato bloccato.": "Redirect to an unauthorized domain blocked.",
"Reinstalla da Capo": "Reinstall from Scratch",
+ "Relazione ciclica: questo libro è già opera padre del libro selezionato": "Cyclic relationship: this book is already a parent work of the selected book",
"Remoto": "Remote",
+ "Rende disponibile /llms.txt e lo aggiunge a robots.txt": "Makes /llms.txt available and adds it to robots.txt",
"Report": "Report",
- "Report Integrità Dati": "Data Integrity Report",
"Report e analisi": "Reports and analytics",
+ "Report Integrità Dati": "Data Integrity Report",
"Requisiti": "Requirements",
"Requisiti del plugin:": "Plugin requirements:",
"Requisiti di Sistema": "System Requirements",
"Requisiti di sistema non soddisfatti": "System requirements not met",
- "Richiesto": "Required",
+ "Requisiti:": "Requirements:",
+ "Requisito '%s' non soddisfatto": "Requirement '%s' not met",
"Reset": "Reset",
- "Reset Filtri": "Reset Filters",
"Reset anni": "Reset years",
+ "Reset Filtri": "Reset Filters",
"Resetta Password": "Reset Password",
- "Recupera la tua password": "Recover your password",
- "Abbiamo ricevuto una richiesta di reset della password per il tuo account.": "We received a request to reset the password for your account.",
- "Clicca sul pulsante qui sotto per resettare la tua password:": "Click the button below to reset your password:",
- "Oppure copia e incolla questo link nel tuo browser:": "Or copy and paste this link in your browser:",
- "Questo link scadrà tra 2 ore.": "This link will expire in 2 hours.",
- "Se non hai richiesto il reset della password, puoi ignorare questa email. Il tuo account rimane sicuro.": "If you did not request a password reset, you can ignore this email. Your account remains secure.",
- "Ciao": "Hello",
"Restituito": "Returned",
+ "restituito": "returned",
"Restituito in ritardo": "Returned late",
"Restituito regolarmente": "Returned on time",
"Restituzione": "Return",
"Restituzione prestito": "Loan return",
"Restituzione prestito #%s": "Loan Return #%s",
+ "Retention: 90 giorni": "Retention: 90 days",
+ "Revocate %d sessioni": "Revoked %d sessions",
+ "Riassegnazione copia fallita": "Copy reassignment failed",
+ "Riassegnazione prenotazione nuova copia fallita": "New copy reservation reassignment failed",
+ "Ricalcola Disponibilità": "Recalculate Availability",
"Ricarica Dewey (seed)": "Reload Dewey (seed)",
"Ricarica Pagina": "Reload Page",
"Ricerca": "Search",
- "Ricerca Libro": "Search Book",
- "Ricerca Utente": "Search User",
"Ricerca in corso...": "Searching...",
+ "Ricerca Libro": "Search Book",
"Ricerca rapida": "Quick Search",
+ "Ricerca Utente": "Search User",
+ "Ricerche recenti": "Recent searches",
"Riceverai un link di reset via email. Il link sarà valido per 24 ore.": "You will receive a reset link via email. The link will be valid for 24 hours.",
"Riceverai una conferma via email appena la richiesta sarà approvata.": "You'll receive an email confirmation once the request is approved.",
+ "Ricevuta di Prestito": "Loan Receipt",
+ "Ricevuta di prestito bibliotecario": "Library loan receipt",
"Ricevuto": "Received",
"Richiede App:": "Requires App:",
"Richiede PHP:": "Requires PHP:",
- "Richiedi Prestito": "Request Loan",
"Richiedi approvazione admin dopo la conferma email": "Require admin approval after email confirmation",
- "Richiesta Inviata!": "Request Sent!",
- "Richiesta Prestito": "Loan Request",
+ "Richiedi Prestito": "Request Loan",
+ "Richiedono attenzione immediata": "Require immediate attention",
"Richiesta del %s": "Request of %s",
- "Ricevuta di Prestito": "Loan Receipt",
- "Ricevuta di prestito bibliotecario": "Library loan receipt",
"Richiesta di prestito dal %1$s al %2$s": "Loan request from %1$s to %2$s",
"Richiesta di prestito dal %s per 1 mese": "Loan request starting on %s for 1 month",
"Richiesta di prestito inviata con successo": "Loan request successfully submitted",
"Richiesta di prestito per \"%s\" da %s dal %s al %s": "Loan request for \"%s\" by %s from %s to %s",
"Richiesta di prestito per \\": "Loan request for \\",
"Richiesta fallita:": "Request failed:",
+ "richiesta in sospeso": "pending request",
+ "Richiesta inviata con successo!": "Request sent successfully!",
+ "Richiesta inviata!": "Request sent!",
+ "Richiesta Inviata!": "Request Sent!",
"Richiesta manuale": "Manual request",
- "Richieste Manuali": "Manual Requests",
+ "Richiesta Pendente": "Pending Request",
+ "Richiesta Prestito": "Loan Request",
+ "Richiesta prestito": "Loan request",
"Richiesta rifiutata": "Request rejected",
- "Richieste Pendenti": "Pending Requests",
"Richieste di Prestito": "Loan Requests",
"Richieste di Prestito in Attesa": "Pending Loan Requests",
+ "Richieste in Attesa": "Pending Requests",
"Richieste in Sospeso": "Pending Requests",
"Richieste in sospeso": "Pending requests",
+ "richieste in sospeso": "pending requests",
+ "Richieste Manuali": "Manual Requests",
+ "Richieste Pendenti": "Pending Requests",
"Richieste pendenti": "Pending Requests",
+ "Richiesto": "Required",
"Richiesto il": "Requested on",
"Richiesto il %s": "Requested on %s",
+ "Richiesto:": "Required:",
"Ricordami": "Remember me",
"Ricordi la password?": "Remember your password?",
"Riepilogo Installazione": "Installation Summary",
"Riepilogo wishlist": "Wishlist Summary",
"Rifiuta": "Reject",
- "Rifiuta Prestito?": "Reject Loan?",
"Rifiuta non essenziali": "Reject Non-Essential",
"Rifiuta prestito": "Reject loan",
+ "Rifiuta Prestito?": "Reject Loan?",
"Rifiuta recensione": "Reject review",
"Rifiutata": "Rejected",
"Rifiutata il": "Rejected on",
"Rifiutato": "Rejected",
"Rifiuterai questa richiesta di prestito?": "Will you reject this loan request?",
- "Ritiri da Confermare": "Pickups to Confirm",
"Riga %d (%s): %s": "Row %d (%s): %s",
"Riga %d: numero di colonne non corrispondente": "Row %d: column count does not match",
- "Rigenera Sitemap": "Regenerate Sitemap",
"Rigenera adesso": "Regenerate now",
+ "Rigenera Sitemap": "Regenerate Sitemap",
+ "Rimuove la collana da tutti i libri. I libri non verranno eliminati.": "Removes the series from all books. Books will not be deleted.",
"Rimuovere dalla wishlist?": "Remove from Wishlist?",
"Rimuovere i libri associati prima di eliminare l'autore": "Remove associated books before deleting the author",
"Rimuovere i libri dell'editore prima di eliminarlo": "Remove publisher's books before deleting",
"Rimuovi": "Remove",
+ "Rimuovi classificazione Dewey": "Remove Dewey classification",
"Rimuovi dai Preferiti": "Remove from Favorites",
"Rimuovi dalla wishlist": "Remove from Wishlist",
"Rimuovi editore": "Remove publisher",
@@ -2446,17 +3460,27 @@
"Rimuovi immagine attuale": "Remove current image",
"Rimuovi immagine di sfondo attuale": "Remove current background image",
"Rimuovi logo attuale": "Remove current logo",
+ "Rimuovi Token": "Remove Token",
"Rimuovi tutti i filtri": "Remove all filters",
+ "Rimuovi volume?": "Remove volume?",
"Rinnova": "Renew",
"Rinnova prestito (+14 giorni)": "Renew loan (+14 days)",
"Rinnova prestito?": "Renew loan?",
"Rinnovare il prestito? La scadenza verrà estesa di 14 giorni.": "Renew loan? The due date will be extended by 14 days.",
"Rinnovi": "Renewals",
- "Rinnovi Effettuati:": "Renewals Made:",
"Rinnovi effettuati": "Renewals made",
+ "Rinnovi Effettuati:": "Renewals Made:",
+ "Rinnovo prestito fallito": "Loan renewal failed",
+ "Rinomina": "Rename",
+ "Rinomina collana": "Rename series",
"Riordina trascinando gli elementi": "Reorder by dragging elements",
+ "Ripara automaticamente gli errori rilevati": "Automatically repair detected errors",
"Ripeti la password": "Repeat password",
+ "Ripristina": "Reset",
"Ripristina Default": "Reset to Default",
+ "Ripristinare i colori?": "Reset colors to defaults?",
+ "Ripristinare questo backup?": "Restore this backup?",
+ "Ripristinato": "Restored",
"Ripristino": "Restore",
"Riprova": "Retry",
"Riservato": "Reserved",
@@ -2470,117 +3494,121 @@
"Risposta non valida dal servizio ISBN.": "Invalid response from the ISBN service.",
"Risposta non valida. Controlla la console per dettagli.": "Invalid response. Check the console for details.",
"Risultati": "Results",
+ "risultati": "results",
"Risultati per '%s' - Catalogo Biblioteca": "Results for '%s' - Library Catalog",
+ "Risultati Ultimo Batch": "Last Batch Results",
+ "risultato": "result",
+ "Ritiri da Confermare": "Pickups to Confirm",
+ "Ritiri scaduti elaborati": "Expired pickups processed",
+ "Ritiro annullato": "Pickup cancelled",
+ "Ritiro annullato con successo": "Pickup cancelled successfully",
+ "Ritiro confermato con successo": "Pickup confirmed successfully",
+ "Ritiro confermato!": "Pickup confirmed!",
+ "Ritiro confermato! Il prestito è ora in corso.": "Pickup confirmed! The loan is now active.",
+ "Ritiro già confermato o modificato": "Pickup already confirmed or modified",
+ "Ritiro non effettuato": "Pickup not completed",
+ "Ritiro non effettuato entro il termine previsto": "Pickup not completed within the deadline",
+ "Ritiro scaduto": "Pickup Expired",
+ "Ritiro scaduto il": "Pickup expired on",
"Rossi": "Doe",
+ "Route aggiornate con successo": "Routes updated successfully",
"Route Comuni": "Common Routes",
"Route Tradotte": "Translated Routes",
"Ruolo": "Role",
"Ruolo:": "Role:",
- "SDK": "SDK",
- "SEO - Meta Description": "SEO - Meta Description",
- "SEO Base": "Basic SEO",
- "SEO Base (Meta Tags)": "Base SEO (Meta Tags)",
- "SMTP (custom)": "SMTP (custom)",
- "SMTP Host": "SMTP Host",
- "SMTP Password": "SMTP Password",
- "SMTP Personalizzato": "Custom SMTP",
- "SMTP Port": "SMTP Port",
- "SMTP Username": "SMTP Username",
- "SMTP personalizzato": "Custom SMTP",
- "SSL": "SSL",
+ "Saltato": "Skipped",
"Salva": "Save",
"Salva API Key": "Save API key",
"Salva Autore": "Save Author",
+ "Salva Configurazione": "Save Configuration",
"Salva Contatti": "Save Contacts",
+ "Salva descrizione": "Save description",
"Salva Editore": "Save Publisher",
+ "Salva filtri correnti": "Save current filters",
"Salva Identità": "Save Identity",
+ "Salva identità": "Save identity",
"Salva Impostazioni": "Save Settings",
"Salva Impostazioni Avanzate": "Save Advanced Settings",
- "Salva Libro": "Save Book",
- "Salva Lingua": "Save Language",
- "Salva Modifiche": "Save Changes",
- "Salva Privacy Policy": "Save Privacy Policy",
- "Salva Route": "Save Routes",
- "Salva Template": "Save Template",
- "Salva Testi Cookie Banner": "Save Cookie Banner Texts",
- "Salva filtri correnti": "Save current filters",
- "Salva identità": "Save identity",
+ "Salva impostazioni condivisione": "Save sharing settings",
"Salva impostazioni email": "Save email settings",
"Salva impostazioni etichette": "Save label settings",
"Salva in UTF-8": "Save as UTF-8",
"Salva la API key in un luogo sicuro. Non sarà possibile visualizzarla nuovamente dopo la creazione.": "Save the API key in a safe place. It will not be possible to view it again after creation.",
+ "Salva Libro": "Save Book",
+ "Salva Lingua": "Save Language",
+ "Salva Modifiche": "Save Changes",
"Salva modifiche": "Save changes",
"Salva modifiche Homepage": "Save Homepage Changes",
+ "Salva Privacy Policy": "Save Privacy Policy",
+ "Salva Route": "Save Routes",
+ "Salva su Pocket": "Save to Pocket",
+ "Salva Template": "Save Template",
"Salva template": "Save template",
"Salva testi banner": "Save banner texts",
+ "Salva Testi Cookie Banner": "Save Cookie Banner Texts",
"Salva utente": "Save User",
"Salvataggio in corso...": "Saving...",
"Salvataggio...": "Saving...",
+ "Salvato con successo.": "Saved successfully.",
"Sarà pubblicata dopo l'approvazione di un amministratore.": "It will be published after administrator approval.",
"Sarà utilizzata per accedere al sistema": "Will be used to log in to the system",
"Sarà visualizzato nell'header e in tutto il sito": "Will be displayed in the header and throughout the site",
+ "SBN Italia - Integrato": "SBN Italy - Integrated",
+ "Scade": "Expires",
"Scadenza": "Due date",
"Scadenza Mancante": "Missing Due Date",
+ "Scadenza prenotazione": "Reservation expiration",
+ "Scadenza ritiro": "Pickup deadline",
+ "Scadenza ritiro:": "Pickup deadline:",
"Scadenza tessera": "Card Expiration",
"Scadenza:": "Due date:",
"Scadenza: %s": "Expiry: %s",
- "Scaduto": "Expired",
"Scaduta": "Expired",
"Scaduta il": "Expired on",
+ "Scaduto": "Expired",
+ "Scaduto il:": "Expired on:",
"Scaffale": "Bookcase",
"Scaffale *": "Bookcase *",
+ "Scaffale creato": "Bookcase created",
+ "Scaffale eliminato": "Bookcase deleted",
"Scaffale Narrativa": "Fiction Bookcase",
+ "Scaffale obbligatorio": "Bookcase required",
"Scaffali": "Bookcases",
"Scaffali e mensole": "Shelves and racks",
"Scarica": "Download",
- "Scarica copertine": "Fetch covers",
- "Scarica PDF": "Download PDF",
- "Scarica Ricevuta PDF": "Download PDF Receipt",
- "Scarica ricevuta PDF": "Download PDF receipt",
- "Scarica automaticamente la ricevuta PDF dopo la creazione del prestito.": "Automatically download the PDF receipt after creating the loan.",
- "Scaricamento copertine...": "Fetching covers...",
- "Copertine scaricate:": "Covers fetched:",
- "Già presenti o senza ISBN:": "Already present or no ISBN:",
- "Nessuna copertina da scaricare": "No covers to fetch",
- "Scraping fallito": "Scraping failed",
- "Download aggiornamento": "Downloading update",
- "Download copertina fallito": "Cover download failed",
- "Download fallito": "Download failed",
- "Immagine non valida": "Invalid image",
- "Formato immagine non supportato": "Unsupported image format",
- "Errore processamento immagine": "Image processing error",
- "Errore salvataggio immagine": "Image save error",
"Scarica Audiobook": "Download Audiobook",
- "Scarica JSON": "Download JSON",
+ "Scarica automaticamente la ricevuta PDF dopo la creazione del prestito.": "Automatically download the PDF receipt after creating the loan.",
+ "Scarica copertine": "Fetch covers",
"Scarica eBook": "Download eBook",
+ "Scarica Errori": "Download Errors",
"Scarica esempio_import_libri.csv": "Download example_import_books.csv",
"Scarica il CSV di esempio con 3 libri già compilati per capire il formato corretto e iniziare subito.": "Download the example CSV with 3 pre-filled books to understand the correct format and get started immediately.",
"Scarica il file CSV di esempio": "Download the example CSV file",
+ "Scarica il report CSV per analizzare gli errori in dettaglio": "Download the CSV report to analyze errors in detail",
+ "Scarica JSON": "Download JSON",
"Scarica l'eBook in formato digitale": "Download the eBook in digital format",
+ "Scarica PDF": "Download PDF",
+ "Scarica Ricevuta PDF": "Download PDF Receipt",
+ "Scarica ricevuta PDF": "Download PDF receipt",
+ "Scarica Script SQL": "Download SQL Script",
+ "Scaricamento copertine...": "Fetching covers...",
"Scarso": "Poor",
- "Scorri a destra per vedere tutte le colonne": "Scroll right to see all columns",
- "Sincronizza Copertine": "Sync Covers",
- "Sincronizzare le copertine?": "Sync covers?",
- "Questa operazione scaricherà le copertine mancanti per tutti i libri con ISBN. Può richiedere diversi minuti.": "This operation will download missing covers for all books with ISBN. It may take several minutes.",
- "Sì, sincronizza": "Yes, sync",
- "Sincronizzazione...": "Syncing...",
- "Sincronizzazione completata!": "Sync completed!",
- "Copertine sincronizzate: %s": "Covers synced: %s",
- "Copertine già presenti: %s": "Covers already present: %s",
- "Si è verificato un errore durante la sincronizzazione": "An error occurred during synchronization",
- "Sincronizza copertine mancanti via scraping": "Sync missing covers via scraping",
"Scegli": "Choose",
- "Scegli come ordinare i libri nella sezione": "Choose how to sort books in this section",
- "Scegli Icona Font Awesome": "Choose Font Awesome Icon",
"Scegli come inviare le email dal sistema. Puoi usare la funzione PHP mail(), PHPMailer o un server SMTP esterno.": "Choose how to send emails from the system. You can use the PHP mail() function, PHPMailer or an external SMTP server.",
"Scegli come inviare le email dal sistema. Puoi usare la funzione PHP /usr/bin/php con il percorso corretto di PHP sul tuo server": "Replace /usr/bin/php with the correct PHP path on your server",
"Sottocategoria": "Subcategory",
+ "Sottodomini devono supportare HTTPS (se usati)": "Subdomains must support HTTPS (if used)",
"Sottogenere": "Subgenre",
"Sottogenere specifico (opzionale)": "Specific subgenre (optional)",
- "Spazio libero": "Free space",
"Sottogeneri": "Subgenres",
+ "sottogeneri": "subgenres",
"Sottotitolo": "Subtitle",
"Sottotitolo CTA": "CTA Subtitle",
"Sottotitolo del libro (opzionale)": "Book subtitle (optional)",
"Sottotitolo sezione": "Section Subtitle",
+ "Spazio libero": "Free space",
+ "SSL": "SSL",
"Staff": "Staff",
"Staff:": "Staff:",
"Stai per aggiornare Pinakes alla versione": "You are about to update Pinakes to version",
"Stai per eliminare": "You are about to delete",
+ "Stai per eliminare %d libri. Questa azione non può essere annullata.": "You are about to delete %d books. This action cannot be undone.",
"Stai per unire": "You are about to merge",
- "Stai utilizzando l'ultima versione.": "You are using the latest version.",
"Stai utilizzando l'ultima versione disponibile.": "You are using the latest available version.",
+ "Stai utilizzando l'ultima versione.": "You are using the latest version.",
"Stampa": "Print",
"Stampa etichetta": "Print label",
"Standard": "Standard",
- "Standard Tirrenia catalogazione": "Standard Tirrenia cataloging",
"Standard dorso libri (più comune)": "Standard book spine (most common)",
+ "Standard Tirrenia catalogazione": "Standard Tirrenia cataloging",
"Statistiche": "Statistics",
+ "Statistiche aggiornate per": "Statistics updated for",
"Statistiche Prestiti": "Loan Statistics",
"Statistiche Rapide": "Quick Statistics",
"Statistiche:": "Statistics:",
"Stato": "Status",
+ "Stato aggiornato per %d libri": "Status updated for %d books",
"Stato API": "API Status",
"Stato API key aggiornato con successo.": "API key status updated successfully.",
- "Stato Incongruente": "Status Mismatch",
+ "Stato attuale:": "Current status:",
"Stato dell'installazione:": "Installation status:",
"Stato della copia": "Copy status",
+ "Stato della copia aggiornato con successo.": "Copy status updated successfully.",
"Stato e Gestione": "Status and Management",
- "Stato attuale:": "Current status:",
+ "Stato Incongruente": "Status Mismatch",
+ "Stato non valido": "Invalid status",
+ "Stato non valido.": "Invalid status.",
"Stato prestito": "Loan status",
+ "Stato Prestito": "Loan Status",
"Stato prestito corrente": "Current loan status",
"Stato prestito non valido.": "Invalid loan status.",
+ "Stato sconosciuto": "Unknown status",
"Stato:": "Status:",
"Status attuale di questa copia del libro": "Current status of this book copy",
+ "stella": "star",
+ "stelle": "stars",
+ "Step 1: Creazione backup": "Step 1: Creating backup",
+ "Step 2: Download aggiornamento": "Step 2: Downloading update",
+ "Step 3: Installazione aggiornamento": "Step 3: Installing update",
+ "Storico Import": "Import History",
"Storico Prestiti": "Loan History",
- "Nella stessa collana": "In the same series",
- "Volumi di quest'opera": "Volumes of this work",
- "volumi": "volumes",
- "Questo libro è il volume %s dell'opera": "This book is volume %s of the work",
- "Gestione Collane": "Series Management",
- "Gestisci le collane e le serie di libri": "Manage book series and collections",
- "Collane totali": "Total series",
- "Libri nelle collane": "Books in series",
- "Nessuna collana trovata. Aggiungi una collana a un libro per iniziare.": "No series found. Add a series to a book to get started.",
- "Collane": "Series",
- "Serie e collane di libri": "Book series and collections",
- "Rinomina collana": "Rename series",
- "Rinomina": "Rename",
- "Unisci con altra collana": "Merge with another series",
- "Nome collana di destinazione": "Target series name",
- "Unisci": "Merge",
- "Sei sicuro? Tutti i libri verranno spostati nella collana di destinazione.": "Are you sure? All books will be moved to the target series.",
- "Crea opera multi-volume": "Create multi-volume work",
- "Crea un libro padre che raccoglie tutti i volumi di questa collana.": "Create a parent book that collects all volumes of this series.",
- "Titolo dell'opera completa": "Title of the complete work",
- "Crea opera": "Create work",
- "Collana rinominata: %d libri aggiornati": "Series renamed: %d books updated",
- "Nome collana non valido": "Invalid series name",
- "Collane unite: %d libri spostati in \"%s\"": "Series merged: %d books moved to \"%s\"",
- "Parametri non validi per l'unione": "Invalid parameters for merge",
- "Opera \"%s\" creata con %d volumi": "Work \"%s\" created with %d volumes",
- "Errore nella creazione dell'opera": "Error creating the work",
- "Aggiungi volume": "Add volume",
- "Cerca libro": "Search for a book",
- "Titolo o ISBN...": "Title or ISBN...",
- "Numero volume": "Volume number",
- "Seleziona un libro": "Select a book",
- "Volume aggiunto": "Volume added",
- "Rimuovi volume?": "Remove volume?",
- "Il libro non sarà eliminato, solo la relazione.": "The book will not be deleted, only the relationship.",
- "Volume rimosso": "Volume removed",
- "Configura come opera multi-volume": "Configure as multi-volume work",
- "Errore database": "Database error",
- "Nuova Collana": "New Series",
- "Collana \"%s\" creata": "Series \"%s\" created",
- "Descrizione della collana...": "Series description...",
- "Salva descrizione": "Save description",
- "Descrizione salvata": "Description saved",
- "Assegna collana": "Assign series",
- "Collana assegnata": "Series assigned",
- "%d libri assegnati alla collana \"%s\"": "%d books assigned to series \"%s\"",
- "Elimina collana": "Delete series",
- "Rimuove la collana da tutti i libri. I libri non verranno eliminati.": "Removes the series from all books. Books will not be deleted.",
- "Sei sicuro? La collana verrà rimossa da tutti i libri.": "Are you sure? The series will be removed from all books.",
- "Collana \"%s\" eliminata (%d libri aggiornati)": "Series \"%s\" deleted (%d books updated)",
- "International Standard Serial Number (per periodici)": "International Standard Serial Number (for periodicals)",
- "ISSN Non Valido": "Invalid ISSN",
- "ISSN deve essere nel formato XXXX-XXXX (8 cifre, l'ultima può essere X).": "ISSN must be in the format XXXX-XXXX (7 digits plus a check character (digit or X)).",
- "ISSN non valido. Il formato corretto è XXXX-XXXX (8 cifre, l'ultima può essere X).": "Invalid ISSN. The correct format is XXXX-XXXX (7 digits plus a check character (digit or X)).",
- "Relazione ciclica: questo libro è già opera padre del libro selezionato": "Cyclic relationship: this book is already a parent work of the selected book",
- "Assegna": "Assign",
- "es. 1234-5678": "e.g. 1234-5678",
- "es. Harry Potter": "e.g. Harry Potter",
- "Identificatori": "Identifiers",
- "Inserisci un nome": "Enter a name",
- "Nome della collana": "Series name",
- "ISSN": "ISSN",
- "Volumi": "Volumes",
+ "Struttura pacchetto non valida": "Invalid package structure",
+ "Struttura pacchetto non valida: directory sorgente non trovata": "Invalid package structure: source directory not found",
"Successiva": "Next",
"Successivo": "Next",
"Successo": "Success",
@@ -2873,28 +3903,48 @@
"Suggerisci collocazione": "Suggest location",
"Suggerito scaffale #${data.scaffale_id}": "Suggested bookcase #${data.scaffale_id}",
"Suggerito:": "Suggested:",
+ "sul server tramite SSH.": "on the server via SSH.",
+ "Summary (Immagine Piccola)": "Summary (Small Image)",
+ "Summary Large Image (Immagine Grande)": "Summary Large Image",
"Supporto": "Support",
"Sì": "Yes",
"Sì, Aggiorna": "Yes, Update",
- "Sì, Salva": "Yes, Save",
"Sì, aggiorna": "Yes, update",
+ "Sì, Annulla": "Yes, Cancel",
+ "Sì, applica": "Yes, apply",
"Sì, approva": "Yes, approve",
"Sì, attiva": "Yes, activate",
+ "Sì, correggi": "Yes, fix",
+ "Sì, crea indici": "Yes, create indexes",
+ "Sì, crea tabelle": "Yes, create tables",
"Sì, disattiva": "Yes, deactivate",
"Sì, disinstalla": "Yes, uninstall",
"Sì, elimina": "Yes, delete",
"Sì, elimina!": "Yes, delete it!",
+ "Sì, esegui": "Yes, run",
"Sì, rimuovi": "Yes, Remove",
- "TLS": "TLS",
+ "Sì, Salva": "Yes, Save",
+ "Sì, sincronizza": "Yes, sync",
+ "Tabella": "Table",
+ "Tabella %s creata": "Table %s created",
+ "Tabelle create:": "Tables created:",
+ "Tabelle di Sistema": "System Tables",
+ "Tabelle richieste per l'aggiornamento": "Tables required for updates",
"Tag": "Tag",
"Telefono": "Phone",
- "Telefono:": "Phone:",
"Telefono *": "Phone *",
"Telefono Referente": "Contact Person Phone",
+ "Telefono:": "Phone:",
"Tema": "Theme",
+ "Tema attivato con successo": "Theme activated successfully",
+ "Tema Attivo": "Active Theme",
+ "Tema non trovato": "Theme not found",
+ "Tema salvato con successo": "Theme saved successfully",
+ "Temi": "Themes",
+ "Temi Disponibili": "Available Themes",
"Template": "Templates",
- "Template Email": "Email Templates",
"Template aggiornato con successo!": "Template updated successfully!",
+ "Template Email": "Email Templates",
"Template email": "Email templates",
"Termini": "Terms",
"Termini di Servizio": "Terms of Service",
@@ -2902,113 +3952,135 @@
"Test": "Test",
"Test Connessione": "Test Connection",
"Test del cron job:": "Cron job test:",
+ "Test Endpoint": "Test Endpoint",
"Testi Banner": "Banner Texts",
+ "Testi Banner Cookie": "Cookie Banner Texts",
"Testi Banner Iniziale": "Initial Banner Texts",
+ "Testi categorie cookie": "Cookie categories texts",
"Testi Cookie Banner": "Cookie Banner Texts",
"Testi Modale Preferenze": "Preferences Modal Texts",
- "Testi categorie cookie": "Cookie categories texts",
- "Testo Privacy": "Privacy Text",
+ "Testo Bottone": "Button Text",
"Testo che apparirà nel footer del sito": "Text that will appear in the site footer",
"Testo checkbox": "Checkbox text",
"Testo della checkbox privacy nel form": "Privacy checkbox text in the form",
"Testo introduttivo": "Introductory text",
"Testo principale mostrato nel banner. Puoi usare HTML.": "Main text shown in the banner. You can use HTML.",
+ "Testo Privacy": "Privacy Text",
"Testo pulsante": "Button Text",
"Testo pulsante \"Accetta tutti\"": "\"Accept all\" button text",
"Testo pulsante \"Preferenze\"": "\"Preferences\" button text",
"Testo pulsante \"Rifiuta non essenziali\"": "\"Reject non-essential\" button text",
"Testo pulsante \"Salva selezionati\"": "\"Save selected\" button text",
"Ti abbiamo inviato un'email con il link per confermare l'indirizzo.": "We have sent you an email with the link to confirm your address.",
+ "Timeout (secondi)": "Timeout (seconds)",
"Timestamp": "Timestamp",
"Tipo": "Type",
"Tipo Acquisizione": "Acquisition Type",
+ "Tipo acquisizione": "Acquisition type",
"Tipo Card": "Card Type",
"Tipo Contenuto": "Content Type",
- "Tipo MIME non valido. Solo file CSV sono accettati.": "Invalid MIME type. Only CSV files are accepted.",
- "Tipo OG": "OG Type",
- "Tipo Utente": "User Type",
- "Tipo acquisizione": "Acquisition type",
+ "Tipo di contenuto per Open Graph. Scegli 'Website' per la homepage.": "Content type for Open Graph. Choose 'Website' for homepage.",
+ "Tipo di file non consentito. Sono ammessi solo: %s": "File type not allowed. Only allowed: %s",
"Tipo di file non supportato. Solo JPEG e PNG sono consentiti.": "Unsupported file type. Only JPEG and PNG are allowed.",
"Tipo di file non valido.": "Invalid file type.",
"Tipo di file non valido. Carica un'immagine reale.": "Invalid file type. Please upload a real image.",
+ "Tipo di issue non valido": "Invalid issue type",
+ "Tipo Media": "Media Type",
+ "Tipo MIME non valido. Solo file CSV sono accettati.": "Invalid MIME type. Only CSV files are accepted.",
"Tipo non valido": "Invalid type.",
+ "Tipo OG": "OG Type",
+ "Tipo Twitter Card": "Twitter Card Type",
+ "Tipo Utente": "User Type",
"Tipo utente": "User Type",
"Tipologia account": "Account Type",
"Tipologia:": "Type:",
+ "titoli": "titles",
"Titolo": "Title",
- "Titolo:": "Title:",
- "Fonte dati:": "Data source:",
- "Fonti consultate:": "Sources consulted:",
- "Vedi alternative": "View alternatives",
- "Dati alternativi disponibili": "Alternative data available",
- "Copertina:": "Cover:",
- "Usa": "Use",
- "Nessuna alternativa disponibile": "No alternatives available",
- "Valore applicato": "Value applied",
- "Editore applicato": "Publisher applied",
- "Copertina applicata": "Cover applied",
"Titolo (opzionale)": "Title (optional)",
"Titolo 1": "Heading 1",
"Titolo 2": "Heading 2",
"Titolo 3": "Heading 3",
"Titolo A-Z": "Title A-Z",
"Titolo CTA": "CTA Title",
- "Titolo Evento": "Event Title",
- "Titolo Modale": "Modal Title",
- "Titolo OG": "OG Title",
- "Titolo Open Graph": "Open Graph Title",
- "Titolo Pagina": "Page Title",
- "Titolo SEO": "SEO Title",
- "Titolo Twitter": "Twitter Title",
- "Titolo Z-A": "Title Z-A",
"Titolo del libro": "Book title",
+ "Titolo dell'opera completa": "Title of the complete work",
"Titolo della sezione e le 4 card con le caratteristiche": "Section title and the 4 feature cards",
"Titolo e descrizione mostrati sopra i caroselli dei generi": "Title and description shown above genre carousels",
+ "Titolo Evento": "Event Title",
"Titolo libro": "Book title",
+ "Titolo mancante": "Missing title",
+ "Titolo Modale": "Modal Title",
+ "Titolo modale": "Modal title",
"Titolo mostrato quando condividi su Facebook/LinkedIn. Se vuoto, usa il titolo SEO o hero.": "Title shown when sharing on Facebook/LinkedIn. If empty, uses the SEO or hero title.",
"Titolo non disponibile": "Title not available",
+ "Titolo o ISBN...": "Title or ISBN...",
"Titolo obbligatorio mancante": "Missing required title",
+ "Titolo OG": "OG Title",
+ "Titolo Open Graph": "Open Graph Title",
+ "Titolo Pagina": "Page Title",
"Titolo pagina": "Page title",
+ "Titolo per Twitter/X. Se vuoto, usa il titolo Open Graph.": "Title for Twitter/X. If empty, uses Open Graph title.",
"Titolo principale (H1)": "Main Title (H1)",
+ "Titolo SEO": "SEO Title",
"Titolo sezione": "Section Title",
"Titolo troppo lungo (max 255 caratteri)": "Title too long (max 255 characters)",
+ "Titolo Twitter": "Twitter Title",
+ "Titolo Z-A": "Title Z-A",
"Titolo, sottotitolo, descrizione...": "Title, subtitle, description...",
"Titolo...": "Title...",
+ "Titolo:": "Title:",
+ "TLS": "TLS",
+ "Toggle menu": "Toggle menu",
+ "Toggle search": "Toggle search",
+ "Token configurato": "Token configured",
+ "Token configurato — lascia vuoto per mantenere": "Token configured — leave empty to keep",
"Token CSRF non valido": "Invalid CSRF token.",
+ "Token CSRF non valido.": "Invalid CSRF token.",
"Token CSRF non valido. Riprova.": "Invalid CSRF token. Please try again.",
+ "Token di Accesso": "Access Token",
"Token di sicurezza non valido. Riprova.": "Invalid security token. Please try again.",
+ "Token Discogs rimosso correttamente.": "Discogs token successfully removed.",
+ "Token GitHub non valido: contiene caratteri di controllo": "Invalid GitHub token: contains control characters",
+ "Token opzionale:": "Optional token:",
"Top 10 Lettori Più Attivi": "Top 10 Most Active Readers",
"Top 10 Libri Più Prestati": "Top 10 Most Loaned Books",
- "Torna Indietro": "Go Back",
"Torna agli Eventi": "Back to Events",
"Torna agli eventi": "Back to events",
"Torna ai Libri": "Back to Books",
+ "Torna ai Plugin": "Back to Plugins",
"Torna ai Prestiti": "Back to Loans",
+ "Torna ai temi": "Back to themes",
"Torna al login": "Back to login",
"Torna all'Applicazione": "Back to Application",
"Torna all'elenco": "Back to list",
- "Torna alla Configurazione Database": "Back to Database Configuration",
"Torna alla categoria superiore": "Back to parent category",
+ "Torna alla Configurazione Database": "Back to Database Configuration",
"Torna alla dashboard": "Back to Dashboard",
+ "Torna alla Home": "Return to Home",
"Torna alla lista": "Back to list",
"Torna alla panoramica eventi": "Back to all events",
"Torna alle Impostazioni": "Back to Settings",
"Torna alle Impostazioni CMS": "Back to CMS Settings",
"Torna alle Lingue": "Back to Languages",
"Torna alle Prenotazioni": "Back to Reservations",
+ "Torna Indietro": "Go Back",
"Total users:": "Total users:",
"Totale": "Total",
"Totale Autori": "Total Authors",
- "Totale Generi": "Total Genres",
- "Totale Libri": "Total Books",
- "Totale Prestiti": "Total Loans",
- "Trasforma Pinakes in un catalogo di sola consultazione": "Transform Pinakes into a browse-only catalogue",
"Totale autori": "Total authors",
"Totale editori:": "Total publishers:",
+ "Totale Generi": "Total Genres",
+ "Totale Libri": "Total Books",
"Totale libri": "Total books",
"Totale libri presenti": "Total books in collection",
+ "Totale Prestiti": "Total Loans",
"Totale utenti:": "Total users:",
"Totale: %s righe": "Total: %s rows",
+ "Totali": "Total",
+ "Tracce": "Tracks",
+ "Tracciamento Prestiti": "Loan Tracking",
+ "Tracklist": "Tracklist",
+ "Traduttore": "Translator",
"Traduzioni e localizzazione": "Translations and localization",
"Trascina le sezioni per riordinarle. L'ordine sarà salvato automaticamente e rispecchiato nella homepage.": "Drag sections to reorder them. The order will be saved automatically and reflected on the homepage.",
"Trascina per riordinare • Il codice deve essere univoco": "Drag to reorder • Code must be unique",
@@ -3021,20 +4093,32 @@
"Trascina qui l'immagine, %{browse} o importa da": "Drag image here, %{browse} or import from",
"Trascina qui la copertina del libro o %{browse}": "Drag the book cover here or %{browse}",
"Trascina qui la copertina del libro o clicca per selezionare": "Drag the book cover here or click to select",
+ "Trasforma Pinakes in un catalogo di sola consultazione": "Transform Pinakes into a browse-only catalogue",
"Trigger database configurati": "Database triggers configured",
+ "Trigger database: azione manuale richiesta": "Database trigger: manual action required",
"Trigger importati OK": "Triggers imported OK",
+ "Troppi errori durante l'import dei dati (%d errori). Primi errori:\n%s": "Too many errors during data import (%d errors). First errors:\n%s",
+ "Troppi errori durante l'import dello schema (%d errori). Primi errori:\n%s": "Too many errors during schema import (%d errors). First errors:\n%s",
"Troppi tentativi. Attendi qualche minuto prima di riprovare": "Too many attempts. Please wait a few minutes before trying again",
+ "Trovate tabelle da backuppare": "Found tables to backup",
"Trovato": "Found",
"Tutorial": "Tutorial",
+ "Tutte le copie di questo libro hanno già un prestito attivo o prenotato. Attendi che una copia venga restituita.": "All copies of this book already have an active or scheduled loan. Please wait for a copy to be returned.",
+ "Tutte le copie in prestito": "All copies on loan",
+ "Tutte le copie prenotate": "All copies reserved",
"Tutte le date sono in formato ISO 8601 (YYYY-MM-DD HH:MM:SS)": "All dates are in ISO 8601 format (YYYY-MM-DD HH:MM:SS)",
"Tutte le mensole": "All shelves",
"Tutte le notifiche del sistema": "All system notifications",
+ "Tutte le richieste sono state gestite.": "All requests have been processed.",
+ "Tutte le risorse del sito devono essere HTTPS": "All site resources must be HTTPS",
"Tutte le route devono iniziare con": "All routes must start with",
+ "Tutte le tabelle di sistema sono presenti!": "All system tables are present!",
"Tutti": "All",
"Tutti gli anni": "All years",
"Tutti gli autori": "All authors",
"Tutti gli editori": "All publishers",
"Tutti gli eventi": "All events",
+ "Tutti gli indici di performance sono presenti.": "All performance indexes are present.",
"Tutti gli scaffali": "All bookcases",
"Tutti gli stati": "All statuses",
"Tutti i controlli di integrità sono passati con successo!": "All integrity checks passed successfully!",
@@ -3042,94 +4126,136 @@
"Tutti i filtri sono stati rimossi": "All filters have been removed",
"Tutti i generi": "All genres",
"Tutti i libri": "All books",
+ "Tutti i media": "All media",
"Tutti i messaggi ricevuti tramite il form contatti": "All messages received through contact form",
"Tutti i requisiti sono soddisfatti! Puoi procedere con l'installazione.": "All requirements are met! You can proceed with the installation.",
"Tutti i ruoli": "All roles",
"Tutti soddisfatti": "All met",
- "Tutto aggiornato!": "All up to date!",
"Tutto": "All",
- "Twitter": "Twitter",
+ "Tutto aggiornato!": "All up to date!",
+ "Tutto sotto controllo!": "Everything under control!",
+ "Twitter": "Twitter",
"Twitter Card": "Twitter Card",
- "URL Canonico": "Canonical URL",
- "URL Canonico (opzionale)": "Canonical URL (optional)",
- "URL Non Valido": "Invalid URL",
- "URL OG": "OG URL",
- "URL completo della pagina (auto-generato se vuoto)": "Full page URL (auto-generated if empty)",
- "URL completo del sito (es: https://biblioteca.example.com). Usato per link nelle email (verifica account, reset password). Se lasciato vuoto, verrà auto-rilevato.": "Full site URL (e.g., https://biblioteca.example.com). Used for email links (account verification, password reset). If left blank, it will be auto-detected.",
- "URL della pagina con la cookie policy": "URL of the page with cookie policy",
- "URL della pagina con le tecnologie dei cookie": "URL of the page with cookie technologies",
- "URL non valido o non permesso.": "Invalid or unauthorized URL.",
- "URL non valido.": "Invalid URL.",
- "URL principale del sito. Se vuoto, usa l'URL corrente.": "Main site URL. If empty, uses the current URL.",
- "URL pubblico:": "Public URL:",
- "URL sito web...": "Website URL...",
- "URL...": "URL...",
+ "Twitter Cards (X)": "Twitter Cards (X)",
+ "Ultima": "Last",
"Ultima generazione:": "Last generated:",
+ "Ultima modifica": "Last updated",
"Ultima Versione": "Latest Version",
+ "Ultime aggiunte al catalogo (RSS 2.0)": "Latest book additions (RSS 2.0)",
+ "Ultimi aggiunti (data creazione)": "Recently added (creation date)",
"Ultimi Arrivi": "Latest Arrivals",
"Ultimi Libri Aggiunti": "Latest Books Added",
"Ultimi Libri Inseriti": "Recently Added Books",
- "Ultimi aggiunti (data creazione)": "Recently added (creation date)",
"Ultimi modificati (data aggiornamento)": "Recently edited (update date)",
- "Ultima": "Last",
"Ultimo": "Last",
- "Ultimo Aggiornamento": "Last Updated",
"Ultimo accesso": "Last access",
+ "Ultimo Aggiornamento": "Last Updated",
"Ultimo aggiornamento": "Last Update",
"Ultimo uso:": "Last used:",
+ "Ultimo utilizzo": "Last used",
"Umberto Eco": "Umberto Eco",
"Un altro aggiornamento è già in corso. Riprova più tardi.": "Another update is already in progress. Please try again later.",
"Un backup viene creato automaticamente prima di salvare": "A backup is created automatically before saving",
"Un'esperienza di lettura moderna, intuitiva e sempre a portata di mano": "A modern, intuitive reading experience always at your fingertips",
+ "Una chiave è attualmente salvata e funzionante. Puoi aggiornarla inserendo un nuovo valore o lasciarla vuota per rimuoverla.": "A key is currently saved and working. You can update it by entering a new value or leave it empty to remove it.",
"Una chiave è già salvata. Inserisci un nuovo valore per aggiornarla oppure lascia vuoto per rimuoverla.": "A key is already stored. Enter a new value to update it or leave empty to remove it.",
"Una descrizione completa aiuta gli utenti a conoscere meglio l'autore": "A complete description helps users get to know the author better",
"Una mensola con livello %d esiste già in questo scaffale. Usa un livello diverso.": "A shelf with level %d already exists on this bookcase. Use a different level.",
"Una panoramica dei libri che hai salvato per non perderli di vista.": "An overview of the books you've saved to keep track of.",
- "Unisciti alla nostra community di lettori e scopri il piacere della lettura con la nostra piattaforma moderna.": "Join our community of readers and discover the joy of reading with our modern platform.",
+ "Unisci": "Merge",
"Unisci autori": "Merge authors",
+ "Unisci con altra collana": "Merge with another series",
"Unisci editori": "Merge publishers",
+ "Unisciti alla nostra community di lettori e scopri il piacere della lettura con la nostra piattaforma moderna.": "Join our community of readers and discover the joy of reading with our modern platform.",
+ "Upload non valido": "Invalid upload",
"Uploader non disponibile": "Uploader not available",
+ "URL Canonico": "Canonical URL",
+ "URL Canonico (opzionale)": "Canonical URL (optional)",
+ "URL Canonico Mancante": "Missing Canonical URL",
+ "URL Canonico Non Valido": "Invalid Canonical URL",
+ "URL Canonico Vuoto": "Empty Canonical URL",
+ "URL completo del sito (es: https://biblioteca.example.com). Usato per link nelle email (verifica account, reset password). Se lasciato vuoto, verrà auto-rilevato.": "Full site URL (e.g., https://biblioteca.example.com). Used for email links (account verification, password reset). If left blank, it will be auto-detected.",
+ "URL completo della pagina (auto-generato se vuoto)": "Full page URL (auto-generated if empty)",
+ "URL della pagina con la cookie policy": "URL of the page with cookie policy",
+ "URL della pagina con le tecnologie dei cookie": "URL of the page with cookie technologies",
+ "URL di download non trovato": "Download URL not found",
+ "URL Endpoint API": "API Endpoint URL",
+ "URL Endpoint SRU": "SRU Endpoint URL",
+ "URL Non Valido": "Invalid URL",
+ "URL non valido o non permesso.": "Invalid or unauthorized URL.",
+ "URL non valido.": "Invalid URL.",
+ "URL OG": "OG URL",
+ "URL principale del sito. Se vuoto, usa l'URL corrente.": "Main site URL. If empty, uses the current URL.",
+ "URL pubblico:": "Public URL:",
+ "URL sito web...": "Website URL...",
+ "URL...": "URL...",
+ "Usa": "Use",
"Usa 'localhost' (raccomandato, rileva automaticamente TCP/socket). Puoi forzare '127.0.0.1' per TCP.": "Use 'localhost' (recommended, auto-detects TCP/socket). You can force '127.0.0.1' for TCP.",
"Usa codici semplici (A, B, C...)": "Use simple codes (A, B, C...)",
+ "Usa formato: 599 oppure 599.9 oppure 599.93": "Use format: 599 or 599.9 or 599.93",
+ "Usa gli endpoint specifici per il formato legacy": "Use specific endpoints for legacy format",
"Usa i servizi online per precompilare automaticamente i dati del libro": "Use online services to automatically prefill book data",
+ "Usa il controllo schermo intero del viewer o del browser": "Use the viewer or browser fullscreen control",
"Usa il pulsante \"Rigenera adesso\" per crearla": "Use \"Regenerate now\" button to create it",
"Usa il separatore %s": "Use %s separator",
"Usa l'editor per formattare il testo, aggiungere link, immagini e altro": "Use the editor to format text, add links, images, and more",
"Usa l'editor per formattare il testo, aggiungere link, immagini e altro.": "Use the editor to format text, add links, images, and more.",
+ "Usa la funzione di ricerca del browser per trovare testo nel documento": "Use your browser's search function to find text in the document",
"Usa le frecce ← → per saltare": "Use ← → arrows to skip",
"Usa questa azione dopo aver importato un grande numero di libri o modifiche ai contenuti CMS.": "Use this action after importing a large number of books or CMS content changes.",
"Usa questo campo per personalizzare lo stile del sito senza modificare i file di tema.": "Use this field to customize site style without modifying theme files.",
+ "Usa {isbn} come placeholder. Es: https://api.example.com/books/{isbn}": "Use {isbn} as a placeholder. Ex: https://api.example.com/books/{isbn}",
"Usata per login e comunicazioni.": "Used for login and communications.",
"Username": "Username",
"Users": "Users",
"Utente": "User",
+ "Utente %s (%s) si è registrato": "User %s (%s) has registered",
"Utente admin creato:": "Admin user created:",
"Utente aggiornato con successo!": "User updated successfully!",
"Utente approvato con successo!": "User approved successfully!",
"Utente attivato direttamente!": "User activated directly!",
"Utente creato con successo!": "User created successfully!",
+ "Utente eliminato con successo.": "User deleted successfully.",
"Utente prenotante": "User making reservation",
+ "Utente preselezionato": "Pre-selected user",
"Utente sconosciuto": "Unknown user",
"Utente senza nome": "Unnamed user",
- "Utente %s (%s) si è registrato": "User %s (%s) has registered",
"Utente:": "User:",
+ "utente@example.com": "user@example.com",
"Utenti": "Users",
+ "utenti": "users",
"Utenti Attivi": "Active Users",
+ "Utenti in Attesa di Approvazione": "Users Awaiting Approval",
"Utenti registrati": "Registered users",
"Utilizza l'editor TinyMCE per formattare il testo e Uppy per caricare immagini di alta qualità. Le modifiche saranno immediatamente visibili nella pagina pubblica.": "Use the TinyMCE editor to format text and Uppy to upload high quality images. Changes will be immediately visible on the public page.",
"Utilizziamo i cookie per migliorare la tua esperienza. Continuando a visitare questo sito, accetti il nostro uso dei cookie.": "We use cookies to improve your experience. By continuing to visit this site, you accept our use of cookies.",
"Vai": "Go",
+ "Vai a Autori": "Go to Authors",
+ "Vai a Dashboard": "Go to Dashboard",
+ "Vai a Editori": "Go to Publishers",
+ "Vai a Impostazioni": "Go to Settings",
+ "Vai a Libri": "Go to Books",
+ "Vai a Prestiti": "Go to Loans",
+ "Vai a Utenti": "Go to Users",
"Vai al Login": "Go to Login",
"Vai al login": "Go to login",
"Vai all'Applicazione": "Go to Application",
+ "Vai all'applicazione": "Go to application",
"Vai alla Home": "Go to Home",
+ "Validazione prestito fallita": "Loan validation failed",
+ "Valore applicato": "Value applied",
"Valore compreso tra 1 e 30 giorni. Consigliato: 3 giorni": "Value between 1 and 30 days. Recommended: 3 days",
+ "Valore Corrente Stimato": "Estimated Current Value",
+ "Valore di mercato attuale (diverso dal prezzo di acquisto)": "Current market value (different from purchase price)",
+ "Valore e Condizione": "Value and Condition",
"Valore non valido": "Invalid value",
+ "Valutazione": "Rating",
"Valutazione *": "Rating *",
"Valutazione non valida (1-5 stelle)": "Invalid rating (1-5 stars)",
"Variabili disponibili:": "Available variables:",
"Vecchio": "Old",
"Vedi": "View",
+ "Vedi alternative": "View alternatives",
"Vedi Dettagli": "View Details",
"Vedi dettagli": "View details",
"Vedi istruzioni sotto per correggere manualmente.": "See instructions below to fix manually.",
@@ -3142,11 +4268,14 @@
"Verifica completata OK": "Verification completed OK",
"Verifica i permessi di esecuzione: chmod +x cron/automatic-notifications.php": "Verify execution permissions: chmod +x cron/automatic-notifications.php",
"Verifica in corso...": "Checking...",
+ "Verifica installazione...": "Verifying installation...",
+ "Verifica Leggibilità": "Readability Check",
+ "Verifica reCAPTCHA fallita. Riprova.": "reCAPTCHA verification failed. Please try again.",
"Verifica versioni": "Check versions",
+ "Verificato": "Verified",
+ "verranno automaticamente selezionati.": "will be automatically selected.",
"Verrà creato automaticamente un backup prima dell'aggiornamento.": "A backup will be automatically created before updating.",
"Verrà creato un backup completo del database.": "A complete database backup will be created.",
- "Verifica installazione...": "Verifying installation...",
- "Verificato": "Verified",
"Versione": "Version",
"Versione Installata": "Installed Version",
"Versione Installer:": "Installer Version:",
@@ -3158,172 +4287,65 @@
"Via, numero...": "Street, number...",
"Video": "Video",
"Video tutorial": "Video tutorial",
+ "Vinile": "Vinyl",
"Visibile": "Visible",
"Visibile pubblicamente sulla pagina contatti": "Publicly visible on contact page",
- "Visibilità Sezione Eventi": "Events Section Visibility",
+ "Visibilita": "Visibility",
+ "Visibilità": "Visibility",
"Visibilità aggiornata!": "Visibility updated!",
+ "Visibilità nel Frontend": "Frontend Visibility",
+ "Visibilità Sezione Eventi": "Events Section Visibility",
"Visita il sito ufficiale": "Visit official website",
+ "Vista griglia": "Grid view",
+ "Vista tabella": "Table view",
"Visualizza": "View",
- "Visualizza Libro": "View Book",
- "Visualizza Tutte le Categorie": "View All Categories",
- "Visualizza Tutto il Catalogo": "View Entire Catalog",
"Visualizza dettagli": "View details",
"Visualizza dettagli libro": "View book details",
"Visualizza e esporta l'elenco dei libri per posizione fisica": "View and export the list of books by physical position",
"Visualizza e gestisci tutti i prestiti della biblioteca": "View and manage all library loans",
+ "Visualizza la cronologia degli import CSV e LibraryThing con report errori dettagliati": "View the history of CSV and LibraryThing imports with detailed error reports",
+ "Visualizza Libro": "View Book",
"Visualizza pagina live": "View live page",
+ "Visualizza Tutte le Categorie": "View All Categories",
+ "Visualizza Tutto il Catalogo": "View Entire Catalog",
+ "Visualizzatore PDF": "PDF Viewer",
"Visualizzazione da _START_ a _END_ di _TOTAL_ libri": "Showing _START_ to _END_ of _TOTAL_ books",
"Visualizzazione gerarchica di generi e sottogeneri": "Hierarchical view of genres and subgenres",
+ "visualizzazione per copia": "view by copy",
"Voci totali": "Total entries",
+ "Volume aggiunto": "Volume added",
+ "Volume rimosso": "Volume removed",
+ "volumi": "volumes",
+ "Volumi": "Volumes",
+ "Volumi di quest'opera": "Volumes of this work",
"Vuoi aggiornare il libro \"${title}\"?": "Do you want to update the book \"${title}\"?",
"Vuoi aggiornare il libro \"%s\"?": "Do you want to update the book \"%s\"?",
"Vuoi aggiornare lo stato di questa copia?": "Do you want to update the status of this copy?",
"Vuoi approvare questa recensione e renderla visibile sul sito?": "Do you want to approve this review and make it visible on the site?",
"Vuoi attivare questo plugin?": "Do you want to activate this plugin?",
"Vuoi aumentare il numero di copie di questo libro?": "Do you want to increase the number of copies of this book?",
+ "Vuoi correggere automaticamente i problemi di integrità rilevati?": "Do you want to automatically fix the detected integrity issues?",
+ "Vuoi creare gli indici mancanti? Questa operazione migliorerà le performance del database.": "Do you want to create the missing indexes? This operation will improve database performance.",
+ "Vuoi creare le tabelle di sistema mancanti? Queste sono necessarie per il sistema di aggiornamento.": "Do you want to create the missing system tables? These are required for the update system.",
"Vuoi disattivare questo plugin?": "Do you want to deactivate this plugin?",
+ "Vuoi disconnettere questo dispositivo?": "Do you want to sign out this device?",
+ "Vuoi disconnettere tutti i dispositivi? Dovrai effettuare nuovamente l'accesso su ogni dispositivo.": "Do you want to sign out all devices? You will need to log in again on each device.",
+ "Vuoi eliminare definitivamente questa recensione? Questa azione non può essere annullata.": "Do you want to permanently delete this review? This action cannot be undone.",
"Vuoi eliminare questo elemento?": "Do you want to delete this item?",
+ "Vuoi eseguire la manutenzione completa del sistema? Questa operazione potrebbe richiedere alcuni minuti.": "Do you want to run full system maintenance? This may take a few minutes.",
+ "Vuoi impostare APP_CANONICAL_URL a:": "Do you want to set APP_CANONICAL_URL to:",
"Vuoi procedere?": "Do you want to proceed?",
"Vuoi rifiutare questa recensione? L'utente verrà avvisato dell'esito.": "Do you want to reject this review? The user will be notified of the outcome.",
+ "WCAG AA Conforme": "WCAG AA Compliant",
+ "Website (Sito Web)": "Website",
"Wishlist": "Wishlist",
+ "Wishlist disponibile": "Wishlist available",
"Working...": "Working...",
+ "Yes, fix": "Yes, fix",
+ "Yes, run": "Yes, run",
+ "Z-Library": "Z-Library",
"Zona Pericolosa": "Danger Zone",
- "agosto": "August",
- "acquisto": "purchase",
- "al": "to",
- "altamente consigliato": "highly recommended",
- "aprile": "April",
- "autori": "authors",
- "biblioteca, prestito libri, catalogo online, scopri libri, prenotazioni": "library, book lending, online catalog, discover books, reservations",
- "chiavi": "keys",
- "chiavi tradotte": "translated keys",
- "come nuovo autore": "as new author",
- "completamento": "completion",
- "con successo": "successfully",
- "copi": "copi",
- "copia": "copy",
- "copie": "copies",
- "crontab -e": "crontab -e",
- "danneggiato": "damaged",
- "della lingua desiderata.": "of the desired language.",
- "di": "of",
- "di %s": "of %s",
- "dicembre": "December",
- "directory": "directories",
- "disattivata": "disabled",
- "disponibile": "available",
- "disponibili ora": "available now",
- "donazione": "donation",
- "dopo aver completato l'installazione.": "after completing the installation.",
- "eBook (PDF/ePub)": "eBook (PDF/ePub)",
- "eBook caricato!": "eBook uploaded!",
- "eBook disponibile": "eBook available",
- "editori": "publishers",
- "elementi": "items",
- "elemento": "item",
- "elimina la cartella": "delete the folder",
- "errore di comunicazione con il server": "server communication error",
- "es. 0.450": "e.g. 0.450",
- "es. 15": "e.g. 15",
- "es. 19.90": "e.g. 19.90",
- "es. 2020": "e.g. 2020",
- "es. 2024": "e.g. 2024",
- "es. 2025": "e.g. 2025",
- "es. 21x14 cm": "e.g. 21x14 cm",
- "es. 26 agosto 2025": "e.g. August 26, 2025",
- "es. 320": "e.g. 320",
- "es. 8842935786": "e.g. 8842935786",
- "es. 978-88-429-3578-0": "e.g. 978-88-429-3578-0",
- "es. 9788842935780": "e.g. 9788842935780",
- "es. Acquisto, Donazione, Prestito": "e.g. Purchase, Donation, Loan",
- "es. Biblioteca Civica": "e.g. Public Library",
- "es. Copertina rigida, Brossura": "e.g. Hardcover, Paperback",
- "es. Fantasy contemporaneo": "e.g. Contemporary Fantasy",
- "es. I Classici": "e.g. The Classics",
- "es. INV-2024-001": "e.g. INV-2024-001",
- "es. Integrazione Sito Web": "e.g. Website Integration",
- "es. Italiano, Inglese": "e.g. Italian, English",
- "es. La morale anarchica": "e.g. The Anarchist Morality",
- "es. Noir mediterraneo": "e.g. Mediterranean Noir",
- "es. Prima edizione": "e.g. First edition",
- "es. RSSMRA80A01H501U": "e.g. RSSMRA80A01H501U",
- "es. Urban fantasy": "e.g. Urban fantasy",
- "es. noreply@biblioteca.local": "e.g. noreply@library.local",
- "es. romanzo, fantasy, avventura (separare con virgole)": "e.g. novel, fantasy, adventure (separate with commas)",
- "eventi": "events",
- "eventi, biblioteca, cultura": "events, library, culture",
- "fallite.": "failed.",
- "fas fa-users": "fas fa-users",
- "febbraio": "February",
- "gennaio": "January",
- "giorni prima della scadenza": "days before expiry",
- "giugno": "June",
- "https://www.editore.com": "https://www.publisher.com",
- "icone disponibili": "icons available",
- "in attesa": "pending",
- "in_corso": "in progress",
- "in_ritardo": "overdue",
- "info@editore.com": "info@publisher.com",
- "installazione inglese usa": "English installation uses",
- "kg": "kg",
- "libri": "books",
- "libri trovati": "books found",
- "libro": "book",
- "libro trovato": "book found",
- "linea": "line",
- "lingue": "languages",
- "lingue. Errori:": "languages. Errors:",
- "luglio": "July",
- "maggio": "May",
- "manutenzione": "maintenance",
- "mario.rossi@email.it": "john.doe@email.com",
- "marzo": "March",
- "nella directory dell'applicazione.": "in the application directory.",
- "nella nostra biblioteca.": "in our library.",
- "novembre": "November",
- "o multipli separati da |": "or multiple separated by |",
- "o multipli: Engels;Marx": "or multiple: Engels;Marx",
- "opzionale": "optional",
- "opzionali": "optional",
- "ottobre": "October",
- "pagina": "page",
- "pagine": "pages",
- "per conformità GDPR.": "for GDPR compliance.",
- "per evitare blocchi (delay di 3 secondi tra ogni richiesta).": "to avoid blocks (3 second delay between each request).",
- "per il giorno": "for the day",
- "per pagina": "per page",
- "perso": "lost",
- "preferiti": "favorites",
- "premi Invio per crearne uno nuovo.": "press Enter to create a new one.",
- "prenotazione attiva": "active reservation",
- "prenotazioni attive": "active reservations",
- "prenotato": "reserved",
- "prestato": "on loan",
- "prestiti attivi": "active loans",
- "prestiti passati": "past loans",
- "prestiti totali": "total loans",
- "prestito attivo": "active loan",
- "prestito passato": "past loan",
- "prima di procedere.": "before proceeding.",
- "recensione": "review",
- "recensioni": "reviews",
- "referente@editore.com": "contact@publisher.com",
- "restituito": "returned",
- "richiesta in sospeso": "pending request",
- "richieste in sospeso": "pending requests",
- "risultati": "results",
- "risultato": "result",
- "seleziona": "browse",
- "seleziona file": "select file",
- "selezionati": "selected",
- "settembre": "September",
- "sfoglia": "browse",
- "sottogeneri": "subgenres",
- "sul server tramite SSH.": "on the server via SSH.",
- "titoli": "titles",
- "utente@example.com": "user@example.com",
- "utenti": "users",
- "verranno automaticamente selezionati.": "will be automatically selected.",
+ "È uno standard emergente (llmstxt.org) che fornisce ai motori AI un sommario strutturato del sito in formato Markdown. Quando attivo, il file viene generato dinamicamente con le statistiche della biblioteca, le pagine pubbliche e le informazioni API.": "An emerging standard (
llmstxt.org) that provides AI engines with a structured Markdown summary of the site. When enabled, the file is dynamically generated with library statistics, public pages, and API information.",
"Български (BG)": "Bulgarian (BG)",
"עברית (HE)": "Hebrew (HE)",
"– Nessuno –": "– None –",
@@ -3341,832 +4363,5 @@
"💡 Non hai accesso SSH?": "💡 Don't have SSH access?",
"📋 Importante: Devi elencare manualmente i cookie tracciati da questi script nella
Pagina Cookie per conformità GDPR.": "📋 Important: You must manually list cookies tracked by these scripts in the
Cookie Page for GDPR compliance.",
"📋 Istruzioni SSH (Click per espandere/chiudere)": "📋 SSH Instructions (Click to expand/collapse)",
- "🔒 Sicurezza Importante": "🔒 Important Security",
- "Gestione Temi": "Theme Management",
- "Temi": "Themes",
- "Personalizza l'aspetto dell'applicazione": "Customize the application appearance",
- "Tema Attivo": "Active Theme",
- "Temi Disponibili": "Available Themes",
- "Personalizza": "Customize",
- "Attivare questo tema?": "Activate this theme?",
- "Errore durante l'attivazione": "Error during activation",
- "Errore di rete": "Network error",
- "Primario": "Primary",
- "Secondario": "Secondary",
- "Bottone": "Button",
- "Testo Bottone": "Button Text",
- "Accento": "Accent",
- "Personalizza Tema": "Customize Theme",
- "Torna ai temi": "Back to themes",
- "Colori Tema": "Theme Colors",
- "Personalizza la palette colori dell'applicazione": "Customize the application color palette",
- "Colore Primario": "Primary Color",
- "link, accenti": "links, accents",
- "Colore Secondario": "Secondary Color",
- "bottoni principali": "main buttons",
- "Colore Bottoni CTA": "CTA Button Color",
- "bottoni nelle card": "buttons in cards",
- "Colore Testo Bottoni": "Button Text Color",
- "Verifica Leggibilità": "Readability Check",
- "Link di esempio": "Example link",
- "Bottone CTA": "CTA Button",
- "Bottone Primario": "Primary Button",
- "Ripristina": "Reset",
- "Contrasto": "Contrast",
- "WCAG AA Conforme": "WCAG AA Compliant",
- "AA Testo Grande": "AA Large Text",
- "Insufficiente": "Insufficient",
- "Ripristinare i colori?": "Reset colors to defaults?",
- "Tema attivato con successo": "Theme activated successfully",
- "Errore durante l'attivazione del tema": "Error activating theme",
- "Colori ripristinati ai valori predefiniti": "Colors reset to defaults",
- "Errore nel ripristino dei colori": "Error resetting colors",
- "Tema non trovato": "Theme not found",
- "Colore non valido": "Invalid color",
- "Contrasto insufficiente tra bottone e testo (minimo 3:1). Attuale": "Insufficient contrast between button and text (minimum 3:1). Current",
- "Tema salvato con successo": "Theme saved successfully",
- "Errore nel salvataggio del tema": "Error saving theme",
- "Utenti in Attesa di Approvazione": "Users Awaiting Approval",
- "Invia Email": "Send Email",
- "Confermi di voler attivare direttamente questo utente?": "Are you sure you want to activate this user directly?",
- "Non includere tag": "Do not include tags",
- "Il codice verrà inserito in un tag": "The code will be inserted in a tag",
- "nell'header. Non includere i tag": "in the header. Do not include tags",
- "Sicurezza Connessione": "Connection Security",
- "Configura le impostazioni di sicurezza per le connessioni HTTPS": "Configure security settings for HTTPS connections",
- "Attiva HTTPS solo se hai un certificato SSL valido installato. Attivare HSTS rende permanente il reindirizzamento HTTPS nel browser.": "Enable HTTPS only if you have a valid SSL certificate installed. Enabling HSTS makes HTTPS redirection permanent in the browser.",
- "Info HSTS:": "HSTS Info:",
- "HTTP Strict Transport Security forza i browser a usare solo connessioni HTTPS per 1 anno (raccomandato per produzione con SSL valido).": "HTTP Strict Transport Security forces browsers to use only HTTPS connections for 1 year (recommended for production with valid SSL).",
- "Forza HTTPS": "Force HTTPS",
- "Reindirizza automaticamente tutte le richieste HTTP a HTTPS": "Automatically redirect all HTTP requests to HTTPS",
- "Abilita HSTS": "Enable HSTS",
- "Attiva HTTP Strict Transport Security (max-age: 1 anno, include sottodomini)": "Enable HTTP Strict Transport Security (max-age: 1 year, includes subdomains)",
- "Requisiti:": "Requirements:",
- "Certificato SSL/TLS valido": "Valid SSL/TLS certificate",
- "Tutte le risorse del sito devono essere HTTPS": "All site resources must be HTTPS",
- "Sottodomini devono supportare HTTPS (se usati)": "Subdomains must support HTTPS (if used)",
- "Funzionamento automatico:": "Automatic operation:",
- "Auto-attivazione:": "Auto-activation:",
- "Caricamento automatico:": "Automatic loading:",
- "Devi elencare manualmente i cookie tracciati da questi script nella": "You must manually list the cookies tracked by these scripts in the",
- "Pagina Cookie": "Cookie Page",
- "Database '%s' non esiste. Crealo prima di procedere.": "Database '%s' does not exist. Please create it before proceeding.",
- "File dati iniziali per la lingua selezionata non trovato: %s": "Initial data file for the selected language not found: %s",
- "%s è richiesto": "%s is required",
- "%s è richiesta": "%s is required",
- "%s deve essere di almeno 8 caratteri": "%s must be at least 8 characters",
- "%s non può superare i 72 caratteri": "%s cannot exceed 72 characters",
- "%s non è valido": "%s is not valid",
- "Schema non importato correttamente. Tabelle mancanti: %s": "Schema not imported correctly. Missing tables: %s",
- "Schema incompleto: trovate %d tabelle su %d attese.": "Incomplete schema: found %d tables out of %d expected.",
- "Errore verifica tabelle: %s": "Error verifying tables: %s",
- "Installazione database non completa. Tabelle mancanti: %s": "Database installation incomplete. Missing tables: %s",
- "Installazione database non completa. Trovate %d tabelle, attese %d": "Database installation incomplete. Found %d tables, expected %d",
- "Dati di classificazione mancanti": "Classification data missing",
- "Dati generi mancanti": "Genre data missing",
- "Le password non corrispondono": "Passwords do not match",
- "Requisito '%s' non soddisfatto": "Requirement '%s' not met",
- "Non è possibile creare la directory: %s": "Cannot create directory: %s",
- "Directory non scrivibile: %s": "Directory not writable: %s",
- "Il file supera la dimensione massima consentita": "File exceeds maximum allowed size",
- "Errore sconosciuto durante il caricamento": "Unknown error during upload",
- "Il file supera la dimensione massima di %s MB": "File exceeds maximum size of %s MB",
- "Tipo di file non consentito. Sono ammessi solo: %s": "File type not allowed. Only allowed: %s",
- "Troppi errori durante l'import dello schema (%d errori). Primi errori:\n%s": "Too many errors during schema import (%d errors). First errors:\n%s",
- "Troppi errori durante l'import dei dati (%d errori). Primi errori:\n%s": "Too many errors during data import (%d errors). First errors:\n%s",
- "Impossibile determinare l'ID del plugin Open Library.": "Unable to determine Open Library plugin ID.",
- "Tutte le copie in prestito": "All copies on loan",
- "Tutte le copie prenotate": "All copies reserved",
- "Tutte le copie di questo libro hanno già un prestito attivo o prenotato. Attendi che una copia venga restituita.": "All copies of this book already have an active or scheduled loan. Please wait for a copy to be returned.",
- "Copie disponibili": "Copies available",
- "Nessuna copia disponibile nelle date richieste": "No copies available for the requested dates",
- "Le date rosse o arancioni non sono disponibili. La richiesta verrà valutata da un amministratore.": "Red or orange dates are not available. The request will be evaluated by an administrator.",
- "Sono stati rilevati problemi di integrità": "Integrity issues were detected",
- "Clicca su \\\"Esegui Manutenzione\\\" per correggere automaticamente i problemi riparabili.": "Click \\\"Run Maintenance\\\" to automatically fix resolvable issues.",
- "Ricalcola Disponibilità": "Recalculate Availability",
- "Aggiorna il conteggio delle copie disponibili": "Update available copy counts",
- "Correggi Problemi": "Fix Issues",
- "Ripara automaticamente gli errori rilevati": "Automatically repair detected errors",
- "Manutenzione Completa": "Full Maintenance",
- "Esegui tutte le operazioni di manutenzione": "Run all maintenance operations",
- "Vuoi correggere automaticamente i problemi di integrità rilevati?": "Do you want to automatically fix the detected integrity issues?",
- "Vuoi eseguire la manutenzione completa del sistema? Questa operazione potrebbe richiedere alcuni minuti.": "Do you want to run full system maintenance? This may take a few minutes.",
- "Prenotazione sovrapposta a prestito": "Reservation overlaps with a loan",
- "Prenotazioni sovrapposte": "Overlapping reservations",
- "Sì, correggi": "Yes, fix",
- "Sì, esegui": "Yes, run",
- "Elaborazione...": "Processing...",
- "Operazione fallita": "Operation failed",
- "Processing...": "Processing...",
- "Operation completed": "Operation completed",
- "Operation failed": "Operation failed",
- "Communication error with the server": "Communication error with the server",
- "Do you want to automatically fix the detected integrity issues?": "Do you want to automatically fix the detected integrity issues?",
- "Do you want to run full system maintenance? This may take a few minutes.": "Do you want to run full system maintenance? This may take a few minutes.",
- "Confirm?": "Confirm?",
- "Yes, fix": "Yes, fix",
- "Yes, run": "Yes, run",
- "Cancel": "Cancel",
- "Connessione database non disponibile": "Database connection not available",
- "File .env non trovato": ".env file not found",
- "Impossibile caricare configurazione database": "Unable to load database configuration",
- "Errore connessione database": "Database connection error",
- "Il tuo sistema Pinakes per catalogare, gestire e condividere la tua collezione libraria.": "Your Pinakes system to catalog, manage, and share your book collection.",
- "Eventi e Incontri": "Events and Meetings",
- "ordine:": "order:",
- "Traduttore": "Translator",
- "Nome del traduttore (se applicabile)": "Translator name (if applicable)",
- "Illustratore": "Illustrator",
- "Nome dell'illustratore (se applicabile)": "Illustrator name (if applicable)",
- "Curatore": "Curator",
- "Nome del curatore dell'opera (se applicabile)": "Curator name (if applicable)",
- "es. Gianni De Conno": "e.g. Gianni De Conno",
- "es. Mario Rossi": "e.g. Mario Rossi",
- "Lingua non supportata": "Unsupported language",
- "Lingue valide": "Valid languages",
- "(codici ISO e nomi inglesi accettati)": "(ISO codes and English names accepted)",
- "Copie totali": "Total copies",
- "Data creazione": "Created at",
- "Ultima modifica": "Last updated",
- "Copia %d di %d": "Copy %d of %d",
- "File caricato con successo": "File uploaded successfully",
- "Errore durante l'importazione (HTTP": "Error during import (HTTP",
- "Problemi di Configurazione": "Configuration Issues",
- "URL Canonico Mancante": "Missing Canonical URL",
- "URL Canonico Vuoto": "Empty Canonical URL",
- "URL Canonico Non Valido": "Invalid Canonical URL",
- "Applica Fix": "Apply Fix",
- "Problemi di Integrità Database": "Database Integrity Issues",
- "Tipo di issue non valido": "Invalid issue type",
- "L'URL fornito non è valido": "The provided URL is not valid",
- "Impossibile leggere il file .env": "Cannot read .env file",
- "Impossibile scrivere nel file .env": "Cannot write to .env file",
- "Configurazione aggiornata con successo!": "Configuration updated successfully!",
- "Errore durante l'applicazione del fix:": "Error while applying fix:",
- "Applicazione del fix...": "Applying fix...",
- "Fix applicato": "Fix applied",
- "Sì, applica": "Yes, apply",
- "Vuoi impostare APP_CANONICAL_URL a:": "Do you want to set APP_CANONICAL_URL to:",
- "Gestisci i tuoi prestiti, esplora il catalogo e scopri nuovi titoli.": "Manage your loans, explore the catalog and discover new titles.",
- "Nessun libro recente": "No recent books",
- "Non ci sono nuovi arrivi al momento.": "No new arrivals at the moment.",
- "Non hai prestiti in corso al momento.": "You have no active loans at the moment.",
- "%d giorni": "%d days",
- "Email verificata con successo! Il tuo account è ora in attesa di approvazione da parte dell'amministratore. Riceverai un'email quando sarà attivato.": "Email verified successfully! Your account is now pending administrator approval. You will receive an email when it is activated.",
- "Il link di verifica email è scaduto o non valido. Registrati nuovamente per ricevere un nuovo link.": "The email verification link has expired or is invalid. Please register again to receive a new link.",
- "Il link di verifica non è valido. Assicurati di aver copiato l'intero link dall'email.": "The verification link is not valid. Make sure you copied the entire link from the email.",
- "La mia bacheca": "My Dashboard",
- "La modalità manutenzione non era attiva": "Maintenance mode was not active",
- "Modalità manutenzione disattivata": "Maintenance mode disabled",
- "Se il sito resta in manutenzione, elimina il file": "If the site stays in maintenance, delete the file",
- "Server in manutenzione. Attendi il completamento dell'aggiornamento.": "Server in maintenance. Wait for the update to complete.",
- "Creazione indici di ottimizzazione...": "Creating optimization indexes...",
- "Indici di ottimizzazione creati OK": "Optimization indexes created OK",
- "Nessun libro selezionato": "No books selected",
- "Stato non valido": "Invalid status",
- "ID libri non validi": "Invalid book IDs",
- "Stato aggiornato per %d libri": "Status updated for %d books",
- "%d libri eliminati": "%d books deleted",
- "%d autori eliminati": "%d authors deleted",
- "%d editori eliminati": "%d publishers deleted",
- "Impossibile eliminare: alcuni libri hanno prestiti attivi": "Cannot delete: some books have active loans",
- "Impossibile eliminare: alcuni editori hanno libri associati": "Cannot delete: some publishers have associated books",
- "ISBN o EAN...": "ISBN or EAN...",
- "autori. Questa azione non può essere annullata.": "authors. This action cannot be undone.",
- "autori. Tutti i libri verranno assegnati all'autore risultante.": "authors. All books will be assigned to the resulting author.",
- "editori. Questa azione non può essere annullata.": "publishers. This action cannot be undone.",
- "editori. Tutti i libri verranno assegnati all'editore risultante.": "publishers. All books will be assigned to the resulting publisher.",
- "libri. Questa azione non può essere annullata.": "books. This action cannot be undone.",
- "I libri degli altri autori verranno assegnati a questo": "Books from other authors will be assigned to this one",
- "I libri degli altri editori verranno assegnati a questo": "Books from other publishers will be assigned to this one",
- "Nessun autore selezionato": "No authors selected",
- "Nessun editore selezionato": "No publishers selected",
- "ID autori non validi": "Invalid author IDs",
- "ID editori non validi": "Invalid publisher IDs",
- "Ottimizzazione Indici Database": "Database Index Optimization",
- "Ottimizzato": "Optimized",
- "%d Indici Mancanti": "%d Missing Indexes",
- "Il database è già ottimizzato!": "The database is already optimized!",
- "Tutti gli indici di performance sono presenti.": "All performance indexes are present.",
- "Perché servono questi indici?": "Why are these indexes needed?",
- "Gli indici migliorano significativamente le performance delle query, specialmente su tabelle con molti record. Le installazioni recenti li includono già, ma le installazioni più vecchie potrebbero non averli.": "Indexes significantly improve query performance, especially on tables with many records. Recent installations already include them, but older installations may not have them.",
- "Tabella": "Table",
- "Nome Indice": "Index Name",
- "Colonne": "Columns",
- "Crea Indici Automaticamente": "Create Indexes Automatically",
- "Scarica Script SQL": "Download SQL Script",
- "Creazione indici...": "Creating indexes...",
- "Vuoi creare gli indici mancanti? Questa operazione migliorerà le performance del database.": "Do you want to create the missing indexes? This operation will improve database performance.",
- "Sì, crea indici": "Yes, create indexes",
- "Indici creati:": "Indexes created:",
- "Errori:": "Errors:",
- "Indici creati con successo": "Indexes created successfully",
- "%d indici creati con successo": "%d indexes created successfully",
- "Errore durante la creazione degli indici": "Error while creating indexes",
- "Errore durante la creazione degli indici:": "Error while creating indexes:",
- "%d indici mancanti trovati": "%d missing indexes found",
- "Cerca per titolo, ISBN o EAN": "Search by title, ISBN or EAN",
- "%d copie disponibili su %d": "%d copies available out of %d",
- "1 copia disponibile su %d": "1 copy available out of %d",
- "Nessuna copia registrata": "No copies registered",
- "Disponibile nella data selezionata": "Available on selected date",
- "Non disponibile nella data selezionata": "Not available on selected date",
- "Prima data disponibile: %s": "First available date: %s",
- "Seleziona un libro per vedere la disponibilità": "Select a book to see availability",
- "Calendario Disponibilità": "Availability Calendar",
- "visualizzazione per copia": "view by copy",
- "In prestito fino al": "On loan until",
- "Libro '%s' (ID: %d) ha copie disponibili negative: %d": "Book '%s' (ID: %d) has negative available copies: %d",
- "Libro '%s' (ID: %d) ha più copie disponibili (%d) che totali (%d)": "Book '%s' (ID: %d) has more available copies (%d) than total (%d)",
- "Prestito ID %d riferisce libro/utente inesistente (libro: %d, utente: %d)": "Loan ID %d references non-existent book/user (book: %d, user: %d)",
- "Prestito ID %d attivo senza data scadenza": "Active loan ID %d has no due date",
- "Libro '%s' (ID: %d) ha stato '%s' ma copie disponibili: %d": "Book '%s' (ID: %d) has status '%s' but available copies: %d",
- "Prenotazione ID %d si sovrappone al prestito ID %d per il libro %d": "Reservation ID %d overlaps with loan ID %d for book %d",
- "Prenotazioni ID %d e %d si sovrappongono per il libro %d": "Reservations ID %d and %d overlap for book %d",
- "Prenotazione ID %d scaduta il %s ma ancora attiva": "Reservation ID %d expired on %s but still active",
- "Libro ID %d ha posizioni coda non sequenziali: %s": "Book ID %d has non-sequential queue positions: %s",
- "Prestito ID %d da prenotazione in attesa da %d giorni (libro %d)": "Loan ID %d from reservation pending for %d days (book %d)",
- "Prestito ID %d con stato '%s' ha ancora attivo = 1": "Loan ID %d with status '%s' still has active = 1",
- "APP_CANONICAL_URL non configurato nel file .env. Link nelle email potrebbero non funzionare correttamente. Valore suggerito: %s": "APP_CANONICAL_URL not configured in .env file. Email links may not work correctly. Suggested value: %s",
- "Aggiungi al file .env: APP_CANONICAL_URL=%s": "Add to .env file: APP_CANONICAL_URL=%s",
- "APP_CANONICAL_URL configurato ma vuoto nel file .env. Link nelle email useranno fallback a HTTP_HOST. Valore suggerito: %s": "APP_CANONICAL_URL configured but empty in .env file. Email links will use HTTP_HOST fallback. Suggested value: %s",
- "Imposta nel file .env: APP_CANONICAL_URL=%s": "Set in .env file: APP_CANONICAL_URL=%s",
- "APP_CANONICAL_URL configurato con valore non valido: '%s'. Link nelle email potrebbero non funzionare. Valore suggerito: %s": "APP_CANONICAL_URL configured with invalid value: '%s'. Email links may not work. Suggested value: %s",
- "Correggi nel file .env: APP_CANONICAL_URL=%s": "Fix in .env file: APP_CANONICAL_URL=%s",
- "Prestito non trovato": "Loan not found",
- "Prestito validato e aggiornato": "Loan validated and updated",
- "Errore validazione prestito:": "Loan validation error:",
- "Errore correzione dati:": "Data correction error:",
- "Errore creazione indici:": "Index creation error:",
- "Indice %s creato su %s": "Index %s created on %s",
- "Errore creazione %s su %s:": "Error creating %s on %s:",
- "Eccezione creazione %s su %s:": "Exception creating %s on %s:",
- "Dati libro recuperati con successo da Open Library": "Book data successfully retrieved from Open Library",
- "Libro non trovato nel database Open Library": "Book not found in Open Library database",
- "Calendario Prestiti e Prenotazioni": "Loans and Reservations Calendar",
- "Sincronizza (ICS)": "Sync (ICS)",
- "Copia Link": "Copy Link",
- "Prestiti programmati": "Scheduled Loans",
- "Prestiti scaduti": "Overdue Loans",
- "Creata il": "Created on",
- "Mese": "Month",
- "Settimana": "Week",
- "Lista": "List",
- "Programmato": "Scheduled",
- "L'URL del calendario è stato copiato negli appunti.": "The calendar URL has been copied to clipboard.",
- "Prestito Programmato": "Scheduled Loan",
- "Prestito Scaduto": "Overdue Loan",
- "Richiesta Pendente": "Pending Request",
- "Calendario non disponibile": "Calendar not available",
- "Errore lettura calendario": "Calendar read error",
- "Inizio": "Start",
- "Oggi": "Today",
- "Prestiti in corso": "Active Loans",
- "Sicurezza Automatica": "Automatic Security",
- "L'accesso alla cartella installer è automaticamente bloccato dopo l'installazione.": "Access to the installer folder is automatically blocked after installation.",
- "Il file": "The file",
- "nella root del progetto impedisce qualsiasi accesso non autorizzato.": "in the project root prevents any unauthorized access.",
- "SBN Italia - Integrato": "SBN Italy - Integrated",
- "Il catalogo SBN (OPAC Nazionale Italiano) è già integrato e viene interrogato automaticamente durante l'importazione ISBN. Non è necessario aggiungerlo come server esterno.": "The SBN catalog (Italian National OPAC) is already integrated and automatically queried during ISBN import. No need to add it as an external server.",
- "Server Esterni SRU": "External SRU Servers",
- "Server SRU aggiuntivi per Copy Cataloging. SBN Italia è già integrato (vedi sopra).": "Additional SRU servers for Copy Cataloging. SBN Italy is already integrated (see above).",
- "Inserimento Manuale Dewey": "Manual Dewey Entry",
- "es. 599.9, 004.6782, 641.5945": "e.g. 599.9, 004.6782, 641.5945",
- "es. 599.9, 004.6782, 641.5945, 599.1": "e.g. 599.9, 004.6782, 641.5945, 599.1",
- "Inserisci il codice Dewey completo (supporta fino a 4 decimali)": "Enter the complete Dewey code (supports up to 4 decimal digits)",
- "Inserisci qualsiasi codice Dewey (anche se non presente nell'elenco)": "Enter any Dewey code (even if not in the list)",
- "Oppure naviga per categorie:": "Or browse by categories:",
- "Oppure naviga per categorie": "Or browse by categories",
- "Classificazione selezionata:": "Selected classification:",
- "Codice Dewey trovato e impostato": "Dewey code found and set",
- "Codice Dewey non trovato": "Dewey code not found",
- "Errore nel recupero dei figli": "Error retrieving children",
- "Usa gli endpoint specifici per il formato legacy": "Use specific endpoints for legacy format",
- "Parametro code obbligatorio.": "Code parameter required.",
- "Codice parent non trovato.": "Parent code not found.",
- "Codice Dewey": "Dewey Code",
- "Inserisci un codice Dewey": "Enter a Dewey code",
- "Formato codice non valido": "Invalid code format",
- "Usa formato: 599 oppure 599.9 oppure 599.93": "Use format: 599 or 599.9 or 599.93",
- "Formato codice non valido. Usa formato: 599 oppure 599.9 oppure 599.93": "Invalid code format. Use format: 599 or 599.9 or 599.93",
- "Questo endpoint è supportato solo per il formato Dewey legacy. Usa /api/dewey/children.": "This endpoint is only supported for the legacy Dewey format. Use /api/dewey/children.",
- "Errore nella lettura del backup.": "Error reading backup file.",
- "Formato dati non valido.": "Invalid data format.",
- "Errore nella lettura del file.": "Error reading file.",
- "Errore nella lettura del file Dewey esistente.": "Error reading existing Dewey file.",
- "File Dewey esistente non è un JSON valido o è corrotto.": "Existing Dewey file is not valid JSON or is corrupted.",
- "Errore nella codifica JSON.": "JSON encoding error.",
- "Attiva questa opzione solo se il tuo server supporta HTTPS. Se il tuo hosting forza già HTTPS automaticamente, non è necessario abilitarla (potrebbe causare redirect loop).": "Enable this option only if your server supports HTTPS. If your hosting already forces HTTPS automatically, you don't need to enable it (may cause redirect loop).",
- "Locale non supportato.": "Unsupported locale.",
- "File Dewey non trovato.": "Dewey file not found.",
- "Errore nel parsing del file JSON.": "Error parsing JSON file.",
- "Errori di validazione.": "Validation errors.",
- "Errore nel salvataggio del file.": "Error saving file.",
- "Salvato con successo.": "Saved successfully.",
- "Dati validi.": "Valid data.",
- "Errori di validazione nel file importato.": "Validation errors in imported file.",
- "Importato con successo. %d voci totali.": "Imported successfully. %d total entries.",
- "Nome file non valido.": "Invalid filename.",
- "Backup non trovato.": "Backup not found.",
- "Errore nel ripristino.": "Error during restore.",
- "Backup ripristinato con successo.": "Backup restored successfully.",
- "JSON non valido.": "Invalid JSON.",
- "Nessun dato.": "No data.",
- "Errore nel caricamento.": "Error loading.",
- "Ripristinato": "Restored",
- "Aggiungi decimale": "Add decimal",
- "I dati devono essere un array non vuoto.": "Data must be a non-empty array.",
- "Nodo mancante di codice a profondità %d.": "Node missing code at depth %d.",
- "Il codice %s ha un nome non valido (minimo 2 caratteri).": "Code %s has an invalid name (minimum 2 characters).",
- "Il codice %s ha un livello non valido (deve essere 1-7).": "Code %s has an invalid level (must be 1-7).",
- "Il codice %s ha un formato non valido.": "Code %s has an invalid format.",
- "Il codice %s è duplicato.": "Code %s is duplicated.",
- "Il codice %s non è un figlio valido di %s.": "Code %s is not a valid child of %s.",
- "Classe principale mancante: %s.": "Missing main class: %s.",
- "Importato": "Imported",
- "Modifiche non salvate": "Unsaved changes",
- "Nome della classificazione": "Classification name",
- "Formato codice non valido. Usa: XXX.Y (es. 599.1)": "Invalid code format. Use: XXX.Y (e.g. 599.1)",
- "Errore nel caricamento dei backup.": "Error loading backups.",
- "I dati attuali verranno sostituiti.": "Current data will be replaced.",
- "Ripristinare questo backup?": "Restore this backup?",
- "Questo codice esiste già.": "This code already exists.",
- "Formato JSON non valido": "Invalid JSON format",
- "Sessioni attive": "Active sessions",
- "Gestisci i dispositivi su cui hai effettuato l'accesso con 'Ricordami'. Puoi disconnetterti da singoli dispositivi o da tutti contemporaneamente.": "Manage the devices you've logged in with 'Remember Me'. You can sign out from individual devices or all at once.",
- "Caricamento sessioni...": "Loading sessions...",
- "Nessuna sessione attiva. Le sessioni vengono create quando accedi con 'Ricordami' selezionato.": "No active sessions. Sessions are created when you log in with 'Remember Me' selected.",
- "Sessione corrente": "Current session",
- "Ultimo utilizzo": "Last used",
- "Creata": "Created",
- "Scade": "Expires",
- "Disconnetti": "Sign out",
- "Disconnetti tutti": "Sign out all",
- "Vuoi disconnettere questo dispositivo?": "Do you want to sign out this device?",
- "Vuoi disconnettere tutti i dispositivi? Dovrai effettuare nuovamente l'accesso su ogni dispositivo.": "Do you want to sign out all devices? You will need to log in again on each device.",
- "Dispositivo sconosciuto": "Unknown device",
- "sessioni attive": "active sessions",
- "La richiesta ha impiegato troppo tempo. Riprova.": "The request took too long. Please try again.",
- "Sessione revocata": "Session revoked",
- "Impossibile revocare la sessione": "Unable to revoke session",
- "Revocate %d sessioni": "Revoked %d sessions",
- "ID sessione non valido": "Invalid session ID",
- "Non autorizzato": "Unauthorized",
- "Tabelle di Sistema": "System Tables",
- "Complete": "Complete",
- "%d Tabelle Mancanti": "%d Missing Tables",
- "Tutte le tabelle di sistema sono presenti!": "All system tables are present!",
- "Il sistema di aggiornamento è pronto.": "The update system is ready.",
- "Tabelle richieste per l'aggiornamento": "Tables required for updates",
- "Queste tabelle sono necessarie per tracciare gli aggiornamenti e le migrazioni del database.": "These tables are required to track updates and database migrations.",
- "Cronologia degli aggiornamenti eseguiti": "History of executed updates",
- "Registro delle migrazioni database applicate": "Registry of applied database migrations",
- "Crea Tabelle Mancanti": "Create Missing Tables",
- "Creazione tabelle...": "Creating tables...",
- "Vuoi creare le tabelle di sistema mancanti? Queste sono necessarie per il sistema di aggiornamento.": "Do you want to create the missing system tables? These are required for the update system.",
- "Sì, crea tabelle": "Yes, create tables",
- "Tabelle create:": "Tables created:",
- "%d tabelle create con successo": "%d tables created successfully",
- "Errore durante la creazione delle tabelle:": "Error creating tables:",
- "Tabella %s creata": "Table %s created",
- "Errore creazione tabella %s:": "Error creating table %s:",
- "Eccezione creazione tabella %s:": "Exception creating table %s:",
- "Errore riassegnazione copia": "Copy reassignment error",
- "Errore riassegnazione copia persa": "Lost copy reassignment error",
- "Impossibile notificare utente: dati mancanti": "Cannot notify user: missing data",
- "Notifica prenotazione disponibile inviata": "Reservation available notification sent",
- "Invio notifica prenotazione fallito": "Reservation notification failed",
- "Impossibile notificare utente copia non disponibile": "Cannot notify user copy unavailable",
- "La copia assegnata è stata segnalata come persa o danneggiata": "The assigned copy has been reported as lost or damaged",
- "La prenotazione è scaduta": "The reservation has expired",
- "La copia non è più disponibile": "The copy is no longer available",
- "Prenotazione: copia non disponibile": "Reservation: copy unavailable",
- "Prenotazione per \"%s\" (utente: %s) messa in attesa. %s.": "Reservation for \"%s\" (user: %s) put on hold. %s.",
- "Notifica copia non disponibile creata": "Copy unavailable notification created",
- "Errore gestione cambio stato copia": "Copy status change handling error",
- "DataIntegrity warning (store loan)": "DataIntegrity warning (store loan)",
- "Notifica prestito fallita": "Loan notification failed",
- "Validazione prestito fallita": "Loan validation failed",
- "Riassegnazione copia fallita": "Copy reassignment failed",
- "Errore elaborazione restituzione": "Return processing error",
- "Rinnovo prestito fallito": "Loan renewal failed",
- "Errore export CSV": "CSV export error",
- "Errore annullamento prestito": "Loan cancellation error",
- "Errore annullamento prenotazione": "Reservation cancellation error",
- "Errore modifica data prenotazione": "Reservation date change error",
- "Notifica richiesta prestito fallita": "Loan request notification failed",
- "Errore richiesta prestito": "Loan request error",
- "Errore prenotazione": "Reservation error",
- "Riassegnazione prenotazione nuova copia fallita": "New copy reservation reassignment failed",
- "Elaborazione lista attesa fallita": "Waitlist processing failed",
- "La tua prenotazione per \"%s\" è stata messa in attesa. %s. Verrai notificato quando sarà disponibile una nuova copia.": "Your reservation for \"%s\" has been put on hold. %s. You will be notified when a new copy becomes available.",
- "Esauriti tentativi riassegnazione copia": "Exhausted copy reassignment attempts",
- "Errore gestione copia non disponibile": "Copy unavailable handling error",
- "Errore invio notifica differita": "Deferred notification send error",
- "Da Ritirare": "Ready for Pickup",
- "Conferma Ritiro": "Confirm Pickup",
- "L'utente ha ritirato il libro?": "Has the user picked up the book?",
- "Ritiro confermato! Il prestito è ora in corso.": "Pickup confirmed! The loan is now active.",
- "Errore nella conferma del ritiro": "Error confirming pickup",
- "Giorni per ritirare un prestito approvato": "Days to pick up an approved loan",
- "Ritiro confermato con successo": "Pickup confirmed successfully",
- "Prestito non trovato o non pronto per il ritiro": "Loan not found or not ready for pickup",
- "Recati in biblioteca durante gli orari di apertura per ritirare il libro.": "Visit the library during opening hours to pick up the book.",
- "Pronto per il ritiro": "Ready for Pickup",
- "Ritiro scaduto": "Pickup Expired",
- "Inviata quando un prestito è stato approvato e il libro è pronto per il ritiro.": "Sent when a loan has been approved and the book is ready for pickup.",
- "Inviata quando il tempo per ritirare un libro è scaduto e il prestito è stato annullato.": "Sent when the pickup deadline has passed and the loan has been cancelled.",
- "Scadenza ritiro": "Pickup deadline",
- "Prestiti in attesa di ritiro attivati": "Loans ready for pickup activated",
- "Ritiri scaduti elaborati": "Expired pickups processed",
- "Prestito pronto per ritiro non trovato": "Loan ready for pickup not found",
- "Errore attivazione prestito schedulato": "Scheduled loan activation error",
- "Errore elaborazione ritiro scaduto": "Expired pickup processing error",
- "Il termine per il ritiro è scaduto": "The pickup deadline has passed",
- "Ritiro non effettuato entro il termine previsto": "Pickup not completed within the deadline",
- "Ritiro già confermato o modificato": "Pickup already confirmed or modified",
- "Prestito già modificato da altra richiesta": "Loan already modified by another request",
- "Errore invio notifica ritiro scaduto": "Error sending pickup expired notification",
- "Nessun prestito in attesa di ritiro": "No loans waiting for pickup",
- "Gestisci tutti": "Manage all",
- "Ritiro annullato": "Pickup cancelled",
- "Inviata quando un ritiro viene annullato dall'amministratore.": "Sent when a pickup is cancelled by an administrator.",
- "Prestito non trovato o non cancellabile": "Loan not found or cannot be cancelled",
- "Ritiro annullato con successo": "Pickup cancelled successfully",
- "Ritiro non effettuato": "Pickup not completed",
- "Errore durante l'annullamento del ritiro": "Error cancelling pickup",
- "Prestito senza copia assegnata - contattare l'amministratore": "Loan has no assigned copy - contact administrator",
- "(opzionale - max 200 caratteri)": "(optional - max 200 characters)",
- "(opzionale - max 70 caratteri)": "(optional - max 70 characters)",
- "(percorso legacy)": "(legacy path)",
- "+ Aggiungi da preset...": "+ Add from preset...",
- "1 evento": "1 event",
- "API Key già configurata": "API Key already configured",
- "API configurata": "API configured",
- "Abilita Client SRU": "Enable SRU Client",
- "Abilita Plugin": "Enable Plugin",
- "Abilita Server SRU": "Enable SRU Server",
- "Accedi e Procedi": "Login and Continue",
- "Accesso negato. Permessi insufficienti.": "Access denied. Insufficient permissions.",
- "Acquisito a": "Acquired at",
- "Acquisito da": "Acquired from",
- "Aggiornamento disponibile!": "Update available!",
- "Aggiunti di recente al catalogo": "Recently added to catalog",
- "Anni di Vita": "Years of Life",
- "Anno a": "Year to",
- "Anno da": "Year from",
- "Annulla Prestito": "Cancel Loan",
- "Annulla Prestito Scaduto": "Cancel Expired Loan",
- "Annullare il prestito scaduto?": "Cancel the expired loan?",
- "Applicazione già installata": "Application already installed",
- "Approvato il %s": "Approved on %s",
- "Article (Articolo/Blog)": "Article (Article/Blog)",
- "Autenticazione Admin Richiesta": "Admin Authentication Required",
- "Autenticazione Richiesta": "Authentication Required",
- "Autenticazione richiesta.": "Authentication required.",
- "Autore non specificato": "Author not specified",
- "Backup creato!": "Backup created!",
- "Backup eliminato con successo": "Backup deleted successfully",
- "Cambia vista": "Change view",
- "Cancella": "Clear",
- "Caricamento del logo non riuscito. Verifica le dimensioni e il formato del file.": "Logo upload failed. Check file size and format.",
- "Cerca...": "Search...",
- "Codice scaffale obbligatorio": "Shelf code required",
- "Collocazione:": "Location:",
- "Compila tutti i campi obbligatori.": "Fill in all required fields.",
- "Confermare il ritiro?": "Confirm pickup?",
- "Confermi di voler attivare direttamente questo utente senza richiedere verifica email?": "Are you sure you want to directly activate this user without requiring email verification?",
- "Configura API": "Configure API",
- "Configura Z39.50": "Configure Z39.50",
- "Consigliato: Summary Large Image per homepage.": "Recommended: Summary Large Image for homepage.",
- "Contenuto della pagina": "Page content",
- "Controlla la tua casella di posta e clicca sul link per resettare la password. Il link sarà valido per 2 ore.": "Check your inbox and click the link to reset your password. The link will be valid for 2 hours.",
- "Controllo pre-aggiornamento fallito": "Pre-update check failed",
- "Copertina del libro \"%s\"": "Book cover for \"%s\"",
- "Copia eliminata con successo.": "Copy deleted successfully.",
- "Copia non trovata.": "Copy not found.",
- "Crea Backup": "Create Backup",
- "Credenziali": "Credentials",
- "Credenziali non valide o utente non admin": "Invalid credentials or user is not admin",
- "Da approvare o rifiutare": "To approve or reject",
- "Da ritirare": "Ready for pickup",
- "Data Restituzione": "Return Date",
- "Data non valida.": "Invalid date.",
- "Database installato (46 tabelle)": "Database installed (46 tables)",
- "Descrizione per Twitter/X. Se vuoto, usa la descrizione Open Graph.": "Description for Twitter/X. If empty, uses Open Graph description.",
- "Editore %s": "Publisher %s",
- "Eliminare i libri selezionati?": "Delete selected books?",
- "Eliminare il file .installed dalla root del progetto e rieseguire l'installer": "Delete the .installed file from the project root and run the installer again",
- "Email Admin": "Admin Email",
- "Endpoint SRU:": "SRU Endpoint:",
- "Errore di salvataggio. Riprova più tardi.": "Save error. Please try again later.",
- "Errore di sicurezza. Ricarica la pagina e riprova": "Security error. Reload the page and try again",
- "Errore di sicurezza. Riprova.": "Security error. Please try again.",
- "Errore durante il recupero dei dati": "Error retrieving data",
- "Errore durante il recupero delle sessioni": "Error retrieving sessions",
- "Errore durante il salvataggio delle impostazioni.": "Error saving settings.",
- "Errore durante la conferma del ritiro": "Error confirming pickup",
- "Errore durante la revoca della sessione": "Error revoking session",
- "Errore durante la revoca delle sessioni": "Error revoking sessions",
- "Errore durante la ricerca": "Error during search",
- "Errore durante la verifica dei libri associati": "Error verifying associated books",
- "Errore durante la verifica dei prestiti attivi": "Error verifying active loans",
- "Errore generazione calendario": "Calendar generation error",
- "Errore generazione PDF prestito": "Error generating loan PDF",
- "Errore interno del database": "Internal database error",
- "Errore interno del database durante la verifica": "Internal database error during verification",
- "Errore invio notifica ritiro pronto": "Error sending pickup ready notification",
- "Errore nel salvataggio del file di traduzione": "Error saving translation file",
- "Errore nel salvataggio del file route": "Error saving route file",
- "Errore nella prenotazione.": "Error creating reservation.",
- "Errore nella ricerca.": "Error during search.",
- "Errore nella richiesta di prestito.": "Error creating loan request.",
- "Esiste già un altro libro con lo stesso identificatore (ISBN/EAN).": "Another book with the same identifier (ISBN/EAN) already exists.",
- "Esiste già un libro con lo stesso identificatore (ISBN/EAN).": "A book with the same identifier (ISBN/EAN) already exists.",
- "Esplora il catalogo e scopri nuovi titoli.": "Explore the catalog and discover new titles.",
- "Esplora il nostro catalogo digitale": "Explore our digital catalog",
- "Espone il catalogo locale via protocollo SRU per altre biblioteche.": "Exposes local catalog via SRU protocol for other libraries.",
- "File backup non trovato": "Backup file not found",
- "File di aggiornamento non valido (troppo piccolo)": "Invalid update file (too small)",
- "File di log non trovato": "Log file not found",
- "File troppo grande. Dimensione massima 5MB.": "File too large. Maximum size 5MB.",
- "Formato richiesta non valido": "Invalid request format",
- "Genere creato con successo!": "Genre created successfully!",
- "Google Books API collegata": "Google Books API connected",
- "Hai già una prenotazione attiva per questo libro.": "You already have an active reservation for this book.",
- "Hai già una richiesta di prestito in attesa per questo libro": "You already have a pending loan request for this book",
- "Hai già un prestito attivo o in attesa per questo libro": "You already have an active or pending loan for this book",
- "ID genere non valido": "Invalid genre ID",
- "IN RITARDO": "OVERDUE",
- "ISBN non trovato. Fonti consultate: %s": "ISBN not found. Sources consulted: %s",
- "Il download dovrebbe iniziare automaticamente": "Download should start automatically",
- "Il termine per il ritiro è scaduto. Vuoi annullare questo prestito?": "The pickup deadline has passed. Do you want to cancel this loan?",
- "Immagine Twitter": "Twitter Image",
- "Immagine per Twitter/X. Dimensioni consigliate: 1200x675px o 1200x1200px. Se vuoto, usa l'immagine Open Graph.": "Image for Twitter/X. Recommended dimensions: 1200x675px or 1200x1200px. If empty, uses Open Graph image.",
- "Importante:": "Important:",
- "Impossibile acquisire il lock. Riprova tra qualche secondo.": "Unable to acquire lock. Please try again in a few seconds.",
- "Impossibile creare la mensola. Riprova più tardi.": "Unable to create shelf. Please try again later.",
- "Impossibile creare lo scaffale. Riprova più tardi.": "Unable to create bookcase. Please try again later.",
- "Impossibile eliminare il libro: ci sono prestiti o prenotazioni attive. Termina prima i prestiti/prenotazioni.": "Cannot delete book: there are active loans or reservations. End loans/reservations first.",
- "Impossibile eliminare una copia attualmente in prestito.": "Cannot delete a copy currently on loan.",
- "Impossibile eliminare: la mensola contiene libri": "Cannot delete: shelf contains books",
- "Impossibile eliminare: lo scaffale contiene libri": "Cannot delete: bookcase contains books",
- "Impossibile eliminare: lo scaffale contiene mensole": "Cannot delete: bookcase contains shelves",
- "Impossibile leggere il file di log": "Unable to read log file",
- "Impossibile modificare una copia attualmente in prestito. Prima termina il prestito o imposta lo stato su \"Disponibile\" per chiuderlo automaticamente.": "Cannot edit a copy currently on loan. First end the loan or set status to \"Available\" to close it automatically.",
- "Impossibile riaprire il file ZIP": "Unable to reopen ZIP file",
- "Impossibile ricalcolare la disponibilità del libro.": "Unable to recalculate book availability.",
- "Impossibile salvare le impostazioni.": "Unable to save settings.",
- "Impostazioni API Book Scraper salvate correttamente.": "Book Scraper API settings saved successfully.",
- "Impostazioni Z39.50 salvate correttamente.": "Z39.50 settings saved successfully.",
- "In Attesa": "Pending",
- "In scadenza": "Expiring soon",
- "Indice ISBN": "ISBN Index",
- "Inserisci una breve biografia dell'autore...": "Enter a brief author biography...",
- "L'applicazione risulta correttamente configurata.": "The application is correctly configured.",
- "L'installazione è stata completata correttamente e tutte le verifiche sono andate a buon fine.": "Installation completed successfully and all verifications passed.",
- "La data non può essere nel passato.": "Date cannot be in the past.",
- "La pagina che stai cercando non esiste.": "The page you are looking for does not exist.",
- "La password deve contenere almeno una lettera maiuscola, una minuscola e un numero.": "Password must contain at least one uppercase letter, one lowercase letter and a number.",
- "La password deve contenere maiuscole, minuscole e numeri.": "Password must contain uppercase, lowercase and numbers.",
- "La password deve essere lunga almeno 8 caratteri.": "Password must be at least 8 characters long.",
- "La password non può superare i 72 caratteri.": "Password cannot exceed 72 characters.",
- "La password attuale non è corretta.": "Current password is incorrect.",
- "Le password non coincidono.": "Passwords do not match.",
- "Le sessioni scadono automaticamente per proteggere i tuoi dati.": "Sessions expire automatically to protect your data.",
- "Letta": "Read",
- "Libri attualmente in prestito": "Books currently on loan",
- "Libri prenotati dagli utenti": "Books reserved by users",
- "MaintenanceService errore ritiri scaduti": "MaintenanceService expired pickups error",
- "MaintenanceService errore scadenza ritiro": "MaintenanceService pickup expiration error",
- "MaintenanceService ritiro scaduto": "MaintenanceService pickup expired",
- "Mensola eliminata": "Shelf deleted",
- "Modifica Route": "Edit Route",
- "Mostra questa guida": "Show this guide",
- "Nessun editore trovato per": "No publisher found for",
- "Nessun risultato trovato per": "No results found for",
- "Nessun server configurato. Aggiungine uno per iniziare.": "No servers configured. Add one to get started.",
- "Nessuna copia disponibile per il periodo richiesto": "No copy available for the requested period",
- "Nessuna fonte di scraping disponibile. Installa almeno un plugin di scraping (es. Open Library o Scraping Pro).": "No scraping source available. Install at least one scraping plugin (e.g. Open Library or Scraping Pro).",
- "Nessuna ricerca recente": "No recent searches",
- "Nessuna richiesta da approvare": "No requests to approve",
- "Nome Server": "Server Name",
- "Nome e cognome sono obbligatori.": "First name and last name are required.",
- "Non ci sono azioni urgenti da completare.": "No urgent actions to complete.",
- "Nuova ricerca": "New search",
- "Nuovo libro": "New book",
- "Oppure accedere a /installer/?force=1 per forzare una nuova procedura": "Or go to /installer/?force=1 to force a new installation",
- "PDF generato!": "PDF generated!",
- "PDF prestito non generato": "Loan PDF not generated",
- "Passo": "Step",
- "Percorso backup non valido": "Invalid backup path",
- "Periodo": "Period",
- "Permette di importare libri (Copy Cataloging) e cercare su cataloghi esterni.": "Allows importing books (Copy Cataloging) and searching external catalogs.",
- "Personalizzato": "Custom",
- "Personalizzazione aspetto": "Appearance customization",
- "Plugin API personalizzata per scraping dati libri": "Custom API plugin for book data scraping",
- "Prenotazione": "Reservation",
- "Prenotazione effettuata con successo": "Reservation created successfully",
- "Prenotazioni attive (slot libro)": "Active reservations (book slots)",
- "Prestiti approvati in attesa di consegna": "Approved loans awaiting delivery",
- "Prestiti pronti per il ritiro": "Loans ready for pickup",
- "Prestito annullato!": "Loan cancelled!",
- "Prestito approvato - in attesa di ritiro": "Loan approved - awaiting pickup",
- "Prestito chiuso automaticamente. La copia è ora disponibile.": "Loan closed automatically. The copy is now available.",
- "Prestito già processato da un altro utente": "Loan already processed by another user",
- "Prestito prenotato con successo": "Loan reserved successfully",
- "Prestito rinnovato correttamente. Nuova scadenza: %s": "Loan renewed successfully. New due date: %s",
- "Profile (Profilo)": "Profile",
- "Puoi eliminare solo copie perse, danneggiate o in manutenzione. Prima modifica lo stato della copia.": "You can only delete lost, damaged or in maintenance copies. First change the copy status.",
- "Quando abilitato, il plugin interrogherà l'API durante l'importazione dati libri.": "When enabled, the plugin will query the API during book data import.",
- "Questa operazione cancellerà tutti i dati esistenti. Assicurati di avere un backup.": "This operation will delete all existing data. Make sure you have a backup.",
- "Questi sono i server a cui la tua biblioteca si collegherà per cercare e importare libri.": "These are the servers your library will connect to for searching and importing books.",
- "Questo plugin interroga un servizio API esterno per recuperare dati libri tramite ISBN/EAN. Ha priorità 3 (più alta di Open Library).": "This plugin queries an external API service to retrieve book data via ISBN/EAN. It has priority 3 (higher than Open Library).",
- "Ricerche recenti": "Recent searches",
- "Richiedono attenzione immediata": "Require immediate attention",
- "Richieste in Attesa": "Pending Requests",
- "Richiesto:": "Required:",
- "Ritiro confermato!": "Pickup confirmed!",
- "Ritiro scaduto il": "Pickup expired on",
- "Route aggiornate con successo": "Routes updated successfully",
- "Salva Configurazione": "Save Configuration",
- "Scadenza prenotazione": "Reservation expiration",
- "Scadenza ritiro:": "Pickup deadline:",
- "Scaduto il:": "Expired on:",
- "Scaffale creato": "Bookcase created",
- "Scaffale eliminato": "Bookcase deleted",
- "Scaffale obbligatorio": "Bookcase required",
- "Cerca globale": "Global search",
- "Chiudi popup": "Close popup",
- "Mostra scorciatoie": "Show shortcuts",
- "Navigazione": "Navigation",
- "Scorciatoie da tastiera": "Keyboard shortcuts",
- "Vai a Autori": "Go to Authors",
- "Vai a Dashboard": "Go to Dashboard",
- "Vai a Editori": "Go to Publishers",
- "Vai a Impostazioni": "Go to Settings",
- "Vai a Libri": "Go to Books",
- "Vai a Prestiti": "Go to Loans",
- "Vai a Utenti": "Go to Users",
- "poi": "then",
- "Se desideri reinstallare puoi:": "If you want to reinstall you can:",
- "Sei sicuro di voler eliminare questo messaggio?": "Are you sure you want to delete this message?",
- "Sei sicuro di voler eliminare questo utente?": "Are you sure you want to delete this user?",
- "Seleziona tutti": "Select all",
- "Sessione Scaduta": "Session Expired",
- "Si è verificato un errore di rete.": "A network error occurred.",
- "Si è verificato un errore durante il salvataggio.": "An error occurred while saving.",
- "Si è verificato un errore imprevisto.": "An unexpected error occurred.",
- "Si è verificato un errore. Riprova.": "An error occurred. Please try again.",
- "Sintassi": "Syntax",
- "Sito": "Website",
- "Statistiche aggiornate per": "Statistics updated for",
- "Stato della copia aggiornato con successo.": "Copy status updated successfully.",
- "Stato non valido.": "Invalid status.",
- "Summary (Immagine Piccola)": "Summary (Small Image)",
- "Summary Large Image (Immagine Grande)": "Summary Large Image",
- "Sì, Annulla": "Yes, Cancel",
- "Test Endpoint": "Test Endpoint",
- "Testi Banner Cookie": "Cookie Banner Texts",
- "Timeout (secondi)": "Timeout (seconds)",
- "Tipo Twitter Card": "Twitter Card Type",
- "Tipo di contenuto per Open Graph. Scegli 'Website' per la homepage.": "Content type for Open Graph. Choose 'Website' for homepage.",
- "Titolo modale": "Modal title",
- "Titolo per Twitter/X. Se vuoto, usa il titolo Open Graph.": "Title for Twitter/X. If empty, uses Open Graph title.",
- "Torna alla Home": "Return to Home",
- "Trigger database: azione manuale richiesta": "Database trigger: manual action required",
- "Tutte le richieste sono state gestite.": "All requests have been processed.",
- "Tutto sotto controllo!": "Everything under control!",
- "Twitter Cards (X)": "Twitter Cards (X)",
- "URL Endpoint API": "API Endpoint URL",
- "URL Endpoint SRU": "SRU Endpoint URL",
- "Una chiave è attualmente salvata e funzionante. Puoi aggiornarla inserendo un nuovo valore o lasciarla vuota per rimuoverla.": "A key is currently saved and working. You can update it by entering a new value or leave it empty to remove it.",
- "Upload non valido": "Invalid upload",
- "Utente eliminato con successo.": "User deleted successfully.",
- "Utente preselezionato": "Pre-selected user",
- "Vai all'applicazione": "Go to application",
- "Verifica reCAPTCHA fallita. Riprova.": "reCAPTCHA verification failed. Please try again.",
- "Vista griglia": "Grid view",
- "Vista tabella": "Table view",
- "Website (Sito Web)": "Website",
- "attivata": "activated",
- "deve iniziare con": "must start with",
- "libri eliminati": "books deleted",
- "minuti fa": "minutes ago",
- "non può contenere spazi": "cannot contain spaces",
- "non può essere vuota": "cannot be empty",
- "ore fa": "hours ago",
- "prenotazioni": "reservations",
- "secondi (min: 5, max: 60)": "seconds (min: 5, max: 60)",
- "(opzionale)": "(optional)",
- "API Key": "API Key",
- "CAP": "ZIP Code",
- "CSRF": "CSRF",
- "Close menu": "Close menu",
- "Coda": "Queue",
- "Cover": "Cover",
- "Database": "Database",
- "Export": "Export",
- "Import": "Import",
- "Library Management System": "Library Management System",
- "Search": "Search",
- "Toggle menu": "Toggle menu",
- "Toggle search": "Toggle search",
- "Import LibraryThing": "Import LibraryThing",
- "Import da LibraryThing": "Import from LibraryThing",
- "Importa i tuoi libri esportati da LibraryThing.com (formato TSV)": "Import your books exported from LibraryThing.com (TSV format)",
- "Import CSV Standard": "Standard CSV Import",
- "Carica File LibraryThing": "Upload LibraryThing File",
- "Arricchisci dati con scraping web (copertine, descrizioni, etc.)": "Enrich data with web scraping (covers, descriptions, etc.)",
- "Importa Libri": "Import Books",
- "Import in corso...": "Importing...",
- "Come Esportare da LibraryThing": "How to Export from LibraryThing",
- "Campi Supportati": "Supported Fields",
- "Gestione Plugin LibraryThing": "LibraryThing Plugin Management",
- "Completo": "Complete",
- "Incompleto": "Incomplete",
- "Campi Database": "Database Fields",
- "Il plugin è attualmente installato e funzionante.": "The plugin is currently installed and working.",
- "Disinstalla Plugin": "Uninstall Plugin",
- "ATTENZIONE: Disinstallazione Irreversibile": "WARNING: Irreversible Uninstallation",
- "Confermo di voler disinstallare il plugin e di aver effettuato un backup dei dati": "I confirm I want to uninstall the plugin and have made a backup of the data",
- "Export per LibraryThing": "Export for LibraryThing",
- "LibraryThing TSV": "LibraryThing TSV",
- "File vuoto o formato non valido": "Empty file or invalid format",
- "Il file deve avere estensione .tsv, .csv o .txt": "File must have .tsv, .csv or .txt extension",
- "Il file non sembra essere in formato LibraryThing. Colonne richieste: Book Id, Title, Primary Author, ISBNs": "File does not appear to be in LibraryThing format. Required columns: Book Id, Title, Primary Author, ISBNs",
- "Impossibile aprire il file": "Unable to open file",
- "Numero massimo di righe superato (%d)": "Maximum number of rows exceeded (%d)",
- "Copertine scaricate (LibraryThing):": "Covers downloaded (LibraryThing):",
- "Già presenti:": "Already present:",
- "Impossibile scaricare (libro senza ISBN):": "Cannot download (book has no ISBN):",
- "Copertina non trovata online:": "Cover not found online:",
- "Storico Import": "Import History",
- "Visualizza la cronologia degli import CSV e LibraryThing con report errori dettagliati": "View the history of CSV and LibraryThing imports with detailed error reports",
- "%d import registrato": "%d import recorded",
- "%d import registrati": "%d imports recorded",
- "Cronologia Import": "Import History",
- "Libri Importati": "Books Imported",
- "Aggiornati": "Updated",
- "Errori Totali": "Total Errors",
- "Data/Ora": "Date/Time",
- "Totali": "Total",
- "Importati": "Imported",
- "Durata": "Duration",
- "Scarica Errori": "Download Errors",
- "Nessun errore": "No errors",
- "Nessun import registrato": "No imports recorded",
- "Gli import CSV e LibraryThing verranno visualizzati qui": "CSV and LibraryThing imports will be displayed here",
- "Gli import vengono tracciati automaticamente durante l'elaborazione": "Imports are tracked automatically during processing",
- "Informazioni sullo Storico Import": "Import History Information",
- "Retention: 90 giorni": "Retention: 90 days",
- "I log vengono conservati per 90 giorni per conformità GDPR": "Logs are retained for 90 days for GDPR compliance",
- "Scarica il report CSV per analizzare gli errori in dettaglio": "Download the CSV report to analyze errors in detail",
- "Ogni errore include: numero riga, titolo libro, tipo errore e messaggio dettagliato": "Each error includes: line number, book title, error type and detailed message",
- "ID import mancante": "Missing import ID",
- "%d import logs eliminati (più vecchi di %d giorni)": "%d import logs deleted (older than %d days)",
- "Leggi PDF": "Read PDF",
- "Chiudi Visualizzatore": "Close Viewer",
- "Visualizzatore PDF": "PDF Viewer",
- "Usa la funzione di ricerca del browser per trovare testo nel documento": "Use your browser's search function to find text in the document",
- "Usa il controllo schermo intero del viewer o del browser": "Use the viewer or browser fullscreen control",
- "Condivisione": "Sharing",
- "Seleziona i pulsanti di condivisione da mostrare nella pagina del libro.": "Select which share buttons to show on the book page.",
- "Nessun pulsante selezionato": "No buttons selected",
- "Salva impostazioni condivisione": "Save sharing settings",
- "Impostazioni di condivisione aggiornate.": "Sharing settings updated.",
- "Condividi su X": "Share on X",
- "Condividi su Telegram": "Share on Telegram",
- "Condividi su LinkedIn": "Share on LinkedIn",
- "Condividi su Reddit": "Share on Reddit",
- "Condividi su Pinterest": "Share on Pinterest",
- "Condividi su Threads": "Share on Threads",
- "Condividi su Bluesky": "Share on Bluesky",
- "Condividi su Tumblr": "Share on Tumblr",
- "Salva su Pocket": "Save to Pocket",
- "Condividi su VK": "Share on VK",
- "Condividi su LINE": "Share on LINE",
- "Invia via SMS": "Send via SMS",
- "Invia per email": "Send by email",
- "Copia link": "Copy link",
- "Collezione: %d libri, %d autori, %d editori.": "Collection: %d books, %d authors, %d publishers.",
- "Catalogo bibliotecario gestito con [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Disponibile in: %s.": "Library catalog powered by [Pinakes](https://github.com/fabiodalez-dev/Pinakes). Available in: %s.",
- "Pagine Principali": "Main Pages",
- "Sfoglia e cerca la collezione completa": "Browse and search the full book collection",
- "Informazioni sulla biblioteca": "About this library",
- "Calendario eventi culturali": "Cultural events calendar",
- "Informativa sulla privacy": "Privacy policy",
- "Feed e Scoperta": "Feeds & Discovery",
- "Feed RSS": "RSS Feed",
- "Ultime aggiunte al catalogo (RSS 2.0)": "Latest book additions (RSS 2.0)",
- "Indice completo degli URL": "Complete URL index",
- "Interoperabilità bibliotecaria (MARCXML, Dublin Core)": "Library interoperability (MARCXML, Dublin Core)",
- "Autenticazione utente": "User authentication",
- "Registrazione nuovo utente": "New user registration",
- "Genera automaticamente un file llms.txt per rendere la biblioteca comprensibile ai modelli linguistici (LLM)": "Automatically generate an llms.txt file to make the library understandable by large language models (LLMs)",
- "Cos'è llms.txt:": "What is llms.txt:",
- "È uno standard emergente (
llmstxt.org) che fornisce ai motori AI un sommario strutturato del sito in formato Markdown. Quando attivo, il file viene generato dinamicamente con le statistiche della biblioteca, le pagine pubbliche e le informazioni API.": "An emerging standard (
llmstxt.org) that provides AI engines with a structured Markdown summary of the site. When enabled, the file is dynamically generated with library statistics, public pages, and API information.",
- "Abilita llms.txt": "Enable llms.txt",
- "Rende disponibile /llms.txt e lo aggiunge a robots.txt": "Makes /llms.txt available and adds it to robots.txt",
- "Disattivato": "Disabled"
+ "🔒 Sicurezza Importante": "🔒 Important Security"
}
diff --git a/locale/it_IT.json b/locale/it_IT.json
index 0993a1ac..5d32ef37 100644
--- a/locale/it_IT.json
+++ b/locale/it_IT.json
@@ -32,6 +32,8 @@
"Errore durante l'installazione: %s": "Errore durante l'installazione: %s",
"Non autorizzato.": "Non autorizzato.",
"Token CSRF non valido.": "Token CSRF non valido.",
+ "Token configurato": "Token configurato",
+ "Token configurato — lascia vuoto per mantenere": "Token configurato — lascia vuoto per mantenere",
"File non trovato nell'upload.": "File non trovato nell'upload.",
"Errore durante il caricamento del file (code: %s).": "Errore durante il caricamento del file (code: %s).",
"Solo file ZIP sono accettati.": "Solo file ZIP sono accettati.",
@@ -136,5 +138,14 @@
"Invia per email": "Invia per email",
"Copia link": "Copia link",
"Link copiato!": "Link copiato!",
- "Condividi": "Condividi"
-}
+ "Condividi": "Condividi",
+ "Tipo Media": "Tipo Media",
+ "Libro": "Libro",
+ "Disco": "Disco",
+ "Tutti i media": "Tutti i media",
+ "Filtra per tipo": "Filtra per tipo",
+ "Audiolibro": "Audiolibro",
+ "DVD": "DVD",
+ "Altro": "Altro",
+ "Impossibile scaricare (senza ISBN/barcode):": "Impossibile scaricare (senza ISBN/barcode):"
+}
\ No newline at end of file
diff --git a/public/installer/assets b/public/installer/assets
deleted file mode 120000
index 887551db..00000000
--- a/public/installer/assets
+++ /dev/null
@@ -1 +0,0 @@
-../../installer/assets
\ No newline at end of file
diff --git a/public/installer/assets/installer.js b/public/installer/assets/installer.js
new file mode 100755
index 00000000..de0e687e
--- /dev/null
+++ b/public/installer/assets/installer.js
@@ -0,0 +1,144 @@
+/**
+ * Installer JavaScript - Pinakes
+ */
+
+// Test database connection (AJAX)
+function getInstallerTranslation(key, fallback) {
+ const dict = window.installerTranslations || {};
+ return dict[key] || fallback;
+}
+
+function testDatabaseConnection() {
+ const btn = document.getElementById('test-connection-btn');
+ const result = document.getElementById('connection-result');
+
+ if (!btn || !result) return;
+
+ btn.disabled = true;
+ btn.innerHTML = `
${getInstallerTranslation('testing', 'Testing...')}`;
+
+ // Null-safe: if any field element is missing on the current step variant,
+ // avoid a TypeError that would leave the button stuck in "Testing...".
+ const getVal = (id) => document.getElementById(id)?.value ?? '';
+ const formData = new FormData();
+ formData.append('action', 'test_connection');
+ formData.append('host', getVal('db_host'));
+ formData.append('username', getVal('db_username'));
+ formData.append('password', getVal('db_password'));
+ formData.append('database', getVal('db_database'));
+ formData.append('port', getVal('db_port'));
+ formData.append('socket', getVal('db_socket'));
+
+ fetch('index.php?step=2', {
+ method: 'POST',
+ body: formData
+ })
+ .then(response => response.json())
+ .then(data => {
+ if (data.success) {
+ result.className = 'alert alert-success';
+ result.textContent = getInstallerTranslation('testSuccess', '✓ Connection successful! Database is empty and ready for installation.');
+ document.getElementById('continue-btn').disabled = false;
+ } else {
+ result.className = 'alert alert-error';
+ result.textContent = '✗ ' + (data.error || getInstallerTranslation('testFailure', 'Connection failed'));
+ document.getElementById('continue-btn').disabled = true;
+ }
+ result.style.display = 'block';
+ })
+ .catch(error => {
+ result.className = 'alert alert-error';
+ result.textContent = '✗ ' + getInstallerTranslation('errorPrefix', 'Connection error:') + ' ' + error.message;
+ result.style.display = 'block';
+ })
+ .finally(() => {
+ btn.disabled = false;
+ // Preserve the
icon that step2.php injects
+ // inside the button. textContent would strip child nodes and delete
+ // the icon on every test cycle — rebuild via safe DOM APIs instead.
+ while (btn.firstChild) btn.removeChild(btn.firstChild);
+ const icon = document.createElement('i');
+ icon.className = 'fas fa-plug';
+ btn.appendChild(icon);
+ btn.appendChild(document.createTextNode(
+ ' ' + getInstallerTranslation('testButton', 'Test Connection')
+ ));
+ });
+}
+
+// File upload preview
+function handleFileUpload(input) {
+ const file = input.files[0];
+ const preview = document.getElementById('logo-preview');
+
+ if (file && preview) {
+ const reader = new FileReader();
+ reader.onload = function(e) {
+ preview.innerHTML = `

`;
+ };
+ reader.readAsDataURL(file);
+ }
+}
+
+// Auto-detect MySQL socket
+function autoDetectSocket() {
+ const host = document.getElementById('db_host')?.value;
+ const socketField = document.getElementById('db_socket');
+
+ // Only populate the socket if the user hasn't already entered one (or
+ // the server-rendered value) — avoid clobbering on every host-change
+ // event or on page load when the field is prefilled from a retry.
+ if (host === 'localhost' && socketField && socketField.value.trim() === '') {
+ fetch('index.php?action=detect_socket')
+ .then(response => response.json())
+ .then(data => {
+ if (data.socket && socketField.value.trim() === '') {
+ socketField.value = data.socket;
+ }
+ })
+ .catch(error => {
+ console.warn('Socket auto-detection failed:', error);
+ });
+ }
+}
+
+// Confirm installer deletion
+function confirmDeleteInstaller() {
+ return confirm(getInstallerTranslation('confirmDelete', 'Sei sicuro di voler eliminare la cartella installer? Questa azione non può essere annullata.'));
+}
+
+// Initialize on page load
+document.addEventListener('DOMContentLoaded', function() {
+ // Auto-detect socket when host changes
+ const hostInput = document.getElementById('db_host');
+ if (hostInput) {
+ hostInput.addEventListener('change', autoDetectSocket);
+ autoDetectSocket(); // Run on load
+ }
+
+ // File upload handling
+ const fileInput = document.getElementById('logo_file');
+ if (fileInput) {
+ fileInput.addEventListener('change', function() {
+ handleFileUpload(this);
+ });
+ }
+
+ // Password confirmation validation
+ const password = document.getElementById('password');
+ const passwordConfirm = document.getElementById('password_confirm');
+
+ if (password && passwordConfirm) {
+ passwordConfirm.addEventListener('input', function() {
+ if (this.value !== password.value) {
+ this.setCustomValidity(getInstallerTranslation('passwordMismatch', 'Le password non corrispondono'));
+ } else {
+ this.setCustomValidity('');
+ }
+ });
+ }
+});
+
+// (removed: simulateInstallProgress / animateProgress — dead code. Step 3
+// template implements its own inline progress animation and never called
+// these helpers. CodeRabbit nitpick.)
diff --git a/public/installer/assets/style.css b/public/installer/assets/style.css
new file mode 100755
index 00000000..8d4269b9
--- /dev/null
+++ b/public/installer/assets/style.css
@@ -0,0 +1,552 @@
+:root {
+ --brand-primary: #d60361;
+ --brand-primary-dark: #a00049;
+ --brand-dark: #000000;
+ --brand-muted: #6b7280;
+ --brand-border: #e2e8f0;
+ --brand-bg: #f8f9fb;
+ --brand-white: #ffffff;
+ --brand-silver: #c0c0c0;
+ --brand-light-bg: #eec5d7;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', sans-serif;
+ background: #f8f9fb;
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+ color: var(--brand-dark);
+}
+
+.installer-container {
+ background: var(--brand-white);
+ border-radius: 24px;
+ box-shadow: 0 35px 80px rgba(15, 23, 42, 0.18);
+ max-width: 960px;
+ width: 100%;
+ overflow: hidden;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+}
+
+.installer-hero {
+ background: var(--brand-dark);
+ padding: 32px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ color: #fff;
+}
+
+.brand-lockup {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.brand-lockup img {
+ width: 72px;
+ height: 72px;
+ border-radius: 20px;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ padding: 8px;
+ object-fit: contain;
+}
+
+.brand-copy {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.brand-title {
+ font-size: 1.4rem;
+ font-weight: 600;
+ letter-spacing: -0.02em;
+}
+
+.brand-subtitle {
+ font-size: 0.8rem;
+ text-transform: uppercase;
+ letter-spacing: 0.32em;
+ color: rgba(255, 255, 255, 0.72);
+}
+
+.hero-version {
+ font-size: 0.75rem;
+ letter-spacing: 0.3em;
+ text-transform: uppercase;
+ background: rgba(255, 255, 255, 0.12);
+ border-radius: 999px;
+ padding: 10px 20px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ font-weight: 600;
+}
+
+.installer-header {
+ /* White header so .installer-header h1 (dark) and .installer-header p
+ (muted gray) remain legible — the previous black background made them
+ invisible. CodeRabbit #95-128. */
+ background: #ffffff;
+ color: var(--brand-dark);
+ padding: 30px;
+ text-align: center;
+ border-bottom: 3px solid #d60361;
+}
+
+.step-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 6px 16px;
+ border-radius: 999px;
+ background: var(--brand-light-bg);
+ color: var(--brand-primary);
+ font-weight: 600;
+ font-size: 0.85rem;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ margin-bottom: 14px;
+}
+
+.installer-header h1 {
+ font-size: 1.9rem;
+ margin: 0;
+ color: var(--brand-dark);
+ letter-spacing: -0.02em;
+}
+
+.installer-header p {
+ color: var(--brand-muted);
+ margin-top: 6px;
+}
+
+.installer-progress {
+ display: flex;
+ gap: 0;
+ padding: 24px 32px 32px;
+ border-bottom: 1px solid var(--brand-border);
+ background: var(--brand-white);
+}
+
+.progress-step {
+ flex: 1;
+ text-align: center;
+ position: relative;
+ color: var(--brand-muted);
+ font-size: 0.85rem;
+}
+
+.progress-step:not(:last-child)::after {
+ content: '';
+ position: absolute;
+ top: 20px;
+ right: -50%;
+ width: 100%;
+ height: 2px;
+ background: var(--brand-border);
+ z-index: 1;
+}
+
+.progress-step.completed:not(:last-child)::after {
+ background: var(--brand-primary);
+}
+
+.progress-step .step-node {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ border: 2px solid var(--brand-border);
+ margin: 0 auto 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 600;
+ color: var(--brand-muted);
+ background: var(--brand-bg);
+ position: relative;
+ z-index: 2;
+}
+
+.progress-step.active .step-node {
+ border-color: var(--brand-primary);
+ color: var(--brand-primary);
+ background: var(--brand-white);
+ box-shadow: 0 0 0 4px var(--brand-light-bg);
+}
+
+.progress-step.completed .step-node {
+ background: var(--brand-primary);
+ border-color: var(--brand-primary);
+ color: #fff;
+ box-shadow: 0 0 0 4px var(--brand-light-bg);
+}
+
+.progress-step .step-label {
+ display: block;
+ margin-top: 6px;
+}
+
+.progress-step.active,
+.progress-step.completed {
+ color: var(--brand-dark);
+ font-weight: 600;
+}
+
+.installer-body {
+ padding: 40px;
+ background: var(--brand-white);
+}
+
+.step-title {
+ font-size: 1.6rem;
+ margin-bottom: 10px;
+ color: var(--brand-dark);
+}
+
+.step-description {
+ color: var(--brand-muted);
+ margin-bottom: 30px;
+ line-height: 1.6;
+}
+
+.form-group {
+ margin-bottom: 20px;
+}
+
+.form-label {
+ display: block;
+ font-weight: 500;
+ margin-bottom: 8px;
+ color: var(--brand-dark);
+ font-size: 0.95rem;
+}
+
+.form-input,
+.form-select {
+ width: 100%;
+ padding: 12px 16px;
+ border: 1px solid var(--brand-border);
+ border-radius: 10px;
+ font-size: 0.95rem;
+ transition: all 0.2s ease;
+ background: var(--brand-white);
+}
+
+.form-input:focus,
+.form-select:focus {
+ outline: none;
+ border-color: var(--brand-primary);
+ box-shadow: 0 0 0 4px var(--brand-light-bg);
+}
+
+.form-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 16px;
+}
+
+.checkbox-group {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.checkbox-group input[type="checkbox"] {
+ width: 18px;
+ height: 18px;
+ accent-color: var(--brand-primary);
+}
+
+.alert {
+ padding: 14px 18px;
+ border-radius: 12px;
+ margin-bottom: 20px;
+ font-size: 0.95rem;
+ border: 1px solid transparent;
+}
+
+.alert-success {
+ background: var(--brand-light-bg);
+ border-color: var(--brand-light-bg);
+ color: var(--brand-dark);
+}
+
+.alert-error {
+ background: #ffe0e8;
+ border-color: var(--brand-primary);
+ color: var(--brand-primary-dark);
+}
+
+.alert-warning {
+ /* Amber/yellow warning palette — visually distinct from .alert-info.
+ Previously both used --brand-bg + --brand-dark and were indistinguishable. */
+ background: #fff8e1;
+ border-color: #f59e0b;
+ color: #78350f;
+}
+
+.alert-info {
+ background: var(--brand-bg);
+ border-color: var(--brand-border);
+ color: var(--brand-dark);
+}
+
+.requirements-list {
+ list-style: none;
+ margin-top: 20px;
+}
+
+.requirements-list li {
+ padding: 14px;
+ margin-bottom: 12px;
+ border-radius: 12px;
+ background: var(--brand-bg);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ border: 1px solid var(--brand-border);
+}
+
+.requirements-list li.met {
+ background: var(--brand-light-bg);
+ color: var(--brand-dark);
+ border-color: var(--brand-light-bg);
+}
+
+.requirements-list li.not-met {
+ background: #ffe0e8;
+ color: var(--brand-primary-dark);
+ border-color: var(--brand-primary);
+}
+
+.btn {
+ padding: 12px 26px;
+ border: none;
+ border-radius: 999px;
+ font-size: 0.95rem;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ text-decoration: none;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+}
+
+.btn-lg {
+ min-width: 250px;
+ padding: 15px 32px;
+ font-size: 1rem;
+}
+
+.btn-primary {
+ background: var(--brand-primary);
+ color: #fff;
+ box-shadow: 0 4px 12px rgba(214, 3, 97, 0.25);
+}
+
+.btn-primary:hover {
+ background: var(--brand-primary-dark);
+ transform: translateY(-1px);
+}
+
+.btn-secondary {
+ background: var(--brand-bg);
+ color: var(--brand-dark);
+ border: 1px solid var(--brand-border);
+}
+
+.btn-secondary:hover {
+ border-color: var(--brand-primary);
+ color: var(--brand-primary);
+}
+
+.btn-warning {
+ background: var(--brand-silver);
+ color: var(--brand-dark);
+}
+
+.btn-warning:hover {
+ background: #a8a8a8;
+ color: var(--brand-dark);
+}
+
+.btn:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.progress-bar {
+ width: 100%;
+ height: 8px;
+ background: var(--brand-bg);
+ border-radius: 999px;
+ overflow: hidden;
+ margin-bottom: 20px;
+}
+
+.progress-bar-fill {
+ height: 100%;
+ background: var(--brand-primary);
+ transition: width 0.3s ease;
+}
+
+.language-option {
+ cursor: pointer;
+ padding: 28px;
+ border: 2px solid var(--brand-border);
+ border-radius: 18px;
+ transition: all 0.2s ease;
+ background: var(--brand-white);
+ box-shadow: 0 10px 30px rgba(15, 23, 42, 0.06);
+}
+
+.language-option.selected {
+ border-color: var(--brand-primary);
+ background: var(--brand-light-bg);
+ box-shadow: 0 4px 12px rgba(214, 3, 97, 0.15);
+}
+
+.language-radio {
+ width: 20px;
+ height: 20px;
+ accent-color: var(--brand-primary);
+ cursor: pointer;
+}
+
+/* Force emoji font rendering for flag icons */
+.flag-emoji {
+ font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Twemoji Mozilla', 'EmojiOne Color', sans-serif;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+}
+
+.file-upload-wrapper input[type="file"] {
+ position: absolute;
+ width: 0.1px;
+ height: 0.1px;
+ opacity: 0;
+ overflow: hidden;
+ z-index: -1;
+}
+
+.file-upload-label {
+ display: block;
+ padding: 40px;
+ border: 2px dashed var(--brand-border);
+ border-radius: 16px;
+ text-align: center;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ background: var(--brand-bg);
+}
+
+.file-upload-label:hover {
+ border-color: var(--brand-primary);
+ background: var(--brand-light-bg);
+}
+
+.file-upload-label i {
+ font-size: 32px;
+ color: var(--brand-primary);
+ margin-bottom: 10px;
+}
+
+.summary-list {
+ list-style: none;
+ margin-top: 20px;
+}
+
+.summary-list li {
+ padding: 14px;
+ margin-bottom: 10px;
+ background: var(--brand-bg);
+ border-radius: 12px;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ border: 1px solid var(--brand-border);
+}
+
+.summary-list li i {
+ color: var(--brand-primary);
+}
+
+.text-center {
+ text-align: center;
+}
+
+.installer-footer {
+ padding: 24px 40px;
+ border-top: 1px solid var(--brand-border);
+ background: var(--brand-bg);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 12px;
+}
+
+@media (max-width: 768px) {
+ .installer-body {
+ padding: 28px;
+ }
+
+ .installer-progress {
+ flex-direction: row;
+ justify-content: center;
+ gap: 0;
+ overflow: hidden;
+ padding: 20px 16px 24px;
+ }
+
+ /* Hide all steps by default on mobile */
+ .progress-step {
+ display: none;
+ flex: 0 0 auto;
+ min-width: 80px;
+ max-width: 100px;
+ }
+
+ /* Show current step */
+ .progress-step.active {
+ display: block;
+ opacity: 1;
+ transform: scale(1);
+ }
+
+ /* Show adjacent steps (prev/next) via data attributes */
+ .progress-step.adjacent {
+ display: block;
+ opacity: 0.35;
+ transform: scale(0.85);
+ }
+
+ /* Hide connecting lines on mobile */
+ .progress-step:not(:last-child)::after {
+ display: none;
+ }
+
+ /* Smaller nodes for adjacent steps */
+ .progress-step.adjacent .step-node {
+ width: 36px;
+ height: 36px;
+ font-size: 0.75rem;
+ }
+
+ .progress-step.adjacent .step-label {
+ font-size: 0.7rem;
+ }
+}
diff --git a/scripts/bulk-enrich-cron.php b/scripts/bulk-enrich-cron.php
new file mode 100644
index 00000000..4b248f81
--- /dev/null
+++ b/scripts/bulk-enrich-cron.php
@@ -0,0 +1,152 @@
+#!/usr/bin/env php
+load();
+
+// Connect to DB
+$host = $_ENV['DB_HOST'] ?? '127.0.0.1';
+$user = $_ENV['DB_USER'] ?? 'root';
+$pass = $_ENV['DB_PASS'] ?? '';
+$name = $_ENV['DB_NAME'] ?? 'biblioteca';
+$port = (int) ($_ENV['DB_PORT'] ?? 3306);
+
+$db = new mysqli($host, $user, $pass, $name, $port);
+if ($db->connect_error) {
+ logMessage('ERROR: DB connection failed: ' . $db->connect_error, $logFile);
+ exit(1);
+}
+$db->set_charset('utf8mb4');
+
+$service = new BulkEnrichmentService($db);
+
+// Check if bulk enrichment is enabled
+if (!$service->isEnabled()) {
+ logMessage('Bulk enrichment is disabled. Exiting.', $logFile);
+ $db->close();
+ exit(0);
+}
+
+// Acquire lock ATOMICALLY via flock(LOCK_EX | LOCK_NB). The previous
+// file_exists() / file_put_contents() sequence was racy: two cron invocations
+// could both observe "no lock" and both start a batch, doubling upstream API
+// usage. flock on an open handle is an OS-level mutex.
+$lockHandle = fopen($lockFile, 'c+');
+if ($lockHandle === false) {
+ logMessage('ERROR: cannot open lock file ' . $lockFile . '. Exiting.', $logFile);
+ $db->close();
+ exit(1);
+}
+if (!flock($lockHandle, LOCK_EX | LOCK_NB)) {
+ // Another instance owns the lock. Report PID if readable for diagnostics.
+ rewind($lockHandle);
+ $existingPid = trim((string) fread($lockHandle, 32));
+ logMessage(
+ 'Another instance is running (PID: ' . ($existingPid !== '' ? $existingPid : 'unknown') . '). Exiting.',
+ $logFile
+ );
+ fclose($lockHandle); // releases nothing (we don't hold it); just closes fd
+ $db->close();
+ exit(0);
+}
+// We hold the lock. Write our PID + keep the fd open until script end.
+ftruncate($lockHandle, 0);
+rewind($lockHandle);
+fwrite($lockHandle, (string) getmypid());
+fflush($lockHandle);
+
+$exitCode = 0;
+try {
+ logMessage('Starting bulk enrichment...', $logFile);
+
+ $stats = $service->getStats();
+ logMessage(sprintf(
+ 'Stats: %d books with ISBN, %d missing cover, %d missing description, %d pending',
+ $stats['total_with_isbn'],
+ $stats['missing_cover'],
+ $stats['missing_description'],
+ $stats['pending']
+ ), $logFile);
+
+ if ($stats['pending'] === 0) {
+ logMessage('No books pending enrichment. Done.', $logFile);
+ } else {
+ $summary = $service->enrichBatch(20, function (int $current, int $total, array $result) use ($logFile): void {
+ $fields = !empty($result['fields_updated']) ? implode(', ', $result['fields_updated']) : '-';
+ logMessage(sprintf(
+ ' [%d/%d] Book #%d: %s (fields: %s)',
+ $current,
+ $total,
+ $result['book_id'],
+ $result['status'],
+ $fields
+ ), $logFile);
+ });
+
+ logMessage(sprintf(
+ 'Completed: %d processed, %d enriched, %d not found, %d errors',
+ $summary['processed'],
+ $summary['enriched'],
+ $summary['not_found'],
+ $summary['errors']
+ ), $logFile);
+ }
+} catch (\Throwable $e) {
+ // Non-zero exit so cron + monitoring record the run as FAILED, not success.
+ logMessage('FATAL ERROR: ' . $e->getMessage(), $logFile);
+ $exitCode = 1;
+} finally {
+ // Release flock + close fd. Keep the lock FILE on disk so the inode
+ // stays stable: unlinking here would reintroduce a race where another
+ // process could recreate the pathname with a new inode and bypass the
+ // lock held by an earlier lingering fd. We truncate+rewind so a leftover
+ // stale PID doesn't confuse the next run's diagnostics.
+ if (is_resource($lockHandle)) {
+ ftruncate($lockHandle, 0);
+ rewind($lockHandle);
+ flock($lockHandle, LOCK_UN);
+ fclose($lockHandle);
+ }
+ $db->close();
+}
+
+exit($exitCode);
diff --git a/scripts/create-release.sh b/scripts/create-release.sh
index bd2663be..3931eca7 100755
--- a/scripts/create-release.sh
+++ b/scripts/create-release.sh
@@ -138,8 +138,12 @@ CRITICAL_FILES=(
# Bundled plugins that MUST be in the ZIP (scraping-pro is premium, NOT bundled)
BUNDLED_PLUGINS=(
"api-book-scraper"
+ "deezer"
"dewey-editor"
"digital-library"
+ "discogs"
+ "goodlib"
+ "musicbrainz"
"open-library"
"z39-server"
)
@@ -183,6 +187,22 @@ if [ "$PHPSTAN_COUNT" -gt 0 ]; then
MISSING=$((MISSING + 1))
fi
+# Detect symlinks in the ZIP via zipinfo metadata (macOS `unzip` would recreate
+# them, but PHP ZipArchive on Linux extracts as 22-byte regular files → Updater
+# then fails copy(file, existing_dir). Broke v0.5.4 manual upgrade in prod.)
+# zipinfo long-format symlink lines look like:
+# lrwxrwxrwx 2.0 unx 22 b- stor ...
->
+# We want (the offending repo path the maintainer must fix), which is
+# the field immediately before "->" — NOT $NF, which would be the target.
+SYMLINKS_IN_ZIP=$(zipinfo "$ZIPFILE" 2>/dev/null \
+ | awk '/^l/ { for (i=1; i<=NF; i++) if ($i == "->") { print $(i-1); break } }')
+if [ -n "$SYMLINKS_IN_ZIP" ]; then
+ echo -e "${RED} ✗ Symlinks in ZIP — will break Updater.copyDirectory() in production:${NC}"
+ echo "$SYMLINKS_IN_ZIP" | sed 's/^/ /'
+ echo -e "${RED} Fix: replace the symlink in the repo with a real directory containing the files.${NC}"
+ MISSING=$((MISSING + 1))
+fi
+
# Verify version matches
ZIP_VERSION=$(jq -r '.version' "$VERIFY_DIR/pinakes-v${VERSION}/version.json")
if [ "$ZIP_VERSION" != "$VERSION" ]; then
diff --git a/storage/plugins/api-book-scraper/plugin.json b/storage/plugins/api-book-scraper/plugin.json
index f8ca7ac4..560c00ac 100644
--- a/storage/plugins/api-book-scraper/plugin.json
+++ b/storage/plugins/api-book-scraper/plugin.json
@@ -9,7 +9,7 @@
"main_file": "wrapper.php",
"requires_php": "8.0",
"requires_app": "0.4.0",
- "max_app_version": "1.0.0",
+ "max_app_version": "0.5.5",
"metadata": {
"category": "scraping",
"priority": 3,
diff --git a/storage/plugins/deezer/plugin.json b/storage/plugins/deezer/plugin.json
new file mode 100644
index 00000000..9690d08b
--- /dev/null
+++ b/storage/plugins/deezer/plugin.json
@@ -0,0 +1,43 @@
+{
+ "name": "deezer",
+ "display_name": "Deezer Music Search",
+ "description": "Integrazione con Deezer per arricchire i dati musicali. Cerca per titolo/artista, fornisce copertine HD, tracklist con durate, genere. Nessun token richiesto.",
+ "version": "1.0.0",
+ "author": "Fabiodalez",
+ "author_url": "",
+ "plugin_url": "https://developers.deezer.com",
+ "main_file": "wrapper.php",
+ "requires_php": "8.0",
+ "requires_app": "0.5.0",
+ "max_app_version": "0.5.5",
+ "metadata": {
+ "category": "scraping",
+ "tags": [
+ "api",
+ "deezer",
+ "scraping",
+ "music",
+ "covers"
+ ],
+ "priority": 15,
+ "api_endpoints": [
+ "https://api.deezer.com/search/album",
+ "https://api.deezer.com/album/{id}"
+ ],
+ "hooks": [
+ {
+ "name": "scrape.data.modify",
+ "callback_method": "enrichWithDeezerData",
+ "description": "Enriches existing music data with Deezer covers, genres and tracklist",
+ "priority": 15
+ }
+ ],
+ "features": [
+ "Arricchimento dati da Discogs/MusicBrainz",
+ "Copertine HD (1000x1000)",
+ "Tracklist con durate",
+ "Generi musicali",
+ "Nessun token richiesto"
+ ]
+ }
+}
diff --git a/storage/plugins/dewey-editor/plugin.json b/storage/plugins/dewey-editor/plugin.json
index 63f9f2ce..b8c75586 100644
--- a/storage/plugins/dewey-editor/plugin.json
+++ b/storage/plugins/dewey-editor/plugin.json
@@ -9,7 +9,7 @@
"main_file": "DeweyEditorPlugin.php",
"requires_php": "7.4",
"requires_app": "0.4.0",
- "max_app_version": "1.0.0",
+ "max_app_version": "0.5.5",
"settings": false,
"metadata": {
"category": "admin",
diff --git a/storage/plugins/digital-library/plugin.json b/storage/plugins/digital-library/plugin.json
index 7fde7231..68f64301 100644
--- a/storage/plugins/digital-library/plugin.json
+++ b/storage/plugins/digital-library/plugin.json
@@ -9,7 +9,7 @@
"main_file": "wrapper.php",
"requires_php": "8.0",
"requires_app": "0.4.0",
- "max_app_version": "1.0.0",
+ "max_app_version": "0.5.5",
"metadata": {
"category": "media",
"priority": 10,
diff --git a/storage/plugins/discogs/DiscogsPlugin.php b/storage/plugins/discogs/DiscogsPlugin.php
new file mode 100644
index 00000000..1fde6839
--- /dev/null
+++ b/storage/plugins/discogs/DiscogsPlugin.php
@@ -0,0 +1,1429 @@
+db = $db;
+ $this->hookManager = $hookManager;
+ }
+
+ /**
+ * Activate the plugin and register all hooks
+ */
+ public function activate(): void
+ {
+ Hooks::add('scrape.sources', [$this, 'addDiscogsSource'], 8);
+ Hooks::add('scrape.fetch.custom', [$this, 'fetchFromDiscogs'], 8);
+ Hooks::add('scrape.data.modify', [$this, 'enrichWithDiscogsData'], 15);
+ Hooks::add('scrape.isbn.validate', [$this, 'validateBarcode'], 8);
+ }
+
+ /**
+ * Validate barcode: accept ISBN, EAN-13, and UPC-A codes
+ */
+ public function validateBarcode(bool $isValid, string $isbn): bool
+ {
+ // If already valid (ISBN), keep it
+ if ($isValid) {
+ return true;
+ }
+ // Accept EAN-13 (13 digits) and UPC-A (12 digits)
+ $clean = preg_replace('/[^0-9]/', '', $isbn);
+ return strlen((string) $clean) === 13 || strlen((string) $clean) === 12;
+ }
+
+ /**
+ * Called when plugin is installed via PluginManager
+ */
+ public function onInstall(): void
+ {
+ \App\Support\SecureLogger::debug('[Discogs] Plugin installed');
+ $this->registerHooks();
+ }
+
+ /**
+ * Called when plugin is activated via PluginManager
+ */
+ public function onActivate(): void
+ {
+ $this->registerHooks();
+ \App\Support\SecureLogger::debug('[Discogs] Plugin activated');
+ }
+
+ /**
+ * Called when plugin is deactivated via PluginManager
+ */
+ public function onDeactivate(): void
+ {
+ $this->deleteHooks();
+ \App\Support\SecureLogger::debug('[Discogs] Plugin deactivated');
+ }
+
+ /**
+ * Called when plugin is uninstalled via PluginManager
+ */
+ public function onUninstall(): void
+ {
+ $this->deleteHooks();
+ \App\Support\SecureLogger::debug('[Discogs] Plugin uninstalled');
+ }
+
+ /**
+ * Set the plugin ID (called by PluginManager after installation)
+ */
+ public function setPluginId(int $pluginId): void
+ {
+ $this->pluginId = $pluginId;
+ $this->ensureHooksRegistered();
+ }
+
+ /**
+ * Register hooks in the database for persistence
+ */
+ private function registerHooks(): void
+ {
+ if ($this->db === null || $this->pluginId === null) {
+ \App\Support\SecureLogger::warning('[Discogs] Cannot register hooks: missing DB or plugin ID');
+ return;
+ }
+
+ $hooks = [
+ ['scrape.sources', 'addDiscogsSource', 8],
+ ['scrape.fetch.custom', 'fetchFromDiscogs', 8],
+ ['scrape.data.modify', 'enrichWithDiscogsData', 15],
+ ['scrape.isbn.validate', 'validateBarcode', 8],
+ ];
+
+ $stmt = null;
+ try {
+ $this->db->begin_transaction();
+
+ $deleteStmt = $this->db->prepare("DELETE FROM plugin_hooks WHERE plugin_id = ?");
+ if ($deleteStmt === false) {
+ throw new \RuntimeException('[Discogs] Failed to prepare hook cleanup: ' . $this->db->error);
+ }
+ $deleteStmt->bind_param('i', $this->pluginId);
+ if (!$deleteStmt->execute()) {
+ throw new \RuntimeException('[Discogs] Failed to delete existing hooks: ' . $deleteStmt->error);
+ }
+ $deleteStmt->close();
+
+ foreach ($hooks as [$hookName, $method, $priority]) {
+ $stmt = $this->db->prepare(
+ "INSERT INTO plugin_hooks (plugin_id, hook_name, callback_class, callback_method, priority, is_active, created_at)
+ VALUES (?, ?, ?, ?, ?, 1, NOW())"
+ );
+
+ if ($stmt === false) {
+ throw new \RuntimeException('[Discogs] Failed to prepare statement: ' . $this->db->error);
+ }
+
+ $callbackClass = 'DiscogsPlugin';
+ $stmt->bind_param('isssi', $this->pluginId, $hookName, $callbackClass, $method, $priority);
+
+ if (!$stmt->execute()) {
+ throw new \RuntimeException("[Discogs] Failed to register hook {$hookName}: " . $stmt->error);
+ }
+
+ $stmt->close();
+ $stmt = null;
+ }
+
+ $this->db->commit();
+ \App\Support\SecureLogger::debug('[Discogs] Hooks registered');
+ } catch (\Throwable $e) {
+ if ($stmt instanceof \mysqli_stmt) {
+ $stmt->close();
+ }
+ try {
+ $this->db->rollback();
+ } catch (\Throwable) {
+ }
+ \App\Support\SecureLogger::error($e->getMessage());
+ throw $e;
+ }
+ }
+
+ /**
+ * Ensure hooks are registered in the database
+ */
+ private function ensureHooksRegistered(): void
+ {
+ if ($this->db === null || $this->pluginId === null) {
+ return;
+ }
+
+ $stmt = $this->db->prepare("SELECT COUNT(*) AS total FROM plugin_hooks WHERE plugin_id = ?");
+ if ($stmt === false) {
+ return;
+ }
+
+ $stmt->bind_param('i', $this->pluginId);
+
+ if ($stmt->execute()) {
+ $result = $stmt->get_result();
+ $row = $result ? $result->fetch_assoc() : null;
+ if ((int)($row['total'] ?? 0) === 0) {
+ $this->registerHooks();
+ }
+ }
+
+ $stmt->close();
+ }
+
+ /**
+ * Delete all hooks for this plugin
+ */
+ private function deleteHooks(): void
+ {
+ if ($this->db === null || $this->pluginId === null) {
+ return;
+ }
+
+ $stmt = $this->db->prepare("DELETE FROM plugin_hooks WHERE plugin_id = ?");
+ if ($stmt) {
+ $stmt->bind_param('i', $this->pluginId);
+ $stmt->execute();
+ $stmt->close();
+ }
+ }
+
+ // ─── Scraping Hooks ─────────────────────────────────────────────────
+
+ /**
+ * Add Discogs as a scraping source
+ *
+ * @param array $sources Existing sources
+ * @param string $isbn ISBN/EAN being scraped
+ * @return array Modified sources
+ */
+ public function addDiscogsSource(array $sources, string $isbn): array
+ {
+ $sources['discogs'] = [
+ 'name' => 'Discogs',
+ 'url_pattern' => self::API_BASE . '/database/search?barcode={isbn}&type=release',
+ 'enabled' => true,
+ 'priority' => 8,
+ 'fields' => ['title', 'authors', 'publisher', 'year', 'description', 'image', 'format'],
+ ];
+
+ return $sources;
+ }
+
+ /**
+ * Fetch music metadata from Discogs API
+ *
+ * Search strategy:
+ * 1. Barcode search (EAN/UPC)
+ * 2. Query search as fallback
+ * 3. Fetch full release details
+ *
+ * @param mixed $currentResult Previous accumulated result from other plugins
+ * @param array $sources Available sources
+ * @param string $isbn ISBN/EAN/barcode to search
+ * @return array|null Merged data or previous result
+ */
+ public function fetchFromDiscogs($currentResult, array $sources, string $isbn): ?array
+ {
+ // Only proceed if Discogs source is enabled
+ if (!isset($sources['discogs']) || !$sources['discogs']['enabled']) {
+ return $currentResult;
+ }
+
+ // Don't skip — always try to merge Discogs data for additional fields
+ // BookDataMerger::merge() only fills missing fields, so it's safe
+
+ try {
+ $token = $this->getSetting('api_token');
+
+ // Barcode search is the primary strategy; title/artist fallback
+ // below fires only when a previous scraper already supplied a title.
+ $searchUrl = self::API_BASE . '/database/search?barcode=' . urlencode($isbn) . '&type=release';
+ $searchResult = $this->apiRequest($searchUrl, $token);
+
+ if (empty($searchResult['results'][0])) {
+ // Title/artist fallback only works when a previous scraper already
+ // provided partial data (title + artist). When $currentResult is
+ // null (first scraper in the chain), there is nothing to search for.
+ if ($currentResult !== null && is_array($currentResult) && !empty($currentResult['title'])) {
+ $discogsFallback = $this->searchDiscogsByTitleArtist($currentResult, $token);
+ if ($discogsFallback !== null) {
+ return $this->mergeBookData($currentResult, $discogsFallback);
+ }
+ }
+
+ // Discogs found nothing — try MusicBrainz as fallback
+ $mbResult = $this->searchMusicBrainz($isbn, $isbn);
+ if ($mbResult !== null) {
+ return $this->mergeBookData($currentResult, $mbResult);
+ }
+ return $currentResult;
+ }
+
+ $discogsData = $this->fetchDiscogsReleaseFromSearchResult($searchResult['results'][0], $token, $isbn);
+ if ($discogsData === null) {
+ $mbResult = $this->searchMusicBrainz($isbn, $isbn);
+ return $mbResult !== null
+ ? $this->mergeBookData($currentResult, $mbResult)
+ : $currentResult;
+ }
+
+ // Merge with existing data
+ return $this->mergeBookData($currentResult, $discogsData);
+
+ } catch (\Throwable $e) {
+ \App\Support\SecureLogger::error('[Discogs] Plugin Error: ' . $e->getMessage());
+ return $currentResult;
+ }
+ }
+
+ private function searchDiscogsByTitleArtist($currentResult, ?string $token): ?array
+ {
+ if (!is_array($currentResult)) {
+ return null;
+ }
+
+ $resolvedTipoMedia = \App\Support\MediaLabels::resolveTipoMedia(
+ $currentResult['format'] ?? $currentResult['formato'] ?? null,
+ $currentResult['tipo_media'] ?? null
+ );
+ if ($resolvedTipoMedia !== 'disco') {
+ return null;
+ }
+
+ $title = trim((string) ($currentResult['title'] ?? ''));
+ if ($title === '') {
+ return null;
+ }
+
+ $artist = trim((string) ($currentResult['author'] ?? ''));
+ if ($artist === '' && !empty($currentResult['authors'])) {
+ if (is_array($currentResult['authors'])) {
+ $firstAuthor = $currentResult['authors'][0] ?? '';
+ if (is_array($firstAuthor)) {
+ $artist = trim((string) ($firstAuthor['name'] ?? ''));
+ } else {
+ $artist = trim((string) $firstAuthor);
+ }
+ } else {
+ $artist = trim((string) $currentResult['authors']);
+ }
+ }
+
+ $query = [
+ 'type=release',
+ 'release_title=' . urlencode($title),
+ ];
+ if ($artist !== '') {
+ $query[] = 'artist=' . urlencode($artist);
+ }
+
+ $searchUrl = self::API_BASE . '/database/search?' . implode('&', $query);
+ $searchResult = $this->apiRequest($searchUrl, $token);
+ if (empty($searchResult['results'][0])) {
+ return null;
+ }
+
+ return $this->fetchDiscogsReleaseFromSearchResult($searchResult['results'][0], $token, null);
+ }
+
+ private function fetchDiscogsReleaseFromSearchResult(array $searchResult, ?string $token, ?string $fallbackBarcode): ?array
+ {
+ $releaseId = $searchResult['id'] ?? null;
+ if ($releaseId === null) {
+ return null;
+ }
+
+ $releaseUrl = self::API_BASE . '/releases/' . (int) $releaseId;
+ $release = $this->apiRequest($releaseUrl, $token);
+
+ if (empty($release) || empty($release['title'])) {
+ return null;
+ }
+
+ return $this->mapReleaseToPinakes($release, $searchResult, $fallbackBarcode);
+ }
+
+ /**
+ * Enrich existing data with Discogs cover if missing
+ *
+ * @param array $data Current payload
+ * @param string $isbn ISBN/EAN
+ * @param array $source Source information
+ * @param array $originalPayload Original payload before modifications
+ * @return array Enriched payload
+ */
+ public function enrichWithDiscogsData(array $data, string $isbn, array $source, array $originalPayload): array
+ {
+ // If data already has an image, skip
+ if (!empty($data['image'])) {
+ return $data;
+ }
+
+ // Only enrich from Deezer for music sources (avoid attaching music covers to books)
+ $resolvedType = \App\Support\MediaLabels::resolveTipoMedia(
+ $data['format'] ?? $data['formato'] ?? null,
+ $data['tipo_media'] ?? null
+ );
+ $isMusicSource = $resolvedType === 'disco'
+ || ($data['source'] ?? '') === 'discogs'
+ || ($data['source'] ?? '') === 'musicbrainz';
+
+ // Try to fetch cover from Discogs using discogs_id (regardless of source)
+ $discogsId = $data['discogs_id'] ?? null;
+ if ($discogsId === null) {
+ // No discogs_id — skip to Deezer enrichment below (only for music)
+ if ($isMusicSource && (empty($data['image']) || empty($data['genres'])) && !empty($data['title'])) {
+ $data = $this->enrichFromDeezer($data);
+ }
+ return $data;
+ }
+
+ try {
+ $token = $this->getSetting('api_token');
+ $releaseUrl = self::API_BASE . '/releases/' . (int)$discogsId;
+ $release = $this->apiRequest($releaseUrl, $token);
+
+ if (!empty($release['images'][0]['uri'])) {
+ $data['image'] = $release['images'][0]['uri'];
+ $data['cover_url'] = $release['images'][0]['uri'];
+ } elseif (!empty($release['thumb'])) {
+ $data['image'] = $release['thumb'];
+ $data['cover_url'] = $release['thumb'];
+ }
+ } catch (\Throwable $e) {
+ \App\Support\SecureLogger::warning('[Discogs] Cover enrichment error: ' . $e->getMessage());
+ }
+
+ // If still missing cover or genre, try Deezer enrichment (only for music)
+ if ($isMusicSource && (empty($data['image']) || empty($data['genres'])) && !empty($data['title'])) {
+ $data = $this->enrichFromDeezer($data);
+ }
+
+ return $data;
+ }
+
+ // ─── Data Mapping ───────────────────────────────────────────────────
+
+ /**
+ * Map a Discogs release to Pinakes book data format
+ *
+ * @param array $release Full release data from /releases/{id}
+ * @param array $searchResult Search result entry (has thumb/cover_image)
+ * @param string|null $fallbackBarcode Original barcode/EAN used for a validated barcode search
+ * @return array Pinakes-formatted data
+ */
+ private function mapReleaseToPinakes(array $release, array $searchResult, ?string $fallbackBarcode): array
+ {
+ // Extract album title — Discogs format is "Artist - Album Title"
+ $title = $this->extractAlbumTitle($release['title'] ?? '');
+
+ // Extract artists
+ $artists = $this->extractArtists($release['artists'] ?? []);
+ $firstArtist = $artists[0] ?? '';
+
+ // Build tracklist description as HTML
+ $description = $this->buildTracklistDescription($release['tracklist'] ?? []);
+
+ // Get cover image: prefer full images (requires auth), fallback to search thumbnails
+ $coverUrl = null;
+ if (!empty($release['images'][0]['uri'])) {
+ $coverUrl = $release['images'][0]['uri'];
+ } elseif (!empty($searchResult['cover_image'])) {
+ $coverUrl = $searchResult['cover_image'];
+ } elseif (!empty($searchResult['thumb'])) {
+ $coverUrl = $searchResult['thumb'];
+ }
+
+ // Extract publisher (label + catalog number)
+ $publisher = '';
+ $catalogNumber = '';
+ if (!empty($release['labels'][0]['name'])) {
+ $publisher = trim($release['labels'][0]['name']);
+ $catalogNumber = trim($release['labels'][0]['catno'] ?? '');
+ }
+
+ // Extract series
+ $series = null;
+ if (!empty($release['series'][0]['name'])) {
+ $series = trim($release['series'][0]['name']);
+ }
+
+ // Map Discogs format to Pinakes format
+ $format = $this->mapDiscogsFormat($release['formats'] ?? []);
+
+ // Extract all genres + styles as keywords
+ $allGenres = [];
+ foreach ($release['genres'] ?? [] as $g) {
+ $g = trim((string) $g);
+ if ($g !== '') {
+ $allGenres[] = $g;
+ }
+ }
+ foreach ($release['styles'] ?? [] as $style) {
+ $s = trim((string) $style);
+ if ($s !== '' && !in_array($s, $allGenres, true)) {
+ $allGenres[] = $s;
+ }
+ }
+ $genre = $allGenres[0] ?? '';
+ $keywords = implode(', ', $allGenres);
+
+ // Year
+ $year = isset($release['year']) && $release['year'] > 0
+ ? (string) $release['year']
+ : null;
+
+ // Weight in kg (Discogs gives grams)
+ $weightKg = null;
+ if (!empty($release['estimated_weight']) && is_numeric($release['estimated_weight'])) {
+ $weightKg = round((float) $release['estimated_weight'] / 1000, 3);
+ }
+
+ // Price
+ $price = null;
+ if (!empty($release['lowest_price']) && is_numeric($release['lowest_price'])) {
+ $price = (string) $release['lowest_price'];
+ }
+
+ // Number of tracks
+ $trackCount = 0;
+ foreach ($release['tracklist'] ?? [] as $track) {
+ if (($track['type_'] ?? 'track') === 'track' && trim($track['title'] ?? '') !== '') {
+ $trackCount++;
+ }
+ }
+
+ // Format quantity (number of discs)
+ $formatQty = (int) ($release['format_quantity'] ?? 1);
+
+ // Notes from Discogs
+ $discogsNotes = trim($release['notes'] ?? '');
+
+ // Build note_varie with extra metadata
+ $noteParts = [];
+ if ($catalogNumber !== '') {
+ $noteParts[] = 'Cat#: ' . $catalogNumber;
+ }
+ if (!empty($release['country'])) {
+ $noteParts[] = 'Country: ' . $release['country'];
+ }
+ if ($formatQty > 1) {
+ $noteParts[] = $formatQty . ' discs';
+ }
+ // Extra artists (producers, engineers, etc.)
+ $credits = $this->extractCredits($release['extraartists'] ?? []);
+ if ($credits !== '') {
+ $noteParts[] = $credits;
+ }
+ if ($discogsNotes !== '') {
+ $noteParts[] = $discogsNotes;
+ }
+ $noteVarie = implode("\n", $noteParts);
+
+ // Discogs URL for sameAs
+ $discogsUrl = $release['uri'] ?? null;
+
+ // Physical description (format details)
+ $physicalDesc = '';
+ if (!empty($release['formats'][0])) {
+ $fmt = $release['formats'][0];
+ $parts = [$fmt['name'] ?? ''];
+ foreach ($fmt['descriptions'] ?? [] as $desc) {
+ $parts[] = $desc;
+ }
+ $physicalDesc = implode(', ', array_filter($parts));
+ }
+
+ $releaseBarcode = $fallbackBarcode ?? $this->extractBarcodeFromRelease($release, $searchResult);
+
+ return [
+ 'title' => $title,
+ 'author' => $firstArtist,
+ 'authors' => $artists,
+ 'description' => $description,
+ 'image' => $coverUrl,
+ 'cover_url' => $coverUrl,
+ 'year' => $year,
+ 'publisher' => $publisher,
+ 'series' => $series ?? '',
+ 'format' => $format,
+ 'genres' => $genre,
+ 'parole_chiave' => $keywords,
+ 'isbn10' => null,
+ 'isbn13' => null,
+ 'ean' => $releaseBarcode,
+ 'country' => $release['country'] ?? null,
+ 'tipo_media' => 'disco',
+ 'source' => 'discogs',
+ 'discogs_id' => $release['id'] ?? null,
+ 'peso' => $weightKg,
+ 'prezzo' => $price,
+ 'numero_pagine' => $trackCount > 0 ? (string) $trackCount : null,
+ 'note_varie' => $noteVarie !== '' ? $noteVarie : null,
+ 'physical_description' => $physicalDesc !== '' ? $physicalDesc : null,
+ // Catalog number is recorded in note_varie ("Cat#: ...").
+ // numero_inventario is reserved for the library's internal per-copy
+ // inventory prefix — do not pre-fill from external metadata.
+ 'discogs_url' => $discogsUrl,
+ ];
+ }
+
+ /**
+ * Extract album title from Discogs "Artist - Album" format
+ *
+ * Discogs returns titles like "Pink Floyd - The Dark Side Of The Moon".
+ * We want just the album part: "The Dark Side Of The Moon".
+ *
+ * @param string $fullTitle Full Discogs title
+ * @return string Album title only
+ */
+ private function extractAlbumTitle(string $fullTitle): string
+ {
+ $fullTitle = trim($fullTitle);
+ if ($fullTitle === '') {
+ return '';
+ }
+
+ // Split on " - " (with spaces) to separate artist from album
+ $parts = explode(' - ', $fullTitle, 2);
+ if (count($parts) === 2) {
+ $albumPart = trim($parts[1]);
+ if ($albumPart !== '') {
+ return $albumPart;
+ }
+ }
+
+ // If no separator found or album part is empty, return full title
+ return $fullTitle;
+ }
+
+ /**
+ * Extract artist names from Discogs artists array
+ *
+ * @param array $artists Discogs artists array
+ * @return array Artist name strings
+ */
+ private function extractArtists(array $artists): array
+ {
+ $names = [];
+ foreach ($artists as $artist) {
+ $name = trim($artist['name'] ?? '');
+ if ($name !== '') {
+ // Discogs appends " (2)" etc. for disambiguation — remove it
+ $name = (string)preg_replace('/\s*\(\d+\)$/', '', $name);
+ $names[] = $name;
+ }
+ }
+ return $names;
+ }
+
+ /**
+ * Extract credits from Discogs extraartists (producers, engineers, etc.)
+ */
+ private function extractCredits(array $extraartists): string
+ {
+ if (empty($extraartists)) {
+ return '';
+ }
+ $credits = [];
+ foreach ($extraartists as $person) {
+ $name = trim($person['name'] ?? '');
+ $role = trim($person['role'] ?? '');
+ if ($name === '' || $role === '') {
+ continue;
+ }
+ // Clean disambiguation suffix
+ $name = (string) preg_replace('/\s*\(\d+\)$/', '', $name);
+ $credits[] = $role . ': ' . $name;
+ }
+ if (empty($credits)) {
+ return '';
+ }
+ return 'Credits: ' . implode(', ', $credits);
+ }
+
+ /**
+ * Build a tracklist description from Discogs tracklist data
+ *
+ * Produces text like:
+ * Tracklist:
+ * 1. Speak to Me (1:30)
+ * 2. Breathe (2:43)
+ *
+ * @param array $tracklist Discogs tracklist array
+ * @return string Formatted tracklist
+ */
+ private function buildTracklistDescription(array $tracklist): string
+ {
+ if (empty($tracklist)) {
+ return '';
+ }
+
+ $items = [];
+ foreach ($tracklist as $track) {
+ $trackTitle = trim($track['title'] ?? '');
+ if ($trackTitle === '') {
+ continue;
+ }
+ $duration = trim($track['duration'] ?? '');
+ $text = htmlspecialchars($trackTitle, ENT_QUOTES, 'UTF-8');
+ if ($duration !== '') {
+ $text .= ' (' . htmlspecialchars($duration, ENT_QUOTES, 'UTF-8') . ')';
+ }
+ $items[] = $text;
+ }
+
+ if (empty($items)) {
+ return '';
+ }
+
+ return '' . implode('', array_map(static fn(string $item): string => '- ' . $item . '
', $items)) . '
';
+ }
+
+ /**
+ * Map Discogs format names to Pinakes format identifiers
+ *
+ * @param array $formats Discogs formats array
+ * @return string Pinakes format string
+ */
+ private function mapDiscogsFormat(array $formats): string
+ {
+ if (empty($formats[0]['name'])) {
+ return 'altro';
+ }
+
+ $discogsFormat = strtolower(trim($formats[0]['name']));
+
+ $formatMap = [
+ 'cd' => 'cd_audio',
+ 'cdr' => 'cd_audio',
+ 'cds' => 'cd_audio',
+ 'sacd' => 'cd_audio',
+ 'vinyl' => 'vinile',
+ 'lp' => 'vinile',
+ 'cassette' => 'audiocassetta',
+ 'dvd' => 'dvd',
+ 'blu-ray' => 'blu_ray',
+ 'file' => 'digitale',
+ 'all media' => 'altro',
+ ];
+
+ foreach ($formatMap as $discogsKey => $pinakesValue) {
+ if (str_contains($discogsFormat, $discogsKey)) {
+ return $pinakesValue;
+ }
+ }
+
+ return 'altro';
+ }
+
+ // ─── API Communication ──────────────────────────────────────────────
+
+ /**
+ * Make an authenticated request to the Discogs API
+ *
+ * Discogs requires:
+ * - A descriptive User-Agent header (mandatory)
+ * - Optional: Authorization token for higher rate limits (60/min vs 25/min)
+ *
+ * @param string $url Full API URL
+ * @param string|null $token Optional Discogs personal access token
+ * @return array|null Decoded JSON response or null on failure
+ */
+ /** @var float Timestamp of last API request for rate limiting */
+ private static float $lastRequestTime = 0.0;
+ private static float $lastDeezerRequestTime = 0.0;
+
+ private function apiRequest(string $url, ?string $token = null): ?array
+ {
+ // Centralized rate limiting: 1s with token (60 req/min), 2.5s without (25 req/min)
+ $minInterval = ($token !== null && $token !== '') ? 1.0 : 2.5;
+ $elapsed = microtime(true) - self::$lastRequestTime;
+ if (self::$lastRequestTime > 0 && $elapsed < $minInterval) {
+ usleep((int) (($minInterval - $elapsed) * 1_000_000));
+ }
+ self::$lastRequestTime = microtime(true);
+
+ $headers = [
+ 'Accept: application/vnd.discogs.v2.discogs+json',
+ ];
+
+ if ($token !== null && $token !== '') {
+ $headers[] = 'Authorization: Discogs token=' . $token;
+ }
+
+ $ch = curl_init();
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_TIMEOUT => self::TIMEOUT,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_USERAGENT => self::USER_AGENT,
+ CURLOPT_HTTPHEADER => $headers,
+ CURLOPT_SSL_VERIFYPEER => true,
+ ]);
+
+ $response = curl_exec($ch);
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $curlError = curl_error($ch);
+ curl_close($ch);
+
+ if ($curlError !== '') {
+ \App\Support\SecureLogger::warning('[Discogs] cURL error: ' . $curlError);
+ return null;
+ }
+
+ if ($httpCode !== 200 || !is_string($response) || $response === '') {
+ $this->logApiFailure('Discogs', (int) $httpCode, $url);
+ return null;
+ }
+
+ $data = json_decode($response, true);
+ if (!is_array($data)) {
+ \App\Support\SecureLogger::warning('[Discogs] JSON decode failed', [
+ 'url' => $url,
+ 'error' => json_last_error_msg(),
+ ]);
+ return null;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Log a failed external API request with severity inferred from HTTP code.
+ * 404 is treated as a normal "not found" and logged at debug level only.
+ */
+ private function logApiFailure(string $source, int $httpCode, string $url): void
+ {
+ $ctx = ['http_code' => $httpCode, 'url' => $url];
+ if ($httpCode === 404 || $httpCode === 0) {
+ \App\Support\SecureLogger::debug('[' . $source . '] Request returned ' . $httpCode, $ctx);
+ return;
+ }
+ if ($httpCode === 401 || $httpCode === 403) {
+ \App\Support\SecureLogger::error('[' . $source . '] Authentication failed (HTTP ' . $httpCode . ') — verify API token', $ctx);
+ return;
+ }
+ \App\Support\SecureLogger::warning('[' . $source . '] Request failed (HTTP ' . $httpCode . ')', $ctx);
+ }
+
+ // ─── Settings ───────────────────────────────────────────────────────
+
+ /**
+ * Read a plugin setting from plugin_settings table
+ *
+ * Settings are stored with the plugin's ID in the plugin_settings table,
+ * following the same pattern as OpenLibraryPlugin.
+ *
+ * @param string $key Setting key (e.g. 'api_token')
+ * @return string|null Setting value or null
+ */
+ private function getSetting(string $key): ?string
+ {
+ $pluginId = $this->resolvePluginId();
+ $manager = $this->getPluginManager();
+
+ if ($pluginId === null || $manager === null) {
+ return null;
+ }
+
+ $value = $manager->getSetting($pluginId, $key);
+ return is_string($value) ? $value : null;
+ }
+
+ /**
+ * Get public settings info (for admin UI)
+ *
+ * @return array Settings map
+ */
+ public function getSettings(): array
+ {
+ $token = $this->getSetting('api_token');
+ return [
+ 'api_token' => $token !== null && $token !== '' ? '********' : '',
+ ];
+ }
+
+ /**
+ * Save plugin settings to plugin_settings table
+ *
+ * @param array $settings Settings key-value pairs
+ * @return bool True if all settings were saved successfully
+ */
+ public function saveSettings(array $settings): bool
+ {
+ $pluginId = $this->resolvePluginId();
+ $manager = $this->getPluginManager();
+
+ if ($pluginId === null || $manager === null) {
+ return false;
+ }
+
+ foreach ($settings as $key => $value) {
+ if (!$manager->setSetting($pluginId, (string) $key, $value, true)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private function resolvePluginId(): ?int
+ {
+ if ($this->pluginId !== null || $this->db === null) {
+ return $this->pluginId;
+ }
+
+ $stmt = $this->db->prepare("SELECT id FROM plugins WHERE name = ? LIMIT 1");
+ if ($stmt === false) {
+ return null;
+ }
+
+ $pluginName = 'discogs';
+ $stmt->bind_param('s', $pluginName);
+ $stmt->execute();
+ $result = $stmt->get_result();
+ $row = $result ? $result->fetch_assoc() : null;
+ if ($result) {
+ $result->free();
+ }
+ $stmt->close();
+
+ $this->pluginId = isset($row['id']) ? (int) $row['id'] : null;
+ return $this->pluginId;
+ }
+
+ private function getPluginManager(): ?\App\Support\PluginManager
+ {
+ if ($this->pluginManager !== null) {
+ return $this->pluginManager;
+ }
+
+ if ($this->db === null) {
+ return null;
+ }
+
+ $hookManager = $this->hookManager instanceof \App\Support\HookManager
+ ? $this->hookManager
+ : new \App\Support\HookManager($this->db);
+
+ $this->pluginManager = new \App\Support\PluginManager($this->db, $hookManager);
+ return $this->pluginManager;
+ }
+
+ /**
+ * Whether this plugin has a dedicated settings page
+ */
+ public function hasSettingsPage(): bool
+ {
+ return true;
+ }
+
+ /**
+ * Get the path to the settings view file
+ */
+ public function getSettingsViewPath(): string
+ {
+ return __DIR__ . '/views/settings.php';
+ }
+
+ /**
+ * Get plugin info
+ *
+ * @return array Plugin metadata
+ */
+ public function getInfo(): array
+ {
+ return [
+ 'name' => 'discogs',
+ 'display_name' => 'Music Scraper (Discogs, MusicBrainz, Deezer)',
+ 'version' => '1.1.0',
+ 'description' => 'Scraping multi-sorgente di metadati musicali: Discogs, MusicBrainz + Cover Art Archive, Deezer.',
+ ];
+ }
+
+ // ─── Data Merge ─────────────────────────────────────────────────────
+
+ /**
+ * Merge book data from a new source into existing data
+ *
+ * @param array|null $existing Existing accumulated data
+ * @param array|null $new New data from current source
+ * @return array|null Merged data
+ */
+ private function mergeBookData(?array $existing, ?array $new): ?array
+ {
+ // Use BookDataMerger if available
+ if (class_exists('\\App\\Support\\BookDataMerger')) {
+ $mergeSource = $new['source'] ?? ($existing['source'] ?? 'discogs');
+ return \App\Support\BookDataMerger::merge($existing, $new, $mergeSource);
+ }
+
+ // Fallback: simple merge
+ if ($new === null || empty($new)) {
+ return $existing;
+ }
+
+ if ($existing === null || empty($existing)) {
+ return $new;
+ }
+
+ // Fill empty fields in existing data with new data
+ foreach ($new as $key => $value) {
+ if (str_starts_with($key, '_')) {
+ continue;
+ }
+ if (!isset($existing[$key]) || $existing[$key] === '' ||
+ (is_array($existing[$key]) && empty($existing[$key]))) {
+ $existing[$key] = $value;
+ }
+ }
+
+ return $existing;
+ }
+
+ // ─── MusicBrainz Integration ────────────────────────────────────────
+
+ /**
+ * Search MusicBrainz by barcode as fallback when Discogs finds nothing
+ *
+ * @param string $barcode EAN/UPC barcode
+ * @param string|null $fallbackBarcode Persist this barcode only when it was validated by the search path
+ * @return array|null Pinakes-formatted data or null if not found
+ */
+ private function searchMusicBrainz(string $barcode, ?string $fallbackBarcode): ?array
+ {
+ // Search by barcode
+ $url = 'https://musicbrainz.org/ws/2/release?query=barcode:' . urlencode($barcode) . '&fmt=json&limit=1';
+ $result = $this->musicBrainzRequest($url);
+
+ if (empty($result['releases'][0])) {
+ return null;
+ }
+
+ $release = $result['releases'][0];
+ $mbid = $release['id'] ?? null;
+ // Validate MBID as a MusicBrainz UUID (lowercase hex + dashes, 36 chars).
+ // Defence in depth: a compromised/spoofed upstream response must not be
+ // able to inject `..`, `?`, `#`, or anything else into the detail URL.
+ if (!is_string($mbid) || !preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/', $mbid)) {
+ return null;
+ }
+
+ // Fetch full release details
+ $detailUrl = 'https://musicbrainz.org/ws/2/release/' . rawurlencode($mbid) . '?inc=artists+labels+recordings+release-groups&fmt=json';
+ $detail = $this->musicBrainzRequest($detailUrl);
+ if (empty($detail)) {
+ return null;
+ }
+
+ // Get cover from Cover Art Archive
+ $coverUrl = $this->fetchCoverArtArchive($mbid);
+
+ return $this->mapMusicBrainzToPinakes($detail, $fallbackBarcode, $coverUrl);
+ }
+
+ /**
+ * Map MusicBrainz release data to Pinakes book data format
+ *
+ * @param array $release Full release data from MusicBrainz
+ * @param string|null $fallbackBarcode Original barcode used for search
+ * @param string|null $coverUrl Cover URL from Cover Art Archive
+ * @return array Pinakes-formatted data
+ */
+ private function mapMusicBrainzToPinakes(array $release, ?string $fallbackBarcode, ?string $coverUrl): array
+ {
+ $title = trim($release['title'] ?? '');
+
+ // Extract artists from artist-credit array
+ $artists = [];
+ $firstArtist = '';
+ if (!empty($release['artist-credit']) && is_array($release['artist-credit'])) {
+ foreach ($release['artist-credit'] as $credit) {
+ $name = trim($credit['name'] ?? '');
+ if ($name !== '') {
+ $artists[] = $name;
+ }
+ }
+ $firstArtist = $artists[0] ?? '';
+ }
+
+ // Build tracklist HTML from media/tracks
+ $description = '';
+ if (!empty($release['media'][0]['tracks']) && is_array($release['media'][0]['tracks'])) {
+ $items = [];
+ foreach ($release['media'][0]['tracks'] as $track) {
+ $trackTitle = trim($track['title'] ?? '');
+ if ($trackTitle === '') {
+ continue;
+ }
+ $text = htmlspecialchars($trackTitle, ENT_QUOTES, 'UTF-8');
+ // Length is in milliseconds
+ $lengthMs = $track['length'] ?? null;
+ if ($lengthMs !== null && is_numeric($lengthMs) && (int)$lengthMs > 0) {
+ $totalSeconds = (int)round((int)$lengthMs / 1000);
+ $minutes = intdiv($totalSeconds, 60);
+ $seconds = $totalSeconds % 60;
+ $duration = $minutes . ':' . str_pad((string)$seconds, 2, '0', STR_PAD_LEFT);
+ $text .= ' (' . $duration . ')';
+ }
+ $items[] = $text;
+ }
+ if (!empty($items)) {
+ $description = '' . implode('', array_map(
+ static fn(string $item): string => '- ' . $item . '
',
+ $items
+ )) . '
';
+ }
+ }
+
+ // Year: first 4 chars of date
+ $year = null;
+ $date = $release['date'] ?? '';
+ if (is_string($date) && strlen($date) >= 4) {
+ $year = substr($date, 0, 4);
+ }
+
+ // Publisher: first label
+ $publisher = '';
+ if (!empty($release['label-info'][0]['label']['name'])) {
+ $publisher = trim((string)$release['label-info'][0]['label']['name']);
+ }
+
+ // Format mapping
+ $format = 'altro';
+ if (!empty($release['media'][0]['format'])) {
+ $mbFormat = strtolower(trim((string)$release['media'][0]['format']));
+ $formatMap = [
+ 'cd' => 'cd_audio',
+ 'vinyl' => 'vinile',
+ 'cassette' => 'audiocassetta',
+ 'digital media' => 'digitale',
+ 'dvd' => 'dvd',
+ 'blu-ray' => 'blu_ray',
+ ];
+ foreach ($formatMap as $key => $value) {
+ if (str_contains($mbFormat, $key)) {
+ $format = $value;
+ break;
+ }
+ }
+ }
+
+ // Track count
+ $trackCount = 0;
+ if (!empty($release['media'][0]['tracks']) && is_array($release['media'][0]['tracks'])) {
+ $trackCount = count($release['media'][0]['tracks']);
+ }
+
+ $releaseBarcode = $fallbackBarcode ?? $this->extractBarcodeFromRelease($release);
+
+ return [
+ 'title' => $title,
+ 'author' => $firstArtist,
+ 'authors' => $artists,
+ 'description' => $description,
+ 'image' => $coverUrl,
+ 'cover_url' => $coverUrl,
+ 'year' => $year,
+ 'publisher' => $publisher,
+ 'series' => '',
+ 'format' => $format,
+ 'genres' => '',
+ 'parole_chiave' => '',
+ 'isbn10' => null,
+ 'isbn13' => null,
+ 'ean' => $releaseBarcode,
+ 'country' => $release['country'] ?? null,
+ 'tipo_media' => 'disco',
+ 'source' => 'musicbrainz',
+ 'musicbrainz_id' => $release['id'] ?? null,
+ 'numero_pagine' => $trackCount > 0 ? (string)$trackCount : null,
+ ];
+ }
+
+ private function extractBarcodeFromRelease(array $release, array $searchResult = []): ?string
+ {
+ $candidates = [];
+
+ $this->appendBarcodeCandidates($candidates, $release['barcode'] ?? null);
+ $this->appendBarcodeCandidates($candidates, $searchResult['barcode'] ?? null);
+ foreach ($release['identifiers'] ?? [] as $identifier) {
+ if (!is_array($identifier)) {
+ continue;
+ }
+ $type = strtolower(trim((string) ($identifier['type'] ?? '')));
+ if ($type !== '' && !str_contains($type, 'barcode')) {
+ continue;
+ }
+ $candidates[] = (string) ($identifier['value'] ?? '');
+ }
+
+ foreach ($candidates as $candidate) {
+ $normalized = preg_replace('/\D+/', '', $candidate) ?? '';
+ if ($normalized !== '' && (strlen($normalized) === 12 || strlen($normalized) === 13)) {
+ return $normalized;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @param array $candidates
+ * @param mixed $value
+ */
+ private function appendBarcodeCandidates(array &$candidates, $value): void
+ {
+ if (is_array($value)) {
+ foreach ($value as $nestedValue) {
+ $this->appendBarcodeCandidates($candidates, $nestedValue);
+ }
+ return;
+ }
+
+ if ($value === null || $value === '') {
+ return;
+ }
+
+ $candidates[] = (string) $value;
+ }
+
+ /**
+ * Fetch cover art URL from the Cover Art Archive
+ *
+ * @param string $mbid MusicBrainz release ID
+ * @return string|null URL of the cover image or null if unavailable
+ */
+ private function fetchCoverArtArchive(string $mbid): ?string
+ {
+ // Cover Art Archive — no rate limit, but may 404
+ $url = 'https://coverartarchive.org/release/' . urlencode($mbid);
+ $ch = curl_init();
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_USERAGENT => self::USER_AGENT,
+ CURLOPT_SSL_VERIFYPEER => true,
+ ]);
+ $resp = curl_exec($ch);
+ $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $curlErr = curl_error($ch);
+ curl_close($ch);
+
+ if ($curlErr !== '') {
+ \App\Support\SecureLogger::warning('[CoverArt] cURL error: ' . $curlErr);
+ return null;
+ }
+
+ if ($code !== 200 || !is_string($resp)) {
+ $this->logApiFailure('CoverArt', (int) $code, $url);
+ return null;
+ }
+
+ $data = json_decode($resp, true);
+ if (!is_array($data) || empty($data['images']) || !is_array($data['images'])) {
+ return null;
+ }
+
+ // Prefer front cover, then first image
+ foreach ($data['images'] as $img) {
+ if (!is_array($img)) {
+ continue;
+ }
+ if (($img['front'] ?? false) === true) {
+ return $img['thumbnails']['large'] ?? $img['image'] ?? null;
+ }
+ }
+
+ $firstImg = $data['images'][0];
+ if (is_array($firstImg)) {
+ return $firstImg['thumbnails']['large'] ?? $firstImg['image'] ?? null;
+ }
+
+ return null;
+ }
+
+ /**
+ * Make a rate-limited request to the MusicBrainz API
+ *
+ * MusicBrainz enforces a strict 1 request/second limit.
+ * We use 1.1s between requests for safety margin.
+ *
+ * @param string $url Full MusicBrainz API URL
+ * @return array|null Decoded JSON response or null on failure
+ */
+ private function musicBrainzRequest(string $url): ?array
+ {
+ // MusicBrainz requires 1 req/s strictly
+ $elapsed = microtime(true) - self::$lastMbRequestTime;
+ if (self::$lastMbRequestTime > 0 && $elapsed < 1.1) {
+ usleep((int)((1.1 - $elapsed) * 1_000_000));
+ }
+ self::$lastMbRequestTime = microtime(true);
+
+ $ch = curl_init();
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_TIMEOUT => self::TIMEOUT,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_USERAGENT => self::USER_AGENT,
+ CURLOPT_HTTPHEADER => ['Accept: application/json'],
+ CURLOPT_SSL_VERIFYPEER => true,
+ ]);
+ $resp = curl_exec($ch);
+ $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $curlErr = curl_error($ch);
+ curl_close($ch);
+
+ if ($curlErr !== '') {
+ \App\Support\SecureLogger::warning('[MusicBrainz] cURL error: ' . $curlErr);
+ return null;
+ }
+
+ if ($code !== 200 || !is_string($resp)) {
+ $this->logApiFailure('MusicBrainz', (int) $code, $url);
+ return null;
+ }
+
+ $data = json_decode($resp, true);
+ if (!is_array($data)) {
+ \App\Support\SecureLogger::warning('[MusicBrainz] JSON decode failed', [
+ 'url' => $url,
+ 'error' => json_last_error_msg(),
+ ]);
+ return null;
+ }
+ return $data;
+ }
+
+ // ─── Deezer Integration ─────────────────────────────────────────────
+
+ /**
+ * Enrich data with Deezer album cover and metadata
+ *
+ * Searches Deezer by title+artist to find a matching album,
+ * then fills in missing cover image.
+ *
+ * @param array $data Current Pinakes data (must have 'title')
+ * @return array Enriched data
+ */
+ private function enrichFromDeezer(array $data): array
+ {
+ $title = trim($data['title'] ?? '');
+ $artist = trim($data['author'] ?? '');
+ if ($title === '') {
+ return $data;
+ }
+
+ $query = $artist !== '' ? $artist . ' ' . $title : $title;
+ $url = 'https://api.deezer.com/search/album?q=' . urlencode($query) . '&limit=1';
+
+ // Elapsed-based rate limit — 1 second between Deezer requests
+ $elapsed = microtime(true) - self::$lastDeezerRequestTime;
+ if (self::$lastDeezerRequestTime > 0 && $elapsed < 1.0) {
+ usleep((int) ((1.0 - $elapsed) * 1_000_000));
+ }
+ self::$lastDeezerRequestTime = microtime(true);
+
+ $ch = curl_init();
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_TIMEOUT => 10,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS,
+ CURLOPT_USERAGENT => self::USER_AGENT,
+ CURLOPT_SSL_VERIFYPEER => true,
+ ]);
+ $resp = curl_exec($ch);
+ $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $curlErr = curl_error($ch);
+ curl_close($ch);
+
+ if ($curlErr !== '') {
+ \App\Support\SecureLogger::warning('[Deezer] cURL error: ' . $curlErr);
+ return $data;
+ }
+
+ if ($code !== 200 || !is_string($resp)) {
+ $this->logApiFailure('Deezer', (int) $code, $url);
+ return $data;
+ }
+
+ $result = json_decode($resp, true);
+ if (!is_array($result)) {
+ \App\Support\SecureLogger::warning('[Deezer] JSON decode failed', [
+ 'url' => $url,
+ 'error' => json_last_error_msg(),
+ ]);
+ return $data;
+ }
+ if (empty($result['data'][0])) {
+ return $data;
+ }
+
+ $album = $result['data'][0];
+ if (!is_array($album)) {
+ return $data;
+ }
+
+ // Fill missing cover with Deezer's high-quality image
+ if (empty($data['image']) && !empty($album['cover_xl'])) {
+ $data['image'] = $album['cover_xl'];
+ $data['cover_url'] = $album['cover_xl'];
+ }
+
+ return $data;
+ }
+}
diff --git a/storage/plugins/discogs/README.md b/storage/plugins/discogs/README.md
new file mode 100644
index 00000000..16c6716e
--- /dev/null
+++ b/storage/plugins/discogs/README.md
@@ -0,0 +1,130 @@
+# Music Scraper Plugin (Discogs, MusicBrainz, Deezer)
+
+Plugin multi-sorgente per lo scraping di metadati musicali in Pinakes, pensato per catalogare supporti musicali (CD, LP, vinili, cassette). Interroga Discogs, MusicBrainz + Cover Art Archive e Deezer per massimizzare la copertura dei dati.
+
+## Funzionamento
+
+Il plugin si aggancia al sistema di scraping tramite quattro hook:
+
+- **scrape.sources** (priorita 8) -- Registra il plugin come fonte di scraping
+- **scrape.fetch.custom** (priorita 8) -- Esegue la ricerca e il recupero dei metadati
+- **scrape.data.modify** (priorita 15) -- Arricchisce i dati con copertine mancanti
+- **scrape.isbn.validate** (priorita 8) -- Accetta codici UPC/EAN a 12-13 cifre oltre agli ISBN
+
+### Strategia di ricerca
+
+1. Ricerca per barcode (EAN/UPC) su Discogs -- `GET /database/search?barcode={ean}&type=release`
+2. Recupero dettagli completi della release Discogs -- `GET /releases/{id}`
+3. **Fallback MusicBrainz** -- se Discogs non trova risultati, cerca su MusicBrainz per barcode
+4. **Arricchimento Deezer** -- se manca la copertina, cerca su Deezer per titolo+artista
+
+## Mappatura dati Discogs -> Pinakes
+
+| Discogs | Pinakes | Note |
+|---------|---------|------|
+| Artist | Autore | Rimossa disambiguazione "(2)" ecc. |
+| Album title | Titolo | Estratto da formato "Artist - Album" |
+| Label | Editore | Prima etichetta |
+| Barcode | EAN | Il codice usato per la ricerca |
+| Year | Anno | Anno di uscita della release |
+| Tracklist | Descrizione | Formattata come "1. Titolo (3:45)" |
+| Cover image | Copertina | Immagine primaria o thumbnail |
+| Format | Formato | CD -> cd_audio, Vinyl -> vinile, ecc. |
+| Genre | Genere | Primo genere della release |
+| Series | Serie | Se presente nella release |
+| Country | Paese | Paese di pubblicazione |
+
+### Formati supportati
+
+| Discogs | Pinakes |
+|---------|---------|
+| CD, CDr, CDs, SACD | cd_audio |
+| Vinyl, LP | vinile |
+| Cassette | audiocassetta |
+| DVD | dvd |
+| Blu-ray | blu_ray |
+| File | digitale |
+| Altro | altro |
+
+## Token API (opzionale)
+
+Senza token le API di Discogs permettono 25 richieste al minuto. Con un token personale il limite sale a 60 richieste al minuto.
+
+### Come ottenere un token
+
+1. Accedi a https://www.discogs.com/settings/developers
+2. Clicca "Generate new token"
+3. Copia il token generato
+4. Inseriscilo nelle impostazioni del plugin in Pinakes (chiave: `api_token`)
+
+**Nota:** le immagini ad alta risoluzione (`images[].uri`) richiedono autenticazione. Senza token il plugin usa le thumbnail dalla ricerca.
+
+## Installazione
+
+1. Crea un file ZIP con tutti i file del plugin
+2. Vai su **Admin -> Plugin**
+3. Clicca **"Carica Plugin"**
+4. Seleziona il file ZIP e clicca **"Installa"**
+5. Attiva il plugin dalla lista
+
+## MusicBrainz (fallback barcode)
+
+Quando Discogs non trova risultati per un barcode, il plugin cerca automaticamente su [MusicBrainz](https://musicbrainz.org/), un database musicale open data.
+
+- **Ricerca per barcode** -- `GET /ws/2/release?query=barcode:{ean}&fmt=json`
+- **Dettagli release** -- `GET /ws/2/release/{mbid}?inc=artists+labels+recordings+release-groups&fmt=json`
+- **Cover Art Archive** -- le copertine vengono recuperate da [Cover Art Archive](https://coverartarchive.org/), un archivio gratuito collegato a MusicBrainz
+
+### Mappatura MusicBrainz -> Pinakes
+
+| MusicBrainz | Pinakes | Note |
+|-------------|---------|------|
+| title | Titolo | Titolo della release |
+| artist-credit | Autore/i | Array di crediti artista con joinphrase |
+| media.tracks | Descrizione | Tracklist HTML con durate (ms -> mm:ss) |
+| date | Anno | Primi 4 caratteri della data |
+| label-info.label.name | Editore | Prima etichetta |
+| media.format | Formato | CD -> cd_audio, Vinyl -> vinile, ecc. |
+| Cover Art Archive | Copertina | Preferisce front cover, poi prima immagine |
+
+Non e richiesta autenticazione. Rate limit: 1 richiesta/secondo (rispettato automaticamente).
+
+## Deezer (copertine HD)
+
+Se dopo Discogs e MusicBrainz la copertina e ancora mancante, il plugin cerca su [Deezer](https://developers.deezer.com/) per titolo+artista (solo copertine HD, non generi).
+
+- **Ricerca album** -- `GET /search/album?q={artista}+{titolo}&limit=1`
+- **Copertina HD** -- usa `cover_xl` (1000x1000px) per la massima qualita
+- Non richiede autenticazione ne API key
+- Rate limit: 1 secondo tra le richieste
+
+## Rate Limiting
+
+Il plugin rispetta i limiti di ciascuna API con throttling adattivo:
+
+| Sorgente | Rate limit | Intervallo |
+|----------|-----------|------------|
+| Discogs (con token) | 60 req/min | 1s tra le chiamate |
+| Discogs (senza token) | 25 req/min | 2.5s tra le chiamate |
+| MusicBrainz | 1 req/s | 1.1s tra le chiamate |
+| Cover Art Archive | Nessun limite | Nessun ritardo aggiuntivo |
+| Deezer | 50 req/5s | 1s tra le chiamate |
+
+In caso di errore 429 (rate limit exceeded) la risposta viene registrata nei log.
+
+## Link utili
+
+- [Discogs API Documentation](https://www.discogs.com/developers)
+- [Discogs Database Search](https://www.discogs.com/developers#page:database,header:database-search)
+- [Discogs Release](https://www.discogs.com/developers#page:database,header:database-release)
+- [MusicBrainz API Documentation](https://musicbrainz.org/doc/MusicBrainz_API)
+- [Cover Art Archive API](https://wiki.musicbrainz.org/Cover_Art_Archive/API)
+- [Deezer API Documentation](https://developers.deezer.com/api)
+
+## Licenza
+
+Questo plugin e parte del progetto Pinakes ed e rilasciato sotto la stessa licenza del progetto principale.
+
+I dati di Discogs sono soggetti ai [termini di utilizzo delle API Discogs](https://www.discogs.com/developers/#page:home,header:home-general-information).
+I dati di MusicBrainz sono disponibili sotto [licenza CC0](https://creativecommons.org/publicdomain/zero/1.0/) (dominio pubblico).
+Le copertine di Cover Art Archive seguono le rispettive licenze indicate per ciascuna immagine.
diff --git a/storage/plugins/discogs/plugin.json b/storage/plugins/discogs/plugin.json
new file mode 100644
index 00000000..d705d9f9
--- /dev/null
+++ b/storage/plugins/discogs/plugin.json
@@ -0,0 +1,72 @@
+{
+ "name": "discogs",
+ "display_name": "Music Scraper (Discogs, MusicBrainz, Deezer)",
+ "description": "Scraping multi-sorgente di metadati musicali: Discogs (barcode/titolo), MusicBrainz + Cover Art Archive (fallback barcode), Deezer (copertine HD). Supporta CD, LP, vinili, cassette.",
+ "version": "1.1.0",
+ "author": "Fabiodalez",
+ "author_url": "",
+ "plugin_url": "https://www.discogs.com",
+ "main_file": "wrapper.php",
+ "requires_php": "8.0",
+ "requires_app": "0.5.4",
+ "max_app_version": "0.5.5",
+ "metadata": {
+ "optional": true,
+ "category": "scraping",
+ "tags": [
+ "api",
+ "discogs",
+ "musicbrainz",
+ "deezer",
+ "scraping",
+ "music",
+ "vinyl",
+ "cd"
+ ],
+ "priority": 8,
+ "api_endpoints": [
+ "https://api.discogs.com/database/search",
+ "https://api.discogs.com/releases/{id}",
+ "https://musicbrainz.org/ws/2/release",
+ "https://coverartarchive.org/release/{mbid}",
+ "https://api.deezer.com/search/album"
+ ],
+ "hooks": [
+ {
+ "name": "scrape.sources",
+ "callback_method": "addDiscogsSource",
+ "description": "Registers Discogs in the scraping source list",
+ "priority": 8
+ },
+ {
+ "name": "scrape.fetch.custom",
+ "callback_method": "fetchFromDiscogs",
+ "description": "Fetches metadata from Discogs API (with MusicBrainz fallback)",
+ "priority": 8
+ },
+ {
+ "name": "scrape.data.modify",
+ "callback_method": "enrichWithDiscogsData",
+ "description": "Enriches data with Discogs covers and tracklists",
+ "priority": 15
+ },
+ {
+ "name": "scrape.isbn.validate",
+ "callback_method": "validateBarcode",
+ "description": "Accepts 12/13-digit UPC/EAN barcodes (not just ISBNs) for music scraping",
+ "priority": 8
+ }
+ ],
+ "features": [
+ "Ricerca per barcode (EAN/UPC 12-13 cifre)",
+ "Ricerca per titolo/artista",
+ "Copertine album ad alta risoluzione",
+ "Tracklist completa nella descrizione",
+ "Mappatura etichetta su editore",
+ "Generi/stili Discogs salvati come parole chiave",
+ "Supporto CD, vinile, cassette",
+ "Fallback MusicBrainz + Cover Art Archive per barcode",
+ "Arricchimento copertine HD da Deezer"
+ ]
+ }
+}
diff --git a/storage/plugins/discogs/views/settings.php b/storage/plugins/discogs/views/settings.php
new file mode 100644
index 00000000..3cb451bc
--- /dev/null
+++ b/storage/plugins/discogs/views/settings.php
@@ -0,0 +1,182 @@
+Errore: Plugin non caricato correttamente.
';
+ return;
+}
+
+// Gestione salvataggio impostazioni
+if ($_SERVER['REQUEST_METHOD'] === 'POST' && (isset($_POST['save_discogs_settings']) || isset($_POST['clear_discogs_settings']))) {
+ if (\App\Support\Csrf::validate($_POST['csrf_token'] ?? null)) {
+ if (isset($_POST['clear_discogs_settings'])) {
+ if ($plugin->saveSettings(['api_token' => ''])) {
+ $successMessage = __('Token Discogs rimosso correttamente.');
+ } else {
+ $errorMessage = __('Errore nel salvataggio delle impostazioni.');
+ }
+ } else {
+ $rawToken = $_POST['api_token'] ?? '';
+ $apiToken = is_string($rawToken) ? trim($rawToken) : '';
+ if ($apiToken !== '') {
+ $settings = ['api_token' => $apiToken];
+ if ($plugin->saveSettings($settings)) {
+ $successMessage = __('Impostazioni Discogs salvate correttamente.');
+ } else {
+ $errorMessage = __('Errore nel salvataggio delle impostazioni.');
+ }
+ }
+ }
+ } else {
+ $errorMessage = __('Token CSRF non valido.');
+ }
+}
+
+$currentSettings = $plugin->getSettings();
+$hasToken = !empty($currentSettings['api_token']);
+$csrfToken = \App\Support\Csrf::ensureToken();
+$pluginsRoute = htmlspecialchars(route_path('plugins'), ENT_QUOTES, 'UTF-8');
+?>
+
+
+
+
diff --git a/storage/plugins/discogs/wrapper.php b/storage/plugins/discogs/wrapper.php
new file mode 100644
index 00000000..a9ca868b
--- /dev/null
+++ b/storage/plugins/discogs/wrapper.php
@@ -0,0 +1,107 @@
+instance = new \App\Plugins\Discogs\DiscogsPlugin($db, $hookManager);
+ }
+
+ /**
+ * Activate the plugin
+ */
+ public function activate(): void
+ {
+ if (is_callable([$this->instance, 'activate'])) {
+ $this->instance->activate();
+ }
+ }
+
+ /**
+ * Deactivate the plugin (called by PluginManager)
+ */
+ public function onDeactivate(): void
+ {
+ if (is_callable([$this->instance, 'onDeactivate'])) {
+ $this->instance->onDeactivate();
+ }
+ \App\Support\SecureLogger::debug('[Discogs] Plugin deactivated');
+ }
+
+ /**
+ * Called when plugin is installed (by PluginManager)
+ */
+ public function onInstall(): void
+ {
+ if (is_callable([$this->instance, 'onInstall'])) {
+ $this->instance->onInstall();
+ }
+ \App\Support\SecureLogger::debug('[Discogs] Plugin installed');
+ }
+
+ /**
+ * Called when plugin is activated (by PluginManager)
+ */
+ public function onActivate(): void
+ {
+ if (is_callable([$this->instance, 'onActivate'])) {
+ $this->instance->onActivate();
+ } elseif (is_callable([$this->instance, 'activate'])) {
+ $this->instance->activate();
+ }
+ \App\Support\SecureLogger::debug('[Discogs] Plugin activated');
+ }
+
+ /**
+ * Called when plugin is uninstalled (by PluginManager)
+ */
+ public function onUninstall(): void
+ {
+ if (is_callable([$this->instance, 'onUninstall'])) {
+ $this->instance->onUninstall();
+ }
+ \App\Support\SecureLogger::debug('[Discogs] Plugin uninstalled');
+ }
+
+ /**
+ * Set the plugin ID (called by PluginManager after installation)
+ */
+ public function setPluginId(int $pluginId): void
+ {
+ if (is_callable([$this->instance, 'setPluginId'])) {
+ $this->instance->setPluginId($pluginId);
+ }
+ }
+
+ /**
+ * Forward all method calls to the namespaced instance
+ */
+ public function __call($method, $args)
+ {
+ if (is_callable([$this->instance, $method])) {
+ return call_user_func_array([$this->instance, $method], $args);
+ }
+
+ throw new \BadMethodCallException("Method {$method} does not exist");
+ }
+ }
+}
diff --git a/storage/plugins/goodlib/plugin.json b/storage/plugins/goodlib/plugin.json
index 91249532..803da813 100644
--- a/storage/plugins/goodlib/plugin.json
+++ b/storage/plugins/goodlib/plugin.json
@@ -9,7 +9,7 @@
"main_file": "wrapper.php",
"requires_php": "8.0",
"requires_app": "0.4.0",
- "max_app_version": "1.0.0",
+ "max_app_version": "0.5.5",
"metadata": {
"category": "discovery",
"priority": 10,
diff --git a/storage/plugins/musicbrainz/plugin.json b/storage/plugins/musicbrainz/plugin.json
new file mode 100644
index 00000000..90b89518
--- /dev/null
+++ b/storage/plugins/musicbrainz/plugin.json
@@ -0,0 +1,56 @@
+{
+ "name": "musicbrainz",
+ "display_name": "MusicBrainz + Cover Art Archive",
+ "description": "Integrazione con MusicBrainz e Cover Art Archive per metadati musicali. Cerca per barcode, fornisce artista, album, tracklist, etichetta, copertine HD. Open data, nessun token richiesto.",
+ "version": "1.0.0",
+ "author": "Fabiodalez",
+ "author_url": "",
+ "plugin_url": "https://musicbrainz.org",
+ "main_file": "wrapper.php",
+ "requires_php": "8.0",
+ "requires_app": "0.5.0",
+ "max_app_version": "0.5.5",
+ "metadata": {
+ "category": "scraping",
+ "tags": [
+ "api",
+ "musicbrainz",
+ "coverart",
+ "scraping",
+ "music"
+ ],
+ "priority": 7,
+ "api_endpoints": [
+ "https://musicbrainz.org/ws/2/release",
+ "https://coverartarchive.org/release/{mbid}"
+ ],
+ "hooks": [
+ {
+ "name": "scrape.sources",
+ "callback_method": "addMusicBrainzSource",
+ "description": "Adds MusicBrainz as a scraping source for music media",
+ "priority": 7
+ },
+ {
+ "name": "scrape.fetch.custom",
+ "callback_method": "fetchFromMusicBrainz",
+ "description": "Fetches metadata from MusicBrainz API by barcode",
+ "priority": 7
+ },
+ {
+ "name": "scrape.data.modify",
+ "callback_method": "enrichWithCoverArt",
+ "description": "Enriches data with Cover Art Archive covers",
+ "priority": 12
+ }
+ ],
+ "features": [
+ "Ricerca per barcode (EAN/UPC)",
+ "Tracklist completa nella descrizione",
+ "Copertine HD da Cover Art Archive",
+ "Mappatura etichetta su editore",
+ "Supporto CD, vinile, cassette",
+ "Nessun token richiesto (open data)"
+ ]
+ }
+}
diff --git a/storage/plugins/open-library/plugin.json b/storage/plugins/open-library/plugin.json
index 84cd221f..d8b40642 100644
--- a/storage/plugins/open-library/plugin.json
+++ b/storage/plugins/open-library/plugin.json
@@ -9,7 +9,7 @@
"main_file": "wrapper.php",
"requires_php": "7.4",
"requires_app": "0.4.0",
- "max_app_version": "1.0.0",
+ "max_app_version": "0.5.5",
"metadata": {
"category": "scraping",
"tags": [
diff --git a/storage/plugins/z39-server/plugin.json b/storage/plugins/z39-server/plugin.json
index e8c07d1a..b436e34c 100644
--- a/storage/plugins/z39-server/plugin.json
+++ b/storage/plugins/z39-server/plugin.json
@@ -9,7 +9,7 @@
"main_file": "Z39ServerPlugin.php",
"requires_php": "7.4",
"requires_app": "0.4.0",
- "max_app_version": "1.0.0",
+ "max_app_version": "0.5.5",
"settings": true,
"metadata": {
"category": "protocol",
diff --git a/tests/bulk-enrich.spec.js b/tests/bulk-enrich.spec.js
new file mode 100644
index 00000000..32af09bc
--- /dev/null
+++ b/tests/bulk-enrich.spec.js
@@ -0,0 +1,679 @@
+// @ts-check
+/**
+ * E2E tests for the Bulk ISBN Enrichment feature.
+ *
+ * Covers:
+ * - Stats page: correct counts, soft-delete exclusion, ISBN-required filter, already-populated exclusion
+ * - Toggle: enable/disable auto-enrichment, auth requirement, state persistence
+ * - Manual batch: cover + description enrichment, no-overwrite, graceful 404, progress counts,
+ * field preservation (tipo_media, isbn13, ean)
+ * - UI: stats cards, action button, toggle switch
+ */
+const { test, expect } = require('@playwright/test');
+const { execFileSync } = require('child_process');
+
+const BASE = process.env.E2E_BASE_URL || 'http://localhost:8081';
+const ADMIN_EMAIL = process.env.E2E_ADMIN_EMAIL || '';
+const ADMIN_PASS = process.env.E2E_ADMIN_PASS || '';
+const DB_USER = process.env.E2E_DB_USER || '';
+const DB_PASS = process.env.E2E_DB_PASS || '';
+const DB_NAME = process.env.E2E_DB_NAME || '';
+const DB_SOCKET = process.env.E2E_DB_SOCKET || '';
+const RUN_ID = Date.now().toString(36);
+
+// ─── DB helpers ───────────────────────────────────────────────────────────
+function mysqlArgs() {
+ const args = ['-u', DB_USER, `-p${DB_PASS}`];
+ if (DB_SOCKET) args.push('--socket=' + DB_SOCKET);
+ args.push(DB_NAME);
+ return args;
+}
+
+function dbQuery(sql) {
+ const args = [...mysqlArgs(), '-N', '-B', '-e', sql];
+ return execFileSync('mysql', args, { encoding: 'utf8', timeout: 10000 }).trim();
+}
+
+function dbExec(sql) {
+ const args = [...mysqlArgs(), '-e', sql];
+ execFileSync('mysql', args, { encoding: 'utf8', stdio: 'pipe', timeout: 10000 });
+}
+
+// ─── Test data ────────────────────────────────────────────────────────────
+// Real ISBNs for enrichment tests (well-known books with covers on Open Library)
+const ISBN_MOCKINGBIRD = '9780061120084'; // To Kill a Mockingbird
+const ISBN_1984 = '9780451524935'; // 1984 - George Orwell
+const ISBN_GATSBY = '9780743273565'; // The Great Gatsby
+const ISBN_CATCHER = '9780316769488'; // The Catcher in the Rye
+const ISBN_HOBBIT = '9780547928227'; // The Hobbit
+const ISBN_FAKE = '9999999999999'; // Non-existent ISBN
+const ISBN_NOOVERWRITE1 = '9780142437209'; // Moby Dick (no-overwrite tests)
+const ISBN_NOOVERWRITE2 = '9780140283334'; // Brave New World (no-overwrite tests)
+
+const prefix = `ENRICH_${RUN_ID}`;
+
+test.describe.serial('Bulk Enrichment', () => {
+ /** @type {import('@playwright/test').BrowserContext} */
+ let context;
+ /** @type {import('@playwright/test').Page} */
+ let page;
+
+ /** IDs of test books inserted during setup */
+ const bookIds = [];
+
+ /** Whether the bulk-enrich feature tables/routes exist */
+ let featureAvailable = true;
+
+ let csrfToken = '';
+
+ /** Get CSRF token from the bulk-enrich page */
+ async function getCsrf() {
+ if (csrfToken) return csrfToken;
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ csrfToken = await page.evaluate(() => {
+ for (const s of document.querySelectorAll('script')) {
+ const m = s.textContent.match(/csrfToken\s*=\s*"([^"]+)"/);
+ if (m) return m[1];
+ }
+ const input = document.querySelector('input[name="csrf_token"]');
+ return input ? input.value : '';
+ });
+ return csrfToken;
+ }
+
+ /**
+ * POST with CSRF token.
+ * @param {string} url
+ * @param {object} formData - fields to send as form body (merged with csrf_token)
+ * @param {object} requestOptions - Playwright request options (timeout, headers, ...).
+ * Previously formData was spread into page.request.post options, so callers
+ * passing `{ timeout: 25000 }` ended up sending `timeout` as a form field
+ * instead of raising the request timeout. Keep them separated.
+ */
+ async function postWithCsrf(url, formData = {}, requestOptions = {}) {
+ const token = await getCsrf();
+ return page.request.post(url, {
+ ...requestOptions,
+ form: { ...formData, csrf_token: token },
+ });
+ }
+
+ test.beforeAll(async ({ browser }) => {
+ test.skip(
+ !ADMIN_EMAIL || !ADMIN_PASS || !DB_USER || !DB_PASS || !DB_NAME,
+ 'E2E credentials not configured'
+ );
+
+ // Verify app is installed
+ try {
+ const tables = dbQuery(
+ "SELECT COUNT(*) FROM information_schema.tables " +
+ `WHERE table_schema = DATABASE() AND table_name IN ('libri','utenti','system_settings')`
+ );
+ test.skip(
+ parseInt(tables, 10) < 3,
+ 'App not installed (run tests/smoke-install.spec.js first)'
+ );
+ } catch {
+ test.skip(true, 'Cannot reach DB');
+ }
+
+ context = await browser.newContext();
+ page = await context.newPage();
+
+ // Login as admin
+ await page.goto(`${BASE}/accedi`);
+ await page.fill('input[name="email"]', ADMIN_EMAIL);
+ await page.fill('input[name="password"]', ADMIN_PASS);
+ await page.click('button[type="submit"]');
+ await page.waitForURL(/\/admin\//, { timeout: 15000 });
+
+ // Seed 5 test books with ISBNs but NO cover and NO description
+ const isbns = [ISBN_MOCKINGBIRD, ISBN_1984, ISBN_GATSBY, ISBN_CATCHER, ISBN_HOBBIT];
+ for (let i = 0; i < isbns.length; i++) {
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_Book${i}', '${isbns[i]}', NULL, NULL, 1, 1, 'disponibile', NOW(), NOW())`
+ );
+ const id = dbQuery(`SELECT id FROM libri WHERE titolo = '${prefix}_Book${i}' AND deleted_at IS NULL LIMIT 1`);
+ bookIds.push(parseInt(id, 10));
+ }
+ });
+
+ test.afterAll(async () => {
+ // Clean up all test books
+ try {
+ dbExec(
+ `DELETE FROM libri WHERE titolo LIKE '${prefix}%'`
+ );
+ } catch { /* ignore */ }
+
+ // Restore toggle setting to off
+ try {
+ dbExec(
+ "DELETE FROM system_settings WHERE category = 'bulk_enrich' AND setting_key = 'enabled'"
+ );
+ } catch { /* ignore */ }
+
+ await context?.close();
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // Stats tests (1-4)
+ // ═══════════════════════════════════════════════════════════════════
+
+ test('1. Stats page loads with correct counts', async () => {
+ const resp = await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ if (resp && resp.status() === 404) {
+ featureAvailable = false;
+ test.skip(true, 'Bulk enrich route not yet implemented');
+ }
+ expect(resp?.status()).toBe(200);
+
+ // Count pending books in DB (isbn13 not null, missing cover OR description, not deleted)
+ const pendingCount = parseInt(
+ dbQuery(
+ "SELECT COUNT(*) FROM libri " +
+ "WHERE (NULLIF(TRIM(isbn13), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(isbn10), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(ean), '') IS NOT NULL) " +
+ "AND (copertina_url IS NULL OR copertina_url = '' OR descrizione IS NULL OR descrizione = '') " +
+ "AND deleted_at IS NULL"
+ ),
+ 10
+ );
+
+ // The page should display the pending count somewhere
+ const content = await page.content();
+ expect(content).toContain(String(pendingCount));
+ });
+
+ test('2. Stats exclude soft-deleted books', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ // Count pending before soft-delete
+ const countBefore = parseInt(
+ dbQuery(
+ "SELECT COUNT(*) FROM libri " +
+ "WHERE (NULLIF(TRIM(isbn13), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(isbn10), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(ean), '') IS NOT NULL) " +
+ "AND (copertina_url IS NULL OR copertina_url = '' OR descrizione IS NULL OR descrizione = '') " +
+ "AND deleted_at IS NULL"
+ ),
+ 10
+ );
+
+ // Soft-delete one test book (nullify isbn13 per project rules)
+ const victimId = bookIds[0];
+ dbExec(`UPDATE libri SET deleted_at = NOW(), isbn13 = NULL WHERE id = ${victimId}`);
+
+ // Reload and check count decreased
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ const countAfter = parseInt(
+ dbQuery(
+ "SELECT COUNT(*) FROM libri " +
+ "WHERE (NULLIF(TRIM(isbn13), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(isbn10), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(ean), '') IS NOT NULL) " +
+ "AND (copertina_url IS NULL OR copertina_url = '' OR descrizione IS NULL OR descrizione = '') " +
+ "AND deleted_at IS NULL"
+ ),
+ 10
+ );
+
+ expect(countAfter).toBe(countBefore - 1);
+
+ const content = await page.content();
+ expect(content).toContain(String(countAfter));
+
+ // Restore the book
+ dbExec(`UPDATE libri SET deleted_at = NULL, isbn13 = '${ISBN_MOCKINGBIRD}' WHERE id = ${victimId}`);
+ });
+
+ test('3. Stats exclude books without ISBN', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ // Insert a book WITHOUT isbn13 — should NOT appear in pending count
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_NoISBN', NULL, NULL, NULL, 1, 1, 'disponibile', NOW(), NOW())`
+ );
+
+ const pendingCount = parseInt(
+ dbQuery(
+ "SELECT COUNT(*) FROM libri " +
+ "WHERE (NULLIF(TRIM(isbn13), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(isbn10), '') IS NOT NULL " +
+ " OR NULLIF(TRIM(ean), '') IS NOT NULL) " +
+ "AND (copertina_url IS NULL OR copertina_url = '' OR descrizione IS NULL OR descrizione = '') " +
+ "AND deleted_at IS NULL"
+ ),
+ 10
+ );
+
+ // The no-ISBN book must not be counted
+ const noIsbnInPending = dbQuery(
+ `SELECT COUNT(*) FROM libri WHERE titolo = '${prefix}_NoISBN' AND isbn13 IS NOT NULL AND deleted_at IS NULL`
+ );
+ expect(noIsbnInPending).toBe('0');
+
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ const content = await page.content();
+ expect(content).toContain(String(pendingCount));
+ });
+
+ test('4. Stats exclude books with cover AND description already populated', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ // Insert a fully-populated book — should NOT be pending
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_Complete', '9780140449136', 'cover.jpg', 'A great book.', 1, 1, 'disponibile', NOW(), NOW())`
+ );
+
+ const completeInPending = dbQuery(
+ `SELECT COUNT(*) FROM libri WHERE titolo = '${prefix}_Complete' ` +
+ "AND (copertina_url IS NULL OR copertina_url = '' OR descrizione IS NULL OR descrizione = '') " +
+ "AND deleted_at IS NULL"
+ );
+ expect(completeInPending).toBe('0');
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // Toggle tests (5-8)
+ // ═══════════════════════════════════════════════════════════════════
+
+ test('5. Toggle ON enables auto-enrichment', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ const resp = await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/toggle`, {
+ enabled: '1',
+ });
+ expect(resp.status()).toBe(200);
+ const json = await resp.json();
+ const results = json.results ?? json;
+ expect(json.success ?? json.ok).toBeTruthy();
+
+ // Verify in DB
+ const val = dbQuery(
+ "SELECT setting_value FROM system_settings WHERE category = 'bulk_enrich' AND setting_key = 'enabled' LIMIT 1"
+ );
+ expect(val).toBe('1');
+ });
+
+ test('6. Toggle OFF disables auto-enrichment', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ const resp = await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/toggle`, {
+ enabled: '0',
+ });
+ expect(resp.status()).toBe(200);
+ const json = await resp.json();
+ const results = json.results ?? json;
+ expect(json.success ?? json.ok).toBeTruthy();
+
+ const val = dbQuery(
+ "SELECT setting_value FROM system_settings WHERE category = 'bulk_enrich' AND setting_key = 'enabled' LIMIT 1"
+ );
+ expect(val).toBe('0');
+ });
+
+ test('7. Toggle requires admin authentication', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ // Create a fresh context with no session (not logged in)
+ const anonContext = await page.context().browser().newContext();
+ try {
+ const anonPage = await anonContext.newPage();
+ const resp = await anonPage.request.post(`${BASE}/admin/libri/bulk-enrich/toggle`, {
+ enabled: '1',
+ maxRedirects: 0,
+ });
+
+ // Should redirect to login (302) or return 401/403
+ const status = resp.status();
+ expect([302, 401, 403]).toContain(status);
+
+ if (status === 302) {
+ const location = resp.headers()['location'] || '';
+ expect(location).toMatch(/accedi|login/);
+ }
+ } finally {
+ await anonContext.close();
+ }
+ });
+
+ test('8. Toggle state persists across page loads', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ // Set toggle ON
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/toggle`, {
+ enabled: '1',
+ });
+
+ // Reload the page
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ await page.waitForLoadState('domcontentloaded');
+
+ // The view renders a button[role="switch"][aria-checked], NOT a native
+ // checkbox. The previous fallback on generic substrings like "enabled"
+ // gave false positives because those words appear in inline JS on the
+ // page regardless of state. Read the real control + aria-checked.
+ const switchBtn = page.locator('#toggle-enrichment');
+ await expect(switchBtn).toBeVisible({ timeout: 5000 });
+ await expect(switchBtn).toHaveAttribute('aria-checked', 'true');
+
+ // Reset to OFF for subsequent tests
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/toggle`, {
+ enabled: '0',
+ });
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // Manual batch tests (9-17)
+ // ═══════════════════════════════════════════════════════════════════
+
+ test('9. Manual batch enriches book with valid ISBN (cover)', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ // Ensure test book has no cover
+ const targetId = bookIds[0];
+ dbExec(`UPDATE libri SET copertina_url = NULL WHERE id = ${targetId}`);
+
+ let resp;
+ try {
+ resp = await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ test.skip(true, 'Enrichment API unreachable or timed out');
+ return;
+ }
+
+ expect(resp.status()).toBe(200);
+ const json = await resp.json();
+ const results = json.results ?? json;
+
+ // Only assert the DB row if THIS specific target was in the batch's
+ // details. `results.enriched > 0` alone could reflect a different book
+ // being enriched — that would make this test flaky on any setup where
+ // another pending row is processed first.
+ const targetDetail = (results.details ?? []).find(
+ d => Number(d.book_id ?? d.id) === Number(targetId) && d.status === 'enriched'
+ );
+ if (targetDetail) {
+ const cover = dbQuery(`SELECT IFNULL(copertina_url, '') FROM libri WHERE id = ${targetId} AND deleted_at IS NULL LIMIT 1`);
+ expect(cover.length).toBeGreaterThan(0);
+ }
+ // Else: either API rate-limited or batch touched another row — acceptable.
+ });
+
+ test('10. Manual batch enriches book with valid ISBN (description)', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ const targetId = bookIds[0];
+
+ // Re-run batch if needed (or check from previous run)
+ const desc = dbQuery(`SELECT IFNULL(descrizione, '') FROM libri WHERE id = ${targetId}`);
+ if (desc === '') {
+ // Try another batch run
+ try {
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ test.skip(true, 'Enrichment API unreachable or timed out');
+ return;
+ }
+
+ const descAfter = dbQuery(`SELECT IFNULL(descrizione, '') FROM libri WHERE id = ${targetId}`);
+ // If still empty, API might not return descriptions — just verify no crash
+ if (descAfter !== '') {
+ expect(descAfter.length).toBeGreaterThan(0);
+ }
+ } else {
+ expect(desc.length).toBeGreaterThan(0);
+ }
+ });
+
+ test('11. Manual batch does NOT overwrite existing cover', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ const existingCover = 'my-existing-cover.jpg';
+
+ // Insert book with pre-existing cover
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_HasCover', '${ISBN_NOOVERWRITE1}', '${existingCover}', NULL, 1, 1, 'disponibile', NOW(), NOW())`
+ );
+ const id = dbQuery(`SELECT id FROM libri WHERE titolo = '${prefix}_HasCover' AND deleted_at IS NULL LIMIT 1`);
+ bookIds.push(parseInt(id, 10));
+
+ try {
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ // API unreachable — cover should still be original
+ }
+
+ const cover = dbQuery(`SELECT IFNULL(copertina_url, '') FROM libri WHERE id = ${id}`);
+ expect(cover).toBe(existingCover);
+ });
+
+ test('12. Manual batch does NOT overwrite existing description', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ const existingDesc = 'My custom description that must not be overwritten.';
+
+ // Insert book with pre-existing description
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_HasDesc', '${ISBN_NOOVERWRITE2}', NULL, '${existingDesc}', 1, 1, 'disponibile', NOW(), NOW())`
+ );
+ const id = dbQuery(`SELECT id FROM libri WHERE titolo = '${prefix}_HasDesc' AND deleted_at IS NULL LIMIT 1`);
+ bookIds.push(parseInt(id, 10));
+
+ try {
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ // API unreachable — description should still be original
+ }
+
+ const desc = dbQuery(`SELECT IFNULL(descrizione, '') FROM libri WHERE id = ${id}`);
+ expect(desc).toBe(existingDesc);
+ });
+
+ test('13. Manual batch handles ISBN not found gracefully', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ // Insert book with fake ISBN
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_FakeISBN', '${ISBN_FAKE}', NULL, NULL, 1, 1, 'disponibile', NOW(), NOW())`
+ );
+ const id = dbQuery(`SELECT id FROM libri WHERE titolo = '${prefix}_FakeISBN' AND deleted_at IS NULL LIMIT 1`);
+ bookIds.push(parseInt(id, 10));
+
+ let resp;
+ try {
+ resp = await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ test.skip(true, 'Enrichment API unreachable or timed out');
+ return;
+ }
+
+ expect(resp.status()).toBe(200);
+ const json = await resp.json();
+ const results = json.results ?? json;
+
+ // Response has results nested under 'results' key
+ expect(results).toHaveProperty('not_found');
+ expect(results.not_found).toBeGreaterThanOrEqual(0);
+ // No crash — server returned valid JSON
+ });
+
+ test('14. Manual batch returns correct progress counts', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ let resp;
+ try {
+ resp = await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ test.skip(true, 'Enrichment API unreachable or timed out');
+ return;
+ }
+
+ expect(resp.status()).toBe(200);
+ const json = await resp.json();
+ const results = json.results ?? json;
+
+ // Response must contain progress counters
+ expect(results).toHaveProperty('processed');
+ expect(results).toHaveProperty('enriched');
+ expect(results).toHaveProperty('not_found');
+ expect(results).toHaveProperty('errors');
+
+ // processed must be a non-negative number
+ expect(typeof results.processed).toBe('number');
+ expect(results.processed).toBeGreaterThanOrEqual(0);
+
+ // enriched + not_found + errors + skipped should equal processed
+ const sum = (results.enriched || 0) + (results.not_found || 0) + (results.errors || 0) + (results.skipped || 0);
+ expect(sum).toBe(results.processed);
+ });
+
+ test('15. Batch preserves tipo_media after enrichment', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ // Insert a disco-type book with ISBN (should be enriched, tipo_media must stay)
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, tipo_media, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_Disco', '9780670020553', 'disco', NULL, NULL, 1, 1, 'disponibile', NOW(), NOW())`
+ );
+ const id = dbQuery(`SELECT id FROM libri WHERE titolo = '${prefix}_Disco' AND deleted_at IS NULL LIMIT 1`);
+ bookIds.push(parseInt(id, 10));
+
+ try {
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ // API unreachable — field should still be preserved
+ }
+
+ const tipoMedia = dbQuery(`SELECT IFNULL(tipo_media, '') FROM libri WHERE id = ${id}`);
+ expect(tipoMedia).toBe('disco');
+ });
+
+ test('16. Batch preserves isbn13 value', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ // Pick a test book that was (potentially) enriched
+ const targetId = bookIds[0];
+ const isbn = dbQuery(`SELECT IFNULL(isbn13, '') FROM libri WHERE id = ${targetId}`);
+
+ try {
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ // API unreachable — isbn13 should still be preserved
+ }
+
+ const isbnAfter = dbQuery(`SELECT IFNULL(isbn13, '') FROM libri WHERE id = ${targetId}`);
+ expect(isbnAfter).toBe(isbn);
+ });
+
+ test('17. Batch preserves ean value', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+ test.setTimeout(120000);
+
+ const testEan = '5012345678900';
+
+ // Insert book with EAN
+ dbExec(
+ "INSERT INTO libri (titolo, isbn13, ean, copertina_url, descrizione, copie_totali, copie_disponibili, stato, created_at, updated_at) " +
+ `VALUES ('${prefix}_WithEAN', '9780684801223', '${testEan}', NULL, NULL, 1, 1, 'disponibile', NOW(), NOW())`
+ );
+ const id = dbQuery(`SELECT id FROM libri WHERE titolo = '${prefix}_WithEAN' AND deleted_at IS NULL LIMIT 1`);
+ bookIds.push(parseInt(id, 10));
+
+ try {
+ await postWithCsrf(`${BASE}/admin/libri/bulk-enrich/start`, {}, { timeout: 25000 });
+ } catch {
+ // API unreachable — ean should still be preserved
+ }
+
+ const ean = dbQuery(`SELECT IFNULL(ean, '') FROM libri WHERE id = ${id}`);
+ expect(ean).toBe(testEan);
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // UI tests (18-20)
+ // ═══════════════════════════════════════════════════════════════════
+
+ test('18. Bulk enrich page shows stats cards', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ await page.waitForLoadState('domcontentloaded');
+ const content = await page.content();
+
+ // Page should contain stat labels (Italian) for books and missing covers/descriptions
+ const hasBookCount = content.includes('libri') || content.includes('Libri');
+ const hasCoverStat = content.includes('copertina') || content.includes('Copertina') ||
+ content.includes('copertine') || content.includes('Copertine');
+ const hasDescStat = content.includes('descrizione') || content.includes('Descrizione') ||
+ content.includes('descrizioni') || content.includes('Descrizioni');
+
+ expect(hasBookCount).toBe(true);
+ expect(hasCoverStat || hasDescStat).toBe(true);
+ });
+
+ test('19. Bulk enrich page has "Arricchisci Adesso" button', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ await page.waitForLoadState('domcontentloaded');
+
+ // Look for the action button — by text or by form action
+ const buttonByText = page.locator('button, a').filter({
+ hasText: /arricchisci|enrich|avvia|start/i,
+ }).first();
+ const buttonByAction = page.locator(
+ 'form[action*="bulk-enrich/start"] button[type="submit"]'
+ ).first();
+
+ const hasButton = await buttonByText.isVisible({ timeout: 3000 }).catch(() => false) ||
+ await buttonByAction.isVisible({ timeout: 3000 }).catch(() => false);
+
+ expect(hasButton).toBe(true);
+ });
+
+ test('20. Bulk enrich page has toggle switch', async () => {
+ test.skip(!featureAvailable, 'Bulk enrich not available');
+
+ await page.goto(`${BASE}/admin/libri/bulk-enrich`);
+ await page.waitForLoadState('domcontentloaded');
+
+ // Toggle can be a checkbox, a switch element, or a custom toggle
+ const toggle = page.locator(
+ 'input[type="checkbox"][name*="enable"], ' +
+ 'input[type="checkbox"][name*="enrich"], ' +
+ 'input[name="enabled"], ' +
+ '.toggle-switch, ' +
+ '[role="switch"]'
+ ).first();
+
+ const hasToggle = await toggle.isVisible({ timeout: 3000 }).catch(() => false);
+
+ if (!hasToggle) {
+ // Fallback: look for any toggle/switch-like element in page content
+ const content = await page.content();
+ const hasSwitchMarkup = content.includes('toggle') || content.includes('switch') ||
+ content.includes('checkbox');
+ expect(hasSwitchMarkup).toBe(true);
+ } else {
+ expect(hasToggle).toBe(true);
+ }
+ });
+});
diff --git a/tests/discogs-advanced.spec.js b/tests/discogs-advanced.spec.js
new file mode 100644
index 00000000..fb0d0155
--- /dev/null
+++ b/tests/discogs-advanced.spec.js
@@ -0,0 +1,242 @@
+// @ts-check
+/**
+ * Advanced Discogs tests: tipo_media filtering, CSV export, Schema.org,
+ * tracklist rendering, and edit persistence.
+ * Requires: app installed, admin user, Discogs plugin active, music records in DB.
+ */
+const { test, expect } = require('@playwright/test');
+const { execFileSync } = require('child_process');
+
+const BASE = process.env.E2E_BASE_URL || 'http://localhost:8081';
+const ADMIN_EMAIL = process.env.E2E_ADMIN_EMAIL || '';
+const ADMIN_PASS = process.env.E2E_ADMIN_PASS || '';
+const DB_USER = process.env.E2E_DB_USER || '';
+const DB_PASS = process.env.E2E_DB_PASS || '';
+const DB_NAME = process.env.E2E_DB_NAME || '';
+const DB_SOCKET = process.env.E2E_DB_SOCKET || '';
+const RUN_ID = Date.now();
+const SEEDED_MUSIC_EAN = `2${String(RUN_ID).slice(-12)}`;
+const SEEDED_BOOK_ISBN = `978${String(RUN_ID).slice(-10)}`;
+
+function dbQuery(sql) {
+ const args = ['-u', DB_USER, `-p${DB_PASS}`, DB_NAME, '-N', '-B', '-e', sql];
+ if (DB_SOCKET) args.splice(3, 0, '-S', DB_SOCKET);
+ return execFileSync('mysql', args, { encoding: 'utf-8', timeout: 10000 }).trim();
+}
+
+function dbExec(sql) {
+ const args = ['-u', DB_USER, `-p${DB_PASS}`, DB_NAME, '-e', sql];
+ if (DB_SOCKET) args.splice(3, 0, '-S', DB_SOCKET);
+ execFileSync('mysql', args, { encoding: 'utf-8', timeout: 10000 });
+}
+
+test.describe.serial('Discogs Advanced Tests', () => {
+ /** @type {import('@playwright/test').Page} */
+ let page;
+ /** @type {import('@playwright/test').BrowserContext} */
+ let context;
+ let musicBookId = '';
+ let bookBookId = '';
+
+ test.beforeAll(async ({ browser }) => {
+ test.skip(!ADMIN_EMAIL || !ADMIN_PASS || !DB_USER || !DB_PASS || !DB_NAME, 'Missing E2E env vars');
+ context = await browser.newContext();
+ page = await context.newPage();
+
+ // Login via the always-available /login fallback (works regardless of
+ // install locale — Italian installs translate to /accedi but /login is a
+ // permanent alias). Avoids breaking on German/English installations.
+ await page.goto(`${BASE}/login`);
+ await page.fill('input[name="email"]', ADMIN_EMAIL);
+ await page.fill('input[name="password"]', ADMIN_PASS);
+ await page.click('button[type="submit"]');
+ await page.waitForURL(/\/admin\//, { timeout: 15000 });
+
+ // Seed a music record and a book for comparison
+ dbExec(
+ "INSERT INTO libri (titolo, formato, tipo_media, ean, copie_totali, copie_disponibili, descrizione, note_varie, created_at, updated_at) " +
+ "VALUES ('E2E_ADV_CD_" + RUN_ID + "', 'cd_audio', 'disco', '" + SEEDED_MUSIC_EAN + "', 1, 1, " +
+ "'Track One - Track Two', 'Cat: TEST-001', NOW(), NOW())"
+ );
+ dbExec(
+ "INSERT INTO libri (titolo, formato, tipo_media, isbn13, copie_totali, copie_disponibili, descrizione, created_at, updated_at) " +
+ "VALUES ('E2E_ADV_Book_" + RUN_ID + "', 'cartaceo', 'libro', '" + SEEDED_BOOK_ISBN + "', 1, 1, " +
+ "'A test book description', NOW(), NOW())"
+ );
+
+ musicBookId = dbQuery(`SELECT id FROM libri WHERE titolo = 'E2E_ADV_CD_${RUN_ID}' AND deleted_at IS NULL LIMIT 1`);
+ bookBookId = dbQuery(`SELECT id FROM libri WHERE titolo = 'E2E_ADV_Book_${RUN_ID}' AND deleted_at IS NULL LIMIT 1`);
+ });
+
+ test.afterAll(async () => {
+ try {
+ dbExec(
+ `DELETE FROM libri
+ WHERE id IN (${Number(musicBookId) || 0}, ${Number(bookBookId) || 0})
+ OR ean = '${SEEDED_MUSIC_EAN}'
+ OR isbn13 = '${SEEDED_BOOK_ISBN}'`
+ );
+ } catch {}
+ await context?.close();
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // Test 1: tipo_media filter in admin book list
+ // ═══════════════════════════════════════════════════════════════════
+ test('1. Admin list filters by tipo_media=disco', async () => {
+ // Fetch the DataTable API with tipo_media filter
+ const resp = await page.request.get(`${BASE}/api/libri?tipo_media=disco&start=0&length=100&search_text=E2E_ADV`);
+ expect(resp.status()).toBe(200);
+ const data = await resp.json();
+
+ // Should find the CD but not the book
+ const titles = (data.data || []).map((r) => r.titolo || r.info || '');
+ const flatTitles = titles.join(' ');
+
+ expect(flatTitles).toContain(`E2E_ADV_CD_${RUN_ID}`);
+ expect(flatTitles).not.toContain(`E2E_ADV_Book_${RUN_ID}`);
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // Test 2: CSV export includes tipo_media column
+ // ═══════════════════════════════════════════════════════════════════
+ test('2. CSV export includes tipo_media for music records', async () => {
+ const resp = await page.request.get(`${BASE}/admin/libri/export/csv?ids=${musicBookId}`);
+ expect(resp.status()).toBe(200);
+ const body = await resp.text();
+
+ // Parse header
+ const lines = body.split('\n');
+ const header = lines[0].replace(/^\uFEFF/, '');
+ expect(header).toContain('tipo_media');
+
+ // Parse the data row
+ const headerFields = header.split(';');
+ const tipoMediaIdx = headerFields.indexOf('tipo_media');
+ expect(tipoMediaIdx).toBeGreaterThan(-1);
+
+ if (lines.length > 1 && lines[1].trim()) {
+ const dataFields = lines[1].split(';');
+ expect(dataFields[tipoMediaIdx]).toBe('disco');
+ }
+ });
+
+ // ═══════════════════════════════════════════════════════════════════
+ // Test 3: Schema.org uses MusicAlbum for disco, Book for libro
+ // ═══════════════════════════════════════════════════════════════════
+ test('3. Schema.org JSON-LD type is MusicAlbum for disco', async () => {
+ // Derive the public book URL from the admin detail page rather than
+ // hardcoding the Italian `/libro/` slug — EN installs use `/book/`, DE
+ // `/buch/`. We follow the "Vedi scheda pubblica" link exposed by the
+ // admin UI, which RouteTranslator builds for the active locale.
+ await page.goto(`${BASE}/admin/libri/${musicBookId}`);
+ const publicUrl = await page.locator('a[href*="/libro/"], a[href*="/book/"], a[href*="/buch/"]')
+ .first()
+ .getAttribute('href');
+ expect(publicUrl, 'admin page must expose a public-detail link').not.toBeNull();
+ const fullUrl = publicUrl.startsWith('http') ? publicUrl : BASE + publicUrl;
+ const musicResp = await page.request.get(fullUrl);
+ expect(musicResp.status()).toBe(200);
+ const musicHtml = await musicResp.text();
+
+ const jsonLdBlocks = Array.from(
+ musicHtml.matchAll(/