diff --git a/.github/workflows/release.yml b/.github/workflows/release-free.yml similarity index 98% rename from .github/workflows/release.yml rename to .github/workflows/release-free.yml index 52fa484..f7a9cec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release-free.yml @@ -1,4 +1,4 @@ -name: Release +name: Release Free edition on: push: diff --git a/.package/4.1.3.txt b/.package/4.1.3.txt deleted file mode 100644 index 7c76bf6..0000000 --- a/.package/4.1.3.txt +++ /dev/null @@ -1,19 +0,0 @@ -Chevereto 4.1.3 (2024-05-13) - -- ✅ Added configurable view for user profiles -- ✅ Added failover for missing image sizes -- ✅ Force 0644 permission for medium and thumb sizes -- ✅ One-click upgrading process now clears previous locks -- 🐋 Added upgrade instructions when using Docker -- 🐋 Disabled app upgrading when using Docker -- 🐋 Disabled license key handling when using Docker -- 🌏 Updated Chinese Simplified and Vietnamese translations -- 🐞 Fixed bug affecting available upgrade modal link -- 🐞 Fixed bug affecting Homepage custom paragraph -- 🐞 Fixed bug affecting max image size setting -- 🐞 Fixed bug affecting share modal -- 🐞 Fixed bug affecting user background picture -- 🐞 Fixed bug affecting website mode personal showing menu links -- 🐞 Fixed bug causing open_basedir issues -- 🐞 Fixed bug with Image class breaking update -- 🐘 Updated dependencies diff --git a/.package/4.1.4.txt b/.package/4.1.4.txt new file mode 100644 index 0000000..b7f7812 --- /dev/null +++ b/.package/4.1.4.txt @@ -0,0 +1,9 @@ +Chevereto 4.1.4 (2024-05-24) + +- ✅ Added checking for CHEVERETO_HOSTNAME_PATH setting +- 🌎 Updated Chinese Traditional translation +- 🌎 Updated French translation +- 🐋 Improved upgrading instructions when using Docker +- 🐞 Fixed bug affecting video uploads when using max image size +- 🐞 Removed album hashing when upgrading from V3 +- 🐞 Removed login providers encryption when upgrading from V3 diff --git a/app/.cache/languages/fr.po.cache.php b/app/.cache/languages/fr.po.cache.php index 864b21c..96a5303 100644 --- a/app/.cache/languages/fr.po.cache.php +++ b/app/.cache/languages/fr.po.cache.php @@ -1,8 +1,8 @@ 'VERSION', - 'POT-Creation-Date' => '2023-05-22 15:49+0000', - 'PO-Revision-Date' => '2023-05-22 15:49+0000', + 'POT-Creation-Date' => '2024-05-20 18:55+0000', + 'PO-Revision-Date' => '2024-05-20 18:55+0000', 'Last-Translator' => 'FULL NAME ', 'Language-Team' => 'LANGUAGE TEAM ', 'Language' => 'fr', @@ -16,12 +16,6 @@ $translation_plural = array ( 'function' => '($n > 1)', ); $translation_table = [ - "Selection will be assigned to %t." => [ - 0 => "La sélection sera attribuée à %t.", - ], - "Sets the minimum content count needed to show %t in %s." => [ - 0 => "Définit le nombre de contenu minimum nécessaire pour afficher %t dans %s.", - ], "You have been forbidden to use this website." => [ 0 => "Vous avez été banni du site.", ], @@ -43,6 +37,9 @@ $translation_table = [ "Popular" => [ 0 => "Populaire", ], + "Videos" => [ + 0 => "Vidéos", + ], "Animated" => [ 0 => "Animé", ], @@ -158,11 +155,12 @@ $translation_table = [ 0 => "image", 1 => "images", ], - "Stats" => [ - 0 => "Statistiques", + "Home" => [ + 0 => "Accueil", ], - "Images" => [ - 0 => "Images", + "File" => [ + 0 => "Fichier", + 1 => "Fichiers", ], "Album" => [ 0 => "Album", @@ -178,6 +176,9 @@ $translation_table = [ "Settings" => [ 0 => "Paramètres", ], + "Run %s" => [ + 0 => "Exécuter %s", + ], "Website" => [ 0 => "Site web", ], @@ -187,8 +188,8 @@ $translation_table = [ "Listings" => [ 0 => "Listes", ], - "Image upload" => [ - 0 => "Envoi d'image", + "File uploads" => [ + 0 => "Envoi de fichiers", ], "Semantics" => [ 0 => "Sémantique", @@ -214,15 +215,24 @@ $translation_table = [ "Logo" => [ 0 => "Logo", ], - "External storage" => [ - 0 => "Stockage externe", - ], "Homepage" => [ 0 => "Page d'accueil", ], "Pages" => [ 0 => "Pages", ], + "Upload plugin" => [ + 0 => "Envoyer un plugin", + ], + "Consent screen" => [ + 0 => "Disclamer", + ], + "Guests %s" => [ + 0 => "Invités %s", + ], + "External storage" => [ + 0 => "Stockage externe", + ], "Routing" => [ 0 => "Adressage", ], @@ -232,15 +242,9 @@ $translation_table = [ "Login providers" => [ 0 => "Fournisseurs de connexion", ], - "Upload plugin" => [ - 0 => "Envoyer un plugin", - ], "Cookie compliance" => [ 0 => "Conformité aux cookies", ], - "Consent screen" => [ - 0 => "Disclamer", - ], "Flood protection" => [ 0 => "Protection flood", ], @@ -250,48 +254,42 @@ $translation_table = [ "IP bans" => [ 0 => "Bannissements IP", ], - "Guests %s" => [ - 0 => "Invités %s", - ], "Watermarks" => [ 0 => "Filigranes", ], - "Documentation" => [ - 0 => "Documentation", + "Upgrade now" => [ + 0 => "Mettre à jour maintenant", ], - "Admin" => [ - 0 => "Administrateur", + "The latest release will be downloaded and extracted in the filesystem." => [ + 0 => "La dernière version sera téléchargée et extraite dans le système de fichiers.", ], - "%s docs" => [ - 0 => "%s documents", + "License key" => [ + 0 => "Clé de licence", ], "Support" => [ 0 => "Support", ], - "Releases" => [ - 0 => "Versions", - ], - "Community" => [ - 0 => "Communauté", - ], - "License" => [ - 0 => "Licence", - ], "install update" => [ 0 => "Installer la mise à jour", ], - "Check updates" => [ - 0 => "Vérifier les mises à jour", + "Check upgrades" => [ + 0 => "Vérifier les mises à niveau", ], "not running" => [ 0 => "pas en fonctionnement", ], + "PHP function [%s] not available in this PHP installation" => [ + 0 => "Fonction PHP [%s] non disponible dans cette installation PHP", + ], "Max. upload file size" => [ 0 => "Taille maximum de l'image importée", ], - "Graphics Library" => [ + "Graphics library" => [ 0 => "Bibliothèque graphique", ], + "Stats" => [ + 0 => "Statistiques", + ], "Rebuild stats" => [ 0 => "Reconstruire les stats", ], @@ -301,6 +299,36 @@ $translation_table = [ "Not your IP?" => [ 0 => "Pas votre IP ?", ], + "Encryption" => [ + 0 => "Chiffrement", + ], + "Enabled" => [ + 0 => "Activé", + ], + "Disabled" => [ + 0 => "Désactivé", + ], + "Meta" => [ + 0 => "Méta", + ], + "Blog" => [ + 0 => "Blog", + ], + "Docs" => [ + 0 => "Documents", + ], + "Releases" => [ + 0 => "Versions", + ], + "Chat" => [ + 0 => "Chat", + ], + "Community" => [ + 0 => "Communauté", + ], + "Links" => [ + 0 => "Liens", + ], "Cron last ran" => [ 0 => "Dernière exécution Cron", ], @@ -310,23 +338,8 @@ $translation_table = [ "Server" => [ 0 => "Serveur", ], - "MySQL version" => [ - 0 => "Version de MySQL", - ], - "MySQL server info" => [ - 0 => "Infos du serveur MySQL", - ], - "File uploads" => [ - 0 => "Envoi de fichiers", - ], - "Enabled" => [ - 0 => "Activé", - ], - "Disabled" => [ - 0 => "Désactivé", - ], "Max. execution time" => [ - 0 => "Temps d'exécution maximal", + 0 => "Temps max. d'exécution", ], "%d second" => [ 0 => "%d seconde", @@ -336,10 +349,10 @@ $translation_table = [ 0 => "Limite de mémoire", ], "Can't delete all homepage cover images" => [ - 0 => "Vous ne pouvez pas supprimer toutes les images de la page d'accueil", + 0 => "Impossible de supprimer toutes les images de couverture de la page d'accueil", ], "Homepage cover image deleted" => [ - 0 => "Image de la page d'accueil supprimé", + 0 => "Image de couverture de la page d'accueil supprimée", ], "Local" => [ 0 => "Local", @@ -354,67 +367,67 @@ $translation_table = [ 0 => "rechercher du contenu", ], "Add page" => [ - 0 => "Ajouter page", + 0 => "Ajouter une page", ], "Edit page ID %s" => [ - 0 => "Modifier la page ID %s", + 0 => "Modifier l'ID de la page %s", ], "The page has been added successfully." => [ 0 => "La page a été ajoutée avec succès.", ], "The page has been deleted." => [ - 0 => "Cette page a été supprimée.", + 0 => "La page a été supprimée.", ], "homepage" => [ - 0 => "Page d'accueil", + 0 => "page d'accueil", ], "Before main title (%s)" => [ - 0 => "Avant le titre (%s)", + 0 => "Avant le titre principal (%s)", ], "After call to action (%s)" => [ - 0 => "Après le bouton (%s)", + 0 => "Après l'appel à l'action (%s)", ], "After cover (%s)" => [ - 0 => "Après la photo (%s)", + 0 => "Après la couverture (%s)", ], "After listing (%s)" => [ - 0 => "Après la liste d'images (%s)", + 0 => "Après la liste (%s)", ], "Before pagination" => [ - 0 => "Avant pagination", + 0 => "Avant la pagination", ], "After pagination" => [ - 0 => "Après pagination", + 0 => "Après la pagination", ], "Content (image and album)" => [ 0 => "Contenu (image et album)", ], "Tab about column" => [ - 0 => "Colonne du menu à propos", + 0 => "Onglet sur la colonne", ], "Before comments" => [ 0 => "Avant les commentaires", ], "Image page" => [ - 0 => "Page de l'image", + 0 => "Page d'images", ], "Inside viewer top (image page)" => [ - 0 => "Intérieur du haut de la page visualisation (page image)", + 0 => "Intérieure du haut de la visionneuse (page d'images)", ], "Inside viewer foot (image page)" => [ - 0 => "Intérieur du bas de la page visualisation (page image)", + 0 => "Intérieure du bas de la visionneuse (page d'images)", ], "After image viewer (image page)" => [ - 0 => "Après la page de visualisation (page image)", + 0 => "Après la visionneuse d'images (page d'images)", ], "Before header (image page)" => [ - 0 => "Avant le haut de page (page image)", + 0 => "Avant l'en-tête (page d'images)", ], "After header (image page)" => [ - 0 => "Après le haut de page (page image)", + 0 => "Après l'en-tête (page d'images)", ], "Footer (image page)" => [ - 0 => "Bas de page (page image)", + 0 => "Pied de page (page d'images)", ], "%s page" => [ 0 => "page %s", @@ -429,10 +442,10 @@ $translation_table = [ 0 => "Page de profil utilisateur", ], "After top (user profile)" => [ - 0 => "Après le haut de page (profil utilisateur)", + 0 => "Après le haut (profil utilisateur)", ], "Before listing (user profile)" => [ - 0 => "Avant le listing (profil utilisateur)", + 0 => "Avant la liste (profil utilisateur)", ], "Explore" => [ 0 => "Explorer", @@ -482,101 +495,104 @@ $translation_table = [ "Invalid value" => [ 0 => "Valeur incorrect", ], + "font" => [ + 0 => "police de caractère", + ], + "Invalid %s" => [ + 0 => "%s invalide", + ], "palette" => [ 0 => "palette", ], - "Invalid %s" => [ - 0 => "%s non valide", - ], "Invalid theme image listing size" => [ - 0 => "Taille de thème de listing d'images non valide", + 0 => "Taille de la liste des images de thème non valide", ], "Invalid user id" => [ - 0 => "ID utilisateur non valide", + 0 => "Identifiant invalide", ], "Invalid email mode" => [ - 0 => "Mode email non valide", + 0 => "Mode de mail invalide", ], "Invalid SMTP port" => [ - 0 => "Port SMTP non valide", + 0 => "Port SMTP invalide", ], "Invalid SMTP security" => [ - 0 => "Sécurité SMTP non valide", + 0 => "Sécurité SMTP invalide", ], "Invalid website mode" => [ - 0 => "Mode de site web non valide", + 0 => "Mode de site Web invalide", ], "Invalid personal mode user ID" => [ - 0 => "ID utilisateur du mode personnel non valide", + 0 => "ID utilisateur en mode personnel invalide", ], "Invalid or reserved route" => [ - 0 => "Route réservée ou non valide", + 0 => "Racine invalide ou réservé", ], "Invalid website privacy mode" => [ - 0 => "Mode de confidentialité de site web non valide", + 0 => "Mode de confidentialité du site Web invalide", ], "Invalid website content privacy mode" => [ - 0 => "Mode de confidentialité du contenu de site web non valide", + 0 => "Mode de confidentialité du contenu du site Web non valide", ], "Invalid homepage style" => [ - 0 => "Style de page d'accueil non valide", + 0 => "Style de page d'accueil invalide", ], "Invalid homepage call to action button color" => [ - 0 => "Couleur du bouton d'action de l'accueil non valide", + 0 => "Couleur du bouton d'appel à l'action de la page d'accueil non valide", ], "Invalid homepage call to action functionality" => [ 0 => "Fonctionnalité d'appel à l'action de la page d'accueil non valide", ], "Invalid title" => [ - 0 => "Titre non valide", + 0 => "Titre invalide", ], "Invalid status" => [ - 0 => "Statut non valide", + 0 => "Statut invalide", ], "Invalid type" => [ - 0 => "Type non valide", + 0 => "Type invalide", ], "Invalid visibility" => [ - 0 => "Visibilité non valide", + 0 => "Visibilité invalide", ], "Invalid internal type" => [ - 0 => "Type interne non valide", + 0 => "Type interne invalide", ], "Invalid target attribute" => [ 0 => "Attribut cible non valide", ], "Invalid rel attribute" => [ - 0 => "Attribut rel non valide", + 0 => "Attribut rel invalide", ], "Invalid icon" => [ - 0 => "Icône non valide", + 0 => "Icône invalide", ], "Invalid URL key" => [ - 0 => "Clé URL non valide", + 0 => "Clé URL invalide", ], "Invalid file path" => [ - 0 => "Chemin de fichier non valide", + 0 => "Chemin de fichier invalide", ], "Invalid link URL" => [ - 0 => "Lien URL non valide", + 0 => "URL de lien invalide", ], "Invalid user minimum age" => [ - 0 => "Age minimum invalide", + 0 => "Âge minimum de l'utilisateur non valide", ], "Only alphanumeric, hyphen and underscore characters are allowed" => [ - 0 => "Seuls les caractères alphanumériques, les traits d'union et les underscore sont autorisés", + 0 => "Seuls les caractères alphanumériques, tirets et traits de soulignement sont autorisés", ], "Invalid URL" => [ - 0 => "URL non valide", + 0 => "URL invalide", ], "Invalid key" => [ 0 => "Clé non valide", ], "Routes can't be the same" => [ - 0 => "Les adressages ne peuvent pas être identiques.", + 0 => "Les racines ne peuvent pas être les mêmes", ], "Invalid upload image path" => [ - 0 => "Répertoire d'envoi d'images non valide", + 0 => "Chemin d'accès à l'image de téléchargement non valide", ], "Invalid call to action URL" => [ 0 => "URL d'appel à l'action non valide", @@ -585,28 +601,28 @@ $translation_table = [ 0 => "Max. autorisé %s", ], "Can't map %m to an existing folder (%f)" => [ - 0 => "Impossible d'adresser %m à un dossier existant (%f)", + 0 => "Impossible de mapper %m à un dossier existant (%f)", ], "Can't map %m to an existing route (%r)" => [ - 0 => "Impossible d'adresser %m à un adressage existant (%r)", + 0 => "Impossible de mapper %m à une racine existante (%r)", ], "Can't map %m to %r (username collision)" => [ - 0 => "Impossible d'adresser %m à %r (Collision de nom d'utilisateur)", + 0 => "Impossible de mapper %m à %r (collision de nom d'utilisateur)", ], "Invalid SMTP server" => [ - 0 => "Serveur SMTP non valide", + 0 => "Serveur SMTP invalide", ], "Invalid SMTP username" => [ - 0 => "Nom d'utilisateur SMTP non valide", + 0 => "Nom d'utilisateur SMTP invalide", ], "This URL key is already being used by another page (ID %s)" => [ - 0 => "Cette URL clé est déjà utilisée par une autre page (ID %s)", + 0 => "Cette clé URL est déjà utilisée par une autre page (ID %s)", ], "This file path is already being used by another page (ID %s)" => [ 0 => "Ce chemin de fichier est déjà utilisé par une autre page (ID %s)", ], "Can't save page contents: %s." => [ - 0 => "Impossible de sauvegarder le contenu de la page : %s.", + 0 => "Impossible d'enregistrer le contenu de la page : %s.", ], "Dashboard" => [ 0 => "Tableau de bord", @@ -635,33 +651,6 @@ $translation_table = [ "Image %i hosted in %w" => [ 0 => "Image %i hébergée dans %w", ], - "Direct links" => [ - 0 => "Liens directs", - ], - "Image link" => [ - 0 => "Lien vers cette page", - ], - "Image URL" => [ - 0 => "Lien direct vers l'image", - ], - "Thumbnail URL" => [ - 0 => "URL de la miniature", - ], - "Medium URL" => [ - 0 => "URL intermédiaire", - ], - "Full image" => [ - 0 => "Image complète", - ], - "Full image (linked)" => [ - 0 => "Image complète (Lien raccourci)", - ], - "Medium image (linked)" => [ - 0 => "Miniature de l'image (Lien raccourci)", - ], - "Thumbnail image (linked)" => [ - 0 => "Miniature de l'image (Lien raccourci)", - ], "Start uploading" => [ 0 => "Commencer l'envoi", ], @@ -684,9 +673,6 @@ $translation_table = [ "%s URL key already being used." => [ 0 => "La clé d'URL %s est déjà utilisée.", ], - "IP address already banned" => [ - 0 => "L'adresse IP est déjà bannie", - ], "Missing values" => [ 0 => "Valeurs manquantes", ], @@ -702,6 +688,9 @@ $translation_table = [ "%s added" => [ 0 => "%s ajouté", ], + "IP address already banned" => [ + 0 => "L'adresse IP est déjà bannie", + ], "%s not found" => [ 0 => "%s introuvable", ], @@ -753,6 +742,15 @@ $translation_table = [ "A private user" => [ 0 => "Utilisateur privé", ], + "Chevereto V%s license key used, required V%r or greater license key" => [ + 0 => "Clé de licence Chevereto V%s utilisée, clé de licence V%r ou supérieure requise", + ], + "License key removed" => [ + 0 => "Clé de licence supprimée", + ], + "License key updated" => [ + 0 => "Clé de licence mise à jour", + ], "Wrong Username/Email password combination" => [ 0 => "L'identifiant ou le mot de passe est incorrect", ], @@ -841,6 +839,9 @@ $translation_table = [ "User ID" => [ 0 => "ID Utilisateur", ], + "Images" => [ + 0 => "Images", + ], "Register date" => [ 0 => "Date d'enregistrement", ], @@ -1136,48 +1137,72 @@ $translation_table = [ "Error deleting profile background image." => [ 0 => "Erreur lors de la suppression de la photo de couverture.", ], - "Update available v%s" => [ - 0 => "Mise à jour disponible v%s", + "Chevereto v%s available" => [ + 0 => "Chevereto v%s disponible", ], - "There is an update available for this system." => [ - 0 => "Une mise à jour est disponible pour ce système.", + "There is a new Chevereto version available with the following release notes." => [ + 0 => "Une nouvelle version de Chevereto est disponible avec les notes de version suivantes.", ], - "Update instructions" => [ - 0 => "Instructions de mise à jour", + "Check %s for a complete changelog since you last upgrade." => [ + 0 => "Vérifiez %s pour un journal des modifications complet depuis votre dernière mise à niveau.", + ], + "documentation" => [ + 0 => "documentation", + ], + "Check the %s for alternative update methods." => [ + 0 => "Vérifiez le %s pour d'autres méthodes de mise à jour.", ], "This website is running latest %s version" => [ 0 => "Ce site web utilise la dernière version %s", ], + "Chevereto v%s installed" => [ + 0 => "Chevereto v%s installé", + ], + "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." => [ + 0 => "L'utilisation du logiciel Chevereto doit être conforme aux termes de la licence du logiciel connus sous le nom de \"Licence Chevereto\".", + ], + "License agreement" => [ + 0 => "Accord de licence", + ], "Please review the system requirements before proceeding" => [ 0 => "Veuillez consulter la configuration requise avant de poursuivre", ], - "Toggle select" => [ - 0 => "Basculer la sélection", + "Get a license at %s to unlock all features and support." => [ + 0 => "Obtenez une licence chez %s pour débloquer toutes les fonctionnalités et le support.", ], - "Like" => [ - 0 => "J'aime", + "You can enter your license key in the dashboard panel." => [ + 0 => "Vous pouvez saisir votre clé de licence dans le panneau du tableau de bord.", + ], + "Enter license" => [ + 0 => "Entrez la licence", ], "Create album" => [ 0 => "Créer un album", ], - "Toggle flag" => [ - 0 => "Basculer le drapeau", - ], - "Edit" => [ - 0 => "Modifier", - ], "Approve" => [ 0 => "Approuver", ], "Delete" => [ 0 => "Supprimer", ], - "Previous" => [ - 0 => "Précédent", + "Edit" => [ + 0 => "Modifier", + ], + "Toggle flag" => [ + 0 => "Basculer le drapeau", + ], + "Like" => [ + 0 => "J'aime", ], "Next" => [ 0 => "Suivant", ], + "Previous" => [ + 0 => "Précédent", + ], + "Toggle select" => [ + 0 => "Basculer la sélection", + ], "Zoom" => [ 0 => "Zoom", ], @@ -1190,6 +1215,9 @@ $translation_table = [ "Some files couldn't be added" => [ 0 => "Certains fichiers n'ont pu être ajoutés", ], + "Some files couldn't be loaded" => [ + 0 => "Certains fichiers n'ont pas pu être chargés", + ], "file" => [ 0 => "fichier", 1 => "fichiers", @@ -1197,8 +1225,8 @@ $translation_table = [ "%s's Albums" => [ 0 => "Les albums de %s", ], - "Image edited successfully." => [ - 0 => "Image modifiée avec succès.", + "File edited successfully." => [ + 0 => "Fichier modifié avec succès.", ], "private" => [ 0 => "privé", @@ -1344,11 +1372,11 @@ $translation_table = [ "This email was sent from %w %u" => [ 0 => "Ce message a été envoyé par %w %u", ], - "Drag and drop or paste images here to upload" => [ - 0 => "Glisser-déposer ou coller les images ici pour les envoyer", + "Drag and drop or paste files here to upload" => [ + 0 => "Faites glisser et déposez ou collez les fichiers ici pour les télécharger", ], - "Select the images to upload" => [ - 0 => "Sélectionnez les images à envoyer", + "Select the files to upload" => [ + 0 => "Sélectionnez les fichiers à télécharger", ], "You can also %i or %u." => [ 0 => "Vous pouvez également %i ou %u.", @@ -1359,8 +1387,8 @@ $translation_table = [ "browse from your computer" => [ 0 => "parcourir depuis votre ordinateur", ], - "add image URLs" => [ - 0 => "Ajouter des URL d'image", + "add file URLs" => [ + 0 => "ajouter des URL de fichiers", ], "You can also %i, %c or %u." => [ 0 => "Vous pouvez également %i, %c ou %u.", @@ -1368,11 +1396,14 @@ $translation_table = [ "You can also %i or %c." => [ 0 => "Vous pouvez également %i ou %c.", ], - "browse from your device" => [ - 0 => "parcourir depuis votre appareil", + "browse from device" => [ + 0 => "parcourir depuis l'appareil", ], - "take a picture" => [ - 0 => "prendre une photo", + "use camera" => [ + 0 => "utiliser l'appareil photo", + ], + "max" => [ + 0 => "maximum", ], "Register to get %s" => [ 0 => "Inscrivez-vous pour avoir %s", @@ -1518,11 +1549,11 @@ $translation_table = [ "Brief description of this %s" => [ 0 => "Brève description de cette %s", ], - "Add image URLs" => [ - 0 => "Ajouter les URLs d'images", + "File URLs" => [ + 0 => "URL de fichiers", ], - "Add the image URLs here" => [ - 0 => "Ajouter les URLs d'images ici", + "Add file URLs here" => [ + 0 => "Ajouter les URL des fichiers ici", ], "Create %s" => [ 0 => "Créer %s", @@ -1542,62 +1573,38 @@ $translation_table = [ "Error report" => [ 0 => "Rapport d'erreur", ], - "Links" => [ - 0 => "Liens", - ], "Viewer" => [ 0 => "Visualisateur", ], - "%s links" => [ - 0 => "%s liens", + "%s link" => [ + 0 => "lien %s", ], "Direct" => [ 0 => "Direct", ], - "HTML Codes" => [ - 0 => "Codes HTML", + "Frame" => [ + 0 => "Image", ], - "HTML image" => [ - 0 => "Image HTML", + "Thumbnail" => [ + 0 => "Vignette", ], - "HTML full linked" => [ - 0 => "Lien complet HTML", + "Medium" => [ + 0 => "Moyen", ], - "HTML medium linked" => [ - 0 => "Lien HTML intermédiaire", + "embed" => [ + 0 => "intégrer", ], - "HTML thumbnail linked" => [ - 0 => "Lien HTML miniature", + "%s full linked" => [ + 0 => "%s entièrement lié", ], - "BBCodes" => [ - 0 => "BBCodes", + "%s medium linked" => [ + 0 => "%s support lié", ], - "BBCode full" => [ - 0 => "BBCode complet", + "%s thumbnail linked" => [ + 0 => "%s vignette liée", ], - "BBCode full linked" => [ - 0 => "Lien complet BBCode", - ], - "BBCode medium linked" => [ - 0 => "Lien BBCode intermédaire", - ], - "BBCode thumbnail linked" => [ - 0 => "Lien BBCode miniature", - ], - "Markdown full" => [ - 0 => "Markdown complet", - ], - "Markdown full linked" => [ - 0 => "Markdown complet avec liens", - ], - "Markdown medium linked" => [ - 0 => "Markdown moyen avec liens", - ], - "Markdown thumbnail linked" => [ - 0 => "Markdown miniature avec liens", - ], - "Viewer links" => [ - 0 => "Liens du visualisateur", + "%s full" => [ + 0 => "%s plein", ], "All these words" => [ 0 => "Tous ces mots", @@ -1743,12 +1750,12 @@ $translation_table = [ "Text message, HTML or a redirect URL" => [ 0 => "Message texte, HTML ou une adresse URL de redirection.", ], - "Storage name" => [ - 0 => "Nom du stockage", - ], "API" => [ 0 => "API", ], + "Storage name" => [ + 0 => "Nom du stockage", + ], "This is for the old deprecated B2 API. For new buckets you have to use S3 Compatible API." => [ 0 => "Il s'agit de l'ancienne API B2 obsolète. Pour les nouveaux compartiments, vous devez utiliser l'API compatible S3.", ], @@ -1854,6 +1861,12 @@ $translation_table = [ "The system will map the images of this storage to this URL." => [ 0 => "Le système va lier les images de ce stockage à cette adresse URL.", ], + "Enabled types" => [ + 0 => "Types activés", + ], + "The storage will be used only for selected types." => [ + 0 => "Le stockage sera utilisé uniquement pour les types sélectionnés.", + ], "view more" => [ 0 => "voir plus", ], @@ -1893,12 +1906,12 @@ $translation_table = [ "Sign in with %label%" => [ 0 => "Connectez-vous avec %label%", ], - "Home" => [ - 0 => "Accueil", - ], "There's nothing to show here." => [ 0 => "Il n'y a rien à voir ici.", ], + "Selection will be assigned to %t." => [ + 0 => "La sélection sera attribuée à %t.", + ], "There is no categories." => [ 0 => "Il n'y a pas de catégories.", ], @@ -1935,9 +1948,6 @@ $translation_table = [ "Guest" => [ 0 => "Invité", ], - "Keyboard shortcuts" => [ - 0 => "Raccourcis clavier", - ], "Private album" => [ 0 => "Album privé", ], @@ -2064,9 +2074,6 @@ $translation_table = [ "I Agree" => [ 0 => "J'accepte", ], - "documentation" => [ - 0 => "documentation", - ], "Learn about %s at our %d." => [ 0 => "En savoir plus sur %s de notre %d.\n", ], @@ -2352,8 +2359,170 @@ $translation_table = [ "storage" => [ 0 => "stockage", ], - "Block image uploads by IP if the system notice a flood behavior based on the number of uploads per time period." => [ - 0 => "Bloquez l'envoi d'images par IP si le système remarque un comportement de flood basé sur le nombre d'envoi par période.", + "Enabled file extensions" => [ + 0 => "Extensions de fichiers activées", + ], + "Unsupported in your server" => [ + 0 => "Non pris en charge sur votre serveur", + ], + "Only checked file extensions will be allowed to be uploaded." => [ + 0 => "Seules les extensions de fichiers cochées pourront être téléchargées.", + ], + "Enable uploads" => [ + 0 => "Activer les envois", + ], + "Enable this if you want to allow %s uploads." => [ + 0 => "Activez ceci si vous souhaitez autoriser les téléchargements de %s.", + ], + "Enable this if you want to allow file upload from URLs." => [ + 0 => "Activez cette option si vous souhaitez autoriser le téléchargement de fichiers à partir d'URL.", + ], + "Note that enabling this will expose your server IP." => [ + 0 => "Notez que l'activation de cette option exposera l'adresse IP de votre serveur.", + ], + "This feature is available only for administrators." => [ + 0 => "Cette fonctionnalité est disponible uniquement pour les administrateurs.", + ], + "Upload user interface" => [ + 0 => "Télécharger l'interface utilisateur", + ], + "On-page container" => [ + 0 => "Conteneur sur la page", + ], + "route" => [ + 0 => "chemin", + ], + "Guest uploads" => [ + 0 => "Tranferts des Invités", + ], + "Enable this if you want to allow non registered users to upload." => [ + 0 => "Activez ceci si vous voulez autoriser les utilisateurs non enregistrés à envoyer des images.", + ], + "Moderate uploads" => [ + 0 => "Modérer les téléchargements", + ], + "Enable this to moderate incoming uploads. Target content will require moderation for approval." => [ + 0 => "Activez cette option pour modérer les téléchargements entrants. Le contenu cible nécessitera une modération pour approbation.", + ], + "Enable embed codes (uploader)" => [ + 0 => "Activer les codes d'intégration (après l'envoi)", + ], + "Enable this if you want to show embed codes when upload gets completed." => [ + 0 => "Activez ceci si vous souhaitez afficher les codes d'intégration quand un envoi est terminé.", + ], + "Upload threads" => [ + 0 => "Mise en ligne simultanées", + ], + "Number of simultaneous upload threads (parallel uploads)" => [ + 0 => "Nombre de mise en ligne simultanées (Mise en ligne parallèle)", + ], + "Redirect on single upload" => [ + 0 => "Rediriger après l'envoi d'une seule image.", + ], + "Enable this if you want to redirect to file viewer on single upload." => [ + 0 => "Activez cette option si vous souhaitez rediriger vers la visionneuse de fichiers lors d'un seul téléchargement.", + ], + "Enable duplicate uploads" => [ + 0 => "Activer la duplication des images mises en ligne", + ], + "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." => [ + 0 => "Activez cette option si vous souhaitez autoriser les envois en double à partir de la même adresse IP dans les 24 heures.", + ], + "Enable expirable uploads" => [ + 0 => "Activer l'expiration des envois", + ], + "Enable this if you want to allow uploads with an automatic delete option." => [ + 0 => "Activez cette option si vous souhaitez autoriser les envois avec une option de suppression automatique.", + ], + "Auto delete guest uploads" => [ + 0 => "Supprimer automatiquement les images mises en ligne par les invités", + ], + "Enable this if you want to force guest uploads to be auto deleted after certain time." => [ + 0 => "Activez l'option si vous souhaitez supprimer automatiquement après un certain temps les images mis en ligne par les visiteurs.", + ], + "Maximum image size" => [ + 0 => "Taille maximale de l'image", + ], + "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." => [ + 0 => "Les images supérieures à cette taille seront automatiquement réduites. Utilisez zéro (0) pour ne pas définir de limite.", + ], + "Image Exif data" => [ + 0 => "Données Exif de l'image", + ], + "Keep" => [ + 0 => "Garder", + ], + "Select the default setting for image Exif data on upload." => [ + 0 => "Sélectionnez le paramètre par défaut pour les données Exif de l'image à l'envoi.", + ], + "Image Exif data (user setting)" => [ + 0 => "Données Exif de l'image (réglage de l'utilisateur)", + ], + "Enable this if you want to allow each user to configure how image Exif data will be handled." => [ + 0 => "Activez cette option si vous souhaitez permettre à chaque utilisateur de configurer comment les données Exif de l'image seront traitées.", + ], + "Maximum upload file size" => [ + 0 => "Taille maximale de l'image importé", + ], + "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." => [ + 0 => "La taille maximale autorisée par le serveur est %s. Cette limite est fixée par %u et %p (valeurs %f)", + ], + "guests" => [ + 0 => "invités", + ], + "Same as \"%s\" but for guests." => [ + 0 => "Pareil que \"%s\" mais pour les invités.", + ], + "File path" => [ + 0 => "Chemin de fichier", + ], + "Relative to Chevereto root" => [ + 0 => "Relatif à la racine Chevereto", + ], + "Where to store the uploaded files? Relative to Chevereto root." => [ + 0 => "Où stocker les fichiers téléchargés ? Par rapport à la racine de Chevereto.", + ], + "Storage mode" => [ + 0 => "Mode de stockage", + ], + "Datefolders" => [ + 0 => "Dossiers de dates", + ], + "Datefolders creates %s structure" => [ + 0 => "Les dossiers de dates créent une structure %s", + ], + "File naming method" => [ + 0 => "Méthode de nommage des fichiers", + ], + "Original" => [ + 0 => "Original", + ], + "Mix original + random" => [ + 0 => "Mélange original + aléatoire", + ], + "\"Original\" will try to keep the file source name while \"Random\" will generate a random name. \"ID\" will name the file just like the file ID." => [ + 0 => "\"Original\" essaiera de conserver le nom de la source du fichier tandis que \"Random\" générera un nom aléatoire. \"ID\" nommera le fichier exactement comme l'ID du fichier.", + ], + "Thumb size" => [ + 0 => "Taille de miniature", + ], + "Thumbnails will be fixed to this size." => [ + 0 => "Les miniatures seront fixées à cette taille.", + ], + "Medium image fixed dimension" => [ + 0 => "Fixe les dimensions d'une image moyenne", + ], + "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." => [ + 0 => "Les images de taille moyenne seront fixées à cette dimension. Par exemple, si vous sélectionnez «width» cette dimension sera fixe et hauteur de l'image sera calculée automatiquement.", + ], + "Medium image fixed size" => [ + 0 => "Image de taille moyenne fixe", + ], + "Width or height will be automatically calculated." => [ + 0 => "La largeur ou la hauteur seront automatiquement calculés.", + ], + "Block file uploads by IP if the system notice a flood behavior based on the number of uploads per time period." => [ + 0 => "Bloquez les téléchargements de fichiers par IP si le système remarque un comportement de spam basé sur le nombre de téléchargements par période de temps.", ], "Notify to email" => [ 0 => "Notifier par email", @@ -2493,165 +2662,6 @@ $translation_table = [ "Comma-separated list of target user IDs (integers) to show most recent images on homepage. Leave it empty to display trending images." => [ 0 => "Liste séparée par des virgules des identifiants d'utilisateurs cibles pour afficher les images sur la page d'accueil. Laissez-le vide ou zéro pour afficher toutes les images récentes.", ], - "Enabled image formats" => [ - 0 => "Formats d'image activés", - ], - "Unsupported in your server" => [ - 0 => "Non pris en charge sur votre serveur", - ], - "Only checked image formats will be allowed to be uploaded." => [ - 0 => "Seuls les formats d'image cochés pourront être téléchargés.", - ], - "Enable uploads" => [ - 0 => "Activer les envois", - ], - "Enable this if you want to allow image upload from URLs." => [ - 0 => "Activez cette option si vous souhaitez autoriser les téléchargements d'images. Ce paramètre n'affecte pas les administrateurs.", - ], - "Note that enabling this will expose your server IP." => [ - 0 => "Notez que l'activation de cette option exposera l'adresse IP de votre serveur.", - ], - "This feature is available only for administrators." => [ - 0 => "Cette fonctionnalité est disponible uniquement pour les administrateurs.", - ], - "Upload user interface" => [ - 0 => "Télécharger l'interface utilisateur", - ], - "On-page container" => [ - 0 => "Conteneur sur la page", - ], - "route" => [ - 0 => "chemin", - ], - "Guest uploads" => [ - 0 => "Tranferts des Invités", - ], - "Enable this if you want to allow non registered users to upload." => [ - 0 => "Activez ceci si vous voulez autoriser les utilisateurs non enregistrés à envoyer des images.", - ], - "Moderate uploads" => [ - 0 => "Modérer les téléchargements", - ], - "Enable this to moderate incoming uploads. Target content will require moderation for approval." => [ - 0 => "Activez cette option pour modérer les téléchargements entrants. Le contenu cible nécessitera une modération pour approbation.", - ], - "Enable embed codes (uploader)" => [ - 0 => "Activer les codes d'intégration (après l'envoi)", - ], - "Enable this if you want to show embed codes when upload gets completed." => [ - 0 => "Activez ceci si vous souhaitez afficher les codes d'intégration quand un envoi est terminé.", - ], - "Upload threads" => [ - 0 => "Mise en ligne simultanées", - ], - "Number of simultaneous upload threads (parallel uploads)" => [ - 0 => "Nombre de mise en ligne simultanées (Mise en ligne parallèle)", - ], - "Redirect on single upload" => [ - 0 => "Rediriger après l'envoi d'une seule image.", - ], - "Enable this if you want to redirect to image page on single upload." => [ - 0 => "Activez cette option si vous souhaitez rediriger vers la page de l'image après l'envoi de celle-ci.", - ], - "Enable duplicate uploads" => [ - 0 => "Activer la duplication des images mises en ligne", - ], - "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." => [ - 0 => "Activez cette option si vous souhaitez autoriser les envois en double à partir de la même adresse IP dans les 24 heures.", - ], - "Enable expirable uploads" => [ - 0 => "Activer l'expiration des envois", - ], - "Enable this if you want to allow uploads with an automatic delete option." => [ - 0 => "Activez cette option si vous souhaitez autoriser les envois avec une option de suppression automatique.", - ], - "Auto delete guest uploads" => [ - 0 => "Supprimer automatiquement les images mises en ligne par les invités", - ], - "Enable this if you want to force guest uploads to be auto deleted after certain time." => [ - 0 => "Activez l'option si vous souhaitez supprimer automatiquement après un certain temps les images mis en ligne par les visiteurs.", - ], - "Maximum image size" => [ - 0 => "Taille maximale de l'image", - ], - "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." => [ - 0 => "Les images supérieures à cette taille seront automatiquement réduites. Utilisez zéro (0) pour ne pas définir de limite.", - ], - "Image Exif data" => [ - 0 => "Données Exif de l'image", - ], - "Keep" => [ - 0 => "Garder", - ], - "Select the default setting for image Exif data on upload." => [ - 0 => "Sélectionnez le paramètre par défaut pour les données Exif de l'image à l'envoi.", - ], - "Image Exif data (user setting)" => [ - 0 => "Données Exif de l'image (réglage de l'utilisateur)", - ], - "Enable this if you want to allow each user to configure how image Exif data will be handled." => [ - 0 => "Activez cette option si vous souhaitez permettre à chaque utilisateur de configurer comment les données Exif de l'image seront traitées.", - ], - "Maximum upload file size" => [ - 0 => "Taille maximale de l'image importé", - ], - "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." => [ - 0 => "La taille maximale autorisée par le serveur est %s. Cette limite est fixée par %u et %p (valeurs %f)", - ], - "guests" => [ - 0 => "invités", - ], - "Same as \"%s\" but for guests." => [ - 0 => "Pareil que \"%s\" mais pour les invités.", - ], - "Image path" => [ - 0 => "Répertoire des images", - ], - "Relative to Chevereto root" => [ - 0 => "Relatif à la racine Chevereto", - ], - "Where to store the images? Relative to Chevereto root." => [ - 0 => "Où stocker les images ? Relatif à la racine Chevereto.", - ], - "Storage mode" => [ - 0 => "Mode de stockage", - ], - "Datefolders" => [ - 0 => "Dossiers de dates", - ], - "Datefolders creates %s structure" => [ - 0 => "Les dossiers de dates créent une structure %s", - ], - "File naming method" => [ - 0 => "Méthode de nommage des fichiers", - ], - "Original" => [ - 0 => "Original", - ], - "Mix original + random" => [ - 0 => "Mélange original + aléatoire", - ], - "\"Original\" will try to keep the image source name while \"Random\" will generate a random name. \"ID\" will name the image just like the image ID." => [ - 0 => "\"Original\" tentera de garder le nom de l'image source tandis que \"aléatoire\" générera un nom aléatoire. \"ID\" nommera l'image comme l'ID de l'image.", - ], - "Thumb size" => [ - 0 => "Taille de miniature", - ], - "Thumbnails will be fixed to this size." => [ - 0 => "Les miniatures seront fixées à cette taille.", - ], - "Medium image fixed dimension" => [ - 0 => "Fixe les dimensions d'une image moyenne", - ], - "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." => [ - 0 => "Les images de taille moyenne seront fixées à cette dimension. Par exemple, si vous sélectionnez «width» cette dimension sera fixe et hauteur de l'image sera calculée automatiquement.", - ], - "Medium image fixed size" => [ - 0 => "Image de taille moyenne fixe", - ], - "Width or height will be automatically calculated." => [ - 0 => "La largeur ou la hauteur seront automatiquement calculés.", - ], "Expires" => [ 0 => "Expiration", ], @@ -2724,6 +2734,9 @@ $translation_table = [ "%t listing requirement" => [ 0 => "exigence de la liste %t", ], + "Sets the minimum content count needed to show %t in %s." => [ + 0 => "Définit le nombre de contenu minimum nécessaire pour afficher %t dans %s.", + ], "Listing columns number" => [ 0 => "Nombre de colonnes à afficher", ], @@ -2838,9 +2851,6 @@ $translation_table = [ "Only alphanumerics, hyphens and forward slash" => [ 0 => "Seuls les caractères alphanumériques, traits d'union et barre oblique", ], - "File path" => [ - 0 => "Chemin de fichier", - ], "A %f file relative to %s" => [ 0 => "Un fichier %f relatif à %s", ], @@ -2952,6 +2962,9 @@ $translation_table = [ "Debug errors" => [ 0 => "Erreurs de débogage", ], + "Enable this if you want to debug errors." => [ + 0 => "Activez ceci si vous souhaitez déboguer les erreurs.", + ], "Debug level" => [ 0 => "Niveau de débogage", ], @@ -3126,6 +3139,9 @@ $translation_table = [ "Enable user content delete" => [ 0 => "Activer la suppression du contenu pour les utilisateurs", ], + "Enable this if you want to allow users to delete their own content." => [ + 0 => "Activez cette option si vous souhaitez autoriser les utilisateurs à supprimer leur propre contenu.", + ], "Minimum age required" => [ 0 => "Age minimum requis", ], @@ -3330,8 +3346,41 @@ $translation_table = [ "Forced privacy modes will override user selected privacy." => [ 0 => "Les modes de confidentialité forcés outrepassent la confidentialité définie par l'utilisateur.", ], - "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %env% and when not set it fall-back to %var%." => [ - 0 => "Si l'adresse IP détectée ne correspond pas à la vôtre, cela signifie que votre serveur Web est sous proxy. L'adresse IP de connexion peut être définie à l'aide de l'en-tête HTTP défini dans la variable d'environnement %env% et, lorsqu'elle n'est pas définie, elle se replie sur %var%.", + "Hello and welcome, %s" => [ + 0 => "Bonjour et bienvenue, %s", + ], + "Whether you're an individual creator or a company looking for a powerful media sharing platform, Chevereto has you covered." => [ + 0 => "Que vous soyez un créateur individuel ou une entreprise à la recherche d'une puissante plateforme de partage multimédia, Chevereto a ce qu'il vous faut.", + ], + "share your feedback" => [ + 0 => "partagez vos commentaires", + ], + "We're always looking for ways to improve, feel free to %s and suggestions." => [ + 0 => "Nous sommes toujours à la recherche de moyens d'amélioration, n'hésitez pas à %s et à faire des suggestions.", + ], + "We are available for all your support and customization needs." => [ + 0 => "Nous sommes disponibles pour tous vos besoins d’assistance et de personnalisation.", + ], + "Thank you for choosing Chevereto." => [ + 0 => "Merci d'avoir choisi Chevereto.", + ], + "Chevereto creator" => [ + 0 => "Créateur de Chevereto", + ], + "Provide Chevereto license key by assigning the environment variable %e or by creating the %f file containing the license key." => [ + 0 => "Fournissez la clé de licence Chevereto en attribuant la variable d'environnement %e ou en créant le fichier %f contenant la clé de licence.", + ], + "You can also set the license key in the textarea below." => [ + 0 => "Vous pouvez également définir la clé de licence dans la zone de texte ci-dessous.", + ], + "Chevereto license key" => [ + 0 => "Clé de licence Chevereto", + ], + "PASTE LICENSE KEY HERE" => [ + 0 => "COLLER LA CLÉ DE LICENCE ICI", + ], + "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %e and when not set it fall-back to %v." => [ + 0 => "Si l'adresse IP détectée ne correspond pas à la vôtre, cela signifie que votre serveur Web est sous proxy. L'adresse IP de connexion peut être définie à l'aide de l'en-tête HTTP défini dans la variable d'environnement %e et, lorsqu'elle n'est pas définie, elle revient à %v.", ], "Make sure that you address this issue as the system relies on accurate IP detections to provide basic functionalities and to protect against spam, flooding, and brute force attacks." => [ 0 => "Assurez-vous de résoudre ce problème car le système s'appuie sur des détections IP précises pour fournir des fonctionnalités de base et pour se protéger contre le spam, les inondations et les attaques par force brute.", @@ -3342,8 +3391,8 @@ $translation_table = [ "%s News" => [ 0 => "Nouvelles %s", ], - "Installation details" => [ - 0 => "Détails d'installation", + "%s edition" => [ + 0 => "édition de %s", ], "Role" => [ 0 => "Rôle", @@ -3351,8 +3400,8 @@ $translation_table = [ "Email address" => [ 0 => "Adresse email", ], - "Play GIF" => [ - 0 => "Lire le GIF", + "Play %s" => [ + 0 => "Jouer %s", ], "Load 360° view" => [ 0 => "Charger la vue à 360°", @@ -3402,11 +3451,14 @@ $translation_table = [ "Add IP ban" => [ 0 => "Ajouter bannissement IP", ], - "Upload and share your images." => [ - 0 => "Envoyez et partagez vos images.", + "Upload and share your media" => [ + 0 => "Téléchargez et partagez vos médias", ], - "Drag and drop anywhere you want and start uploading your images now. %s limit. Direct image links, BBCode and HTML thumbnails." => [ - 0 => "Glisser-déposer n'importe où pour commencer l'envoi de vos images dès maintenant. Limite de %s. Liens directs vers l'image, BBCode et miniatures HTML.", + "Drag and drop anywhere to start uploading." => [ + 0 => "Faites glisser et déposez n'importe où pour commencer le téléchargement.", + ], + "Get direct links, Markdown, BBCode and HTML thumbnails." => [ + 0 => "Obtenez des liens directs, des vignettes Markdown, BBCode et HTML.", ], "Sign up to unlock all the features" => [ 0 => "Enregistrez-vous pour débloquer toutes les fonctionnalités", @@ -3441,8 +3493,14 @@ $translation_table = [ "Unlock" => [ 0 => "Ouvrir", ], - "Add image uploading to your website, blog or forum by installing our upload plugin. It provides image uploading to any website by placing a button that will allow your users to directly upload images to our service and it will automatically handle the codes needed for insertion. All features included like drag and drop, remote upload, image resizing and more." => [ - 0 => "Ajoutez le téléchargement d'images sur votre site web, blog ou forum en installant notre plugin de téléchargement. Il permet de télécharger des images vers n'importe quel site Web en plaçant un bouton qui permettra à vos utilisateurs de télécharger directement des images vers notre service et il traitera automatiquement les codes nécessaires à l'insertion. Toutes les fonctions incluses comme le glisser-déposer, le téléchargement à distance, le redimensionnement des images et plus encore.", + "Add media uploading and sharing to your website, blog or forum by installing our upload plugin." => [ + 0 => "Ajoutez le téléchargement et le partage de médias à votre site Web, blog ou forum en installant notre plugin de téléchargement.", + ], + "It provides file uploading to any website by placing a button that will allow your users to directly upload to our service and it will automatically handle the codes needed for insertion." => [ + 0 => "Il permet le téléchargement de fichiers sur n'importe quel site Web en plaçant un bouton qui permettra à vos utilisateurs de télécharger directement sur notre service et il gérera automatiquement les codes nécessaires à l'insertion.", + ], + "All features included like drag and drop, remote upload, image resizing and more." => [ + 0 => "Toutes les fonctionnalités incluses telles que le glisser-déposer, le téléchargement à distance, le redimensionnement des images et bien plus encore.", ], "Supported software" => [ 0 => "Logiciel supporté", @@ -3513,8 +3571,8 @@ $translation_table = [ "Auto delete uploads" => [ 0 => "Suppression automatique des envois", ], - "This setting will apply to all your image uploads by default. You can override this setting on each upload." => [ - 0 => "Ce paramètre sera applicable par défaut à toutes vos images envoyées. Vous pouvez outrepasser remplacer ce paramètre à chaque envoi.", + "This setting will apply to all your file uploads by default. You can override this setting on each upload." => [ + 0 => "Ce paramètre s’appliquera par défaut à tous vos téléchargements de fichiers. Vous pouvez remplacer ce paramètre à chaque téléchargement.", ], "Keep image Exif data on upload" => [ 0 => "Garder les données Exif de l'image lors de l'envoi", @@ -3618,9 +3676,6 @@ $translation_table = [ "This service is based on Chevereto self-hosted edition." => [ 0 => "Ce service est basé sur l'édition auto-hébergée de Chevereto.", ], - "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." => [ - 0 => "L'utilisation du logiciel Chevereto doit être conforme aux termes de la licence du logiciel connus sous le nom de \"Licence Chevereto\".", - ], "This instance is hosted in a service layer not provided by Chevereto Software, which hereby declare to do not have any control nor access to the management layer of this instance and it won't be responsible for this service neither the damages that this service may cause." => [ 0 => "Cette instance est hébergée dans une couche de service non fournie par Chevereto Software, qui déclare par la présente n'avoir aucun contrôle ni accès à la couche de gestion de cette instance et ne sera pas responsable de ce service ni des dommages que ce service pourrait causer .", ], diff --git a/app/.cache/languages/zh-TW.po.cache.php b/app/.cache/languages/zh-TW.po.cache.php index 6ab00ef..73698be 100644 --- a/app/.cache/languages/zh-TW.po.cache.php +++ b/app/.cache/languages/zh-TW.po.cache.php @@ -1,8 +1,8 @@ 'VERSION', - 'POT-Creation-Date' => '2023-06-26 11:09+0000', - 'PO-Revision-Date' => '2023-06-26 11:09+0000', + 'POT-Creation-Date' => '2024-05-20 18:55+0000', + 'PO-Revision-Date' => '2024-05-20 18:55+0000', 'Last-Translator' => 'FULL NAME ', 'Language-Team' => 'LANGUAGE TEAM ', 'Language' => 'zh_TW', @@ -16,12 +16,6 @@ $translation_plural = array ( 'function' => '0', ); $translation_table = [ - "Selection will be assigned to %t." => [ - 0 => "選擇將分配給 %t。", - ], - "Sets the minimum content count needed to show %t in %s." => [ - 0 => "設置在 %s 中顯示 %t 所需的最小內容計數。", - ], "You have been forbidden to use this website." => [ 0 => "你被禁止進入這個網站。", ], @@ -43,6 +37,9 @@ $translation_table = [ "Popular" => [ 0 => "最喜歡", ], + "Videos" => [ + 0 => "影片", + ], "Animated" => [ 0 => "動圖", ], @@ -157,11 +154,11 @@ $translation_table = [ "image" => [ 0 => "圖片", ], - "Stats" => [ - 0 => "統計", + "Home" => [ + 0 => "主頁", ], - "Images" => [ - 0 => "圖片", + "File" => [ + 0 => "檔案", ], "Album" => [ 0 => "相簿", @@ -175,6 +172,9 @@ $translation_table = [ "Settings" => [ 0 => "設定", ], + "Run %s" => [ + 0 => "運行 %s", + ], "Website" => [ 0 => "網站名稱", ], @@ -184,8 +184,8 @@ $translation_table = [ "Listings" => [ 0 => "佇列", ], - "Image upload" => [ - 0 => "圖片上傳", + "File uploads" => [ + 0 => "檔案上傳", ], "Semantics" => [ 0 => "語義", @@ -211,15 +211,24 @@ $translation_table = [ "Logo" => [ 0 => "Logo", ], - "External storage" => [ - 0 => "外部儲存空間", - ], "Homepage" => [ 0 => "首頁", ], "Pages" => [ 0 => "頁面", ], + "Upload plugin" => [ + 0 => "上載插件", + ], + "Consent screen" => [ + 0 => "內容警告", + ], + "Guests %s" => [ + 0 => "來賓 %s", + ], + "External storage" => [ + 0 => "外部儲存空間", + ], "Routing" => [ 0 => "路徑", ], @@ -229,15 +238,9 @@ $translation_table = [ "Login providers" => [ 0 => "登錄提供商", ], - "Upload plugin" => [ - 0 => "上載插件", - ], "Cookie compliance" => [ 0 => "Cookie合規性", ], - "Consent screen" => [ - 0 => "內容警告", - ], "Flood protection" => [ 0 => "流量攻擊防護", ], @@ -247,48 +250,42 @@ $translation_table = [ "IP bans" => [ 0 => "封鎖IP", ], - "Guests %s" => [ - 0 => "來賓 %s", - ], "Watermarks" => [ 0 => "浮水印", ], - "Documentation" => [ - 0 => "文件", + "Upgrade now" => [ + 0 => "現在升級", ], - "Admin" => [ - 0 => "管理員", + "The latest release will be downloaded and extracted in the filesystem." => [ + 0 => "最新版本將被下載並提取到檔案系統中。", ], - "%s docs" => [ - 0 => "%s 文檔", + "License key" => [ + 0 => "許可證密鑰", ], "Support" => [ 0 => "支援", ], - "Releases" => [ - 0 => "發布", - ], - "Community" => [ - 0 => "社群", - ], - "License" => [ - 0 => "許可證", - ], "install update" => [ 0 => "安裝更新", ], - "Check updates" => [ - 0 => "檢查更新", + "Check upgrades" => [ + 0 => "檢查升級", ], "not running" => [ 0 => "沒有運行", ], + "PHP function [%s] not available in this PHP installation" => [ + 0 => "PHP 函數 [%s] 在此 PHP 安裝中不可用", + ], "Max. upload file size" => [ 0 => "最大上傳檔案大小", ], - "Graphics Library" => [ + "Graphics library" => [ 0 => "圖形庫", ], + "Stats" => [ + 0 => "統計", + ], "Rebuild stats" => [ 0 => "重建統計", ], @@ -298,6 +295,36 @@ $translation_table = [ "Not your IP?" => [ 0 => "不是您的IP ?", ], + "Encryption" => [ + 0 => "加密", + ], + "Enabled" => [ + 0 => "啟用", + ], + "Disabled" => [ + 0 => "禁用", + ], + "Meta" => [ + 0 => "相關鏈接", + ], + "Blog" => [ + 0 => "部落格", + ], + "Docs" => [ + 0 => "文檔", + ], + "Releases" => [ + 0 => "發布", + ], + "Chat" => [ + 0 => "在線聯繫", + ], + "Community" => [ + 0 => "社群", + ], + "Links" => [ + 0 => "連結", + ], "Cron last ran" => [ 0 => "Cron 上次運行", ], @@ -307,21 +334,6 @@ $translation_table = [ "Server" => [ 0 => "伺服器", ], - "MySQL version" => [ - 0 => "MySQL版本", - ], - "MySQL server info" => [ - 0 => "MySQL伺服器資訊", - ], - "File uploads" => [ - 0 => "檔案上傳", - ], - "Enabled" => [ - 0 => "啟用", - ], - "Disabled" => [ - 0 => "禁用", - ], "Max. execution time" => [ 0 => "最大執行時間", ], @@ -362,19 +374,19 @@ $translation_table = [ 0 => "該頁面已被刪除.", ], "homepage" => [ - 0 => "首頁", + 0 => "主頁", ], "Before main title (%s)" => [ - 0 => "在主標題前 %s", + 0 => "在主標題前 (%s)", ], "After call to action (%s)" => [ - 0 => "在按鈕後 %s", + 0 => "在按鈕後 (%s)", ], "After cover (%s)" => [ - 0 => "在封面後 %s", + 0 => "在封面後 (%s)", ], "After listing (%s)" => [ - 0 => "在列表後 %s", + 0 => "在列表後 (%s)", ], "Before pagination" => [ 0 => "分頁前", @@ -404,28 +416,28 @@ $translation_table = [ 0 => "圖像瀏覽器後(圖像頁)", ], "Before header (image page)" => [ - 0 => "頭前(圖像頁)", + 0 => "標題之前(圖像頁)", ], "After header (image page)" => [ - 0 => "頭後(圖像頁)", + 0 => "標題後(圖像頁)", ], "Footer (image page)" => [ 0 => "頁尾(圖像頁)", ], "%s page" => [ - 0 => "%s 頁面", + 0 => "第 %s 頁", ], "Before header (%s page)" => [ 0 => "標題前(%s頁)", ], "After header (%s page)" => [ - 0 => "標題前(%s頁)", + 0 => "標題後(%s頁)", ], "User profile page" => [ 0 => "個人主頁", ], "After top (user profile)" => [ - 0 => "頭後(個人主頁)", + 0 => "頁頂後(個人主頁)", ], "Before listing (user profile)" => [ 0 => "列表前(個人主頁)", @@ -478,12 +490,15 @@ $translation_table = [ "Invalid value" => [ 0 => "無效的值", ], - "palette" => [ - 0 => "調色板", + "font" => [ + 0 => "字體", ], "Invalid %s" => [ 0 => "無效的 %s", ], + "palette" => [ + 0 => "調色板", + ], "Invalid theme image listing size" => [ 0 => "無效的主題圖片佇列大小", ], @@ -506,7 +521,7 @@ $translation_table = [ 0 => "無效的個人模式使用者ID", ], "Invalid or reserved route" => [ - 0 => "無效的路徑", + 0 => "無效或預留的路由", ], "Invalid website privacy mode" => [ 0 => "無效的網站隱私模式", @@ -521,7 +536,7 @@ $translation_table = [ 0 => "無效的按鈕顏色", ], "Invalid homepage call to action functionality" => [ - 0 => "無效的主頁「開始上傳」按鈕功能", + 0 => "無效的主頁按鈕功能", ], "Invalid title" => [ 0 => "無效標題", @@ -533,10 +548,10 @@ $translation_table = [ 0 => "無效的類型", ], "Invalid visibility" => [ - 0 => "无效的可见度", + 0 => "無效的可見性", ], "Invalid internal type" => [ - 0 => "內部類型無效", + 0 => "無效的內部類型", ], "Invalid target attribute" => [ 0 => "無效的目標屬性", @@ -548,13 +563,13 @@ $translation_table = [ 0 => "無效的圖標", ], "Invalid URL key" => [ - 0 => "無效的鏈接值", + 0 => "無效的URL key", ], "Invalid file path" => [ - 0 => "無效的文件路徑", + 0 => "無效的檔案路徑", ], "Invalid link URL" => [ - 0 => "無效的鏈接網址", + 0 => "無效的連結URL", ], "Invalid user minimum age" => [ 0 => "無效的使用者最低年齡", @@ -569,7 +584,7 @@ $translation_table = [ 0 => "無效的密鑰", ], "Routes can't be the same" => [ - 0 => "路徑是不能相同的", + 0 => "路由是不能相同的", ], "Invalid upload image path" => [ 0 => "無效的圖像上傳路徑", @@ -596,13 +611,13 @@ $translation_table = [ 0 => "無效的SMTP用戶名", ], "This URL key is already being used by another page (ID %s)" => [ - 0 => "此鏈接值已被另壹個頁面使用 (ID %s)", + 0 => "此URL key已被另一個頁面使用 (ID %s)", ], "This file path is already being used by another page (ID %s)" => [ - 0 => "此文件路徑已被另壹個頁面使用 (ID %s)", + 0 => "此檔案路徑已被另一個頁面使用 (ID %s)", ], "Can't save page contents: %s." => [ - 0 => "无法保存页面内容: %s", + 0 => "無法儲存頁面內容:%s。", ], "Dashboard" => [ 0 => "主控台", @@ -631,33 +646,6 @@ $translation_table = [ "Image %i hosted in %w" => [ 0 => "圖片 %i 儲存在 %w", ], - "Direct links" => [ - 0 => "直連URL", - ], - "Image link" => [ - 0 => "圖片連結", - ], - "Image URL" => [ - 0 => "圖片URL", - ], - "Thumbnail URL" => [ - 0 => "縮圖URL", - ], - "Medium URL" => [ - 0 => "中型圖片URL", - ], - "Full image" => [ - 0 => "全等圖像", - ], - "Full image (linked)" => [ - 0 => "全等圖像 (關聯)", - ], - "Medium image (linked)" => [ - 0 => "中等圖像 (關聯)", - ], - "Thumbnail image (linked)" => [ - 0 => "縮圖圖像 (關聯)", - ], "Start uploading" => [ 0 => "開始上傳", ], @@ -679,9 +667,6 @@ $translation_table = [ "%s URL key already being used." => [ 0 => "%s URL 已被使用。", ], - "IP address already banned" => [ - 0 => "IP位置已經被禁止訪問", - ], "Missing values" => [ 0 => "遺失的值", ], @@ -697,6 +682,9 @@ $translation_table = [ "%s added" => [ 0 => "%s 已添加", ], + "IP address already banned" => [ + 0 => "IP位置已經被禁止訪問", + ], "%s not found" => [ 0 => "找不到 %s", ], @@ -748,6 +736,15 @@ $translation_table = [ "A private user" => [ 0 => "私人用戶", ], + "Chevereto V%s license key used, required V%r or greater license key" => [ + 0 => "已使用 Chevereto V%s 許可證密鑰,需要 V%r 或更高許可證密鑰", + ], + "License key removed" => [ + 0 => "許可證密鑰已刪除", + ], + "License key updated" => [ + 0 => "許可證密鑰已更新", + ], "Wrong Username/Email password combination" => [ 0 => "錯誤的用戶名或密碼", ], @@ -835,6 +832,9 @@ $translation_table = [ "User ID" => [ 0 => "使用者ID", ], + "Images" => [ + 0 => "圖片", + ], "Register date" => [ 0 => "註冊日期", ], @@ -1120,68 +1120,95 @@ $translation_table = [ "Error deleting profile background image." => [ 0 => "在刪除個人主頁背景時發生錯誤", ], - "Update available v%s" => [ - 0 => "更新 v%s 已開放", + "Chevereto v%s available" => [ + 0 => "Chevereto v%s 可用", ], - "There is an update available for this system." => [ - 0 => "有適用於您的系統的更新。", + "There is a new Chevereto version available with the following release notes." => [ + 0 => "新的 Chevereto 版本具有以下發行說明。", ], - "Update instructions" => [ - 0 => "更新說明", + "Check %s for a complete changelog since you last upgrade." => [ + 0 => "檢查 %s 以取得自上次升級以來的完整變更日誌。", + ], + "documentation" => [ + 0 => "文件", + ], + "Check the %s for alternative update methods." => [ + 0 => "檢查 %s 以取得替代更新方法。", ], "This website is running latest %s version" => [ 0 => "網站正在使用最新的%s版本", ], + "Chevereto v%s installed" => [ + 0 => "Chevereto v%s 已安裝", + ], + "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." => [ + 0 => "使用 Chevereto 軟體必須遵守被稱為「Chevereto 授權」的軟體授權條款。", + ], + "License agreement" => [ + 0 => "許可協議", + ], "Please review the system requirements before proceeding" => [ 0 => "請在繼續之前查看系統要求", ], - "Toggle select" => [ - 0 => "切換選擇", + "Get a license at %s to unlock all features and support." => [ + 0 => "在 %s 取得許可證以解鎖所有功能和支援。", ], - "Like" => [ - 0 => "喜歡", + "You can enter your license key in the dashboard panel." => [ + 0 => "您可以在儀表板面板中輸入您的許可證密鑰。", + ], + "Enter license" => [ + 0 => "輸入許可證", ], "Create album" => [ 0 => "建立相簿", ], - "Toggle flag" => [ - 0 => "切換標誌", - ], - "Edit" => [ - 0 => "編輯", - ], "Approve" => [ 0 => "批准", ], "Delete" => [ 0 => "刪除", ], - "Previous" => [ - 0 => "前一個", + "Edit" => [ + 0 => "編輯", + ], + "Toggle flag" => [ + 0 => "切換標誌", + ], + "Like" => [ + 0 => "喜歡", ], "Next" => [ 0 => "下一個", ], + "Previous" => [ + 0 => "前一個", + ], + "Toggle select" => [ + 0 => "切換選擇", + ], "Zoom" => [ 0 => "Zoom", ], "File too big." => [ - 0 => "文件超出允許上傳的大小", + 0 => "檔案超出允許上傳的大小", ], "Invalid or unsupported file format." => [ 0 => "無效或是不支援的檔案格式.", ], "Some files couldn't be added" => [ - 0 => "有些文件無法加入", + 0 => "有些檔案無法加入", + ], + "Some files couldn't be loaded" => [ + 0 => "某些檔案無法載入", ], "file" => [ - 0 => "文件", + 0 => "檔案", ], "%s's Albums" => [ 0 => "%s 的相簿", ], - "Image edited successfully." => [ - 0 => "圖片編輯成功", + "File edited successfully." => [ + 0 => "檔案編輯成功。", ], "private" => [ 0 => "私密", @@ -1327,11 +1354,11 @@ $translation_table = [ "This email was sent from %w %u" => [ 0 => "這封電子郵件是由 %w %u 發送", ], - "Drag and drop or paste images here to upload" => [ - 0 => "拖拉或是直接貼上圖像在此進行上傳", + "Drag and drop or paste files here to upload" => [ + 0 => "將檔案拖放到或貼到此處即可上傳", ], - "Select the images to upload" => [ - 0 => "選擇需要上傳的圖片", + "Select the files to upload" => [ + 0 => "選擇要上傳的檔案", ], "You can also %i or %u." => [ 0 => "你可以從%i或%u", @@ -1342,8 +1369,8 @@ $translation_table = [ "browse from your computer" => [ 0 => "從電腦內選擇", ], - "add image URLs" => [ - 0 => "加入圖片連結", + "add file URLs" => [ + 0 => "新增檔案 URL", ], "You can also %i, %c or %u." => [ 0 => "你也可以 %i, %c 或者 %u.", @@ -1351,11 +1378,14 @@ $translation_table = [ "You can also %i or %c." => [ 0 => "您也可以 %i 或 %c。", ], - "browse from your device" => [ - 0 => "從您的設備瀏覽", + "browse from device" => [ + 0 => "從設備瀏覽", ], - "take a picture" => [ - 0 => "截圖", + "use camera" => [ + 0 => "使用相機", + ], + "max" => [ + 0 => "最大", ], "Register to get %s" => [ 0 => "註冊之後可上傳大小:%s", @@ -1439,7 +1469,7 @@ $translation_table = [ 0 => "取消剩下的", ], "Note: Some files couldn't be uploaded." => [ - 0 => "注意:部分文件無法上傳。", + 0 => "注意:部分檔案無法上傳。", ], "learn more" => [ 0 => "了解更多", @@ -1501,11 +1531,11 @@ $translation_table = [ "Brief description of this %s" => [ 0 => "此 %s 的簡要說明", ], - "Add image URLs" => [ - 0 => "加入圖片URL", + "File URLs" => [ + 0 => "檔案連結", ], - "Add the image URLs here" => [ - 0 => "在此加入圖片URL", + "Add file URLs here" => [ + 0 => "在此新增檔案連結", ], "Create %s" => [ 0 => "創建 %s", @@ -1525,62 +1555,38 @@ $translation_table = [ "Error report" => [ 0 => "錯誤報告", ], - "Links" => [ - 0 => "連結", - ], "Viewer" => [ 0 => "檢視器", ], - "%s links" => [ - 0 => "%s 鏈接", + "%s link" => [ + 0 => "%s 連結", ], "Direct" => [ 0 => "直接儲存", ], - "HTML Codes" => [ - 0 => "HTML代碼", + "Frame" => [ + 0 => "框架", ], - "HTML image" => [ - 0 => "HTML圖片", + "Thumbnail" => [ + 0 => "縮圖", ], - "HTML full linked" => [ - 0 => "HTML完整大小連結", + "Medium" => [ + 0 => "中型圖片", ], - "HTML medium linked" => [ - 0 => "HTML中等圖片連結", + "embed" => [ + 0 => "嵌入代碼", ], - "HTML thumbnail linked" => [ - 0 => "HTML縮圖連結", + "%s full linked" => [ + 0 => "%s 完整圖片連結", ], - "BBCodes" => [ - 0 => "BBCode代碼", + "%s medium linked" => [ + 0 => "%s 中型圖片連結", ], - "BBCode full" => [ - 0 => "BBCode完整大小", + "%s thumbnail linked" => [ + 0 => "%s 縮圖連結", ], - "BBCode full linked" => [ - 0 => "BBCode完整大小連結", - ], - "BBCode medium linked" => [ - 0 => "BBCode中等圖片連結", - ], - "BBCode thumbnail linked" => [ - 0 => "BBCode縮圖連結", - ], - "Markdown full" => [ - 0 => "Markdown 詳細訊息", - ], - "Markdown full linked" => [ - 0 => "Markdown 詳細連結", - ], - "Markdown medium linked" => [ - 0 => "Markdown 中等大小圖像連結", - ], - "Markdown thumbnail linked" => [ - 0 => "Markdown 縮圖連結", - ], - "Viewer links" => [ - 0 => "觀看者連結", + "%s full" => [ + 0 => "%s 完整圖片", ], "All these words" => [ 0 => "全部關鍵字", @@ -1726,12 +1732,12 @@ $translation_table = [ "Text message, HTML or a redirect URL" => [ 0 => "文字訊息, HTML或重導向至URL", ], - "Storage name" => [ - 0 => "儲存空間名稱", - ], "API" => [ 0 => "API", ], + "Storage name" => [ + 0 => "儲存空間名稱", + ], "This is for the old deprecated B2 API. For new buckets you have to use S3 Compatible API." => [ 0 => "這是針對舊的已棄用的 B2 API。 對於新存儲桶,您必須使用 S3 兼容 API。", ], @@ -1820,7 +1826,7 @@ $translation_table = [ 0 => "本地路徑", ], "Local path where the files will be stored" => [ - 0 => "文件存儲的本地路徑", + 0 => "檔案存儲的本地路徑", ], "Storage capacity" => [ 0 => "儲存容量", @@ -1837,6 +1843,12 @@ $translation_table = [ "The system will map the images of this storage to this URL." => [ 0 => "該系統將儲存空間的圖片映射到該URL.", ], + "Enabled types" => [ + 0 => "啟用類型", + ], + "The storage will be used only for selected types." => [ + 0 => "儲存將僅用於選定的類型。", + ], "view more" => [ 0 => "查看更多", ], @@ -1876,12 +1888,12 @@ $translation_table = [ "Sign in with %label%" => [ 0 => "使用 %label% 登錄", ], - "Home" => [ - 0 => "主頁", - ], "There's nothing to show here." => [ 0 => "沒有顯示的內容", ], + "Selection will be assigned to %t." => [ + 0 => "選擇將分配給 %t。", + ], "There is no categories." => [ 0 => "沒有分類.", ], @@ -1918,9 +1930,6 @@ $translation_table = [ "Guest" => [ 0 => "訪客", ], - "Keyboard shortcuts" => [ - 0 => "鍵盤快捷鍵", - ], "Private album" => [ 0 => "私人相簿", ], @@ -2047,9 +2056,6 @@ $translation_table = [ "I Agree" => [ 0 => "我同意", ], - "documentation" => [ - 0 => "文件", - ], "Learn about %s at our %d." => [ 0 => "在我們的 %d 了解 %s。", ], @@ -2335,8 +2341,170 @@ $translation_table = [ "storage" => [ 0 => "存儲", ], - "Block image uploads by IP if the system notice a flood behavior based on the number of uploads per time period." => [ - 0 => "如果系統根據每個時間段的上傳數量發現泛洪行為,則阻止按 IP 上傳圖片。", + "Enabled file extensions" => [ + 0 => "啟用檔案副檔名", + ], + "Unsupported in your server" => [ + 0 => "您的服務器不支持", + ], + "Only checked file extensions will be allowed to be uploaded." => [ + 0 => "只允許上傳選中的檔案副檔名。", + ], + "Enable uploads" => [ + 0 => "啟動上傳", + ], + "Enable this if you want to allow %s uploads." => [ + 0 => "如果您想允許 %s 上傳,請啟用此選項。", + ], + "Enable this if you want to allow file upload from URLs." => [ + 0 => "如果您想允許從 URL 上傳檔案,請啟用此選項。", + ], + "Note that enabling this will expose your server IP." => [ + 0 => "請注意,啟用此功能會暴露您的服務器 IP。", + ], + "This feature is available only for administrators." => [ + 0 => "此功能僅供管理員使用。", + ], + "Upload user interface" => [ + 0 => "上載使用者介面", + ], + "On-page container" => [ + 0 => "相同頁面中的上傳工具", + ], + "route" => [ + 0 => "路由", + ], + "Guest uploads" => [ + 0 => "訪客上傳", + ], + "Enable this if you want to allow non registered users to upload." => [ + 0 => "允許非註冊用戶上傳", + ], + "Moderate uploads" => [ + 0 => "審核上載", + ], + "Enable this to moderate incoming uploads. Target content will require moderation for approval." => [ + 0 => "啟用此選項可審核傳入的上載。 目標內容需要經過審核才能獲得批准。", + ], + "Enable embed codes (uploader)" => [ + 0 => "啟用嵌入代碼(上傳者)", + ], + "Enable this if you want to show embed codes when upload gets completed." => [ + 0 => "如果你想圖片上傳完成後顯示嵌入代碼請啟用這個功能.", + ], + "Upload threads" => [ + 0 => "上傳序列", + ], + "Number of simultaneous upload threads (parallel uploads)" => [ + 0 => "同時上傳連線數量(並行上傳)", + ], + "Redirect on single upload" => [ + 0 => "跳轉單張上傳", + ], + "Enable this if you want to redirect to file viewer on single upload." => [ + 0 => "如果您想在單次上傳時重定向到檔案檢視器,請啟用此選項。", + ], + "Enable duplicate uploads" => [ + 0 => "啟用重複上傳", + ], + "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." => [ + 0 => "如果您希望允許在 24 小時內從同一 IP 重複上傳,請啟用此選項。", + ], + "Enable expirable uploads" => [ + 0 => "啟用限時上傳", + ], + "Enable this if you want to allow uploads with an automatic delete option." => [ + 0 => "如果您想允許上傳與自動刪除選項請啟用它.", + ], + "Auto delete guest uploads" => [ + 0 => "自動刪除訪客上傳", + ], + "Enable this if you want to force guest uploads to be auto deleted after certain time." => [ + 0 => "開啟後可再一定時間後自動刪除訪客上傳的圖片", + ], + "Maximum image size" => [ + 0 => "最大圖片大小", + ], + "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." => [ + 0 => "大於此尺寸的圖片將自動縮小尺寸,使用(0)則不設置限制", + ], + "Image Exif data" => [ + 0 => "圖像Exif資料", + ], + "Keep" => [ + 0 => "保留", + ], + "Select the default setting for image Exif data on upload." => [ + 0 => "選擇預設的圖像 Exif資料 上傳.", + ], + "Image Exif data (user setting)" => [ + 0 => "圖像Exif資料 (使用者設置)", + ], + "Enable this if you want to allow each user to configure how image Exif data will be handled." => [ + 0 => "啟用它, 如果您允許每個用戶設置是否刪除圖像的Exif資料.", + ], + "Maximum upload file size" => [ + 0 => "最大上傳大小", + ], + "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." => [ + 0 => "主機限制最大上傳大小是%s這個限制是因為%u以及%p(%f的數值)", + ], + "guests" => [ + 0 => "訪客", + ], + "Same as \"%s\" but for guests." => [ + 0 => "跟\"%s\"一樣,遊客允許上傳大小.", + ], + "File path" => [ + 0 => "檔案路徑", + ], + "Relative to Chevereto root" => [ + 0 => "相對於Chevereto根目錄", + ], + "Where to store the uploaded files? Relative to Chevereto root." => [ + 0 => "上傳的檔案存放在哪裡?相對於 Chevereto 根。", + ], + "Storage mode" => [ + 0 => "儲存空間模式", + ], + "Datefolders" => [ + 0 => "利用時間建立資料夾", + ], + "Datefolders creates %s structure" => [ + 0 => "時間建立資料夾 %s 建立結構", + ], + "File naming method" => [ + 0 => "檔案命名方式", + ], + "Original" => [ + 0 => "原始", + ], + "Mix original + random" => [ + 0 => "原始 + 隨機", + ], + "\"Original\" will try to keep the file source name while \"Random\" will generate a random name. \"ID\" will name the file just like the file ID." => [ + 0 => "「原始」將嘗試保留檔案來源名稱,而「隨機」將產生隨機名稱。 “ID”將像檔案 ID 一樣命名文件。", + ], + "Thumb size" => [ + 0 => "縮圖大小", + ], + "Thumbnails will be fixed to this size." => [ + 0 => "縮圖將會被固定在此大小", + ], + "Medium image fixed dimension" => [ + 0 => "中等圖像固定尺寸", + ], + "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." => [ + 0 => "中等圖像將被固定至此分辨率. 例如, 如果您選擇\"寬度\", 這方面將是固定的, 圖像的高度將自動計算.", + ], + "Medium image fixed size" => [ + 0 => "中等圖像固定大小", + ], + "Width or height will be automatically calculated." => [ + 0 => "寬度或是高度將自動計算.", + ], + "Block file uploads by IP if the system notice a flood behavior based on the number of uploads per time period." => [ + 0 => "如果系統根據每個時間段的上傳數量發現泛洪行為,則阻止透過 IP 上傳檔案。", ], "Notify to email" => [ 0 => "以電子郵件通知", @@ -2476,165 +2644,6 @@ $translation_table = [ "Comma-separated list of target user IDs (integers) to show most recent images on homepage. Leave it empty to display trending images." => [ 0 => "用逗號分隔的目標用戶ID列表,以在首頁上顯示圖像。 保留為空白或零以顯示所有最近的圖像。", ], - "Enabled image formats" => [ - 0 => "啟用的圖像格式", - ], - "Unsupported in your server" => [ - 0 => "您的服務器不支持", - ], - "Only checked image formats will be allowed to be uploaded." => [ - 0 => "只允許上傳選中的圖像格式。", - ], - "Enable uploads" => [ - 0 => "啟動上傳", - ], - "Enable this if you want to allow image upload from URLs." => [ - 0 => "如果您希望允許從 URL 上傳圖片,請啟用此項。", - ], - "Note that enabling this will expose your server IP." => [ - 0 => "請注意,啟用此功能會暴露您的服務器 IP。", - ], - "This feature is available only for administrators." => [ - 0 => "此功能僅供管理員使用。", - ], - "Upload user interface" => [ - 0 => "上載使用者介面", - ], - "On-page container" => [ - 0 => "相同頁面中的上傳工具", - ], - "route" => [ - 0 => "路由", - ], - "Guest uploads" => [ - 0 => "訪客上傳", - ], - "Enable this if you want to allow non registered users to upload." => [ - 0 => "允許非註冊用戶上傳", - ], - "Moderate uploads" => [ - 0 => "審核上載", - ], - "Enable this to moderate incoming uploads. Target content will require moderation for approval." => [ - 0 => "啟用此選項可審核傳入的上載。 目標內容需要經過審核才能獲得批准。", - ], - "Enable embed codes (uploader)" => [ - 0 => "啟用嵌入代碼(上傳者)", - ], - "Enable this if you want to show embed codes when upload gets completed." => [ - 0 => "如果你想圖片上傳完成後顯示嵌入代碼請啟用這個功能.", - ], - "Upload threads" => [ - 0 => "上傳序列", - ], - "Number of simultaneous upload threads (parallel uploads)" => [ - 0 => "同時上傳連線數量(並行上傳)", - ], - "Redirect on single upload" => [ - 0 => "跳轉單張上傳", - ], - "Enable this if you want to redirect to image page on single upload." => [ - 0 => "啟用後上傳單張圖片後跳轉到該圖像的頁面.", - ], - "Enable duplicate uploads" => [ - 0 => "啟用重複上傳", - ], - "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." => [ - 0 => "如果您希望允許在 24 小時內從同一 IP 重複上傳,請啟用此選項。", - ], - "Enable expirable uploads" => [ - 0 => "啟用限時上傳", - ], - "Enable this if you want to allow uploads with an automatic delete option." => [ - 0 => "如果您想允許上傳與自動刪除選項請啟用它.", - ], - "Auto delete guest uploads" => [ - 0 => "自動刪除訪客上傳", - ], - "Enable this if you want to force guest uploads to be auto deleted after certain time." => [ - 0 => "開啟後可再一定時間後自動刪除訪客上傳的圖片", - ], - "Maximum image size" => [ - 0 => "最大圖片大小", - ], - "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." => [ - 0 => "大於此尺寸的圖片將自動縮小尺寸,使用(0)則不設置限制", - ], - "Image Exif data" => [ - 0 => "圖像Exif資料", - ], - "Keep" => [ - 0 => "保留", - ], - "Select the default setting for image Exif data on upload." => [ - 0 => "選擇預設的圖像 Exif資料 上傳.", - ], - "Image Exif data (user setting)" => [ - 0 => "圖像Exif資料 (使用者設置)", - ], - "Enable this if you want to allow each user to configure how image Exif data will be handled." => [ - 0 => "啟用它, 如果您允許每個用戶設置是否刪除圖像的Exif資料.", - ], - "Maximum upload file size" => [ - 0 => "最大上傳大小", - ], - "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." => [ - 0 => "主機限制最大上傳大小是%s這個限制是因為%u以及%p(%f的數值)", - ], - "guests" => [ - 0 => "訪客", - ], - "Same as \"%s\" but for guests." => [ - 0 => "跟\"%s\"一樣,遊客允許上傳大小.", - ], - "Image path" => [ - 0 => "圖片路徑", - ], - "Relative to Chevereto root" => [ - 0 => "相對於Chevereto根目錄", - ], - "Where to store the images? Relative to Chevereto root." => [ - 0 => "圖片儲存的位置? 相對於Chevereto根目錄", - ], - "Storage mode" => [ - 0 => "儲存空間模式", - ], - "Datefolders" => [ - 0 => "利用時間建立資料夾", - ], - "Datefolders creates %s structure" => [ - 0 => "時間建立資料夾 %s 建立結構", - ], - "File naming method" => [ - 0 => "檔案命名方式", - ], - "Original" => [ - 0 => "原始", - ], - "Mix original + random" => [ - 0 => "原始 + 隨機", - ], - "\"Original\" will try to keep the image source name while \"Random\" will generate a random name. \"ID\" will name the image just like the image ID." => [ - 0 => "\"原始的\"會盡量保持圖像原始名稱, 而\"隨機\"則產生一個隨機名稱. \"ID\"則使用圖像ID來產生命名.", - ], - "Thumb size" => [ - 0 => "縮圖大小", - ], - "Thumbnails will be fixed to this size." => [ - 0 => "縮圖將會被固定在此大小", - ], - "Medium image fixed dimension" => [ - 0 => "中等圖像固定尺寸", - ], - "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." => [ - 0 => "中等圖像將被固定至此分辨率. 例如, 如果您選擇\"寬度\", 這方面將是固定的, 圖像的高度將自動計算.", - ], - "Medium image fixed size" => [ - 0 => "中等圖像固定大小", - ], - "Width or height will be automatically calculated." => [ - 0 => "寬度或是高度將自動計算.", - ], "Expires" => [ 0 => "到期", ], @@ -2707,6 +2716,9 @@ $translation_table = [ "%t listing requirement" => [ 0 => "%t 列表要求", ], + "Sets the minimum content count needed to show %t in %s." => [ + 0 => "設置在 %s 中顯示 %t 所需的最小內容計數。", + ], "Listing columns number" => [ 0 => "頁面顯示列數", ], @@ -2821,9 +2833,6 @@ $translation_table = [ "Only alphanumerics, hyphens and forward slash" => [ 0 => "只有字母, 數字和片語", ], - "File path" => [ - 0 => "檔案路徑", - ], "A %f file relative to %s" => [ 0 => "%f 檔案相對於 %s", ], @@ -2852,7 +2861,7 @@ $translation_table = [ 0 => "連結目標屬性", ], "Select %s to open the page or link in a new window." => [ - 0 => "選擇 %s 來打開新頁面或是新視窗", + 0 => "選擇 %s 在新視窗中開啟頁面或連結。", ], "Link rel attribute" => [ 0 => "連結 rel 屬性", @@ -2935,6 +2944,9 @@ $translation_table = [ "Debug errors" => [ 0 => "偵錯錯誤", ], + "Enable this if you want to debug errors." => [ + 0 => "如果您想偵錯錯誤,請啟用此選項。", + ], "Debug level" => [ 0 => "除錯層級", ], @@ -3095,7 +3107,7 @@ $translation_table = [ 0 => "上傳插件", ], "Enable this to display plugin instructions at %u. A link to these instructions will be added to the %s menu." => [ - 0 => "啟用它以在 %u 顯示插件說明。 這些說明的鏈接將添加到 %s 菜單。", + 0 => "啟用它以在 %u 顯示插件說明。 這些說明的連結將添加到 %s 菜單。", ], "Use this to set a custom URL for %p. Please note that you need to manually replicate %s in this URL." => [ 0 => "使用此選項可為%p設置自定義URL。 請注意,您需要在此URL中手動複製%s。", @@ -3109,6 +3121,9 @@ $translation_table = [ "Enable user content delete" => [ 0 => "啟用用戶內容刪除", ], + "Enable this if you want to allow users to delete their own content." => [ + 0 => "如果您希望允許使用者刪除自己的內容,請啟用此選項。", + ], "Minimum age required" => [ 0 => "最低年齡要求", ], @@ -3266,7 +3281,7 @@ $translation_table = [ 0 => "隨機", ], "Enable this if you want to show a \"%s\" link at the footer." => [ - 0 => "如果您想在頁腳處顯示“%s”鏈接,請啟用此選項。", + 0 => "如果您想在頁腳處顯示“%s”連結,請啟用此選項。", ], "Likes" => [ 0 => "喜歡", @@ -3313,8 +3328,41 @@ $translation_table = [ "Forced privacy modes will override user selected privacy." => [ 0 => "全局隱私模式將覆蓋用戶選擇的隱私.", ], - "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %env% and when not set it fall-back to %var%." => [ - 0 => "如果檢測到的IP與您的IP不符,這意味著您的Web服務器正在使用代理。連接IP可以使用環境變數%env%中定義的HTTP標頭進行設置,當未設置時,它將回退到%var%。", + "Hello and welcome, %s" => [ + 0 => "您好,%s", + ], + "Whether you're an individual creator or a company looking for a powerful media sharing platform, Chevereto has you covered." => [ + 0 => "無論您是個人創作者還是正在尋找強大媒體共享平台的公司,Chevereto 都能滿足您的需求。", + ], + "share your feedback" => [ + 0 => "分享您的回饋", + ], + "We're always looking for ways to improve, feel free to %s and suggestions." => [ + 0 => "我們一直在尋找改進的方法,請隨時向 %s 提出建議。", + ], + "We are available for all your support and customization needs." => [ + 0 => "我們可以滿足您的所有支援和客製化需求。", + ], + "Thank you for choosing Chevereto." => [ + 0 => "感謝您選擇Chevereto。", + ], + "Chevereto creator" => [ + 0 => "Chevereto的創造者", + ], + "Provide Chevereto license key by assigning the environment variable %e or by creating the %f file containing the license key." => [ + 0 => "透過指派環境變數 %e 或建立包含許可證金鑰的 %f 檔案來提供 Chevereto 許可證金鑰。", + ], + "You can also set the license key in the textarea below." => [ + 0 => "您也可以在下面的文字區域中設定許可證密鑰。", + ], + "Chevereto license key" => [ + 0 => "Chevereto 許可證密鑰", + ], + "PASTE LICENSE KEY HERE" => [ + 0 => "在此處貼上許可證密鑰", + ], + "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %e and when not set it fall-back to %v." => [ + 0 => "如果偵測到的 IP 與您的 IP 不匹配,則表示您的 Web 伺服器處於代理之下。連接 IP 可以使用環境變數 %e 中定義的 HTTP 標頭進行設置,如果不設置,則回退到 %v。", ], "Make sure that you address this issue as the system relies on accurate IP detections to provide basic functionalities and to protect against spam, flooding, and brute force attacks." => [ 0 => "由於系統依賴準確的IP檢測來提供基本功能並防止SPAM、泛濫式圖片上傳及暴力破解,因此請確保您已解決此問題。", @@ -3325,8 +3373,8 @@ $translation_table = [ "%s News" => [ 0 => "%s 新聞", ], - "Installation details" => [ - 0 => "安裝細節", + "%s edition" => [ + 0 => "%s 版本", ], "Role" => [ 0 => "規則", @@ -3334,8 +3382,8 @@ $translation_table = [ "Email address" => [ 0 => "電子郵件地址", ], - "Play GIF" => [ - 0 => "播放 GIF", + "Play %s" => [ + 0 => "播放 %s", ], "Load 360° view" => [ 0 => "加載 360° 視圖", @@ -3385,11 +3433,14 @@ $translation_table = [ "Add IP ban" => [ 0 => "新增阻擋IP", ], - "Upload and share your images." => [ - 0 => "上傳並分享你的照片", + "Upload and share your media" => [ + 0 => "上傳並分享您的媒體", ], - "Drag and drop anywhere you want and start uploading your images now. %s limit. Direct image links, BBCode and HTML thumbnails." => [ - 0 => "拖放在您任何想要的地方進行圖像上傳. %s 的圖片大小限制, 直接的圖片連結, BBCode代碼, HTML代碼, 縮圖.", + "Drag and drop anywhere to start uploading." => [ + 0 => "拖曳到任何位置即可開始上傳。", + ], + "Get direct links, Markdown, BBCode and HTML thumbnails." => [ + 0 => "取得直接連結、Markdown、BBCode 和 HTML 縮圖。", ], "Sign up to unlock all the features" => [ 0 => "註冊即可啟用所有的功能", @@ -3424,8 +3475,14 @@ $translation_table = [ "Unlock" => [ 0 => "解鎖", ], - "Add image uploading to your website, blog or forum by installing our upload plugin. It provides image uploading to any website by placing a button that will allow your users to directly upload images to our service and it will automatically handle the codes needed for insertion. All features included like drag and drop, remote upload, image resizing and more." => [ - 0 => "通過安裝我們的上傳插件,將圖片上傳到您的網站,博客或論壇。 它通過放置一個按鈕,允許您的用戶直接將圖像上傳到我們的服務,並將自動處理插入所需的代碼,從而將圖像上傳到任何網站。 所有功能包括拖放,遠程上傳,圖像大小調整等。", + "Add media uploading and sharing to your website, blog or forum by installing our upload plugin." => [ + 0 => "透過安裝我們的上傳插件,將媒體上傳和分享添加到您的網站、部落格或論壇。", + ], + "It provides file uploading to any website by placing a button that will allow your users to directly upload to our service and it will automatically handle the codes needed for insertion." => [ + 0 => "它透過放置一個按鈕來提供檔案上傳到任何網站的功能,該按鈕允許您的用戶直接上傳到我們的服務,並且它將自動處理插入所需的程式碼。", + ], + "All features included like drag and drop, remote upload, image resizing and more." => [ + 0 => "包括拖放、遠端上傳、圖像大小調整等所有功能。", ], "Supported software" => [ 0 => "支持的軟件", @@ -3496,8 +3553,8 @@ $translation_table = [ "Auto delete uploads" => [ 0 => "自動刪除上傳", ], - "This setting will apply to all your image uploads by default. You can override this setting on each upload." => [ - 0 => "該設置將適用於在預設情況下所有的圖片上傳. 您可以使每個上傳應用此設置.", + "This setting will apply to all your file uploads by default. You can override this setting on each upload." => [ + 0 => "預設情況下,此設定將套用至您上傳的所有檔案。您可以在每次上傳時覆蓋此設定。", ], "Keep image Exif data on upload" => [ 0 => "在上傳時保留圖像的 Exif資料", @@ -3536,7 +3593,7 @@ $translation_table = [ 0 => "用戶沒有任何連結", ], "Link your account to external login providers to be able to login here." => [ - 0 => "將您的帳戶與外部登錄提供者鏈接,以便能夠在此處登錄", + 0 => "將您的帳戶與外部登錄提供者連結,以便能夠在此處登錄", ], "Do you really want to disconnect %s from this account?" => [ 0 => "你真的想從這個帳戶斷開 %s 嗎?", @@ -3601,9 +3658,6 @@ $translation_table = [ "This service is based on Chevereto self-hosted edition." => [ 0 => "此服務基於 Chevereto 自託管版。", ], - "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." => [ - 0 => "使用 Chevereto 軟體必須遵守被稱為「Chevereto 授權」的軟體授權條款。", - ], "This instance is hosted in a service layer not provided by Chevereto Software, which hereby declare to do not have any control nor access to the management layer of this instance and it won't be responsible for this service neither the damages that this service may cause." => [ 0 => "此實例托管在未由 Chevereto 軟體提供的服務層中,Chevereto 軟體在此聲明對於此實例的管理層沒有任何控制權或訪問權限,並且不對此服務或由此服務引起的任何損害負責。", ], diff --git a/app/composer.json b/app/composer.json index ccccaaf..313a574 100644 --- a/app/composer.json +++ b/app/composer.json @@ -16,7 +16,7 @@ "composer/package-versions-deprecated": true }, "platform": { - "php": "8.0.26" + "php": "8.0.30" } }, "require": { diff --git a/app/composer.lock b/app/composer.lock index 22837d7..3fd0546 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0bbc3dd1b9244ce1f02d783e5b5ff001", + "content-hash": "be5fdbc38f1019e3ca215b7fcf2d9ff6", "packages": [ { "name": "amphp/amp", @@ -1328,26 +1328,26 @@ }, { "name": "firebase/php-jwt", - "version": "v6.10.0", + "version": "v6.10.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -1385,9 +1385,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, - "time": "2023-12-01T16:26:39+00:00" + "time": "2024-05-18T18:05:11+00:00" }, { "name": "guzzlehttp/psr7", @@ -3680,16 +3680,16 @@ }, { "name": "react/promise", - "version": "v3.1.0", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c" + "reference": "8a164643313c71354582dc850b42b33fa12a4b63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", - "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", + "reference": "8a164643313c71354582dc850b42b33fa12a4b63", "shasum": "" }, "require": { @@ -3741,7 +3741,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.1.0" + "source": "https://github.com/reactphp/promise/tree/v3.2.0" }, "funding": [ { @@ -3749,7 +3749,7 @@ "type": "open_collective" } ], - "time": "2023-11-16T16:21:57+00:00" + "time": "2024-05-24T10:39:05+00:00" }, { "name": "react/socket", @@ -5317,16 +5317,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.0", + "version": "1.11.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "666cb1703742cea9cc80fee631f0940e1592fa6e" + "reference": "0d5d4294a70deb7547db655c47685d680e39cfec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/666cb1703742cea9cc80fee631f0940e1592fa6e", - "reference": "666cb1703742cea9cc80fee631f0940e1592fa6e", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d5d4294a70deb7547db655c47685d680e39cfec", + "reference": "0d5d4294a70deb7547db655c47685d680e39cfec", "shasum": "" }, "require": { @@ -5371,7 +5371,7 @@ "type": "github" } ], - "time": "2024-05-13T06:02:22+00:00" + "time": "2024-05-24T13:23:04+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7441,7 +7441,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "8.0.26" + "php": "8.0.30" }, "plugin-api-version": "2.6.0" } diff --git a/app/languages/fr.po b/app/languages/fr.po index adb5834..3f02e5a 100644 --- a/app/languages/fr.po +++ b/app/languages/fr.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: VERSION\n" -"POT-Creation-Date: 2023-05-22 15:49+0000\n" -"PO-Revision-Date: 2023-05-22 15:49+0000\n" +"POT-Creation-Date: 2024-05-20 18:55+0000\n" +"PO-Revision-Date: 2024-05-20 18:55+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE TEAM \n" "Language: fr\n" @@ -11,12 +11,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -msgid "Selection will be assigned to %t." -msgstr "La sélection sera attribuée à %t." - -msgid "Sets the minimum content count needed to show %t in %s." -msgstr "Définit le nombre de contenu minimum nécessaire pour afficher %t dans %s." - msgid "You have been forbidden to use this website." msgstr "Vous avez été banni du site." @@ -38,6 +32,9 @@ msgstr "Tendances" msgid "Popular" msgstr "Populaire" +msgid "Videos" +msgstr "Vidéos" + msgid "Animated" msgstr "Animé" @@ -160,11 +157,13 @@ msgid_plural "images" msgstr[0] "image" msgstr[1] "images" -msgid "Stats" -msgstr "Statistiques" +msgid "Home" +msgstr "Accueil" -msgid "Images" -msgstr "Images" +msgid "File" +msgid_plural "Files" +msgstr[0] "Fichier" +msgstr[1] "Fichiers" msgid "Album" msgid_plural "Albums" @@ -182,6 +181,10 @@ msgstr "Importer en masse" msgid "Settings" msgstr "Paramètres" +#, php-format +msgid "Run %s" +msgstr "Exécuter %s" + msgid "Website" msgstr "Site web" @@ -191,8 +194,8 @@ msgstr "Contenu" msgid "Listings" msgstr "Listes" -msgid "Image upload" -msgstr "Envoi d'image" +msgid "File uploads" +msgstr "Envoi de fichiers" msgid "Semantics" msgstr "Sémantique" @@ -218,15 +221,25 @@ msgstr "Outils" msgid "Logo" msgstr "Logo" -msgid "External storage" -msgstr "Stockage externe" - msgid "Homepage" msgstr "Page d'accueil" msgid "Pages" msgstr "Pages" +msgid "Upload plugin" +msgstr "Envoyer un plugin" + +msgid "Consent screen" +msgstr "Disclamer" + +#, php-format +msgid "Guests %s" +msgstr "Invités %s" + +msgid "External storage" +msgstr "Stockage externe" + msgid "Routing" msgstr "Adressage" @@ -236,15 +249,9 @@ msgstr "Services externes" msgid "Login providers" msgstr "Fournisseurs de connexion" -msgid "Upload plugin" -msgstr "Envoyer un plugin" - msgid "Cookie compliance" msgstr "Conformité aux cookies" -msgid "Consent screen" -msgstr "Disclamer" - msgid "Flood protection" msgstr "Protection flood" @@ -254,50 +261,43 @@ msgstr "Bannières" msgid "IP bans" msgstr "Bannissements IP" -#, php-format -msgid "Guests %s" -msgstr "Invités %s" - msgid "Watermarks" msgstr "Filigranes" -msgid "Documentation" -msgstr "Documentation" +msgid "Upgrade now" +msgstr "Mettre à jour maintenant" -msgid "Admin" -msgstr "Administrateur" +msgid "The latest release will be downloaded and extracted in the filesystem." +msgstr "La dernière version sera téléchargée et extraite dans le système de fichiers." -#, php-format -msgid "%s docs" -msgstr "%s documents" +msgid "License key" +msgstr "Clé de licence" msgid "Support" msgstr "Support" -msgid "Releases" -msgstr "Versions" - -msgid "Community" -msgstr "Communauté" - -msgid "License" -msgstr "Licence" - msgid "install update" msgstr "Installer la mise à jour" -msgid "Check updates" -msgstr "Vérifier les mises à jour" +msgid "Check upgrades" +msgstr "Vérifier les mises à niveau" msgid "not running" msgstr "pas en fonctionnement" +#, php-format +msgid "PHP function [%s] not available in this PHP installation" +msgstr "Fonction PHP [%s] non disponible dans cette installation PHP" + msgid "Max. upload file size" msgstr "Taille maximum de l'image importée" -msgid "Graphics Library" +msgid "Graphics library" msgstr "Bibliothèque graphique" +msgid "Stats" +msgstr "Statistiques" + msgid "Rebuild stats" msgstr "Reconstruire les stats" @@ -307,6 +307,36 @@ msgstr "IP de connexion" msgid "Not your IP?" msgstr "Pas votre IP ?" +msgid "Encryption" +msgstr "Chiffrement" + +msgid "Enabled" +msgstr "Activé" + +msgid "Disabled" +msgstr "Désactivé" + +msgid "Meta" +msgstr "Méta" + +msgid "Blog" +msgstr "Blog" + +msgid "Docs" +msgstr "Documents" + +msgid "Releases" +msgstr "Versions" + +msgid "Chat" +msgstr "Chat" + +msgid "Community" +msgstr "Communauté" + +msgid "Links" +msgstr "Liens" + msgid "Cron last ran" msgstr "Dernière exécution Cron" @@ -316,23 +346,8 @@ msgstr "Version de PHP" msgid "Server" msgstr "Serveur" -msgid "MySQL version" -msgstr "Version de MySQL" - -msgid "MySQL server info" -msgstr "Infos du serveur MySQL" - -msgid "File uploads" -msgstr "Envoi de fichiers" - -msgid "Enabled" -msgstr "Activé" - -msgid "Disabled" -msgstr "Désactivé" - msgid "Max. execution time" -msgstr "Temps d'exécution maximal" +msgstr "Temps max. d'exécution" #, php-format msgid "%d second" @@ -344,10 +359,10 @@ msgid "Memory limit" msgstr "Limite de mémoire" msgid "Can't delete all homepage cover images" -msgstr "Vous ne pouvez pas supprimer toutes les images de la page d'accueil" +msgstr "Impossible de supprimer toutes les images de couverture de la page d'accueil" msgid "Homepage cover image deleted" -msgstr "Image de la page d'accueil supprimé" +msgstr "Image de couverture de la page d'accueil supprimée" msgid "Local" msgstr "Local" @@ -362,72 +377,72 @@ msgid "search content" msgstr "rechercher du contenu" msgid "Add page" -msgstr "Ajouter page" +msgstr "Ajouter une page" #, php-format msgid "Edit page ID %s" -msgstr "Modifier la page ID %s" +msgstr "Modifier l'ID de la page %s" msgid "The page has been added successfully." msgstr "La page a été ajoutée avec succès." msgid "The page has been deleted." -msgstr "Cette page a été supprimée." +msgstr "La page a été supprimée." msgid "homepage" -msgstr "Page d'accueil" +msgstr "page d'accueil" #, php-format msgid "Before main title (%s)" -msgstr "Avant le titre (%s)" +msgstr "Avant le titre principal (%s)" #, php-format msgid "After call to action (%s)" -msgstr "Après le bouton (%s)" +msgstr "Après l'appel à l'action (%s)" #, php-format msgid "After cover (%s)" -msgstr "Après la photo (%s)" +msgstr "Après la couverture (%s)" #, php-format msgid "After listing (%s)" -msgstr "Après la liste d'images (%s)" +msgstr "Après la liste (%s)" msgid "Before pagination" -msgstr "Avant pagination" +msgstr "Avant la pagination" msgid "After pagination" -msgstr "Après pagination" +msgstr "Après la pagination" msgid "Content (image and album)" msgstr "Contenu (image et album)" msgid "Tab about column" -msgstr "Colonne du menu à propos" +msgstr "Onglet sur la colonne" msgid "Before comments" msgstr "Avant les commentaires" msgid "Image page" -msgstr "Page de l'image" +msgstr "Page d'images" msgid "Inside viewer top (image page)" -msgstr "Intérieur du haut de la page visualisation (page image)" +msgstr "Intérieure du haut de la visionneuse (page d'images)" msgid "Inside viewer foot (image page)" -msgstr "Intérieur du bas de la page visualisation (page image)" +msgstr "Intérieure du bas de la visionneuse (page d'images)" msgid "After image viewer (image page)" -msgstr "Après la page de visualisation (page image)" +msgstr "Après la visionneuse d'images (page d'images)" msgid "Before header (image page)" -msgstr "Avant le haut de page (page image)" +msgstr "Avant l'en-tête (page d'images)" msgid "After header (image page)" -msgstr "Après le haut de page (page image)" +msgstr "Après l'en-tête (page d'images)" msgid "Footer (image page)" -msgstr "Bas de page (page image)" +msgstr "Pied de page (page d'images)" #, php-format msgid "%s page" @@ -445,10 +460,10 @@ msgid "User profile page" msgstr "Page de profil utilisateur" msgid "After top (user profile)" -msgstr "Après le haut de page (profil utilisateur)" +msgstr "Après le haut (profil utilisateur)" msgid "Before listing (user profile)" -msgstr "Avant le listing (profil utilisateur)" +msgstr "Avant la liste (profil utilisateur)" msgid "Explore" msgstr "Explorer" @@ -500,102 +515,105 @@ msgstr "Thème non valide" msgid "Invalid value" msgstr "Valeur incorrect" -msgid "palette" -msgstr "palette" +msgid "font" +msgstr "police de caractère" #, php-format msgid "Invalid %s" -msgstr "%s non valide" +msgstr "%s invalide" + +msgid "palette" +msgstr "palette" msgid "Invalid theme image listing size" -msgstr "Taille de thème de listing d'images non valide" +msgstr "Taille de la liste des images de thème non valide" msgid "Invalid user id" -msgstr "ID utilisateur non valide" +msgstr "Identifiant invalide" msgid "Invalid email mode" -msgstr "Mode email non valide" +msgstr "Mode de mail invalide" msgid "Invalid SMTP port" -msgstr "Port SMTP non valide" +msgstr "Port SMTP invalide" msgid "Invalid SMTP security" -msgstr "Sécurité SMTP non valide" +msgstr "Sécurité SMTP invalide" msgid "Invalid website mode" -msgstr "Mode de site web non valide" +msgstr "Mode de site Web invalide" msgid "Invalid personal mode user ID" -msgstr "ID utilisateur du mode personnel non valide" +msgstr "ID utilisateur en mode personnel invalide" msgid "Invalid or reserved route" -msgstr "Route réservée ou non valide" +msgstr "Racine invalide ou réservé" msgid "Invalid website privacy mode" -msgstr "Mode de confidentialité de site web non valide" +msgstr "Mode de confidentialité du site Web invalide" msgid "Invalid website content privacy mode" -msgstr "Mode de confidentialité du contenu de site web non valide" +msgstr "Mode de confidentialité du contenu du site Web non valide" msgid "Invalid homepage style" -msgstr "Style de page d'accueil non valide" +msgstr "Style de page d'accueil invalide" msgid "Invalid homepage call to action button color" -msgstr "Couleur du bouton d'action de l'accueil non valide" +msgstr "Couleur du bouton d'appel à l'action de la page d'accueil non valide" msgid "Invalid homepage call to action functionality" msgstr "Fonctionnalité d'appel à l'action de la page d'accueil non valide" msgid "Invalid title" -msgstr "Titre non valide" +msgstr "Titre invalide" msgid "Invalid status" -msgstr "Statut non valide" +msgstr "Statut invalide" msgid "Invalid type" -msgstr "Type non valide" +msgstr "Type invalide" msgid "Invalid visibility" -msgstr "Visibilité non valide" +msgstr "Visibilité invalide" msgid "Invalid internal type" -msgstr "Type interne non valide" +msgstr "Type interne invalide" msgid "Invalid target attribute" msgstr "Attribut cible non valide" msgid "Invalid rel attribute" -msgstr "Attribut rel non valide" +msgstr "Attribut rel invalide" msgid "Invalid icon" -msgstr "Icône non valide" +msgstr "Icône invalide" msgid "Invalid URL key" -msgstr "Clé URL non valide" +msgstr "Clé URL invalide" msgid "Invalid file path" -msgstr "Chemin de fichier non valide" +msgstr "Chemin de fichier invalide" msgid "Invalid link URL" -msgstr "Lien URL non valide" +msgstr "URL de lien invalide" msgid "Invalid user minimum age" -msgstr "Age minimum invalide" +msgstr "Âge minimum de l'utilisateur non valide" msgid "Only alphanumeric, hyphen and underscore characters are allowed" -msgstr "Seuls les caractères alphanumériques, les traits d'union et les underscore sont autorisés" +msgstr "Seuls les caractères alphanumériques, tirets et traits de soulignement sont autorisés" msgid "Invalid URL" -msgstr "URL non valide" +msgstr "URL invalide" msgid "Invalid key" msgstr "Clé non valide" msgid "Routes can't be the same" -msgstr "Les adressages ne peuvent pas être identiques." +msgstr "Les racines ne peuvent pas être les mêmes" msgid "Invalid upload image path" -msgstr "Répertoire d'envoi d'images non valide" +msgstr "Chemin d'accès à l'image de téléchargement non valide" msgid "Invalid call to action URL" msgstr "URL d'appel à l'action non valide" @@ -605,23 +623,23 @@ msgid "Max. allowed %s" msgstr "Max. autorisé %s" msgid "Can't map %m to an existing folder (%f)" -msgstr "Impossible d'adresser %m à un dossier existant (%f)" +msgstr "Impossible de mapper %m à un dossier existant (%f)" msgid "Can't map %m to an existing route (%r)" -msgstr "Impossible d'adresser %m à un adressage existant (%r)" +msgstr "Impossible de mapper %m à une racine existante (%r)" msgid "Can't map %m to %r (username collision)" -msgstr "Impossible d'adresser %m à %r (Collision de nom d'utilisateur)" +msgstr "Impossible de mapper %m à %r (collision de nom d'utilisateur)" msgid "Invalid SMTP server" -msgstr "Serveur SMTP non valide" +msgstr "Serveur SMTP invalide" msgid "Invalid SMTP username" -msgstr "Nom d'utilisateur SMTP non valide" +msgstr "Nom d'utilisateur SMTP invalide" #, php-format msgid "This URL key is already being used by another page (ID %s)" -msgstr "Cette URL clé est déjà utilisée par une autre page (ID %s)" +msgstr "Cette clé URL est déjà utilisée par une autre page (ID %s)" #, php-format msgid "This file path is already being used by another page (ID %s)" @@ -629,7 +647,7 @@ msgstr "Ce chemin de fichier est déjà utilisé par une autre page (ID %s)" #, php-format msgid "Can't save page contents: %s." -msgstr "Impossible de sauvegarder le contenu de la page : %s." +msgstr "Impossible d'enregistrer le contenu de la page : %s." msgid "Dashboard" msgstr "Tableau de bord" @@ -658,33 +676,6 @@ msgstr "Image %i dans la catégorie %c" msgid "Image %i hosted in %w" msgstr "Image %i hébergée dans %w" -msgid "Direct links" -msgstr "Liens directs" - -msgid "Image link" -msgstr "Lien vers cette page" - -msgid "Image URL" -msgstr "Lien direct vers l'image" - -msgid "Thumbnail URL" -msgstr "URL de la miniature" - -msgid "Medium URL" -msgstr "URL intermédiaire" - -msgid "Full image" -msgstr "Image complète" - -msgid "Full image (linked)" -msgstr "Image complète (Lien raccourci)" - -msgid "Medium image (linked)" -msgstr "Miniature de l'image (Lien raccourci)" - -msgid "Thumbnail image (linked)" -msgstr "Miniature de l'image (Lien raccourci)" - msgid "Start uploading" msgstr "Commencer l'envoi" @@ -711,9 +702,6 @@ msgstr "Catégorie" msgid "%s URL key already being used." msgstr "La clé d'URL %s est déjà utilisée." -msgid "IP address already banned" -msgstr "L'adresse IP est déjà bannie" - msgid "Missing values" msgstr "Valeurs manquantes" @@ -730,6 +718,9 @@ msgstr "Nom d'utilisateur déjà utilisé" msgid "%s added" msgstr "%s ajouté" +msgid "IP address already banned" +msgstr "L'adresse IP est déjà bannie" + #, php-format msgid "%s not found" msgstr "%s introuvable" @@ -791,6 +782,15 @@ msgstr "%u vous suit désormais" msgid "A private user" msgstr "Utilisateur privé" +msgid "Chevereto V%s license key used, required V%r or greater license key" +msgstr "Clé de licence Chevereto V%s utilisée, clé de licence V%r ou supérieure requise" + +msgid "License key removed" +msgstr "Clé de licence supprimée" + +msgid "License key updated" +msgstr "Clé de licence mise à jour" + msgid "Wrong Username/Email password combination" msgstr "L'identifiant ou le mot de passe est incorrect" @@ -884,6 +884,9 @@ msgstr "Supprimer l'utilisateur" msgid "User ID" msgstr "ID Utilisateur" +msgid "Images" +msgstr "Images" + msgid "Register date" msgstr "Date d'enregistrement" @@ -1206,49 +1209,77 @@ msgid "Error deleting profile background image." msgstr "Erreur lors de la suppression de la photo de couverture." #, javascript-format -msgid "Update available v%s" -msgstr "Mise à jour disponible v%s" +msgid "Chevereto v%s available" +msgstr "Chevereto v%s disponible" -msgid "There is an update available for this system." -msgstr "Une mise à jour est disponible pour ce système." +msgid "There is a new Chevereto version available with the following release notes." +msgstr "Une nouvelle version de Chevereto est disponible avec les notes de version suivantes." -msgid "Update instructions" -msgstr "Instructions de mise à jour" +#, javascript-format +msgid "Check %s for a complete changelog since you last upgrade." +msgstr "Vérifiez %s pour un journal des modifications complet depuis votre dernière mise à niveau." + +msgid "documentation" +msgstr "documentation" + +#, javascript-format +msgid "Check the %s for alternative update methods." +msgstr "Vérifiez le %s pour d'autres méthodes de mise à jour." #, javascript-format msgid "This website is running latest %s version" msgstr "Ce site web utilise la dernière version %s" +#, javascript-format +msgid "Chevereto v%s installed" +msgstr "Chevereto v%s installé" + +msgid "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." +msgstr "L'utilisation du logiciel Chevereto doit être conforme aux termes de la licence du logiciel connus sous le nom de \"Licence Chevereto\"." + +msgid "License agreement" +msgstr "Accord de licence" + msgid "Please review the system requirements before proceeding" msgstr "Veuillez consulter la configuration requise avant de poursuivre" -msgid "Toggle select" -msgstr "Basculer la sélection" +#, javascript-format, php-format +msgid "Get a license at %s to unlock all features and support." +msgstr "Obtenez une licence chez %s pour débloquer toutes les fonctionnalités et le support." -msgid "Like" -msgstr "J'aime" +msgid "You can enter your license key in the dashboard panel." +msgstr "Vous pouvez saisir votre clé de licence dans le panneau du tableau de bord." + +msgid "Enter license" +msgstr "Entrez la licence" msgid "Create album" msgstr "Créer un album" -msgid "Toggle flag" -msgstr "Basculer le drapeau" - -msgid "Edit" -msgstr "Modifier" - msgid "Approve" msgstr "Approuver" msgid "Delete" msgstr "Supprimer" -msgid "Previous" -msgstr "Précédent" +msgid "Edit" +msgstr "Modifier" + +msgid "Toggle flag" +msgstr "Basculer le drapeau" + +msgid "Like" +msgstr "J'aime" msgid "Next" msgstr "Suivant" +msgid "Previous" +msgstr "Précédent" + +msgid "Toggle select" +msgstr "Basculer la sélection" + msgid "Zoom" msgstr "Zoom" @@ -1261,6 +1292,9 @@ msgstr "Format de fichier incorrect ou non pris en charge." msgid "Some files couldn't be added" msgstr "Certains fichiers n'ont pu être ajoutés" +msgid "Some files couldn't be loaded" +msgstr "Certains fichiers n'ont pas pu être chargés" + msgid "file" msgid_plural "files" msgstr[0] "fichier" @@ -1270,8 +1304,8 @@ msgstr[1] "fichiers" msgid "%s's Albums" msgstr "Les albums de %s" -msgid "Image edited successfully." -msgstr "Image modifiée avec succès." +msgid "File edited successfully." +msgstr "Fichier modifié avec succès." msgid "private" msgstr "privé" @@ -1427,11 +1461,11 @@ msgstr "Merci de rejoindre" msgid "This email was sent from %w %u" msgstr "Ce message a été envoyé par %w %u" -msgid "Drag and drop or paste images here to upload" -msgstr "Glisser-déposer ou coller les images ici pour les envoyer" +msgid "Drag and drop or paste files here to upload" +msgstr "Faites glisser et déposez ou collez les fichiers ici pour les télécharger" -msgid "Select the images to upload" -msgstr "Sélectionnez les images à envoyer" +msgid "Select the files to upload" +msgstr "Sélectionnez les fichiers à télécharger" msgid "You can also %i or %u." msgstr "Vous pouvez également %i ou %u." @@ -1443,8 +1477,8 @@ msgstr "Vous pouvez également %s." msgid "browse from your computer" msgstr "parcourir depuis votre ordinateur" -msgid "add image URLs" -msgstr "Ajouter des URL d'image" +msgid "add file URLs" +msgstr "ajouter des URL de fichiers" msgid "You can also %i, %c or %u." msgstr "Vous pouvez également %i, %c ou %u." @@ -1452,11 +1486,14 @@ msgstr "Vous pouvez également %i, %c ou %u." msgid "You can also %i or %c." msgstr "Vous pouvez également %i ou %c." -msgid "browse from your device" -msgstr "parcourir depuis votre appareil" +msgid "browse from device" +msgstr "parcourir depuis l'appareil" -msgid "take a picture" -msgstr "prendre une photo" +msgid "use camera" +msgstr "utiliser l'appareil photo" + +msgid "max" +msgstr "maximum" #, php-format msgid "Register to get %s" @@ -1612,11 +1649,11 @@ msgstr "Description" msgid "Brief description of this %s" msgstr "Brève description de cette %s" -msgid "Add image URLs" -msgstr "Ajouter les URLs d'images" +msgid "File URLs" +msgstr "URL de fichiers" -msgid "Add the image URLs here" -msgstr "Ajouter les URLs d'images ici" +msgid "Add file URLs here" +msgstr "Ajouter les URL des fichiers ici" #, php-format msgid "Create %s" @@ -1638,63 +1675,43 @@ msgstr "Sélectionnez un album existant pour déplacer le contenu téléchargé. msgid "Error report" msgstr "Rapport d'erreur" -msgid "Links" -msgstr "Liens" - msgid "Viewer" msgstr "Visualisateur" #, php-format -msgid "%s links" -msgstr "%s liens" +msgid "%s link" +msgstr "lien %s" msgid "Direct" msgstr "Direct" -msgid "HTML Codes" -msgstr "Codes HTML" +msgid "Frame" +msgstr "Image" -msgid "HTML image" -msgstr "Image HTML" +msgid "Thumbnail" +msgstr "Vignette" -msgid "HTML full linked" -msgstr "Lien complet HTML" +msgid "Medium" +msgstr "Moyen" -msgid "HTML medium linked" -msgstr "Lien HTML intermédiaire" +msgid "embed" +msgstr "intégrer" -msgid "HTML thumbnail linked" -msgstr "Lien HTML miniature" +#, php-format +msgid "%s full linked" +msgstr "%s entièrement lié" -msgid "BBCodes" -msgstr "BBCodes" +#, php-format +msgid "%s medium linked" +msgstr "%s support lié" -msgid "BBCode full" -msgstr "BBCode complet" +#, php-format +msgid "%s thumbnail linked" +msgstr "%s vignette liée" -msgid "BBCode full linked" -msgstr "Lien complet BBCode" - -msgid "BBCode medium linked" -msgstr "Lien BBCode intermédaire" - -msgid "BBCode thumbnail linked" -msgstr "Lien BBCode miniature" - -msgid "Markdown full" -msgstr "Markdown complet" - -msgid "Markdown full linked" -msgstr "Markdown complet avec liens" - -msgid "Markdown medium linked" -msgstr "Markdown moyen avec liens" - -msgid "Markdown thumbnail linked" -msgstr "Markdown miniature avec liens" - -msgid "Viewer links" -msgstr "Liens du visualisateur" +#, php-format +msgid "%s full" +msgstr "%s plein" msgid "All these words" msgstr "Tous ces mots" @@ -1846,12 +1863,12 @@ msgstr "Message" msgid "Text message, HTML or a redirect URL" msgstr "Message texte, HTML ou une adresse URL de redirection." -msgid "Storage name" -msgstr "Nom du stockage" - msgid "API" msgstr "API" +msgid "Storage name" +msgstr "Nom du stockage" + msgid "This is for the old deprecated B2 API. For new buckets you have to use S3 Compatible API." msgstr "Il s'agit de l'ancienne API B2 obsolète. Pour les nouveaux compartiments, vous devez utiliser l'API compatible S3." @@ -1958,6 +1975,12 @@ msgstr "URL du stockage" msgid "The system will map the images of this storage to this URL." msgstr "Le système va lier les images de ce stockage à cette adresse URL." +msgid "Enabled types" +msgstr "Types activés" + +msgid "The storage will be used only for selected types." +msgstr "Le stockage sera utilisé uniquement pour les types sélectionnés." + msgid "view more" msgstr "voir plus" @@ -2000,12 +2023,12 @@ msgstr "Se connecter avec un autre compte" msgid "Sign in with %label%" msgstr "Connectez-vous avec %label%" -msgid "Home" -msgstr "Accueil" - msgid "There's nothing to show here." msgstr "Il n'y a rien à voir ici." +msgid "Selection will be assigned to %t." +msgstr "La sélection sera attribuée à %t." + msgid "There is no categories." msgstr "Il n'y a pas de catégories." @@ -2042,9 +2065,6 @@ msgstr "Voulez-vous vraiment supprimer tout le contenu sélectionné ?" msgid "Guest" msgstr "Invité" -msgid "Keyboard shortcuts" -msgstr "Raccourcis clavier" - msgid "Private album" msgstr "Album privé" @@ -2178,9 +2198,6 @@ msgstr "En cliquant sur \"J'accepte\", vous déclarez que vous avez lu et compri msgid "I Agree" msgstr "J'accepte" -msgid "documentation" -msgstr "documentation" - #, php-format msgid "Learn about %s at our %d." msgstr "En savoir plus sur %s de notre %d.\n" @@ -2485,8 +2502,174 @@ msgstr "Par défaut le stockage local est utilisé ou quand aucun stockage exter msgid "storage" msgstr "stockage" -msgid "Block image uploads by IP if the system notice a flood behavior based on the number of uploads per time period." -msgstr "Bloquez l'envoi d'images par IP si le système remarque un comportement de flood basé sur le nombre d'envoi par période." +msgid "Enabled file extensions" +msgstr "Extensions de fichiers activées" + +msgid "Unsupported in your server" +msgstr "Non pris en charge sur votre serveur" + +msgid "Only checked file extensions will be allowed to be uploaded." +msgstr "Seules les extensions de fichiers cochées pourront être téléchargées." + +msgid "Enable uploads" +msgstr "Activer les envois" + +#, php-format +msgid "Enable this if you want to allow %s uploads." +msgstr "Activez ceci si vous souhaitez autoriser les téléchargements de %s." + +msgid "Enable this if you want to allow file upload from URLs." +msgstr "Activez cette option si vous souhaitez autoriser le téléchargement de fichiers à partir d'URL." + +msgid "Note that enabling this will expose your server IP." +msgstr "Notez que l'activation de cette option exposera l'adresse IP de votre serveur." + +msgid "This feature is available only for administrators." +msgstr "Cette fonctionnalité est disponible uniquement pour les administrateurs." + +msgid "Upload user interface" +msgstr "Télécharger l'interface utilisateur" + +msgid "On-page container" +msgstr "Conteneur sur la page" + +msgid "route" +msgstr "chemin" + +msgid "Guest uploads" +msgstr "Tranferts des Invités" + +msgid "Enable this if you want to allow non registered users to upload." +msgstr "Activez ceci si vous voulez autoriser les utilisateurs non enregistrés à envoyer des images." + +msgid "Moderate uploads" +msgstr "Modérer les téléchargements" + +msgid "Enable this to moderate incoming uploads. Target content will require moderation for approval." +msgstr "Activez cette option pour modérer les téléchargements entrants. Le contenu cible nécessitera une modération pour approbation." + +msgid "Enable embed codes (uploader)" +msgstr "Activer les codes d'intégration (après l'envoi)" + +msgid "Enable this if you want to show embed codes when upload gets completed." +msgstr "Activez ceci si vous souhaitez afficher les codes d'intégration quand un envoi est terminé." + +msgid "Upload threads" +msgstr "Mise en ligne simultanées" + +msgid "Number of simultaneous upload threads (parallel uploads)" +msgstr "Nombre de mise en ligne simultanées (Mise en ligne parallèle)" + +msgid "Redirect on single upload" +msgstr "Rediriger après l'envoi d'une seule image." + +msgid "Enable this if you want to redirect to file viewer on single upload." +msgstr "Activez cette option si vous souhaitez rediriger vers la visionneuse de fichiers lors d'un seul téléchargement." + +msgid "Enable duplicate uploads" +msgstr "Activer la duplication des images mises en ligne" + +msgid "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." +msgstr "Activez cette option si vous souhaitez autoriser les envois en double à partir de la même adresse IP dans les 24 heures." + +msgid "Enable expirable uploads" +msgstr "Activer l'expiration des envois" + +msgid "Enable this if you want to allow uploads with an automatic delete option." +msgstr "Activez cette option si vous souhaitez autoriser les envois avec une option de suppression automatique." + +msgid "Auto delete guest uploads" +msgstr "Supprimer automatiquement les images mises en ligne par les invités" + +msgid "Enable this if you want to force guest uploads to be auto deleted after certain time." +msgstr "Activez l'option si vous souhaitez supprimer automatiquement après un certain temps les images mis en ligne par les visiteurs." + +msgid "Maximum image size" +msgstr "Taille maximale de l'image" + +msgid "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." +msgstr "Les images supérieures à cette taille seront automatiquement réduites. Utilisez zéro (0) pour ne pas définir de limite." + +msgid "Image Exif data" +msgstr "Données Exif de l'image" + +msgid "Keep" +msgstr "Garder" + +#, php-format +msgid "Select the default setting for image Exif data on upload." +msgstr "Sélectionnez le paramètre par défaut pour les données Exif de l'image à l'envoi." + +msgid "Image Exif data (user setting)" +msgstr "Données Exif de l'image (réglage de l'utilisateur)" + +msgid "Enable this if you want to allow each user to configure how image Exif data will be handled." +msgstr "Activez cette option si vous souhaitez permettre à chaque utilisateur de configurer comment les données Exif de l'image seront traitées." + +msgid "Maximum upload file size" +msgstr "Taille maximale de l'image importé" + +msgid "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." +msgstr "La taille maximale autorisée par le serveur est %s. Cette limite est fixée par %u et %p (valeurs %f)" + +msgid "guests" +msgstr "invités" + +#, php-format +msgid "Same as \"%s\" but for guests." +msgstr "Pareil que \"%s\" mais pour les invités." + +msgid "File path" +msgstr "Chemin de fichier" + +msgid "Relative to Chevereto root" +msgstr "Relatif à la racine Chevereto" + +msgid "Where to store the uploaded files? Relative to Chevereto root." +msgstr "Où stocker les fichiers téléchargés ? Par rapport à la racine de Chevereto." + +msgid "Storage mode" +msgstr "Mode de stockage" + +msgid "Datefolders" +msgstr "Dossiers de dates" + +#, php-format +msgid "Datefolders creates %s structure" +msgstr "Les dossiers de dates créent une structure %s" + +msgid "File naming method" +msgstr "Méthode de nommage des fichiers" + +msgid "Original" +msgstr "Original" + +msgid "Mix original + random" +msgstr "Mélange original + aléatoire" + +msgid "\"Original\" will try to keep the file source name while \"Random\" will generate a random name. \"ID\" will name the file just like the file ID." +msgstr "\"Original\" essaiera de conserver le nom de la source du fichier tandis que \"Random\" générera un nom aléatoire. \"ID\" nommera le fichier exactement comme l'ID du fichier." + +msgid "Thumb size" +msgstr "Taille de miniature" + +msgid "Thumbnails will be fixed to this size." +msgstr "Les miniatures seront fixées à cette taille." + +msgid "Medium image fixed dimension" +msgstr "Fixe les dimensions d'une image moyenne" + +msgid "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." +msgstr "Les images de taille moyenne seront fixées à cette dimension. Par exemple, si vous sélectionnez «width» cette dimension sera fixe et hauteur de l'image sera calculée automatiquement." + +msgid "Medium image fixed size" +msgstr "Image de taille moyenne fixe" + +msgid "Width or height will be automatically calculated." +msgstr "La largeur ou la hauteur seront automatiquement calculés." + +msgid "Block file uploads by IP if the system notice a flood behavior based on the number of uploads per time period." +msgstr "Bloquez les téléchargements de fichiers par IP si le système remarque un comportement de spam basé sur le nombre de téléchargements par période de temps." msgid "Notify to email" msgstr "Notifier par email" @@ -2632,168 +2815,6 @@ msgstr "Votre identifiant utilisateur est : %s" msgid "Comma-separated list of target user IDs (integers) to show most recent images on homepage. Leave it empty to display trending images." msgstr "Liste séparée par des virgules des identifiants d'utilisateurs cibles pour afficher les images sur la page d'accueil. Laissez-le vide ou zéro pour afficher toutes les images récentes." -msgid "Enabled image formats" -msgstr "Formats d'image activés" - -msgid "Unsupported in your server" -msgstr "Non pris en charge sur votre serveur" - -msgid "Only checked image formats will be allowed to be uploaded." -msgstr "Seuls les formats d'image cochés pourront être téléchargés." - -msgid "Enable uploads" -msgstr "Activer les envois" - -msgid "Enable this if you want to allow image upload from URLs." -msgstr "Activez cette option si vous souhaitez autoriser les téléchargements d'images. Ce paramètre n'affecte pas les administrateurs." - -msgid "Note that enabling this will expose your server IP." -msgstr "Notez que l'activation de cette option exposera l'adresse IP de votre serveur." - -msgid "This feature is available only for administrators." -msgstr "Cette fonctionnalité est disponible uniquement pour les administrateurs." - -msgid "Upload user interface" -msgstr "Télécharger l'interface utilisateur" - -msgid "On-page container" -msgstr "Conteneur sur la page" - -msgid "route" -msgstr "chemin" - -msgid "Guest uploads" -msgstr "Tranferts des Invités" - -msgid "Enable this if you want to allow non registered users to upload." -msgstr "Activez ceci si vous voulez autoriser les utilisateurs non enregistrés à envoyer des images." - -msgid "Moderate uploads" -msgstr "Modérer les téléchargements" - -msgid "Enable this to moderate incoming uploads. Target content will require moderation for approval." -msgstr "Activez cette option pour modérer les téléchargements entrants. Le contenu cible nécessitera une modération pour approbation." - -msgid "Enable embed codes (uploader)" -msgstr "Activer les codes d'intégration (après l'envoi)" - -msgid "Enable this if you want to show embed codes when upload gets completed." -msgstr "Activez ceci si vous souhaitez afficher les codes d'intégration quand un envoi est terminé." - -msgid "Upload threads" -msgstr "Mise en ligne simultanées" - -msgid "Number of simultaneous upload threads (parallel uploads)" -msgstr "Nombre de mise en ligne simultanées (Mise en ligne parallèle)" - -msgid "Redirect on single upload" -msgstr "Rediriger après l'envoi d'une seule image." - -msgid "Enable this if you want to redirect to image page on single upload." -msgstr "Activez cette option si vous souhaitez rediriger vers la page de l'image après l'envoi de celle-ci." - -msgid "Enable duplicate uploads" -msgstr "Activer la duplication des images mises en ligne" - -msgid "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." -msgstr "Activez cette option si vous souhaitez autoriser les envois en double à partir de la même adresse IP dans les 24 heures." - -msgid "Enable expirable uploads" -msgstr "Activer l'expiration des envois" - -msgid "Enable this if you want to allow uploads with an automatic delete option." -msgstr "Activez cette option si vous souhaitez autoriser les envois avec une option de suppression automatique." - -msgid "Auto delete guest uploads" -msgstr "Supprimer automatiquement les images mises en ligne par les invités" - -msgid "Enable this if you want to force guest uploads to be auto deleted after certain time." -msgstr "Activez l'option si vous souhaitez supprimer automatiquement après un certain temps les images mis en ligne par les visiteurs." - -msgid "Maximum image size" -msgstr "Taille maximale de l'image" - -msgid "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." -msgstr "Les images supérieures à cette taille seront automatiquement réduites. Utilisez zéro (0) pour ne pas définir de limite." - -msgid "Image Exif data" -msgstr "Données Exif de l'image" - -msgid "Keep" -msgstr "Garder" - -#, php-format -msgid "Select the default setting for image Exif data on upload." -msgstr "Sélectionnez le paramètre par défaut pour les données Exif de l'image à l'envoi." - -msgid "Image Exif data (user setting)" -msgstr "Données Exif de l'image (réglage de l'utilisateur)" - -msgid "Enable this if you want to allow each user to configure how image Exif data will be handled." -msgstr "Activez cette option si vous souhaitez permettre à chaque utilisateur de configurer comment les données Exif de l'image seront traitées." - -msgid "Maximum upload file size" -msgstr "Taille maximale de l'image importé" - -msgid "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." -msgstr "La taille maximale autorisée par le serveur est %s. Cette limite est fixée par %u et %p (valeurs %f)" - -msgid "guests" -msgstr "invités" - -#, php-format -msgid "Same as \"%s\" but for guests." -msgstr "Pareil que \"%s\" mais pour les invités." - -msgid "Image path" -msgstr "Répertoire des images" - -msgid "Relative to Chevereto root" -msgstr "Relatif à la racine Chevereto" - -msgid "Where to store the images? Relative to Chevereto root." -msgstr "Où stocker les images ? Relatif à la racine Chevereto." - -msgid "Storage mode" -msgstr "Mode de stockage" - -msgid "Datefolders" -msgstr "Dossiers de dates" - -#, php-format -msgid "Datefolders creates %s structure" -msgstr "Les dossiers de dates créent une structure %s" - -msgid "File naming method" -msgstr "Méthode de nommage des fichiers" - -msgid "Original" -msgstr "Original" - -msgid "Mix original + random" -msgstr "Mélange original + aléatoire" - -msgid "\"Original\" will try to keep the image source name while \"Random\" will generate a random name. \"ID\" will name the image just like the image ID." -msgstr "\"Original\" tentera de garder le nom de l'image source tandis que \"aléatoire\" générera un nom aléatoire. \"ID\" nommera l'image comme l'ID de l'image." - -msgid "Thumb size" -msgstr "Taille de miniature" - -msgid "Thumbnails will be fixed to this size." -msgstr "Les miniatures seront fixées à cette taille." - -msgid "Medium image fixed dimension" -msgstr "Fixe les dimensions d'une image moyenne" - -msgid "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." -msgstr "Les images de taille moyenne seront fixées à cette dimension. Par exemple, si vous sélectionnez «width» cette dimension sera fixe et hauteur de l'image sera calculée automatiquement." - -msgid "Medium image fixed size" -msgstr "Image de taille moyenne fixe" - -msgid "Width or height will be automatically calculated." -msgstr "La largeur ou la hauteur seront automatiquement calculés." - msgid "Expires" msgstr "Expiration" @@ -2867,6 +2888,9 @@ msgstr "Les deux méthodes utilisent une largeur fixe mais la méthode fluide ut msgid "%t listing requirement" msgstr "exigence de la liste %t" +msgid "Sets the minimum content count needed to show %t in %s." +msgstr "Définit le nombre de contenu minimum nécessaire pour afficher %t dans %s." + msgid "Listing columns number" msgstr "Nombre de colonnes à afficher" @@ -2984,9 +3008,6 @@ msgstr "Les pages cachées ne s'afficheront pas dans les menus système, mais to msgid "Only alphanumerics, hyphens and forward slash" msgstr "Seuls les caractères alphanumériques, traits d'union et barre oblique" -msgid "File path" -msgstr "Chemin de fichier" - #, php-format msgid "A %f file relative to %s" msgstr "Un fichier %f relatif à %s" @@ -3110,6 +3131,9 @@ msgstr "C'est le grain de sel utilisé pour convertir des ID numériques en alph msgid "Debug errors" msgstr "Erreurs de débogage" +msgid "Enable this if you want to debug errors." +msgstr "Activez ceci si vous souhaitez déboguer les erreurs." + msgid "Debug level" msgstr "Niveau de débogage" @@ -3293,6 +3317,9 @@ msgstr "Activez ceci si vous souhaitez autoriser les utilisateurs à s'inscrire. msgid "Enable user content delete" msgstr "Activer la suppression du contenu pour les utilisateurs" +msgid "Enable this if you want to allow users to delete their own content." +msgstr "Activez cette option si vous souhaitez autoriser les utilisateurs à supprimer leur propre contenu." + msgid "Minimum age required" msgstr "Age minimum requis" @@ -3502,8 +3529,44 @@ msgstr "Forcer privé (ceux avec le lien)" msgid "Forced privacy modes will override user selected privacy." msgstr "Les modes de confidentialité forcés outrepassent la confidentialité définie par l'utilisateur." -msgid "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %env% and when not set it fall-back to %var%." -msgstr "Si l'adresse IP détectée ne correspond pas à la vôtre, cela signifie que votre serveur Web est sous proxy. L'adresse IP de connexion peut être définie à l'aide de l'en-tête HTTP défini dans la variable d'environnement %env% et, lorsqu'elle n'est pas définie, elle se replie sur %var%." +#, php-format +msgid "Hello and welcome, %s" +msgstr "Bonjour et bienvenue, %s" + +msgid "Whether you're an individual creator or a company looking for a powerful media sharing platform, Chevereto has you covered." +msgstr "Que vous soyez un créateur individuel ou une entreprise à la recherche d'une puissante plateforme de partage multimédia, Chevereto a ce qu'il vous faut." + +msgid "share your feedback" +msgstr "partagez vos commentaires" + +#, php-format +msgid "We're always looking for ways to improve, feel free to %s and suggestions." +msgstr "Nous sommes toujours à la recherche de moyens d'amélioration, n'hésitez pas à %s et à faire des suggestions." + +msgid "We are available for all your support and customization needs." +msgstr "Nous sommes disponibles pour tous vos besoins d’assistance et de personnalisation." + +msgid "Thank you for choosing Chevereto." +msgstr "Merci d'avoir choisi Chevereto." + +msgid "Chevereto creator" +msgstr "Créateur de Chevereto" + +#, php-format +msgid "Provide Chevereto license key by assigning the environment variable %e or by creating the %f file containing the license key." +msgstr "Fournissez la clé de licence Chevereto en attribuant la variable d'environnement %e ou en créant le fichier %f contenant la clé de licence." + +msgid "You can also set the license key in the textarea below." +msgstr "Vous pouvez également définir la clé de licence dans la zone de texte ci-dessous." + +msgid "Chevereto license key" +msgstr "Clé de licence Chevereto" + +msgid "PASTE LICENSE KEY HERE" +msgstr "COLLER LA CLÉ DE LICENCE ICI" + +msgid "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %e and when not set it fall-back to %v." +msgstr "Si l'adresse IP détectée ne correspond pas à la vôtre, cela signifie que votre serveur Web est sous proxy. L'adresse IP de connexion peut être définie à l'aide de l'en-tête HTTP défini dans la variable d'environnement %e et, lorsqu'elle n'est pas définie, elle revient à %v." msgid "Make sure that you address this issue as the system relies on accurate IP detections to provide basic functionalities and to protect against spam, flooding, and brute force attacks." msgstr "Assurez-vous de résoudre ce problème car le système s'appuie sur des détections IP précises pour fournir des fonctionnalités de base et pour se protéger contre le spam, les inondations et les attaques par force brute." @@ -3515,8 +3578,9 @@ msgstr "Disque" msgid "%s News" msgstr "Nouvelles %s" -msgid "Installation details" -msgstr "Détails d'installation" +#, php-format +msgid "%s edition" +msgstr "édition de %s" msgid "Role" msgstr "Rôle" @@ -3524,8 +3588,9 @@ msgstr "Rôle" msgid "Email address" msgstr "Adresse email" -msgid "Play GIF" -msgstr "Lire le GIF" +#, php-format +msgid "Play %s" +msgstr "Jouer %s" msgid "Load 360° view" msgstr "Charger la vue à 360°" @@ -3581,12 +3646,14 @@ msgstr "ID %s" msgid "Add IP ban" msgstr "Ajouter bannissement IP" -msgid "Upload and share your images." -msgstr "Envoyez et partagez vos images." +msgid "Upload and share your media" +msgstr "Téléchargez et partagez vos médias" -#, php-format -msgid "Drag and drop anywhere you want and start uploading your images now. %s limit. Direct image links, BBCode and HTML thumbnails." -msgstr "Glisser-déposer n'importe où pour commencer l'envoi de vos images dès maintenant. Limite de %s. Liens directs vers l'image, BBCode et miniatures HTML." +msgid "Drag and drop anywhere to start uploading." +msgstr "Faites glisser et déposez n'importe où pour commencer le téléchargement." + +msgid "Get direct links, Markdown, BBCode and HTML thumbnails." +msgstr "Obtenez des liens directs, des vignettes Markdown, BBCode et HTML." msgid "Sign up to unlock all the features" msgstr "Enregistrez-vous pour débloquer toutes les fonctionnalités" @@ -3622,8 +3689,14 @@ msgstr "Veuillez entrer le mot de passe pour continuer." msgid "Unlock" msgstr "Ouvrir" -msgid "Add image uploading to your website, blog or forum by installing our upload plugin. It provides image uploading to any website by placing a button that will allow your users to directly upload images to our service and it will automatically handle the codes needed for insertion. All features included like drag and drop, remote upload, image resizing and more." -msgstr "Ajoutez le téléchargement d'images sur votre site web, blog ou forum en installant notre plugin de téléchargement. Il permet de télécharger des images vers n'importe quel site Web en plaçant un bouton qui permettra à vos utilisateurs de télécharger directement des images vers notre service et il traitera automatiquement les codes nécessaires à l'insertion. Toutes les fonctions incluses comme le glisser-déposer, le téléchargement à distance, le redimensionnement des images et plus encore." +msgid "Add media uploading and sharing to your website, blog or forum by installing our upload plugin." +msgstr "Ajoutez le téléchargement et le partage de médias à votre site Web, blog ou forum en installant notre plugin de téléchargement." + +msgid "It provides file uploading to any website by placing a button that will allow your users to directly upload to our service and it will automatically handle the codes needed for insertion." +msgstr "Il permet le téléchargement de fichiers sur n'importe quel site Web en plaçant un bouton qui permettra à vos utilisateurs de télécharger directement sur notre service et il gérera automatiquement les codes nécessaires à l'insertion." + +msgid "All features included like drag and drop, remote upload, image resizing and more." +msgstr "Toutes les fonctionnalités incluses telles que le glisser-déposer, le téléchargement à distance, le redimensionnement des images et bien plus encore." msgid "Supported software" msgstr "Logiciel supporté" @@ -3697,8 +3770,8 @@ msgstr "%i à %f caractères
Lettres, chiffres et \"_\"" msgid "Auto delete uploads" msgstr "Suppression automatique des envois" -msgid "This setting will apply to all your image uploads by default. You can override this setting on each upload." -msgstr "Ce paramètre sera applicable par défaut à toutes vos images envoyées. Vous pouvez outrepasser remplacer ce paramètre à chaque envoi." +msgid "This setting will apply to all your file uploads by default. You can override this setting on each upload." +msgstr "Ce paramètre s’appliquera par défaut à tous vos téléchargements de fichiers. Vous pouvez remplacer ce paramètre à chaque téléchargement." #, php-format msgid "Keep image Exif data on upload" @@ -3812,9 +3885,6 @@ msgstr "Cette instance est hébergée dans une couche de service fournie par Che msgid "This service is based on Chevereto self-hosted edition." msgstr "Ce service est basé sur l'édition auto-hébergée de Chevereto." -msgid "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." -msgstr "L'utilisation du logiciel Chevereto doit être conforme aux termes de la licence du logiciel connus sous le nom de \"Licence Chevereto\"." - msgid "This instance is hosted in a service layer not provided by Chevereto Software, which hereby declare to do not have any control nor access to the management layer of this instance and it won't be responsible for this service neither the damages that this service may cause." msgstr "Cette instance est hébergée dans une couche de service non fournie par Chevereto Software, qui déclare par la présente n'avoir aucun contrôle ni accès à la couche de gestion de cette instance et ne sera pas responsable de ce service ni des dommages que ce service pourrait causer ." diff --git a/app/languages/zh-TW.po b/app/languages/zh-TW.po index 5c02b85..7dcac40 100644 --- a/app/languages/zh-TW.po +++ b/app/languages/zh-TW.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: VERSION\n" -"POT-Creation-Date: 2023-06-26 11:09+0000\n" -"PO-Revision-Date: 2023-06-26 11:09+0000\n" +"POT-Creation-Date: 2024-05-20 18:55+0000\n" +"PO-Revision-Date: 2024-05-20 18:55+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE TEAM \n" "Language: zh_TW\n" @@ -11,12 +11,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -msgid "Selection will be assigned to %t." -msgstr "選擇將分配給 %t。" - -msgid "Sets the minimum content count needed to show %t in %s." -msgstr "設置在 %s 中顯示 %t 所需的最小內容計數。" - msgid "You have been forbidden to use this website." msgstr "你被禁止進入這個網站。" @@ -38,6 +32,9 @@ msgstr "最熱門" msgid "Popular" msgstr "最喜歡" +msgid "Videos" +msgstr "影片" + msgid "Animated" msgstr "動圖" @@ -159,11 +156,12 @@ msgid "image" msgid_plural "images" msgstr[0] "圖片" -msgid "Stats" -msgstr "統計" +msgid "Home" +msgstr "主頁" -msgid "Images" -msgstr "圖片" +msgid "File" +msgid_plural "Files" +msgstr[0] "檔案" msgid "Album" msgid_plural "Albums" @@ -179,6 +177,10 @@ msgstr "批量導入工具" msgid "Settings" msgstr "設定" +#, php-format +msgid "Run %s" +msgstr "運行 %s" + msgid "Website" msgstr "網站名稱" @@ -188,8 +190,8 @@ msgstr "內容" msgid "Listings" msgstr "佇列" -msgid "Image upload" -msgstr "圖片上傳" +msgid "File uploads" +msgstr "檔案上傳" msgid "Semantics" msgstr "語義" @@ -215,15 +217,25 @@ msgstr "工具" msgid "Logo" msgstr "Logo" -msgid "External storage" -msgstr "外部儲存空間" - msgid "Homepage" msgstr "首頁" msgid "Pages" msgstr "頁面" +msgid "Upload plugin" +msgstr "上載插件" + +msgid "Consent screen" +msgstr "內容警告" + +#, php-format +msgid "Guests %s" +msgstr "來賓 %s" + +msgid "External storage" +msgstr "外部儲存空間" + msgid "Routing" msgstr "路徑" @@ -233,15 +245,9 @@ msgstr "外部服務" msgid "Login providers" msgstr "登錄提供商" -msgid "Upload plugin" -msgstr "上載插件" - msgid "Cookie compliance" msgstr "Cookie合規性" -msgid "Consent screen" -msgstr "內容警告" - msgid "Flood protection" msgstr "流量攻擊防護" @@ -251,50 +257,43 @@ msgstr "廣告" msgid "IP bans" msgstr "封鎖IP" -#, php-format -msgid "Guests %s" -msgstr "來賓 %s" - msgid "Watermarks" msgstr "浮水印" -msgid "Documentation" -msgstr "文件" +msgid "Upgrade now" +msgstr "現在升級" -msgid "Admin" -msgstr "管理員" +msgid "The latest release will be downloaded and extracted in the filesystem." +msgstr "最新版本將被下載並提取到檔案系統中。" -#, php-format -msgid "%s docs" -msgstr "%s 文檔" +msgid "License key" +msgstr "許可證密鑰" msgid "Support" msgstr "支援" -msgid "Releases" -msgstr "發布" - -msgid "Community" -msgstr "社群" - -msgid "License" -msgstr "許可證" - msgid "install update" msgstr "安裝更新" -msgid "Check updates" -msgstr "檢查更新" +msgid "Check upgrades" +msgstr "檢查升級" msgid "not running" msgstr "沒有運行" +#, php-format +msgid "PHP function [%s] not available in this PHP installation" +msgstr "PHP 函數 [%s] 在此 PHP 安裝中不可用" + msgid "Max. upload file size" msgstr "最大上傳檔案大小" -msgid "Graphics Library" +msgid "Graphics library" msgstr "圖形庫" +msgid "Stats" +msgstr "統計" + msgid "Rebuild stats" msgstr "重建統計" @@ -304,6 +303,36 @@ msgstr "連接中的IP" msgid "Not your IP?" msgstr "不是您的IP ?" +msgid "Encryption" +msgstr "加密" + +msgid "Enabled" +msgstr "啟用" + +msgid "Disabled" +msgstr "禁用" + +msgid "Meta" +msgstr "相關鏈接" + +msgid "Blog" +msgstr "部落格" + +msgid "Docs" +msgstr "文檔" + +msgid "Releases" +msgstr "發布" + +msgid "Chat" +msgstr "在線聯繫" + +msgid "Community" +msgstr "社群" + +msgid "Links" +msgstr "連結" + msgid "Cron last ran" msgstr "Cron 上次運行" @@ -313,21 +342,6 @@ msgstr "PHP版本" msgid "Server" msgstr "伺服器" -msgid "MySQL version" -msgstr "MySQL版本" - -msgid "MySQL server info" -msgstr "MySQL伺服器資訊" - -msgid "File uploads" -msgstr "檔案上傳" - -msgid "Enabled" -msgstr "啟用" - -msgid "Disabled" -msgstr "禁用" - msgid "Max. execution time" msgstr "最大執行時間" @@ -371,23 +385,23 @@ msgid "The page has been deleted." msgstr "該頁面已被刪除." msgid "homepage" -msgstr "首頁" +msgstr "主頁" #, php-format msgid "Before main title (%s)" -msgstr "在主標題前 %s" +msgstr "在主標題前 (%s)" #, php-format msgid "After call to action (%s)" -msgstr "在按鈕後 %s" +msgstr "在按鈕後 (%s)" #, php-format msgid "After cover (%s)" -msgstr "在封面後 %s" +msgstr "在封面後 (%s)" #, php-format msgid "After listing (%s)" -msgstr "在列表後 %s" +msgstr "在列表後 (%s)" msgid "Before pagination" msgstr "分頁前" @@ -417,17 +431,17 @@ msgid "After image viewer (image page)" msgstr "圖像瀏覽器後(圖像頁)" msgid "Before header (image page)" -msgstr "頭前(圖像頁)" +msgstr "標題之前(圖像頁)" msgid "After header (image page)" -msgstr "頭後(圖像頁)" +msgstr "標題後(圖像頁)" msgid "Footer (image page)" msgstr "頁尾(圖像頁)" #, php-format msgid "%s page" -msgstr "%s 頁面" +msgstr "第 %s 頁" #, php-format msgid "Before header (%s page)" @@ -435,13 +449,13 @@ msgstr "標題前(%s頁)" #, php-format msgid "After header (%s page)" -msgstr "標題前(%s頁)" +msgstr "標題後(%s頁)" msgid "User profile page" msgstr "個人主頁" msgid "After top (user profile)" -msgstr "頭後(個人主頁)" +msgstr "頁頂後(個人主頁)" msgid "Before listing (user profile)" msgstr "列表前(個人主頁)" @@ -496,13 +510,16 @@ msgstr "無效的主題" msgid "Invalid value" msgstr "無效的值" -msgid "palette" -msgstr "調色板" +msgid "font" +msgstr "字體" #, php-format msgid "Invalid %s" msgstr "無效的 %s" +msgid "palette" +msgstr "調色板" + msgid "Invalid theme image listing size" msgstr "無效的主題圖片佇列大小" @@ -525,7 +542,7 @@ msgid "Invalid personal mode user ID" msgstr "無效的個人模式使用者ID" msgid "Invalid or reserved route" -msgstr "無效的路徑" +msgstr "無效或預留的路由" msgid "Invalid website privacy mode" msgstr "無效的網站隱私模式" @@ -540,7 +557,7 @@ msgid "Invalid homepage call to action button color" msgstr "無效的按鈕顏色" msgid "Invalid homepage call to action functionality" -msgstr "無效的主頁「開始上傳」按鈕功能" +msgstr "無效的主頁按鈕功能" msgid "Invalid title" msgstr "無效標題" @@ -552,10 +569,10 @@ msgid "Invalid type" msgstr "無效的類型" msgid "Invalid visibility" -msgstr "无效的可见度" +msgstr "無效的可見性" msgid "Invalid internal type" -msgstr "內部類型無效" +msgstr "無效的內部類型" msgid "Invalid target attribute" msgstr "無效的目標屬性" @@ -567,13 +584,13 @@ msgid "Invalid icon" msgstr "無效的圖標" msgid "Invalid URL key" -msgstr "無效的鏈接值" +msgstr "無效的URL key" msgid "Invalid file path" -msgstr "無效的文件路徑" +msgstr "無效的檔案路徑" msgid "Invalid link URL" -msgstr "無效的鏈接網址" +msgstr "無效的連結URL" msgid "Invalid user minimum age" msgstr "無效的使用者最低年齡" @@ -588,7 +605,7 @@ msgid "Invalid key" msgstr "無效的密鑰" msgid "Routes can't be the same" -msgstr "路徑是不能相同的" +msgstr "路由是不能相同的" msgid "Invalid upload image path" msgstr "無效的圖像上傳路徑" @@ -617,15 +634,15 @@ msgstr "無效的SMTP用戶名" #, php-format msgid "This URL key is already being used by another page (ID %s)" -msgstr "此鏈接值已被另壹個頁面使用 (ID %s)" +msgstr "此URL key已被另一個頁面使用 (ID %s)" #, php-format msgid "This file path is already being used by another page (ID %s)" -msgstr "此文件路徑已被另壹個頁面使用 (ID %s)" +msgstr "此檔案路徑已被另一個頁面使用 (ID %s)" #, php-format msgid "Can't save page contents: %s." -msgstr "无法保存页面内容: %s" +msgstr "無法儲存頁面內容:%s。" msgid "Dashboard" msgstr "主控台" @@ -654,33 +671,6 @@ msgstr "圖片 %i 在 %c 分類" msgid "Image %i hosted in %w" msgstr "圖片 %i 儲存在 %w" -msgid "Direct links" -msgstr "直連URL" - -msgid "Image link" -msgstr "圖片連結" - -msgid "Image URL" -msgstr "圖片URL" - -msgid "Thumbnail URL" -msgstr "縮圖URL" - -msgid "Medium URL" -msgstr "中型圖片URL" - -msgid "Full image" -msgstr "全等圖像" - -msgid "Full image (linked)" -msgstr "全等圖像 (關聯)" - -msgid "Medium image (linked)" -msgstr "中等圖像 (關聯)" - -msgid "Thumbnail image (linked)" -msgstr "縮圖圖像 (關聯)" - msgid "Start uploading" msgstr "開始上傳" @@ -706,9 +696,6 @@ msgstr "分類" msgid "%s URL key already being used." msgstr "%s URL 已被使用。" -msgid "IP address already banned" -msgstr "IP位置已經被禁止訪問" - msgid "Missing values" msgstr "遺失的值" @@ -725,6 +712,9 @@ msgstr "該使用者名稱已經被使用" msgid "%s added" msgstr "%s 已添加" +msgid "IP address already banned" +msgstr "IP位置已經被禁止訪問" + #, php-format msgid "%s not found" msgstr "找不到 %s" @@ -786,6 +776,15 @@ msgstr "%u 關註了你" msgid "A private user" msgstr "私人用戶" +msgid "Chevereto V%s license key used, required V%r or greater license key" +msgstr "已使用 Chevereto V%s 許可證密鑰,需要 V%r 或更高許可證密鑰" + +msgid "License key removed" +msgstr "許可證密鑰已刪除" + +msgid "License key updated" +msgstr "許可證密鑰已更新" + msgid "Wrong Username/Email password combination" msgstr "錯誤的用戶名或密碼" @@ -878,6 +877,9 @@ msgstr "刪除用戶" msgid "User ID" msgstr "使用者ID" +msgid "Images" +msgstr "圖片" + msgid "Register date" msgstr "註冊日期" @@ -1190,71 +1192,102 @@ msgid "Error deleting profile background image." msgstr "在刪除個人主頁背景時發生錯誤" #, javascript-format -msgid "Update available v%s" -msgstr "更新 v%s 已開放" +msgid "Chevereto v%s available" +msgstr "Chevereto v%s 可用" -msgid "There is an update available for this system." -msgstr "有適用於您的系統的更新。" +msgid "There is a new Chevereto version available with the following release notes." +msgstr "新的 Chevereto 版本具有以下發行說明。" -msgid "Update instructions" -msgstr "更新說明" +#, javascript-format +msgid "Check %s for a complete changelog since you last upgrade." +msgstr "檢查 %s 以取得自上次升級以來的完整變更日誌。" + +msgid "documentation" +msgstr "文件" + +#, javascript-format +msgid "Check the %s for alternative update methods." +msgstr "檢查 %s 以取得替代更新方法。" #, javascript-format msgid "This website is running latest %s version" msgstr "網站正在使用最新的%s版本" +#, javascript-format +msgid "Chevereto v%s installed" +msgstr "Chevereto v%s 已安裝" + +msgid "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." +msgstr "使用 Chevereto 軟體必須遵守被稱為「Chevereto 授權」的軟體授權條款。" + +msgid "License agreement" +msgstr "許可協議" + msgid "Please review the system requirements before proceeding" msgstr "請在繼續之前查看系統要求" -msgid "Toggle select" -msgstr "切換選擇" +#, javascript-format, php-format +msgid "Get a license at %s to unlock all features and support." +msgstr "在 %s 取得許可證以解鎖所有功能和支援。" -msgid "Like" -msgstr "喜歡" +msgid "You can enter your license key in the dashboard panel." +msgstr "您可以在儀表板面板中輸入您的許可證密鑰。" + +msgid "Enter license" +msgstr "輸入許可證" msgid "Create album" msgstr "建立相簿" -msgid "Toggle flag" -msgstr "切換標誌" - -msgid "Edit" -msgstr "編輯" - msgid "Approve" msgstr "批准" msgid "Delete" msgstr "刪除" -msgid "Previous" -msgstr "前一個" +msgid "Edit" +msgstr "編輯" + +msgid "Toggle flag" +msgstr "切換標誌" + +msgid "Like" +msgstr "喜歡" msgid "Next" msgstr "下一個" +msgid "Previous" +msgstr "前一個" + +msgid "Toggle select" +msgstr "切換選擇" + msgid "Zoom" msgstr "Zoom" msgid "File too big." -msgstr "文件超出允許上傳的大小" +msgstr "檔案超出允許上傳的大小" msgid "Invalid or unsupported file format." msgstr "無效或是不支援的檔案格式." msgid "Some files couldn't be added" -msgstr "有些文件無法加入" +msgstr "有些檔案無法加入" + +msgid "Some files couldn't be loaded" +msgstr "某些檔案無法載入" msgid "file" msgid_plural "files" -msgstr[0] "文件" +msgstr[0] "檔案" #, javascript-format msgid "%s's Albums" msgstr "%s 的相簿" -msgid "Image edited successfully." -msgstr "圖片編輯成功" +msgid "File edited successfully." +msgstr "檔案編輯成功。" msgid "private" msgstr "私密" @@ -1410,11 +1443,11 @@ msgstr "感謝您的加入" msgid "This email was sent from %w %u" msgstr "這封電子郵件是由 %w %u 發送" -msgid "Drag and drop or paste images here to upload" -msgstr "拖拉或是直接貼上圖像在此進行上傳" +msgid "Drag and drop or paste files here to upload" +msgstr "將檔案拖放到或貼到此處即可上傳" -msgid "Select the images to upload" -msgstr "選擇需要上傳的圖片" +msgid "Select the files to upload" +msgstr "選擇要上傳的檔案" msgid "You can also %i or %u." msgstr "你可以從%i或%u" @@ -1426,8 +1459,8 @@ msgstr "您也可以 %s 。" msgid "browse from your computer" msgstr "從電腦內選擇" -msgid "add image URLs" -msgstr "加入圖片連結" +msgid "add file URLs" +msgstr "新增檔案 URL" msgid "You can also %i, %c or %u." msgstr "你也可以 %i, %c 或者 %u." @@ -1435,11 +1468,14 @@ msgstr "你也可以 %i, %c 或者 %u." msgid "You can also %i or %c." msgstr "您也可以 %i 或 %c。" -msgid "browse from your device" -msgstr "從您的設備瀏覽" +msgid "browse from device" +msgstr "從設備瀏覽" -msgid "take a picture" -msgstr "截圖" +msgid "use camera" +msgstr "使用相機" + +msgid "max" +msgstr "最大" #, php-format msgid "Register to get %s" @@ -1531,7 +1567,7 @@ msgid "cancel remaining" msgstr "取消剩下的" msgid "Note: Some files couldn't be uploaded." -msgstr "注意:部分文件無法上傳。" +msgstr "注意:部分檔案無法上傳。" msgid "learn more" msgstr "了解更多" @@ -1595,11 +1631,11 @@ msgstr "描述" msgid "Brief description of this %s" msgstr "此 %s 的簡要說明" -msgid "Add image URLs" -msgstr "加入圖片URL" +msgid "File URLs" +msgstr "檔案連結" -msgid "Add the image URLs here" -msgstr "在此加入圖片URL" +msgid "Add file URLs here" +msgstr "在此新增檔案連結" #, php-format msgid "Create %s" @@ -1621,63 +1657,43 @@ msgstr "選擇現有相冊以移動上傳的內容。" msgid "Error report" msgstr "錯誤報告" -msgid "Links" -msgstr "連結" - msgid "Viewer" msgstr "檢視器" #, php-format -msgid "%s links" -msgstr "%s 鏈接" +msgid "%s link" +msgstr "%s 連結" msgid "Direct" msgstr "直接儲存" -msgid "HTML Codes" -msgstr "HTML代碼" +msgid "Frame" +msgstr "框架" -msgid "HTML image" -msgstr "HTML圖片" +msgid "Thumbnail" +msgstr "縮圖" -msgid "HTML full linked" -msgstr "HTML完整大小連結" +msgid "Medium" +msgstr "中型圖片" -msgid "HTML medium linked" -msgstr "HTML中等圖片連結" +msgid "embed" +msgstr "嵌入代碼" -msgid "HTML thumbnail linked" -msgstr "HTML縮圖連結" +#, php-format +msgid "%s full linked" +msgstr "%s 完整圖片連結" -msgid "BBCodes" -msgstr "BBCode代碼" +#, php-format +msgid "%s medium linked" +msgstr "%s 中型圖片連結" -msgid "BBCode full" -msgstr "BBCode完整大小" +#, php-format +msgid "%s thumbnail linked" +msgstr "%s 縮圖連結" -msgid "BBCode full linked" -msgstr "BBCode完整大小連結" - -msgid "BBCode medium linked" -msgstr "BBCode中等圖片連結" - -msgid "BBCode thumbnail linked" -msgstr "BBCode縮圖連結" - -msgid "Markdown full" -msgstr "Markdown 詳細訊息" - -msgid "Markdown full linked" -msgstr "Markdown 詳細連結" - -msgid "Markdown medium linked" -msgstr "Markdown 中等大小圖像連結" - -msgid "Markdown thumbnail linked" -msgstr "Markdown 縮圖連結" - -msgid "Viewer links" -msgstr "觀看者連結" +#, php-format +msgid "%s full" +msgstr "%s 完整圖片" msgid "All these words" msgstr "全部關鍵字" @@ -1829,12 +1845,12 @@ msgstr "訊息" msgid "Text message, HTML or a redirect URL" msgstr "文字訊息, HTML或重導向至URL" -msgid "Storage name" -msgstr "儲存空間名稱" - msgid "API" msgstr "API" +msgid "Storage name" +msgstr "儲存空間名稱" + msgid "This is for the old deprecated B2 API. For new buckets you have to use S3 Compatible API." msgstr "這是針對舊的已棄用的 B2 API。 對於新存儲桶,您必須使用 S3 兼容 API。" @@ -1924,7 +1940,7 @@ msgid "Local path" msgstr "本地路徑" msgid "Local path where the files will be stored" -msgstr "文件存儲的本地路徑" +msgstr "檔案存儲的本地路徑" msgid "Storage capacity" msgstr "儲存容量" @@ -1941,6 +1957,12 @@ msgstr "儲存空間URL" msgid "The system will map the images of this storage to this URL." msgstr "該系統將儲存空間的圖片映射到該URL." +msgid "Enabled types" +msgstr "啟用類型" + +msgid "The storage will be used only for selected types." +msgstr "儲存將僅用於選定的類型。" + msgid "view more" msgstr "查看更多" @@ -1983,12 +2005,12 @@ msgstr "登入其他帳號" msgid "Sign in with %label%" msgstr "使用 %label% 登錄" -msgid "Home" -msgstr "主頁" - msgid "There's nothing to show here." msgstr "沒有顯示的內容" +msgid "Selection will be assigned to %t." +msgstr "選擇將分配給 %t。" + msgid "There is no categories." msgstr "沒有分類." @@ -2025,9 +2047,6 @@ msgstr "您真的要刪除所有選定的內容嗎?" msgid "Guest" msgstr "訪客" -msgid "Keyboard shortcuts" -msgstr "鍵盤快捷鍵" - msgid "Private album" msgstr "私人相簿" @@ -2161,9 +2180,6 @@ msgstr "點擊 \"我同意\" 後您可申明自己已閱讀並理解上述的所 msgid "I Agree" msgstr "我同意" -msgid "documentation" -msgstr "文件" - #, php-format msgid "Learn about %s at our %d." msgstr "在我們的 %d 了解 %s。" @@ -2468,8 +2484,174 @@ msgstr "預設情況下使用本地儲存空間, 或在外部儲存空間處於 msgid "storage" msgstr "存儲" -msgid "Block image uploads by IP if the system notice a flood behavior based on the number of uploads per time period." -msgstr "如果系統根據每個時間段的上傳數量發現泛洪行為,則阻止按 IP 上傳圖片。" +msgid "Enabled file extensions" +msgstr "啟用檔案副檔名" + +msgid "Unsupported in your server" +msgstr "您的服務器不支持" + +msgid "Only checked file extensions will be allowed to be uploaded." +msgstr "只允許上傳選中的檔案副檔名。" + +msgid "Enable uploads" +msgstr "啟動上傳" + +#, php-format +msgid "Enable this if you want to allow %s uploads." +msgstr "如果您想允許 %s 上傳,請啟用此選項。" + +msgid "Enable this if you want to allow file upload from URLs." +msgstr "如果您想允許從 URL 上傳檔案,請啟用此選項。" + +msgid "Note that enabling this will expose your server IP." +msgstr "請注意,啟用此功能會暴露您的服務器 IP。" + +msgid "This feature is available only for administrators." +msgstr "此功能僅供管理員使用。" + +msgid "Upload user interface" +msgstr "上載使用者介面" + +msgid "On-page container" +msgstr "相同頁面中的上傳工具" + +msgid "route" +msgstr "路由" + +msgid "Guest uploads" +msgstr "訪客上傳" + +msgid "Enable this if you want to allow non registered users to upload." +msgstr "允許非註冊用戶上傳" + +msgid "Moderate uploads" +msgstr "審核上載" + +msgid "Enable this to moderate incoming uploads. Target content will require moderation for approval." +msgstr "啟用此選項可審核傳入的上載。 目標內容需要經過審核才能獲得批准。" + +msgid "Enable embed codes (uploader)" +msgstr "啟用嵌入代碼(上傳者)" + +msgid "Enable this if you want to show embed codes when upload gets completed." +msgstr "如果你想圖片上傳完成後顯示嵌入代碼請啟用這個功能." + +msgid "Upload threads" +msgstr "上傳序列" + +msgid "Number of simultaneous upload threads (parallel uploads)" +msgstr "同時上傳連線數量(並行上傳)" + +msgid "Redirect on single upload" +msgstr "跳轉單張上傳" + +msgid "Enable this if you want to redirect to file viewer on single upload." +msgstr "如果您想在單次上傳時重定向到檔案檢視器,請啟用此選項。" + +msgid "Enable duplicate uploads" +msgstr "啟用重複上傳" + +msgid "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." +msgstr "如果您希望允許在 24 小時內從同一 IP 重複上傳,請啟用此選項。" + +msgid "Enable expirable uploads" +msgstr "啟用限時上傳" + +msgid "Enable this if you want to allow uploads with an automatic delete option." +msgstr "如果您想允許上傳與自動刪除選項請啟用它." + +msgid "Auto delete guest uploads" +msgstr "自動刪除訪客上傳" + +msgid "Enable this if you want to force guest uploads to be auto deleted after certain time." +msgstr "開啟後可再一定時間後自動刪除訪客上傳的圖片" + +msgid "Maximum image size" +msgstr "最大圖片大小" + +msgid "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." +msgstr "大於此尺寸的圖片將自動縮小尺寸,使用(0)則不設置限制" + +msgid "Image Exif data" +msgstr "圖像Exif資料" + +msgid "Keep" +msgstr "保留" + +#, php-format +msgid "Select the default setting for image Exif data on upload." +msgstr "選擇預設的圖像 Exif資料 上傳." + +msgid "Image Exif data (user setting)" +msgstr "圖像Exif資料 (使用者設置)" + +msgid "Enable this if you want to allow each user to configure how image Exif data will be handled." +msgstr "啟用它, 如果您允許每個用戶設置是否刪除圖像的Exif資料." + +msgid "Maximum upload file size" +msgstr "最大上傳大小" + +msgid "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." +msgstr "主機限制最大上傳大小是%s這個限制是因為%u以及%p(%f的數值)" + +msgid "guests" +msgstr "訪客" + +#, php-format +msgid "Same as \"%s\" but for guests." +msgstr "跟\"%s\"一樣,遊客允許上傳大小." + +msgid "File path" +msgstr "檔案路徑" + +msgid "Relative to Chevereto root" +msgstr "相對於Chevereto根目錄" + +msgid "Where to store the uploaded files? Relative to Chevereto root." +msgstr "上傳的檔案存放在哪裡?相對於 Chevereto 根。" + +msgid "Storage mode" +msgstr "儲存空間模式" + +msgid "Datefolders" +msgstr "利用時間建立資料夾" + +#, php-format +msgid "Datefolders creates %s structure" +msgstr "時間建立資料夾 %s 建立結構" + +msgid "File naming method" +msgstr "檔案命名方式" + +msgid "Original" +msgstr "原始" + +msgid "Mix original + random" +msgstr "原始 + 隨機" + +msgid "\"Original\" will try to keep the file source name while \"Random\" will generate a random name. \"ID\" will name the file just like the file ID." +msgstr "「原始」將嘗試保留檔案來源名稱,而「隨機」將產生隨機名稱。 “ID”將像檔案 ID 一樣命名文件。" + +msgid "Thumb size" +msgstr "縮圖大小" + +msgid "Thumbnails will be fixed to this size." +msgstr "縮圖將會被固定在此大小" + +msgid "Medium image fixed dimension" +msgstr "中等圖像固定尺寸" + +msgid "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." +msgstr "中等圖像將被固定至此分辨率. 例如, 如果您選擇\"寬度\", 這方面將是固定的, 圖像的高度將自動計算." + +msgid "Medium image fixed size" +msgstr "中等圖像固定大小" + +msgid "Width or height will be automatically calculated." +msgstr "寬度或是高度將自動計算." + +msgid "Block file uploads by IP if the system notice a flood behavior based on the number of uploads per time period." +msgstr "如果系統根據每個時間段的上傳數量發現泛洪行為,則阻止透過 IP 上傳檔案。" msgid "Notify to email" msgstr "以電子郵件通知" @@ -2615,168 +2797,6 @@ msgstr "您的使用者ID為:%s" msgid "Comma-separated list of target user IDs (integers) to show most recent images on homepage. Leave it empty to display trending images." msgstr "用逗號分隔的目標用戶ID列表,以在首頁上顯示圖像。 保留為空白或零以顯示所有最近的圖像。" -msgid "Enabled image formats" -msgstr "啟用的圖像格式" - -msgid "Unsupported in your server" -msgstr "您的服務器不支持" - -msgid "Only checked image formats will be allowed to be uploaded." -msgstr "只允許上傳選中的圖像格式。" - -msgid "Enable uploads" -msgstr "啟動上傳" - -msgid "Enable this if you want to allow image upload from URLs." -msgstr "如果您希望允許從 URL 上傳圖片,請啟用此項。" - -msgid "Note that enabling this will expose your server IP." -msgstr "請注意,啟用此功能會暴露您的服務器 IP。" - -msgid "This feature is available only for administrators." -msgstr "此功能僅供管理員使用。" - -msgid "Upload user interface" -msgstr "上載使用者介面" - -msgid "On-page container" -msgstr "相同頁面中的上傳工具" - -msgid "route" -msgstr "路由" - -msgid "Guest uploads" -msgstr "訪客上傳" - -msgid "Enable this if you want to allow non registered users to upload." -msgstr "允許非註冊用戶上傳" - -msgid "Moderate uploads" -msgstr "審核上載" - -msgid "Enable this to moderate incoming uploads. Target content will require moderation for approval." -msgstr "啟用此選項可審核傳入的上載。 目標內容需要經過審核才能獲得批准。" - -msgid "Enable embed codes (uploader)" -msgstr "啟用嵌入代碼(上傳者)" - -msgid "Enable this if you want to show embed codes when upload gets completed." -msgstr "如果你想圖片上傳完成後顯示嵌入代碼請啟用這個功能." - -msgid "Upload threads" -msgstr "上傳序列" - -msgid "Number of simultaneous upload threads (parallel uploads)" -msgstr "同時上傳連線數量(並行上傳)" - -msgid "Redirect on single upload" -msgstr "跳轉單張上傳" - -msgid "Enable this if you want to redirect to image page on single upload." -msgstr "啟用後上傳單張圖片後跳轉到該圖像的頁面." - -msgid "Enable duplicate uploads" -msgstr "啟用重複上傳" - -msgid "Enable this if you want to allow duplicate uploads from the same IP within 24hrs." -msgstr "如果您希望允許在 24 小時內從同一 IP 重複上傳,請啟用此選項。" - -msgid "Enable expirable uploads" -msgstr "啟用限時上傳" - -msgid "Enable this if you want to allow uploads with an automatic delete option." -msgstr "如果您想允許上傳與自動刪除選項請啟用它." - -msgid "Auto delete guest uploads" -msgstr "自動刪除訪客上傳" - -msgid "Enable this if you want to force guest uploads to be auto deleted after certain time." -msgstr "開啟後可再一定時間後自動刪除訪客上傳的圖片" - -msgid "Maximum image size" -msgstr "最大圖片大小" - -msgid "Images greater than this size will get automatically downsized. Use zero (0) to don't set a limit." -msgstr "大於此尺寸的圖片將自動縮小尺寸,使用(0)則不設置限制" - -msgid "Image Exif data" -msgstr "圖像Exif資料" - -msgid "Keep" -msgstr "保留" - -#, php-format -msgid "Select the default setting for image Exif data on upload." -msgstr "選擇預設的圖像 Exif資料 上傳." - -msgid "Image Exif data (user setting)" -msgstr "圖像Exif資料 (使用者設置)" - -msgid "Enable this if you want to allow each user to configure how image Exif data will be handled." -msgstr "啟用它, 如果您允許每個用戶設置是否刪除圖像的Exif資料." - -msgid "Maximum upload file size" -msgstr "最大上傳大小" - -msgid "Maximum size allowed by server is %s. This limit is capped by %u and %p (%f values)." -msgstr "主機限制最大上傳大小是%s這個限制是因為%u以及%p(%f的數值)" - -msgid "guests" -msgstr "訪客" - -#, php-format -msgid "Same as \"%s\" but for guests." -msgstr "跟\"%s\"一樣,遊客允許上傳大小." - -msgid "Image path" -msgstr "圖片路徑" - -msgid "Relative to Chevereto root" -msgstr "相對於Chevereto根目錄" - -msgid "Where to store the images? Relative to Chevereto root." -msgstr "圖片儲存的位置? 相對於Chevereto根目錄" - -msgid "Storage mode" -msgstr "儲存空間模式" - -msgid "Datefolders" -msgstr "利用時間建立資料夾" - -#, php-format -msgid "Datefolders creates %s structure" -msgstr "時間建立資料夾 %s 建立結構" - -msgid "File naming method" -msgstr "檔案命名方式" - -msgid "Original" -msgstr "原始" - -msgid "Mix original + random" -msgstr "原始 + 隨機" - -msgid "\"Original\" will try to keep the image source name while \"Random\" will generate a random name. \"ID\" will name the image just like the image ID." -msgstr "\"原始的\"會盡量保持圖像原始名稱, 而\"隨機\"則產生一個隨機名稱. \"ID\"則使用圖像ID來產生命名." - -msgid "Thumb size" -msgstr "縮圖大小" - -msgid "Thumbnails will be fixed to this size." -msgstr "縮圖將會被固定在此大小" - -msgid "Medium image fixed dimension" -msgstr "中等圖像固定尺寸" - -msgid "Medium sized images will be fixed to this dimension. For example, if you select \"width\" that dimension will be fixed and image height will be automatically calculated." -msgstr "中等圖像將被固定至此分辨率. 例如, 如果您選擇\"寬度\", 這方面將是固定的, 圖像的高度將自動計算." - -msgid "Medium image fixed size" -msgstr "中等圖像固定大小" - -msgid "Width or height will be automatically calculated." -msgstr "寬度或是高度將自動計算." - msgid "Expires" msgstr "到期" @@ -2850,6 +2870,9 @@ msgstr "首頁圖片列表樣式. 這兩種方法都使用固定寬度, 但“ msgid "%t listing requirement" msgstr "%t 列表要求" +msgid "Sets the minimum content count needed to show %t in %s." +msgstr "設置在 %s 中顯示 %t 所需的最小內容計數。" + msgid "Listing columns number" msgstr "頁面顯示列數" @@ -2967,9 +2990,6 @@ msgstr "隱藏頁面將不會顯示在系統的選單, 但任何人擁有連結 msgid "Only alphanumerics, hyphens and forward slash" msgstr "只有字母, 數字和片語" -msgid "File path" -msgstr "檔案路徑" - #, php-format msgid "A %f file relative to %s" msgstr "%f 檔案相對於 %s" @@ -3003,7 +3023,7 @@ msgstr "連結目標屬性" #, php-format msgid "Select %s to open the page or link in a new window." -msgstr "選擇 %s 來打開新頁面或是新視窗" +msgstr "選擇 %s 在新視窗中開啟頁面或連結。" msgid "Link rel attribute" msgstr "連結 rel 屬性" @@ -3093,6 +3113,9 @@ msgstr "此ID為系統的一個特殊碼, 相當於V2.x的「__CHV_CRYPT_SALT__ msgid "Debug errors" msgstr "偵錯錯誤" +msgid "Enable this if you want to debug errors." +msgstr "如果您想偵錯錯誤,請啟用此選項。" + msgid "Debug level" msgstr "除錯層級" @@ -3262,7 +3285,7 @@ msgstr "上傳插件" #, php-format msgid "Enable this to display plugin instructions at %u. A link to these instructions will be added to the %s menu." -msgstr "啟用它以在 %u 顯示插件說明。 這些說明的鏈接將添加到 %s 菜單。" +msgstr "啟用它以在 %u 顯示插件說明。 這些說明的連結將添加到 %s 菜單。" msgid "Use this to set a custom URL for %p. Please note that you need to manually replicate %s in this URL." msgstr "使用此選項可為%p設置自定義URL。 請注意,您需要在此URL中手動複製%s。" @@ -3276,6 +3299,9 @@ msgstr "啟用此代表您允許用戶自行註冊賬號." msgid "Enable user content delete" msgstr "啟用用戶內容刪除" +msgid "Enable this if you want to allow users to delete their own content." +msgstr "如果您希望允許使用者刪除自己的內容,請啟用此選項。" + msgid "Minimum age required" msgstr "最低年齡要求" @@ -3438,7 +3464,7 @@ msgstr "隨機" #, php-format msgid "Enable this if you want to show a \"%s\" link at the footer." -msgstr "如果您想在頁腳處顯示“%s”鏈接,請啟用此選項。" +msgstr "如果您想在頁腳處顯示“%s”連結,請啟用此選項。" msgid "Likes" msgstr "喜歡" @@ -3485,8 +3511,44 @@ msgstr "私密(任何知道連結的人)" msgid "Forced privacy modes will override user selected privacy." msgstr "全局隱私模式將覆蓋用戶選擇的隱私." -msgid "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %env% and when not set it fall-back to %var%." -msgstr "如果檢測到的IP與您的IP不符,這意味著您的Web服務器正在使用代理。連接IP可以使用環境變數%env%中定義的HTTP標頭進行設置,當未設置時,它將回退到%var%。" +#, php-format +msgid "Hello and welcome, %s" +msgstr "您好,%s" + +msgid "Whether you're an individual creator or a company looking for a powerful media sharing platform, Chevereto has you covered." +msgstr "無論您是個人創作者還是正在尋找強大媒體共享平台的公司,Chevereto 都能滿足您的需求。" + +msgid "share your feedback" +msgstr "分享您的回饋" + +#, php-format +msgid "We're always looking for ways to improve, feel free to %s and suggestions." +msgstr "我們一直在尋找改進的方法,請隨時向 %s 提出建議。" + +msgid "We are available for all your support and customization needs." +msgstr "我們可以滿足您的所有支援和客製化需求。" + +msgid "Thank you for choosing Chevereto." +msgstr "感謝您選擇Chevereto。" + +msgid "Chevereto creator" +msgstr "Chevereto的創造者" + +#, php-format +msgid "Provide Chevereto license key by assigning the environment variable %e or by creating the %f file containing the license key." +msgstr "透過指派環境變數 %e 或建立包含許可證金鑰的 %f 檔案來提供 Chevereto 許可證金鑰。" + +msgid "You can also set the license key in the textarea below." +msgstr "您也可以在下面的文字區域中設定許可證密鑰。" + +msgid "Chevereto license key" +msgstr "Chevereto 許可證密鑰" + +msgid "PASTE LICENSE KEY HERE" +msgstr "在此處貼上許可證密鑰" + +msgid "If the detected IP doesn't match yours it means that your web server is under a proxy. The connecting IP can be set using the HTTP header defined in the environment variable %e and when not set it fall-back to %v." +msgstr "如果偵測到的 IP 與您的 IP 不匹配,則表示您的 Web 伺服器處於代理之下。連接 IP 可以使用環境變數 %e 中定義的 HTTP 標頭進行設置,如果不設置,則回退到 %v。" msgid "Make sure that you address this issue as the system relies on accurate IP detections to provide basic functionalities and to protect against spam, flooding, and brute force attacks." msgstr "由於系統依賴準確的IP檢測來提供基本功能並防止SPAM、泛濫式圖片上傳及暴力破解,因此請確保您已解決此問題。" @@ -3498,8 +3560,9 @@ msgstr "磁盤" msgid "%s News" msgstr "%s 新聞" -msgid "Installation details" -msgstr "安裝細節" +#, php-format +msgid "%s edition" +msgstr "%s 版本" msgid "Role" msgstr "規則" @@ -3507,8 +3570,9 @@ msgstr "規則" msgid "Email address" msgstr "電子郵件地址" -msgid "Play GIF" -msgstr "播放 GIF" +#, php-format +msgid "Play %s" +msgstr "播放 %s" msgid "Load 360° view" msgstr "加載 360° 視圖" @@ -3564,12 +3628,14 @@ msgstr "%s ID" msgid "Add IP ban" msgstr "新增阻擋IP" -msgid "Upload and share your images." -msgstr "上傳並分享你的照片" +msgid "Upload and share your media" +msgstr "上傳並分享您的媒體" -#, php-format -msgid "Drag and drop anywhere you want and start uploading your images now. %s limit. Direct image links, BBCode and HTML thumbnails." -msgstr "拖放在您任何想要的地方進行圖像上傳. %s 的圖片大小限制, 直接的圖片連結, BBCode代碼, HTML代碼, 縮圖." +msgid "Drag and drop anywhere to start uploading." +msgstr "拖曳到任何位置即可開始上傳。" + +msgid "Get direct links, Markdown, BBCode and HTML thumbnails." +msgstr "取得直接連結、Markdown、BBCode 和 HTML 縮圖。" msgid "Sign up to unlock all the features" msgstr "註冊即可啟用所有的功能" @@ -3605,8 +3671,14 @@ msgstr "請輸入您的密碼進行下一步." msgid "Unlock" msgstr "解鎖" -msgid "Add image uploading to your website, blog or forum by installing our upload plugin. It provides image uploading to any website by placing a button that will allow your users to directly upload images to our service and it will automatically handle the codes needed for insertion. All features included like drag and drop, remote upload, image resizing and more." -msgstr "通過安裝我們的上傳插件,將圖片上傳到您的網站,博客或論壇。 它通過放置一個按鈕,允許您的用戶直接將圖像上傳到我們的服務,並將自動處理插入所需的代碼,從而將圖像上傳到任何網站。 所有功能包括拖放,遠程上傳,圖像大小調整等。" +msgid "Add media uploading and sharing to your website, blog or forum by installing our upload plugin." +msgstr "透過安裝我們的上傳插件,將媒體上傳和分享添加到您的網站、部落格或論壇。" + +msgid "It provides file uploading to any website by placing a button that will allow your users to directly upload to our service and it will automatically handle the codes needed for insertion." +msgstr "它透過放置一個按鈕來提供檔案上傳到任何網站的功能,該按鈕允許您的用戶直接上傳到我們的服務,並且它將自動處理插入所需的程式碼。" + +msgid "All features included like drag and drop, remote upload, image resizing and more." +msgstr "包括拖放、遠端上傳、圖像大小調整等所有功能。" msgid "Supported software" msgstr "支持的軟件" @@ -3680,8 +3752,8 @@ msgstr "%i 到 %f 個字元
字母, 數字 和 \"_\" 符號" msgid "Auto delete uploads" msgstr "自動刪除上傳" -msgid "This setting will apply to all your image uploads by default. You can override this setting on each upload." -msgstr "該設置將適用於在預設情況下所有的圖片上傳. 您可以使每個上傳應用此設置." +msgid "This setting will apply to all your file uploads by default. You can override this setting on each upload." +msgstr "預設情況下,此設定將套用至您上傳的所有檔案。您可以在每次上傳時覆蓋此設定。" #, php-format msgid "Keep image Exif data on upload" @@ -3725,7 +3797,7 @@ msgid "User has no connections." msgstr "用戶沒有任何連結" msgid "Link your account to external login providers to be able to login here." -msgstr "將您的帳戶與外部登錄提供者鏈接,以便能夠在此處登錄" +msgstr "將您的帳戶與外部登錄提供者連結,以便能夠在此處登錄" #, php-format msgid "Do you really want to disconnect %s from this account?" @@ -3795,9 +3867,6 @@ msgstr "此實例托管在由 Chevereto 軟體提供的服務層中,Chevereto msgid "This service is based on Chevereto self-hosted edition." msgstr "此服務基於 Chevereto 自託管版。" -msgid "Usage of Chevereto Software must be in compliance with the software license terms known as \"The Chevereto License\"." -msgstr "使用 Chevereto 軟體必須遵守被稱為「Chevereto 授權」的軟體授權條款。" - msgid "This instance is hosted in a service layer not provided by Chevereto Software, which hereby declare to do not have any control nor access to the management layer of this instance and it won't be responsible for this service neither the damages that this service may cause." msgstr "此實例托管在未由 Chevereto 軟體提供的服務層中,Chevereto 軟體在此聲明對於此實例的管理層沒有任何控制權或訪問權限,並且不對此服務或由此服務引起的任何損害負責。" diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php index f1115e6..0e2bc26 100644 --- a/app/legacy/install/installer.php +++ b/app/legacy/install/installer.php @@ -13,8 +13,6 @@ use function Chevere\Filesystem\filePhpForPath; use function Chevere\Message\message; use function Chevere\String\randomString; use Chevere\Throwable\Exceptions\LogicException; -use function Chevereto\Encryption\encryptValues; -use function Chevereto\Encryption\hasEncryption; use function Chevereto\Encryption\randomKey; use function Chevereto\Legacy\chevereto_die; use Chevereto\Legacy\Classes\DB; @@ -608,6 +606,7 @@ $settings_updates = [ '4.1.3' => [ 'user_profile_view' => 'files', ], + '4.1.4' => null, ]; $cheveretoFreeMap = [ '1.0.0' => '3.8.3', @@ -925,83 +924,6 @@ if (isset($installed_version) && empty($paramsCheck)) { chevereto_die('', '

Database table storage engine needs to be updated to InnoDB. Run the following command(s) in your MySQL console:

Review Converting Tables from MyISAM to InnoDB.

', "Convert MyISAM tables to InnoDB"); } $isUtf8mb4 = version_compare($installed_version, '3.12.10', '>'); - if (version_compare($installed_version, '4.0.0-beta.11', '<')) { - $loginProviders = array_map( - function (string $value) { - return getSetting($value); - }, - [ - 'facebook' => 'facebook', - 'twitter' => 'twitter', - 'google' => 'google', - 'vk' => 'vk', - 'facebook_key' => 'facebook_app_id', - 'facebook_secret' => 'facebook_app_secret', - 'twitter_key' => 'twitter_api_key', - 'twitter_secret' => 'twitter_api_secret', - 'google_key' => 'google_client_id', - 'google_secret' => 'google_client_secret', - 'vk_key' => 'vk_client_id', - 'vk_secret' => 'vk_client_secret', - ] - ); - if (hasEncryption()) { - $loginProviders = encryptValues( - [ - 'facebook_key', - 'facebook_secret', - 'twitter_key', - 'twitter_secret', - 'google_key', - 'google_secret', - 'vk_key', - 'vk_secret', - ], - $loginProviders - ); - } - $queryLoginProviders = - << $provider === 'vk' ? 'Vkontakte' : $provider, - ':is_enabled' => (int) $loginProviders[$provider], - ':key' => addcslashes($loginProviders[$provider . '_key'] ?? '', "'"), - ':secret' => addcslashes($loginProviders[$provider . '_secret'] ?? '', "'") - ]; - } - $loginUpdateQueries = ''; - foreach ($loginProvidersBinds as $binds) { - $loginUpdateQueries .= strtr($queryLoginProviders, $binds); - } - } - if (version_compare($installed_version, '4.0.0', '<')) { - $passwordAlbums = DB::queryFetchAll( - DB::getQueryWithTablePrefix( - << [ 'logins' => [ diff --git a/app/legacy/load/app.php b/app/legacy/load/app.php index a53a298..399446c 100644 --- a/app/legacy/load/app.php +++ b/app/legacy/load/app.php @@ -9,5 +9,5 @@ * file that was distributed with this source code. */ -const APP_VERSION = '4.1.3'; +const APP_VERSION = '4.1.4'; const APP_VERSION_AKA = 'pulento'; diff --git a/app/phpunit-report.xml b/app/phpunit-report.xml deleted file mode 100644 index 055eb93..0000000 --- a/app/phpunit-report.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - tests/Unit/ - - - - - src/ - - - src/Components/Legacy/ - src/Components/Legacy/**/ - src/ - - - - - - - \ No newline at end of file diff --git a/app/phpunit.xml b/app/phpunit.xml deleted file mode 100644 index a56f35d..0000000 --- a/app/phpunit.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - tests/Integration - - - - - src/ - - - src/Components/Legacy/ - src/Components/Legacy/**/ - src/ - - - - - - - \ No newline at end of file diff --git a/app/src/Legacy/Classes/Image.php b/app/src/Legacy/Classes/Image.php index ab774ba..d560d92 100644 --- a/app/src/Legacy/Classes/Image.php +++ b/app/src/Legacy/Classes/Image.php @@ -795,6 +795,7 @@ class Image $uploadDir = dirname($resizeSourceImage); $chainExtension = $image_upload['uploaded']['extension']; if ($image_upload['source']['type'] === 'video') { + $must_resize = false; $chainExtension = 'jpeg'; $frameImage = $uploadDir . '/' diff --git a/app/src/Legacy/G/Handler.php b/app/src/Legacy/G/Handler.php index 3e47a2c..6221255 100644 --- a/app/src/Legacy/G/Handler.php +++ b/app/src/Legacy/G/Handler.php @@ -13,14 +13,19 @@ namespace Chevereto\Legacy\G; use function Chevere\Message\message; use Chevereto\Config\Config; +use Chevereto\Config\HostConfig; + use function Chevereto\Legacy\get_captcha_component; use function Chevereto\Legacy\getSetting; +use function Chevereto\Vars\env; use function Chevereto\Vars\get; use function Chevereto\Vars\post; use function Chevereto\Vars\request; use function Chevereto\Vars\server; use function Chevereto\Vars\session; use function Chevereto\Vars\sessionVar; +use function Ramsey\Uuid\v1; + use Closure; use Exception; use LogicException; @@ -79,13 +84,22 @@ class Handler $this->path_theme = PATH_PUBLIC_LEGACY_THEME; $this->request_uri = server()['REQUEST_URI'] ?? '/'; $this->script_name = server()['SCRIPT_NAME'] ?? ''; + if($this->script_name !== '') { + $relative_root = sanitize_path_slashes(dirname($this->script_name) . '/'); + if ($relative_root !== $this->relative_root) { + throw new LogicException( + 'Missing CHEVERETO_HOSTNAME_PATH='.$relative_root.' configuration' + ); + } + } $query_string = '?' . (server()['QUERY_STRING'] ?? ''); if (!empty(server()['QUERY_STRING'])) { $this->request_uri = str_replace($query_string, '/', $this->request_uri); + $this->request_uri = sanitize_path_slashes($this->request_uri); } $this->valid_request = '/' . ltrim(rtrim(sanitize_path_slashes($this->request_uri), '/'), '/'); - $theRequest = rtrim(PATH_PUBLIC, '/') . $this->valid_request; - if ($this->valid_request !== '/' && file_exists($theRequest)) { + $pathRequest = rtrim(PATH_PUBLIC, $this->relative_root) . $this->valid_request; + if ($this->request_uri !== $this->relative_root && file_exists($pathRequest)) { throw new LogicException('Invalid PHP front controller setup. Review your web server configuration.'); } if (!empty(server()['QUERY_STRING'])) { @@ -126,7 +140,6 @@ class Handler $this->canonical_request = rtrim($this->canonical_request, '/'); redirect((sanitize_path_slashes(str_replace('index.php', '', $this->canonical_request))), 301); } - if ($this->relative_root !== $this->request_uri && $this->canonical_request !== $this->request_uri ) { diff --git a/app/src/Legacy/functions-render.php b/app/src/Legacy/functions-render.php index 2a44682..9b8e0ff 100644 --- a/app/src/Legacy/functions-render.php +++ b/app/src/Legacy/functions-render.php @@ -1045,6 +1045,9 @@ function getThemeLogo(): string function badgePaid(string $edition): string { + if ($edition === 'lite') { + $edition = 'pro'; + } if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES']) { return ''; } @@ -1057,6 +1060,9 @@ function badgePaid(string $edition): string function linkPaid(string $edition): ?string { + if ($edition === 'lite') { + $edition = 'pro'; + } if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES']) { return null; } @@ -1069,6 +1075,9 @@ function linkPaid(string $edition): ?string function inputDisabledPaid(string $edition): string { + if ($edition === 'lite') { + $edition = 'pro'; + } if (in_array($edition, editionCombo()[env()['CHEVERETO_EDITION']])) { return ''; } diff --git a/content/legacy/themes/Peafowl/lib/chevereto.js b/content/legacy/themes/Peafowl/lib/chevereto.js index 34c56cd..dcfd745 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.js @@ -2860,6 +2860,17 @@ $(function () { let href = $(this).attr("href"); let buyFrom = PF.fn._s('Get a license at %s to unlock all features and support.', 'chevereto.com'); let instructions = PF.fn._s('You can enter your license key in the dashboard panel.'); + let buttonHref = PF.obj.config.base_url + 'dashboard/?license'; + let buttonTarget = "_self"; + let buttonIcon = "fas fa-key"; + let buttonText = PF.fn._s("Enter license"); + if(CHV.obj.system_info.servicing === 'docker') { + instructions = PF.fn._s('You can upgrade by following the instructions in the documentation.'); + buttonHref = 'https://v4-docs.chevereto.com/guides/docker/#upgrading'; + buttonTarget = "_blank"; + buttonIcon = "fa-brands fa-docker"; + buttonText = PF.fn._s("Instructions"); + } e.preventDefault(); e.stopPropagation(); PF.fn.modal.simple({ @@ -2868,11 +2879,9 @@ $(function () { message: "

" + buyFrom + " " + instructions + "

" + '', }); diff --git a/content/legacy/themes/Peafowl/lib/chevereto.min.js b/content/legacy/themes/Peafowl/lib/chevereto.min.js index 92ebf03..b0951d9 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.min.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.min.js @@ -1,4 +1,4 @@ $(function(){function e(e){e=e.originalEvent;var t=!1;if(e.dataTransfer.types)for(var a=0;ae&&(a.height(e),a.closest(".antiscroll-wrap").antiscroll())}}function a(e){e.addClass("list-item-play-gif--loading");var t=e.closest(PF.obj.listing.selectors.list_item),a=$(".image-container",t),o=$("img",a),i=o.attr("src"),n=".md",r=i.lastIndexOf(n);if(-1==r)n=".th",r=i.lastIndexOf(n);var s=i.substr(0,r)+i.substr(r+n.length,i.length);a.append(a.html()),$load=t.find(".image-container img").eq(1).attr("src",s).addClass("hidden"),$load.imagesLoaded(function(){e.remove(),o.remove(),$("img",a).show(),$(this.elements).removeClass("hidden")})}function o(e,t){var a=$(e).closest(PF.obj.listing.selectors.list_item);CHV.fn.list_editor.blink(a),CHV.fn.list_editor.toggleSelectItem(a),PF.fn.keyFeedback.spawn(t),t.preventDefault(),t.stopPropagation()}var i;if($(window).resize(function(e){clearTimeout(i),i=setTimeout(function(){CHV.fn.uploader.boxSizer(),CHV.fn.bindSelectableItems(),CHV.fn.listingViewer.placeholderSizing(),prevWidth=$(window).width(),prevHeight=$(window).height()},10)}),window.opener&&($(window).on("load",function(e){window.opener.postMessage({id:window.name,requestAction:"postSettings"},"*")}),$(window).on("message",function(e){var t=e.originalEvent.data;void 0!==t.id&&void 0!==t.settings&&window.name===t.id&&(CHV.obj.opener.uploadPlugin[t.id]=t.settings)})),$("#home-cover, #maintenance-wrapper, #login").exists()){var n=$("#maintenance-wrapper").exists()?$("#maintenance-wrapper").css("background-image").slice(4,-1).replace(/^\"|\"$/g,""):$(".home-cover-img","#home-cover-slideshow").first().attr("data-src");function r(){$("body").addClass("load"),$("#maintenance-wrapper").exists()||$(".home-cover-img","#home-cover-slideshow").first().css("background-image","url("+n+")").addClass("animate-in--alt").removeAttr("data-src"),setTimeout(function(){setTimeout(function(){$("body").addClass("loaded")},1200),setTimeout(function(){l()},7e3)},600)}var s=function(){setTimeout(function(){l()},8e3)};function l(){var e=$(".home-cover-img[data-src]","#home-cover-slideshow").first(),t=$(".home-cover-img","#home-cover-slideshow");if(0==e.length){if(1==t.length)return;t.first().removeClass("animate-in"),$("#home-cover-slideshow").append(t.first()),setTimeout(function(){$(".home-cover-img:last","#home-cover-slideshow").addClass("animate-in")},20),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-in")},4e3),s()}else{var a=e.attr("data-src");$("").attr("src",a).on("load error",function(){$(this).remove(),e.css("background-image","url("+a+")").addClass("animate-in").removeAttr("data-src"),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-end animate-in--alt")},2e3),s()})}}n?$("").attr("src",n).on("load error",function(){$(this).remove(),r()}):r()}var d,c=CHV.fn.uploader.selectors.root,u=CHV.fn.uploader.selectors.queue,m=$(c),f=$(u);if($(document).on("click","[data-action=top-bar-upload]",function(e){$("body").is("#upload")||"js"!==$(this).data("link")||CHV.fn.uploader.toggle({reset:!1}),"page"!==$(this).data("link")&&(e.preventDefault(),e.stopPropagation())}),$(document).on("click mouseover mouseout","[data-action=palette]",function(e){clearTimeout(d),e.preventDefault();var t=$(this).data("palette");switch(e.type){case"mouseover":d=setTimeout(function(){CHV.fn.Palettes.preview(t)},1e3);break;case"mouseout":t=$("html").attr("data-palette")||"",CHV.fn.Palettes.set(t);break;case"click":e.stopPropagation(),$("[data-action=palette]","[data-content=palettes]").removeClass("current"),$(this).addClass("current"),CHV.fn.Palettes.set(t),CHV.fn.Palettes.save()}}),$(document).on("change","#palettes",function(e){CHV.fn.Palettes.set(this.value),CHV.fn.Palettes.save()}),$("[data-action=close-upload]",m).click(function(){m.is(":animated")||$("[data-action=top-bar-upload]","#top-bar").trigger("click")}),$("[data-action=reset-upload]",m).click(function(){CHV.fn.uploader.isUploading&&$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",m).trigger("click"),CHV.fn.uploader.reset()}),$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",m).click(function(){CHV.fn.uploader.isUploading=!1,$("[data-action=cancel]",f).click(),Object.size(CHV.fn.uploader.results.success)>0?CHV.fn.uploader.displayResults():CHV.fn.uploader.reset()}),$(document).on("click","[data-action=upload-privacy]:not(disabled)",function(e){e.isDefaultPrevented()||(current_privacy=$(this).data("privacy"),target_privacy="public"==current_privacy?"private":"public",this_lock=$(".icon",this).data("lock"),this_unlock=$(".icon",this).data("unlock"),$(".icon",this).removeClass(this_lock+" "+this_unlock).addClass("public"==current_privacy?this_lock:this_unlock),$(this).data("privacy",target_privacy),$("[data-action=upload-privacy-copy]").html($("[data-action=upload-privacy]").html()),$upload_button=$("[data-action=upload]",m),$upload_button.text($upload_button.data(target_privacy)),$(this).tipTip("hide"))}),$(CHV.fn.uploader.selectors.file+", "+CHV.fn.uploader.selectors.camera).on("change",function(e){$(CHV.fn.uploader.selectors.root).data("shown")?CHV.fn.uploader.add(e):CHV.fn.uploader.toggle({callback:function(e){CHV.fn.uploader.add(e)}},e)}).on("click",function(e){!$(this).data("login-needed")||PF.fn.is_user_logged()}),$(CHV.fn.uploader.selectors.root).exists()&&($("body").on({dragenter:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.dropzone).exists()||$("body").append($('
').css({width:"100%",height:"100%",position:"fixed",zIndex:1e3,left:0,top:0}))}}),$(document).on({dragover:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.root).data("shown")||CHV.fn.uploader.toggle({reset:!1})},dragleave:function(e){$(CHV.fn.uploader.selectors.dropzone).remove(),$.isEmptyObject(CHV.fn.uploader.files)&&CHV.fn.uploader.toggle()},drop:function(e){e.preventDefault(),CHV.fn.uploader.add(e),$(CHV.fn.uploader.selectors.dropzone).remove()}},CHV.fn.uploader.selectors.dropzone)),$(document).on("keyup change","[data-action=resize-combo-input]",function(e){var t=$(this).closest("[data-action=resize-combo-input]"),a=$("[name=form-width]",t),o=$("[name=form-height]",t),i=a.data("initial")/o.data("initial"),n={width:Math.round(a.prop("value")/i),height:Math.round(o.prop("value")*i)};$(e.target).is(a)?o.prop("value",Math.round(n.width)):a.prop("value",Math.round(n.height))}),$(document).on("click",u+" [data-action=edit]",function(){for(var e=$(this).closest("li"),t=e.data("id"),a=CHV.fn.uploader.files[t],o=a.type.substring(0,a.type.indexOf("/")),i=PF.obj.modal.selectors.root,n=$.extend({},a.formValues||a.parsedMeta),r=["album_id","category_id","nsfw"],s=0;se.height&&(r.height=e.height,r.width=Math.round(r.height*s)),r.width>e.width&&(r.width=e.width,r.height=Math.round(r.width/s)),$.each(n,function(e,t){var n="[name=form-"+e.replace(/_/g,"-")+"]",s=$(n,i);if(!s.exists())return!0;if(s.is(":checkbox"))s.prop("checked",s.attr("value")==t);else if(s.is("select")){var l=s.find("[value="+t+"]");l.exists()||(l=s.find("option:first")),l.prop("selected",!0)}else s.prop("value",t);if("width"==e||"height"==e){var d=r[e],c=a.parsedMeta[e]>d?d:a.parsedMeta[e];s.prop("max",c).data("initial",a.parsedMeta[e]).prop("value",c),"image"!==o&&s.prop("disabled",!0).closest("[data-action=resize-combo-input]").hide()}}),"image/gif"!==a.parsedMeta.mimetype&&$("[ data-content=animated-gif-warning]",i).remove(),$(".image-preview",i).append($("",{class:"canvas checkered-background"}));var l=$(".queue-item[data-id="+t+"] .preview .canvas")[0],d=$(".image-preview .canvas",i)[0];d.width=l.width,d.height=l.height;var c=d.getContext("2d");c.drawImage(l,0,0)},confirm:function(){if(PF.fn.form_modal_has_changed()){var e=!1;return $.each(["width","height"],function(t,a){var o=$("[name=form-"+a+"]",i),n=parseInt(o.val()),r=parseInt(o.attr("min")),s=parseInt(o.attr("max"));if(n>s||n-1&&CHV.fn.uploader.clipboardImages.splice(r,1)}delete CHV.fn.uploader.files[a],CHV.fn.uploader.queueSize(),0==Object.size(CHV.fn.uploader.files)?"success"in CHV.fn.uploader&&"results"in CHV.fn.uploader&&(0!=Object.size(CHV.fn.uploader.results.success)||0!=Object.size(CHV.fn.uploader.results.error))||CHV.fn.uploader.reset():i&&0!==$("li.waiting",t).first().length&&CHV.fn.uploader.upload($("li.waiting",t).first())}}),$(document).on("click","[data-action=upload]",function(){void 0!==CHV.obj.logged_user||!1!==$("#upload-tos").prop("checked")?($("[data-group=upload], [data-group=upload-queue-ready]",m).hide(),m.removeClass("queueReady").addClass("queueUploading").find("[data-group=uploading]").show(),CHV.fn.uploader.queueSize(),CHV.fn.uploader.canAdd=!1,$queue_items=$("li",f),$queue_items.addClass("uploading waiting"),CHV.fn.uploader.timestamp=(new Date).getTime(),CHV.fn.uploader.upload($queue_items.first("li"))):PF.fn.growl.call("You must agree to the terms and privacy policy")}),$("body#user").exists()&&PF.obj.listing.query_string.page>1){var p=History.getState();if(p.data&&void 0!==p.data.scrollTop)$(window).scrollTop()!==p.data.scrollTop&&$(window).scrollTop(p.data.scrollTop);else{var g=$("#background-cover").height()-160;$("html, body").animate({scrollTop:g},0)}}$("#top-bar-shade").exists()&&$("#top-bar-shade").css("opacity")&&$("#top-bar-shade").data("initial-opacity",Number($("#top-bar-shade").css("opacity"))),CHV.fn.bindSelectableItems(),$("body#image").exists()&&($(CHV.obj.image_viewer.selector+" [data-load=full]").length>0&&($(document).on("click",CHV.obj.image_viewer.loader,function(e){CHV.fn.viewerLoadImage()}),$(CHV.obj.image_viewer.loader).data("size")>CHV.obj.config.image.load_max_filesize.getBytes()?$(CHV.obj.image_viewer.loader).css("display","block"):CHV.fn.viewerLoadImage()),new MutationObserver(()=>{$("html").height()>$(window).innerHeight()&&!$("html").hasClass("scrollbar-y")&&($("html").addClass("scrollbar-y"),$(document).data({width:$(this).width(),height:$(this).height()}))}).observe(document,{childList:!0}),$(document).on("keyup",function(e){var t=$(e.target),a=e.originalEvent;if(!t.is(":input")&&CHV.obj.image_viewer.$navigation.exists()&&("ArrowLeft"==a.key||"ArrowRight"==a.key)){var o=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href");void 0!==o&&""!==o&&(window.location=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href"))}})),$(document).on("click",CHV.obj.image_viewer.container+" img",function(e){$(CHV.obj.image_viewer.loader).exists()?$(CHV.obj.image_viewer.loader).trigger("click"):$(this).toggleClass("zoom-natural")}).on("contextmenu",CHV.obj.image_viewer.container,function(e){if(!CHV.obj.config.image.right_click)return e.preventDefault(),!1}),$(document).on("contextmenu","html.device-mobile a.image-container",function(e){e.preventDefault(),e.stopPropagation()}),$(document).on("keyup","input[data-dashboard-tool]",function(e){if(13==e.keyCode){var t=$("[data-action="+$(this).data("dashboard-tool")+"]");t.click()}}),$(document).on("click","[data-action=dashboardTool]",function(e){e.preventDefault();var t=$(this).data("tool"),a=$(this).data("data"),o=$.extend({},a),i={};for(var n in o){var r=$(o[n]).val();if($(o[n]).prop("disabled")||!r)return;i[n]=$(o[n]),o[n]=r}o.action=t;var s={type:"GET",cache:!1};s.data=o;var l,d=$(this).closest(".input-label"),c=!0;if(0!=c){for(var n in i);PF.fn.loading.inline($(".loading",d),{size:"small",valign:"middle"}),d.find(".btn .text").hide(),$.ajax(s).complete(function(e){var t=e.responseJSON;$(".loading",d).empty(),d.find(".btn .text").show(),200!=t.status_code||void 0===t.success.redirURL?PF.fn.growl.call(t[200==t.status_code?"success":"error"].message):window.location.href=t.success.redirURL})}else PF.fn.growl.expirable(l)}),$(document).on("click","[data-action=openerPostMessage]",function(e){if(window.opener){e.preventDefault();var t="data-action-target",a=$($(this).is("["+t+"]")?$(this).attr(t):this),o=a[a.is(":input")?"val":"html"]();window.opener.postMessage({id:window.name,message:o},"*")}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){var t=$(e.target),a=t.closest("[data-id]");a&&a.find("[data-action=select]").exists()&&(e.ctrlKey||e.metaKey)&&e.altKey&&(CHV.fn.list_editor.toggleSelectItem(a,!a.hasClass("selected")),e.preventDefault(),e.stopPropagation())}),PF.fn.listing.ajax.callback=function(e){200===e.status&&CHV.fn.list_editor.listMassActionSet("select")},$(document).on("click","[data-action=list-select-all]",function(e){if($(this).closest(".disabled").exists())return!1;CHV.fn.list_editor.selectAll(e)}),$(document).on("click","[data-action=list-clear-all]",function(){CHV.fn.list_editor.clearSelection()}),$(document).on("click","[data-action=share]",function(e){if(!$(PF.obj.modal.selectors.box).exists()){var t,a,o,i,n,r;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var s="#modal-share";if(t.exists()){if(r=CHV.fn.modal.getTemplateWithPreview(s,t),void 0===t.attr("data-type"))return void console.error("Error: data-type not defined");n=t.find(".list-item-desc-title-link").first(),o=t.find(".image-container img").first().attr("src"),a=t.attr("data-url-short")}else r=$(s).html(),dealing_with=CHV.obj.resource.type,a=window.location.href,o=CHV.obj.image_viewer.image.display_url,n=$(".header > h1 > a");i=PF.fn.htmlEncode(n.text());var l=t.data("privacy")||CHV.obj.resource.privacy,d="";switch(l){case"private_but_link":d=PF.fn._s("Note: This content is private but anyone with the link will be able to see this.");break;case"password":d=PF.fn._s("Note: This content is password protected. Remember to pass the content password to share.");break;case"private":d=PF.fn._s('Note: This content is private. Change privacy to "public" to share.')}r=r.replaceAll("__url__",a).replaceAll("__image__",o).replaceAll("__title__",i).replaceAll("__privacy__",l).replaceAll("__privacy_notes__",d),PF.fn.modal.call({type:"html",buttons:!1,template:r})}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){if(e.isPropagationStopped())return!1;var t;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var a=t.attr("data-id");if(void 0!==t.attr("data-type")){o=t.attr("data-type");var o,i=$("[data-type="+o+"][data-id="+a+"]");switch($(this).data("action")){case"select":CHV.fn.list_editor.toggleSelectItem(t,!t.hasClass("selected"));break;case"edit":var n="[data-modal=form-edit-single]";switch(o){case"image":$("[name=form-image-title]",n).attr({value:t.attr("data-title"),autocomplete:"off"}),$("[name=form-image-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-category-id]",n).find("option").removeAttr("selected"),$("[name=form-category-id]",n).find("[value="+t.data("category-id")+"]").attr("selected",!0),$("[name=form-nsfw]",n).attr("checked","unsafe"==t.data("flag")),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected");break;case"album":$("[data-action=album-switch]",n).remove(),$("[name=form-album-name]",n).attr({value:t.data("name"),autocomplete:"off"}),$("[name=form-album-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-privacy]",n).find("option").removeAttr("selected"),$("[name=form-privacy]",n).find("[value="+t.data("privacy")+"]").attr("selected",!0),"password"==t.data("privacy")?($("[data-combo-value=password]").show(),$("[name=form-album-password]",n).attr("value",t.data("password"))):($("[data-combo-value=password]").hide(),$("[name=form-album-password]",n).attr("value",""))}PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,t),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateItem("[data-type="+o+"][data-id="+a+"]",e.responseJSON[o],"edit")}}},confirm:function(){var e=$(PF.obj.modal.selectors.root);if(("image"==o||"album"==o)&&$("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if(PF.fn.form_modal_has_changed()){switch(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a,description:$("[name=form-"+o+"-description]",e).val()}},o){case"image":PF.obj.modal.form_data.editing.title=$("[name=form-image-title]",e).val(),PF.obj.modal.form_data.editing.category_id=$("[name=form-category-id]",e).val()||null,PF.obj.modal.form_data.editing.nsfw=$("[name=form-nsfw]",e).prop("checked")?1:0;break;case"album":PF.obj.modal.form_data.editing.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.privacy&&(PF.obj.modal.form_data.editing.password=$("[name=form-album-password]",e).val())}return PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"create-album":case"move":var r="move"==$(this).data("action")?"form-move-single":"form-create-album";n="[data-modal="+r+"]";$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,i),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,o,i)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root);return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):PF.fn.form_modal_has_changed()?(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a}},PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0):void PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-approve-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(t,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",single:!0,approve:t.data("type"),approving:{id:a}},!0}});break;case"delete":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-delete-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"album"==o&&($("[name=form-album-id]","[data-modal]").find("[value="+a+"]").remove(),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(t),CHV.fn.listingViewer.close()}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",single:!0,delete:t.data("type"),deleting:{id:a}},!0}});break;case"flag":$.ajax({type:"POST",data:{action:"edit",edit:"image",single:!0,editing:{id:a,nsfw:"unsafe"==t.data("flag")?0:1}}}).complete(function(e){var t=e.responseJSON;if(200==t.status_code){var a=1==t.image.nsfw?"unsafe":"safe";i.attr("data-flag",a).data("flag",a)}else PF.fn.growl.call(t.error.message);CHV.fn.list_editor.selectionCount()})}}else console.error("Error: data-type not defined")}),$(".pop-box-menu a","[data-content=list-selection]").click(function(e){var t=$(PF.obj.listing.selectors.content_listing_visible);if(void 0!==t.data("list")){dealing_with=t.data("list");var a=$(PF.obj.listing.selectors.list_item+".selected",t),o=$.map(a,function(e,t){return $(e).data("id")});switch(PF.fn.close_pops(),"list-select-all"!==$(this).data("action")&&e.stopPropagation(),$(this).data("action")){case"get-embed-codes":var i="[data-modal=form-embed-codes]",n=[];$("textarea",i).html(""),a.each(function(){var e={image:JSON.parse(decodeURIComponent($(this).data("object")))};"url"in e.image&&n.push(e)}),CHV.fn.fillEmbedCodes(n,i,"html"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(i,a),buttons:!1});break;case"clear":CHV.fn.list_editor.clearSelection();break;case"list-select-all":CHV.fn.list_editor.selectAll(e);break;case"move":case"create-album":i="move"==$(this).data("action")?"form-move-multiple":"form-create-album";var r="[data-modal="+i+"]",s=/image/.test(dealing_with)?"album-id":"id";$("[name=form-album-id]",r).find("[value=null]").remove(),$("[name=form-album-id]",r).find("option").removeAttr("selected"),$("[name=form-album-name]",r).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",r).html(""),$("[name=form-privacy]",r).find("option").removeAttr("selected");var l=a.first().data(s),d=!0;a.each(function(){if($(this).data(s)!==l)return d=!1,!1}),d||$("[name=form-album-id]",r).prepend('"),$("[name=form-album-id]",r).find("[value="+(d?a.first().data(s):"null")+"]").attr("selected",!0),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(r,a),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,dealing_with,a)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=!1;if($("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.fn.form_modal_has_changed()){return PF.obj.modal.form_data={action:t?"create-album":"move",type:dealing_with,owner:CHV.obj.resource.user.id,multiple:!0,album:{ids:o,new:t}},t?(PF.obj.modal.form_data.album.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.album.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.album.privacy&&(PF.obj.modal.form_data.album.password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.album.description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.album.id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-approve-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(a,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",from:"list",approve:dealing_with,multiple:!0,approving:{ids:o}},!0}});break;case"delete":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-delete-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"albums"==dealing_with&&(a.each(function(){$("[name=form-album-id]","[data-modal]").find("[value="+$(this).data("id")+"]").remove()}),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(a)}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",from:"list",delete:dealing_with,multiple:!0,deleting:{ids:o}},!0}});break;case"assign-category":var c=a.first().data("category-id"),u=!0;a.each(function(){if($(this).data("category-id")!==c)return u=!1,!1}),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-assign-category]",a),forced:!0,ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){var t=e.responseJSON;$(this).data("category-id",t.category_id)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=$("[name=form-category-id]",e).val()||null;return u&&c==t?(PF.fn.modal.close(function(){CHV.fn.list_editor.clearSelection()}),!1):(PF.obj.modal.form_data={action:"edit-category",from:"list",multiple:!0,editing:{ids:o,category_id:t}},!0)}});break;case"flag-safe":case"flag-unsafe":var m=$(this).data("action"),f="flag-safe"==m?"safe":"unsafe";PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-"+m+"]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){$(this).removeClass("safe unsafe").addClass(f).removeAttr("data-flag").attr("data-flag",f).data("flag",f)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){return PF.obj.modal.form_data={action:m,from:"list",multiple:!0,editing:{ids:o,nsfw:"flag-safe"==m?0:1}},!0}})}return!PF.fn.isDevice(["phone","phablet"])&&void 0}console.error("Error: data-list not defined")}),$(document).on("click","[data-action=disconnect]",function(){var e=$(this),t=e.data("connection");PF.fn.modal.confirm({message:e.data("confirm-message"),ajax:{data:{action:"disconnect",disconnect:t,user_id:CHV.obj.resource.user.id},deferred:{success:function(e){var a=e.responseJSON;$("[data-connection="+t+"]").fadeOut(function(){$($("[data-connect="+t+"]")).fadeIn(),$(this).remove(),0==$("[data-connection]").length&&$("[data-content=empty-message]").show(),PF.fn.growl.expirable(a.success.message)}),""!==a.success.redirect&&(window.location.href=a.success.redirect)},error:function(e){var t=e.responseJSON;PF.fn.growl.call(t.error.message)}}}})}),$(document).on("click","[data-action=delete-avatar]",function(){var e=$(".user-settings-avatar"),t=$(".loading-placeholder",e),a=$("#top-bar");t.removeClass("hidden"),PF.fn.loading.inline(t,{center:!0}),$.ajax({type:"POST",data:{action:"delete",delete:"avatar",owner:CHV.obj.resource.user.id}}).complete(function(o){t.addClass("hidden").empty(),200==o.status?(CHV.obj.logged_user.id==CHV.obj.resource.user.id&&($("img.user-image",a).hide(),$(".default-user-image",a).removeClass("hidden")),$(".default-user-image",e).removeClass("hidden").css({opacity:0}),$('[data-action="delete-avatar"]',e).parent().addClass("soft-hidden"),$("img.user-image",e).fadeOut(function(){$(".default-user-image",e).animate({opacity:1})})):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}),$(document).on("change","[data-content=user-avatar-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$(".user-settings-avatar"),o=$(".loading-placeholder",".user-settings-avatar"),i=$("#top-bar"),n=$(this)[0].files[0];if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.avatar_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.avatar_max_filesize));else{var r=$('[data-action="delete-avatar"]');o.removeClass("hidden"),PF.fn.loading.inline(o,{center:!0}),t.data("uploading",!0);var s=new FormData;s.append("source",n),s.append("action","upload"),s.append("type","file"),s.append("what","avatar"),s.append("owner",CHV.obj.resource.user.id),s.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(s),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;o.addClass("hidden").empty(),200==this.status?(change_avatar=function(e){r.parent().removeClass("soft-hidden"),$("img.user-image",e).attr("src",n.url).removeClass("hidden").show()},hide_default=function(e){$(".default-user-image",e).addClass("hidden")},hide_default(a),$(".btn-alt",a).closest("div").show(),change_avatar(a),CHV.obj.logged_user.id==CHV.obj.resource.user.id&&(change_avatar(i),hide_default(i)),PF.fn.growl.expirable(PF.fn._s("Profile image updated."))):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),t.data("uploading",!1)}} -}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),$(document).on("change","[data-content=user-background-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$("[data-content=user-background-cover]"),o=$("[data-content=user-background-cover-src]"),i=$(".loading-placeholder",a),n=($("#top-bar"),$(this)[0].files[0]);if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.background_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.background_max_filesize));else{i.removeClass("hidden"),PF.fn.loading.inline(i,{center:!0,size:"big",color:"#FFF"}),t.data("uploading",!0);var r=new FormData;r.append("source",n),r.append("action","upload"),r.append("type","file"),r.append("what","background"),r.append("owner",CHV.obj.resource.user.id),r.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(r),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;if(200==this.status){var r=$("");r.attr("src",n.url).imagesLoaded(function(){i.addClass("hidden").empty(),o.css("background-image","url("+n.url+")").hide().fadeIn(),$("[data-content=user-change-background]",a).removeClass("hidden"),$(a).removeClass("no-background"),$(".top-user").removeClass("no-background"),$("[data-content=user-upload-background]").hide(),$("[data-content=user-change-background]").show(),PF.fn.growl.expirable(PF.fn._s("Profile background image updated.")),r.remove()})}else i.addClass("hidden").empty(),PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."));t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),CHV.fn.user_background={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"background",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){$("[data-content=user-background-cover-src]").css("background-image","none"),$("[data-content=user-background-cover], .top-user").addClass("no-background"),$("[data-content=user-background-cover]").height(""),$("[data-content=user-upload-background]").removeClass("hidden").show(),$("[data-content=user-change-background]").hide()},done:function(e){PF.fn.modal.close(function(){PF.fn.growl.expirable(PF.fn._s("Profile background image deleted."))})}},error:function(e){PF.fn.growl.expirable(PF.fn._s("Error deleting profile background image."))}}}},CHV.fn.user_api={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"api_key",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.fn.user_two_factor={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"two_factor",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.str.mainform="[data-content=main-form]",CHV.obj.timezone={selector:"[data-content=timezone]",input:"#timezone-region"},$(document).on("keyup change",CHV.str.mainform+" :input",function(){$(this).is("[name=username]")&&$("[data-text=username]").text($(this).val())}),$(document).on("change",CHV.obj.timezone.input,function(){var e=$(this).val(),t=$("#timezone-combo-"+e);t.find("option:first").prop("selected",!0),$(CHV.obj.timezone.selector).val(t.val()).change()}),$(document).on("change","[id^=timezone-combo-]",function(){var e=$(this).val();$(CHV.obj.timezone.selector).val(e).change()}),$(document).on("keyup change blur","[name^=new-password]",function(){var e=$("[name=new-password]"),t=$("[name=new-password-confirm]"),a=e.val()==t.val(),o=t.closest(".input-password").find(".input-warning");0==o.exists()&&(o=$("[data-message=new-password-confirm]")),$(this).is(t)&&t.data("touched",!0),t.data("touched")&&o.text(a?"":o.data("text"))[a?"addClass":"removeClass"]("hidden-visibility")}),$(document).on("submit",CHV.obj.mainform,function(){switch($(this).data("type")){case"password":var e=$("[name=new-password]",this),t=$("[name=new-password-confirm]",this);if((""!==e.val()||""!==t.val())&&e.val()!==t.val())return e.highlight(),t.highlight(),PF.fn.growl.expirable(PF.fn._s("Passwords don't match")),!1}}),$(document).on("click","[data-action=check-for-updates]",function(){PF.fn.loading.fullscreen(),CHV.fn.system.checkUpdates(function(e){if(PF.fn.loading.destroy("fullscreen"),200===e.status){var t=e.responseJSON.software;if(-1==PF.fn.versionCompare(CHV.obj.system_info.version,t.current_version)){let e=CHV.obj.system_info.version.split("."),a=e[0],o=a+"."+e[1],i="_self",n=PF.obj.config.base_url+"dashboard/upgrade/?auth_token="+PF.obj.config.auth_token,r=PF.fn._s("Upgrade"),s="fas fa-download";"docker"===CHV.obj.system_info.servicing&&(i="_blank",n="https://v4-docs.chevereto.com/guides/docker/#upgrading",r=PF.fn._s("Instructions"),s="fa-brands fa-docker"),PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s available",t.current_version),message:"

"+PF.fn._s("There is a new Chevereto version available with the following release notes.")+" "+PF.fn._s("Check %s for a complete changelog since you last upgrade.",''+CHV.obj.system_info.version+'')+'

"+PF.fn._s("Check the %s for alternative update methods.",''+PF.fn._s("documentation")+"")+'

",html:!0})}else PF.fn.growl.call(PF.fn._s("This website is running latest %s version",CHEVERETO.edition))}else PF.fn.growl.call(PF.fn._s("An error occurred. Please try again later."))})}),void 0!==PF.fn.get_url_var("checkUpdates")&&$("[data-action=check-for-updates]").trigger("click"),void 0!==PF.fn.get_url_var("upgrade")&&$("[data-action=upgrade]").trigger("click"),void 0!==PF.fn.get_url_var("license")&&$("[data-action='license']").trigger("click"),void 0!==PF.fn.get_url_var("welcome")&&PF.fn.modal.call({template:$("[data-modal=welcome]").html(),buttons:!1}),void 0!==PF.fn.get_url_var("installed")&&PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s installed",CHV.obj.system_info.version),message:"

"+PF.fn._s('Usage of Chevereto Software must be in compliance with the software license terms known as "The Chevereto License".')+'

",html:!0}),$(document).on("click","[data-action=system-update]",function(e){if(!$("input#system-update").prop("checked"))return PF.fn.growl.call(PF.fn._s("Please review the system requirements before proceeding")),void e.preventDefault()}),$(document).on("click","[data-action=toggle-storage-https]",function(){CHV.fn.storage.toggleHttps($(this).closest("[data-content=storage]").data("storage-id"))}),$(document).on("click","[data-action=toggle-storage-active]",function(){CHV.fn.storage.toggleActive($(this).closest("[data-content=storage]").data("storage-id"))}),$(CHV.fn.uploader.selectors.root).exists()&&(CHV.fn.uploader.$pasteCatcher=$("
",{contenteditable:"true",id:CHV.fn.uploader.selectors.paste.replace(/#/,"")}),$("body").append(CHV.fn.uploader.$pasteCatcher),$(document).on("keydown",function(e){!e.ctrlKey&&!e.metaKey||"KeyV"!=e.originalEvent.code||$(e.target).is(":input")||(PF.fn.keyFeedback.spawn(e),CHV.fn.uploader.$pasteCatcher.focus(e))}),document.addEventListener("dragover",function(e){e.preventDefault()}),document.addEventListener("drop",function(e){if(CHV.obj.config.upload.url){e.preventDefault();var t,a=e.dataTransfer.getData("text/html"),o=/src="?([^"\s]+)"?\s*/;t=o.exec(a),t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t[1]))}}),window.addEventListener("paste",CHV.fn.uploader.pasteImageHandler)),$(document).on("click","[data-action=like]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-liked]")?$(this):$(this).closest("[data-liked]"),a=!t.closest("[data-list], .viewer").exists()&&void 0!==CHV.obj.resource,o=t.is("[data-liked=1]"),i=o?"dislike":"like",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").attr("data-id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").attr("data-type")},r=a?e:$("[data-type="+n.type+"][data-id="+n.id+"]"),s={type:"POST",data:{action:i},cache:!1};s.data[i]={object:n.type,id:n.id},$.ajax(s).complete(function(t){var i=t.responseJSON;e.data("XHR",!1),200===i.status_code?(a&&void 0!==i.content&&$("[data-text=likes-count]").html(i.content.likes),r.closest("[data-liked]").attr("data-liked",o?0:1)):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else window.location.href=CHV.obj.vars.urls.login}),$(document).on("click","[data-action=album-cover]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-cover]")?$(this):$(this).closest("[data-cover]"),a=t.is("[data-cover=1]"),o=a?"album-cover-unset":"album-cover-set",i=(CHV.obj.resource.id,e.closest("[data-cover]")),n={type:"POST",data:{action:o},cache:!1};n.data[o]={album_id:i.data("album-id"),image_id:i.data("id")},$.ajax(n).complete(function(t){var o=t.responseJSON;e.data("XHR",!1),200===o.status_code?i.attr("data-cover",a?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=follow]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-followed]")?$(this):$(this).closest("[data-followed]"),a=void 0!==CHV.obj.resource,o=t.is("[data-followed=1]"),i=o?"unfollow":"follow",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},r={type:"POST",data:{action:i},cache:!1};r.data[i]={object:n.type,id:n.id},$.ajax(r).complete(function(i){var n=i.responseJSON;if(e.data("XHR",!1),200===n.status_code){if(a&&void 0!==n.user_followed){var r=$("[data-text=followers-label]"),s={single:r.data("label-single"),plural:r.data("label-plural")};$("[data-text=followers-count]").html(n.user_followed.followers),r.html(PF.fn._n(s.single,s.plural,n.user_followed.followers))}t.attr("data-followed",o?0:1)}else PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else PF.fn.modal.call({type:"login"})}),$(document).on("click","[data-action=user_ban],[data-action=user_unban]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).closest("[data-banned]"),a=!0,o=t.is("[data-banned=1]"),i=e.attr("data-action"),n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},r={type:"POST",data:{action:i},cache:!1};r.data[i]={user_id:n.id},$.ajax(r).complete(function(a){var i=a.responseJSON;e.data("XHR",!1),200===i.status_code?t.attr("data-banned",o?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=top-bar-notifications]",function(e){var a=this,o=$(this),i=$(".top-bar-notifications-container",o),n=$(".top-bar-notifications-list",o),r=$("ul",n),s=$(".loading",i);o.data("XHR")||(s.removeClass("hidden"),PF.fn.loading.inline(s,{size:"small",message:PF.fn._s("loading")}),$.ajax({type:"POST",data:{action:"notifications"},cache:!1}).complete(function(e){var l=e.responseJSON;if(200!==l.status_code)return PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),o.data("XHR",!1),void s.addClass("hidden").html("");if(o.data("XHR",!0),s.remove(),l.html){n.removeClass("hidden"),r.html(l.html),t();var d=$("li.new",r);d.addClass("transition"),setTimeout(function(){d.removeClass("new"),$("[data-content=notifications-counter]",a).removeClass("on").html("0"),setTimeout(function(){d.removeClass("transition")},150)},1500)}else $(".empty",i).removeClass("hidden")}))}),$("#g-recaptcha").is(":empty")&&CHV.obj.config.captcha.enabled&&CHV.obj.config.captcha.sitekey&&("3"!=CHV.obj.config.captcha.version&&CHV.obj.config.captcha.isNeeded||$('label[for="recaptcha_response_field"]').remove()),$(document).on("click",PF.obj.listing.selectors.list_item+" a.image-container",function(e){var t=$(this).closest(PF.obj.listing.selectors.list_item),o=t.find("[data-action=load-image]");o.length>0&&(a(o),e.preventDefault())}),$(document).on("click",PF.obj.listing.selectors.list_item+" [data-action=load-image]",function(e){a($(this)),e.preventDefault(),e.stopPropagation()}),$(document).on("click","#album [data-tab=tab-embeds]",function(e){e.preventDefault,CHV.fn.album.showEmbedCodes()}),$("body").is("#upload")&&CHV.fn.uploader.toggle({show:!0}),$(document).on("keyup",function(e){if(!($(e.target).is(":input")||e.ctrlKey||e.metaKey||e.altKey)){var t=$("#fullscreen-modal:visible").exists(),a=$(".viewer"),o=$(".list-selection:visible"),i=o.find("[data-content=pop-selection]:visible:not(.disabled)"),n=$("body").hasClass("--viewer-shown"),r=$(CHV.fn.uploader.selectors.root+CHV.fn.uploader.selectors.show).exists(),s=e.originalEvent.code;if("Escape"===e.originalEvent.code){if(t)return;r&&CHV.fn.uploader.toggle({reset:!1})}if(a.exists()&&n){if(s in CHV.fn.listingViewer.keys){var l=["KeyW","Escape","ArrowLeft","ArrowRight"],d=CHV.fn.listingViewer.keys[s];-1==l.indexOf(s)?$("[data-action="+d+"]",CHV.fn.listingViewer.selectors.root).click():d in CHV.fn.listingViewer&&CHV.fn.listingViewer[d](),PF.fn.keyFeedback.spawn(e)}}else{var c,u={Period:"list-select-all",KeyK:"get-embed-codes",KeyZ:"clear",KeyA:"create-album",KeyM:"move",KeyO:"approve",Delete:"delete",KeyC:"assign-category",KeyV:"flag-safe",KeyF:"flag-unsafe",KeyH:"album-cover"},m={KeyE:"edit",KeyL:"like",KeyS:"share",KeyJ:"sub-album",KeyP:"upload-to-album"};d=u[s]||m[s];void 0!==d&&(o.exists()&&(n||t||parseInt($("[data-text=selection-count]:visible",i).text())>0&&(c=$("[data-action="+d+"]",o.closest(".list-selection")))),void 0===c&&(c=$("[data-action="+d+"]:visible").not("#content-listing-tabs *")),c instanceof jQuery&&c.length>0&&(c.first().trigger("click"),PF.fn.keyFeedback.spawn(e)))}}}),$(document).on("click",CHV.fn.listingViewer.selectors.root+" [data-action^=viewer-]",function(){var e=$(this).data("action").substring("viewer-".length);e in CHV.fn.listingViewer&&CHV.fn.listingViewer[e]()}),$(document).on("click","a[data-href]:not([rel=popup-link]):not(.popup-link)",function(){var e=$(this).attr("data-href"),t=$(this).attr("href");(e||t)&&(location.href=t||e)});var h,v=PF.obj.listing.selectors.list_item+", .image-container";($(document).on("contextmenu click",v,function(e){!$(".list-selection:visible").exists()||$(e.target).closest(".list-item-desc").exists()||$(this).closest(CHV.fn.listingViewer.selectors.root).exists()||"click"==e.type&&!e.ctrlKey&&!e.metaKey||o(this,e)}),navigator.userAgent.match(/(iPad|iPhone|iPod)/i))&&$(document).on("mouseup mousemove",v,function(e){return clearTimeout(h),!1}).on("mousedown",v,function(e){var t=this,a=e;return h=window.setTimeout(function(){$(".list-selection:visible").exists()&&!$(t).closest(CHV.fn.listingViewer.selectors.root).exists()&&o(t,a)},500),!1});void 0!==CHV.obj.config&&CHV.obj.config.listing.viewer&&$(document).on("click",PF.obj.listing.selectors.list_item+"[data-type=image] .image-container",function(e){if(e.preventDefault(),e.stopPropagation(),0!==e.clientX||0!==e.clientY){var t=$(this).closest(PF.obj.listing.selectors.list_item);t.exists()&&(e.ctrlKey||e.metaKey||CHV.fn.listingViewer.open(t))}else PF.fn.keyFeedback.spawn(e)}),$(document).on("contextmenu",CHV.fn.listingViewer.selectors.root,function(e){return e.preventDefault(),CHV.fn.listingViewer.zoom(),PF.fn.keyFeedback.spawn(e),!1});var b,_=PF.fn.deparam(window.location.search);if(_&&"viewer"in _){var C=$(PF.obj.listing.selectors.content_listing_visible);if("images"==C.data("list")){var w=$(PF.obj.listing.selectors.list_item,C)["next"==_.viewer?"first":"last"]();CHV.fn.listingViewer.open(w)}}$(window).on("DOMContentLoaded load resize scroll",function(){clearTimeout(b),b=setTimeout(function(){$(PF.obj.listing.selectors.list_item+":visible").each(function(){var e=$(this).find('[data-action="load-image"]').first(),t=PF.fn.deparam($(PF.obj.listing.selectors.list_item+"[data-id="+$(this).attr("data-id")+"]").closest(".content-listing").data("params-hidden")),o=t&&"is_animated"in t?t.is_animated:$(this).data("size")<=CHV.obj.config.image.load_max_filesize.getBytes();e.exists()&&o&&$(this).is_within_viewport(50)&&a(e)})},1e3)}),$(document).on("click","[data-action=logout]",function(){let e=$("form#form-logout");e.submit()}),Boolean(window.navigator.vibrate)&&$(document).on("click","button, .btn, .pop-btn, .top-btn-el, [data-action], .content-tabs a, .top-bar-logo a, .login-provider-button, .panel-share-networks li a, #image-viewer-loader",function(e){$(this).is("[data-action=top-bar-menu-full]")||(window.navigator.vibrate(0),window.navigator.vibrate(15))}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.rows+" input[name^='cta-']",function(){CHV.fn.ctaForm.update($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-add]",function(){CHV.fn.ctaForm.insert($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-remove]",function(){CHV.fn.ctaForm.remove($(this)),0==CHV.fn.ctaForm.array.length&&$(CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable).prop("checked",!1).trigger("change")}),$(document).on("change",CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable,function(){let e=$(CHV.fn.ctaForm.selectors.combo,CHV.fn.ctaForm.selectors.root),t=$(this).is(":checked");e.toggleClass("soft-hidden",!t),t&&(0==CHV.fn.ctaForm.array.length&&CHV.fn.ctaForm.add(),CHV.fn.ctaForm.render()),CHV.fn.ctaForm.setEnable(t?1:0)}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.root+" input[name^='cta-icon_']",function(){let e=CHV.fn.ctaForm.getRow($(this)),t=e.find("label[for^='cta-icon_'] [data-content=icon]");t.removeClass();let a=CHV.fn.ctaForm.getIconClass($(this).val());t.addClass(a)}),$(document).on("click","[href^='https://chevereto.com/']",function(e){let t=$(this).find(".badge--paid").exists();if(!t)return;let a=$(this).attr("href"),o=PF.fn._s("Get a license at %s to unlock all features and support.",'chevereto.com'),i=PF.fn._s("You can enter your license key in the dashboard panel.");e.preventDefault(),e.stopPropagation(),PF.fn.modal.simple({html:!0,title:' Upgrade Chevereto',message:"

"+o+" "+i+'

"})}),$(document).on("focus","input[name='form-album-password']",function(){$(this).get(0).type="text"}),$(document).on("blur","input[name='form-album-password']",function(){$(this).get(0).type="password"})}),"undefined"==typeof CHV&&(CHV={obj:{},fn:{},str:{}}),window.opener&&(CHV.obj.opener={uploadPlugin:{}}),CHV.fn.ctaButtons={selectors:{container:"[data-contains=cta-album]"},render:function(e=""){$(this.selectors.container).each(function(){$(this).html(e)})}},CHV.fn.ctaForm={enable:0,array:[],selectors:{root:"#cta-form",rows:"#cta-rows",enable:"#cta-enable",template:"#cta-row-template",combo:"#cta-combo",row:".cta-row"},update:function(e){let t=this.getPos(e),a=e.attr("name").match(/cta-(.*)?_\d+/)[1];this.array[t-1][a]=e.val()},add:function(e="",t="",a=""){this.array.push(this.getRowObject(e,t,a)),this.render()},insert:function(e){let t=this.getPos(e);this.array.splice(t,0,this.getRowObject()),this.render()},remove:function(e){let t=this.getPos(e);this.array.splice(t-1,1),this.render()},getRowObject:function(e="",t="",a=""){return{label:e,icon:t,href:a}},getIconClass:function(e){return/\s/g.test(e)?e:"fa-solid fa-"+e},getRow:function(e){return e.closest(this.selectors.row)},getPos:function(e){return this.getRow(e).data("pos")},getTemplateHtml:function(){return $(this.selectors.template).html()},getRowHtml:function(e,t){return this.getTemplateHtml().replaceAll(/%pos%/g,e).replaceAll(/%label%/g,t.label).replaceAll(/%href%/g,t.href).replaceAll(/%icon%/g,t.icon).replaceAll(/%iconClass%/g,this.getIconClass(t.icon))},render:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows),a=this;this.destroy(),$.each(this.array,function(e,o){t.append(a.getRowHtml(e+1,o))}),this.setEnable(this.enable),t.sortable({cursor:"grabbing",axis:"y",update:function(){let e=[];$(this).find(a.selectors.row).each(function(){let t=a.getPos($(this));e.push(a.array[t-1])}),a.array=e,a.render()}})},setEnable:function(e){let t=$(this.selectors.rows,this.selectors.root);this.enable=e;let a=1===this.enable;$("input[data-required]",t).each(function(){$(this).attr("required",a)})},destroy:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows);try{t.sortable("destroy")}catch(e){}t.empty()}},CHV.fn.album={showEmbedCodes:function(){var e=$(".content-listing-loading","#tab-embeds");if(e.exists()){var t=$("#embed-codes");$.ajax({url:PF.obj.config.json_api,type:"POST",dataType:"json",data:{action:"get-album-contents",albumid:CHV.obj.resource.id,auth_token:PF.obj.config.auth_token},cache:!1}).always(function(a){PF.fn.loading.destroy(e),200==a.status_code&&(CHV.fn.fillEmbedCodes(a.contents,"#tab-embeds"),$("#tab-embeds").addClass("visible"),t.removeClass("soft-hidden"))})}}},CHV.fn.modal={getTemplateWithPreview:function(e,t){var a=$(e).html(),o=$("
"),i="",n=t.find(".image-container img").attr("src");return void 0!==n&&(i+='';var e=$(this).find(".image-container img");e.exists()?n+='':(n+='',n+=''),n+="",r++}),i.html(o).find(".image-preview").html(n),i.html()}},CHV.fn.listingViewer={selectors:{bodyShown:".--viewer-shown",content:".viewer-content",template:"#viewer-template",root:".viewer",rootShow:".viewer--show",rootHide:".viewer--hide",rootZero:".viewer--zero",rootNavPrev:".viewer--nav-prev",rootNavNext:".viewer--nav-next",src:".viewer-src",tools:".viewer-tools",loader:".viewer-loader",owner:".viewer-owner",ownerGuest:".viewer-owner--guest",ownerUser:".viewer-owner--user",inputMap:".viewer-kb-input"},keys:{ArrowLeft:"prev",ArrowRight:"next",Delete:"delete",Escape:"close",KeyA:"create-album",KeyE:"edit",KeyF:"flag",KeyL:"like",KeyM:"move",KeyO:"approve",KeyS:"share",KeyW:"zoom",Period:"select"},keymap:{"create-album":["A",PF.fn._s("Create album")],approve:["O",PF.fn._s("Approve")],close:["Esc",PF.fn._s("Close")],delete:["Del",PF.fn._s("Delete")],edit:["E",PF.fn._s("Edit")],flag:["F",PF.fn._s("Toggle flag")],like:["L",PF.fn._s("Like")],move:["M",PF.fn._n("Move")],next:["►",PF.fn._s("Next")],prev:["◄",PF.fn._s("Previous")],select:[".",PF.fn._s("Toggle select")],share:["S",PF.fn._s("Share")],zoom:["W",PF.fn._s("Zoom")]},loading:null,idleTimer:0,$item:null,show:function(){PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));this.getEl("root").removeClass(this.selectors.rootHide.substring(1)).addClass(this.selectors.rootShow.substring(1)),$("body").addClass(this.selectors.bodyShown.substring(1));var e=new Hammer($(CHV.fn.listingViewer.selectors.root).get(0),{direction:Hammer.DIRECTION_VERTICAL});e.on("swipeleft swiperight",function(e){var t="left"==e.type.substring("swipe".length)?"next":"prev";CHV.fn.listingViewer[t]()}),this.getEl("root")[(PF.fn.isDevice(["phone","phablet"])?"add":"remove")+"Class"]("--over")},getItem:function(){return this.$item},getEl:function(e){var t=!e.startsWith("template")&&!e.startsWith("root")&&this.selectors.root;return t?$(this.selectors[e],t):$(this.selectors[e])},getObject:function(e){if(e||void 0===this.object){var t=decodeURIComponent(this.getItem().attr("data-object"));this.object=JSON&&JSON.parse(t)||$.parseJSON(t)}return this.object},placeholderSizing:function(){if(this.getEl("root").exists()){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),a=e/t,o=this.getEl("src")[0],i=o.getAttribute("width"),n=o.getAttribute("height"),r=i/n,s=a0?"add":t.getItem()[o]().exists()?"add":"remove";a[n+"Class"](i.substring(1))}),$.each(this.getItem().get(0).attributes,function(e,t){if(!t.name.startsWith("data-"))return!0;a.attr(t.name,t.value)});var n=void 0===this.object.user?"user":"guest";n="owner"+(n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()),this.getEl(n).remove(),void 0!==this.object.user&&$(this.object.user.avatar?".default-user-image":"img.user-image",this.getEl("ownerUser")).remove();var r=this.getItem().find(".list-item-image-tools[data-action='list-tools']");this.getEl("tools").append(r.html());let s=this;this.getEl("tools").find(".list-tool[data-action]").each(function(){$(this).attr("title",$(this).attr("title")+" ("+s.keymap[$(this).attr("data-action")][0]+")")}),this.placeholderSizing(),this.trickyLoad()},zoom:function(){this.getEl("root").attr("data-cover","1"==this.getEl("root").attr("data-cover")?"0":"1")},remove:function(){this.getEl("root").remove()},getParsedTemplate:function(){var e=this.getObject(!0),t=this.getEl("template").html(),a=t.match(/%(\S+)%/g);return a&&$.each(a,function(a,o){var i,n=o.slice(1,-1).split(".");n.map(function(t){var a=i||e;t in a&&(i=a[t])});var r=new RegExp(o,"g");i=void 0===i?"":i,t=t.replace(r,i)}),t},insertEl:function(){var e=this.getParsedTemplate();this.getEl("rootZero").remove(),$(e).appendTo("body")},toggleIdle:function(e,t){var a=this;t=void 0===t||t;$("html")[(e?"add":"remove")+"Class"]("--idle"),e||(clearTimeout(a.idleTimer),t&&(a.idleTimer=setTimeout(function(){var e=$(".fullscreen"),t=a.getEl("root");a.toggleIdle(t.length>0&&0==e.length)},5e3)))},open:function(e){if(e.exists()){this.setItem(e),this.insertEl(),this.filler(),this.show(),this.toggleIdle(!1);var t=this;this.getEl("root").on("mousemove mouseout",function(){t.toggleIdle(!1)})}else this.getEl("rootZero").remove()},setItem:function(e){this.$item=e},trickyLoad:function(){if(this.object.image.url!=this.object.display_url){var e=this.getEl("src").parent().html(),t=$(e).attr("src",this.object.image.url);t.insertBefore(this.getEl("src"));var a=t.eq(0),o="video"==a.attr("data-media");o?(a.replaceWith(''),t.next().css("opacity",0),setTimeout(function(){t.next().remove()},200)):a.attr("src",this.object.image.url),t.imagesLoaded(function(){o||t.next().remove()})}},close:function(){var e=this;$(this.selectors.root).removeClass(this.selectors.rootShow.substring(1)).addClass(this.selectors.rootHide.substring(1)),$("body").removeClass(this.selectors.bodyShown.substring(1)),this.toggleIdle(!1,!1),null!==this.getItem()&&$(window).scrollTop(this.getItem().offset().top);var t=$("#top-bar, .follow-scroll");t.attr("data-scroll-lock","1"),setTimeout(function(){e.remove()},250),setTimeout(function(){t.removeAttr("data-scroll-lock")},300)},browse:function(e){var t=this.getItem()[e]();if(t.exists()){this.setItem(t),this.filler(!0);var a=$(PF.obj.listing.selectors.content_listing_visible).find("[data-action=load-more]"),o=t[e+"All"]().length;a.length>0&&o<=5&&!PF.obj.listing.calling&&"next"==e&&$("[data-action=load-more]").click()}else{var i=$("[data-pagination="+e+"]",PF.obj.listing.selectors.content_listing_pagination+":visible"),n=i.attr("href");if(!n)return;PF.fn.deparam(window.location.search);window.location.href=n+"&viewer="+e}},prev:function(){this.browse("prev")},next:function(){this.browse("next")}},CHV.obj.image_viewer={selector:"#image-viewer",container:"#image-viewer",navigation:".image-viewer-navigation",loading:"#image-viewer-loading",loader:"#image-viewer-loader"},CHV.obj.image_viewer.$container=$(CHV.obj.image_viewer.container),CHV.obj.image_viewer.$navigation=$(CHV.obj.image_viewer.navigation),CHV.obj.image_viewer.$loading=$(CHV.obj.image_viewer.loading),CHV.fn.system={checkUpdates:function(e){$.ajax({url:CHEVERETO.api.get.info+"/",data:{id:CHEVERETO.id},cache:!1}).always(function(t,a,o){"function"==typeof e&&e(o)})}},("MacIntel"===navigator.platform&&navigator.maxTouchPoints>0||"iPad"===navigator.platform)&&$("html").removeClass("device-nonmobile"),CHV.fn.bindSelectableItems=function(){var e="content-listing-wrapper",t="#"+e;$(t).exists()?$(t).hasClass("ui-selectable")&&$(t).selectable("destroy"):$("#content-listing-tabs").wrap("
"),$("[data-content=list-selection]").exists()&&$("html.device-nonmobile "+t).selectable({delay:150,filter:PF.obj.listing.selectors.list_item,cancel:".content-empty, .header, #tab-share, #tab-info, .viewer-title, .header-link, .top-bar, .content-listing-pagination *, #fullscreen-modal, #top-user, #background-cover, .list-item-desc, .list-item-image-tools, [data-action=load-image], #tab-embeds",classes:{"ui-selected":"selected"},selected:function(e,t){$(t.selected).removeClass("ui-selected")},selecting:function(e,t){var a=$(t.selecting),o=a.hasClass("selected");CHV.fn.list_editor[(o?"unselect":"select")+"Item"](a)},unselecting:function(e,t){CHV.fn.list_editor.unselectItem($(t.unselecting))}})},CHV.fn.isCachedImage=function(e){var t=new Image;return t.src=e,t.complete||t.width+t.height>0},CHV.fn.viewerLoadImage=function(){if(CHV.obj.image_viewer.$loading.exists()&&(CHV.obj.image_viewer.$loading.removeClass("soft-hidden").css({zIndex:2}),PF.fn.loading.inline(CHV.obj.image_viewer.$loading,{color:"white",size:"small",center:!0,valign:!0}),CHV.obj.image_viewer.$loading.hide().fadeIn("slow")),$(CHV.obj.image_viewer.loader).remove(),CHV.obj.image_viewer.image.is_360)return PF.fn.loading.destroy(CHV.obj.image_viewer.$loading),pannellum.viewer("image-viewer-360",{autoLoad:!0,type:"equirectangular", -panorama:CHV.obj.image_viewer.image.url,preview:CHV.obj.image_viewer.$container.find(".media").eq(0).attr("src"),pitch:2.3,yaw:-135.4,hfov:120}),$("#image-viewer-360").removeClass("soft-hidden"),void CHV.obj.image_viewer.$container.find(".media").eq(0).remove();CHV.obj.image_viewer.image.html=CHV.obj.image_viewer.$container.html(),CHV.obj.image_viewer.$container.css("height",CHV.obj.image_viewer.$container.height()).prepend($(CHV.obj.image_viewer.image.html).css({top:0,zIndex:0,opacity:0,position:"absolute"})),CHV.obj.image_viewer.$container.find(".media").eq(0).css("zIndex",1);var e=CHV.obj.image_viewer.$container.find(".media").eq(1),t=e.css("width"),a=e.css("height");"video"===e.attr("data-media")?(e.replaceWith(''),e.src=CHV.obj.image_viewer.image.url):e.attr("src",CHV.obj.image_viewer.image.url),e.imagesLoaded(function(){CHV.obj.image_viewer.$container.find(".media").eq(1).css({position:"",display:"",opacity:1}),CHV.obj.image_viewer.$container.find(".media").eq(0).remove(),$(CHV.obj.image_viewer.container).css("height",""),PF.fn.loading.destroy(CHV.obj.image_viewer.$loading)})},CHV.obj.embed_share_tpl={},CHV.obj.embed_upload_tpl={},CHV.obj.topBar={transparencyScrollToggle:function(){var e=$(window).scrollTop();$("#top-bar")[(e>0?"remove":"add")+"Class"]("transparent")}},CHV.obj.uploaderReset={isUploading:!1,canAdd:!0,queueStatus:"ready",uploadThreads:0,uploadParsedIds:[],uploadProcessedIds:[],files:{},results:{success:{},error:{}},toggleWorking:0,filesAddId:0,clipboardImages:[]},CHV.fn.uploader={files:{},selectors:{root:"#anywhere-upload",show:".upload-box--show",queue:"#anywhere-upload-queue",queue_complete:".queue-complete",queue_item:".queue-item",close_cancel:"[data-button=close-cancel]",file:"#anywhere-upload-input",camera:"#anywhere-upload-input-camera",upload_item_template:"#anywhere-upload-item-template",item_progress_bar:"[data-content=progress-bar]",failed_result:"[data-content=failed-upload-result]",fullscreen_mask:"#fullscreen-uploader-mask",dropzone:"#uploader-dropzone",paste:"#anywhere-upload-paste",input:"[data-action=anywhere-upload-input]"},toggle:function(e,t){this.queueSize();var a=$("[data-action=top-bar-upload]",".top-bar"),o=!$(CHV.fn.uploader.selectors.root).data("shown");e=$.extend({callback:null,reset:!0},e);if(void 0!==e.show&&e.show&&(o=!0),PF.fn.growl.close(!0),PF.fn.close_pops(),!(1==this.toggleWorking||$(CHV.fn.uploader.selectors.root).is(":animated")||CHV.fn.uploader.isUploading||a.data("login-needed")&&!PF.fn.is_user_logged())){this.toggleWorking=1;var i={time:500,easing:null},n=function(){!o&&e.reset&&CHV.fn.uploader.reset(),PF.fn.topMenu.hide(),"function"==typeof e.callback&&e.callback(t),CHV.fn.uploader.boxSizer(),CHV.fn.uploader.toggleWorking=0};if($(CHV.fn.uploader.selectors.root)[(o?"add":"remove")+"Class"](this.selectors.show.substring(1)),o){if($("html").data({"followed-scroll":$("html").hasClass("followed-scroll"),"top-bar-box-shadow-prevent":!0}).removeClass("followed-scroll").addClass("overflow-hidden top-bar-box-shadow-none"),$("#top-bar").data({stock_classes:$("#top-bar").attr("class")}).addClass("scroll-up"),$(".current[data-nav]",".top-bar").each(function(){$(this).is("[data-action=top-bar-menu-full]")||$(this).removeClass("current").attr("data-current",1)}),PF.fn.isDevice("mobile")){var r=$(".upload-box-heading",$(CHV.fn.uploader.selectors.root));r.css({position:"relative",top:.5*($(window).height()-r.height())+"px"})}CHV.fn.uploader.focus(function(){setTimeout(function(){n()},i.time)})}else{$("#top-bar")[0].className=$("#top-bar").data("stock_classes"),$("[data-nav][data-current=1]",".top-bar").each(function(){$(this).addClass("current")}),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:0})},.1*i.time),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).remove()},i.time);var s=$(CHV.fn.uploader.selectors.root).outerHeight(),l=s-parseInt($(CHV.fn.uploader.selectors.root).data("initial-height"))+"px";$(CHV.fn.uploader.selectors.root).css({transform:"translate(0,-"+l+")"}),setTimeout(function(){$(CHV.fn.uploader.selectors.root).css({top:""}),n(),$("html,body").removeClass("overflow-hidden").data({"top-bar-box-shadow-prevent":!1}),$("#top-bar *").trigger("blur")},i.time)}$(CHV.fn.uploader.selectors.root).data("shown",o),a.toggleClass("current").removeClass("opened")}},reset:function(){$.extend(this,$.extend(!0,{},CHV.obj.uploaderReset)),$("li",this.selectors.queue).remove(),$(this.selectors.root).height("").css({"overflow-y":"","overflow-x":""}),$(this.selectors.queue).addClass("queueEmpty").removeClass(this.selectors.queue_complete.substring(1)),$(this.selectors.input,this.selectors.root).each(function(){$(this).prop("value",null)}),$("[data-group=upload-result] textarea",this.selectors.root).prop("value",""),$.each(["upload-queue-ready","uploading","upload-result","upload-queue-ready","upload-queue"],function(e,t){$("[data-group="+t+"]").hide()}),$("[data-group=upload]",this.selectors.root).show(),$("[name=upload-album-id]",this.selectors.root).prop("value",function(){var e=$("option[selected]",this);if(e.exists())return e.attr("value")}),$(this.selectors.root).removeClass("queueCompleted queueReady queueHasResults").addClass("queueEmpty").attr("data-queue-size",0),$("[name=upload-category-id]",this.selectors.root).prop("value",""),$("[name=upload-nsfw]",this.selectors.root).prop("checked",this.defaultChecked),this.boxSizer(!0)},focus:function(e){$(this.selectors.fullscreen_mask).exists()||($("body").is("#upload")||$("body").append($("
",{id:this.selectors.fullscreen_mask.replace("#",""),class:"fullscreen black"}).css({top:PF.fn.isDevice("phone")?0:$(CHV.fn.uploader.selectors.root).data("top")})),setTimeout(function(){$("body").is("#upload")||$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:1}),setTimeout(function(){"function"==typeof e&&e()},PF.fn.isDevice(["phone","phablet"])?0:250)},1))},boxSizer:function(e){var t=$(this.selectors.root).is(this.selectors.show),a=t||e;t&&$("html").addClass("overflow-hidden"),a&&($(this.selectors.root).height(""),!$("body").is("#upload")&&$(this.selectors.root).height()>$(window).height()?($(this.selectors.root).height($(window).height()-$("#top-bar").height()).css({"overflow-y":"scroll","overflow-x":"auto"}),$("html").addClass("overflow-hidden")):$(this.selectors.root).css("overflow-y",""))},pasteURL:function(){var e=$("[name=urls]",PF.obj.modal.selectors.root),t=e.val();t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t))},pasteImageHandler:function(e){if(!$(e.target).is(":input")){if(void 0!==e.clipboardData&&e.clipboardData.items)var t=e.clipboardData.items;else setTimeout(function(){return e.clipboardData={},e.clipboardData.items=[],$.each($("img",CHV.fn.uploader.$pasteCatcher),function(t,a){e.clipboardData.items.push(PF.fn.dataURItoBlob($(this).attr("src")))}),$(CHV.fn.uploader.selectors.paste).html(""),CHV.fn.uploader.pasteImageHandler(e)},1);if(t){const e=new Array,i=new Array,n=new RegExp("^(image|video)/","i");let r=$(CHV.fn.uploader.selectors.root).data("shown");for(var a=0;a{const o={1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"};var i=o[a.error.code];t({type:"error",error:i}),console.error("Error loading video",i)}),a.addEventListener("loadedmetadata",function(){const e=parseInt(a.duration/4);setTimeout(()=>{a.currentTime=e,a.pause()},200),a.addEventListener("seeked",()=>{const e=document.createElement("canvas");e.width=a.videoWidth,e.height=a.videoHeight;const o=e.getContext("2d");o.drawImage(a,0,0,e.width,e.height),o.canvas.toBlob(o=>{t(a,e)},"image/jpeg",.9)},!1)}),/iPad|iPhone|iPod|Safari/.test(navigator.userAgent)&&(a.autoplay=!0,a.playsInline=!0,a.muted=!0),a.preload="metadata",a.src=e}function d(e,t){e.show(),$(CHV.fn.uploader.selectors.root).addClass("queueReady").removeClass("queueEmpty"),$("[data-group=upload-queue-ready]",CHV.fn.uploader.selectors.root).show(),$("[data-group=upload]",CHV.fn.uploader.selectors.root).hide(),e.find(".load-url").remove(),e.find(".preview").removeClass("soft-hidden").show().append(t),$img=e.find(".preview").find("img,canvas"),$img.attr("class","canvas"),queue_item_h=e.height(),queue_item_w=e.width();var a=parseInt($img.attr("width"))||$img.width(),o=parseInt($img.attr("height"))||$img.height(),i=a/o;if($img.hide(),a>o||a==o){var r=oo&&$img.height(r).width(r*i)}if(a0){for(var o="",i=0;i"+PF.fn.htmlEncode(a[i].name)+" - "+PF.fn.htmlEncode(a[i].error)+"",delete CHV.fn.uploader.files[a[i].uid],$("li[data-id="+a[i].uid+"]",CHV.fn.uploader.selectors.queue).find("[data-action=cancel]").click();PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be loaded"),message:"
    "+o+"
"})}else CHV.fn.uploader.focus();CHV.fn.uploader.boxSizer()}}if($(CHV.fn.uploader.selectors.queue_item+":not([data-id]) .preview:empty",CHV.fn.uploader.selectors.queue).first().closest("li").attr("data-id",t.uid),void 0!==t.type&&t.type.startsWith("video/")){var u=i(t.uid),m=r(t),p=URL.createObjectURL(t);l(p,function(e,a){++w,"error"===e.type?f.push({uid:t.uid,name:t.name.truncate_middle(),error:e.error}):(CHV.fn.uploader.files[t.uid].parsedMeta={title:m,width:e.videoWidth,height:e.videoHeight,mimetype:t.type},d(u,a)),c(w,s,f)})}else loadImage(t.url?t.url:t,function(e){++w;var o=i(t.uid);if("error"===e.type)f.push({uid:t.uid,name:t.name.truncate_middle(),error:"MEDIA_ERR_SRC_FORMAT"});else{n();var l="image/jpeg";if(t.hasOwnProperty("type")?l=t.type:t.type=l,void 0!==a.buffer){for(var u=new Uint8Array(a.buffer).subarray(0,4),m="",p=0;pCHV.obj.config.image.max_filesize.getBytes()?f.push({uid:u,name:g.name.truncate_middle()+" - "+PF.fn._s("File too big."),error:"MEDIA_ERR_FILE_SIZE"}):-1!=CHV.obj.config.upload.image_types.indexOf(p)||0!=/android/i.test(navigator.userAgent)?(i&&(g.md5=i),g.fromClipboard=1==e.clipboard,g.uid=u):f.push({uid:u,name:g.name.truncate_middle()+" - "+PF.fn._s("Invalid or unsupported file format."),error:"MEDIA_ERR_FILETYPE"})}for(u=0;u0&&0==s.length){var v="";for(u=0;u"+PF.fn.htmlEncode(f[u].name)+"";return void PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
  • "+v+"
"})}if(0==s.length)return}else{if(t=t.replace(/(<([^>]+)>)/g,"").replace(/(\[([^\]]+)\])/g,""),s=t.match_urls(),!s)return;s=s.array_unique(),s=$.map(s,function(e,t){return{uid:t,name:e,url:e}})}if($.isEmptyObject(this.files))for(u=0;u0){var i=[];for(var o in this.results.error)"object"==typeof this.results.error[o]&&(i[o]=this.results.error[o].error.message);i.length>0&&$(this.selectors.failed_result).html("
  • "+i.join("
  • ")+"
  • ")}else $(a.error,this.selectors.root).hide();if(!window.opener&&0==CHV.obj.config.upload.moderation&&CHV.obj.config.upload.redirect_single_upload&&1==Object.size(this.results.success)&&0==Object.size(this.results.error))return window.location.href=this.results.success[Object.keys(this.results.success)[0]].image.path_viewer,!1;if($("[data-text=queue-progress]",this.selectors.root).text(100),$("[data-group=uploading]",this.selectors.root).hide(),$(this.selectors.root).removeClass("queueUploading queueHasResults").addClass("queueCompleted"),$(this.selectors.queue).addClass(this.selectors.queue_complete.substring(1)),Object.size(this.results.success)>0&&$("[data-group=upload-result] textarea",this.selectors.root).exists()&&CHV.fn.fillEmbedCodes(this.results.success,CHV.fn.uploader.selectors.root,"val"),Object.size(this.results.success)>0&&Object.size(this.results.error)>0?$(a.mixed+", "+a.success,this.selectors.root).show():Object.size(this.results.success)>0?$(a.success,this.selectors.root).show():Object.size(this.results.error)>0&&$(a.error,this.selectors.root).show(),$(a.success,this.selectors.root).is(":visible")){$(a.success,this.selectors.root).find("[data-group^=user], [data-group=guest]").hide(),$(a.success,this.selectors.root).find("[data-group="+(PF.fn.is_user_logged()?"user":"guest")+"]").show();var n=Object.keys(this.results.success)[0];if(void 0!==this.results.success[n].image.album){var r=[];for(var s in this.results.success){var l=this.results.success[s].image;l.album&&l.album.id_encoded&&-1==r.indexOf(l.album.id_encoded)&&r.push(l.album.id_encoded)}var d={link:null,text:null};if(r.length<=1?(d.link=this.results.success[n].image.album.url,d.text=this.results.success[n].image.album.name):(d.link=this.results.success[n].image.user.url_albums,d.text=PF.fn._s("%s's Albums",this.results.success[n].image.user.name_short_html)),$("[data-text=upload-target]",this.selectors.root).text(d.text),$("[data-link=upload-target]",this.selectors.root).attr("href",d.link),PF.fn.is_user_logged()){var c=r.length>0?"album":"stream";$("[data-group=user-"+c+"]",this.selectors.root).show()}}}if(this.boxSizer(),this.queueStatus="done",window.opener&&void 0!==CHV.obj.opener.uploadPlugin[window.name]){if($('[data-action="copy"]',this.selectors.root).remove(),CHV.obj.opener.uploadPlugin[window.name].hasOwnProperty("autoInsert")&&CHV.obj.opener.uploadPlugin[window.name].autoInsert){var u=$(':input[name="'+CHV.obj.opener.uploadPlugin[window.name].autoInsert+'"]',CHV.fn.uploader.selectors.root),m=u.val();if(m)return window.opener.postMessage({id:window.name,message:m},"*"),void window.close()}}else $('[data-action="openerPostMessage"]',this.selectors.root).remove()}},$.extend(CHV.fn.uploader,$.extend(!0,{},CHV.obj.uploaderReset)),CHV.fn.fillEmbedCodes=function(e,t,a){void 0===a&&(a="val");var o=CHV.fn.uploader.selectors.root==t?"embed_upload_tpl":"embed_share_tpl",i=!1,n=!1,r=!1;$.each(e,function(e,s){if(void 0===s)return;var l="id_encoded"in s?s:s.image,d=Object.flatten(l);let c=""!==l.url_frame,u=null!==l.medium.url,m=null!==l.thumb.url;c&&(i=!0),u&&(n=!0),m&&(r=!0),$.each(CHV.obj[o],function(e,o){$.each(o.options,function(e,o){if(!c&&e.startsWith("frame-"))return;if(!u&&e.startsWith("medium-"))return;if(!m&&e.startsWith("thumb-"))return;var i=$("textarea[name="+e+"]",t),n=o.template;for(var r in"object"==typeof n&&n.hasOwnProperty(d.type)&&(n=n[d.type]),"video"!==d.type&&(n=n.replaceAll("%URL_FRAME%","")),d)d.hasOwnProperty(r)&&(n=n.replace(new RegExp("%"+r.toUpperCase()+"%","g"),PF.fn.htmlEncode(PF.fn.htmlEncode(d[r]))));let s="thumb"==i.data("size")&&"thumb-links"!==e;i[a](i.val()+n+(s?" ":"\n"))})})}),$("option[value^=frame]",t).prop("disabled",!i),$("option[value^=medium-]",t).prop("disabled",!n),$("option[value^=thumb-]",t).prop("disabled",!r),$.each(CHV.obj[o],function(e,o){$.each(o.options,function(e,o){var i=$("textarea[name="+e+"]",t);i[a]($.trim(i.val()))})})},CHV.fn.resource_privacy_toggle=function(e){CHV.obj.resource.privacy=e,e||(e="public"),$("[data-content=privacy-private]").hide(),"public"!==e&&$("[data-content=privacy-private]").show()},CHV.fn.submit_create_album=function(){var e=$(PF.obj.modal.selectors.root);return""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):(PF.obj.modal.form_data={action:"create-album",type:"album",album:{parent_id:$("[name=form-album-parent-id]",e).val(),name:$("[name=form-album-name]",e).val(),description:$("[name=form-album-description]",e).val(),privacy:$("[name=form-privacy]",e).val(),password:"password"==$("[name=form-privacy]",e).val()?$("[name=form-album-password]",e).val():null,new:!0}},!0)},CHV.fn.complete_create_album={success:function(e){var t=e.responseJSON.album;window.location=t.url},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}},CHV.fn.submit_upload_edit=function(){var e=$(PF.obj.modal.selectors.root),t=!1;return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.obj.modal.form_data={action:t?"create-album":"move",type:"images",album:{ids:$.map(CHV.fn.uploader.results.success,function(e){return e.image.id_encoded}),new:t}},t?(PF.obj.modal.form_data.album.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.album.description=$("[name=form-album-description]",e).val(),PF.obj.modal.form_data.album.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.album.privacy&&(PF.obj.modal.form_data.album.password=$("[name=form-album-password]",e).val())):PF.obj.modal.form_data.album.id=$("[name=form-album-id]",e).val(),!0)},CHV.fn.complete_upload_edit={success:function(e){var t=e.responseJSON.album;window.location=t.url},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}},CHV.fn.before_image_edit=function(){var e=$("[data-ajax-deferred='CHV.fn.complete_image_edit']");$("[data-content=form-new-album]",e).hide(),$("#move-existing-album",e).show()},CHV.fn.submit_image_edit=function(){var e=$(PF.obj.modal.selectors.root),t=!1;return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.obj.modal.form_data={action:"edit",edit:"image",editing:{id:CHV.obj.resource.id,category_id:$("[name=form-category-id]",e).val()||null,title:$("[name=form-image-title]",e).val()||null,description:$("[name=form-image-description]",e).val()||null,nsfw:$("[name=form-nsfw]",e).prop("checked")?1:0,new_album:t}},t?(PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0)},CHV.fn.complete_image_edit={success:function(e){var t=e.responseJSON.image;if(t.album.id_encoded||(t.album.id_encoded=""),CHV.obj.image_viewer.album.id_encoded!==t.album.id_encoded){CHV.obj.image_viewer.album.id_encoded=t.album.id_encoded;var a={html:t.album.slice&&t.album.slice.html?t.album.slice.html:null,prev:t.album.slice&&t.album.slice.prev?t.album.slice.prev:null,next:t.album.slice&&t.album.slice.next?t.album.slice.next:null};$("[data-content=album-slice]").html(a.html),$("[data-content=album-panel-title]")[a.html?"show":"hide"](),$("a[data-action=prev]").attr("href",a.prev),$("a[data-action=next]").attr("href",a.next),$("a[data-action]",".image-viewer-navigation").each(function(){$(this)[void 0===$(this).attr("href")?"addClass":"removeClass"]("hidden")})}CHV.fn.resource_privacy_toggle(t.album.privacy),$.each(["description","title"],function(e,a){var o=$("[data-text=image-"+a+"]");o.html(PF.fn.nl2br(PF.fn.htmlEncode(t[a]))),""!==o.html()&&o.show()}),CHV.fn.common.updateDoctitle(t.title),PF.fn.growl.expirable(PF.fn._s("File edited successfully.")),CHV.fn.list_editor.addAlbumtoModals(t.album);var o=$("[data-submit-fn='CHV.fn.submit_image_edit']");$.each(["description","name","password"],function(e,t){var a=$("[name=form-album-"+t+"]",o);a.is("textarea")?a.val("").html(""):a.val("").attr("value","")}),$("[name=form-privacy] option",o).each(function(){$(this).removeAttr("selected")}),$("[data-combo-value=password]",o).hide(),$("[name=form-album-id]",o).find("option").removeAttr("selected"),$("[name=form-album-id]",o).find("[value="+t.album.id_encoded+"]").attr("selected",!0)}},CHV.fn.albumEdit={before:function(){var e="[data-before-fn='CHV.fn.albumEdit.before']";$("[data-action=album-switch]",e).remove();var t=$(CHV.fn.ctaForm.selectors.enable,e);CHV.fn.ctaForm.destroy(),CHV.fn.ctaForm.enable&&t.prop("checked",!0).trigger("change")},load:function(){var e=$(CHV.fn.ctaForm.selectors.enable,PF.obj.modal.selectors.root);e.is(":checked")&&e.prop("checked",!0).trigger("change")},submit:function(){var e=$(PF.obj.modal.selectors.root);return $("[name=form-album-name]",e).val()?(PF.obj.modal.form_data={action:"edit",edit:"album",editing:{id:CHV.obj.resource.id,name:$("[name=form-album-name]",e).val(),privacy:$("[name=form-privacy]",e).val(),description:$("[name=form-album-description]",e).val(),cta_enable:+CHV.fn.ctaForm.enable,cta:JSON.stringify(CHV.fn.ctaForm.array)}},"password"==PF.obj.modal.form_data.editing.privacy&&(PF.obj.modal.form_data.editing.password=$("[name=form-album-password]",e).val()),!0):(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1)},complete:{success:function(e){var t=e.responseJSON.album;$("[data-text=album-name]").html(PF.fn.htmlEncode(t.name)),$("[data-text=album-description]").html(PF.fn.htmlEncode(t.description)),CHV.fn.resource_privacy_toggle(t.privacy);var a=CHV.obj.resource.type;CHV.obj.resource.type=null,CHV.fn.list_editor.updateItem($(PF.obj.listing.selectors.list_item,PF.obj.listing.selectors.content_listing_visible),e.responseJSON),CHV.obj.resource.type=a,$("[data-modal]").each(function(){$("option[value="+t.id_encoded+"]",this).text(t.name+("public"!==t.privacy?" ("+PF.fn._s("private")+")":""))}),CHV.fn.common.updateDoctitle(t.name),CHV.fn.ctaButtons.render(t.cta_html),PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},CHV.fn.category={formFields:["id","name","url_key","description"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1;return!!CHV.fn.common.validateForm(t)&&(!1===/^[-\w]+$/.test($("[name=form-category-url_key]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid URL key.")),$("[name=form-category-url_key]",t).highlight(),!1):(Object.size(CHV.obj.categories)>0&&$.each(CHV.obj.categories,function(o,i){return void 0!==e&&i.id==e||(i.url_key==$("[name=form-category-url_key]",t).val()?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("Category URL key already being used.")),$("[name=form-category-url_key]",t).highlight(),!1)))},edit:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.category.formFields,function(e,t){e="form-category-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-category-id]",e).val();return!!CHV.fn.category.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"category",editing:{}},$.each(CHV.fn.category.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-category-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=category][data-category-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=category-"+e+"]",a).html(PF.fn.htmlEncode(t))}),$("[data-link=category-url]").attr("href",t.url),CHV.obj.categories[t.id]=t,PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},delete:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",'"'+o.name+'"'))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"category",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("Category successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=category][data-category-id="+t+"]").remove(),delete CHV.obj.categories[t]}}},add:{submit:function(){var e=PF.obj.modal.selectors.root -;return!!CHV.fn.category.validateForm()&&(PF.obj.modal.form_data={action:"add-category",category:{}},$.each(CHV.fn.category.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.category[a]=$("[name=form-category-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=dashboard-categories-list]",o=$("[data-content=category-dashboard-template]").html();$.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o),0==Object.size(CHV.obj.categories)&&(CHV.obj.categories={}),CHV.obj.categories[t.id]=t,PF.fn.growl.call(PF.fn._s("Category %s added.",'"'+t.name+'"'))}}}},CHV.fn.ip_ban={formFields:["id","ip","expires","message"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1,o=$("[name=form-ip_ban-ip]",t).val();return!!CHV.fn.common.validateForm(t)&&(""!==$("[name=form-ip_ban-expires]",t).val()&&0==/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test($("[name=form-ip_ban-expires]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid expiration date.")),$("[name=form-ip_ban-expires]",t).highlight(),!1):(Object.size(CHV.obj.ip_bans)>0&&$.each(CHV.obj.ip_bans,function(t,i){return void 0!==e&&i.id==e||(i.ip==o?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("IP %s already banned.",o)),$("[name=form-ip_ban-ip]",t).highlight(),!1)))},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.ip_ban.validateForm()&&(PF.obj.modal.form_data={action:"add-ip_ban",ip_ban:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.ip_ban[a]=$("[name=form-ip_ban-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=dashboard-ip_bans-list]",o=$("[data-content=ip_ban-dashboard-template]").html();void 0!==o&&($.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o)),0==Object.size(CHV.obj.ip_bans)&&(CHV.obj.ip_bans={}),CHV.obj.ip_bans[t.id]=t,$("[data-content=ban_ip]").addClass("hidden"),$("[data-content=banned_ip]").removeClass("hidden"),PF.fn.growl.call(PF.fn._s("IP %s banned.",t.ip))},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},edit:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.ip_ban.formFields,function(e,t){e="form-ip_ban-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-ip_ban-id]",e).val();return!!CHV.fn.ip_ban.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"ip_ban",editing:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-ip_ban-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=ip_ban][data-ip_ban-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=ip_ban-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.ip_bans[t.id]=t},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},delete:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",o.ip))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"ip_ban",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("IP ban successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=ip_ban][data-ip_ban-id="+t+"]").remove(),delete CHV.obj.ip_bans[t]}}}},CHV.fn.storage={formFields:["id","name","api_id","bucket","server","service","capacity","region","key","secret","url","account_id","account_name","type_chain"],chain:["other","document","audio","video","image"],calling:!1,validateForm:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-storage-id]",e).val(),a=!0;if($.each($(":input",e),function(e,t){$(this).is(":hidden")?$(this).attr("required")&&$(this).removeAttr("required").attr("data-required",1):1==$(this).attr("data-required")&&$(this).attr("required","required"),$(this).is(":visible")&&""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),a=!1)}),!a)return PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1;var o,i=$("[name=form-storage-capacity]",e),n=i.val();return""!==n&&(0==/^[\d\.]+\s*[A-Za-z]{2}$/.test(n)||void 0===n.getBytes()?o=PF.fn._s("Invalid storage capacity value. Make sure to use a valid format."):void 0!==CHV.obj.storages[t]&&n.getBytes()0&&(t=String(t).formatBytes(2)),s.attr("value",t)),"form-storage-type_chain"===e){let e=(parseInt(t)>>>0).toString(2).paddingLeft("0".repeat(CHV.fn.storage.chain.length)).split("");CHV.fn.storage.chain.forEach(function(t,a){$("#storage_type_enable_"+t,i).removeAttr("checked").attr("checked",1==e[a])})}}),$("[data-combo-value]").addClass("soft-hidden"),$(n).removeClass("soft-hidden")},submit:function(){var e=PF.obj.modal.selectors.root;$("[name=form-storage-id]",e).val();if(!CHV.fn.storage.validateForm())return!1;PF.obj.modal.form_data={action:"edit",edit:"storage",editing:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.editing[a]=$(o,e).val()});let t=CHV.fn.storage.chain.map(function(t){return $("#storage_type_enable_"+t,e).prop("checked")?1:0});return PF.obj.modal.form_data.editing.type_chain=parseInt(t.join(""),2),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=storage][data-storage-id="+t.id+"]",o=$("[data-action=toggle-storage-https]",a);$.each(t,function(e,t){$("[data-content=storage-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.storages[t.id]=t,CHV.fn.storage.toggleBoolDisplay(o,1==t.is_https)},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},add:{submit:function(){if(!CHV.fn.storage.validateForm())return!1;var e=PF.obj.modal.selectors.root;return PF.obj.modal.form_data={action:"add-storage",storage:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;"id"!=a&&(o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.storage[a]=$(o,e).val())}),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=dashboard-storages-list]",o=$("[data-content=storage-dashboard-template]").html();$.each(t,function(e,t){var a=e.toUpperCase();if("is_https"==e||"is_active"==e)t=CHV.obj.storageTemplate.icon.replace("%TITLE%",CHV.obj.storageTemplate.messages[e]).replace("%ICON%",CHV.obj.storageTemplate.checkboxes[t]).replace("%PROP%",e.replace("is_",""));o=o.replace(new RegExp("%"+a+"%","g"),t||"")}),$(a).append(o),PF.fn.bindtipTip($("[data-storage-id="+t.id+"]")),0==CHV.obj.storages.length&&(CHV.obj.storages={}),CHV.obj.storages[t.id]=t},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},toggleBoolDisplay:function(e,t){var a={0:e.data("unchecked-icon"),1:e.data("checked-icon")};e.removeClass(a[0]+" "+a[1]).addClass(a[t?1:0])}},CHV.fn.common={validateForm:function(e){if(void 0===e)e=PF.obj.modal.selectors.root;var t=!0;return $.each($(":input:visible",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),!!t||(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},updateDoctitle:function(e){void 0!==CHV.obj.page_info&&(CHV.obj.page_info.pre_doctitle=e,CHV.obj.page_info.doctitle=CHV.obj.page_info.pre_doctitle+CHV.obj.page_info.pos_doctitle,document.title=CHV.obj.page_info.doctitle)}},CHV.fn.user={add:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"add-user",user:{username:$("[name=form-username]",e).val(),email:$("[name=form-email]",e).val(),password:$("[name=form-password]",e).val(),role:$("[name=form-role]",e).val()}},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){e.responseJSON;PF.fn.growl.expirable(PF.fn._s("%s added successfully.",PF.fn._n("User","Users",1)))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}},delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"user",owner:CHV.obj.resource.user.id,deleting:CHV.obj.resource.user},!0}},ban:{submit:function(){return PF.obj.modal.form_data={action:"ban",ban:"user",banning:CHV.obj.resource.user.id},!0},success:function(){}}},CHV.fn.submit_resource_approve=function(){return PF.obj.modal.form_data={action:"approve",approve:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,approving:CHV.obj.resource},!0},CHV.fn.complete_resource_approve={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){redir=CHV.obj.resource.url,window.location=redir})}},CHV.fn.submit_resource_delete=function(){return PF.obj.modal.form_data={action:"delete",delete:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,deleting:CHV.obj.resource},!0},CHV.fn.complete_resource_delete={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){var e;e="album"==CHV.obj.resource.type||"image"==CHV.obj.resource.type?CHV.obj.resource.parent_url:CHV.obj.resource.user?CHV.obj.resource.user.url:CHV.obj.resource.url,void 0!==e&&(window.location=e.replace(/\/?$/,"/")+"?deleted")})}},CHV.fn.list_editor={blink:function(e){e.addClass("ui-selecting"),setTimeout(function(){e.removeClass("ui-selecting")},200)},selectionCount:function(){var e=$(PF.obj.listing.selectors.content_listing);e.each(function(){var t=$("[data-content=pop-selection]","[data-content=list-selection][data-tab="+$(this).attr("id")+"]"),a=$(PF.obj.listing.selectors.list_item+".selected",this).length;if(all_count=$(PF.obj.listing.selectors.list_item,this).length,t.toggleClass("disabled",0==a),$("[data-text=selection-count]",t).text(a>0?a:""),"images"==e.data("list")&&a>0){var o=$(PF.obj.listing.selectors.list_item+".selected[data-flag=safe]",this).length>0,i=$(PF.obj.listing.selectors.list_item+".selected[data-flag=unsafe]",this).length>0;$("[data-action=flag-safe]",t)[(i?"remove":"add")+"Class"]("hidden"),$("[data-action=flag-unsafe]",t)[(o?"remove":"add")+"Class"]("hidden")}$(this).is(":visible")&&($("body").toggleClass("--has-selection",a>0),CHV.fn.list_editor.listMassActionSet(all_count==a?"clear":"select"))})},removeFromList:function(e,t){if(void 0!==e){e=e instanceof jQuery==0?$(e):e;var a=$(PF.obj.listing.selectors.content_listing_visible),o=e.length;e.fadeOut("fast");var i=e.first().data("type"),n=parseInt($("[data-text="+i+"-count]").text())-o;CHV.fn.list_editor.updateUserCounters(e.first().data("type"),o,"-"),e.promise().done(function(){$(document).removeClass(CHV.fn.listingViewer.selectors.bodyShown.substr(1));var i={};if(e.each(function(){$("[data-id="+$(this).data("id")+"]").each(function(){var e=$(this).closest(PF.obj.listing.selectors.content_listing).attr("id");i[e]||(i[e]=0),i[e]+=1})}),1==o?$("[data-id="+$(this).data("id")+"]").remove():e.each(function(){$("[data-id="+$(this).data("id")+"]").remove()}),PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(),CHV.fn.list_editor.selectionCount(),void 0!==t&&"string"==typeof t&&PF.fn.growl.expirable(t),$(PF.obj.listing.selectors.content_listing_pagination,a).exists()||0!=$(PF.obj.listing.selectors.list_item,a).length||(n=0),0==n)a.html(PF.obj.listing.template.empty),$(PF.obj.listing.selectors.content_listing+":not("+PF.obj.listing.selectors.content_listing_visible+")").data({empty:null,load:"ajax"}),$("[data-content=list-selection][data-tab="+a.attr("id")+"]").addClass("disabled");else if(0==$(PF.obj.listing.selectors.list_item,a).length){if($(PF.obj.listing.selectors.pad_content).height(0),$("[data-action=load-more]",a).exists())return $(PF.obj.listing.selectors.content_listing_visible).data("page",0),$("[data-action=load-more]",a).click(),void(PF.obj.listing.recolumnize=!0);var r=$("[data-pagination=next]",a);if(r.exists()){var s=r.attr("href"),l=PF.fn.deparam(s);return"page"in l&&l.page>1&&(s=s.changeURLParameterValue("page",l.page-1)),void(window.location=s)}}})}},deleteFromList:function(e){if(void 0===t)var t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been deleted."):null)},moveFromList:function(e,t){if(void 0===t)t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been moved."):null)},toggleSelectItem:function(e,t){if("boolean"!=typeof t)t=!e.hasClass("selected");var a,o,i,n=$(".viewer").is(":visible")?$("[data-type=image][data-id="+e.attr("data-id")+"]"):e,r=$("[data-action=select] .btn-icon",n);n.hasClass("unselect")||(n.addClass("unselect"),t?(Boolean(window.navigator.vibrate)&&window.navigator.vibrate([15,125,25]),n.addClass("selected"),a=r.data("icon-selected"),o=r.data("icon-unselected"),i=PF.fn._s("Unselect")):(n.removeClass("selected ui-selected"),a=r.data("icon-unselected"),o=r.data("icon-selected"),i=PF.fn._s("Select")),r.removeClass(o).addClass(a),setTimeout(function(){n.removeClass("unselect")},350),$("[data-action=select] .label",n).text(i),CHV.fn.list_editor.selectionCount())},selectItem:function(e){this.toggleSelectItem(e,!0)},unselectItem:function(e){this.toggleSelectItem(e,!1),e.removeClass("selected")},selectAll:function(e){this.selectItem($(PF.obj.listing.selectors.list_item+":visible:not(.selected)")),this.listMassActionSet("clear"),e.stopPropagation()},clearSelection:function(e){var t=$(PF.obj.listing.selectors.list_item+".selected",PF.obj.listing.selectors[e?"content_listing":"content_listing_visible"]);this.unselectItem(t),this.listMassActionSet("select")},listMassActionSet:function(e){var t="select"==e?"clear":"select",a=$("[data-text-select-all][data-action=list-"+t+"-all]:visible"),o=a.data("text-"+e+"-all");a.text(o).attr("data-action","list-"+e+"-all"),PF.fn.close_pops()},updateItem:function(e,t,a,o){if(e instanceof jQuery==0)e=$(e);var i=e.data("type"),n="image"==i?t.album:t;if(this.addAlbumtoModals(n),$("option[value="+n.id_encoded+"]","[name=form-album-id]").html(PF.fn.htmlEncode(n.name_with_privacy_readable_html)),void 0===a)a="edit";if("edit"==a||"move"==a){if("move"==a&&"album"==CHV.obj.resource.type)return void CHV.fn.list_editor.moveFromList(e,o);e.attr("data-description",t.description),"image"==i?(void 0!==t.title&&(e.attr("data-title",t.title),e.find("[title]").attr("title",t.title),$("[data-text=image-title]",e).text(PF.fn.htmlEncode(t.title))),void 0!==t.title_truncated&&$("[data-text=image-title-truncated]",e).html(PF.fn.htmlEncode(t.title_truncated)),void 0!==t.category_id&&e.attr("data-category-id",t.category_id),e.attr({"data-album-id":n.id_encoded,"data-flag":1==t.nsfw?"unsafe":"safe"}),$("[data-content=album-link]",e).attr("href",n.url)):e.attr({"data-privacy":n.privacy,"data-password":n.password,"data-name":n.name}),e.attr("data-privacy",n.privacy),$("[data-text=album-name]",e).html(PF.fn.htmlEncode(n.name)),PF.fn.growl.expirable("edit"==a?PF.fn._s("The content has been edited."):PF.fn._s("The content has been moved."))}},addAlbumtoModals:function(e){var t=!1;$("[name=form-album-id]","[data-modal]").each(function(){e.id_encoded&&!$("option[value="+e.id_encoded+"]",this).exists()&&($(this).append('"),t=!0)}),t&&CHV.fn.list_editor.updateUserCounters("album",1,"+")},updateAlbum:function(e){$("[data-id="+e.id_encoded+"]").each(function(){""!==e.html&&($(this).after(e.html),$(this).remove())})},updateUserCounters:function(e,t,a){if(void 0===a)a="+";var o,i,n=$("[data-text="+e+"-count]"),r=$("[data-text="+e+"-label]"),s=(t=parseInt(t),parseInt(n.html()));switch(a){case"+":o=s+t;break;case"-":o=s-t;break;case"=":o=t}i=o-s;var l=$("[data-text=total-"+n.data("text")+"]"),d=$("[data-text="+l.data("text")+"-label]"),c=parseInt(l.html()),u=c+i;n.text(o),l.text(u),r.text(r.data(1==o?"label-single":"label-plural")),d.text(r.data(1==u?"label-single":"label-plural"))},updateMoveItemLists:function(e,t,a){if(CHV.fn.list_editor.clearSelection(),/image/.test(t))"image"==t?CHV.fn.list_editor.updateItem("[data-type=image][data-id="+a.data("id")+"]",e.image,"move"):(a.each(function(){CHV.fn.list_editor.updateItem("[data-type=image][data-id="+$(this).data("id")+"]",e,"move",!1)}),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")));else{if(CHV.fn.list_editor.moveFromList(a,!1),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")),e.album)if(void 0!==e.albums_old?"true"==e.request.album.new:"true"==e.request.editing.new_album){CHV.fn.list_editor.addAlbumtoModals(e.album);var o=parseInt($("[data-text=album-count]").text())-1;$(PF.obj.listing.selectors.pad_content).each(function(){var t=$(this).find(PF.obj.listing.selectors.list_item).length;if(0!=t){var a=PF.fn.deparam($(this).closest(PF.obj.listing.selectors.content_listing).data("params"));"date_desc"!=a.sort&&o!=t||$(this)["date_desc"==a.sort?"prepend":"append"](e.album.html)}})}else CHV.fn.list_editor.updateAlbum(e.album);PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(0)}}},CHV.fn.import={errorHandler:function(e){PF.fn.growl.call(e.error.message)},reset:function(e){e=parseInt(e);CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importReset",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}})},updateStats:function(e){e=parseInt(e);"readyState"in CHV.obj.import.working[e].stats&&4!=CHV.obj.import.working[e].stats.readyState?console.error("Aborting stats timeout call (previous call is still not ready)"):(CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importStats",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}}))},delete:{submit:function(e){return PF.obj.modal.form_data={action:"importDelete",id:e},!0},deferred:{success:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s("Import ID %s removed",t.import.id)),$("[data-id="+t.import.id+"]",CHV.obj.import.sel.root).remove(),1==$("li",CHV.obj.import.sel.root).size()&&$(CHV.obj.import.sel.root).addClass("hidden")},error:function(e){CHV.fn.import.errorHandler(e.responseJSON)}}},parseTemplate:function(e,t){var a=CHV.obj.import.rowTpl;for(var o in CHV.obj.import.importTr)void 0!==e[o]&&(a=a.replaceAll("%"+o+"%",e[o]));a=a.replaceAll("%parse%",e.options.root),a=a.replaceAll("%shortParse%",e.options.root.charAt(0)),a=a.replaceAll("%displayStatus%",CHV.obj.import.statusesDisplay[e.status]);var i=$($.parseHTML(a)).attr("data-object",JSON.stringify(e));return i}},CHV.fn.Palettes={timeout:{},get:function(){return($("html").get(0).className.match(/(^|\s)palette-\S+/g)||[]).join(" ")},set:function(e){$("html").attr("data-palette",e).removeClass(this.get()).addClass("palette-"+e)},preview:function(e){$("html").removeClass(this.get()).addClass("palette-"+e)},save:function(){clearTimeout(this.timeout),this.timeout=setTimeout(function(){$.ajax({type:"POST",data:{action:"paletteSet",palette_id:CHV.obj.config.palettesId[$("html").attr("data-palette")]},cache:!1})},400)}},CHV.fn.license={set:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"set-license-key",key:$("[name=chevereto-license-key]",e).val()},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){let t=e.responseJSON,a=$("[data-action=upgrade]");if("free"===CHV.obj.system_info.edition)return a.removeClass("hidden"),void a.trigger("click");PF.fn.growl.call(PF.fn._s(t.success.message))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}}}; \ No newline at end of file +}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),$(document).on("change","[data-content=user-background-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$("[data-content=user-background-cover]"),o=$("[data-content=user-background-cover-src]"),i=$(".loading-placeholder",a),n=($("#top-bar"),$(this)[0].files[0]);if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.background_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.background_max_filesize));else{i.removeClass("hidden"),PF.fn.loading.inline(i,{center:!0,size:"big",color:"#FFF"}),t.data("uploading",!0);var r=new FormData;r.append("source",n),r.append("action","upload"),r.append("type","file"),r.append("what","background"),r.append("owner",CHV.obj.resource.user.id),r.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(r),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;if(200==this.status){var r=$("");r.attr("src",n.url).imagesLoaded(function(){i.addClass("hidden").empty(),o.css("background-image","url("+n.url+")").hide().fadeIn(),$("[data-content=user-change-background]",a).removeClass("hidden"),$(a).removeClass("no-background"),$(".top-user").removeClass("no-background"),$("[data-content=user-upload-background]").hide(),$("[data-content=user-change-background]").show(),PF.fn.growl.expirable(PF.fn._s("Profile background image updated.")),r.remove()})}else i.addClass("hidden").empty(),PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."));t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),CHV.fn.user_background={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"background",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){$("[data-content=user-background-cover-src]").css("background-image","none"),$("[data-content=user-background-cover], .top-user").addClass("no-background"),$("[data-content=user-background-cover]").height(""),$("[data-content=user-upload-background]").removeClass("hidden").show(),$("[data-content=user-change-background]").hide()},done:function(e){PF.fn.modal.close(function(){PF.fn.growl.expirable(PF.fn._s("Profile background image deleted."))})}},error:function(e){PF.fn.growl.expirable(PF.fn._s("Error deleting profile background image."))}}}},CHV.fn.user_api={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"api_key",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.fn.user_two_factor={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"two_factor",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.str.mainform="[data-content=main-form]",CHV.obj.timezone={selector:"[data-content=timezone]",input:"#timezone-region"},$(document).on("keyup change",CHV.str.mainform+" :input",function(){$(this).is("[name=username]")&&$("[data-text=username]").text($(this).val())}),$(document).on("change",CHV.obj.timezone.input,function(){var e=$(this).val(),t=$("#timezone-combo-"+e);t.find("option:first").prop("selected",!0),$(CHV.obj.timezone.selector).val(t.val()).change()}),$(document).on("change","[id^=timezone-combo-]",function(){var e=$(this).val();$(CHV.obj.timezone.selector).val(e).change()}),$(document).on("keyup change blur","[name^=new-password]",function(){var e=$("[name=new-password]"),t=$("[name=new-password-confirm]"),a=e.val()==t.val(),o=t.closest(".input-password").find(".input-warning");0==o.exists()&&(o=$("[data-message=new-password-confirm]")),$(this).is(t)&&t.data("touched",!0),t.data("touched")&&o.text(a?"":o.data("text"))[a?"addClass":"removeClass"]("hidden-visibility")}),$(document).on("submit",CHV.obj.mainform,function(){switch($(this).data("type")){case"password":var e=$("[name=new-password]",this),t=$("[name=new-password-confirm]",this);if((""!==e.val()||""!==t.val())&&e.val()!==t.val())return e.highlight(),t.highlight(),PF.fn.growl.expirable(PF.fn._s("Passwords don't match")),!1}}),$(document).on("click","[data-action=check-for-updates]",function(){PF.fn.loading.fullscreen(),CHV.fn.system.checkUpdates(function(e){if(PF.fn.loading.destroy("fullscreen"),200===e.status){var t=e.responseJSON.software;if(-1==PF.fn.versionCompare(CHV.obj.system_info.version,t.current_version)){let e=CHV.obj.system_info.version.split("."),a=e[0],o=a+"."+e[1],i="_self",n=PF.obj.config.base_url+"dashboard/upgrade/?auth_token="+PF.obj.config.auth_token,r=PF.fn._s("Upgrade"),s="fas fa-download";"docker"===CHV.obj.system_info.servicing&&(i="_blank",n="https://v4-docs.chevereto.com/guides/docker/#upgrading",r=PF.fn._s("Instructions"),s="fa-brands fa-docker"),PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s available",t.current_version),message:"

    "+PF.fn._s("There is a new Chevereto version available with the following release notes.")+" "+PF.fn._s("Check %s for a complete changelog since you last upgrade.",''+CHV.obj.system_info.version+'')+'

    "+PF.fn._s("Check the %s for alternative update methods.",''+PF.fn._s("documentation")+"")+'

    ",html:!0})}else PF.fn.growl.call(PF.fn._s("This website is running latest %s version",CHEVERETO.edition))}else PF.fn.growl.call(PF.fn._s("An error occurred. Please try again later."))})}),void 0!==PF.fn.get_url_var("checkUpdates")&&$("[data-action=check-for-updates]").trigger("click"),void 0!==PF.fn.get_url_var("upgrade")&&$("[data-action=upgrade]").trigger("click"),void 0!==PF.fn.get_url_var("license")&&$("[data-action='license']").trigger("click"),void 0!==PF.fn.get_url_var("welcome")&&PF.fn.modal.call({template:$("[data-modal=welcome]").html(),buttons:!1}),void 0!==PF.fn.get_url_var("installed")&&PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s installed",CHV.obj.system_info.version),message:"

    "+PF.fn._s('Usage of Chevereto Software must be in compliance with the software license terms known as "The Chevereto License".')+'

    ",html:!0}),$(document).on("click","[data-action=system-update]",function(e){if(!$("input#system-update").prop("checked"))return PF.fn.growl.call(PF.fn._s("Please review the system requirements before proceeding")),void e.preventDefault()}),$(document).on("click","[data-action=toggle-storage-https]",function(){CHV.fn.storage.toggleHttps($(this).closest("[data-content=storage]").data("storage-id"))}),$(document).on("click","[data-action=toggle-storage-active]",function(){CHV.fn.storage.toggleActive($(this).closest("[data-content=storage]").data("storage-id"))}),$(CHV.fn.uploader.selectors.root).exists()&&(CHV.fn.uploader.$pasteCatcher=$("
    ",{contenteditable:"true",id:CHV.fn.uploader.selectors.paste.replace(/#/,"")}),$("body").append(CHV.fn.uploader.$pasteCatcher),$(document).on("keydown",function(e){!e.ctrlKey&&!e.metaKey||"KeyV"!=e.originalEvent.code||$(e.target).is(":input")||(PF.fn.keyFeedback.spawn(e),CHV.fn.uploader.$pasteCatcher.focus(e))}),document.addEventListener("dragover",function(e){e.preventDefault()}),document.addEventListener("drop",function(e){if(CHV.obj.config.upload.url){e.preventDefault();var t,a=e.dataTransfer.getData("text/html"),o=/src="?([^"\s]+)"?\s*/;t=o.exec(a),t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t[1]))}}),window.addEventListener("paste",CHV.fn.uploader.pasteImageHandler)),$(document).on("click","[data-action=like]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-liked]")?$(this):$(this).closest("[data-liked]"),a=!t.closest("[data-list], .viewer").exists()&&void 0!==CHV.obj.resource,o=t.is("[data-liked=1]"),i=o?"dislike":"like",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").attr("data-id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").attr("data-type")},r=a?e:$("[data-type="+n.type+"][data-id="+n.id+"]"),s={type:"POST",data:{action:i},cache:!1};s.data[i]={object:n.type,id:n.id},$.ajax(s).complete(function(t){var i=t.responseJSON;e.data("XHR",!1),200===i.status_code?(a&&void 0!==i.content&&$("[data-text=likes-count]").html(i.content.likes),r.closest("[data-liked]").attr("data-liked",o?0:1)):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else window.location.href=CHV.obj.vars.urls.login}),$(document).on("click","[data-action=album-cover]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-cover]")?$(this):$(this).closest("[data-cover]"),a=t.is("[data-cover=1]"),o=a?"album-cover-unset":"album-cover-set",i=(CHV.obj.resource.id,e.closest("[data-cover]")),n={type:"POST",data:{action:o},cache:!1};n.data[o]={album_id:i.data("album-id"),image_id:i.data("id")},$.ajax(n).complete(function(t){var o=t.responseJSON;e.data("XHR",!1),200===o.status_code?i.attr("data-cover",a?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=follow]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-followed]")?$(this):$(this).closest("[data-followed]"),a=void 0!==CHV.obj.resource,o=t.is("[data-followed=1]"),i=o?"unfollow":"follow",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},r={type:"POST",data:{action:i},cache:!1};r.data[i]={object:n.type,id:n.id},$.ajax(r).complete(function(i){var n=i.responseJSON;if(e.data("XHR",!1),200===n.status_code){if(a&&void 0!==n.user_followed){var r=$("[data-text=followers-label]"),s={single:r.data("label-single"),plural:r.data("label-plural")};$("[data-text=followers-count]").html(n.user_followed.followers),r.html(PF.fn._n(s.single,s.plural,n.user_followed.followers))}t.attr("data-followed",o?0:1)}else PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else PF.fn.modal.call({type:"login"})}),$(document).on("click","[data-action=user_ban],[data-action=user_unban]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).closest("[data-banned]"),a=!0,o=t.is("[data-banned=1]"),i=e.attr("data-action"),n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},r={type:"POST",data:{action:i},cache:!1};r.data[i]={user_id:n.id},$.ajax(r).complete(function(a){var i=a.responseJSON;e.data("XHR",!1),200===i.status_code?t.attr("data-banned",o?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=top-bar-notifications]",function(e){var a=this,o=$(this),i=$(".top-bar-notifications-container",o),n=$(".top-bar-notifications-list",o),r=$("ul",n),s=$(".loading",i);o.data("XHR")||(s.removeClass("hidden"),PF.fn.loading.inline(s,{size:"small",message:PF.fn._s("loading")}),$.ajax({type:"POST",data:{action:"notifications"},cache:!1}).complete(function(e){var l=e.responseJSON;if(200!==l.status_code)return PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),o.data("XHR",!1),void s.addClass("hidden").html("");if(o.data("XHR",!0),s.remove(),l.html){n.removeClass("hidden"),r.html(l.html),t();var d=$("li.new",r);d.addClass("transition"),setTimeout(function(){d.removeClass("new"),$("[data-content=notifications-counter]",a).removeClass("on").html("0"),setTimeout(function(){d.removeClass("transition")},150)},1500)}else $(".empty",i).removeClass("hidden")}))}),$("#g-recaptcha").is(":empty")&&CHV.obj.config.captcha.enabled&&CHV.obj.config.captcha.sitekey&&("3"!=CHV.obj.config.captcha.version&&CHV.obj.config.captcha.isNeeded||$('label[for="recaptcha_response_field"]').remove()),$(document).on("click",PF.obj.listing.selectors.list_item+" a.image-container",function(e){var t=$(this).closest(PF.obj.listing.selectors.list_item),o=t.find("[data-action=load-image]");o.length>0&&(a(o),e.preventDefault())}),$(document).on("click",PF.obj.listing.selectors.list_item+" [data-action=load-image]",function(e){a($(this)),e.preventDefault(),e.stopPropagation()}),$(document).on("click","#album [data-tab=tab-embeds]",function(e){e.preventDefault,CHV.fn.album.showEmbedCodes()}),$("body").is("#upload")&&CHV.fn.uploader.toggle({show:!0}),$(document).on("keyup",function(e){if(!($(e.target).is(":input")||e.ctrlKey||e.metaKey||e.altKey)){var t=$("#fullscreen-modal:visible").exists(),a=$(".viewer"),o=$(".list-selection:visible"),i=o.find("[data-content=pop-selection]:visible:not(.disabled)"),n=$("body").hasClass("--viewer-shown"),r=$(CHV.fn.uploader.selectors.root+CHV.fn.uploader.selectors.show).exists(),s=e.originalEvent.code;if("Escape"===e.originalEvent.code){if(t)return;r&&CHV.fn.uploader.toggle({reset:!1})}if(a.exists()&&n){if(s in CHV.fn.listingViewer.keys){var l=["KeyW","Escape","ArrowLeft","ArrowRight"],d=CHV.fn.listingViewer.keys[s];-1==l.indexOf(s)?$("[data-action="+d+"]",CHV.fn.listingViewer.selectors.root).click():d in CHV.fn.listingViewer&&CHV.fn.listingViewer[d](),PF.fn.keyFeedback.spawn(e)}}else{var c,u={Period:"list-select-all",KeyK:"get-embed-codes",KeyZ:"clear",KeyA:"create-album",KeyM:"move",KeyO:"approve",Delete:"delete",KeyC:"assign-category",KeyV:"flag-safe",KeyF:"flag-unsafe",KeyH:"album-cover"},m={KeyE:"edit",KeyL:"like",KeyS:"share",KeyJ:"sub-album",KeyP:"upload-to-album"};d=u[s]||m[s];void 0!==d&&(o.exists()&&(n||t||parseInt($("[data-text=selection-count]:visible",i).text())>0&&(c=$("[data-action="+d+"]",o.closest(".list-selection")))),void 0===c&&(c=$("[data-action="+d+"]:visible").not("#content-listing-tabs *")),c instanceof jQuery&&c.length>0&&(c.first().trigger("click"),PF.fn.keyFeedback.spawn(e)))}}}),$(document).on("click",CHV.fn.listingViewer.selectors.root+" [data-action^=viewer-]",function(){var e=$(this).data("action").substring("viewer-".length);e in CHV.fn.listingViewer&&CHV.fn.listingViewer[e]()}),$(document).on("click","a[data-href]:not([rel=popup-link]):not(.popup-link)",function(){var e=$(this).attr("data-href"),t=$(this).attr("href");(e||t)&&(location.href=t||e)});var h,v=PF.obj.listing.selectors.list_item+", .image-container";($(document).on("contextmenu click",v,function(e){!$(".list-selection:visible").exists()||$(e.target).closest(".list-item-desc").exists()||$(this).closest(CHV.fn.listingViewer.selectors.root).exists()||"click"==e.type&&!e.ctrlKey&&!e.metaKey||o(this,e)}),navigator.userAgent.match(/(iPad|iPhone|iPod)/i))&&$(document).on("mouseup mousemove",v,function(e){return clearTimeout(h),!1}).on("mousedown",v,function(e){var t=this,a=e;return h=window.setTimeout(function(){$(".list-selection:visible").exists()&&!$(t).closest(CHV.fn.listingViewer.selectors.root).exists()&&o(t,a)},500),!1});void 0!==CHV.obj.config&&CHV.obj.config.listing.viewer&&$(document).on("click",PF.obj.listing.selectors.list_item+"[data-type=image] .image-container",function(e){if(e.preventDefault(),e.stopPropagation(),0!==e.clientX||0!==e.clientY){var t=$(this).closest(PF.obj.listing.selectors.list_item);t.exists()&&(e.ctrlKey||e.metaKey||CHV.fn.listingViewer.open(t))}else PF.fn.keyFeedback.spawn(e)}),$(document).on("contextmenu",CHV.fn.listingViewer.selectors.root,function(e){return e.preventDefault(),CHV.fn.listingViewer.zoom(),PF.fn.keyFeedback.spawn(e),!1});var b,_=PF.fn.deparam(window.location.search);if(_&&"viewer"in _){var C=$(PF.obj.listing.selectors.content_listing_visible);if("images"==C.data("list")){var w=$(PF.obj.listing.selectors.list_item,C)["next"==_.viewer?"first":"last"]();CHV.fn.listingViewer.open(w)}}$(window).on("DOMContentLoaded load resize scroll",function(){clearTimeout(b),b=setTimeout(function(){$(PF.obj.listing.selectors.list_item+":visible").each(function(){var e=$(this).find('[data-action="load-image"]').first(),t=PF.fn.deparam($(PF.obj.listing.selectors.list_item+"[data-id="+$(this).attr("data-id")+"]").closest(".content-listing").data("params-hidden")),o=t&&"is_animated"in t?t.is_animated:$(this).data("size")<=CHV.obj.config.image.load_max_filesize.getBytes();e.exists()&&o&&$(this).is_within_viewport(50)&&a(e)})},1e3)}),$(document).on("click","[data-action=logout]",function(){let e=$("form#form-logout");e.submit()}),Boolean(window.navigator.vibrate)&&$(document).on("click","button, .btn, .pop-btn, .top-btn-el, [data-action], .content-tabs a, .top-bar-logo a, .login-provider-button, .panel-share-networks li a, #image-viewer-loader",function(e){$(this).is("[data-action=top-bar-menu-full]")||(window.navigator.vibrate(0),window.navigator.vibrate(15))}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.rows+" input[name^='cta-']",function(){CHV.fn.ctaForm.update($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-add]",function(){CHV.fn.ctaForm.insert($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-remove]",function(){CHV.fn.ctaForm.remove($(this)),0==CHV.fn.ctaForm.array.length&&$(CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable).prop("checked",!1).trigger("change")}),$(document).on("change",CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable,function(){let e=$(CHV.fn.ctaForm.selectors.combo,CHV.fn.ctaForm.selectors.root),t=$(this).is(":checked");e.toggleClass("soft-hidden",!t),t&&(0==CHV.fn.ctaForm.array.length&&CHV.fn.ctaForm.add(),CHV.fn.ctaForm.render()),CHV.fn.ctaForm.setEnable(t?1:0)}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.root+" input[name^='cta-icon_']",function(){let e=CHV.fn.ctaForm.getRow($(this)),t=e.find("label[for^='cta-icon_'] [data-content=icon]");t.removeClass();let a=CHV.fn.ctaForm.getIconClass($(this).val());t.addClass(a)}),$(document).on("click","[href^='https://chevereto.com/']",function(e){let t=$(this).find(".badge--paid").exists();if(!t)return;let a=$(this).attr("href"),o=PF.fn._s("Get a license at %s to unlock all features and support.",'chevereto.com'),i=PF.fn._s("You can enter your license key in the dashboard panel."),n=PF.obj.config.base_url+"dashboard/?license",r="_self",s="fas fa-key",l=PF.fn._s("Enter license");"docker"===CHV.obj.system_info.servicing&&(i=PF.fn._s("You can upgrade by following the instructions in the documentation."),n="https://v4-docs.chevereto.com/guides/docker/#upgrading",r="_blank",s="fa-brands fa-docker",l=PF.fn._s("Instructions")),e.preventDefault(),e.stopPropagation(),PF.fn.modal.simple({html:!0,title:' Upgrade Chevereto',message:"

    "+o+" "+i+'

    "})}),$(document).on("focus","input[name='form-album-password']",function(){$(this).get(0).type="text"}),$(document).on("blur","input[name='form-album-password']",function(){$(this).get(0).type="password"})}),"undefined"==typeof CHV&&(CHV={obj:{},fn:{},str:{}}),window.opener&&(CHV.obj.opener={uploadPlugin:{}}),CHV.fn.ctaButtons={selectors:{container:"[data-contains=cta-album]"},render:function(e=""){$(this.selectors.container).each(function(){$(this).html(e)})}},CHV.fn.ctaForm={enable:0,array:[],selectors:{root:"#cta-form",rows:"#cta-rows",enable:"#cta-enable",template:"#cta-row-template",combo:"#cta-combo",row:".cta-row"},update:function(e){let t=this.getPos(e),a=e.attr("name").match(/cta-(.*)?_\d+/)[1];this.array[t-1][a]=e.val()},add:function(e="",t="",a=""){this.array.push(this.getRowObject(e,t,a)),this.render()},insert:function(e){let t=this.getPos(e);this.array.splice(t,0,this.getRowObject()),this.render()},remove:function(e){let t=this.getPos(e);this.array.splice(t-1,1),this.render()},getRowObject:function(e="",t="",a=""){return{label:e,icon:t,href:a}},getIconClass:function(e){return/\s/g.test(e)?e:"fa-solid fa-"+e},getRow:function(e){return e.closest(this.selectors.row)},getPos:function(e){return this.getRow(e).data("pos")},getTemplateHtml:function(){return $(this.selectors.template).html()},getRowHtml:function(e,t){return this.getTemplateHtml().replaceAll(/%pos%/g,e).replaceAll(/%label%/g,t.label).replaceAll(/%href%/g,t.href).replaceAll(/%icon%/g,t.icon).replaceAll(/%iconClass%/g,this.getIconClass(t.icon))},render:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows),a=this;this.destroy(),$.each(this.array,function(e,o){t.append(a.getRowHtml(e+1,o))}),this.setEnable(this.enable),t.sortable({cursor:"grabbing",axis:"y",update:function(){let e=[];$(this).find(a.selectors.row).each(function(){let t=a.getPos($(this));e.push(a.array[t-1])}),a.array=e,a.render()}})},setEnable:function(e){let t=$(this.selectors.rows,this.selectors.root);this.enable=e;let a=1===this.enable;$("input[data-required]",t).each(function(){$(this).attr("required",a)})},destroy:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows);try{t.sortable("destroy")}catch(e){}t.empty()}},CHV.fn.album={showEmbedCodes:function(){var e=$(".content-listing-loading","#tab-embeds");if(e.exists()){var t=$("#embed-codes");$.ajax({url:PF.obj.config.json_api,type:"POST",dataType:"json",data:{action:"get-album-contents",albumid:CHV.obj.resource.id,auth_token:PF.obj.config.auth_token},cache:!1}).always(function(a){PF.fn.loading.destroy(e),200==a.status_code&&(CHV.fn.fillEmbedCodes(a.contents,"#tab-embeds"),$("#tab-embeds").addClass("visible"),t.removeClass("soft-hidden"))})}}},CHV.fn.modal={getTemplateWithPreview:function(e,t){var a=$(e).html(),o=$("
    "),i="",n=t.find(".image-container img").attr("src");return void 0!==n&&(i+='';var e=$(this).find(".image-container img");e.exists()?n+='':(n+='',n+=''),n+="",r++}),i.html(o).find(".image-preview").html(n),i.html()}},CHV.fn.listingViewer={selectors:{bodyShown:".--viewer-shown",content:".viewer-content",template:"#viewer-template",root:".viewer",rootShow:".viewer--show",rootHide:".viewer--hide",rootZero:".viewer--zero",rootNavPrev:".viewer--nav-prev",rootNavNext:".viewer--nav-next",src:".viewer-src",tools:".viewer-tools",loader:".viewer-loader",owner:".viewer-owner",ownerGuest:".viewer-owner--guest",ownerUser:".viewer-owner--user",inputMap:".viewer-kb-input"},keys:{ArrowLeft:"prev",ArrowRight:"next",Delete:"delete",Escape:"close",KeyA:"create-album",KeyE:"edit",KeyF:"flag",KeyL:"like",KeyM:"move",KeyO:"approve",KeyS:"share",KeyW:"zoom",Period:"select"},keymap:{"create-album":["A",PF.fn._s("Create album")],approve:["O",PF.fn._s("Approve")],close:["Esc",PF.fn._s("Close")],delete:["Del",PF.fn._s("Delete")],edit:["E",PF.fn._s("Edit")],flag:["F",PF.fn._s("Toggle flag")],like:["L",PF.fn._s("Like")],move:["M",PF.fn._n("Move")],next:["►",PF.fn._s("Next")],prev:["◄",PF.fn._s("Previous")],select:[".",PF.fn._s("Toggle select")],share:["S",PF.fn._s("Share")],zoom:["W",PF.fn._s("Zoom")]},loading:null,idleTimer:0,$item:null,show:function(){PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));this.getEl("root").removeClass(this.selectors.rootHide.substring(1)).addClass(this.selectors.rootShow.substring(1)),$("body").addClass(this.selectors.bodyShown.substring(1));var e=new Hammer($(CHV.fn.listingViewer.selectors.root).get(0),{direction:Hammer.DIRECTION_VERTICAL});e.on("swipeleft swiperight",function(e){var t="left"==e.type.substring("swipe".length)?"next":"prev";CHV.fn.listingViewer[t]()}),this.getEl("root")[(PF.fn.isDevice(["phone","phablet"])?"add":"remove")+"Class"]("--over")},getItem:function(){return this.$item},getEl:function(e){var t=!e.startsWith("template")&&!e.startsWith("root")&&this.selectors.root;return t?$(this.selectors[e],t):$(this.selectors[e])},getObject:function(e){if(e||void 0===this.object){var t=decodeURIComponent(this.getItem().attr("data-object"));this.object=JSON&&JSON.parse(t)||$.parseJSON(t)}return this.object},placeholderSizing:function(){if(this.getEl("root").exists()){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),a=e/t,o=this.getEl("src")[0],i=o.getAttribute("width"),n=o.getAttribute("height"),r=i/n,s=a0?"add":t.getItem()[o]().exists()?"add":"remove";a[n+"Class"](i.substring(1))}),$.each(this.getItem().get(0).attributes,function(e,t){if(!t.name.startsWith("data-"))return!0;a.attr(t.name,t.value)});var n=void 0===this.object.user?"user":"guest";n="owner"+(n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()),this.getEl(n).remove(),void 0!==this.object.user&&$(this.object.user.avatar?".default-user-image":"img.user-image",this.getEl("ownerUser")).remove();var r=this.getItem().find(".list-item-image-tools[data-action='list-tools']");this.getEl("tools").append(r.html());let s=this;this.getEl("tools").find(".list-tool[data-action]").each(function(){$(this).attr("title",$(this).attr("title")+" ("+s.keymap[$(this).attr("data-action")][0]+")")}),this.placeholderSizing(),this.trickyLoad()},zoom:function(){this.getEl("root").attr("data-cover","1"==this.getEl("root").attr("data-cover")?"0":"1")},remove:function(){this.getEl("root").remove()},getParsedTemplate:function(){var e=this.getObject(!0),t=this.getEl("template").html(),a=t.match(/%(\S+)%/g);return a&&$.each(a,function(a,o){var i,n=o.slice(1,-1).split(".");n.map(function(t){var a=i||e;t in a&&(i=a[t])});var r=new RegExp(o,"g");i=void 0===i?"":i,t=t.replace(r,i)}),t},insertEl:function(){var e=this.getParsedTemplate();this.getEl("rootZero").remove(),$(e).appendTo("body")},toggleIdle:function(e,t){var a=this;t=void 0===t||t;$("html")[(e?"add":"remove")+"Class"]("--idle"),e||(clearTimeout(a.idleTimer),t&&(a.idleTimer=setTimeout(function(){var e=$(".fullscreen"),t=a.getEl("root");a.toggleIdle(t.length>0&&0==e.length)},5e3)))},open:function(e){if(e.exists()){this.setItem(e),this.insertEl(),this.filler(),this.show(),this.toggleIdle(!1);var t=this;this.getEl("root").on("mousemove mouseout",function(){t.toggleIdle(!1)})}else this.getEl("rootZero").remove()},setItem:function(e){this.$item=e},trickyLoad:function(){if(this.object.image.url!=this.object.display_url){var e=this.getEl("src").parent().html(),t=$(e).attr("src",this.object.image.url);t.insertBefore(this.getEl("src"));var a=t.eq(0),o="video"==a.attr("data-media");o?(a.replaceWith(''),t.next().css("opacity",0),setTimeout(function(){t.next().remove()},200)):a.attr("src",this.object.image.url),t.imagesLoaded(function(){o||t.next().remove()})}},close:function(){var e=this;$(this.selectors.root).removeClass(this.selectors.rootShow.substring(1)).addClass(this.selectors.rootHide.substring(1)),$("body").removeClass(this.selectors.bodyShown.substring(1)),this.toggleIdle(!1,!1),null!==this.getItem()&&$(window).scrollTop(this.getItem().offset().top);var t=$("#top-bar, .follow-scroll");t.attr("data-scroll-lock","1"),setTimeout(function(){e.remove()},250),setTimeout(function(){t.removeAttr("data-scroll-lock")},300)},browse:function(e){var t=this.getItem()[e]();if(t.exists()){this.setItem(t),this.filler(!0);var a=$(PF.obj.listing.selectors.content_listing_visible).find("[data-action=load-more]"),o=t[e+"All"]().length;a.length>0&&o<=5&&!PF.obj.listing.calling&&"next"==e&&$("[data-action=load-more]").click()}else{var i=$("[data-pagination="+e+"]",PF.obj.listing.selectors.content_listing_pagination+":visible"),n=i.attr("href");if(!n)return;PF.fn.deparam(window.location.search);window.location.href=n+"&viewer="+e}},prev:function(){this.browse("prev")},next:function(){this.browse("next")}},CHV.obj.image_viewer={selector:"#image-viewer",container:"#image-viewer",navigation:".image-viewer-navigation",loading:"#image-viewer-loading",loader:"#image-viewer-loader"},CHV.obj.image_viewer.$container=$(CHV.obj.image_viewer.container),CHV.obj.image_viewer.$navigation=$(CHV.obj.image_viewer.navigation),CHV.obj.image_viewer.$loading=$(CHV.obj.image_viewer.loading),CHV.fn.system={checkUpdates:function(e){$.ajax({url:CHEVERETO.api.get.info+"/",data:{id:CHEVERETO.id},cache:!1}).always(function(t,a,o){"function"==typeof e&&e(o)})}},("MacIntel"===navigator.platform&&navigator.maxTouchPoints>0||"iPad"===navigator.platform)&&$("html").removeClass("device-nonmobile"),CHV.fn.bindSelectableItems=function(){var e="content-listing-wrapper",t="#"+e;$(t).exists()?$(t).hasClass("ui-selectable")&&$(t).selectable("destroy"):$("#content-listing-tabs").wrap("
    "),$("[data-content=list-selection]").exists()&&$("html.device-nonmobile "+t).selectable({delay:150,filter:PF.obj.listing.selectors.list_item,cancel:".content-empty, .header, #tab-share, #tab-info, .viewer-title, .header-link, .top-bar, .content-listing-pagination *, #fullscreen-modal, #top-user, #background-cover, .list-item-desc, .list-item-image-tools, [data-action=load-image], #tab-embeds",classes:{"ui-selected":"selected"},selected:function(e,t){$(t.selected).removeClass("ui-selected")},selecting:function(e,t){var a=$(t.selecting),o=a.hasClass("selected");CHV.fn.list_editor[(o?"unselect":"select")+"Item"](a)},unselecting:function(e,t){CHV.fn.list_editor.unselectItem($(t.unselecting))}})},CHV.fn.isCachedImage=function(e){var t=new Image;return t.src=e,t.complete||t.width+t.height>0},CHV.fn.viewerLoadImage=function(){if(CHV.obj.image_viewer.$loading.exists()&&(CHV.obj.image_viewer.$loading.removeClass("soft-hidden").css({zIndex:2}),PF.fn.loading.inline(CHV.obj.image_viewer.$loading,{color:"white",size:"small", +center:!0,valign:!0}),CHV.obj.image_viewer.$loading.hide().fadeIn("slow")),$(CHV.obj.image_viewer.loader).remove(),CHV.obj.image_viewer.image.is_360)return PF.fn.loading.destroy(CHV.obj.image_viewer.$loading),pannellum.viewer("image-viewer-360",{autoLoad:!0,type:"equirectangular",panorama:CHV.obj.image_viewer.image.url,preview:CHV.obj.image_viewer.$container.find(".media").eq(0).attr("src"),pitch:2.3,yaw:-135.4,hfov:120}),$("#image-viewer-360").removeClass("soft-hidden"),void CHV.obj.image_viewer.$container.find(".media").eq(0).remove();CHV.obj.image_viewer.image.html=CHV.obj.image_viewer.$container.html(),CHV.obj.image_viewer.$container.css("height",CHV.obj.image_viewer.$container.height()).prepend($(CHV.obj.image_viewer.image.html).css({top:0,zIndex:0,opacity:0,position:"absolute"})),CHV.obj.image_viewer.$container.find(".media").eq(0).css("zIndex",1);var e=CHV.obj.image_viewer.$container.find(".media").eq(1),t=e.css("width"),a=e.css("height");"video"===e.attr("data-media")?(e.replaceWith(''),e.src=CHV.obj.image_viewer.image.url):e.attr("src",CHV.obj.image_viewer.image.url),e.imagesLoaded(function(){CHV.obj.image_viewer.$container.find(".media").eq(1).css({position:"",display:"",opacity:1}),CHV.obj.image_viewer.$container.find(".media").eq(0).remove(),$(CHV.obj.image_viewer.container).css("height",""),PF.fn.loading.destroy(CHV.obj.image_viewer.$loading)})},CHV.obj.embed_share_tpl={},CHV.obj.embed_upload_tpl={},CHV.obj.topBar={transparencyScrollToggle:function(){var e=$(window).scrollTop();$("#top-bar")[(e>0?"remove":"add")+"Class"]("transparent")}},CHV.obj.uploaderReset={isUploading:!1,canAdd:!0,queueStatus:"ready",uploadThreads:0,uploadParsedIds:[],uploadProcessedIds:[],files:{},results:{success:{},error:{}},toggleWorking:0,filesAddId:0,clipboardImages:[]},CHV.fn.uploader={files:{},selectors:{root:"#anywhere-upload",show:".upload-box--show",queue:"#anywhere-upload-queue",queue_complete:".queue-complete",queue_item:".queue-item",close_cancel:"[data-button=close-cancel]",file:"#anywhere-upload-input",camera:"#anywhere-upload-input-camera",upload_item_template:"#anywhere-upload-item-template",item_progress_bar:"[data-content=progress-bar]",failed_result:"[data-content=failed-upload-result]",fullscreen_mask:"#fullscreen-uploader-mask",dropzone:"#uploader-dropzone",paste:"#anywhere-upload-paste",input:"[data-action=anywhere-upload-input]"},toggle:function(e,t){this.queueSize();var a=$("[data-action=top-bar-upload]",".top-bar"),o=!$(CHV.fn.uploader.selectors.root).data("shown");e=$.extend({callback:null,reset:!0},e);if(void 0!==e.show&&e.show&&(o=!0),PF.fn.growl.close(!0),PF.fn.close_pops(),!(1==this.toggleWorking||$(CHV.fn.uploader.selectors.root).is(":animated")||CHV.fn.uploader.isUploading||a.data("login-needed")&&!PF.fn.is_user_logged())){this.toggleWorking=1;var i={time:500,easing:null},n=function(){!o&&e.reset&&CHV.fn.uploader.reset(),PF.fn.topMenu.hide(),"function"==typeof e.callback&&e.callback(t),CHV.fn.uploader.boxSizer(),CHV.fn.uploader.toggleWorking=0};if($(CHV.fn.uploader.selectors.root)[(o?"add":"remove")+"Class"](this.selectors.show.substring(1)),o){if($("html").data({"followed-scroll":$("html").hasClass("followed-scroll"),"top-bar-box-shadow-prevent":!0}).removeClass("followed-scroll").addClass("overflow-hidden top-bar-box-shadow-none"),$("#top-bar").data({stock_classes:$("#top-bar").attr("class")}).addClass("scroll-up"),$(".current[data-nav]",".top-bar").each(function(){$(this).is("[data-action=top-bar-menu-full]")||$(this).removeClass("current").attr("data-current",1)}),PF.fn.isDevice("mobile")){var r=$(".upload-box-heading",$(CHV.fn.uploader.selectors.root));r.css({position:"relative",top:.5*($(window).height()-r.height())+"px"})}CHV.fn.uploader.focus(function(){setTimeout(function(){n()},i.time)})}else{$("#top-bar")[0].className=$("#top-bar").data("stock_classes"),$("[data-nav][data-current=1]",".top-bar").each(function(){$(this).addClass("current")}),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:0})},.1*i.time),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).remove()},i.time);var s=$(CHV.fn.uploader.selectors.root).outerHeight(),l=s-parseInt($(CHV.fn.uploader.selectors.root).data("initial-height"))+"px";$(CHV.fn.uploader.selectors.root).css({transform:"translate(0,-"+l+")"}),setTimeout(function(){$(CHV.fn.uploader.selectors.root).css({top:""}),n(),$("html,body").removeClass("overflow-hidden").data({"top-bar-box-shadow-prevent":!1}),$("#top-bar *").trigger("blur")},i.time)}$(CHV.fn.uploader.selectors.root).data("shown",o),a.toggleClass("current").removeClass("opened")}},reset:function(){$.extend(this,$.extend(!0,{},CHV.obj.uploaderReset)),$("li",this.selectors.queue).remove(),$(this.selectors.root).height("").css({"overflow-y":"","overflow-x":""}),$(this.selectors.queue).addClass("queueEmpty").removeClass(this.selectors.queue_complete.substring(1)),$(this.selectors.input,this.selectors.root).each(function(){$(this).prop("value",null)}),$("[data-group=upload-result] textarea",this.selectors.root).prop("value",""),$.each(["upload-queue-ready","uploading","upload-result","upload-queue-ready","upload-queue"],function(e,t){$("[data-group="+t+"]").hide()}),$("[data-group=upload]",this.selectors.root).show(),$("[name=upload-album-id]",this.selectors.root).prop("value",function(){var e=$("option[selected]",this);if(e.exists())return e.attr("value")}),$(this.selectors.root).removeClass("queueCompleted queueReady queueHasResults").addClass("queueEmpty").attr("data-queue-size",0),$("[name=upload-category-id]",this.selectors.root).prop("value",""),$("[name=upload-nsfw]",this.selectors.root).prop("checked",this.defaultChecked),this.boxSizer(!0)},focus:function(e){$(this.selectors.fullscreen_mask).exists()||($("body").is("#upload")||$("body").append($("
    ",{id:this.selectors.fullscreen_mask.replace("#",""),class:"fullscreen black"}).css({top:PF.fn.isDevice("phone")?0:$(CHV.fn.uploader.selectors.root).data("top")})),setTimeout(function(){$("body").is("#upload")||$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:1}),setTimeout(function(){"function"==typeof e&&e()},PF.fn.isDevice(["phone","phablet"])?0:250)},1))},boxSizer:function(e){var t=$(this.selectors.root).is(this.selectors.show),a=t||e;t&&$("html").addClass("overflow-hidden"),a&&($(this.selectors.root).height(""),!$("body").is("#upload")&&$(this.selectors.root).height()>$(window).height()?($(this.selectors.root).height($(window).height()-$("#top-bar").height()).css({"overflow-y":"scroll","overflow-x":"auto"}),$("html").addClass("overflow-hidden")):$(this.selectors.root).css("overflow-y",""))},pasteURL:function(){var e=$("[name=urls]",PF.obj.modal.selectors.root),t=e.val();t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t))},pasteImageHandler:function(e){if(!$(e.target).is(":input")){if(void 0!==e.clipboardData&&e.clipboardData.items)var t=e.clipboardData.items;else setTimeout(function(){return e.clipboardData={},e.clipboardData.items=[],$.each($("img",CHV.fn.uploader.$pasteCatcher),function(t,a){e.clipboardData.items.push(PF.fn.dataURItoBlob($(this).attr("src")))}),$(CHV.fn.uploader.selectors.paste).html(""),CHV.fn.uploader.pasteImageHandler(e)},1);if(t){const e=new Array,i=new Array,n=new RegExp("^(image|video)/","i");let r=$(CHV.fn.uploader.selectors.root).data("shown");for(var a=0;a{const o={1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"};var i=o[a.error.code];t({type:"error",error:i}),console.error("Error loading video",i)}),a.addEventListener("loadedmetadata",function(){const e=parseInt(a.duration/4);setTimeout(()=>{a.currentTime=e,a.pause()},200),a.addEventListener("seeked",()=>{const e=document.createElement("canvas");e.width=a.videoWidth,e.height=a.videoHeight;const o=e.getContext("2d");o.drawImage(a,0,0,e.width,e.height),o.canvas.toBlob(o=>{t(a,e)},"image/jpeg",.9)},!1)}),/iPad|iPhone|iPod|Safari/.test(navigator.userAgent)&&(a.autoplay=!0,a.playsInline=!0,a.muted=!0),a.preload="metadata",a.src=e}function d(e,t){e.show(),$(CHV.fn.uploader.selectors.root).addClass("queueReady").removeClass("queueEmpty"),$("[data-group=upload-queue-ready]",CHV.fn.uploader.selectors.root).show(),$("[data-group=upload]",CHV.fn.uploader.selectors.root).hide(),e.find(".load-url").remove(),e.find(".preview").removeClass("soft-hidden").show().append(t),$img=e.find(".preview").find("img,canvas"),$img.attr("class","canvas"),queue_item_h=e.height(),queue_item_w=e.width();var a=parseInt($img.attr("width"))||$img.width(),o=parseInt($img.attr("height"))||$img.height(),i=a/o;if($img.hide(),a>o||a==o){var r=oo&&$img.height(r).width(r*i)}if(a0){for(var o="",i=0;i"+PF.fn.htmlEncode(a[i].name)+" - "+PF.fn.htmlEncode(a[i].error)+"",delete CHV.fn.uploader.files[a[i].uid],$("li[data-id="+a[i].uid+"]",CHV.fn.uploader.selectors.queue).find("[data-action=cancel]").click();PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be loaded"),message:"
      "+o+"
    "})}else CHV.fn.uploader.focus();CHV.fn.uploader.boxSizer()}}if($(CHV.fn.uploader.selectors.queue_item+":not([data-id]) .preview:empty",CHV.fn.uploader.selectors.queue).first().closest("li").attr("data-id",t.uid),void 0!==t.type&&t.type.startsWith("video/")){var u=i(t.uid),m=r(t),p=URL.createObjectURL(t);l(p,function(e,a){++w,"error"===e.type?f.push({uid:t.uid,name:t.name.truncate_middle(),error:e.error}):(CHV.fn.uploader.files[t.uid].parsedMeta={title:m,width:e.videoWidth,height:e.videoHeight,mimetype:t.type},d(u,a)),c(w,s,f)})}else loadImage(t.url?t.url:t,function(e){++w;var o=i(t.uid);if("error"===e.type)f.push({uid:t.uid,name:t.name.truncate_middle(),error:"MEDIA_ERR_SRC_FORMAT"});else{n();var l="image/jpeg";if(t.hasOwnProperty("type")?l=t.type:t.type=l,void 0!==a.buffer){for(var u=new Uint8Array(a.buffer).subarray(0,4),m="",p=0;pCHV.obj.config.image.max_filesize.getBytes()?f.push({uid:u,name:g.name.truncate_middle()+" - "+PF.fn._s("File too big."),error:"MEDIA_ERR_FILE_SIZE"}):-1!=CHV.obj.config.upload.image_types.indexOf(p)||0!=/android/i.test(navigator.userAgent)?(i&&(g.md5=i),g.fromClipboard=1==e.clipboard,g.uid=u):f.push({uid:u,name:g.name.truncate_middle()+" - "+PF.fn._s("Invalid or unsupported file format."),error:"MEDIA_ERR_FILETYPE"})}for(u=0;u0&&0==s.length){var v="";for(u=0;u"+PF.fn.htmlEncode(f[u].name)+"";return void PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
    • "+v+"
    "})}if(0==s.length)return}else{if(t=t.replace(/(<([^>]+)>)/g,"").replace(/(\[([^\]]+)\])/g,""),s=t.match_urls(),!s)return;s=s.array_unique(),s=$.map(s,function(e,t){return{uid:t,name:e,url:e}})}if($.isEmptyObject(this.files))for(u=0;u0){var i=[];for(var o in this.results.error)"object"==typeof this.results.error[o]&&(i[o]=this.results.error[o].error.message);i.length>0&&$(this.selectors.failed_result).html("
  • "+i.join("
  • ")+"
  • ")}else $(a.error,this.selectors.root).hide();if(!window.opener&&0==CHV.obj.config.upload.moderation&&CHV.obj.config.upload.redirect_single_upload&&1==Object.size(this.results.success)&&0==Object.size(this.results.error))return window.location.href=this.results.success[Object.keys(this.results.success)[0]].image.path_viewer,!1;if($("[data-text=queue-progress]",this.selectors.root).text(100),$("[data-group=uploading]",this.selectors.root).hide(),$(this.selectors.root).removeClass("queueUploading queueHasResults").addClass("queueCompleted"),$(this.selectors.queue).addClass(this.selectors.queue_complete.substring(1)),Object.size(this.results.success)>0&&$("[data-group=upload-result] textarea",this.selectors.root).exists()&&CHV.fn.fillEmbedCodes(this.results.success,CHV.fn.uploader.selectors.root,"val"),Object.size(this.results.success)>0&&Object.size(this.results.error)>0?$(a.mixed+", "+a.success,this.selectors.root).show():Object.size(this.results.success)>0?$(a.success,this.selectors.root).show():Object.size(this.results.error)>0&&$(a.error,this.selectors.root).show(),$(a.success,this.selectors.root).is(":visible")){$(a.success,this.selectors.root).find("[data-group^=user], [data-group=guest]").hide(),$(a.success,this.selectors.root).find("[data-group="+(PF.fn.is_user_logged()?"user":"guest")+"]").show();var n=Object.keys(this.results.success)[0];if(void 0!==this.results.success[n].image.album){var r=[];for(var s in this.results.success){var l=this.results.success[s].image;l.album&&l.album.id_encoded&&-1==r.indexOf(l.album.id_encoded)&&r.push(l.album.id_encoded)}var d={link:null,text:null};if(r.length<=1?(d.link=this.results.success[n].image.album.url,d.text=this.results.success[n].image.album.name):(d.link=this.results.success[n].image.user.url_albums,d.text=PF.fn._s("%s's Albums",this.results.success[n].image.user.name_short_html)),$("[data-text=upload-target]",this.selectors.root).text(d.text),$("[data-link=upload-target]",this.selectors.root).attr("href",d.link),PF.fn.is_user_logged()){var c=r.length>0?"album":"stream";$("[data-group=user-"+c+"]",this.selectors.root).show()}}}if(this.boxSizer(),this.queueStatus="done",window.opener&&void 0!==CHV.obj.opener.uploadPlugin[window.name]){if($('[data-action="copy"]',this.selectors.root).remove(),CHV.obj.opener.uploadPlugin[window.name].hasOwnProperty("autoInsert")&&CHV.obj.opener.uploadPlugin[window.name].autoInsert){var u=$(':input[name="'+CHV.obj.opener.uploadPlugin[window.name].autoInsert+'"]',CHV.fn.uploader.selectors.root),m=u.val();if(m)return window.opener.postMessage({id:window.name,message:m},"*"),void window.close()}}else $('[data-action="openerPostMessage"]',this.selectors.root).remove()}},$.extend(CHV.fn.uploader,$.extend(!0,{},CHV.obj.uploaderReset)),CHV.fn.fillEmbedCodes=function(e,t,a){void 0===a&&(a="val");var o=CHV.fn.uploader.selectors.root==t?"embed_upload_tpl":"embed_share_tpl",i=!1,n=!1,r=!1;$.each(e,function(e,s){if(void 0===s)return;var l="id_encoded"in s?s:s.image,d=Object.flatten(l);let c=""!==l.url_frame,u=null!==l.medium.url,m=null!==l.thumb.url;c&&(i=!0),u&&(n=!0),m&&(r=!0),$.each(CHV.obj[o],function(e,o){$.each(o.options,function(e,o){if(!c&&e.startsWith("frame-"))return;if(!u&&e.startsWith("medium-"))return;if(!m&&e.startsWith("thumb-"))return;var i=$("textarea[name="+e+"]",t),n=o.template;for(var r in"object"==typeof n&&n.hasOwnProperty(d.type)&&(n=n[d.type]),"video"!==d.type&&(n=n.replaceAll("%URL_FRAME%","")),d)d.hasOwnProperty(r)&&(n=n.replace(new RegExp("%"+r.toUpperCase()+"%","g"),PF.fn.htmlEncode(PF.fn.htmlEncode(d[r]))));let s="thumb"==i.data("size")&&"thumb-links"!==e;i[a](i.val()+n+(s?" ":"\n"))})})}),$("option[value^=frame]",t).prop("disabled",!i),$("option[value^=medium-]",t).prop("disabled",!n),$("option[value^=thumb-]",t).prop("disabled",!r),$.each(CHV.obj[o],function(e,o){$.each(o.options,function(e,o){var i=$("textarea[name="+e+"]",t);i[a]($.trim(i.val()))})})},CHV.fn.resource_privacy_toggle=function(e){CHV.obj.resource.privacy=e,e||(e="public"),$("[data-content=privacy-private]").hide(),"public"!==e&&$("[data-content=privacy-private]").show()},CHV.fn.submit_create_album=function(){var e=$(PF.obj.modal.selectors.root);return""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):(PF.obj.modal.form_data={action:"create-album",type:"album",album:{parent_id:$("[name=form-album-parent-id]",e).val(),name:$("[name=form-album-name]",e).val(),description:$("[name=form-album-description]",e).val(),privacy:$("[name=form-privacy]",e).val(),password:"password"==$("[name=form-privacy]",e).val()?$("[name=form-album-password]",e).val():null,new:!0}},!0)},CHV.fn.complete_create_album={success:function(e){var t=e.responseJSON.album;window.location=t.url},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}},CHV.fn.submit_upload_edit=function(){var e=$(PF.obj.modal.selectors.root),t=!1;return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.obj.modal.form_data={action:t?"create-album":"move",type:"images",album:{ids:$.map(CHV.fn.uploader.results.success,function(e){return e.image.id_encoded}),new:t}},t?(PF.obj.modal.form_data.album.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.album.description=$("[name=form-album-description]",e).val(),PF.obj.modal.form_data.album.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.album.privacy&&(PF.obj.modal.form_data.album.password=$("[name=form-album-password]",e).val())):PF.obj.modal.form_data.album.id=$("[name=form-album-id]",e).val(),!0)},CHV.fn.complete_upload_edit={success:function(e){var t=e.responseJSON.album;window.location=t.url},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}},CHV.fn.before_image_edit=function(){var e=$("[data-ajax-deferred='CHV.fn.complete_image_edit']");$("[data-content=form-new-album]",e).hide(),$("#move-existing-album",e).show()},CHV.fn.submit_image_edit=function(){var e=$(PF.obj.modal.selectors.root),t=!1;return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.obj.modal.form_data={action:"edit",edit:"image",editing:{id:CHV.obj.resource.id,category_id:$("[name=form-category-id]",e).val()||null,title:$("[name=form-image-title]",e).val()||null,description:$("[name=form-image-description]",e).val()||null,nsfw:$("[name=form-nsfw]",e).prop("checked")?1:0,new_album:t}},t?(PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0)},CHV.fn.complete_image_edit={success:function(e){var t=e.responseJSON.image;if(t.album.id_encoded||(t.album.id_encoded=""),CHV.obj.image_viewer.album.id_encoded!==t.album.id_encoded){CHV.obj.image_viewer.album.id_encoded=t.album.id_encoded;var a={html:t.album.slice&&t.album.slice.html?t.album.slice.html:null,prev:t.album.slice&&t.album.slice.prev?t.album.slice.prev:null,next:t.album.slice&&t.album.slice.next?t.album.slice.next:null};$("[data-content=album-slice]").html(a.html),$("[data-content=album-panel-title]")[a.html?"show":"hide"](),$("a[data-action=prev]").attr("href",a.prev),$("a[data-action=next]").attr("href",a.next),$("a[data-action]",".image-viewer-navigation").each(function(){$(this)[void 0===$(this).attr("href")?"addClass":"removeClass"]("hidden")})}CHV.fn.resource_privacy_toggle(t.album.privacy),$.each(["description","title"],function(e,a){var o=$("[data-text=image-"+a+"]");o.html(PF.fn.nl2br(PF.fn.htmlEncode(t[a]))),""!==o.html()&&o.show()}),CHV.fn.common.updateDoctitle(t.title),PF.fn.growl.expirable(PF.fn._s("File edited successfully.")),CHV.fn.list_editor.addAlbumtoModals(t.album);var o=$("[data-submit-fn='CHV.fn.submit_image_edit']");$.each(["description","name","password"],function(e,t){var a=$("[name=form-album-"+t+"]",o);a.is("textarea")?a.val("").html(""):a.val("").attr("value","")}),$("[name=form-privacy] option",o).each(function(){$(this).removeAttr("selected")}),$("[data-combo-value=password]",o).hide(),$("[name=form-album-id]",o).find("option").removeAttr("selected"),$("[name=form-album-id]",o).find("[value="+t.album.id_encoded+"]").attr("selected",!0)}},CHV.fn.albumEdit={before:function(){var e="[data-before-fn='CHV.fn.albumEdit.before']";$("[data-action=album-switch]",e).remove();var t=$(CHV.fn.ctaForm.selectors.enable,e);CHV.fn.ctaForm.destroy(),CHV.fn.ctaForm.enable&&t.prop("checked",!0).trigger("change")},load:function(){var e=$(CHV.fn.ctaForm.selectors.enable,PF.obj.modal.selectors.root);e.is(":checked")&&e.prop("checked",!0).trigger("change")},submit:function(){var e=$(PF.obj.modal.selectors.root);return $("[name=form-album-name]",e).val()?(PF.obj.modal.form_data={action:"edit",edit:"album",editing:{id:CHV.obj.resource.id,name:$("[name=form-album-name]",e).val(),privacy:$("[name=form-privacy]",e).val(),description:$("[name=form-album-description]",e).val(),cta_enable:+CHV.fn.ctaForm.enable,cta:JSON.stringify(CHV.fn.ctaForm.array)}},"password"==PF.obj.modal.form_data.editing.privacy&&(PF.obj.modal.form_data.editing.password=$("[name=form-album-password]",e).val()),!0):(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1)},complete:{success:function(e){var t=e.responseJSON.album;$("[data-text=album-name]").html(PF.fn.htmlEncode(t.name)),$("[data-text=album-description]").html(PF.fn.htmlEncode(t.description)),CHV.fn.resource_privacy_toggle(t.privacy);var a=CHV.obj.resource.type;CHV.obj.resource.type=null,CHV.fn.list_editor.updateItem($(PF.obj.listing.selectors.list_item,PF.obj.listing.selectors.content_listing_visible),e.responseJSON),CHV.obj.resource.type=a,$("[data-modal]").each(function(){$("option[value="+t.id_encoded+"]",this).text(t.name+("public"!==t.privacy?" ("+PF.fn._s("private")+")":""))}),CHV.fn.common.updateDoctitle(t.name),CHV.fn.ctaButtons.render(t.cta_html),PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},CHV.fn.category={formFields:["id","name","url_key","description"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1;return!!CHV.fn.common.validateForm(t)&&(!1===/^[-\w]+$/.test($("[name=form-category-url_key]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid URL key.")),$("[name=form-category-url_key]",t).highlight(),!1):(Object.size(CHV.obj.categories)>0&&$.each(CHV.obj.categories,function(o,i){return void 0!==e&&i.id==e||(i.url_key==$("[name=form-category-url_key]",t).val()?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("Category URL key already being used.")),$("[name=form-category-url_key]",t).highlight(),!1)))},edit:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.category.formFields,function(e,t){e="form-category-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-category-id]",e).val();return!!CHV.fn.category.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"category",editing:{}},$.each(CHV.fn.category.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-category-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=category][data-category-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=category-"+e+"]",a).html(PF.fn.htmlEncode(t))}),$("[data-link=category-url]").attr("href",t.url),CHV.obj.categories[t.id]=t,PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},delete:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",'"'+o.name+'"'))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"category",deleting:{id:e}},!0},complete:{success:function(e){ +PF.fn.growl.expirable(PF.fn._s("Category successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=category][data-category-id="+t+"]").remove(),delete CHV.obj.categories[t]}}},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.category.validateForm()&&(PF.obj.modal.form_data={action:"add-category",category:{}},$.each(CHV.fn.category.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.category[a]=$("[name=form-category-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=dashboard-categories-list]",o=$("[data-content=category-dashboard-template]").html();$.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o),0==Object.size(CHV.obj.categories)&&(CHV.obj.categories={}),CHV.obj.categories[t.id]=t,PF.fn.growl.call(PF.fn._s("Category %s added.",'"'+t.name+'"'))}}}},CHV.fn.ip_ban={formFields:["id","ip","expires","message"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1,o=$("[name=form-ip_ban-ip]",t).val();return!!CHV.fn.common.validateForm(t)&&(""!==$("[name=form-ip_ban-expires]",t).val()&&0==/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test($("[name=form-ip_ban-expires]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid expiration date.")),$("[name=form-ip_ban-expires]",t).highlight(),!1):(Object.size(CHV.obj.ip_bans)>0&&$.each(CHV.obj.ip_bans,function(t,i){return void 0!==e&&i.id==e||(i.ip==o?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("IP %s already banned.",o)),$("[name=form-ip_ban-ip]",t).highlight(),!1)))},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.ip_ban.validateForm()&&(PF.obj.modal.form_data={action:"add-ip_ban",ip_ban:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.ip_ban[a]=$("[name=form-ip_ban-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=dashboard-ip_bans-list]",o=$("[data-content=ip_ban-dashboard-template]").html();void 0!==o&&($.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o)),0==Object.size(CHV.obj.ip_bans)&&(CHV.obj.ip_bans={}),CHV.obj.ip_bans[t.id]=t,$("[data-content=ban_ip]").addClass("hidden"),$("[data-content=banned_ip]").removeClass("hidden"),PF.fn.growl.call(PF.fn._s("IP %s banned.",t.ip))},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},edit:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.ip_ban.formFields,function(e,t){e="form-ip_ban-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-ip_ban-id]",e).val();return!!CHV.fn.ip_ban.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"ip_ban",editing:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-ip_ban-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=ip_ban][data-ip_ban-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=ip_ban-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.ip_bans[t.id]=t},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},delete:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",o.ip))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"ip_ban",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("IP ban successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=ip_ban][data-ip_ban-id="+t+"]").remove(),delete CHV.obj.ip_bans[t]}}}},CHV.fn.storage={formFields:["id","name","api_id","bucket","server","service","capacity","region","key","secret","url","account_id","account_name","type_chain"],chain:["other","document","audio","video","image"],calling:!1,validateForm:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-storage-id]",e).val(),a=!0;if($.each($(":input",e),function(e,t){$(this).is(":hidden")?$(this).attr("required")&&$(this).removeAttr("required").attr("data-required",1):1==$(this).attr("data-required")&&$(this).attr("required","required"),$(this).is(":visible")&&""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),a=!1)}),!a)return PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1;var o,i=$("[name=form-storage-capacity]",e),n=i.val();return""!==n&&(0==/^[\d\.]+\s*[A-Za-z]{2}$/.test(n)||void 0===n.getBytes()?o=PF.fn._s("Invalid storage capacity value. Make sure to use a valid format."):void 0!==CHV.obj.storages[t]&&n.getBytes()0&&(t=String(t).formatBytes(2)),s.attr("value",t)),"form-storage-type_chain"===e){let e=(parseInt(t)>>>0).toString(2).paddingLeft("0".repeat(CHV.fn.storage.chain.length)).split("");CHV.fn.storage.chain.forEach(function(t,a){$("#storage_type_enable_"+t,i).removeAttr("checked").attr("checked",1==e[a])})}}),$("[data-combo-value]").addClass("soft-hidden"),$(n).removeClass("soft-hidden")},submit:function(){var e=PF.obj.modal.selectors.root;$("[name=form-storage-id]",e).val();if(!CHV.fn.storage.validateForm())return!1;PF.obj.modal.form_data={action:"edit",edit:"storage",editing:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.editing[a]=$(o,e).val()});let t=CHV.fn.storage.chain.map(function(t){return $("#storage_type_enable_"+t,e).prop("checked")?1:0});return PF.obj.modal.form_data.editing.type_chain=parseInt(t.join(""),2),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=storage][data-storage-id="+t.id+"]",o=$("[data-action=toggle-storage-https]",a);$.each(t,function(e,t){$("[data-content=storage-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.storages[t.id]=t,CHV.fn.storage.toggleBoolDisplay(o,1==t.is_https)},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},add:{submit:function(){if(!CHV.fn.storage.validateForm())return!1;var e=PF.obj.modal.selectors.root;return PF.obj.modal.form_data={action:"add-storage",storage:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;"id"!=a&&(o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.storage[a]=$(o,e).val())}),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=dashboard-storages-list]",o=$("[data-content=storage-dashboard-template]").html();$.each(t,function(e,t){var a=e.toUpperCase();if("is_https"==e||"is_active"==e)t=CHV.obj.storageTemplate.icon.replace("%TITLE%",CHV.obj.storageTemplate.messages[e]).replace("%ICON%",CHV.obj.storageTemplate.checkboxes[t]).replace("%PROP%",e.replace("is_",""));o=o.replace(new RegExp("%"+a+"%","g"),t||"")}),$(a).append(o),PF.fn.bindtipTip($("[data-storage-id="+t.id+"]")),0==CHV.obj.storages.length&&(CHV.obj.storages={}),CHV.obj.storages[t.id]=t},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},toggleBoolDisplay:function(e,t){var a={0:e.data("unchecked-icon"),1:e.data("checked-icon")};e.removeClass(a[0]+" "+a[1]).addClass(a[t?1:0])}},CHV.fn.common={validateForm:function(e){if(void 0===e)e=PF.obj.modal.selectors.root;var t=!0;return $.each($(":input:visible",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),!!t||(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},updateDoctitle:function(e){void 0!==CHV.obj.page_info&&(CHV.obj.page_info.pre_doctitle=e,CHV.obj.page_info.doctitle=CHV.obj.page_info.pre_doctitle+CHV.obj.page_info.pos_doctitle,document.title=CHV.obj.page_info.doctitle)}},CHV.fn.user={add:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"add-user",user:{username:$("[name=form-username]",e).val(),email:$("[name=form-email]",e).val(),password:$("[name=form-password]",e).val(),role:$("[name=form-role]",e).val()}},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){e.responseJSON;PF.fn.growl.expirable(PF.fn._s("%s added successfully.",PF.fn._n("User","Users",1)))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}},delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"user",owner:CHV.obj.resource.user.id,deleting:CHV.obj.resource.user},!0}},ban:{submit:function(){return PF.obj.modal.form_data={action:"ban",ban:"user",banning:CHV.obj.resource.user.id},!0},success:function(){}}},CHV.fn.submit_resource_approve=function(){return PF.obj.modal.form_data={action:"approve",approve:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,approving:CHV.obj.resource},!0},CHV.fn.complete_resource_approve={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){redir=CHV.obj.resource.url,window.location=redir})}},CHV.fn.submit_resource_delete=function(){return PF.obj.modal.form_data={action:"delete",delete:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,deleting:CHV.obj.resource},!0},CHV.fn.complete_resource_delete={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){var e;e="album"==CHV.obj.resource.type||"image"==CHV.obj.resource.type?CHV.obj.resource.parent_url:CHV.obj.resource.user?CHV.obj.resource.user.url:CHV.obj.resource.url,void 0!==e&&(window.location=e.replace(/\/?$/,"/")+"?deleted")})}},CHV.fn.list_editor={blink:function(e){e.addClass("ui-selecting"),setTimeout(function(){e.removeClass("ui-selecting")},200)},selectionCount:function(){var e=$(PF.obj.listing.selectors.content_listing);e.each(function(){var t=$("[data-content=pop-selection]","[data-content=list-selection][data-tab="+$(this).attr("id")+"]"),a=$(PF.obj.listing.selectors.list_item+".selected",this).length;if(all_count=$(PF.obj.listing.selectors.list_item,this).length,t.toggleClass("disabled",0==a),$("[data-text=selection-count]",t).text(a>0?a:""),"images"==e.data("list")&&a>0){var o=$(PF.obj.listing.selectors.list_item+".selected[data-flag=safe]",this).length>0,i=$(PF.obj.listing.selectors.list_item+".selected[data-flag=unsafe]",this).length>0;$("[data-action=flag-safe]",t)[(i?"remove":"add")+"Class"]("hidden"),$("[data-action=flag-unsafe]",t)[(o?"remove":"add")+"Class"]("hidden")}$(this).is(":visible")&&($("body").toggleClass("--has-selection",a>0),CHV.fn.list_editor.listMassActionSet(all_count==a?"clear":"select"))})},removeFromList:function(e,t){if(void 0!==e){e=e instanceof jQuery==0?$(e):e;var a=$(PF.obj.listing.selectors.content_listing_visible),o=e.length;e.fadeOut("fast");var i=e.first().data("type"),n=parseInt($("[data-text="+i+"-count]").text())-o;CHV.fn.list_editor.updateUserCounters(e.first().data("type"),o,"-"),e.promise().done(function(){$(document).removeClass(CHV.fn.listingViewer.selectors.bodyShown.substr(1));var i={};if(e.each(function(){$("[data-id="+$(this).data("id")+"]").each(function(){var e=$(this).closest(PF.obj.listing.selectors.content_listing).attr("id");i[e]||(i[e]=0),i[e]+=1})}),1==o?$("[data-id="+$(this).data("id")+"]").remove():e.each(function(){$("[data-id="+$(this).data("id")+"]").remove()}),PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(),CHV.fn.list_editor.selectionCount(),void 0!==t&&"string"==typeof t&&PF.fn.growl.expirable(t),$(PF.obj.listing.selectors.content_listing_pagination,a).exists()||0!=$(PF.obj.listing.selectors.list_item,a).length||(n=0),0==n)a.html(PF.obj.listing.template.empty),$(PF.obj.listing.selectors.content_listing+":not("+PF.obj.listing.selectors.content_listing_visible+")").data({empty:null,load:"ajax"}),$("[data-content=list-selection][data-tab="+a.attr("id")+"]").addClass("disabled");else if(0==$(PF.obj.listing.selectors.list_item,a).length){if($(PF.obj.listing.selectors.pad_content).height(0),$("[data-action=load-more]",a).exists())return $(PF.obj.listing.selectors.content_listing_visible).data("page",0),$("[data-action=load-more]",a).click(),void(PF.obj.listing.recolumnize=!0);var r=$("[data-pagination=next]",a);if(r.exists()){var s=r.attr("href"),l=PF.fn.deparam(s);return"page"in l&&l.page>1&&(s=s.changeURLParameterValue("page",l.page-1)),void(window.location=s)}}})}},deleteFromList:function(e){if(void 0===t)var t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been deleted."):null)},moveFromList:function(e,t){if(void 0===t)t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been moved."):null)},toggleSelectItem:function(e,t){if("boolean"!=typeof t)t=!e.hasClass("selected");var a,o,i,n=$(".viewer").is(":visible")?$("[data-type=image][data-id="+e.attr("data-id")+"]"):e,r=$("[data-action=select] .btn-icon",n);n.hasClass("unselect")||(n.addClass("unselect"),t?(Boolean(window.navigator.vibrate)&&window.navigator.vibrate([15,125,25]),n.addClass("selected"),a=r.data("icon-selected"),o=r.data("icon-unselected"),i=PF.fn._s("Unselect")):(n.removeClass("selected ui-selected"),a=r.data("icon-unselected"),o=r.data("icon-selected"),i=PF.fn._s("Select")),r.removeClass(o).addClass(a),setTimeout(function(){n.removeClass("unselect")},350),$("[data-action=select] .label",n).text(i),CHV.fn.list_editor.selectionCount())},selectItem:function(e){this.toggleSelectItem(e,!0)},unselectItem:function(e){this.toggleSelectItem(e,!1),e.removeClass("selected")},selectAll:function(e){this.selectItem($(PF.obj.listing.selectors.list_item+":visible:not(.selected)")),this.listMassActionSet("clear"),e.stopPropagation()},clearSelection:function(e){var t=$(PF.obj.listing.selectors.list_item+".selected",PF.obj.listing.selectors[e?"content_listing":"content_listing_visible"]);this.unselectItem(t),this.listMassActionSet("select")},listMassActionSet:function(e){var t="select"==e?"clear":"select",a=$("[data-text-select-all][data-action=list-"+t+"-all]:visible"),o=a.data("text-"+e+"-all");a.text(o).attr("data-action","list-"+e+"-all"),PF.fn.close_pops()},updateItem:function(e,t,a,o){if(e instanceof jQuery==0)e=$(e);var i=e.data("type"),n="image"==i?t.album:t;if(this.addAlbumtoModals(n),$("option[value="+n.id_encoded+"]","[name=form-album-id]").html(PF.fn.htmlEncode(n.name_with_privacy_readable_html)),void 0===a)a="edit";if("edit"==a||"move"==a){if("move"==a&&"album"==CHV.obj.resource.type)return void CHV.fn.list_editor.moveFromList(e,o);e.attr("data-description",t.description),"image"==i?(void 0!==t.title&&(e.attr("data-title",t.title),e.find("[title]").attr("title",t.title),$("[data-text=image-title]",e).text(PF.fn.htmlEncode(t.title))),void 0!==t.title_truncated&&$("[data-text=image-title-truncated]",e).html(PF.fn.htmlEncode(t.title_truncated)),void 0!==t.category_id&&e.attr("data-category-id",t.category_id),e.attr({"data-album-id":n.id_encoded,"data-flag":1==t.nsfw?"unsafe":"safe"}),$("[data-content=album-link]",e).attr("href",n.url)):e.attr({"data-privacy":n.privacy,"data-password":n.password,"data-name":n.name}),e.attr("data-privacy",n.privacy),$("[data-text=album-name]",e).html(PF.fn.htmlEncode(n.name)),PF.fn.growl.expirable("edit"==a?PF.fn._s("The content has been edited."):PF.fn._s("The content has been moved."))}},addAlbumtoModals:function(e){var t=!1;$("[name=form-album-id]","[data-modal]").each(function(){e.id_encoded&&!$("option[value="+e.id_encoded+"]",this).exists()&&($(this).append('"),t=!0)}),t&&CHV.fn.list_editor.updateUserCounters("album",1,"+")},updateAlbum:function(e){$("[data-id="+e.id_encoded+"]").each(function(){""!==e.html&&($(this).after(e.html),$(this).remove())})},updateUserCounters:function(e,t,a){if(void 0===a)a="+";var o,i,n=$("[data-text="+e+"-count]"),r=$("[data-text="+e+"-label]"),s=(t=parseInt(t),parseInt(n.html()));switch(a){case"+":o=s+t;break;case"-":o=s-t;break;case"=":o=t}i=o-s;var l=$("[data-text=total-"+n.data("text")+"]"),d=$("[data-text="+l.data("text")+"-label]"),c=parseInt(l.html()),u=c+i;n.text(o),l.text(u),r.text(r.data(1==o?"label-single":"label-plural")),d.text(r.data(1==u?"label-single":"label-plural"))},updateMoveItemLists:function(e,t,a){if(CHV.fn.list_editor.clearSelection(),/image/.test(t))"image"==t?CHV.fn.list_editor.updateItem("[data-type=image][data-id="+a.data("id")+"]",e.image,"move"):(a.each(function(){CHV.fn.list_editor.updateItem("[data-type=image][data-id="+$(this).data("id")+"]",e,"move",!1)}),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")));else{if(CHV.fn.list_editor.moveFromList(a,!1),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")),e.album)if(void 0!==e.albums_old?"true"==e.request.album.new:"true"==e.request.editing.new_album){CHV.fn.list_editor.addAlbumtoModals(e.album);var o=parseInt($("[data-text=album-count]").text())-1;$(PF.obj.listing.selectors.pad_content).each(function(){var t=$(this).find(PF.obj.listing.selectors.list_item).length;if(0!=t){var a=PF.fn.deparam($(this).closest(PF.obj.listing.selectors.content_listing).data("params"));"date_desc"!=a.sort&&o!=t||$(this)["date_desc"==a.sort?"prepend":"append"](e.album.html)}})}else CHV.fn.list_editor.updateAlbum(e.album);PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(0)}}},CHV.fn.import={errorHandler:function(e){PF.fn.growl.call(e.error.message)},reset:function(e){e=parseInt(e);CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importReset",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}})},updateStats:function(e){e=parseInt(e);"readyState"in CHV.obj.import.working[e].stats&&4!=CHV.obj.import.working[e].stats.readyState?console.error("Aborting stats timeout call (previous call is still not ready)"):(CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importStats",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}}))},delete:{submit:function(e){return PF.obj.modal.form_data={action:"importDelete",id:e},!0},deferred:{success:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s("Import ID %s removed",t.import.id)),$("[data-id="+t.import.id+"]",CHV.obj.import.sel.root).remove(),1==$("li",CHV.obj.import.sel.root).size()&&$(CHV.obj.import.sel.root).addClass("hidden")},error:function(e){CHV.fn.import.errorHandler(e.responseJSON)}}},parseTemplate:function(e,t){var a=CHV.obj.import.rowTpl;for(var o in CHV.obj.import.importTr)void 0!==e[o]&&(a=a.replaceAll("%"+o+"%",e[o]));a=a.replaceAll("%parse%",e.options.root),a=a.replaceAll("%shortParse%",e.options.root.charAt(0)),a=a.replaceAll("%displayStatus%",CHV.obj.import.statusesDisplay[e.status]);var i=$($.parseHTML(a)).attr("data-object",JSON.stringify(e));return i}},CHV.fn.Palettes={timeout:{},get:function(){return($("html").get(0).className.match(/(^|\s)palette-\S+/g)||[]).join(" ")},set:function(e){$("html").attr("data-palette",e).removeClass(this.get()).addClass("palette-"+e)},preview:function(e){$("html").removeClass(this.get()).addClass("palette-"+e)},save:function(){clearTimeout(this.timeout),this.timeout=setTimeout(function(){$.ajax({type:"POST",data:{action:"paletteSet",palette_id:CHV.obj.config.palettesId[$("html").attr("data-palette")]},cache:!1})},400)}},CHV.fn.license={set:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"set-license-key",key:$("[name=chevereto-license-key]",e).val()},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){let t=e.responseJSON,a=$("[data-action=upgrade]");if("free"===CHV.obj.system_info.edition)return a.removeClass("hidden"),void a.trigger("click");PF.fn.growl.call(PF.fn._s(t.success.message))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}}}; \ No newline at end of file