From fd15be6247f83ed92ac19a266752a2f4c8749112 Mon Sep 17 00:00:00 2001 From: rpintodasilva Date: Wed, 20 May 2026 10:40:24 +0200 Subject: [PATCH 1/2] French Transalation - v2 --- frontend/src/i18n/locales/fr.json | 2679 +++++++++++++++-------------- 1 file changed, 1368 insertions(+), 1311 deletions(-) diff --git a/frontend/src/i18n/locales/fr.json b/frontend/src/i18n/locales/fr.json index ae7671a3..b753a6b2 100644 --- a/frontend/src/i18n/locales/fr.json +++ b/frontend/src/i18n/locales/fr.json @@ -1,13 +1,13 @@ { "userManagement": { "title": "Gestion des utilisateurs", - "subtitle": "Gérer les administrateurs et les invitations", + "subtitle": "Gérer les utilisateurs administrateurs et les invitations", "loading": "Chargement des utilisateurs...", "loadError": "Échec du chargement des utilisateurs. Veuillez réessayer.", "inviteUser": "Inviter un utilisateur", "createInvitation": "Créer une invitation", "email": "Adresse e-mail", - "emailPlaceholder": "utilisateur@exemple.com", + "emailPlaceholder": "utilisateur@example.com", "role": "Rôle", "selectRole": "Sélectionner un rôle", "sendInvitation": "Envoyer l'invitation", @@ -34,7 +34,7 @@ "invitations": "Invitations" }, "stats": { - "totalUsers": "Total Utilisateurs", + "totalUsers": "Utilisateurs totaux", "activeUsers": "Utilisateurs actifs", "pendingInvitations": "Invitations en attente", "inactiveUsers": "Utilisateurs inactifs" @@ -51,7 +51,7 @@ "lastLogin": "Dernière connexion", "actions": "Actions", "invitedBy": "Invité par", - "expires": "Expire le" + "expires": "Expire" }, "validation": { "emailRequired": "L'e-mail est requis", @@ -66,7 +66,7 @@ "noInvitationsFound": "Aucune invitation ne correspond à votre recherche", "confirmDeactivate": { "title": "Désactiver l'utilisateur", - "message": "Êtes-vous sûr de vouloir désactiver {{name}} ? Il ne pourra plus se connecter." + "message": "Êtes-vous sûr de vouloir désactiver {{name}} ? Il/elle ne pourra plus se connecter." }, "confirmCancelInvitation": { "title": "Annuler l'invitation", @@ -90,21 +90,21 @@ "close": "Fermer", "logout": "Déconnexion", "change": "Modifier", - "remove": "Retirer", + "remove": "Supprimer", "download": "Télécharger", "downloadAll": "Tout télécharger", "photo": "photo", "photos": "photos", "video": "vidéo", - "media": "média", + "media": "médias", "upload": "Téléverser", "customize": "Personnaliser", "hide": "Masquer", "unknown": "Inconnu", "notSet": "Non défini", - "of": "sur", + "of": "de", "selected": "Sélectionné", - "chunk": "Segment", + "chunk": "Bloc", "optional": "optionnel", "tryAgain": "Réessayer", "active": "Actif", @@ -114,73 +114,72 @@ "pageOf": "Page {{current}} sur {{total}}", "collapse": "Réduire", "expand": "Développer", - "submitting": "Envoi en cours…", + "submitting": "Envoi en cours...", "copy": "Copier", "copied": "Copié !", - "applying": "Application en cours…", + "applying": "Application en cours...", "done": "Terminé", "retry": "Réessayer", "characters": "caractères", "saveChanges": "Enregistrer les modifications", "resetChanges": "Réinitialiser les modifications", - "dismiss": "Ignorer" + "dismiss": "Ignorer", + "discard": "Abandonner" }, "upload": { - "photoCategory": "Catégorie de photo", + "photoCategory": "Catégorie de la photo", "noCategory": "Aucune catégorie", "eventSpecific": "(Spécifique à l'événement)", "clickToUpload": "Cliquez pour téléverser ou glissez-déposez", - "fileRequirements": "JPEG, PNG ou WebP (max 50 Mo par fichier, {{limit}} fichiers par envoi)", + "fileRequirements": "JPEG, PNG ou WebP (max 50 Mo par fichier, {{limit}} fichiers par téléversement)", "selectedFiles": "Fichiers sélectionnés", - "uploading": "Téléversement...", + "uploading": "Téléversement en cours...", + "transferring": "Transfert en cours", + "processing": "Traitement des photos...", + "processingHint": "Les fichiers sont téléversés. PicPeak génère maintenant les miniatures et lit les métadonnées. Vous pouvez quitter cette page — le travail continue en arrière-plan.", + "processingProgress": "{{complete}} sur {{total}} terminé", + "retryFailed": "Réessayer les fichiers échoués", "uploadComplete": "Téléversement terminé !", "someFilesFailed": "Certains fichiers n'ont pas pu être téléversés", + "replaceByName": "Remplacer les photos existantes portant le même nom", "uploadPhotos": "Téléverser des photos", - "uploadMedia": "Téléverser photos et vidéos", - "maxFilesReached": "Maximum de {{limit}} fichiers autorisés", - "someFilesSkipped": "Seuls {{allowed}} fichiers supplémentaires peuvent être ajoutés (limite de {{limit}})", - "tooManyFiles": "Un maximum de {{limit}} fichiers peuvent être téléversés à la fois", + "uploadMedia": "Téléverser des photos & vidéos", + "maxFilesReached": "Maximum {{limit}} fichiers autorisés", + "someFilesSkipped": "Seulement {{allowed}} fichiers supplémentaires peuvent être ajoutés (limite {{limit}})", + "tooManyFiles": "Maximum {{limit}} fichiers peuvent être téléversés en une seule fois", "limitInfo": "{{selected}} sur {{limit}} fichiers sélectionnés ({{remaining}} restants)", "limitReached": "Limite de téléversement atteinte ({{limit}} fichiers par lot)", - "replacedFiles_many": "{{count}} photos remplacées", "replacedFiles_one": "{{count}} photo remplacée", "replacedFiles_other": "{{count}} photos remplacées", - "processingFailed_many": "{{count}} photos n'ont pas pu être traitées", "processingFailed_one": "{{count}} photo n'a pas pu être traitée", "processingFailed_other": "{{count}} photos n'ont pas pu être traitées", - "replaceByName": "Remplacer les photos existantes avec le même nom", - "processing": "Traitement des photos…", - "processingProgress": "{{complete}} sur {{total}} terminés", - "processingHint": "Les fichiers sont téléversés. PicPeak génère maintenant les miniatures et lit les métadonnées. Vous pouvez quitter cette page — le travail continue en arrière-plan.", - "transferring": "Transfert en cours", - "uploadingChunks_many": "{{count}} segments en cours de téléversement", - "uploadingChunks_one": "{{count}} segment en cours de téléversement", - "uploadingChunks_other": "{{count}} segments en cours de téléversement", - "retryFailed": "Réessayer les échoués" + "uploadingChunks_one": "{{count}} bloc en cours de téléversement", + "uploadingChunks_other": "{{count}} blocs en cours de téléversement" }, "navigation": { "dashboard": "Tableau de bord", "events": "Événements", - "settings": "Paramètres", "archives": "Archives", - "emailSettings": "Paramètres e-mail", - "branding": "Identité visuelle", + "settings": "Paramètres", "eventTypes": "Types d'événements", - "backup": "Sauvegarde et Restauration", + "branding": "Marque", + "emailSettings": "Paramètres e-mail", + "backup": "Sauvegarde & Restauration", "cmsPages": "Pages CMS", "users": "Utilisateurs", + "calendar": "Calendrier", "clients": "Clients" }, "archives": { "title": "Archives", - "subtitle": "Gérer les galeries photo archivées", + "subtitle": "Gérer les galeries de photos archivées", "loadingArchives": "Chargement des archives...", - "totalArchives": "Total des archives", - "storageUsed": "Espace disque utilisé", - "totalPhotos": "Total des photos", - "avgArchiveSize": "Taille moyenne d'archive", + "totalArchives": "Archives totales", + "storageUsed": "Espace utilisé", + "totalPhotos": "Photos totales", + "avgArchiveSize": "Taille moyenne des archives", "searchPlaceholder": "Rechercher des archives...", - "allTypes": "Tous les types", + "allTypes": "Tous types", "wedding": "Mariage", "birthday": "Anniversaire", "corporate": "Entreprise", @@ -197,43 +196,43 @@ "actions": "Actions" }, "noArchivesFound": "Aucune archive trouvée", - "eventDateNA": "Date de l'événement : N/A", - "processing": "Traitement...", + "eventDateNA": "Date de l'événement : N/D", + "processing": "Traitement en cours...", "download": "Télécharger", "restore": "Restaurer", "delete": "Supprimer", "showing": "Affichage de {{from}} à {{to}} sur {{total}} archives", "page": "Page {{current}} sur {{total}}", "storageManagement": "Gestion du stockage", - "storageInfo": "Les archives sont conservées de façon permanente sauf suppression manuelle. Envisagez de mettre en œuvre une politique de rétention pour gérer les coûts de stockage.", + "storageInfo": "Les archives sont stockées de manière permanente sauf suppression manuelle. Envisagez de mettre en place une politique de rétention pour gérer les coûts de stockage.", "confirmRestore": "Êtes-vous sûr de vouloir restaurer cette archive ? L'événement redeviendra actif.", - "confirmDelete": "Êtes-vous sûr de vouloir supprimer définitivement cette archive ? Cette action est irréversible.", + "confirmDelete": "Êtes-vous sûr de vouloir supprimer définitivement cette archive ? Cette action ne peut pas être annulée.", "restoreSuccess": "Archive restaurée avec succès", "deleteSuccess": "Archive supprimée définitivement" }, "auth": { "password": "Mot de passe", - "enterPassword": "Entrer le mot de passe de la galerie", - "passwordPlaceholder": "Saisissez le mot de passe de la galerie", + "enterPassword": "Entrez le mot de passe de la galerie", + "passwordPlaceholder": "Entrez le mot de passe de la galerie", "invalidPassword": "Mot de passe invalide", - "wrongPassword": "Mot de passe incorrect. Veuillez vérifier et réessayer.", + "wrongPassword": "Mot de passe incorrect. Veuillez vérifier votre mot de passe et réessayer.", "tooManyAttempts": "Trop de tentatives de connexion échouées. Veuillez réessayer plus tard.", "pleaseEnterPassword": "Veuillez entrer un mot de passe", "passwordHint": "Le mot de passe a été fourni par l'organisateur de l'événement. Contactez-le si vous ne l'avez pas." }, "gallery": { "expires": "Expire", - "expired": "Expirée", - "contactOrganizer": "Veuillez contacter l'organisateur si vous avez besoin d'accéder à ces photos", - "searchPhotos": "Rechercher par nom de fichier...", + "expired": "Expiré", + "contactOrganizer": "Veuillez contacter l'organisateur de l'événement si vous avez besoin d'accéder à ces photos.", + "searchPhotos": "Rechercher des photos par nom de fichier...", "sortByDate": "Trier par date", "sortByName": "Trier par nom", "sortBySize": "Trier par taille", "allPhotos": "Toutes les photos", - "feedbackFilter": "Filtre d'avis", - "all": "Tout", - "liked": "Aimé", - "favorited": "Favori", + "feedbackFilter": "Filtre de commentaires", + "all": "Tous", + "liked": "Aimés", + "favorited": "Favoris", "favorites": "Favoris", "needHelp": "Besoin d'aide ? Contactez-nous à", "noPhotosFound": "Aucune photo trouvée", @@ -244,109 +243,104 @@ "downloadBefore": "Téléchargez vos photos avant qu'elles ne soient plus disponibles.", "viewGallery": "Voir la galerie", "downloadAll": "Tout télécharger", - "downloadError": "Échec du téléchargement de certaines photos", + "downloadError": "Certaines photos n'ont pas pu être téléchargées", "selectPhotos": "Sélectionner des photos", "cancelSelection": "Annuler la sélection", "selectAll": "Tout sélectionner", "deselectAll": "Tout désélectionner", "deleteSelected": "Supprimer la sélection", "searchByFilename": "Rechercher par nom de fichier...", - "uncategorized": "Non catégorisé", - "sortAscending": "Tri croissant", - "sortDescending": "Tri décroissant", - "remaining": "restant", + "uncategorized": "Non catégorisées", + "sortAscending": "Trier par ordre croissant", + "sortDescending": "Trier par ordre décroissant", + "remaining": "restants", "selectPhotosHint": "Astuce : Utilisez Ctrl+Clic (Cmd+Clic sur Mac) pour sélectionner rapidement plusieurs photos", "filters": "Filtres", "toggleMenu": "Basculer le menu", "allCategories": "Toutes les catégories", "categories": "Catégories", - "mediaType": "Média", + "mediaType": "Médias", "allMedia": "Tous les médias", - "photosOnly": "Photos uniquement", - "videosOnly": "Vidéos uniquement", + "photosOnly": "Photos seulement", + "videosOnly": "Vidéos seulement", "download": "Télécharger", - "noMedia": "Aucun média téléversé pour le moment", + "noMedia": "Aucun média téléversé pour l'instant", "searchPlaceholder": "Rechercher des photos...", "sortBy": "Trier par", "sortByCaptureDate": "Trier par date de capture", "sortByRating": "Trier par note", - "photoGallery": "Galerie Photo", + "photoGallery": "Galerie photo", "photos": "Photos", "allRightsReserved": "Tous droits réservés", "searchMemories": "Rechercher des souvenirs...", "thankYou": "Merci", - "thankYouMessage": "D'avoir fait partie de notre histoire et d'avoir rendu cette journée inoubliable.", + "thankYouMessage": "D'avoir fait partie de notre histoire et rendu notre journée spéciale inoubliable.", "feedback": { - "title": "Avis", - "shareThoughts": "Partagez votre avis sur \"{{name}}\"", + "title": "Commentaires", + "shareThoughts": "Partagez vos impressions sur \"{{name}}\"", "rateThisMoment": "Notez ce moment", "comments": "Commentaires", - "noComments": "Pas encore de commentaires. Soyez le premier !", + "noComments": "Aucun commentaire pour l'instant. Soyez le premier !", "yourName": "Votre nom", "yourEmail": "Votre e-mail", - "writeLovelyNote": "Écrivez un petit mot...", + "writeLovelyNote": "Écrivez un joli message...", "postComment": "Publier le commentaire", "anonymous": "Anonyme" }, - "expiresIn_many": "La galerie expire dans {{count}} jours", - "expiresIn_one": "La galerie expire dans {{count}} jour", - "expiresIn_other": "La galerie expire dans {{count}} jours", - "downloading_many": "Téléchargement de {{count}} photos…", - "downloading_one": "Téléchargement d'1 photo…", - "downloading_other": "Téléchargement de {{count}} photos…", - "photosSelected_many": "{{count}} photos sélectionnées", - "photosSelected_one": "{{count}} photo sélectionnée", - "photosSelected_other": "{{count}} photos sélectionnées", - "downloadSelected_many": "Télécharger {{count}} photos", - "downloadSelected_one": "Télécharger {{count}} photo", - "downloadSelected_other": "Télécharger {{count}} photos", "rated": "Noté", "commented": "Commenté", + "expiresIn_one": "La galerie expire dans {{count}} jour", + "expiresIn_other": "La galerie expire dans {{count}} jours", + "downloading_one": "Téléchargement de 1 photo...", + "downloading_other": "Téléchargement de {{count}} photos...", "guestRecovery": { - "invalidEmail": "Saisissez une adresse e-mail valide", - "codeSent": "Vérifiez votre boîte de réception pour un code de vérification.", + "invalidEmail": "Entrez une adresse e-mail valide", + "codeSent": "Consultez votre boîte de réception pour un code de vérification.", "requestError": "Impossible d'envoyer le code. Réessayez.", - "invalidCode": "Saisissez le code à 6 chiffres", + "invalidCode": "Entrez le code à 6 chiffres", "verifyError": "Code invalide ou expiré.", "back": "Retour", - "title": "Retrouvez vos sélections", - "emailStepDescription": "Saisissez l'adresse e-mail que vous avez utilisée. Nous vous enverrons un code de vérification à 6 chiffres.", - "codeStepDescription": "Saisissez le code à 6 chiffres que nous avons envoyé à votre adresse e-mail.", + "title": "Récupérer vos sélections", + "emailStepDescription": "Entrez l'e-mail que vous avez utilisé précédemment. Nous allons vous envoyer un code de vérification à 6 chiffres.", + "codeStepDescription": "Entrez le code à 6 chiffres que nous vous avons envoyé par e-mail.", "emailLabel": "E-mail", "sendCode": "Envoyer le code", "codeLabel": "Code de vérification", "verifyCode": "Vérifier et continuer" }, "guestPrompt": { - "nameRequired": "Le nom est obligatoire", + "nameRequired": "Le nom est requis", "invalidEmail": "Adresse e-mail invalide", - "emailRequired": "L'e-mail est obligatoire", + "emailRequired": "L'e-mail est requis", "error": "Échec de l'inscription", - "title": "Bienvenue — quel est votre prénom ?", + "title": "Bienvenue — quel est votre nom ?", "description": "Vos sélections seront enregistrées sous ce nom afin que le photographe sache quelles photos vous aimez.", "nameLabel": "Votre nom", "namePlaceholder": "Entrez votre nom", "emailLabelRequired": "E-mail", - "emailLabel": "E-mail (facultatif)", - "emailPlaceholder": "vous@exemple.com", + "emailLabel": "E-mail (optionnel)", + "emailPlaceholder": "vous@example.com", "submit": "Continuer", "alreadyHere": "J'ai déjà été ici" }, "footer": { "forgetMeConfirm": "Votre nom et vos sélections seront supprimés de cette galerie.", - "forgetMe": "M'oublier ({{name}})", + "forgetMe": "Oubliez-moi ({{name}})", "socials": "Réseaux sociaux" }, - "photosCount_many": "{{count}} photos", "photosCount_one": "{{count}} photo", "photosCount_other": "{{count}} photos", - "poweredBy": "Propulsé par PicPeak" + "poweredBy": "Propulsé par PicPeak", + "photosSelected_one": "{{count}} photo sélectionnée", + "photosSelected_other": "{{count}} photos sélectionnées", + "downloadSelected_one": "Télécharger {{count}} photo", + "downloadSelected_other": "Télécharger {{count}} photos" }, "categories": { "title": "Catégories de photos", "addCategory": "Ajouter une catégorie", "eventSpecificCategories": "Catégories spécifiques à l'événement", - "noEventSpecificCategories": "Aucune catégorie spécifique. Les catégories globales sont disponibles par défaut.", + "noEventSpecificCategories": "Aucune catégorie spécifique à l'événement. Les catégories globales sont disponibles par défaut.", "globalCategoriesAlwaysAvailable": "Catégories globales (toujours disponibles) :", "deleteCategoryTitle": "Supprimer la catégorie", "categoryCreatedSuccess": "Catégorie créée avec succès", @@ -354,30 +348,32 @@ "failedToCreateCategory": "Échec de la création de la catégorie", "failedToDeleteCategory": "Échec de la suppression de la catégorie", "categoryName": "Nom de la catégorie", - "noCategoriesYet": "Pas encore de catégories. Créez votre première catégorie pour organiser les photos.", + "noCategoriesYet": "Aucune catégorie pour l'instant. Créez votre première catégorie pour organiser vos photos.", "deleteConfirm": "Êtes-vous sûr de vouloir supprimer \"{{name}}\" ?", "setCoverPhoto": "Définir comme photo de couverture", "removeCoverPhoto": "Retirer la photo de couverture", "coverPhotoSet": "Photo de couverture définie avec succès", "coverPhotoRemoved": "Photo de couverture retirée", "failedToSetCoverPhoto": "Échec de la définition de la photo de couverture", - "categoryHeroHint": "Si aucune photo de couverture n'est définie pour une catégorie, la photo principale par défaut sera utilisée." + "categoryHeroHint": "Si aucune photo de couverture n'est définie pour une catégorie, la photo par défaut sera utilisée." }, "events": { "title": "Événements", "create": "Créer", "createEvent": "Créer un événement", - "totalViews": "Total des vues", - "totalDownloads": "Total des téléchargements", + "totalViews": "Vues totales", + "totalDownloads": "Téléchargements totaux", "uniqueVisitors": "Visiteurs uniques", - "eventNamePlaceholder": "ex: Mariage de Julie & Thomas", + "eventNamePlaceholder": "ex. : Le mariage de Jean et Jeanne", "welcomeMessagePlaceholder": "Bienvenue à notre journée spéciale ! N'hésitez pas à télécharger et partager ces souvenirs...", - "hostEmailPlaceholder": "client@exemple.com", - "adminEmailPlaceholder": "admin@exemple.com", - "accessAndSecurity": "Accès et Sécurité", + "hostEmailPlaceholder": "client@example.com", + "adminEmailPlaceholder": "admin@example.com", + "adminEmailPickFromAdmins": "Choisir parmi les administrateurs :", + "adminEmailCustom": "E-mail personnalisé", + "accessAndSecurity": "Accès & Sécurité", "enterPassword": "Entrer le mot de passe", - "passwordPlaceholder": "Entrer un mot de passe sécurisé", - "confirmPasswordPlaceholder": "Confirmer le mot de passe", + "passwordPlaceholder": "Entrez un mot de passe sécurisé", + "confirmPasswordPlaceholder": "Confirmez le mot de passe", "eventDetails": "Détails de l'événement", "eventName": "Nom de l'événement", "eventType": "Type d'événement", @@ -385,21 +381,21 @@ "hostEmail": "E-mail du client", "hostName": "Nom du client", "hostNamePlaceholder": "Jean Dupont", - "adminEmail": "E-mail de l'admin", + "adminEmail": "E-mail de l'administrateur", "expirationDate": "Date d'expiration", "active": "Actif", "archived": "Archivé", "totalSize": "Taille totale", - "shareLink": "Lien de partage", + "shareLink": "Partager le lien", "copyLink": "Copier le lien", "linkCopied": "Lien copié !", "viewGallery": "Voir la galerie", "uploadPhotos": "Téléverser des photos", "archiveEvent": "Archiver l'événement", - "archiveConfirm": "Êtes-vous sûr de vouloir archiver cet événement ? Cette action est irréversible.", + "archiveConfirm": "Êtes-vous sûr de vouloir archiver cet événement ? Cette action ne peut pas être annulée.", "extendExpiration": "Prolonger de {{days}} jours", "backToEvents": "Retour aux événements", - "loadingEventDetails": "Chargement des détails...", + "loadingEventDetails": "Chargement des détails de l'événement...", "saveChanges": "Enregistrer les modifications", "eventExpiresIn": "Cet événement expire dans {{days}} jours", "overview": "Aperçu", @@ -407,107 +403,158 @@ "categories": "Catégories", "eventInformation": "Informations sur l'événement", "sourceMode": "Mode source", - "sourceModeManaged": "Géré (téléverser sur PicPeak)", - "sourceModeReference": "Référence dossier externe", - "sourceModeHelp": "Utilisez le mode géré pour les téléversements directs ou pointez vers un dossier /external-media monté pour un stockage local.", + "sourceModeManaged": "Géré (téléversement vers PicPeak)", + "sourceModeReference": "Référencer un dossier externe", + "sourceModeHelp": "Utilisez le mode géré pour les téléversements directs ou pointez vers un dossier /external-media monté lorsque vous utilisez un stockage local.", "externalFolder": "Dossier externe", - "externalFolderHint": "Ces dossiers sont lus depuis le montage /external-media dans votre conteneur ou hôte.", + "externalFolderHint": "Ces dossiers sont lus depuis le montage /external-media à l'intérieur de votre conteneur ou hôte.", "externalFolderRequired": "Veuillez sélectionner un dossier externe avant d'enregistrer.", + "externalFolderEmpty": "Aucun sous-dossier", + "clearSelection": "Effacer", "welcomeMessage": "Message de bienvenue", "created": "Créé", - "expires": "Expire le", - "shareWithGuests": "Partagez ce lien avec vos invités. Ils auront besoin du mot de passe pour accéder à la galerie.", - "shareWithGuestsPublic": "Partagez ce lien avec vos invités. Aucun mot de passe n'est requis pour cette galerie.", - "resetGalleryPassword": "Réinitialiser le mot de passe", + "expires": "Expire", + "shareWithGuests": "Partagez ce lien avec les invités. Ils auront besoin du mot de passe pour accéder à la galerie.", + "shareWithGuestsPublic": "Partagez ce lien avec les invités. Aucun mot de passe n'est requis pour cette galerie.", + "resetGalleryPassword": "Réinitialiser le mot de passe de la galerie", "resendCreationEmail": "Renvoyer l'e-mail de création", - "creationEmailResent": "L'e-mail de création a été mis en file d'attente", - "failedToResendEmail": "Échec du renvoi de l'e-mail de création", + "creationEmailResent": "L'e-mail de création a été mis en file d'attente pour envoi", + "failedToResendEmail": "Échec de l'envoi de l'e-mail de création", "photoStatistics": "Statistiques des photos", - "totalPhotos": "Total des photos", + "totalPhotos": "Photos totales", "managePhotos": "Gérer les photos", "actions": "Actions", - "archivingInfo": "L'archivage créera un fichier ZIP de toutes les photos et supprimera l'accès public à la galerie.", + "archivingInfo": "L'archivage créera un fichier ZIP de toutes les photos et retirera la galerie de l'accès public.", "archivedOn": "Archivé le", "downloadArchive": "Télécharger l'archive", "loadingPhotos": "Chargement des photos...", "photoCategories": "Catégories de photos", - "organizeCategoriesInfo": "Organisez vos photos en catégories. Les catégories aident les invités à naviguer.", - "categoriesTip": "Astuce : Créez des catégories comme \"Cérémonie\", \"Réception\", \"Portraits\", etc.", + "organizeCategoriesInfo": "Organisez vos photos en catégories. Les catégories aident les invités à naviguer et à trouver des types spécifiques de photos.", + "categoriesTip": "Astuce : Les catégories sont spécifiques à chaque événement. Vous pouvez créer des catégories personnalisées comme \"Cérémonie\", \"Réception\", \"Portraits\", etc.", "galleryPassword": "Mot de passe de la galerie", "requirePasswordToggle": "Exiger un mot de passe pour cette galerie", - "requirePasswordToggleHelp": "Désactivez cette option pour partager la galerie sans mot de passe. Toute personne disposant du lien pourra voir les photos.", - "publicGalleryWarning": "Les galeries publiques sont accessibles à tous ceux qui ont le lien. Envisagez d'activer les filigranes et de surveiller l'activité.", - "passwordHelperText": "Vous pouvez utiliser des dates comme \"04.07.2025\" ou n'importe quel texte de plus de 6 caractères", + "requirePasswordToggleHelp": "Désactivez cette option si vous souhaitez partager la galerie sans mot de passe. Toute personne disposant du lien pourra visualiser les photos.", + "publicGalleryWarning": "Les galeries publiques sont accessibles à toute personne disposant du lien. Envisagez d'activer les filigranes de téléchargement et de surveiller l'activité.", + "passwordHelperText": "Vous pouvez utiliser des dates comme \"04.07.2025\" ou tout texte avec 6+ caractères", "confirmPassword": "Confirmer le mot de passe", "newPasswordLabel": "Nouveau mot de passe de la galerie", - "themeAndStyle": "Thème et Style", + "passwordReset": { + "title": "Réinitialiser le mot de passe de la galerie", + "newTitle": "Nouveau mot de passe", + "description": "Définissez un nouveau mot de passe pour {{eventName}}, ou laissez les deux champs vides pour en générer un automatiquement.", + "newPasswordLabel": "Nouveau mot de passe", + "placeholder": "Laissez vide pour une génération automatique", + "helperText": "Utilisez 6+ caractères, ou laissez vide pour une génération automatique", + "confirmLabel": "Confirmer le mot de passe", + "sendEmail": "Envoyer une notification par e-mail", + "sendEmailHelp": "Avertir l'hôte du changement de mot de passe", + "warning": "Remarque : L'ancien mot de passe ne fonctionnera plus. Assurez-vous de partager le nouveau mot de passe avec l'hôte.", + "submit": "Réinitialiser le mot de passe", + "successHeading": "Mot de passe réinitialisé avec succès !", + "emailSentNote": "Une notification par e-mail a été envoyée à l'hôte.", + "generatedLabel": "Mot de passe de galerie généré automatiquement", + "saveSecurelyNote": "Important : Enregistrez ce mot de passe en toute sécurité. Il ne peut pas être récupéré une fois que vous fermez cette fenêtre.", + "done": "Terminé", + "toastSuccess": "Mot de passe réinitialisé avec succès", + "toastError": "Échec de la réinitialisation du mot de passe", + "toastCopied": "Mot de passe copié dans le presse-papiers", + "errorMinLength": "Le mot de passe doit comporter au moins 6 caractères", + "errorMismatch": "Les mots de passe ne correspondent pas" + }, + "themeAndStyle": "Thème & Style", "galleryExpiration": "Expiration de la galerie", "daysAfterEvent": "jours après la date de l'événement", + "expiresOn": "Expire le", "noExpiration": "Pas d'expiration", - "noExpirationHelp": "Cette galerie restera active jusqu'à son archivage manuel.", - "userUploads": "Paramètres de téléversement invité", + "noExpirationHelp": "Cette galerie restera active jusqu'à ce qu'elle soit archivée manuellement.", + "photoCap": "Limite de photos", + "photoCapHelp": "Nombre maximum de photos autorisées. 0 = illimité", + "userUploads": "Paramètres de téléversement utilisateur", "allowUserUploads": "Autoriser les invités à téléverser des photos", - "allowUserUploadsHelp": "Permet aux invités d'ajouter leurs propres photos à cette galerie", - "allowUserUploadsDescription": "Permet aux invités d'ajouter leurs propres photos à cette galerie", + "allowUserUploadsHelp": "Permettre aux invités de téléverser leurs propres photos dans cette galerie", + "allowUserUploadsDescription": "Permettre aux invités de téléverser leurs propres photos dans cette galerie", "uploadCategory": "Catégorie de téléversement", - "selectCategory": "Sélectionner une catégorie pour les envois invités", - "uploadCategoryHelp": "Toutes les photos envoyées par les invités seront ajoutées à cette catégorie", + "selectCategory": "Sélectionner une catégorie pour les téléversements utilisateur", + "uploadCategoryHelp": "Toutes les photos téléversées par les utilisateurs seront ajoutées à cette catégorie", "allowDownloads": "Autoriser le téléchargement des photos", "downloadsDisabled": "Téléchargements désactivés", - "downloadProtection": "Protection contre le téléchargement", + "downloadProtection": "Protection des téléchargements", "disableRightClick": "Bloquer le clic droit", "watermarkDownloads": "Ajouter un filigrane aux téléchargements", "enableDevtoolsProtection": "Détecter les outils de développement", - "useCanvasRendering": "Rendu Canvas (protection avancée)", - "protectionInfo": "Les fonctions de protection aident à prévenir les téléchargements non autorisés mais ne peuvent bloquer toutes les méthodes.", - "protectionLevelBasic": "Basique - Blocage clic droit uniquement", - "protectionLevelStandard": "Standard - Raccourcis clavier bloqués", - "protectionLevelEnhanced": "Amélioré - Détection de capture d'écran", - "protectionLevelMaximum": "Maximum - Détection DevTools et rendu Canvas", - "heroLogoSettings": "Paramètres du logo principal", - "heroLogoVisible": "Afficher le logo dans la section principale", + "useCanvasRendering": "Rendu canvas (protection avancée)", + "protectionInfo": "Les fonctionnalités de protection aident à prévenir les téléchargements non autorisés mais ne peuvent pas bloquer toutes les méthodes.", + "protectionLevelBasic": "Basique - Blocage du clic droit uniquement", + "protectionLevelStandard": "Standard - Blocage des raccourcis clavier", + "protectionLevelEnhanced": "Amélioré - Détection de l'impression écran", + "protectionLevelMaximum": "Maximum - Détection des outils DevTools et rendu canvas", + "heroLogoSettings": "Paramètres du logo d'en-tête", + "heroLogoVisible": "Afficher le logo dans la section d'en-tête", "heroLogoSize": "Taille du logo", "heroLogoSizeSmall": "Petit", "heroLogoSizeMedium": "Moyen", "heroLogoSizeLarge": "Grand", - "heroLogoSizeXLarge": "Très Grand", + "heroLogoSizeXLarge": "Très grand", "heroLogoPosition": "Position du logo", "heroLogoPositionTop": "Haut (au-dessus du titre)", - "heroLogoPositionCenter": "Centre (entre titre et dates)", + "heroLogoPositionCenter": "Centre (entre le titre et les dates)", "heroLogoPositionBottom": "Bas (sous les dates)", - "heroLogoInfo": "Ces paramètres s'appliquent lorsque la galerie utilise la mise en page 'Hero'. Vous pouvez masquer le logo ou personnaliser sa taille et sa position.", + "heroLogoInfo": "Ces paramètres s'appliquent lorsque la galerie utilise la disposition Hero. Vous pouvez masquer le logo ou personnaliser sa taille et sa position.", "eventCustomLogo": "Logo personnalisé de l'événement", - "eventCustomLogoDescription": "Téléchargez un logo spécifique pour cet événement. Il remplace le logo global pour cette galerie uniquement.", + "eventCustomLogoDescription": "Téléversez un logo personnalisé pour cet événement. Cela remplace le logo de la marque globale uniquement pour cette galerie.", "uploadEventLogo": "Téléverser le logo", "replaceLogo": "Remplacer", - "removeLogo": "Retirer", + "removeLogo": "Supprimer", "eventLogoUploaded": "Logo de l'événement téléversé avec succès", - "eventLogoUploadFailed": "Échec du téléversement du logo", - "eventLogoRemoved": "Logo de l'événement retiré avec succès", - "eventLogoRemoveFailed": "Échec du retrait du logo", + "eventLogoUploadFailed": "Échec du téléversement du logo de l'événement", + "eventLogoRemoved": "Logo de l'événement supprimé avec succès", + "eventLogoRemoveFailed": "Échec de la suppression du logo de l'événement", "heroLogoVisibleLabel": "Logo visible", "heroLogoSizeLabel": "Taille", "heroLogoPositionLabel": "Position", "heroLogoHidden": "Logo masqué", - "heroPhoto": "Photo principale (Hero)", - "heroPhotoHelp": "Sélectionnez une photo principale par défaut. Vous pouvez modifier cela par catégorie.", - "selectHeroPhoto": "Sélectionner la photo Hero", - "noHeroPhotoSelected": "Aucune photo Hero sélectionnée", - "heroPhotoSelected": "Photo Hero sélectionnée", - "heroImageAnchor": "Position de recadrage de l'image Hero", - "heroImageAnchorDescription": "Cliquez sur l'image pour définir le point focal du recadrage.", + "heroPhoto": "Photo d'en-tête", + "heroPhotoHelp": "Sélectionnez une photo d'en-tête par défaut pour la galerie. Vous pouvez remplacer cela par catégorie.", + "selectHeroPhoto": "Sélectionner la photo d'en-tête", + "noHeroPhotoSelected": "Aucune photo d'en-tête sélectionnée", + "heroPhotoSelected": "Photo d'en-tête sélectionnée", + "heroImageAnchor": "Position de recadrage de l'image d'en-tête", + "heroImageAnchorDescription": "Cliquez sur l'image pour définir le point focal pour le recadrage.", "heroImageAnchorTop": "Haut", "heroImageAnchorCenter": "Centre", "heroImageAnchorBottom": "Bas", - "heroPreview": "Aperçu Hero", + "heroPreview": "Aperçu de l'en-tête", "noPhotosAvailable": "Aucune photo disponible", "inactive": "Inactif", - "subtitle": "Gérez vos galeries photo et vos événements", + "expired": "Expiré", + "draft": "Brouillon", + "publishAndNotify": "Publier et notifier le client", + "publishConfirm": "Cela rendra la galerie accessible et enverra l'e-mail de notification au client. Continuer ?", + "publishSuccess": "Galerie publiée et client notifié !", + "draftBanner": "Cette galerie est en mode brouillon. Téléversez vos photos, puis publiez lorsque vous êtes prêt.", + "subtitle": "Gérez vos galeries de photos et événements", "failedToLoadEvents": "Échec du chargement des événements", - "bulkArchivePartial": "{{success}} événements archivés, {{failed}} échecs", + "tryAgain": "Réessayer", + "bulkArchivePartial": "Archivé {{success}} événements, {{failed}} échoué(s)", + "deleteSelected": "Supprimer la sélection", + "bulkDelete": { + "warning": "Cela supprimera définitivement les événements sélectionnés, toutes leurs photos, archives et journaux d'audit. Cette action ne peut pas être annulée.", + "confirmLabel": "Tapez {{literal}} pour confirmer", + "confirmHelp": "Une confirmation tapée empêche les suppressions accidentelles et n'est pas affectée par le remplissage automatique du navigateur ou les raccourcis de mot de passe.", + "successPartial": "Supprimé {{success}} événements, {{failed}} échoué(s)", + "errorGeneric": "Échec de la suppression des événements", + "successAll_one": "Suppression définitive de {{count}} événement", + "successAll_other": "Suppression définitive de {{count}} événements", + "title_one": "Supprimer définitivement {{count}} événement ?", + "title_other": "Supprimer définitivement {{count}} événements ?", + "processing_one": "Suppression de {{count}} événement. Cela peut prendre quelques minutes — ne fermez pas cette fenêtre.", + "processing_other": "Suppression de {{count}} événements. Cela peut prendre quelques minutes — ne fermez pas cette fenêtre.", + "submit_one": "Supprimer {{count}} événement", + "submit_other": "Supprimer {{count}} événements" + }, "searchEventsPlaceholder": "Rechercher des événements...", - "all": "Tout", - "expiring": "Expire bientôt", + "all": "Tous", + "expiring": "Expirant", "clear": "Effacer", "archiveSelected": "Archiver la sélection", "publicAccess": "Accès public", @@ -519,39 +566,37 @@ "status": "Statut", "noEventsFound": "Aucun événement trouvé", "stats": { - "totalEvents": "Total Événements", - "activeEvents": "Événements Actifs", - "totalPhotos": "Total Photos", - "expiringEvents": "Expire Bientôt" + "totalEvents": "Événements totaux", + "activeEvents": "Événements actifs", + "totalPhotos": "Photos totales", + "expiringEvents": "Expirant bientôt" }, "viewDetails": "Voir les détails", "archiveEventAction": "Archiver l'événement", "downloadArchiveAction": "Télécharger l'archive", "deleteEvent": "Supprimer l'événement", "deleteEventConfirm": "Êtes-vous sûr de vouloir supprimer cet événement ?", - "downloadArchiveSoon": "Téléchargement d'archive bientôt disponible", + "downloadArchiveSoon": "Téléchargement de l'archive bientôt disponible", "eventExpiredMessage": "Cet événement a expiré", - "guestsCannotAccessGallery": "Les invités ne peuvent plus accéder à la galerie.", - "warningEmailsHaveBeenSent": "Les e-mails d'avertissement ont été envoyés au client.", + "guestsCannotAccessGallery": "Les invités ne peuvent plus accéder à la galerie. Envisagez d'archiver cet événement.", + "warningEmailsHaveBeenSent": "Des e-mails d'avertissement ont été envoyés au client.", "extendSevenDays": "Prolonger de 7 jours", "welcomeMessageLabel": "Message de bienvenue", "noWelcomeMessageSet": "Aucun message de bienvenue défini", "copy": "Copier", "copied": "Copié !", - "archiveStatusTitle": "Statut de l'archive", + "archiveStatusTitle": "Statut d'archivage", "downloadingArchive": "Téléchargement de l'archive {{name}}...", - "downloadStarted": "Téléchargement démarré", + "downloadStarted": "Téléchargement commencé", "failedToDownloadArchive": "Échec du téléchargement de l'archive", "galleryTheme": "Thème de la galerie", "noThemeSet": "Aucun thème configuré", "customizingThemeFor": "Personnalisation du thème pour {{event}}", "customCssTemplate": "Modèle CSS personnalisé", - "customCssTemplateDesc": "Appliquez un modèle CSS personnalisé pour un style unique.", + "customCssTemplateDesc": "Appliquez un modèle CSS personnalisé pour styliser la galerie avec des effets visuels uniques.", "noTemplate": "Aucun modèle", - "useThemeOnly": "Utiliser uniquement le thème prédéfini", + "useThemeOnly": "Utiliser uniquement le préréglage du thème", "customTemplate": "Modèle personnalisé", - "photoCap": "Limite de photos", - "photoCapHelp": "Nombre maximum de photos autorisé. 0 = illimité", "rename": { "button": "Renommer", "title": "Renommer l'événement", @@ -561,212 +606,157 @@ "failed": "Échec du renommage", "confirm": "Renommer l'événement", "success": "Événement renommé avec succès !", - "filesRenamed_many": "{{count}} fichiers mis à jour", "filesRenamed_one": "{{count}} fichier mis à jour", "filesRenamed_other": "{{count}} fichiers mis à jour", "newLink": "Nouveau lien de galerie", "currentName": "Nom actuel :", "newName": "Nouveau nom de l'événement", - "enterNewName": "Saisissez le nouveau nom de l'événement", + "enterNewName": "Entrez le nouveau nom de l'événement", "newUrl": "Nouvelle URL :", - "checkingAvailability": "Vérification de la disponibilité…", - "resendEmail": "Renvoyer l'e-mail d'invitation avec le nouveau lien", - "emailTo": "Envoyer l'e-mail d'accès à la galerie mis à jour à", + "checkingAvailability": "Vérification de la disponibilité...", + "resendEmail": "Renvoyer l'e-mail d'invitation avec le nouveau lien de galerie", + "emailTo": "Envoyer l'e-mail mis à jour d'accès à la galerie à", "warningTitle": "Veuillez noter :", - "warning1": "L'URL de la galerie va changer", - "warning2": "Les anciennes URLs redirigeront automatiquement vers la nouvelle", - "warning3": "Les fichiers photos pourraient être renommés" + "warning1": "L'URL de la galerie changera", + "warning2": "Les anciennes URL redirigeront automatiquement vers la nouvelle URL", + "warning3": "Les fichiers photo peuvent être renommés" }, - "bulkArchiveSuccess_many": "{{count}} événements archivés avec succès", - "bulkArchiveSuccess_one": "{{count}} événement archivé avec succès", - "bulkArchiveSuccess_other": "{{count}} événements archivés avec succès", - "bulkDelete": { - "successAll_many": "{{count}} événements supprimés définitivement", - "successAll_one": "{{count}} événement supprimé définitivement", - "successAll_other": "{{count}} événements supprimés définitivement", - "successPartial": "{{success}} événements supprimés, {{failed}} échoués", - "errorGeneric": "Échec de la suppression des événements", - "title_many": "Supprimer définitivement {{count}} événements ?", - "title_one": "Supprimer définitivement {{count}} événement ?", - "title_other": "Supprimer définitivement {{count}} événements ?", - "processing_many": "Suppression de {{count}} événements. Cela peut prendre quelques minutes — ne fermez pas cette fenêtre.", - "processing_one": "Suppression de {{count}} événement. Cela peut prendre quelques minutes — ne fermez pas cette fenêtre.", - "processing_other": "Suppression de {{count}} événements. Cela peut prendre quelques minutes — ne fermez pas cette fenêtre.", - "warning": "Cette action supprimera définitivement les événements sélectionnés, toutes leurs photos, archives et journaux d'audit. Cette action est irréversible.", - "submit_many": "Supprimer {{count}} événements", - "submit_one": "Supprimer {{count}} événement", - "submit_other": "Supprimer {{count}} événements", - "confirmLabel": "Ecris {{literal}} pour confirmer", - "confirmHelp": "Une confirmation saisie au clavier évite les suppressions accidentelles et n'est pas affectée par la fonction de remplissage automatique du navigateur ni par les raccourcis clavier." - }, - "draft": "Brouillon", - "expired": "Expiré", - "daysLeft_many": "({{count}} jours restants)", + "bulkArchiveSuccess_one": "Archivage réussi de {{count}} événement", + "bulkArchiveSuccess_other": "Archivage réussi de {{count}} événements", "daysLeft_one": "({{count}} jour restant)", "daysLeft_other": "({{count}} jours restants)", - "tryAgain": "Réessayer", - "eventsSelected_many": "{{count}} événements sélectionnés", "eventsSelected_one": "{{count}} événement sélectionné", "eventsSelected_other": "{{count}} événements sélectionnés", - "deleteSelected": "Supprimer la sélection", "paginationLabel": "{{from}}–{{to}} sur {{total}}", "filtered": "filtré", "pageOf": "Page {{page}} sur {{totalPages}}", "notFound": "Événement introuvable", - "externalFolderEmpty": "Aucun sous-dossier", - "clearSelection": "Effacer", - "publishSuccess": "Galerie publiée et client notifié !", - "draftBanner": "Cette galerie est en mode brouillon. Téléversez vos photos, puis publiez quand vous êtes prêt.", - "publishConfirm": "Cela rendra la galerie accessible et enverra l'e-mail de notification au client. Continuer ?", - "publishAndNotify": "Publier et notifier le client", "customerPhone": "Téléphone du client", - "customerPhonePlaceholder": "+33 6 12 34 56 78", - "allowPresignedDownload": "Autoriser le téléchargement direct S3 (sans filigrane, mode S3 uniquement)", + "customerPhonePlaceholder": "+1 555 555 1234", + "allowPresignedDownload": "Autoriser le téléchargement S3 direct (sans filigrane, mode S3 uniquement)", "neverExpires": "Jamais", "rightClickBlocked": "Clic droit bloqué", - "devtoolsDetection": "Détection des outils développeur", + "devtoolsDetection": "Détection des outils DevTools", "watermarked": "Avec filigrane", "importExternal": "Importer depuis un dossier externe", "externalImportInfo": "Toutes les images du dossier sélectionné seront importées.", "selectExternalFolder": "Sélectionner un dossier externe sous /external-media", "importFromSelectedFolder": "Importer depuis le dossier sélectionné", - "adminEmailPickFromAdmins": "Choisir parmi les administrateurs :", - "adminEmailCustom": "E-mail personnalisé", - "expiresOn": "Expire le", - "passwordReset": { - "errorMinLength": "Le mot de passe doit contenir au moins 6 caractères", - "errorMismatch": "Les mots de passe ne correspondent pas", - "toastSuccess": "Mot de passe réinitialisé avec succès", - "toastError": "Échec de la réinitialisation du mot de passe", - "toastCopied": "Mot de passe copié dans le presse-papiers", - "newTitle": "Nouveau mot de passe", - "title": "Réinitialiser le mot de passe de la galerie", - "description": "Définissez un nouveau mot de passe pour {{eventName}}, ou laissez les deux champs vides pour en générer un automatiquement.", - "newPasswordLabel": "Nouveau mot de passe", - "placeholder": "Laisser vide pour générer automatiquement", - "helperText": "Utilisez 6+ caractères, ou laissez vide pour générer automatiquement", - "confirmLabel": "Confirmer le mot de passe", - "sendEmail": "Envoyer une notification par e-mail", - "sendEmailHelp": "Informer l'hôte du changement de mot de passe", - "warning": "Note : L'ancien mot de passe ne fonctionnera plus. Assurez-vous de partager le nouveau mot de passe avec l'hôte.", - "submit": "Réinitialiser le mot de passe", - "successHeading": "Mot de passe réinitialisé avec succès !", - "emailSentNote": "Une notification par e-mail a été envoyée à l'hôte.", - "generatedLabel": "Mot de passe de galerie généré automatiquement", - "saveSecurelyNote": "Important : Sauvegardez ce mot de passe en lieu sûr. Il ne pourra pas être récupéré une fois cette fenêtre fermée.", - "done": "Terminé" - }, "promoBanner": { "title": "Bannière promotionnelle", - "help": "Choisissez comment cette galerie gère la bannière promotionnelle. « Hériter » utilise la valeur par défaut globale ; « Personnalisé » la remplace pour cet événement ; « Désactivé » masque la bannière.", - "mode_inherit": "Hériter de la valeur par défaut", - "mode_custom": "Personnalisé pour cet événement", + "help": "Choisissez comment cette galerie gère la bannière promotionnelle. \"Hériter\" utilise votre valeur par défaut globale ; \"Personnalisé\" la remplace pour cet événement ; \"Désactivé\" la masque entièrement.", + "mode_inherit": "Hériter de la valeur par défaut globale", + "mode_custom": "Remplacement personnalisé pour cet événement", "mode_off": "Désactivé (masquer pour cet événement)", - "placeholder": "Contenu Markdown (ex. **Offre :** [réservez votre prochaine séance](https://example.com))", + "placeholder": "Contenu Markdown (ex. : **Offre spéciale :** [réservez votre prochaine séance](https://example.com))", "preview": "Aperçu" }, "ogShare": { - "title": "Utiliser la photo principale comme aperçu de partage social", - "help": "Quand l’URL de cette galerie est partagée sur WhatsApp, Facebook, Slack, etc., l’aperçu du lien affichera la photo principale ci-dessus. La vignette est récupérée sans authentification par les robots d’aperçu — toute personne partageant l’URL rend cette image effectivement publique. Désactivé par défaut ; choisissez une photo principale que vous êtes prêt à exposer publiquement avant d’activer.", - "heroRequired": "Choisissez d’abord une photo principale ci-dessus — cette option l’utilise comme image d’aperçu sur WhatsApp / Facebook / Slack." + "title": "Utiliser la photo d'en-tête comme aperçu de partage social", + "help": "Lorsque cette URL de galerie est partagée sur WhatsApp, Facebook, Slack, etc., l'aperçu du lien affichera la photo d'en-tête ci-dessus. La miniature est récupérée de manière non authentifiée par les robots d'aperçu de lien — toute personne disposant de l'URL peut effectivement rendre cette image publique. Désactivé par défaut ; choisissez une photo d'en-tête que vous êtes prêt à afficher publiquement avant d'activer.", + "heroRequired": "D'abord, choisissez une photo d'en-tête ci-dessus — cette option l'utilise comme image d'aperçu pour WhatsApp / Facebook / Slack." } }, "settings": { "title": "Paramètres système", - "subtitle": "Configurer les paramètres et préférences globaux", + "subtitle": "Configurer les paramètres et préférences globaux du système", "loadingSettings": "Chargement des paramètres...", "general": { "title": "Général", "siteConfiguration": "Configuration du site", "siteUrl": "URL du site", - "siteUrlHelp": "Utilisé pour générer les liens des galeries dans les e-mails", + "siteUrlHelp": "Utilisée pour générer les liens de galerie dans les e-mails", "defaultExpiration": "Expiration par défaut (jours)", - "maxFileSize": "Taille max de fichier (Mo)", - "maxFilesPerUpload": "Fichiers max par envoi", - "maxFilesPerUploadHelp": "Nombre maximum de photos autorisées par lot (1-{{max}}).", + "maxFileSize": "Taille maximale des fichiers (Mo)", + "maxFilesPerUpload": "Nombre maximal de fichiers par téléversement", + "maxFilesPerUploadHelp": "Nombre maximum de photos autorisées dans un seul lot de téléversement (1-{{max}}).", + "maxUploadBatchSize": "Taille maximale des lots de téléversement (Mo)", + "maxUploadBatchSizeHelp": "Taille maximale par requête de téléversement. Réduisez cela si vous êtes derrière un proxy inverse avec des limites de taille de requête (ex. : Cloudflare : 100 Mo).", "allowedFileTypes": "Types de fichiers autorisés", - "allowedFileTypesHelp": "Liste d'extensions séparées par des virgules", - "featureToggles": "Fonctionnalités", + "allowedFileTypesHelp": "Liste d'extensions de fichiers séparées par des virgules", + "featureToggles": "Bascules de fonctionnalités", "enableAnalytics": "Activer le suivi analytique", - "enableRegistration": "Autoriser l'auto-inscription des administrateurs", - "enableShortGalleryUrls": "Utiliser des URLs de galerie courtes", - "enableShortGalleryUrlsHelp": "Supprime le slug de l'événement des nouveaux liens tout en gardant les anciens fonctionnels.", + "enableRegistration": "Autoriser l'auto-inscription pour les administrateurs", + "enableShortGalleryUrls": "Utiliser des URL de galerie courtes", + "enableShortGalleryUrlsHelp": "Supprime le slug de l'événement des nouveaux liens partagés tout en gardant les liens existants fonctionnels.", + "useOriginalFilenames": "Utiliser les noms de fichiers originaux lors du téléchargement", + "useOriginalFilenamesHelp": "Lorsque cette option est activée, les téléchargements de photos uniques et de ZIP utilisent le nom de fichier original de l'appareil photo (ex. : DSC_1234.jpg) au lieu du nom nettoyé. Le stockage reste inchangé ; les doublons dans le même événement reçoivent un suffixe numérique.", "maintenanceMode": "Activer le mode maintenance", "language": "Langue", - "defaultLanguageHelp": "Langue affichée aux invités avant connexion", + "defaultLanguageHelp": "Langue affichée aux invités avant la connexion", "saveGeneralSettings": "Enregistrer les paramètres généraux", - "dateTimeFormat": "Format de date et d'heure", + "dateTimeFormat": "Format de date et heure", "dateFormat": "Format de date", - "dateFormatHelp": "Affichage des dates dans les e-mails et l'application", - "accountSection": "Compte Administrateur", - "accountUsername": "Nom d'utilisateur admin", - "accountUsernameHelp": "Affiché dans l'interface et les journaux d'activité.", + "dateFormatHelp": "Comment les dates sont affichées dans les e-mails et dans toute l'application", + "accountSection": "Compte administrateur", + "accountUsername": "Nom d'utilisateur administrateur", + "accountUsernameHelp": "Affiché dans l'interface d'administration et utilisé dans les journaux d'activité.", "accountUsernameRequired": "Le nom d'utilisateur est requis", - "accountUsernameLength": "Le nom d'utilisateur doit faire au moins 3 caractères", - "accountEmail": "E-mail admin", - "accountEmailHelp": "Utilisé pour la connexion et les notifications de sécurité.", + "accountUsernameLength": "Le nom d'utilisateur doit comporter au moins 3 caractères", + "accountEmail": "E-mail administrateur", + "accountEmailHelp": "Utilisé pour la connexion et la réception des notifications de sécurité.", "accountEmailRequired": "L'adresse e-mail est requise", "accountEmailInvalid": "Entrez une adresse e-mail valide", "accountSaveButton": "Enregistrer les détails du compte", "accountSaveSuccess": "Détails du compte mis à jour" }, "publicSite": { - "badge": "Page d'accueil", + "badge": "Page d'accueil publique", "title": "Page d'accueil publique", - "subtitle": "Publiez une page d'accueil personnalisée pour les invités visitant votre domaine.", - "loading": "Chargement des paramètres...", + "subtitle": "Publiez une page d'accueil personnalisée pour les invités lorsqu'ils visitent votre domaine.", + "loading": "Chargement des paramètres du site public...", "enabled": "Activé", "disabled": "Désactivé", "htmlLabel": "HTML de la page d'accueil", - "htmlPlaceholder": "Saisissez le balisage HTML pour votre page (hero, sections, appels à l'action).", - "htmlHelp": "Le HTML brut est nettoyé à l'enregistrement. Les jetons comme {{company_name}} seront remplacés par les valeurs de l'identité visuelle.", + "htmlPlaceholder": "Fournissez le code HTML pour l'en-tête, les sections et les appels à l'action de votre page d'accueil.", + "htmlHelp": "Le HTML brut est nettoyé à l'enregistrement. Les balises non sûres, les scripts en ligne et les attributs non autorisés sont supprimés automatiquement. Les jetons tels que {{company_name}}, {{company_tagline}} et {{support_email}} seront remplacés par les valeurs des paramètres de Marque.", "cssLabel": "CSS personnalisé", - "cssPlaceholder": "Surcharges CSS optionnelles pour ajuster la mise en page.", - "cssHelp": "Les imports et URLs JavaScript sont retirés. Utilisez des sélecteurs CSS standard.", + "cssPlaceholder": "Remplacements CSS optionnels pour ajuster la disposition, les couleurs ou la typographie.", + "cssHelp": "Les imports et les URL JavaScript sont supprimés. Utilisez des sélecteurs CSS standard pour remplacer le style par défaut.", "saveCta": "Enregistrer le site public", - "saving": "Enregistrement...", + "saving": "Enregistrement en cours...", "saveSuccess": "Paramètres du site public enregistrés.", - "saveError": "Échec de l'enregistrement.", - "resetCta": "Réinitialiser par défaut", - "resetting": "Réinitialisation...", - "resetSuccess": "Modèle réinitialisé.", - "resetError": "Échec de la réinitialisation.", + "saveError": "Échec de l'enregistrement des paramètres du site public.", + "resetCta": "Réinitialiser aux valeurs par défaut", + "resetting": "Réinitialisation en cours...", + "resetSuccess": "Modèle de site public réinitialisé aux valeurs par défaut.", + "resetError": "Échec de la réinitialisation du modèle de site public.", "previewTitle": "Aperçu en direct", - "previewSandboxed": "Aperçu sécurisé", - "previewDisabled": "Activez le site public pour voir l'aperçu.", - "sanitizationNotice": "Les scripts et balises non sécurisées sont supprimés avant publication.", - "htmlRequired": "Fournissez un contenu HTML avant d'activer le site." + "previewSandboxed": "Aperçu en bac à sable", + "previewDisabled": "Activez le site public pour voir l'aperçu en direct.", + "sanitizationNotice": "Les scripts, les cadres intégrés et les attributs non sûrs sont supprimés avant publication. Seuls les HTML, liens et images sûrs sont autorisés.", + "htmlRequired": "Fournissez le contenu HTML avant d'activer le site public." }, "storage": { "totalUsed": "Total utilisé", "archiveStorage": "Stockage des archives", "storageLimit": "Limite de stockage", - "storageLimitHelper": "Définissez une limite de stockage. Cette limite est indicative.", + "storageLimitHelper": "Définissez une limite pour l'utilisation du stockage des photos. Cette limite est indicative et mettra en évidence lorsque la limite sera atteinte.", "softLimitInputLabel": "Limite (Go)", - "softLimitHelper": "Saisissez l'usage maximum souhaité en gigaoctets.", + "softLimitHelper": "Entrez la consommation de stockage maximale préférée en gigaoctets.", "recommendedSoftLimit": "Limite suggérée", - "diskCapacity": "Capacité disque", - "diskCapacityReported": "Capacité disque (déclarée)", + "diskCapacity": "Capacité du disque", + "diskCapacityReported": "Capacité du disque (signalée)", "diskAvailable": "Disponible", - "diskAvailableReported": "Disponible (déclarée)", - "diskFreeReported": "Libre (déclarée)", - "diskMetricsUnavailable": "Les mesures disque ne sont pas disponibles dans Docker Desktop ou les environnements virtualisés.", + "diskAvailableReported": "Disponible (signalé)", + "diskFreeReported": "Libre (signalé)", + "diskMetricsUnavailable": "Les métriques du disque ne sont pas disponibles dans Docker Desktop ou les environnements virtualisés.", "applyRecommended": "Utiliser la recommandation", - "applyAvailable": "Faire correspondre au disponible", - "invalidSoftLimit": "Entrez un nombre valide.", + "applyAvailable": "Correspondre à l'espace disponible", + "invalidSoftLimit": "Entrez un nombre valide pour la limite.", "saveSoftLimit": "Enregistrer la limite", - "limitNotEnforced": "Cette limite est purement indicative et n'est pas appliquée automatiquement.", - "overrideTitle": "Surcharge manuelle de capacité", - "diskOverrideEnvNote": "La capacité disque est contrôlée par des variables d'environnement.", - "diskOverrideSettingsHelp": "Définissez des valeurs personnalisées si Docker rapporte des chiffres irréalistes.", + "limitNotEnforced": "Cette limite est uniquement indicative et n'est pas appliquée automatiquement.", + "overrideTitle": "Remplacement manuel de la capacité", + "diskOverrideEnvNote": "La capacité du disque est contrôlée par des variables d'environnement et ne peut pas être modifiée ici.", + "diskOverrideSettingsHelp": "Définissez des valeurs de capacité personnalisées lorsque Docker signale des chiffres irréalistes.", "overrideCapacityLabel": "Capacité totale (Go)", - "overrideCapacityHelper": "Laissez vide pour la lecture automatique.", + "overrideCapacityHelper": "Laissez vide pour utiliser la lecture automatique.", "overrideAvailableLabel": "Espace disponible (Go)", - "overrideAvailableHelper": "Optionnel. Laissez vide pour calculer automatiquement.", - "saveOverride": "Enregistrer la surcharge", - "capacityRequiredForAvailable": "Entrez une capacité totale avant l'espace disponible.", - "availableExceedsCapacity": "L'espace disponible ne peut excéder la capacité totale.", - "storageUsage": "Usage du stockage", + "overrideAvailableHelper": "Optionnel. Laissez vide pour calculer à partir de la capacité totale moins le stockage utilisé.", + "saveOverride": "Enregistrer le remplacement de capacité", + "capacityRequiredForAvailable": "Entrez une capacité totale avant de définir l'espace disponible.", + "availableExceedsCapacity": "L'espace disponible ne peut pas dépasser la capacité totale.", + "storageUsage": "Utilisation du stockage", "unlimited": "Illimité" }, "security": { @@ -774,271 +764,279 @@ "passwordSettings": "Paramètres de mot de passe", "minPasswordLength": "Longueur minimale du mot de passe", "passwordComplexity": "Complexité du mot de passe", - "passwordComplexityHelp": "Niveau de sécurité requis", - "complexitySimple": "Simple (6+ car., n'importe quel texte)", - "complexityModerate": "Modéré (8+ car., mélange maj/min/chiffres)", - "complexityStrong": "Fort (12+ car., maj/min/chiffres)", - "complexityVeryStrong": "Très Fort (12+ car., tous types de caractères)", - "sessionAuth": "Session et Authentification", - "sessionTimeout": "Expiration de session (minutes)", - "maxLoginAttempts": "Tentatives de connexion max", - "maxLoginAttemptsHelp": "Échecs autorisés par IP avant blocage", + "passwordComplexityHelp": "Niveau de sécurité requis pour les mots de passe des galeries", + "complexitySimple": "Simple (6+ caractères, tout texte)", + "complexityModerate": "Modéré (8+ caractères, mélange de majuscules/chiffres)", + "complexityStrong": "Fort (12+ caractères, majuscules/minuscules/chiffres)", + "complexityVeryStrong": "Très fort (12+ caractères, tous types de caractères)", + "sessionAuth": "Session & Authentification", + "sessionTimeout": "Durée de session (minutes)", + "maxLoginAttempts": "Nombre maximal de tentatives de connexion", + "maxLoginAttemptsHelp": "Nombre maximal de tentatives de connexion échouées par IP avant le verrouillage", "attemptWindowMinutes": "Fenêtre de tentative (minutes)", - "attemptWindowMinutesHelp": "Durée de surveillance des échecs", - "lockoutDurationMinutes": "Durée du blocage (minutes)", - "lockoutDurationMinutesHelp": "Durée du verrouillage après trop d'échecs", - "enable2FA": "Activer l'authentification à deux facteurs pour les admins", + "attemptWindowMinutesHelp": "Période de temps à prendre en compte lors du comptage des tentatives de connexion échouées", + "lockoutDurationMinutes": "Durée de verrouillage (minutes)", + "lockoutDurationMinutesHelp": "Durée pendant laquelle la galerie ou le compte reste verrouillé après trop d'échecs", + "enable2FA": "Activer l'authentification à deux facteurs pour les administrateurs", "recaptchaSettings": "Paramètres reCAPTCHA", - "enableRecaptcha": "Activer reCAPTCHA sur les formulaires", + "enableRecaptcha": "Activer reCAPTCHA pour les formulaires de connexion", "siteKey": "Clé du site", "secretKey": "Clé secrète", - "recaptchaHelp": "Obtenez vos clés reCAPTCHA sur", + "recaptchaHelp": "Obtenez vos clés reCAPTCHA depuis", "saveSecuritySettings": "Enregistrer les paramètres de sécurité" }, "categories": { "title": "Catégories", - "about": "À propos des catégories", - "aboutText": "Les catégories globales sont disponibles pour tous les événements. Vous pouvez aussi créer des catégories spécifiques par événement." + "about": "À propos des catégories de photos", + "aboutText": "Les catégories globales sont disponibles pour tous les événements. Vous pouvez également créer des catégories spécifiques à un événement lors de la modification d'événements individuels. Les catégories aident à organiser les photos et permettent aux invités de filtrer les photos par type dans la vue galerie." }, "systemStatus": { "title": "Statut du système", "storageOverview": "Aperçu du stockage", "systemInfo": "Informations système", - "databaseInfo": "Informations base de données", + "databaseInfo": "Informations sur la base de données", "platform": "Plateforme", - "nodeVersion": "Version Node", - "uptime": "Temps de fonctionnement", + "nodeVersion": "Version de Node", + "uptime": "Disponibilité", "cpuCores": "Cœurs CPU", - "memoryUsage": "Usage mémoire", + "memoryUsage": "Utilisation de la mémoire", "memoryUsed": "Mémoire utilisée", "photos": "Photos", - "admins": "Admins", - "dbSize": "Taille base de données", - "services": "Services d'arrière-plan", + "admins": "Administrateurs", + "dbSize": "Taille de la base de données", + "services": "Services en arrière-plan", "fileWatcher": "Observateur de fichiers", "fileWatcherDesc": "Surveille les nouvelles photos", "expirationChecker": "Vérificateur d'expiration", "expirationCheckerDesc": "Archive les galeries expirées", - "emailProcessor": "Processeur d'e-mails", + "emailProcessor": "Traitement des e-mails", "emailProcessorDesc": "Envoie les e-mails en file d'attente", - "emailQueue": "Statut de la file d'e-mails", + "emailQueue": "État de la file d'attente des e-mails", "pending": "En attente", - "sent": "Envoyés", - "failed": "Échoués", + "sent": "Envoyé", + "failed": "Échoué", "lastUpdate": "Dernière mise à jour" }, "photoDimensions": { "title": "Dimensions des photos", - "totalPhotos": "Total photos", + "totalPhotos": "Photos totales", "withDimensions": "Avec dimensions", "missingDimensions": "Dimensions manquantes", "repairButton": "Réparer les dimensions", - "repairing": "Réparation...", - "noneToRepair": "Toutes les photos ont déjà leurs dimensions", - "resultSuccess": "Dernière réparation : {{success}} mis à jour, {{failed}} échecs", - "description": "Complète les dimensions manquantes (largeur/hauteur) pour les photos anciennes. Requis pour les mises en page Masonry et Mosaic." + "repairing": "Réparation en cours...", + "noneToRepair": "Toutes les photos ont déjà des dimensions", + "resultSuccess": "Dernière réparation : {{success}} mis à jour, {{failed}} échoué", + "description": "Remplir les dimensions manquantes (largeur/hauteur) pour les photos téléversées avant que le suivi des dimensions ne soit ajouté. Requis pour les dispositions Mosaïque et Mosaïque." }, "updateNotifications": { "title": "Notifications de mise à jour", - "description": "Recevez des e-mails quand une nouvelle version de PicPeak est disponible.", + "description": "Recevez des notifications par e-mail lorsqu'une nouvelle version de PicPeak est disponible.", "enableEmails": "Activer les notifications par e-mail", - "enableEmailsDesc": "Informer les admins des nouvelles versions", - "recipients": "Destinataires", - "recipientsPlaceholder": "admin@exemple.com, autre@exemple.com", - "recipientsHelper": "Adresses séparées par des virgules. Laissez vide pour tous les admins.", - "lastNotified": "Dernière notification pour la version : {{version}}", + "enableEmailsDesc": "Envoyer un e-mail aux administrateurs lorsqu'une nouvelle version est disponible", + "recipients": "Destinataires des e-mails", + "recipientsPlaceholder": "admin@example.com, autre@example.com", + "recipientsHelper": "Adresses e-mail séparées par des virgules. Laissez vide pour envoyer à tous les utilisateurs administrateurs.", + "lastNotified": "Dernière notification envoyée pour la version : {{version}}", "checkNow": "Vérifier et notifier", - "sendTest": "Envoyer un e-mail test", + "sendTest": "Envoyer un e-mail de test", "saved": "Paramètres enregistrés", - "saveError": "Échec de l'enregistrement", - "emailFailed": "Échec de l'envoi", + "saveError": "Échec de l'enregistrement des paramètres", + "emailFailed": "Échec de l'envoi de la notification", "checkSuccess": "Notification envoyée pour la nouvelle version", "checkNoAction": "Aucune notification nécessaire : {{reason}}", - "checkError": "Échec de la vérification", - "emailSent_many": "Notification envoyée à {{count}} destinataires", - "emailSent_one": "Notification envoyée à {{count}} destinataire", - "emailSent_other": "Notification envoyée à {{count}} destinataires" + "checkError": "Échec de la vérification des mises à jour", + "emailSent_one": "E-mail de notification envoyé à {{count}} destinataire", + "emailSent_other": "E-mail de notification envoyé à {{count}} destinataires" }, "events": { - "title": "Création d'événement", + "title": "Création d'événements", "requiredFields": "Champs requis", - "requiredFieldsDescription": "Configurez les champs obligatoires lors de la création d'événements.", - "requireCustomerName": "Exiger le nom du client", - "requireCustomerNameHelp": "Le nom du client doit être fourni", - "requireCustomerEmail": "Exiger l'e-mail du client", - "requireCustomerEmailHelp": "L'e-mail du client doit être fourni", - "customerEmailWarning": "Requis pour l'envoi des invitations", - "requireAdminEmail": "Exiger l'e-mail admin", - "requireAdminEmailHelp": "L'e-mail admin doit être fourni", - "adminEmailWarning": "Requis pour les notifications d'événement", - "requireEventDate": "Exiger la date de l'événement", - "requireEventDateHelp": "La date doit être fournie à la création", - "eventDateWarning": "Les URLs utiliseront des identifiants aléatoires sans date", - "requireExpiration": "Exiger une date d'expiration", - "requireExpirationHelp": "Les galeries doivent avoir une expiration", - "expirationWarning": "Sans expiration, les galeries restent actives jusqu'à archivage manuel", + "requiredFieldsDescription": "Configurez quels champs de contact sont requis lors de la création de nouveaux événements.", + "requireCustomerName": "Nom du client requis", + "requireCustomerNameHelp": "Le nom du client doit être fourni pour les nouveaux événements", + "requireCustomerEmail": "E-mail du client requis", + "requireCustomerEmailHelp": "L'e-mail du client doit être fourni pour les nouveaux événements", + "customerEmailWarning": "Requis pour l'envoi des invitations à la galerie", + "requireAdminEmail": "E-mail de l'administrateur requis", + "requireAdminEmailHelp": "L'e-mail de l'administrateur doit être fourni pour les nouveaux événements", + "adminEmailWarning": "Requis pour recevoir les notifications d'événement", + "requireEventDate": "Date de l'événement requise", + "requireEventDateHelp": "La date de l'événement doit être fournie lors de la création d'événements", + "eventDateWarning": "Les URL des galeries utiliseront des identifiants aléatoires au lieu de dates", + "requireExpiration": "Date d'expiration requise", + "requireExpirationHelp": "Les galeries doivent avoir une date d'expiration", + "expirationWarning": "Les galeries sans expiration resteront actives jusqu'à ce qu'elles soient archivées manuellement", "saveSettings": "Enregistrer les paramètres d'événement", - "noteTitle": "Note", - "noteText": "Ces paramètres n'affectent que les nouveaux événements. Par défaut, tous les champs sont requis.", + "noteTitle": "Remarque", + "noteText": "Ces paramètres n'affectent que la création de nouveaux événements. Les événements existants ne sont pas affectés. Par défaut, tous les champs sont requis.", "defaultRequirePassword": "Exiger un mot de passe par défaut", - "defaultRequirePasswordHelp": "Pré-cocher « Exiger un mot de passe » lors de la création d'événements. Désactivez pour créer plus rapidement des galeries publiques.", - "showGalleryFilterBar": "Afficher la barre de filtres dans les galeries", - "showGalleryFilterBarHelp": "Affiche la recherche par nom de fichier et les contrôles de tri au-dessus des galeries en grille. Désactivez pour un affichage plus épuré.", - "enablePhoneField": "Activer le champ numéro de téléphone", - "enablePhoneFieldHelp": "Ajoute un champ numéro de téléphone optionnel au formulaire d'événement. Utile pour les automatisations comme la livraison WhatsApp via n8n. Toujours facultatif même quand activé." + "defaultRequirePasswordHelp": "Pré-cocher \"Exiger un mot de passe\" lors de la création de nouveaux événements. Désactivez pour une création plus rapide de galeries publiques.", + "showGalleryFilterBar": "Afficher la barre de filtre dans les galeries", + "showGalleryFilterBarHelp": "Afficher la recherche par nom de fichier et les contrôles de tri au-dessus des galeries en disposition grille. Désactivez pour une disposition plus épurée.", + "enablePhoneField": "Activer le champ de numéro de téléphone", + "enablePhoneFieldHelp": "Ajoute une entrée de numéro de téléphone optionnelle dans le formulaire d'événement. Utile pour les automatisations en aval comme la livraison WhatsApp via n8n. Toujours optionnel même lorsqu'il est activé." }, "imageSecurity": { - "title": "Protection de l'image", - "saveSuccess": "Paramètres de sécurité enregistrés", - "saveError": "Échec de l'enregistrement", - "loadError": "Échec du chargement des paramètres de sécurité", + "title": "Protection des images", + "saveSuccess": "Paramètres de sécurité des images enregistrés", + "saveError": "Échec de l'enregistrement des paramètres", + "loadError": "Échec du chargement des paramètres de sécurité des images", "defaultProtection": "Paramètres de protection par défaut", - "defaultProtectionHelp": "S'appliquent à tous les nouveaux événements.", + "defaultProtectionHelp": "Ces paramètres s'appliquent à tous les nouveaux événements. Les événements individuels peuvent remplacer ces valeurs par défaut.", "protectionLevel": "Niveau de protection par défaut", "imageQuality": "Qualité d'image par défaut", "fragmentationLevel": "Niveau de fragmentation", - "enableDevtools": "Activer la détection DevTools par défaut", - "enableCanvas": "Activer le rendu Canvas par défaut (protection avancée)", + "enableDevtools": "Activer la détection des outils DevTools par défaut", + "enableCanvas": "Activer le rendu canvas par défaut (protection avancée)", "rateLimiting": "Limitation de débit", - "rateLimitingHelp": "Limite le nombre de requêtes d'images pour éviter le siphonnage.", + "rateLimitingHelp": "Limitez le nombre d'images qui peuvent être demandées pour éviter le scraping.", "requestsPerMinute": "Requêtes par minute", "requestsPer5Minutes": "Requêtes par 5 min", "requestsPerHour": "Requêtes par heure", - "securityMonitoring": "Surveillance de sécurité", + "securityMonitoring": "Surveillance de la sécurité", "suspiciousThreshold": "Seuil d'activité suspecte", "autoBlockThreshold": "Seuil de blocage automatique", - "enableMonitoring": "Activer la surveillance", - "blockSuspiciousIps": "Bloquer automatiquement les IPs suspectes", - "logEvents": "Journaliser les événements de sécurité", - "infoTitle": "À propos de la protection", - "infoText": "Ces fonctionnalités freinent le téléchargement sauvage mais ne peuvent tout bloquer. Envisagez l'usage de filigranes." + "enableMonitoring": "Activer la surveillance de la sécurité", + "blockSuspiciousIps": "Bloquer automatiquement les IP suspectes", + "logEvents": "Journaliser les événements de sécurité dans la base de données", + "infoTitle": "À propos de la protection des images", + "infoText": "Ces fonctionnalités de protection aident à prévenir le téléchargement et la copie occasionnels mais ne peuvent pas bloquer toutes les méthodes. Les utilisateurs déterminés peuvent encore trouver des moyens de capturer des images. Envisagez d'utiliser des filigranes et des accords juridiques pour une protection complète." }, "moderation": { "title": "Modération", "wordFilters": "Filtres de mots", - "description": "Gérer les mots à filtrer ou bloquer dans les commentaires", - "addFilter": "Ajouter un filtre", - "enterWord": "Mot à filtrer", - "searchFilters": "Rechercher...", - "filterAdded": "Filtre ajouté avec succès", - "filterExists": "Ce filtre existe déjà", - "addError": "Échec de l'ajout", - "filterUpdated": "Filtre mis à jour", - "updateError": "Échec de la mise à jour", - "filterDeleted": "Filtre supprimé", - "deleteError": "Échec de la suppression", - "wordRequired": "Veuillez entrer un mot", - "confirmDelete": "Supprimer ce filtre ?", - "loading": "Chargement...", - "noMatchingFilters": "Aucun filtre correspondant", - "noFilters": "Aucun filtre configuré", + "description": "Gérer les mots qui doivent être filtrés ou bloqués dans les commentaires", + "addFilter": "Ajouter un nouveau filtre", + "enterWord": "Entrez le mot à filtrer", + "searchFilters": "Rechercher des filtres...", + "filterAdded": "Filtre de mot ajouté avec succès", + "filterExists": "Ce filtre de mot existe déjà", + "addError": "Échec de l'ajout du filtre de mot", + "filterUpdated": "Filtre de mot mis à jour avec succès", + "updateError": "Échec de la mise à jour du filtre de mot", + "filterDeleted": "Filtre de mot supprimé avec succès", + "deleteError": "Échec de la suppression du filtre de mot", + "wordRequired": "Veuillez entrer un mot à filtrer", + "confirmDelete": "Êtes-vous sûr de vouloir supprimer ce filtre de mot ?", + "loading": "Chargement des filtres de mots...", + "noMatchingFilters": "Aucun filtre correspondant trouvé", + "noFilters": "Aucun filtre de mots configuré pour l'instant", "severityLow": "Faible", "severityModerate": "Modéré", "severityHigh": "Élevé", "severityBlock": "Bloquer", - "severityLevels": "Niveaux de gravité", - "lowDescription": "Signalé mais non bloqué", - "moderateDescription": "Approbation manuelle requise", - "highDescription": "Masqué automatiquement, revue admin requise", - "blockDescription": "Rejet immédiat du commentaire" + "severityLevels": "Niveaux de sévérité", + "lowDescription": "Le mot est signalé pour révision mais n'est pas automatiquement bloqué", + "moderateDescription": "Le commentaire nécessite une approbation manuelle avant d'être visible", + "highDescription": "Le commentaire est automatiquement masqué et nécessite une révision administrative", + "blockDescription": "Le commentaire est rejeté immédiatement et ne peut pas être soumis" }, "styling": { - "title": "CSS Personnalisé" + "title": "CSS personnalisé" }, "thumbnails": { - "title": "Vignettes", - "dimensionsTitle": "Dimensions et qualité des vignettes", - "dimensionsHelp": "Configurez la taille et la qualité. Des valeurs plus hautes augmentent la charge et le stockage.", + "title": "Miniatures", + "dimensionsTitle": "Dimensions et qualité des miniatures", + "dimensionsHelp": "Configurez la taille et la qualité des miniatures générées automatiquement. Des valeurs plus élevées produisent des aperçus de meilleure qualité mais augmentent le stockage et les temps de chargement.", "width": "Largeur (px)", "widthHelp": "50-1000 pixels", "height": "Hauteur (px)", "heightHelp": "50-1000 pixels", "quality": "Qualité", - "qualityHelp": "1-100, plus élevé = meilleure qualité", + "qualityHelp": "1-100, plus élevé = meilleure qualité mais fichiers plus volumineux", "format": "Format", "fit": "Mode d'ajustement", - "fitHelp": "Comment l'image est redimensionnée. 'Cover' remplit, 'Contain' ajuste dans le cadre.", - "regenerateTitle": "Régénérer les vignettes", - "regenerateHelp": "Lancez ceci après avoir changé les réglages. S'exécute en arrière-plan.", - "regenerateButton": "Régénérer toutes les vignettes", - "regenerateStarted": "Régénération démarrée", - "regenerateError": "Échec du lancement", - "saveSuccess": "Paramètres enregistrés", - "saveError": "Échec de l'enregistrement", - "loadError": "Échec du chargement", - "infoTitle": "À propos des vignettes", - "infoText": "Ce sont des aperçus réduits de vos originaux.", + "fitHelp": "Comment les images sont redimensionnées pour s'adapter aux dimensions des miniatures. \"Cover\" recadre pour remplir, \"Contain\" s'adapte dans les limites.", + "regenerateTitle": "Régénérer les miniatures", + "regenerateHelp": "Après avoir modifié les paramètres des miniatures, régénérez toutes les miniatures existantes pour appliquer la nouvelle configuration. Cela s'exécute en arrière-plan et peut prendre un certain temps pour les grandes galeries.", + "regenerateButton": "Régénérer toutes les miniatures", + "regenerateStarted": "Régénération des miniatures démarrée", + "regenerateError": "Échec du démarrage de la régénération des miniatures", + "lightboxTitle": "Niveau d'aperçu de la visionneuse", + "lightboxHelp": "Lorsqu'il est activé, la visionneuse charge un JPEG de ~1920px préservant les proportions (généralement 200–500 Ko) au lieu de l'original complet (souvent 5–12 Mo). Les originaux sont toujours servis lorsque les invités cliquent sur Télécharger. Coûte environ un fichier d'aperçu supplémentaire par photo sur le disque ; les aperçus sont générés paresseusement lors de la première ouverture et stockés dans /previews.", + "lightboxToggle": "Utiliser des aperçus de résolution moyenne dans la visionneuse", + "lightboxToggleHelp": "Désactivé par défaut. Activez après avoir décidé que le gain de performance perçu vaut l'utilisation supplémentaire de disque.", + "regeneratePreviewsButton": "Régénérer tous les aperçus", + "previewsRegenerateStarted": "Régénération des aperçus de la visionneuse démarrée", + "previewsRegenerateError": "Échec du démarrage de la régénération des aperçus", + "saveSuccess": "Paramètres des miniatures enregistrés", + "saveError": "Échec de l'enregistrement des paramètres des miniatures", + "loadError": "Échec du chargement des paramètres des miniatures", + "infoTitle": "À propos des miniatures", + "infoText": "Les miniatures sont des images d'aperçu plus petites générées à partir de vos originaux. Augmenter la taille ou la qualité améliore l'apparence des photos dans la grille de la galerie mais utilise plus de stockage et de bande passante. Après avoir modifié les paramètres, utilisez \"Régénérer toutes les miniatures\" pour mettre à jour les photos existantes.", + "fit_cover": "Couvrir (recadrage pour remplir)", + "fit_contain": "Contenir (s'adapter dans)", "fit_fill": "Remplir (étirer)", - "fit_cover": "Recouvrir (recadrer pour remplir)", - "fit_contain": "Contenir (ajuster dans les limites)", - "fit_inside": "Intérieur (réduire pour ajuster)", - "fit_outside": "Extérieur (agrandir pour recouvrir)", - "fitRecommendation": "Recommandation : utilisez « Inside » pour les mises en page masonry/mosaic/justified (préserve les proportions) ; « Cover » pour des tuiles 1:1 uniformes." + "fit_inside": "Intérieur (rétrécir pour s'adapter)", + "fit_outside": "Extérieur (étendre pour couvrir)", + "fitRecommendation": "Recommandation : utilisez \"Intérieur\" pour les dispositions mosaïque / mosaïque / justifiée (préserve le rapport d'aspect) ; \"Couvrir\" pour les tuiles de grille uniformes 1:1." }, "seo": { - "title": "SEO et Robots", - "indexingTitle": "Indexation moteurs de recherche", - "allowIndexing": "Autoriser l'indexation", - "allowIndexingHelp": "Si désactivé, les robots sont bloqués via robots.txt. Recommandé pour le privé.", - "sitemapUrl": "URL du Sitemap", - "sitemapUrlHelp": "Optionnel. Ajouté au robots.txt.", - "aiBlockingTitle": "Blocage IA et Robots", - "blockAiCrawlers": "Bloquer les robots d'IA/LLM", - "blockAiCrawlersHelp": "Empêche l'entraînement des IA sur vos contenus.", + "title": "SEO & Robots", + "indexingTitle": "Indexation des moteurs de recherche", + "allowIndexing": "Autoriser l'indexation par les moteurs de recherche", + "allowIndexingHelp": "Lorsqu'il est désactivé, tous les robots sont bloqués via robots.txt. Recommandé pour les plateformes de photos privées.", + "sitemapUrl": "URL du plan du site", + "sitemapUrlHelp": "Optionnel. Ajouté à robots.txt si fourni.", + "aiBlockingTitle": "Blocage des IA & Bots", + "blockAiCrawlers": "Bloquer les robots d'IA/ML", + "blockAiCrawlersHelp": "Empêcher les robots de formation IA d'accéder à votre contenu.", "blockedAgents": "Agents IA bloqués", - "addAgentPlaceholder": "Nom de l'agent...", - "blockSocialBots": "Bloquer les robots de réseaux sociaux", - "blockSocialBotsHelp": "Empêche les aperçus sur Twitter, FB, etc.", - "metaTagsTitle": "Meta Tags et Règles", - "metaNoindex": "Ajouter meta noindex", - "metaNoindexHelp": "Complète le robots.txt au niveau HTML.", - "metaNofollow": "Ajouter meta nofollow", - "metaNofollowHelp": "Dit aux moteurs de ne pas suivre les liens.", - "metaNoai": "Ajouter meta noai/noimageai", - "metaNoaiHelp": "Signale que le contenu ne doit pas servir à l'IA.", - "customRules": "Règles robots.txt personnalisées", - "ruleAgentPlaceholder": "User-agent", - "rulePathPlaceholder": "Chemin interdit", - "showPreview": "Aperçu robots.txt", - "hidePreview": "Masquer l'aperçu", - "saveSettings": "Enregistrer SEO" + "addAgentPlaceholder": "Entrez le nom de l'agent...", + "blockSocialBots": "Bloquer les bots de prévisualisation des réseaux sociaux", + "blockSocialBotsHelp": "Empêcher les aperçus de liens sur Twitter, Facebook, LinkedIn, etc.", + "metaTagsTitle": "Balises Meta & Règles personnalisées", + "metaNoindex": "Ajouter la balise meta noindex", + "metaNoindexHelp": "Indique aux moteurs de recherche de ne pas indexer les pages (niveau HTML, complète robots.txt).", + "metaNofollow": "Ajouter la balise meta nofollow", + "metaNofollowHelp": "Indique aux moteurs de recherche de ne pas suivre les liens sur les pages.", + "metaNoai": "Ajouter la balise meta noai/noimageai", + "metaNoaiHelp": "Signale que le contenu ne doit pas être utilisé pour la formation IA.", + "customRules": "Règles personnalisées robots.txt", + "ruleAgentPlaceholder": "Agent utilisateur", + "rulePathPlaceholder": "Chemin à bloquer", + "showPreview": "Afficher l'aperçu robots.txt", + "hidePreview": "Masquer l'aperçu robots.txt", + "saveSettings": "Enregistrer les paramètres SEO" }, "analytics": { "title": "Analytique", - "umamiIntegration": "Intégration Umami", + "umamiIntegration": "Intégration Umami Analytics", "enableUmami": "Activer Umami Analytics", "umamiUrl": "URL Umami", - "umamiUrlHelp": "Ex: https://analytics.votredomaine.com", - "websiteId": "ID du site", - "websiteIdHelp": "Trouvé dans votre tableau de bord Umami", - "shareUrl": "URL de partage (Optionnel)", - "shareUrlHelp": "Pour intégrer le tableau de bord complet", - "umamiInfo": "À propos d'Umami", - "umamiInfoText": "Plateforme open-source respectueuse de la vie privée, sans cookies.", + "umamiUrlHelp": "L'URL de votre instance Umami (ex. : https://analytics.yourdomain.com)", + "websiteId": "ID du site web", + "websiteIdHelp": "Votre ID de site web Umami (trouvé dans le tableau de bord Umami)", + "shareUrl": "URL de partage (optionnel)", + "shareUrlHelp": "URL de partage publique pour intégrer le tableau de bord complet (créé dans Umami)", + "umamiInfo": "À propos d'Umami Analytics", + "umamiInfoText": "Umami est une plateforme d'analytique open-source axée sur la confidentialité. Elle suit les vues de pages, les visiteurs uniques et les événements personnalisés sans utiliser de cookies.", "learnMore": "En savoir plus sur Umami", - "saveAnalyticsSettings": "Enregistrer les paramètres", - "backendAnalytics": "Analytique Backend", - "backendAnalyticsText": "Le système suit des mesures de base pour la sécurité.", - "tracked": "Mesures suivies", - "galleryViews": "Vues des galeries", - "photoDownloads": "Téléchargements (unité et groupe)", + "saveAnalyticsSettings": "Enregistrer les paramètres d'analytique", + "backendAnalytics": "Analytique backend", + "backendAnalyticsText": "Le système suit également des analytiques de base côté serveur pour la sécurité et la surveillance des performances.", + "tracked": "Métriques suivies", + "galleryViews": "Vues des pages de galerie", + "photoDownloads": "Téléchargements individuels et en masse", "uniqueVisitors": "Visiteurs uniques par IP", - "deviceTypes": "Types d'appareils", - "privacy": "Vie privée", - "privacyText": "Les adresses IP sont hachées. Rétention : 90 jours." + "deviceTypes": "Types d'appareils à partir des agents utilisateurs", + "privacy": "Confidentialité", + "privacyText": "Les adresses IP sont hachées pour la confidentialité. Aucune donnée personnelle n'est stockée. Les données analytiques sont conservées pendant 90 jours." }, "groups": { "general": "Général", "display": "Affichage", "privacySecurity": "Confidentialité & Sécurité", "integrations": "Intégrations", - "system": "Système" + "system": "Système", + "appearance": "Contenu & Apparence", + "communication": "Communication" }, "apiTokens": { "title": "Jetons API", "createError": "Échec de la création du jeton", "revoked": "Jeton révoqué", - "subtitle": "Jetons porteur longue durée pour la surface publique /api/v1 — intégrations n8n, apps personnalisées, scripts. Les jetons agissent en tant qu'administrateur qui les a créés, limités aux portées choisies.", + "subtitle": "Jetons porteurs de longue durée pour la surface publique /api/v1 — intégrations n8n, applications personnalisées, scripts. Les jetons agissent comme l'utilisateur administrateur qui les a créés, intersectés avec les portées choisies.", "copyNow": "Copiez ce jeton maintenant — il ne sera plus affiché.", "copied": "Copié", "copyFailed": "Échec de la copie", @@ -1046,7 +1044,7 @@ "namePlaceholder": "ex. : n8n production", "scopes": "Portées", "generate": "Générer un jeton", - "scopeHint": "admin > écriture > lecture. Un jeton lecture seule ne peut pas modifier, même si son propriétaire est super_admin.", + "scopeHint": "admin > write > read. Un jeton en lecture seule ne peut pas muter, même si son propriétaire est super_admin.", "existing": "Jetons existants", "lastUsed": "Dernière utilisation", "created": "Créé", @@ -1054,376 +1052,451 @@ "statusRevoked": "Révoqué", "statusExpired": "Expiré", "statusActive": "Actif", - "confirmRevoke": "Révoquer ce jeton ? Cette action est irréversible.", + "confirmRevoke": "Voulez-vous révoquer ce jeton ? Cette action ne peut pas être annulée.", "revoke": "Révoquer", "empty": "Aucun jeton pour l'instant. Générez-en un ci-dessus pour commencer." }, "webhooks": { "title": "Webhooks", - "subtitle": "Envoyez des notifications POST à votre URL dès qu'un événement se produit — galerie publiée, photo téléversée, événement archivé, etc. Signé avec HMAC-SHA256 dans l'en-tête X-PicPeak-Signature.", - "piiNotice": "Les données event.* incluent les coordonnées du client (nom, e-mail, téléphone) et le jeton de partage de la galerie si vous les avez enregistrés. Ne pointez les webhooks que vers des récepteurs de confiance.", - "copyNow": "Copiez ce secret de signature maintenant — il ne sera plus affiché.", + "subtitle": "Notifications POST d'événements vers votre URL dès qu'un événement se produit — galerie publiée, photo téléversée, événement archivé, etc. Signé avec HMAC-SHA256 dans l'en-tête X-PicPeak-Signature.", + "piiNotice": "Les payloads event.* incluent les informations de contact du client (nom, e-mail, téléphone) et le jeton de partage de la galerie si vous les avez stockés. Ne pointez les webhooks que vers des récepteurs de confiance — ils ont tout ce qui est nécessaire pour envoyer un message au client ou ouvrir la galerie.", + "copyNow": "Copiez cette clé secrète de signature maintenant — elle ne sera plus affichée.", "name": "Nom", "url": "URL du récepteur", "events": "S'abonner aux événements", - "filter": "Filtre (JSON, facultatif)", - "template": "Modèle (facultatif)", + "filter": "Filtre (JSON, optionnel)", + "template": "Modèle (optionnel)", "create": "Créer un webhook", "existing": "Webhooks existants", - "empty": "Aucun webhook pour l'instant. Créez-en un ci-dessus pour recevoir des notifications." + "empty": "Aucun webhook pour l'instant. Créez-en un ci-dessus pour commencer à recevoir des notifications d'événements." }, "sectionLabel": "Section des paramètres", "navAriaLabel": "Navigation des paramètres", + "eventTypes": { + "title": "Types d'événements" + }, + "cms": { + "title": "Pages CMS" + }, + "email": { + "title": "Paramètres e-mail" + }, + "backup": { + "title": "Sauvegarde" + }, + "branding": { + "title": "Marque" + }, "features": { + "title": "Fonctionnalités", + "intro": "Activez ou désactivez les surfaces du produit. Les fonctionnalités activées apparaissent dans la navigation de gauche et deviennent disponibles pour votre équipe. Certaines fonctionnalités sont encore en version bêta — activez-les pour les essayer, désactivez-les pour les masquer.", + "notYetAvailable": "Pas encore disponible — cette bascule s'active lorsque la fonctionnalité est livrée.", + "sidebarHidden": "Aucun élément de barre latérale — s'exécute en arrière-plan", + "unsavedChanges": "Vous avez des modifications non enregistrées", + "preview": { + "title": "Aperçu de la barre latérale", + "note": "Réfléchit les modifications non enregistrées", + "legend": "Les éléments teintés en vert sont contrôlés par les bascules ci-dessus." + }, "sections": { + "core": "Noyau", + "communication": "Communication", + "scheduling": "Planification", + "sales": "Ventes", + "insights": "Analytique & Accès", "customers": "Clients", "clients": "Clients" }, + "status": { + "stable": "stable", + "beta": "bêta", + "new": "nouveau", + "experimental": "expérimental", + "roadmap": "feuille de route" + }, + "galleries": { + "title": "Galeries", + "description": "La surface principale de PicPeak. Toujours disponible.", + "locked": "Les galeries sont la base de PicPeak et ne peuvent pas être désactivées." + }, + "reminderEmails": { + "title": "E-mails de rappel", + "description": "Rappels automatiques aux invités avant l'expiration de leur galerie et aux administrateurs concernant les téléversements en attente." + }, + "messaging": { + "title": "Messagerie", + "description": "Threads dans l'application avec les invités, attachés à une galerie. L'e-mail est vraiment bien pour la plupart des équipes — ceci est pour les studios qui veulent tout au même endroit.", + "sidebar": "Messages" + }, + "calendar": { + "title": "Calendrier", + "description": "Voir tous les événements à venir et passés sur une vue mensuelle/hebdomadaire. Accepter éventuellement de nouvelles réservations de la part des clients.", + "sidebar": "Calendrier" + }, + "quotes": { + "title": "Devis", + "description": "Envoyer des devis détaillés aux clients. Ils peuvent accepter ou refuser via un lien public ; le paiement est suivi manuellement.", + "sidebar": "Devis" + }, + "bills": { + "title": "Factures", + "description": "Générer une facture à partir d'un devis accepté. Marquer comme payé manuellement — aucune intégration de processeur de paiement.", + "sidebar": "Factures" + }, + "analytics": { + "title": "Analytique", + "description": "Utilisation du stockage, vues des galeries, nombre de téléchargements et statistiques par événement." + }, + "userManagement": { + "title": "Gestion des utilisateurs", + "description": "Prise en charge multi-administrateurs avec autorisations basées sur les rôles. Désactivez si vous êtes un studio mono-opérateur.", + "warning": "Les comptes utilisateurs existants restent valides ; l'interface d'administration pour les gérer sera masquée jusqu'à ce que vous réactiviez cette fonctionnalité." + }, "customerPortal": { "title": "Clients", - "description": "Connexions client persistantes. Les clients récurrents voient toutes leurs galeries assignées au même endroit — pas de mots de passe par événement. Les clients se connectent sur /customer/login et vous les gérez sous Clients → Comptes." + "description": "Connexions clients persistantes. Les clients réguliers voient toutes leurs galeries assignées au même endroit — pas de mots de passe par événement. Les clients se connectent via /customer/login et vous les gérez sous Clients → Comptes." }, "clients": { "title": "Clients", - "description": "Interrupteur principal pour la section Clients de la barre latérale. Désactivé, masque la section et toutes les sous-fonctionnalités quelles que soient leurs bascules individuelles — réactiver les restaure dans leur état précédent." + "description": "Interrupteur principal pour la section Clients de la barre latérale. Désactivé masque la section et toutes les sous-fonctionnalités ci-dessous, quel que soit leur état individuel — réactivez pour restaurer selon ce que vous avez défini en dernier." } }, "customerSurface": { "brandingTitle": "En-tête du tableau de bord client", - "brandingHint": "Contrôle ce qui s'affiche dans l'en-tête de /customer/dashboard. Les galeries publiques et les surfaces administratives ne sont pas affectées.", + "brandingHint": "Contrôle ce qui s'affiche dans l'en-tête de /customer/dashboard. Les galeries publiques et les surfaces d'administration ne sont pas affectées.", "showLogo": "Afficher le logo dans l'en-tête client", "showLogoHint": "Utilise le même logo de marque configuré ci-dessus.", "showCompanyName": "Afficher le nom de l'entreprise dans l'en-tête client", - "showCompanyNameHint": "Masquer si votre logo inclut déjà le nom de l'entreprise.", + "showCompanyNameHint": "Masquez si votre logo inclut déjà le nom de l'entreprise.", "save": "Enregistrer les modifications", - "saved": "Branding du tableau de bord client enregistré", + "saved": "Marque du tableau de bord client enregistrée", "error": "Impossible d'enregistrer les paramètres" } }, "analytics": { "title": "Tableau de bord analytique", - "subtitle": "Suivi des performances et de l'engagement", - "detailedSubtitle": "Analyses détaillées via Umami", - "loadingAnalytics": "Chargement...", - "showSummaryView": "Vue Résumé", + "subtitle": "Suivre les performances des galeries et l'engagement des visiteurs", + "detailedSubtitle": "Analytique détaillée alimentée par Umami", + "loadingAnalytics": "Chargement des analytiques...", + "showSummaryView": "Afficher la vue récapitulative", "fullDashboard": "Tableau de bord complet", "refresh": "Actualiser", - "last7Days": "7 derniers jours", - "last30Days": "30 derniers jours", - "last90Days": "90 derniers jours", + "last7Days": "Derniers 7 jours", + "last30Days": "Derniers 30 jours", + "last90Days": "Derniers 90 jours", "pageViews": "Vues de pages", "uniqueVisitors": "Visiteurs uniques", - "totalDownloads": "Total téléchargements", - "topGallery": "Meilleure galerie", - "topPages": "Pages les plus vues", + "totalDownloads": "Téléchargements totaux", + "topGallery": "Galerie principale", + "topPages": "Pages principales", "views": "vues", "visitors": "visiteurs uniques", - "topDownloadsByGallery": "Téléchargements par galerie", + "topDownloadsByGallery": "Téléchargements principaux par galerie", "deviceBreakdown": "Répartition par appareil", - "desktop": "Ordinateur", + "desktop": "Bureau", "mobile": "Mobile", "tablet": "Tablette", - "storageUsage": "Usage stockage", + "storageUsage": "Utilisation du stockage", "used": "Utilisé", "of": "sur", - "totalPhotos": "Total photos", + "totalPhotos": "Photos totales", "activeEvents": "Événements actifs", - "notConfigured": "Umami non configuré", - "configureInstructions": "Configurez Umami dans vos variables d'environnement." + "notConfigured": "Umami Analytics non configuré", + "configureInstructions": "Pour voir les données analytiques réelles, configurez Umami dans vos variables d'environnement et les paramètres du panneau d'administration." }, "branding": { - "title": "Identité et Thèmes", + "title": "Marque & Thèmes", "subtitle": "Personnalisez l'apparence de vos galeries", - "loadingBranding": "Chargement...", - "themeAndStyle": "Thème et Style", - "companyInfo": "Informations entreprise", + "loadingBranding": "Chargement des paramètres de marque...", + "themeAndStyle": "Thème & Style", + "companyInfo": "Informations sur l'entreprise", "companyName": "Nom de l'entreprise", - "companyNameHelp": "Affiché dans les en-têtes et e-mails", - "companyTagline": "Slogan", - "companyTaglineHelp": "Courte description de votre activité", + "companyNameHelp": "Affiché dans les en-têtes des galeries et les e-mails", + "companyTagline": "Slogan de l'entreprise", + "companyTaglineHelp": "Une courte description de votre entreprise", "supportEmail": "E-mail de support", - "supportEmailHelp": "Contact pour l'aide aux invités", - "footerText": "Texte de pied de page", + "supportEmailHelp": "E-mail de contact pour le support aux invités", + "footerText": "Texte du pied de page", "logo": "Logo", - "uploadLogo": "Téléverser logo", + "uploadLogo": "Téléverser le logo", "logoHelp": "Taille recommandée : 200x60px, PNG ou JPEG", "favicon": "Favicon", "currentFavicon": "Favicon actuel", - "uploadFavicon": "Téléverser favicon", - "removeFavicon": "Retirer favicon", - "faviconHelp": "Format PNG ou ICO, 32x32px recommandé", - "watermarkSettings": "Paramètres filigrane", + "uploadFavicon": "Téléverser la favicon", + "removeFavicon": "Supprimer la favicon", + "faviconHelp": "Format PNG ou ICO, taille recommandée : 32x32px", + "watermarkSettings": "Paramètres du filigrane", "enableWatermarks": "Activer les filigranes", - "watermarkHelp": "Ajoute le nom de votre entreprise sur les photos téléchargées", - "watermarkLogo": "Logo de filigrane", + "watermarkHelp": "Ajoutez le nom de votre entreprise comme filigrane sur les photos téléchargées", + "watermarkLogo": "Logo du filigrane", "currentWatermark": "Filigrane actuel", - "uploadWatermarkLogo": "Téléverser logo filigrane", - "watermarkPosition": "Position filigrane", - "topLeft": "Haut Gauche", - "topRight": "Haut Droite", + "uploadWatermarkLogo": "Téléverser le logo du filigrane", + "watermarkPosition": "Position du filigrane", + "topLeft": "Haut gauche", + "topRight": "Haut droite", "center": "Centre", - "bottomLeft": "Bas Gauche", - "bottomRight": "Bas Droite", - "watermarkOpacity": "Opacité filigrane", - "watermarkSize": "Taille filigrane", + "bottomLeft": "Bas gauche", + "bottomRight": "Bas droite", + "watermarkOpacity": "Opacité du filigrane", + "watermarkSize": "Taille du filigrane", "theme": "Thème", - "galleryTheme": "Thème galerie", + "galleryTheme": "Thème de la galerie", "colors": "Couleurs", "accentColor": "Couleur d'accentuation", "backgroundColor": "Couleur de fond", - "textColor": "Couleur de texte", + "textColor": "Couleur du texte", "colorMode": "Mode de couleur", "colorModeLight": "Clair", "colorModeDark": "Sombre", "colorModeAuto": "Auto", - "colorModeHelp": "Auto suit les préférences système de l'invité.", + "colorModeHelp": "Auto suit la préférence du système du visiteur.", "preview": "Aperçu", - "saveChanges": "Enregistrer", - "applyLivePreview": "Appliquer immédiatement (Aperçu direct)", - "eventSpecificThemes": "Thèmes spécifiques par événement", - "eventThemesInfo": "Vous pouvez surcharger ces paramètres globaux pour chaque événement.", + "saveChanges": "Enregistrer les modifications", + "applyLivePreview": "Appliquer les modifications immédiatement (Aperçu en direct)", + "eventSpecificThemes": "Thèmes spécifiques aux événements", + "eventThemesInfo": "Vous pouvez remplacer ces paramètres de thème globaux pour des événements individuels lors de leur création ou modification.", "themePresets": "Préréglages de thème", - "galleryLayout": "Mise en page", - "layoutSettings": "Paramètres de mise en page", + "galleryLayout": "Disposition de la galerie", + "layoutSettings": "Paramètres de disposition", "photoSpacing": "Espacement des photos", "spacing": { - "tight": "Serré", + "tight": "Serre", "normal": "Normal", - "relaxed": "Espacé" + "relaxed": "Relâché" }, - "photoAnimation": "Animations photos", + "photoAnimation": "Animation des photos", "animation": { "none": "Aucune", "fade": "Fondu", - "scale": "Zoom", - "slide": "Glissement" + "scale": "Mise à l'échelle", + "slide": "Glissé" }, "columns": "Colonnes", "mobile": "Mobile", "tablet": "Tablette", - "desktop": "Ordinateur", - "enableAutoplay": "Lecture auto", - "autoplayInterval": "Intervalle lecture auto (s)", - "groupPhotosBy": "Grouper par", + "desktop": "Bureau", + "enableAutoplay": "Activer le défilement automatique", + "autoplayInterval": "Intervalle de défilement automatique (secondes)", + "groupPhotosBy": "Grouper les photos par", "grouping": { "day": "Jour", "week": "Semaine", "month": "Mois" }, - "masonryMode": "Mode de mise en page", + "masonryMode": "Mode de disposition", "masonryModeOptions": { - "columns": "Colonnes (Pinterest)", - "rows": "Lignes (Justifié personnalisé)", - "flickr": "Flickr (Justifié robuste)", - "justified": "Google Photos (Algorithme Knuth-Plass)" + "columns": "Colonnes (style Pinterest)", + "rows": "Lignes (justifié personnalisé)", + "flickr": "Flickr (justifié éprouvé)", + "justified": "Google Photos (algorithme Knuth-Plass)" }, "masonryModeHint": { - "columns": "Colonnes verticales style Pinterest", - "rows": "Lignes justifiées personnalisées", - "flickr": "Algorithme de Flickr pour le justifié", - "justified": "Lignes style Google Photos pour des coupures optimales" + "columns": "Colonnes verticales de style Pinterest avec hauteurs variables", + "rows": "Disposition justifiée basée sur des lignes personnalisées", + "flickr": "Algorithme de disposition justifiée open-source de Flickr", + "justified": "Lignes de style Google Photos utilisant l'algorithme Knuth-Plass pour des ruptures optimales" }, "targetRowHeight": "Hauteur de ligne cible", - "targetRowHeightHint": "En pixels (150-400). Les photos s'adapteront aux lignes.", - "lastRowBehavior": "Alignement dernière ligne", + "targetRowHeightHint": "Hauteur en pixels (150-400). Les photos s'adapteront pour remplir les lignes.", + "lastRowBehavior": "Alignement de la dernière ligne", "lastRowOptions": { "left": "Aligné à gauche", "center": "Centré", "justify": "Justifié (étiré)" }, - "typographyAndStyle": "Typographie et Style", - "bodyFont": "Police de corps", - "headingFont": "Police de titre", + "thumbnailScale": "Échelle des miniatures", + "thumbnailScaleOptions": { + "xs": "XS — La plupart des photos", + "sm": "SM — Plus de photos", + "md": "MD — Par défaut", + "lg": "LG — Photos plus grandes", + "xl": "XL — Plus grandes photos" + }, + "thumbnailScaleHint": "Ajuste le nombre de colonnes par rapport au nombre de colonnes de base de la grille", + "typographyAndStyle": "Typographie & Style", + "bodyFont": "Police du corps", + "headingFont": "Police des titres", "sameAsBody": "Identique au corps", "fontSize": "Taille de police", "fontSizes": { - "small": "Petit", - "normal": "Normal", - "large": "Grand" + "small": "Petite", + "normal": "Normale", + "large": "Grande" }, - "borderRadius": "Arrondi des coins", + "borderRadius": "Bordure arrondie", "borderRadiusOptions": { - "none": "Aucun", - "small": "Petit", - "medium": "Moyen", - "large": "Grand" + "none": "Aucune", + "small": "Petite", + "medium": "Moyenne", + "large": "Grande" }, "shadowStyle": "Style d'ombre", "shadowOptions": { "none": "Aucune", "subtle": "Subtile", "normal": "Normale", - "dramatic": "Prononcée" + "dramatic": "Dramatique" }, - "backgroundPattern": "Fond", + "backgroundPattern": "Arrière-plan", "backgroundOptions": { - "none": "Uni", + "none": "Aucun", "dots": "Points", "grid": "Grille", "waves": "Vagues" }, - "customCSSHelp": "Avancé : Ajoutez du CSS pour personnaliser davantage", + "customCSSHelp": "Avancé : Ajoutez du CSS personnalisé pour personnaliser davantage l'apparence", "cssInstructions": { - "title": "Usage du CSS personnalisé", + "title": "Comment utiliser le CSS personnalisé", "variables": "Variables CSS du thème", - "variablesDesc": "Utilisez ces variables pour correspondre au thème :", - "layouts": "Éléments de mise en page", - "layoutsDesc": "Ciblez les éléments avec ces sélecteurs :", + "variablesDesc": "Utilisez ces variables CSS pour correspondre aux préréglages de votre thème :", + "layouts": "Dispositions personnalisées de la galerie", + "layoutsDesc": "Ciblez les éléments de la galerie avec ces sélecteurs :", "glassEffect": "Effet Glassmorphism", - "glassEffectDesc": "Pour des effets de verre modernes :", + "glassEffectDesc": "Créez des effets de verre modernes :", "tip": "Astuce", - "tipText": "Utilisez les modèles CSS depuis les Paramètres pour des designs comme Apple Liquid Glass." + "tipText": "Utilisez les modèles CSS des Paramètres > Modèles CSS pour des designs préconstruits comme Apple Liquid Glass." }, - "resetToDefault": "Réinitialiser", + "resetToDefault": "Réinitialiser aux valeurs par défaut", "applyTheme": "Appliquer le thème", "saveTheme": "Enregistrer le thème", - "previewLayout": "Aperçu mise en page", - "livePreview": "Aperçu direct", - "heroPlaceholderText": "L'image Hero de l'événement apparaîtra ici", + "previewLayout": "Aperçu de la disposition", + "livePreview": "Aperçu en direct", + "heroPlaceholderText": "La photo d'en-tête de votre événement apparaîtra ici", "whiteLabel": "Marque blanche", - "hidePoweredBy": "Masquer la mention \"Powered by PicPeak\"", - "hidePoweredByHelp": "Retire l'attribution PicPeak du pied de page", + "hidePoweredBy": "Masquer la mention \"Propulsé par PicPeak\"", + "hidePoweredByHelp": "Supprimez la mention PicPeak des pieds de page des galeries pour une expérience entièrement en marque blanche", "logoCustomization": "Personnalisation du logo", - "changeLogo": "Changer le logo", + "changeLogo": "Modifier le logo", "logoSizeSmall": "Petit (32px)", "logoSizeMedium": "Moyen (48px)", "logoSizeLarge": "Grand (64px)", - "logoSizeXLarge": "Très Grand (96px)", + "logoSizeXLarge": "Très grand (96px)", "logoSizeCustom": "Personnalisé", "logoMaxHeight": "Hauteur maximale (pixels)", - "logoMaxHeightHelp": "Hauteur personnalisée (20-200 pixels)", + "logoMaxHeightHelp": "Définissez une hauteur maximale personnalisée pour le logo (20-200 pixels)", "logoPosition": "Position du logo dans l'en-tête", "logoDisplayMode": "Mode d'affichage", "logoOnly": "Logo uniquement", - "textOnly": "Nom d'entreprise uniquement", - "logoAndText": "Logo et Nom d'entreprise", - "showLogoInHeader": "Logo dans l'en-tête", - "showLogoInHeaderHelp": "Afficher le logo dans la barre d'en-tête", - "showLogoInHero": "Logo dans la section Hero", - "showLogoInHeroHelp": "Afficher le logo dans la section principale", - "headerStyle": "Style d'en-tête", - "headerStyleDescription": "Choisissez l'apparence de l'en-tête.", + "textOnly": "Nom de l'entreprise uniquement", + "logoAndText": "Logo et nom de l'entreprise", + "showLogoInHeader": "Afficher le logo dans l'en-tête de la galerie", + "showLogoInHeaderHelp": "Afficher le logo dans la barre d'en-tête principale", + "showLogoInHero": "Afficher le logo dans la section d'en-tête", + "showLogoInHeroHelp": "Afficher le logo dans les sections d'en-tête (pour les dispositions non en grille)", + "headerStyle": "Style de l'en-tête", + "headerStyleDescription": "Choisissez l'apparence de l'en-tête de la galerie. Le style de l'en-tête est indépendant de la disposition des photos.", "heroDividerStyle": "Style de séparateur", - "heroDividerDescription": "Forme de la transition sous l'image Hero.", + "heroDividerDescription": "Choisissez l'apparence de la transition entre l'image d'en-tête et le contenu de la galerie.", "controlsStyle": "Style des contrôles", - "controlsStyleDescription": "Affichage des filtres et contrôles.", + "controlsStyleDescription": "Choisissez comment les filtres et contrôles de la galerie sont affichés.", "controlsStyleOptions": { "classic": "Classique", "sidebar": "Barre latérale" }, "controlsStyleDescriptions": { - "classic": "Barre de filtres sous l'en-tête", - "sidebar": "Bouton menu ouvrant un volet latéral" + "classic": "Barre de filtre en ligne sous l'en-tête", + "sidebar": "Le bouton de menu ouvre une barre latérale avec les filtres" }, - "controlsStyleHeroWarning": "La barre latérale est recommandée pour les en-têtes Hero.", + "controlsStyleHeroWarning": "La barre latérale est recommandée pour les en-têtes de type Hero pour éviter que les contrôles n'apparaissent au-dessus de l'image d'en-tête.", + "betaThumbnailWarningTitle": "Faible résolution des miniatures détectée", + "betaThumbnailWarningText": "Vos miniatures mesurent actuellement {{width}}×{{height}}px. Les thèmes bêta affichent les photos à des tailles plus grandes et nécessitent au moins {{recommended}}×{{recommended}}px pour une bonne qualité. Augmentez les dimensions des miniatures dans Paramètres > Miniatures et régénérez.", + "betaThumbnailWarningLink": "Accéder aux paramètres des miniatures", "logoSize": "Taille du logo", "surfaceColor": "Surface", "elevatedColor": "Élevé", "borderColor": "Bordure", "mutedTextColor": "Texte atténué", - "accentDarkColor": "Accent (rempli)", - "betaThumbnailWarningTitle": "Résolution de miniature faible détectée", - "betaThumbnailWarningText": "Vos miniatures font actuellement {{width}}×{{height}}px. Les thèmes bêta affichent les photos en plus grande taille et nécessitent au moins {{recommended}}×{{recommended}}px pour une bonne qualité. Augmentez les dimensions dans Paramètres > Miniatures et régénérez.", - "betaThumbnailWarningLink": "Aller aux paramètres de miniatures", - "thumbnailScale": "Échelle des miniatures", - "thumbnailScaleOptions": { - "xs": "XS — Plus de photos", - "sm": "SM — Beaucoup de photos", - "md": "MD — Par défaut", - "lg": "LG — Photos plus grandes", - "xl": "XL — Photos les plus grandes" - }, - "thumbnailScaleHint": "Ajuste le nombre de colonnes par rapport à la grille de base", - "syncFromBranding": "Synchroniser depuis la charte graphique", - "forceColorMode": "Forcer le mode couleur", - "forceColorModeHelp": "Verrouille l'ensemble du site admin et public en mode sombre ou clair. Le bouton de basculement sombre/clair est masqué dès qu'un verrouillage est actif.", - "forceColorModeNone": "Pas de forçage (choix de l'utilisateur)", - "forceColorModeDark": "Forcer le mode sombre", - "forceColorModeLight": "Forcer le mode clair", + "accentDarkColor": "Accentuation (rempli)", + "syncFromBranding": "Synchroniser depuis la marque", + "forceColorMode": "Forcer le mode de couleur", + "forceColorModeHelp": "Verrouiller l'admin et le site public en sombre ou clair. Le bouton sombre/clair utilisateur est masqué chaque fois qu'un verrou est actif. Les thèmes par événement qui tentent de remplacer le mode de couleur sont également forcés de suivre.", + "forceColorModeNone": "Aucun forçage (choix de l'utilisateur)", + "forceColorModeDark": "Forcer le sombre", + "forceColorModeLight": "Forcer le clair", "colorGroupSurfaces": "Surfaces", - "colorGroupSurfacesHelp": "Les couches neutres derrière votre contenu. L'arrière-plan est le plus en retrait ; Surface et Élevé s'empilent au-dessus.", - "backgroundColorHelp": "La page elle-même — arrière-plan de chaque galerie, page admin et page CMS.", - "surfaceColorHelp": "Cartes, barre latérale, en-tête et navigation. La première couche au-dessus de l'arrière-plan.", - "elevatedColorHelp": "Panneaux flottant au-dessus des cartes : espaces réservés aux images, lignes au survol, en-têtes modaux, blocs de code.", - "borderColorHelp": "Séparateurs, lignes de grille, contours de cartes, bordures d'inputs.", + "colorGroupSurfacesHelp": "Les couches neutres derrière votre contenu. L'arrière-plan est le plus en arrière ; Surface et Élevé s'empilent par-dessus.", + "backgroundColorHelp": "La page elle-même — arrière-plan du corps de chaque galerie, page d'administration et page CMS.", + "surfaceColorHelp": "Cartes, barre latérale, barre d'en-tête et navigation. La première couche au-dessus de l'Arrière-plan.", + "elevatedColorHelp": "Panneaux qui flottent au-dessus des cartes : placeholders d'images, lignes survolées/actives, en-têtes de modales, blocs de code.", + "borderColorHelp": "Diviseurs, lignes de grille des tableaux, contours des cartes, bordures des entrées.", "colorGroupText": "Texte", - "colorGroupTextHelp": "Couleurs de texte en avant-plan. Primaire pour tout ce sur quoi les lecteurs se concentrent ; Secondaire pour le texte d'accompagnement.", - "textColorHelp": "Titres, corps de texte, cellules de tableau, valeurs d'inputs, étiquettes de navigation — la couleur principale du texte.", - "mutedTextColorHelp": "Légendes, texte d'aide sous les inputs, en-têtes de colonnes, liens de pied de page, dates et métadonnées.", - "colorGroupAccent": "Accent", - "colorGroupAccentHelp": "Couleurs de marque qui mettent en valeur les éléments interactifs. Utilisez une paire de couleurs fortes — Accent pour les contours/texte, Accent (rempli) pour les boutons remplis.", - "accentColorHelp": "Liens, icônes, anneaux de focus, états de survol sur les boutons principaux. Doit être lisible sur l'arrière-plan et la surface.", - "accentDarkColorHelp": "Boutons d'appel à l'action remplis, arrière-plan de l'élément actif de la barre latérale, badges et étiquettes. Doit offrir assez de contraste pour un texte blanc lisible.", + "colorGroupTextHelp": "Couleurs de texte de premier plan. Primaire pour tout ce sur quoi les lecteurs se concentrent ; Secondaire pour le texte de soutien.", + "textColorHelp": "Titres, corps du texte, cellules de tableau, valeurs d'entrée de formulaire, étiquettes de navigation — la couleur de texte principale.", + "mutedTextColorHelp": "Légendes, texte d'aide sous les entrées, en-têtes de colonnes de tableau, liens de pied de page, dates et métadonnées.", + "colorGroupAccent": "Accentuation", + "colorGroupAccentHelp": "Couleurs de marque qui mettent en évidence les éléments interactifs. Utilisez une paire de couleurs forte — Accent est pour les contours/textes, Accent Foncé est pour les boutons remplis.", + "accentColorHelp": "Liens, icônes, anneaux de focus, états de survol sur les boutons principaux, soulignement des éléments actifs de la barre latérale. Doit être clairement lisible sur Arrière-plan et Surface.", + "accentDarkColorHelp": "Boutons d'appel à l'action remplis, arrière-plan des éléments actifs de la barre latérale, badges et tags. Doit avoir un contraste suffisant pour que le texte blanc soit lisible.", "cssTemplate": "Modèle CSS", - "cssTemplateDescription": "Sélectionnez un modèle CSS prédéfini pour appliquer un style global à cette galerie. Les modèles peuvent être gérés dans Paramètres > Modèles CSS.", + "cssTemplateDescription": "Sélectionnez un modèle CSS préconstruit pour appliquer un style global à cette galerie. Les modèles peuvent être gérés dans Paramètres > Modèles CSS.", "noTemplate": "Aucun modèle", "noTemplateDescription": "Utiliser uniquement les paramètres de thème sans modèle CSS", "templateSlot": "Emplacement {{slot}}", - "eventCustomCSS": "CSS personnalisé par événement", + "eventCustomCSS": "CSS personnalisé spécifique à l'événement", "layoutDescriptions": { - "grid": "Disposition en grille classique avec tailles de photos uniformes", - "masonry": "Disposition de type Pinterest avec hauteurs variées", + "grid": "Disposition en grille classique avec des tailles de photos cohérentes", + "masonry": "Disposition de style Pinterest avec des hauteurs variables", "carousel": "Diaporama plein écran avec navigation", "timeline": "Photos organisées par date", - "mosaic": "Disposition artistique avec tailles mixtes", - "gallery-premium": "Thème clair élégant avec hero et masonry (Bêta)", - "gallery-story": "Thème sombre cinématographique avec sections de scènes (Bêta)" + "mosaic": "Disposition artistique avec des tailles mixtes", + "gallery-premium": "Thème clair élégant avec en-tête et disposition en mosaïque (Bêta)", + "gallery-story": "Thème sombre cinématographique avec sections de scène (Bêta)" }, "headerStyleOptions": { - "hero": "Image Hero", + "hero": "Image d'en-tête", "standard": "Standard", "banner": "Bannière", - "minimal": "Minimal", + "minimal": "Minimaliste", "none": "Pas d'en-tête" }, "headerStyleDescriptions": { - "hero": "Image pleine hauteur avec superposition d'informations sur l'événement", - "standard": "En-tête compact avec détails de l'événement", - "banner": "En-tête standard avec bannière colorée au-dessus", + "hero": "Image en plein écran avec superposition des informations de l'événement", + "standard": "En-tête compact en ligne avec détails de l'événement", + "banner": "En-tête standard plus une bannière colorée au-dessus", "minimal": "En-tête compact avec informations essentielles", "none": "Masquer complètement l'en-tête" }, "dividerOptions": { - "none": "Aucun", "wave": "Vague", - "straight": "Droit", + "straight": "Droite", "angle": "Angle", - "curve": "Courbe" + "curve": "Courbe", + "none": "Aucun" }, "loginLogo": { "title": "Logo des pages de connexion", - "subtitle": "S'applique uniquement à /admin/login et /customer/login. La galerie et l'interface admin utilisent les paramètres de logo ci-dessus.", - "frame": "Afficher le cadre teinté derrière le logo", - "frameHelp": "Lorsque désactivé, le logo se pose directement sur l'arrière-plan de la page. Utile pour les logos qui ont déjà leur propre fond.", + "subtitle": "Contrôle uniquement /admin/login et /customer/login. La galerie et l'interface d'administration utilisent les paramètres de logo ci-dessus.", + "frame": "Afficher un cadre teinté derrière le logo", + "frameHelp": "Lorsqu'il est désactivé, le logo est directement sur l'arrière-plan de la page. Utile pour les logos qui incluent déjà leur propre fond.", "size": "Taille du logo sur les pages de connexion", - "sizeSmall": "Petite", - "sizeMedium": "Moyenne (par défaut)", - "sizeLarge": "Grande", - "sizeXLarge": "Très grande" + "sizeSmall": "Petit", + "sizeMedium": "Moyen (par défaut)", + "sizeLarge": "Grand", + "sizeXLarge": "Très grand" }, "promo": { "alignment": "Alignement", - "alignLeft": "À gauche", - "alignCenter": "Centré (par défaut — identique au pied de page)", - "alignRight": "À droite" + "alignLeft": "Gauche", + "alignCenter": "Centre (par défaut — correspond au pied de page)", + "alignRight": "Droite" } }, "admin": { "title": "Panneau d'administration", "recentActivity": "Activité récente", - "storageUsed": "Stockage utilisé", - "totalPhotos": "Total photos", + "storageUsed": "Espace utilisé", + "totalPhotos": "Photos totales", "storagePercent": "{{percent}}% de la limite {{limit}}", "storageSoftLimitConfigured": "Limite configurée : {{limit}}", "storageSoftLimitRecommended": "Limite suggérée : {{limit}}", "version": "Version", "archivedEvents": "Événements archivés", - "systemHealth": "Santé système", + "systemHealth": "État du système", "health": { - "checking": "Vérification...", - "healthy": "Sain", + "healthy": "Opérationnel", "warning": "Avertissement", - "error": "Erreur" + "error": "Erreur", + "checking": "Vérification en cours..." }, "updates": { "available": "Mise à jour disponible", @@ -1431,33 +1504,33 @@ "currentVersion": "Actuelle : {{version}}", "channel": "Canal : {{channel}}", "channelStable": "Stable", - "channelBeta": "Beta", - "beta": "BETA", - "viewReleaseNotes": "Notes de version", + "channelBeta": "Bêta", + "beta": "BÊTA", + "viewReleaseNotes": "Voir les notes de version", "updateAvailableShort": "v{{version}} disponible", - "upToDate": "À jour", - "updateNow": "Mettre à jour", + "upToDate": "Vous êtes à jour", + "updateNow": "Mettre à jour maintenant", "updateDialog": { "title": "Mettre à jour PicPeak", "detectedEnv": "Environnement détecté", "beforeUpdating": "Avant de mettre à jour :", - "updateCommands": "Commandes :", - "afterUpdating": "Après mise à jour :", - "copyAllCommands": "Copier les commandes", - "completeChecklist": "Complétez la liste avant de lancer", - "error": "Échec du chargement des instructions" + "updateCommands": "Commandes de mise à jour :", + "afterUpdating": "Après la mise à jour :", + "copyAllCommands": "Copier toutes les commandes", + "completeChecklist": "Complétez la liste de contrôle avant de mettre à jour", + "error": "Échec du chargement des instructions de mise à jour" } }, "notifications": "Notifications", "markAllRead": "Tout marquer comme lu", "clearAll": "Tout effacer", "close": "Fermer", - "noNotificationsMessage": "Pas de notifications", + "noNotificationsMessage": "Aucune notification", "notificationMessages": { - "eventCreated": "Nouvel événement \"{{eventName}}\" créé", - "eventArchived": "Événement \"{{eventName}}\" archivé", - "eventUpdated": "Événement \"{{eventName}}\" mis à jour", - "eventDeleted": "Événement \"{{eventName}}\" supprimé", + "eventCreated": "Nouvel événement \"{{eventName}}\" a été créé", + "eventArchived": "L'événement \"{{eventName}}\" a été archivé", + "eventUpdated": "L'événement \"{{eventName}}\" a été mis à jour", + "eventDeleted": "L'événement \"{{eventName}}\" a été supprimé", "photoDeleted": "Photo supprimée de \"{{eventName}}\"", "eventExpiring": "L'événement \"{{eventName}}\" expire dans {{days}} jours", "eventExpired": "L'événement \"{{eventName}}\" a expiré", @@ -1465,47 +1538,44 @@ "passwordReset": "Réinitialisation du mot de passe pour \"{{eventName}}\"", "settingsUpdated": "Paramètres {{type}} mis à jour", "emailTemplateUpdated": "Modèle d'e-mail \"{{template}}\" mis à jour", - "storageWarning": "Usage stockage à {{percentage}}%", - "adminLogout": "Déconnexion admin {{actorName}}", + "storageWarning": "Utilisation du stockage à {{percentage}}%", + "adminLogout": "L'administrateur {{actorName}} s'est déconnecté", "categoryCreated": "Catégorie \"{{name}}\" créée pour \"{{eventName}}\"", - "categoryUpdated": "Catégorie \"{{name}}\" mise à jour", - "categoryDeleted": "Catégorie \"{{name}}\" supprimée", + "categoryUpdated": "Catégorie \"{{name}}\" mise à jour pour \"{{eventName}}\"", + "categoryDeleted": "Catégorie \"{{name}}\" supprimée de \"{{eventName}}\"", "cmsPageUpdated": "Page CMS \"{{slug}}\" mise à jour", "emailConfigUpdated": "Configuration e-mail mise à jour", - "faviconUploaded": "Favicon téléversé", - "brandingUpdated": "Paramètres d'identité mis à jour", + "faviconUploaded": "Favicon téléversée", + "brandingUpdated": "Paramètres de marque mis à jour", "generalSettingsUpdated": "Paramètres généraux mis à jour", "securitySettingsUpdated": "Paramètres de sécurité mis à jour", - "themeUpdated": "Thème mis à jour", + "themeUpdated": "Paramètres de thème mis à jour", "archiveDownloaded": "Archive téléchargée pour \"{{eventName}}\"", "archiveDeleted": "Archive supprimée pour \"{{eventName}}\"", "archiveRestored": "Archive restaurée pour \"{{eventName}}\"", "systemActivity": "Activité système : {{type}}", - "adminProfileUpdated": "Profil admin mis à jour par {{actorName}}", - "photosUploaded_many": "{{count}} photos téléversées dans « {{eventName}} »", - "photosUploaded_one": "{{count}} photo téléversée dans « {{eventName}} »", - "photosUploaded_other": "{{count}} photos téléversées dans « {{eventName}} »", - "photosBulkDeleted_many": "{{count}} photos supprimées de « {{eventName}} »", - "photosBulkDeleted_one": "{{count}} photo supprimée de « {{eventName}} »", - "photosBulkDeleted_other": "{{count}} photos supprimées de « {{eventName}} »", - "bulkDownload_many": "{{count}} photos téléchargées depuis « {{eventName}} »", - "bulkDownload_one": "{{count}} photo téléchargée depuis « {{eventName}} »", - "bulkDownload_other": "{{count}} photos téléchargées depuis « {{eventName}} »", + "adminProfileUpdated": "Profil administrateur mis à jour par {{actorName}}", + "photosUploaded_one": "{{count}} photo téléversée dans \"{{eventName}}\"", + "photosUploaded_other": "{{count}} photos téléversées dans \"{{eventName}}\"", + "photosBulkDeleted_one": "{{count}} photo supprimée de \"{{eventName}}\"", + "photosBulkDeleted_other": "{{count}} photos supprimées de \"{{eventName}}\"", + "bulkDownload_one": "{{count}} photo téléchargée depuis \"{{eventName}}\"", + "bulkDownload_other": "{{count}} photos téléchargées depuis \"{{eventName}}\"", "customerLogin": "Client connecté : {{email}}", "customerInvitationCreated": "Invitation client envoyée à {{email}}", - "customerInvitationAccepted": "Client a accepté l’invitation : {{email}}", + "customerInvitationAccepted": "Invitation acceptée par le client : {{email}}", "customerInvitationCancelled": "Invitation client annulée : {{email}}", - "customerPasswordResetRequested": "Réinitialisation du mot de passe demandée pour {{email}}", - "customerPasswordResetApplied": "Mot de passe client réinitialisé par admin : {{email}}", - "customerPasswordChange": "Client a changé son mot de passe : {{email}}", - "customerSelfProfileUpdate": "Client a mis à jour son profil : {{email}}", + "customerPasswordResetRequested": "Réinitialisation du mot de passe demandée pour le client {{email}}", + "customerPasswordResetApplied": "Réinitialisation du mot de passe client par l'admin : {{email}}", + "customerPasswordChange": "Le client a changé son mot de passe : {{email}}", + "customerSelfProfileUpdate": "Le client a mis à jour son profil : {{email}}", "customerEventAccess": "{{email}} a ouvert {{eventName}}", "customerUpdated": "Compte client mis à jour : {{email}}", "customerDeactivated": "Compte client désactivé : {{email}}", "customerReactivated": "Compte client réactivé : {{email}}", "customerErased": "Compte client effacé (RGPD) : {{email}}", "adminInvitationCreated": "Invitation admin envoyée à {{email}}", - "adminInvitationAccepted": "Admin a accepté l’invitation : {{email}}", + "adminInvitationAccepted": "Invitation acceptée par l'admin : {{email}}", "adminInvitationCancelled": "Invitation admin annulée : {{email}}", "adminUserUpdated": "Utilisateur admin mis à jour : {{username}}", "adminUserDeactivated": "Utilisateur admin désactivé : {{username}}", @@ -1514,66 +1584,73 @@ "webhookDeleted": "Webhook supprimé : {{name}}", "apiTokenCreated": "Jeton API créé : {{name}}", "apiTokenRevoked": "Jeton API révoqué : {{name}}", - "eventTypeCreated": "Type d’événement créé : {{name}}", - "eventTypeUpdated": "Type d’événement mis à jour : {{name}}", - "eventTypeDeleted": "Type d’événement supprimé : {{name}}", - "eventTypesReordered": "Types d’événements réorganisés", + "eventTypeCreated": "Type d'événement créé : {{name}}", + "eventTypeUpdated": "Type d'événement mis à jour : {{name}}", + "eventTypeDeleted": "Type d'événement supprimé : {{name}}", + "eventTypesReordered": "Types d'événements réorganisés", "eventPublished": "Événement publié : {{eventName}}", - "eventLogoUploaded": "Logo d’événement téléversé pour {{eventName}}", - "eventLogoRemoved": "Logo d’événement retiré pour {{eventName}}", + "eventLogoUploaded": "Logo de l'événement téléversé pour {{eventName}}", + "eventLogoRemoved": "Logo de l'événement supprimé pour {{eventName}}", "bulkDeleteCompleted": "Suppression en masse terminée : {{count}} événements supprimés", "photoReplaced": "Photo remplacée dans {{eventName}}", "photoUploaded": "Photo téléversée dans {{eventName}}", - "categoryHeroUpdated": "Photo principale de la catégorie mise à jour", - "publicSiteResetToDefault": "Site public réinitialisé par défaut", - "cmsPageLogoUploaded": "Logo de page CMS téléversé : {{slug}}", - "adminPasswordResetByAdmin": "Mot de passe admin réinitialisé par un autre admin : {{username}}" + "categoryHeroUpdated": "Photo de couverture de catégorie mise à jour", + "publicSiteResetToDefault": "Site public réinitialisé aux valeurs par défaut", + "cmsPageLogoUploaded": "Logo de la page CMS téléversé : {{slug}}", + "adminPasswordResetByAdmin": "Réinitialisation du mot de passe admin par un autre admin : {{username}}" }, "notificationToasts": { - "markedAllRead": "Toutes les notifications sont lues", - "clearedAll_many": "{{count}} notifications effacées", + "markedAllRead": "Toutes les notifications marquées comme lues", "clearedAll_one": "{{count}} notification effacée", "clearedAll_other": "{{count}} notifications effacées" }, - "changePassword": "Changer le mot de passe", - "darkMode": "Passer au mode sombre", - "lightMode": "Passer au mode clair", + "changePassword": "Modifier le mot de passe", + "darkMode": "Passer en mode sombre", + "lightMode": "Passer en mode clair", "loadingDashboard": "Chargement du tableau de bord...", "activeEvents": "Événements actifs", - "expiringSoon": "Expire bientôt", + "expiringSoon": "Expirant bientôt", "next7Days": "7 prochains jours", "totalViews": "Vues totales", "downloads": "Téléchargements", - "percentFromLastWeek": "{{percent}}% depuis la semaine dernière", - "dashboardSubtitle": "Bon retour ! Voici l'état de vos galeries.", + "percentFromLastWeek": "{{percent}}% par rapport à la semaine dernière", + "dashboardSubtitle": "Bienvenue ! Voici ce qui se passe avec vos galeries.", "eventsExpiringSoon": "Événements expirant bientôt", "noEventsExpiring": "Aucun événement n'expire dans les 7 prochains jours", "noRecentActivity": "Aucune activité récente", + "photos": { + "hidden": "Masquées", + "hideSelected": "Masquer", + "showSelected": "Afficher", + "hiddenSuccess": "Photos masquées des invités", + "visibleSuccess": "Photos maintenant visibles pour les invités", + "processingStatus": "Traitement en cours…", + "processingFailed": "Échec du traitement", + "retryQueued": "Nouvelle tentative en file d'attente" + }, "events": { "tabs": { "guests": "Invités" } }, - "daysLeft_many": "{{count}} jours restants", "daysLeft_one": "{{count}} jour restant", "daysLeft_other": "{{count}} jours restants", - "viewAllExpiringEvents_many": "Voir tous les {{count}} événements expirant", - "viewAllExpiringEvents_one": "Voir le {{count}} événement expirant", - "viewAllExpiringEvents_other": "Voir tous les {{count}} événements expirant", + "viewAllExpiringEvents_one": "Voir tous les {{count}} événements expirants", + "viewAllExpiringEvents_other": "Voir tous les {{count}} événements expirants", "guests": { - "loading": "Chargement…", + "loading": "Chargement...", "aggregate": { "empty": "Aucune sélection d'invité pour l'instant.", - "description": "Photos triées par le nombre d'invités distincts qui les ont aimées ou marquées en favori." + "description": "Photos triées par le nombre d'invités distincts qui les ont aimées ou marquées comme favoris." }, "inviteCreated": "Invitation créée", "inviteCreateError": "Échec de la création de l'invitation", "inviteRevoked": "Invitation révoquée", "inviteRevokeError": "Échec de la révocation de l'invitation", - "invitesTitle": "Invitations des invités", + "invitesTitle": "Invitations d'invités", "createInvite": "Créer une invitation", "inviteName": "Nom de l'invité", - "inviteEmail": "E-mail (facultatif)", + "inviteEmail": "E-mail (optionnel)", "generateInvite": "Générer un lien d'invitation", "existingInvites": "Invitations existantes", "noInvites": "Aucune invitation pour l'instant", @@ -1584,25 +1661,23 @@ "mergedToast": "Invités fusionnés", "mergedError": "Échec de la fusion des invités", "forgetGuestConfirm": "Supprimer cet invité ? Ses sélections seront anonymisées mais conservées dans les totaux agrégés.", - "exportError": "Échec de l'export", + "exportError": "Échec de l'exportation", "mergeSelectAtLeastTwo": "Sélectionnez au moins 2 invités à fusionner", - "mergeConfirm_many": "Fusionner {{count}} invités avec {{name}} ? Cette action est irréversible.", - "mergeConfirm_one": "Fusionner {{count}} invité avec {{name}} ? Cette action est irréversible.", - "mergeConfirm_other": "Fusionner {{count}} invités avec {{name}} ? Cette action est irréversible.", + "mergeConfirm_one": "Fusionner {{count}} invité dans {{name}} ? Cette action est irréversible.", + "mergeConfirm_other": "Fusionner {{count}} invités dans {{name}} ? Cette action est irréversible.", "backToList": "Retour à la liste", "title": "Invités", - "mergeSelected_many": "{{count}} sélectionnés", "mergeSelected_one": "{{count}} sélectionné", "mergeSelected_other": "{{count}} sélectionnés", "mergeNow": "Fusionner la sélection", "aggregateView": "Par popularité", - "mergeMode": "Fusionner", + "mergeMode": "Fusion", "exportAll": "Tout exporter", - "empty": "Aucun invité inscrit pour l'instant.", + "empty": "Aucun invité ne s'est encore enregistré.", "columns": { "name": "Nom", "email": "E-mail", - "likes": "J'aime", + "likes": "Aimes", "favorites": "Favoris", "comments": "Commentaires", "ratings": "Notes", @@ -1611,15 +1686,15 @@ "view": "Voir les détails", "export": "Exporter", "forgetGuest": "Supprimer l'invité", - "loadingDetail": "Chargement des sélections…", + "loadingDetail": "Chargement des sélections...", "detail": { "noComments": "Aucun commentaire", "empty": "Aucune sélection dans cette catégorie", - "all": "Tout", - "liked": "Aimé", - "favorited": "Favori", - "rated": "Noté", - "commented": "Commenté" + "all": "Tous", + "liked": "Aimés", + "favorited": "Favoris", + "rated": "Notés", + "commented": "Commentés" }, "inviteStatus": { "pending": "En attente", @@ -1627,171 +1702,161 @@ "revoked": "Révoqué" } }, - "photos": { - "hiddenSuccess": "Photos masquées aux invités", - "hideSelected": "Masquer", - "visibleSuccess": "Photos visibles aux invités", - "showSelected": "Afficher", - "hidden": "Masqué", - "processingStatus": "En cours…", - "processingFailed": "Échoué", - "retryQueued": "Nouvelle tentative en file d'attente" - }, "analytics": "Analytique", "activities": { "event_created": "Nouvel événement créé : {{eventName}}", - "photos_uploaded": "{{count}} photos téléversées vers {{eventName}}", + "photos_uploaded": "{{count}} photos téléversées dans {{eventName}}", "event_archived": "Événement archivé : {{eventName}}", "archive_restored": "Archive restaurée : {{eventName}}", "archive_deleted": "Archive supprimée : {{eventName}}", "archive_downloaded": "Archive téléchargée : {{eventName}}", "email_config_updated": "Configuration e-mail mise à jour", "email_template_updated": "Modèle e-mail mis à jour : {{template}}", - "branding_updated": "Paramètres d'identité visuelle mis à jour", + "branding_updated": "Paramètres de marque mis à jour", "theme_updated": "Paramètres de thème mis à jour", "bulk_download": "{{count}} photos téléchargées depuis {{eventName}}", - "gallery_password_entry": "Mot de passe saisi pour {{eventName}}", + "gallery_password_entry": "Mot de passe entré pour {{eventName}}", "expiration_warning_viewed": "Avertissement d'expiration consulté pour {{eventName}}", - "event_updated": "Événement mis à jour : {{eventName}}", - "event_deleted": "Événement supprimé : {{eventName}}", + "feedback_settings_updated": "Paramètres de commentaires mis à jour", + "feedback_moderated": "Commentaire modéré", + "feedback_deleted": "Commentaire supprimé", + "photo_like": "Photo aimée dans {{eventName}}", + "photo_favorite": "Photo marquée comme favori dans {{eventName}}", + "photo_rating": "Photo notée dans {{eventName}}", + "photo_comment": "Commentaire ajouté sur une photo dans {{eventName}}", + "guest_feedback_like": "Un invité a aimé une photo dans {{eventName}}", + "guest_feedback_favorite": "Un invité a marqué une photo comme favori dans {{eventName}}", + "guest_feedback_rating": "Un invité a noté une photo dans {{eventName}}", + "guest_feedback_comment": "Un invité a commenté une photo dans {{eventName}}", + "word_filter_added": "Filtre de mot ajouté", + "external_import_completed": "Importation de médias externes terminée ({{imported}} importés, {{skipped}} ignorés)", + "bulk_archive_completed": "Archivage en masse terminé", "event_activated": "Événement activé : {{eventName}}", "event_deactivated": "Événement désactivé : {{eventName}}", - "bulk_archive_completed": "Archivage en masse terminé", "photo_deleted": "Photo supprimée de {{eventName}}", "photos_bulk_deleted": "{{count}} photos supprimées de {{eventName}}", - "password_changed": "Mot de passe modifié", - "admin_logout": "Admin {{actorName}} déconnecté", + "settings_updated": "Paramètres mis à jour", + "event_updated": "Événement mis à jour : {{eventName}}", + "event_renamed": "Événement renommé : {{eventName}}", + "event_deleted": "Événement supprimé : {{eventName}}", + "password_changed": "Mot de passe changé", + "email_resent": "E-mail de création renvoyé pour : {{eventName}}", "category_created": "Catégorie créée : {{categoryName}}", "category_updated": "Catégorie mise à jour : {{categoryName}}", "category_deleted": "Catégorie supprimée : {{categoryName}}", - "feedback_settings_updated": "Paramètres d'avis mis à jour", - "feedback_moderated": "Avis modéré", - "feedback_deleted": "Avis supprimé", - "word_filter_added": "Filtre de mots ajouté", - "cms_page_updated": "Page CMS mise à jour : {{page}}", - "email_resent": "E-mail de création renvoyé pour : {{eventName}}", - "settings_updated": "Paramètres mis à jour", - "favicon_uploaded": "Favicon téléversé", - "password_reset": "Mot de passe réinitialisé pour : {{eventName}}", - "external_import_completed": "Importation de médias externes terminée ({{imported}} importés, {{skipped}} ignorés)", - "photo_like": "Photo aimée dans {{eventName}}", - "photo_favorite": "Photo ajoutée aux favoris dans {{eventName}}", "general_settings_updated": "Paramètres généraux mis à jour", + "favicon_uploaded": "Favicon téléversée", "analytics_settings_updated": "Paramètres d'analytique mis à jour", + "cms_page_updated": "Page CMS mise à jour : {{page}}", "security_settings_updated": "Paramètres de sécurité mis à jour", - "event_renamed": "Événement renommé : {{eventName}}", - "photo_rating": "Photo notée dans {{eventName}}", - "photo_comment": "Photo commentée dans {{eventName}}", - "guest_feedback_like": "Un invité a aimé une photo dans {{eventName}}", - "guest_feedback_favorite": "Un invité a mis en favori une photo dans {{eventName}}", - "guest_feedback_rating": "Un invité a noté une photo dans {{eventName}}", - "guest_feedback_comment": "Un invité a commenté une photo dans {{eventName}}", + "password_reset": "Réinitialisation du mot de passe pour : {{eventName}}", + "admin_logout": "L'administrateur {{actorName}} s'est déconnecté", "system_activity": "Activité système : {{type}}", "unknown": "Activité inconnue", "feature_enabled": "{{label}} activé", "feature_disabled": "{{label}} désactivé", "feature_flags_summary": "{{count}} fonctionnalités mises à jour : {{summary}}", - "feature_flags_noop": "Indicateurs revus (aucun changement)", + "feature_flags_noop": "Drapeaux de fonctionnalités revus (aucun changement)", "customer_login": "Client connecté : {{email}}", "customer_invitation_created": "Invitation client envoyée à {{email}}", - "customer_invitation_accepted": "Client a accepté l’invitation : {{email}}", + "customer_invitation_accepted": "Invitation acceptée par le client : {{email}}", "customer_invitation_cancelled": "Invitation client annulée : {{email}}", - "customer_password_reset_requested": "Réinitialisation du mot de passe demandée pour {{email}}", - "customer_password_reset_applied": "Mot de passe client réinitialisé par admin : {{email}}", - "customer_password_change": "Client a changé son mot de passe : {{email}}", - "customer_self_profile_update": "Client a mis à jour son profil : {{email}}", + "customer_password_reset_requested": "Réinitialisation du mot de passe demandée pour le client {{email}}", + "customer_password_reset_applied": "Réinitialisation du mot de passe client par l'admin : {{email}}", + "customer_password_change": "Le client a changé son mot de passe : {{email}}", + "customer_self_profile_update": "Le client a mis à jour son profil : {{email}}", "customer_event_access": "{{email}} a ouvert {{eventName}}", "customer_updated": "Compte client mis à jour : {{email}}", "customer_deactivated": "Compte client désactivé : {{email}}", "customer_reactivated": "Compte client réactivé : {{email}}", "customer_erased": "Compte client effacé (RGPD) : {{email}}", "admin_invitation_created": "Invitation admin envoyée à {{email}}", - "admin_invitation_accepted": "Admin a accepté l’invitation : {{email}}", + "admin_invitation_accepted": "Invitation acceptée par l'admin : {{email}}", "admin_invitation_cancelled": "Invitation admin annulée : {{email}}", "admin_user_updated": "Utilisateur admin mis à jour : {{username}}", "admin_user_deactivated": "Utilisateur admin désactivé : {{username}}", - "admin_password_reset": "Mot de passe admin réinitialisé par un autre admin : {{username}}", - "admin_profile_updated": "Admin {{actorName}} a mis à jour son profil", + "admin_password_reset": "Réinitialisation du mot de passe admin par un autre admin : {{username}}", + "admin_profile_updated": "L'administrateur {{actorName}} a mis à jour son profil", "webhook_created": "Webhook créé : {{name}}", "webhook_updated": "Webhook mis à jour : {{name}}", "webhook_deleted": "Webhook supprimé : {{name}}", "api_token_created": "Jeton API créé : {{name}}", "api_token_revoked": "Jeton API révoqué : {{name}}", - "event_type_created": "Type d’événement créé : {{name}}", - "event_type_updated": "Type d’événement mis à jour : {{name}}", - "event_type_deleted": "Type d’événement supprimé : {{name}}", - "event_types_reordered": "Types d’événements réorganisés", + "event_type_created": "Type d'événement créé : {{name}}", + "event_type_updated": "Type d'événement mis à jour : {{name}}", + "event_type_deleted": "Type d'événement supprimé : {{name}}", + "event_types_reordered": "Types d'événements réorganisés", "event_published": "Événement publié : {{eventName}}", - "event_logo_uploaded": "Logo d’événement téléversé pour {{eventName}}", - "event_logo_removed": "Logo d’événement retiré pour {{eventName}}", + "event_logo_uploaded": "Logo de l'événement téléversé pour {{eventName}}", + "event_logo_removed": "Logo de l'événement supprimé pour {{eventName}}", "bulk_delete_completed": "Suppression en masse terminée : {{count}} événements supprimés", "photo_replaced": "Photo remplacée dans {{eventName}}", "photo_uploaded": "Photo téléversée dans {{eventName}}", - "category_hero_updated": "Photo principale de la catégorie mise à jour", - "public_site_reset_to_default": "Site public réinitialisé par défaut", - "cms_page_logo_uploaded": "Logo de page CMS téléversé : {{slug}}" + "category_hero_updated": "Photo de couverture de catégorie mise à jour", + "public_site_reset_to_default": "Site public réinitialisé aux valeurs par défaut", + "cms_page_logo_uploaded": "Logo de la page CMS téléversé : {{slug}}" } }, "acceptInvitation": { "title": "Accepter l'invitation", - "subtitle": "Créez votre compte administrateur", + "subtitle": "Créer votre compte administrateur", "validating": "Validation de l'invitation...", "invalidToken": "Invitation invalide", - "invalidTokenMessage": "Ce lien est invalide ou a expiré. Contactez l'administrateur.", - "alreadyUsedMessage": "Cette invitation a déjà servi à créer un compte.", + "invalidTokenMessage": "Ce lien d'invitation est invalide ou a expiré. Veuillez contacter votre administrateur pour obtenir une nouvelle invitation.", + "alreadyUsedMessage": "Cette invitation a déjà été utilisée pour créer un compte.", "invitedAs": "Vous avez été invité en tant que", "expiresAt": "L'invitation expire", "usernameLabel": "Nom d'utilisateur", "usernamePlaceholder": "Choisissez un nom d'utilisateur", - "usernameHelp": "3-50 car., lettres, chiffres, underscores et tirets uniquement", + "usernameHelp": "3 à 50 caractères, lettres, chiffres, traits de soulignement et tirets uniquement", "passwordLabel": "Mot de passe", - "passwordPlaceholder": "Créez un mot de passe robuste", + "passwordPlaceholder": "Créez un mot de passe fort", "confirmPasswordLabel": "Confirmer le mot de passe", - "confirmPasswordPlaceholder": "Confirmez le mot de passe", + "confirmPasswordPlaceholder": "Confirmez votre mot de passe", "passwordStrength": "Force du mot de passe", "requirements": { - "title": "Exigences :", + "title": "Exigences du mot de passe :", "minLength": "Au moins 12 caractères", - "uppercase": "Au moins une majuscule", - "lowercase": "Au moins une minuscule", + "uppercase": "Au moins une lettre majuscule", + "lowercase": "Au moins une lettre minuscule", "number": "Au moins un chiffre", "special": "Au moins un caractère spécial" }, "strength": { "weak": "Faible", - "fair": "Passable", + "fair": "Moyen", "good": "Bon", - "strong": "Robuste" + "strong": "Fort" }, "createAccount": "Créer le compte", "success": "Compte créé !", - "successMessage": "Compte créé avec succès. Vous pouvez maintenant vous connecter.", + "successMessage": "Votre compte a été créé avec succès. Vous pouvez maintenant vous connecter avec vos identifiants.", "redirecting": "Redirection vers la connexion dans {{seconds}}...", "goToLogin": "Aller à la connexion", - "contactAdminMessage": "Veuillez contacter l'administrateur pour une nouvelle invitation.", + "contactAdminMessage": "Veuillez contacter votre administrateur pour demander une nouvelle invitation.", "passwordsMatch": "Les mots de passe correspondent", - "alreadyHaveAccount": "Déjà un compte ?", + "alreadyHaveAccount": "Vous avez déjà un compte ?", "signIn": "Se connecter", "errors": { - "usernameRequired": "Nom d'utilisateur requis", - "usernameTooShort": "Minimum 3 caractères", - "usernameTooLong": "Maximum 50 caractères", - "usernameInvalid": "Caractères invalides", - "passwordRequired": "Mot de passe requis", + "usernameRequired": "Le nom d'utilisateur est requis", + "usernameTooShort": "Le nom d'utilisateur doit comporter au moins 3 caractères", + "usernameTooLong": "Le nom d'utilisateur doit comporter au maximum 50 caractères", + "usernameInvalid": "Le nom d'utilisateur ne peut contenir que des lettres, chiffres, traits de soulignement et tirets", + "passwordRequired": "Le mot de passe est requis", "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", - "confirmPasswordRequired": "Veuillez confirmer le mot de passe", - "genericError": "Échec de la création. Réessayez." + "confirmPasswordRequired": "Veuillez confirmer votre mot de passe", + "genericError": "Échec de la création du compte. Veuillez réessayer." } }, "errors": { - "galleryNotFound": "Galerie non trouvée", + "galleryNotFound": "Galerie introuvable", "galleryNotFoundMessage": "Cette galerie n'existe pas ou a été supprimée.", - "somethingWentWrong": "Un problème est survenu", + "somethingWentWrong": "Quelque chose s'est mal passé", "tryAgainLater": "Veuillez réessayer plus tard", "refreshPage": "Actualiser la page", - "oopsSomethingWentWrong": "Oups ! Un problème est survenu", - "unexpectedError": "Erreur inattendue. Vos données sont en sécurité.", - "goToHomepage": "Retour à l'accueil", + "oopsSomethingWentWrong": "Oups ! Quelque chose s'est mal passé", + "unexpectedError": "Nous avons rencontré une erreur inattendue. Ne vous inquiétez pas, vos données sont en sécurité.", + "goToHomepage": "Aller à la page d'accueil", "errorDetails": "Détails de l'erreur", "requiredFields": "Veuillez remplir tous les champs requis", "enterTestEmail": "Veuillez entrer une adresse e-mail de test", @@ -1800,102 +1865,82 @@ "copyFailed": "Échec de la copie du lien" }, "validation": { - "eventNameRequired": "Nom de l'événement requis", - "hostEmailRequired": "E-mail client requis", - "hostNameRequired": "Nom client requis", - "adminEmailRequired": "E-mail admin requis", + "eventNameRequired": "Le nom de l'événement est requis", + "hostEmailRequired": "L'e-mail du client est requis", + "hostNameRequired": "Le nom du client est requis", + "adminEmailRequired": "L'e-mail de l'administrateur est requis", "invalidEmailFormat": "Format d'e-mail invalide", - "passwordRequired": "Mot de passe requis", - "passwordMinLength": "Le mot de passe doit faire au moins 6 caractères", + "passwordRequired": "Le mot de passe est requis", + "passwordMinLength": "Le mot de passe doit comporter au moins 6 caractères", "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", - "expirationRange": "L'expiration doit être entre 1 et 365 jours", - "required": "Ce champ est obligatoire", - "expirationRequired": "La date d'expiration est obligatoire.", - "eventDateRequired": "La date de l'événement est obligatoire", - "passwordTooSimple": "Le mot de passe ne peut pas être composé uniquement de chiffres. Pensez à un format comme « 04.07.2025 »" + "expirationRange": "L'expiration doit être comprise entre 1 et 365 jours", + "required": "Ce champ est requis", + "expirationRequired": "La date d'expiration est requise.", + "eventDateRequired": "La date de l'événement est requise.", + "passwordTooSimple": "Le mot de passe ne peut pas être uniquement des chiffres. Envisagez d'utiliser un format de date comme \"04.07.2025\"" }, "legal": { - "impressum": "Mentions Légales", - "datenschutz": "Politique de Confidentialité" + "impressum": "Mentions légales", + "datenschutz": "Politique de confidentialité" }, "toast": { - "saveSuccess": "Modifications enregistrées", - "saveError": "Échec de l'enregistrement", + "saveSuccess": "Modifications enregistrées avec succès", + "saveError": "Échec de l'enregistrement des modifications", "deleteSuccess": "Suppression réussie", "deleteError": "Échec de la suppression", - "uploadSuccess": "Téléversement réussi", + "uploadSuccess": "Téléversement terminé avec succès", "uploadError": "Échec du téléversement", - "linkCopied": "Lien copié dans le presse-papier", - "eventCreated": "Événement créé", - "eventUpdated": "Événement mis à jour", - "eventArchived": "Événement archivé", - "settingsSaved": "Paramètres enregistrés", - "themeUpdated": "Thème mis à jour", - "brandingUpdated": "Identité visuelle mise à jour", - "categoryUpdated": "Catégorie mise à jour", - "emailConfigSaved": "Configuration e-mail enregistrée", - "brandingThemeMissing": "Aucun thème de charte graphique n'a encore été enregistré.", - "brandingPaletteSynced": "Palette synchronisée depuis la charte graphique." + "linkCopied": "Lien copié dans le presse-papiers", + "eventCreated": "Événement créé avec succès", + "eventUpdated": "Événement mis à jour avec succès", + "eventArchived": "Événement archivé avec succès", + "settingsSaved": "Paramètres enregistrés avec succès", + "themeUpdated": "Thème mis à jour avec succès", + "brandingUpdated": "Marque mise à jour avec succès", + "categoryUpdated": "Catégorie mise à jour avec succès", + "emailConfigSaved": "Configuration e-mail enregistrée avec succès", + "brandingThemeMissing": "Aucun thème de marque n'a encore été enregistré.", + "brandingPaletteSynced": "Palette synchronisée depuis la marque." }, "email": { - "title": "Configuration E-mail", - "subtitle": "Paramétrer les e-mails de notification", - "loadingSettings": "Chargement...", + "title": "Configuration e-mail", + "subtitle": "Configurer les paramètres e-mail pour les notifications", + "loadingSettings": "Chargement des paramètres e-mail...", "smtpConfiguration": "Configuration SMTP", "smtpHost": "Hôte SMTP", "fromEmail": "E-mail expéditeur", "fromName": "Nom expéditeur", - "emailTemplates": "Modèles d'e-mails", + "emailTemplates": "Modèles d'e-mail", "smtpSettings": "Paramètres SMTP", - "testEmailSuccess": "E-mail test envoyé", - "saveSmtpSettings": "Enregistrer SMTP", + "testEmailSuccess": "E-mail de test envoyé avec succès", + "saveSmtpSettings": "Enregistrer les paramètres SMTP", "testEmailSection": "E-mail de test", "beforeTesting": "Avant de tester :", - "saveSmtpFirst": "Enregistrez d'abord vos paramètres", - "ensureFirewall": "Vérifiez que votre pare-feu autorise le SMTP sortant", - "gmailAppPassword": "Pour Gmail, utilisez un mot de passe d'application", + "saveSmtpFirst": "Enregistrez d'abord vos paramètres SMTP", + "ensureFirewall": "Assurez-vous que votre pare-feu autorise le SMTP sortant", + "gmailAppPassword": "Pour Gmail, utilisez un mot de passe spécifique à l'application", "testEmailAddressLabel": "Adresse e-mail de test", - "sendTestEmailButton": "Envoyer e-mail test", + "sendTestEmailButton": "Envoyer un e-mail de test", "commonSmtpSettings": "Paramètres SMTP courants :", "editTemplate": "Modifier le modèle", "templateName": "Nom du modèle", - "subjectLine": "Objet de l'e-mail", + "subjectLine": "Ligne d'objet", "emailBody": "Corps de l'e-mail", "preview": "Aperçu", + "save": "Enregistrer", "templates": "Modèles", "port": "Port", "security": "Sécurité", - "username": "Utilisateur", + "username": "Nom d'utilisateur", "password": "Mot de passe", - "enterPassword": "Saisir le mot de passe", + "enterPassword": "Entrer le mot de passe", "ignoreSslErrors": "Ignorer les erreurs de certificat SSL/TLS", - "ignoreSslWarning": "Attention : Désactiver la vérification rend la connexion vulnérable aux attaques man-in-the-middle. N'activez ceci que si vous avez confiance en votre serveur SMTP.", - "syncedFromBranding": "Couleurs d'e-mail synchronisées depuis la charte graphique. Cliquez sur Enregistrer pour appliquer.", - "copiedFromLanguage": "Contenu copié depuis {{language}}", - "brandingTitle": "Charte graphique des e-mails", - "syncFromBranding": "Synchroniser depuis la charte graphique", - "brandingDescription": "Personnalisez les couleurs utilisées dans les modèles d'e-mails. Les modifications s'appliquent à la barre d'en-tête, aux boutons, aux liens et à l'arrière-plan du pied de page.", + "ignoreSslWarning": "Attention : Désactiver la vérification du certificat rend la connexion vulnérable aux attaques de type \"man-in-the-middle\". Activez cette option uniquement si vous faites confiance au serveur SMTP et comprenez les implications de sécurité.", + "brandingTitle": "Marque de l'e-mail", + "brandingDescription": "Personnalisez les couleurs utilisées dans les modèles d'e-mail. Les modifications s'appliquent à la barre d'en-tête, aux boutons, aux liens et à l'arrière-plan du pied de page.", "primaryColor": "Couleur principale", - "primaryColorHelp": "Barre d'en-tête, titres H2, fond des boutons, couleur des liens. Correspond à Charte graphique → Accent (rempli).", - "secondaryColor": "Arrière-plan du pied de page", - "secondaryColorHelp": "Arrière-plan de la barre de pied de page. Correspond à Charte graphique → Surface.", - "bodyBgColor": "Arrière-plan de la page", - "bodyBgColorHelp": "L'enveloppe autour de la carte e-mail — ce que le destinataire voit derrière l'e-mail. Correspond à Charte graphique → Arrière-plan.", - "containerBgColor": "Carte e-mail", - "containerBgColorHelp": "La carte blanche qui contient le contenu de l'e-mail. Correspond à Charte graphique → Surface.", - "listBgColor": "Panneau d'information", - "listBgColorHelp": "Arrière-plan des panneaux d'information à puces dans le corps de l'e-mail. Correspond à Charte graphique → Élevé.", - "bodyTextColor": "Texte du corps", - "bodyTextColorHelp": "Couleur des paragraphes et du texte en gras. Correspond à Charte graphique → Texte principal.", - "mutedTextColor": "Texte du pied de page", - "mutedTextColorHelp": "Texte du pied de page et ligne de copyright. Correspond à Charte graphique → Texte secondaire.", - "buttonTextColor": "Texte des boutons", - "buttonTextColorHelp": "Couleur du texte sur les boutons remplis. Doit bien contraster avec la couleur principale. Généralement blanc.", - "saveEmailColors": "Enregistrer les couleurs", - "save": "Enregistrer", - "noTranslation": "Pas encore de traduction", - "noTranslationYet": "Aucune traduction n'existe encore pour cette langue. Copiez depuis une langue existante pour commencer :", - "copyFrom": "Copier depuis", + "secondaryColor": "Couleur de l'arrière-plan du pied de page", + "saveEmailColors": "Enregistrer les couleurs de l'e-mail", "editor": { "bold": "Gras", "italic": "Italique", @@ -1911,75 +1956,95 @@ "undo": "Annuler", "redo": "Rétablir", "insertVariable": "Insérer une variable", - "visualMode": "Mode visuel", - "sourceMode": "Mode source", - "enterUrl": "Saisir une URL…", + "sourceMode": "Source", + "visualMode": "Visuel", + "enterUrl": "Entrer l'URL...", "addLink": "Ajouter", "cancel": "Annuler" }, + "copiedFromLanguage": "Contenu copié depuis {{language}}", + "noTranslation": "Aucune traduction pour l'instant", + "noTranslationYet": "Aucune traduction n'existe pour cette langue pour l'instant. Copiez depuis une langue existante pour commencer :", + "copyFrom": "Copier depuis", + "syncedFromBranding": "Couleurs de l'e-mail synchronisées depuis la marque. Cliquez sur Enregistrer pour appliquer.", + "syncFromBranding": "Synchroniser depuis la marque", + "primaryColorHelp": "Barre d'en-tête, titres H2, arrière-plan des boutons, couleur des liens. Correspond à Marque → Accentuation (rempli).", + "secondaryColorHelp": "Couleur de fond de la barre de pied de page. Correspond à Marque → Surface.", + "bodyBgColor": "Couleur de fond de page", + "bodyBgColorHelp": "L'enveloppe autour de la carte e-mail — ce que le destinataire voit derrière l'e-mail lui-même. Correspond à Marque → Arrière-plan.", + "containerBgColor": "Carte e-mail", + "containerBgColorHelp": "La carte blanche qui contient le contenu de l'e-mail. Correspond à Marque → Surface.", + "listBgColor": "Panneau d'information", + "listBgColorHelp": "Couleur de fond des panneaux d'information à puces dans le corps de l'e-mail. Correspond à Marque → Élevé.", + "bodyTextColor": "Texte du corps", + "bodyTextColorHelp": "Couleur du texte des paragraphes et en gras. Correspond à Marque → Texte principal.", + "mutedTextColor": "Texte du pied de page", + "mutedTextColorHelp": "Texte du pied de page et ligne de copyright. Correspond à Marque → Texte secondaire.", + "buttonTextColor": "Texte des boutons", + "buttonTextColorHelp": "Couleur du texte sur les boutons remplis. Doit contraster clairement avec la couleur principale. Pas d'équivalent dans Marque — généralement blanc.", "categories": { - "core": "Principal", + "core": "Noyau", "customers": "Clients", "calendar": "Calendrier", "quotes": "Devis", "billing": "Facturation" }, - "featureOff": "Fonction désactivée", - "featureOffTooltip": "La fonctionnalité à laquelle appartient ce modèle est actuellement désactivée. Vous pouvez toujours modifier le modèle — il sera utilisé une fois la fonctionnalité réactivée.", + "featureOff": "Fonctionnalité désactivée", + "featureOffTooltip": "La fonctionnalité à laquelle ce modèle appartient est actuellement désactivée. Vous pouvez toujours modifier le modèle — il sera utilisé une fois la fonctionnalité réactivée.", "subcategories": { "gallery": "Galeries", "admin": "Comptes administrateurs", "backup": "Sauvegarde & restauration", "system": "Mises à jour système", - "other": "Autres" + "other": "Autre" } }, "cms": { "title": "Pages CMS", - "subtitle": "Gérer les pages légales et d'information", - "loadingPages": "Chargement...", + "subtitle": "Gérer les pages légales et informatives", + "loadingPages": "Chargement des pages...", "pages": "Pages", "previewLinks": "Liens d'aperçu", - "englishVersion": "Version Anglaise", - "germanVersion": "Version Allemande", + "englishVersion": "Version anglaise", + "germanVersion": "Version allemande", "editPage": "Modifier {{page}}", "pageTitle": "Titre de la page", "pageContent": "Contenu de la page", - "pageTitlePlaceholder": "Titre...", + "pageTitlePlaceholder": "Entrer le titre de la page...", "lastUpdated": "Dernière mise à jour :", - "pageUpdated": "Page mise à jour", - "externalUrlInvalid": "Doit être une URL https:// valide", - "logoUploaded": "Logo téléversé", - "logoCleared": "Logo supprimé", + "pageUpdated": "Page mise à jour avec succès", "useExternalUrl": "Utiliser une URL externe", - "useExternalUrlHelp": "Redirige les visiteurs vers une page externe au lieu d'afficher le contenu interne. Le titre et le contenu internes sont conservés en secours.", + "useExternalUrlHelp": "Rediriger les visiteurs vers une page externe au lieu d'afficher le contenu interne. Le titre et le contenu interne restent enregistrés comme solution de secours.", "externalUrl": "URL externe", - "externalUrlPlaceholder": "https://example.com/mentions-legales", + "externalUrlPlaceholder": "https://exemple.com/mentions-legales", + "externalUrlInvalid": "Doit être une URL https:// valide", "externalUrlActive": "L'URL externe est active — le contenu interne est préservé mais non affiché aux visiteurs.", + "logoUploaded": "Logo téléversé", + "logoCleared": "Logo effacé", "pageLogo": "Logo de la page", - "pageLogoHelp": "Facultatif. Si défini, remplace le logo de la charte graphique globale sur cette page.", + "pageLogoHelp": "Optionnel. S'il est défini, utilisé à la place du logo de marque global sur cette page.", "noLogo": "pas de remplacement", "replaceLogo": "Remplacer le logo", - "uploadLogo": "Téléverser un logo", - "clearLogo": "Utiliser le logo du site" + "uploadLogo": "Téléverser le logo", + "clearLogo": "Utiliser le logo par défaut du site" }, "eventTypes": { "title": "Types d'événements", "subtitle": "Personnaliser les types d'événements et leurs thèmes par défaut", - "loading": "Chargement...", - "loadError": "Échec du chargement", - "createNew": "Nouveau type", - "edit": "Modifier le type", - "created": "Type créé", - "updated": "Type mis à jour", - "deleted": "Type supprimé", - "createError": "Échec de la création", - "updateError": "Échec de la mise à jour", - "deleteError": "Échec de la suppression", - "searchPlaceholder": "Rechercher...", - "showInactive": "Afficher inactifs", - "noResults": "Aucun résultat", - "empty": "Aucun type d'événement", + "loading": "Chargement des types d'événements...", + "loadError": "Échec du chargement des types d'événements", + "createNew": "Nouveau type d'événement", + "edit": "Modifier le type d'événement", + "created": "Type d'événement créé avec succès", + "updated": "Type d'événement mis à jour avec succès", + "deleted": "Type d'événement supprimé avec succès", + "createError": "Échec de la création du type d'événement", + "updateError": "Échec de la mise à jour du type d'événement", + "deleteError": "Échec de la suppression du type d'événement", + "searchPlaceholder": "Rechercher des types d'événements...", + "showInactive": "Afficher les inactifs", + "noResults": "Aucun type d'événement trouvé", + "empty": "Aucun type d'événement pour l'instant", "system": "Système", "table": { "type": "Type", @@ -1990,189 +2055,189 @@ }, "form": { "name": "Nom d'affichage", - "namePlaceholder": "ex: Shooting Famille", + "namePlaceholder": "ex. : Séance familiale", "slugPrefix": "Préfixe URL", - "slugPrefixPlaceholder": "ex: famille", - "slugPreview": "Exemple d'URL :", + "slugPrefixPlaceholder": "ex. : famille", + "slugPreview": "URL exemple :", "emoji": "Icône", "themePreset": "Thème par défaut", - "isActive": "Actif (visible à la création)" + "isActive": "Actif (visible lors de la création d'événements)" }, "validation": { - "slugFormat": "Lettres, chiffres et tirets uniquement" + "slugFormat": "Seulement des lettres, chiffres et tirets autorisés" }, "slugInfo": { - "title": "Infos préfixe URL :", - "description": "Le préfixe sert à générer les URLs de galerie. Exemple avec 'famille' : famille-dupond-2025-01-22" + "title": "Informations sur le préfixe URL :", + "description": "Le préfixe URL est utilisé pour générer les URL des galeries. Par exemple, un type d'événement avec le préfixe \"famille\" créera des URL comme : famille-dupont-famille-2025-01-22" }, "deleteConfirm": { - "title": "Supprimer le type", - "message": "Voulez-vous supprimer", - "warning": "Action irréversible. Vérifiez qu'aucun événement ne l'utilise." + "title": "Supprimer le type d'événement", + "message": "Êtes-vous sûr de vouloir supprimer", + "warning": "Cette action ne peut pas être annulée. Assurez-vous qu'aucun événement n'utilise ce type." } }, "backup": { "title": "Gestion des sauvegardes", - "subtitle": "Gérer les sauvegardes système et configurer les restaurations.", + "subtitle": "Gérer les sauvegardes du système, configurer les sauvegardes automatiques et restaurer à partir de sauvegardes précédentes.", "tabs": { "dashboard": "Tableau de bord", "configuration": "Configuration", - "history": "Historique", + "history": "Historique des sauvegardes", "restore": "Restaurer" }, "status": { "inProgress": "Sauvegarde en cours...", "lastBackup": "Dernière sauvegarde", - "noBackups": "Aucune sauvegarde", + "noBackups": "Aucune sauvegarde trouvée", "nextBackup": "Prochaine sauvegarde", "notScheduled": "Non planifiée", - "enabled": "Activée", - "disabled": "Désactivée" + "enabled": "Activé", + "disabled": "Désactivé" }, "actions": { - "runBackupNow": "Lancer maintenant", + "runBackupNow": "Exécuter la sauvegarde maintenant", "starting": "Démarrage...", "testConnection": "Tester la connexion", "delete": "Supprimer", - "view": "Détails", + "view": "Voir les détails", "download": "Télécharger" }, "dashboard": { "health": { - "title": "Santé Sauvegarde" + "title": "État des sauvegardes" }, "healthMessages": { "noBackups": "Aucune sauvegarde trouvée", - "lastBackupFailed": "Échec de la dernière sauvegarde", - "upToDate": "À jour", - "recent": "Récente", - "gettingOld": "Commence à dater", - "outdated": "Obsolète" + "lastBackupFailed": "La dernière sauvegarde a échoué", + "upToDate": "La sauvegarde est à jour", + "recent": "La sauvegarde est récente", + "gettingOld": "La sauvegarde commence à dater", + "outdated": "La sauvegarde est obsolète" }, "stats": { - "totalBackups": "Total sauvegardes", - "backupSize": "Taille sauvegarde", + "totalBackups": "Sauvegardes totales", + "backupSize": "Taille des sauvegardes", "lastDuration": "Dernière durée", - "backupStatus": "Statut", - "last": "Dernier", + "backupStatus": "Statut des sauvegardes", + "last": "Dernière", "files": "fichiers", - "active": "Actif", - "inactive": "Inactif", - "noBackupsYet": "Pas encore de sauvegardes" + "active": "Active", + "inactive": "Inactive", + "noBackupsYet": "Aucune sauvegarde pour l'instant" }, "recentActivity": { - "title": "Activité récente" + "title": "Activité récente des sauvegardes" }, "notConfigured": { - "title": "Non configuré", - "message": "Configurez les paramètres avant de lancer une sauvegarde." + "title": "Sauvegarde non configurée", + "message": "Veuillez configurer les paramètres de sauvegarde dans l'onglet Configuration avant d'exécuter des sauvegardes." }, "actions": { - "runBackupNow": "Sauvegarder maintenant", + "runBackupNow": "Exécuter la sauvegarde maintenant", "running": "En cours..." }, "coverage": { - "title": "Contenu sauvegardé", + "title": "Couverture des sauvegardes", "included": "Inclus", - "excluded": "Exclu" + "excluded": "Exclus" }, - "storageDestination": "Destination", + "storageDestination": "Destination de stockage", "backupType": "Sauvegarde {{type}}", - "noDestinationSet": "Pas de destination", + "noDestinationSet": "Aucune destination définie", "healthStatus": { - "warning": "Avertissement", "excellent": "Excellent", "good": "Bon", + "warning": "Avertissement", "critical": "Critique" } }, "configuration": { - "enableBackup": "Activer les sauvegardes auto", - "enableBackupHelp": "Sauvegardes automatiques selon le calendrier", - "destinationType": "Destination", + "enableBackup": "Activer les sauvegardes automatiques", + "enableBackupHelp": "Créer automatiquement des sauvegardes selon le planning configuré", + "destinationType": "Destination de sauvegarde", "destinationTypes": { "local": { "name": "Stockage local", - "description": "Sur le serveur de l'application" + "description": "Stocker les sauvegardes sur le système de fichiers local du serveur" }, "rsync": { "name": "Serveur distant (Rsync)", - "description": "Sync via SSH/Rsync" + "description": "Synchroniser les sauvegardes avec un serveur distant via SSH/Rsync" }, "s3": { - "name": "Stockage S3", - "description": "Amazon S3 ou compatible" + "name": "Stockage compatible S3", + "description": "Stocker les sauvegardes dans Amazon S3 ou un stockage objet compatible" } }, "fields": { "destinationPath": "Chemin de destination", - "destinationPathHelp": "Répertoire local", - "destinationPathPlaceholder": "/chemin/vers/sauvegarde", + "destinationPathHelp": "Chemin du répertoire local pour stocker les sauvegardes", + "destinationPathPlaceholder": "/chemin/vers/le/dossier/de/sauvegarde", "rsyncHost": "Hôte distant", "rsyncHostPlaceholder": "sauvegarde.exemple.com", "rsyncUser": "Utilisateur SSH", - "rsyncUserPlaceholder": "backup-user", + "rsyncUserPlaceholder": "utilisateur-sauvegarde", "rsyncPath": "Chemin distant", - "rsyncPathPlaceholder": "/home/backup/photos", + "rsyncPathPlaceholder": "/home/sauvegarde/partage-photos", "rsyncSshKey": "Clé privée SSH", - "rsyncSshKeyHelp": "Optionnel", + "rsyncSshKeyHelp": "Clé privée SSH pour l'authentification (optionnel)", "rsyncSshKeyPlaceholder": "-----BEGIN RSA PRIVATE KEY-----", "s3Endpoint": "Point de terminaison S3", - "s3EndpointHelp": "URL API S3", - "s3Bucket": "Nom du Bucket", - "s3AccessKey": "ID Clé d'accès", - "s3SecretKey": "Clé secrète S3", + "s3EndpointHelp": "Point de terminaison de l'API S3 (ex. : s3.amazonaws.com)", + "s3Bucket": "Nom du bucket", + "s3AccessKey": "Clé d'accès", + "s3SecretKey": "Clé secrète d'accès", "s3Region": "Région" }, "schedule": { - "title": "Calendrier", - "scheduleType": "Type de calendrier", + "title": "Planification des sauvegardes", + "scheduleType": "Type de planification", "options": { - "hourly": "Heure", - "daily": "Jour", - "weekly": "Semaine", - "custom": "Cron" + "hourly": "Toutes les heures", + "daily": "Quotidiennement", + "weekly": "Hebdomadairement", + "custom": "Expression cron personnalisée" }, - "customCron": "Expression Cron", - "customCronHelp": "Expression valide (ex: 0 3 * * *)", - "retention": "Politique de rétention", - "retentionDays": "Conserver pendant", - "retentionHelp": "jours (les plus vieux seront effacés)" + "customCron": "Expression cron", + "customCronHelp": "Entrez une expression cron valide (ex. : 0 3 * * *)", + "retention": "Période de rétention", + "retentionDays": "Conserver les sauvegardes pendant", + "retentionHelp": "jours (les sauvegardes plus anciennes seront automatiquement supprimées)" }, "whatToBackup": { - "title": "Éléments à sauvegarder", + "title": "Que sauvegarder", "database": "Base de données", - "databaseHelp": "Événements, réglages et comptes", + "databaseHelp": "Toutes les données d'événements, paramètres et configurations", "photos": "Photos", - "photosHelp": "Toutes les photos des galeries actives", + "photosHelp": "Toutes les photos téléversées dans les galeries actives", "archives": "Archives", - "archivesHelp": "Fichiers ZIP archivés", - "thumbnails": "Vignettes", - "thumbnailsHelp": "Aperçus (peuvent être régénérés)" + "archivesHelp": "Fichiers ZIP des événements archivés", + "thumbnails": "Miniatures", + "thumbnailsHelp": "Images miniatures générées (peuvent être recréées)" }, "advancedOptions": { "title": "Options avancées", "compression": "Activer la compression", - "compressionHelp": "Économise de l'espace", + "compressionHelp": "Compresser les fichiers de sauvegarde pour économiser de l'espace de stockage", "encryption": "Activer le chiffrement", - "encryptionHelp": "Sécurité supplémentaire", - "encryptionPassphrase": "Phrase secrète de chiffrement", - "encryptionPassphraseHelp": "Nécessaire pour restaurer" + "encryptionHelp": "Chiffrer les sauvegardes pour une sécurité supplémentaire", + "encryptionPassphrase": "Phrase de passe de chiffrement", + "encryptionPassphraseHelp": "Phrase de passe forte pour le chiffrement des sauvegardes" }, "messages": { - "requiredFields": "Champs requis manquants", - "connectionSuccess": "Connexion réussie !", - "connectionFailed": "La connexion a échoué" + "requiredFields": "Veuillez remplir tous les champs requis", + "connectionSuccess": "Test de connexion réussi !", + "connectionFailed": "Échec du test de connexion" }, - "testingConnection": "Test en cours...", + "testingConnection": "Test de connexion en cours...", "saveSettings": "Enregistrer la configuration", - "savingSettings": "Enregistrement..." + "savingSettings": "Enregistrement en cours..." }, "history": { - "searchPlaceholder": "Rechercher...", + "searchPlaceholder": "Rechercher des sauvegardes...", "columns": { "status": "Statut", - "dateTime": "Date et Heure", + "dateTime": "Date et heure", "type": "Type", "size": "Taille", "duration": "Durée", @@ -2182,146 +2247,146 @@ "backupDetails": "Détails de la sauvegarde", "destination": "Destination", "started": "Début", - "completed": "Fin", + "completed": "Terminé", "contentBackedUp": "Contenu sauvegardé", - "errorDetails": "Détails d'erreur", + "errorDetails": "Détails de l'erreur", "manifest": "Manifeste" }, "pagination": { - "showing": "Affichage {{from}}-{{to}} sur {{total}}", + "showing": "Affichage de {{from}}-{{to}} sur {{total}} sauvegardes", "previous": "Précédent", "next": "Suivant" } }, "restore": { "steps": { - "selectSource": "Source", - "chooseBackup": "Sauvegarde", - "restoreOptions": "Options", - "reviewConfirm": "Confirmation", - "progress": "Progression" + "selectSource": "Sélectionner la source", + "chooseBackup": "Choisir la sauvegarde", + "restoreOptions": "Options de restauration", + "reviewConfirm": "Vérifier et confirmer", + "progress": "Progression de la restauration" }, "source": { - "title": "Source de restauration", - "subtitle": "D'où provient la sauvegarde ?", + "title": "Sélectionner la source de sauvegarde", + "subtitle": "Choisir d'où restaurer la sauvegarde", "local": { - "name": "Local", - "description": "Fichiers sur le serveur" + "name": "Sauvegarde locale", + "description": "Restaurer depuis le système de fichiers local" }, "s3": { - "name": "S3", - "description": "Stockage S3" + "name": "Stockage S3", + "description": "Restaurer depuis un bucket S3" }, "upload": { - "name": "Téléverser", - "description": "Envoyer un fichier", - "comingSoon": "Bientôt disponible" + "name": "Téléverser la sauvegarde", + "description": "Téléverser un fichier de sauvegarde", + "comingSoon": "Fonctionnalité de téléversement bientôt disponible" }, "configuration": { "s3": "Configuration S3", - "endpoint": "URL S3", - "bucket": "Nom du Bucket", + "endpoint": "URL du point de terminaison S3", + "bucket": "Nom du bucket", "accessKey": "Clé d'accès", - "secretKey": "Clé secrète" + "secretKey": "Clé secrète d'accès" } }, "backup": { - "title": "Choisir la sauvegarde", - "subtitle": "Sélectionnez un point de restauration", - "noBackupsFound": "Aucune sauvegarde trouvée", + "title": "Choisir la sauvegarde à restaurer", + "subtitle": "Sélectionner parmi les sauvegardes disponibles", + "noBackupsFound": "Aucune sauvegarde trouvée dans la source sélectionnée", "encrypted": "Sauvegarde chiffrée", - "encryptedMessage": "Phrase secrète requise.", - "enterPassphrase": "Entrez la phrase secrète", + "encryptedMessage": "Vous devrez fournir la phrase de passe de chiffrement pour restaurer cette sauvegarde.", + "enterPassphrase": "Entrer la phrase de passe de chiffrement", "at": "à" }, "restoreTypes": { "full": { - "name": "Complète", - "description": "Base, photos et archives", - "warning": "Remplace toutes les données actuelles" + "name": "Restauration complète", + "description": "Restaurer tout, y compris la base de données, les photos et les archives", + "warning": "Cela remplacera toutes les données actuelles" }, "database": { - "name": "Base de données", - "description": "Paramètres, événements, comptes", - "warning": "La base actuelle sera remplacée" + "name": "Base de données uniquement", + "description": "Restaurer uniquement la base de données (paramètres, événements, utilisateurs)", + "warning": "La base de données actuelle sera remplacée" }, "files": { - "name": "Fichiers", - "description": "Photos et archives uniquement", + "name": "Fichiers uniquement", + "description": "Restaurer uniquement les photos et archives", "warning": "Les fichiers existants peuvent être écrasés" }, "selective": { - "name": "Sélective", - "description": "Éléments au choix", - "warning": "Seuls les éléments choisis seront restaurés" + "name": "Restauration sélective", + "description": "Choisir les éléments spécifiques à restaurer", + "warning": "Seuls les éléments sélectionnés seront restaurés" } }, "options": { "title": "Options de restauration", - "subtitle": "Précisez vos choix", + "subtitle": "Choisir quoi restaurer", "additionalOptions": { "title": "Options supplémentaires", - "skipPreBackup": "Ignorer sauvegarde pré-restauration", - "skipPreBackupHelp": "Évite de créer une sauvegarde avant l'écrasement.", + "skipPreBackup": "Ignorer la sauvegarde pré-restauration", + "skipPreBackupHelp": "Par défaut, une sauvegarde est créée avant la restauration. Cochez cette option pour l'ignorer.", "force": "Forcer la restauration", - "forceHelp": "Outrepasser les avertissements de sécurité (prudence)" + "forceHelp": "Ignorer les vérifications de sécurité et les avertissements (à utiliser avec prudence)" } }, "confirmation": { - "title": "Vérification", - "subtitle": "Vérifiez votre configuration", + "title": "Vérifier et confirmer", + "subtitle": "Veuillez revoir votre configuration de restauration", "validation": { "passed": "Validation réussie", - "failed": "Échec de validation", - "checking": "Vérification en cours..." + "failed": "Validation échouée", + "checking": "Validation de la configuration de restauration en cours..." }, "spaceCheck": { - "title": "Espace disque", + "title": "Espace de stockage", "required": "Requis", "available": "Disponible", - "insufficient": "Espace insuffisant" + "insufficient": "Espace de stockage insuffisant" }, "summary": { - "title": "Résumé", + "title": "Résumé de la restauration", "source": "Source", - "backupDate": "Date de sauvegarde", + "backupDate": "Date de la sauvegarde", "restoreType": "Type de restauration", "preBackup": "Pré-sauvegarde", - "enabled": "Activée", - "skipped": "Ignorée" + "enabled": "Activé", + "skipped": "Ignoré" }, "warning": { - "title": "Avis important", - "message": "Cette opération va écraser les données. Assurez-vous d'avoir une sauvegarde. Irréversible." + "title": "Avertissement important", + "message": "Cette opération de restauration remplacera les données existantes. Assurez-vous d'avoir une sauvegarde actuelle avant de continuer. Cette action ne peut pas être annulée." } }, "progress": { - "title": "Progression", + "title": "Progression de la restauration", "inProgress": "Restauration en cours...", "completed": "Restauration terminée", "overallProgress": "Progression globale", "current": "Actuel", "statusDetails": "Détails du statut", - "restoreLogs": "Journaux", + "restoreLogs": "Journaux de restauration", "success": { - "title": "Restauration réussie", - "message": "Vos données ont été restaurées." + "title": "Restauration terminée avec succès", + "message": "Vos données ont été restaurées. Veuillez vérifier que tout fonctionne correctement." } }, "actions": { "back": "Retour", "next": "Suivant", - "startRestore": "Lancer la restauration", + "startRestore": "Démarrer la restauration", "starting": "Démarrage...", - "validating": "Validation...", - "startNewRestore": "Nouvelle restauration" + "validating": "Validation en cours...", + "startNewRestore": "Démarrer une nouvelle restauration" } }, "messages": { - "backupStarted": "Sauvegarde lancée", - "backupFailed": "Échec du lancement", - "configUpdated": "Configuration mise à jour", - "configUpdateFailed": "Échec de mise à jour" + "backupStarted": "Sauvegarde démarrée avec succès", + "backupFailed": "Échec du démarrage de la sauvegarde", + "configUpdated": "Configuration de sauvegarde mise à jour", + "configUpdateFailed": "Échec de la mise à jour de la configuration" } }, "cssTemplates": { @@ -2329,192 +2394,188 @@ "template": "Modèle", "templateName": "Nom du modèle", "enableTemplate": "Activer ce modèle", - "enableHint": "Les modèles activés seront proposées à la création d'événement", + "enableHint": "Les modèles activés peuvent être sélectionnés lors de la création d'événements", "cssContent": "Contenu CSS", - "cssHint": "Ciblez avec .gallery-page. Variables : --gallery-bg, --gallery-text, --gallery-accent", - "securityNotice": "Sécurité", - "securityText": "Le CSS est filtré. Les URLs externes, @import et JavaScript sont interdits.", - "resetToDefault": "Réinitialiser", - "resetConfirm": "Réinitialiser par défaut ? Vos changements seront perdus.", - "unsavedChanges": "Changements non enregistrés", + "cssHint": "Utilisez .gallery-page pour appliquer les styles à la galerie. Variables disponibles : --gallery-bg, --gallery-text, --gallery-accent", + "securityNotice": "Avertissement de sécurité", + "securityText": "Le CSS est nettoyé pour empêcher les codes malveillants. Les URL externes, @import et les expressions JavaScript sont bloqués.", + "resetToDefault": "Réinitialiser aux valeurs par défaut", + "resetConfirm": "Réinitialiser ce modèle aux valeurs par défaut ? Vos modifications seront perdues.", + "unsavedChanges": "Modifications non enregistrées", "saveTemplate": "Enregistrer le modèle", - "lastUpdated": "Mis à jour le", - "saved": "Modèle enregistré", - "saveFailed": "Échec de l'enregistrement", - "sanitizationWarning": "Certains motifs CSS ont été bloqués pour sécurité", - "reset": "Modèle réinitialisé", - "resetFailed": "Échec de réinitialisation" + "lastUpdated": "Dernière mise à jour", + "saved": "Modèle enregistré avec succès", + "saveFailed": "Échec de l'enregistrement du modèle", + "sanitizationWarning": "Certains motifs CSS ont été bloqués pour des raisons de sécurité", + "reset": "Modèle réinitialisé aux valeurs par défaut", + "resetFailed": "Échec de la réinitialisation du modèle" }, "maintenance": { - "title": "Maintenance système", - "message": "Maintenance en cours. Nous revenons bientôt.", - "urgentMatters": "Pour une urgence, contactez" + "title": "Maintenance du système", + "message": "Nous effectuons actuellement une maintenance programmée pour améliorer notre service. Nous serons de retour en ligne sous peu.", + "urgentMatters": "Pour les questions urgentes, veuillez contacter" }, "passwordChange": { - "title": "Changer le mot de passe", + "title": "Modifier le mot de passe", "currentPassword": "Mot de passe actuel", "newPassword": "Nouveau mot de passe", "confirmPassword": "Confirmer le nouveau mot de passe", - "currentPasswordPlaceholder": "Saisissez l'actuel", - "newPasswordPlaceholder": "Saisissez le nouveau", - "confirmPasswordPlaceholder": "Confirmez le nouveau", - "requirements": "Exigences :", - "minLength": "6 caractères minimum", - "mustDiffer": "Doit être différent de l'actuel", - "success": "Mot de passe changé", - "failed": "Échec du changement", + "currentPasswordPlaceholder": "Entrer le mot de passe actuel", + "newPasswordPlaceholder": "Entrer le nouveau mot de passe", + "confirmPasswordPlaceholder": "Confirmer le nouveau mot de passe", + "requirements": "Exigences du mot de passe :", + "minLength": "Au moins 6 caractères", + "mustDiffer": "Doit être différent du mot de passe actuel", + "success": "Mot de passe modifié avec succès", + "failed": "Échec de la modification du mot de passe", "currentRequired": "Le mot de passe actuel est requis", "newRequired": "Le nouveau mot de passe est requis", - "minLengthError": "Minimum 6 caractères", - "confirmRequired": "Veuillez confirmer", + "minLengthError": "Le mot de passe doit comporter au moins 6 caractères", + "confirmRequired": "Veuillez confirmer votre nouveau mot de passe", "noMatch": "Les mots de passe ne correspondent pas", - "mustBeDifferent": "Doit différer du précédent", + "mustBeDifferent": "Le nouveau mot de passe doit être différent du mot de passe actuel", "cancel": "Annuler" }, "mandatoryPasswordChange": { - "title": "Changement de mot de passe requis", - "description": "Par sécurité, vous devez changer votre mot de passe avant d'accéder au panneau admin.", - "success": "Mot de passe changé ! Vous pouvez accéder à l'administration.", - "minLength": "12 caractères minimum", - "mustContainUpperLower": "Majuscules et minuscules requises", - "mustContainNumbers": "Chiffres requis", - "mustContainSpecial": "Caractère spécial requis (!@#$%^&*)", - "minLengthError": "Minimum 12 caractères", - "mustContainLowercase": "Lettre minuscule requise", - "mustContainUppercase": "Lettre majuscule requise", - "mustContainNumbersError": "Chiffre requis", - "mustContainSpecialError": "Caractère spécial requis" + "title": "Changement de mot de passe obligatoire", + "description": "Pour des raisons de sécurité, vous devez changer votre mot de passe avant d'accéder au panneau d'administration.", + "success": "Mot de passe modifié avec succès ! Vous pouvez maintenant accéder au panneau d'administration.", + "minLength": "Au moins 12 caractères", + "mustContainUpperLower": "Doit contenir des lettres majuscules et minuscules", + "mustContainNumbers": "Doit contenir des chiffres", + "mustContainSpecial": "Doit contenir des caractères spéciaux (!@#$%^&*)", + "minLengthError": "Le mot de passe doit comporter au moins 12 caractères", + "mustContainLowercase": "Le mot de passe doit contenir des lettres minuscules", + "mustContainUppercase": "Le mot de passe doit contenir des lettres majuscules", + "mustContainNumbersError": "Le mot de passe doit contenir des chiffres", + "mustContainSpecialError": "Le mot de passe doit contenir des caractères spéciaux" }, "offline": { - "backOnline": "De nouveau en ligne", - "noConnection": "Pas de connexion internet" + "backOnline": "De retour en ligne", + "noConnection": "Pas de connexion Internet" }, "download": { - "downloading": "Téléchargement...", + "downloading": "Téléchargement en cours...", "percentComplete": "% terminé" }, "passwordGenerator": { "weak": "Faible", - "fair": "Passable", + "fair": "Moyen", "good": "Bon", - "strong": "Robuste", - "generating": "Génération...", + "strong": "Fort", + "generating": "Génération en cours...", "generatePassword": "Générer un mot de passe", - "showSuggestions": "Voir suggestions", + "showSuggestions": "Afficher les suggestions de mots de passe", "moreOptions": "Plus d'options", - "suggestions": "Suggestions", + "suggestions": "Suggestions de mots de passe", "characters": "caractères", - "copyPassword": "Copier", + "copyPassword": "Copier le mot de passe", "use": "Utiliser", - "pattern": "Modèle :", - "patternDescription": "Générés selon le nom et la date. Ex: 'Venue2024$August' pour faciliter la mémoire." + "pattern": "Motif :", + "patternDescription": "Les mots de passe sont générés à partir du nom de votre événement et de la date. Exemple : \"Lieu2024$Août\" pour une meilleure sécurité et mémorisation." }, "feedback": { "comments": "Commentaires", "addComment": "Ajouter un commentaire", "yourName": "Votre nom", "yourEmail": "Votre e-mail", - "writeComment": "Écrire un commentaire...", + "writeComment": "Écrivez un commentaire...", "submit": "Envoyer", "commentSubmitted": "Commentaire envoyé", - "commentError": "Échec de l'envoi", - "rateLimited": "Veuillez patienter avant de commenter à nouveau", + "commentError": "Échec de l'envoi du commentaire", + "rateLimited": "Veuillez attendre avant de commenter à nouveau", "commentRequired": "Le commentaire est requis", "nameRequired": "Le nom est requis", "emailRequired": "L'e-mail est requis", "anonymous": "Anonyme", "pendingApproval": "En attente d'approbation", - "noComments": "Soyez le premier à commenter !", + "noComments": "Aucun commentaire pour l'instant. Soyez le premier à commenter !", "rating": "Note", - "likes": "J'aime", + "likes": "J'aimes", "settings": { - "title": "Paramètres des avis", - "enableFeedback": "Activer les avis", - "feedbackTypes": "Types d'avis", - "ratings": "Évaluation (étoiles)", - "ratingsDesc": "Notes de 1 à 5 étoiles", - "likes": "J'aime", - "likesDesc": "Bouton J'aime simple", + "title": "Paramètres des commentaires des invités", + "enableFeedback": "Activer les commentaires", + "feedbackTypes": "Types de commentaires", + "ratings": "Notes par étoiles", + "ratingsDesc": "Permettre aux invités de noter les photos (1 à 5 étoiles)", + "likes": "J'aimes", + "likesDesc": "Fonctionnalité simple de j'aime/je n'aime pas", "comments": "Commentaires", - "commentsDesc": "Commentaires textuels", + "commentsDesc": "Commentaires textuels sur les photos", "favorites": "Favoris", - "favoritesDesc": "Mise en favoris", + "favoritesDesc": "Marquer les photos comme favoris", "identityMode": "Mode d'identité", - "identityModeSimple": "Avis simple", - "identityModeSimpleDesc": "Anonyme, basé sur l'appareil. Tous les visiteurs sur le même appareil partagent l'état.", + "identityModeSimple": "Commentaires simples", + "identityModeSimpleDesc": "Anonyme, basé sur l'appareil. Tous les visiteurs sur le même appareil partagent le même état.", "identityModeGuest": "Sélections par invité", - "identityModeGuestDesc": "Chaque visiteur saisit son nom. Active le suivi par invité et les statistiques admin.", + "identityModeGuestDesc": "Chaque visiteur entre son nom. Permet le suivi par invité et les informations administratives.", "privacyModeration": "Confidentialité & Modération", - "requireInfo": "Exiger nom et e-mail", - "requireInfoDesc": "Les invités doivent fournir leur nom et e-mail pour laisser un avis", + "requireInfo": "Nom et e-mail requis", + "requireInfoDesc": "Les invités doivent fournir leur nom et e-mail pour laisser des commentaires", "moderateComments": "Modérer les commentaires", "moderateCommentsDesc": "Les commentaires nécessitent une approbation avant d'être visibles", - "showToGuests": "Afficher les avis aux invités", - "showToGuestsDesc": "Les autres invités peuvent voir les notes, les j'aime et les commentaires approuvés", + "showToGuests": "Afficher les commentaires aux invités", + "showToGuestsDesc": "Les autres invités peuvent voir les notes, les j'aimes et les commentaires approuvés", "enableRateLimiting": "Activer la limitation de débit", - "rateLimitingDesc": "Empêche le spam en limitant la fréquence des avis", - "timeWindow": "Fenêtre temporelle (minutes)", - "maxRequests": "Requêtes max" + "rateLimitingDesc": "Empêcher le spam en limitant la fréquence des commentaires", + "timeWindow": "Fenêtre de temps (minutes)", + "maxRequests": "Nombre maximal de requêtes" }, - "settingsUpdated": "Paramètres d'avis mis à jour", + "settingsUpdated": "Paramètres de commentaires mis à jour", "settingsUpdateError": "Échec de la mise à jour des paramètres", - "moderated": "Avis modéré", - "deleted": "Avis supprimé", - "exported": "Avis exporté", - "exportError": "Échec de l'export des avis", - "title": "Gestion des avis", - "exportCSV": "Exporter CSV", - "exportJSON": "Exporter JSON", + "moderated": "Commentaire modéré", + "deleted": "Commentaire supprimé", + "exported": "Commentaires exportés", + "exportError": "Échec de l'exportation des commentaires", + "title": "Gestion des commentaires", + "exportCSV": "Exporter en CSV", + "exportJSON": "Exporter en JSON", "tabs": { "settings": "Paramètres", - "feedback": "Avis", + "feedback": "Commentaires", "analytics": "Analytique", "moderation": "Modération" }, - "allTypes": "Tous les types", + "allTypes": "Tous types", "types": { "rating": "Notes", - "like": "J'aime", + "like": "J'aimes", "comment": "Commentaires", "favorite": "Favoris" }, - "allStatuses": "Tous les statuts", + "allStatuses": "Tous statuts", "status": { "pending": "En attente", "approved": "Approuvé", "hidden": "Masqué" }, - "noFeedback": "Aucun avis trouvé", + "noFeedback": "Aucun commentaire trouvé", "approve": "Approuver", "hide": "Masquer", "unhide": "Afficher", - "confirmDelete": "Êtes-vous sûr de vouloir supprimer cet avis ?", + "confirmDelete": "Êtes-vous sûr de vouloir supprimer ce commentaire ?", "avgRating": "Note moyenne", - "totalRatings_many": "{{count}} notes", "totalRatings_one": "{{count}} note", "totalRatings_other": "{{count}} notes", - "totalLikes": "Total J'aime", - "totalComments": "Total commentaires", - "pendingModeration_many": "{{count}} en attente", + "totalLikes": "Total des j'aimes", + "totalComments": "Total des commentaires", "pendingModeration_one": "{{count}} en attente", "pendingModeration_other": "{{count}} en attente", - "totalInteractions": "Interactions totales", + "totalInteractions": "Total des interactions", "topRated": "Photos les mieux notées", "recentComments": "Commentaires récents", "wordFilters": "Filtres de mots", "wordFiltersDesc": "Gérer les mots bloqués pour la modération des commentaires", "manageFilters": "Gérer les filtres de mots", - "manage": "Gérer les avis", - "ratingSubmitted": "Note soumise", - "ratingError": "Échec de la soumission de la note", - "rateStar_many": "Noter {{count}} étoiles", + "manage": "Gérer les commentaires", + "ratingSubmitted": "Note envoyée", + "ratingError": "Échec de l'envoi de la note", "rateStar_one": "Noter {{count}} étoile", "rateStar_other": "Noter {{count}} étoiles", - "ratingsCount_many": "{{count}} notes", "ratingsCount_one": "{{count}} note", "ratingsCount_other": "{{count}} notes", "likeError": "Échec de la mise à jour du j'aime", - "unlike": "Retirer le j'aime", + "unlike": "Je n'aime plus", "like": "J'aime", "favoriteError": "Échec de la mise à jour du favori", "unfavorite": "Retirer des favoris", @@ -2524,112 +2585,108 @@ "identityReason": "Veuillez fournir votre nom et e-mail pour soumettre {{type}}.", "namePlaceholder": "Entrez votre nom", "emailPlaceholder": "Entrez votre e-mail", - "submitFeedback": "Soumettre un avis", - "moderationSuccess": "Avis modéré avec succès", + "submitFeedback": "Envoyer le commentaire", + "moderationSuccess": "Commentaire modéré avec succès", "pendingModeration": "En attente de modération", "pending": "en attente", "noPendingComments": "Aucun commentaire en attente de modération", "onPhoto": "Sur la photo", - "showAll_many": "Afficher tous les {{count}} commentaires en attente", - "showAll_one": "Afficher le {{count}} commentaire en attente", + "showAll_one": "Afficher tous les {{count}} commentaire en attente", "showAll_other": "Afficher tous les {{count}} commentaires en attente", - "viewAllFeedback": "Voir tous les avis et paramètres" + "viewAllFeedback": "Voir tous les commentaires et paramètres" }, "filter": { - "feedbackFilters": "Filtres d'avis", + "feedbackFilters": "Filtres de commentaires", "clear": "Effacer", "rating": "Note", - "hasLikes": "Avec J'aime", - "hasFavorites": "Avec Favoris", - "hasComments": "Avec Commentaires", - "combineWith": "Combiner avec", - "showingPhotos": "Total photos", + "hasLikes": "A des j'aimes", + "hasFavorites": "A des favoris", + "hasComments": "A des commentaires", + "showingPhotos": "Photos totales", "withRatings": "Avec notes", + "combineWith": "Combiner avec", "allPhotos": "Toutes les photos", "anyRating": "Toute note", - "oneStarPlus": "1+ étoile", + "oneStarPlus": "1+ étoiles", "twoStarsPlus": "2+ étoiles", "threeStarsPlus": "3+ étoiles", "fourStarsPlus": "4+ étoiles", "fiveStarsOnly": "5 étoiles uniquement" }, "adminLogin": { - "title": "Connexion Admin", - "subtitle": "Connectez-vous pour gérer les galeries", - "sessionExpired": "Session expirée. Reconnectez-vous.", + "title": "Connexion administrateur", + "subtitle": "Connectez-vous pour gérer vos galeries de photos", + "sessionExpired": "Votre session a expiré. Veuillez vous reconnecter.", "emailLabel": "Adresse e-mail", - "emailPlaceholder": "admin@exemple.com", + "emailPlaceholder": "admin@example.com", "emailRequired": "L'e-mail est requis", - "invalidEmail": "Format invalide", + "invalidEmail": "Format d'e-mail invalide", "passwordLabel": "Mot de passe", - "passwordPlaceholder": "Saisissez votre mot de passe", + "passwordPlaceholder": "Entrez votre mot de passe", "passwordRequired": "Le mot de passe est requis", - "passwordMinLength": "Minimum 6 caractères", + "passwordMinLength": "Le mot de passe doit comporter au moins 6 caractères", "rememberMe": "Se souvenir de moi", "signIn": "Se connecter", "loginSuccess": "Connexion réussie !", - "networkError": "Erreur réseau. Vérifiez votre connexion.", - "tooManyAttempts": "Trop de tentatives. Réessayez plus tard.", + "networkError": "Erreur réseau. Veuillez vérifier votre connexion et réessayer.", + "tooManyAttempts": "Trop de tentatives de connexion. Veuillez réessayer plus tard.", "invalidCredentials": "E-mail ou mot de passe invalide", - "generalError": "Une erreur est survenue", + "generalError": "Une erreur est survenue. Veuillez réessayer.", "needHelp": "Besoin d'aide ? Contactez", "poweredBy": "Propulsé par PicPeak", - "devModeHint": "Mode Développement : admin@example.com / admin123" + "devModeHint": "Mode développement : Utilisez l'e-mail : admin@example.com, mot de passe : admin123" + }, + "clientAccess": { + "title": "Accès client", + "description": "Passez en revue les photos et gérez la visibilité avant que la galerie ne soit partagée avec les invités.", + "pinLabel": "Code PIN client", + "pinPlaceholder": "Entrez votre code PIN client", + "enterPin": "Veuillez entrer votre code PIN client", + "invalidPin": "Code PIN invalide. Veuillez réessayer.", + "loginFailed": "Échec de l'authentification. Veuillez réessayer.", + "loginButton": "Accéder à la galerie", + "guestHint": "Vous cherchez la vue invité ?", + "guestLink": "Aller à la vue invité", + "banner": "Mode client", + "visibleCount": "{{visible}} sur {{total}} photos visibles pour les invités", + "hideSelected": "Masquer la sélection", + "showSelected": "Afficher la sélection", + "adminTitle": "Accès client", + "enableToggle": "Activer l'accès client", + "enableDescription": "Permettre aux clients de passer en revue et masquer les photos avant que la galerie ne soit partagée avec les invités.", + "pinHelperText": "Le client utilisera ce code PIN pour accéder à la page de révision.", + "pinUpdated": "Code PIN client mis à jour", + "setPin": "Définir le code PIN", + "linkLabel": "Lien d'accès client", + "regenerateToken": "Régénérer le lien", + "tokenRegenerated": "Lien d'accès client régénéré" + }, + "export": { + "button": "Exporter", + "success": "Exportation téléchargée avec succès", + "error": "Échec de l'exportation : ", + "exportFiltered": "Exporter les photos filtrées", + "hint": "Sélectionnez des photos ou appliquez des filtres pour exporter", + "exportSelected_one": "Exporter {{count}} sélectionné", + "exportSelected_other": "Exporter {{count}} sélectionnés" }, "photoSort": { "defaultSort": "Tri par défaut des photos", - "uploadDateNewest": "Date d'envoi (plus récent d'abord)", - "uploadDateOldest": "Date d'envoi (plus ancien d'abord)", - "captureDateNewest": "Date de prise de vue (plus récente d'abord)", - "captureDateOldest": "Date de prise de vue (plus ancienne d'abord)", + "uploadDateNewest": "Date de téléversement (du plus récent au plus ancien)", + "uploadDateOldest": "Date de téléversement (du plus ancien au plus récent)", + "captureDateNewest": "Date de capture (du plus récent au plus ancien)", + "captureDateOldest": "Date de capture (du plus ancien au plus récent)", "filenameAZ": "Nom de fichier (A-Z)", "filenameZA": "Nom de fichier (Z-A)", "dateTaken": "Date de prise de vue" }, - "clientAccess": { - "enterPin": "Veuillez saisir votre code PIN client", - "invalidPin": "Code PIN invalide. Réessayez.", - "loginFailed": "Échec de l'authentification. Réessayez.", - "title": "Accès client", - "description": "Vérifiez les photos et gérez leur visibilité avant que la galerie ne soit partagée avec les invités.", - "pinLabel": "Code PIN client", - "pinPlaceholder": "Saisissez votre code PIN", - "loginButton": "Accéder à la galerie", - "guestHint": "Vous cherchez la galerie invité ?", - "guestLink": "Aller à la vue invité", - "adminTitle": "Accès client", - "enableToggle": "Activer l'accès client", - "enableDescription": "Permettre aux clients de consulter et masquer des photos avant que la galerie ne soit partagée avec les invités.", - "pinUpdated": "Code PIN client mis à jour", - "setPin": "Définir le code PIN", - "linkLabel": "Lien d'accès client", - "tokenRegenerated": "Lien d'accès client régénéré", - "regenerateToken": "Régénérer le lien", - "pinHelperText": "Le client utilisera ce code PIN pour accéder à la page de révision.", - "banner": "Mode client", - "visibleCount": "{{visible}} sur {{total}} photos visibles pour les invités", - "hideSelected": "Masquer la sélection", - "showSelected": "Afficher la sélection" - }, - "export": { - "success": "Export téléchargé avec succès", - "error": "Échec de l'export : ", - "button": "Exporter", - "exportSelected_many": "Exporter {{count}} sélectionnés", - "exportSelected_one": "Exporter {{count}} sélectionné", - "exportSelected_other": "Exporter {{count}} sélectionnés", - "exportFiltered": "Exporter les photos filtrées", - "hint": "Sélectionnez des photos ou appliquez des filtres pour exporter" - }, "photos": { - "moveToCategory_many": "Déplacer {{count}} photos vers la catégorie", "moveToCategory_one": "Déplacer {{count}} photo vers la catégorie", "moveToCategory_other": "Déplacer {{count}} photos vers la catégorie", "selectCategory": "Sélectionner une catégorie", - "uncategorized": "Sans catégorie", + "uncategorized": "Non catégorisées", "movePhotos": "Déplacer les photos", "selectedCategory": "catégorie sélectionnée", - "movedToCategory_many": "{{count}} photos déplacées vers {{category}}", "movedToCategory_one": "{{count}} photo déplacée vers {{category}}", "movedToCategory_other": "{{count}} photos déplacées vers {{category}}", "moveToCategoryFailed": "Échec du déplacement des photos vers la catégorie", @@ -2638,74 +2695,74 @@ "customer": { "login": { "title": "Connexion client", - "subtitle": "Accédez à toutes vos galeries photo en un seul endroit.", + "subtitle": "Accédez à toutes vos galeries de photos en un seul endroit.", "email": "E-mail", "password": "Mot de passe", - "emailRequired": "L'e-mail est obligatoire", - "invalidEmail": "Veuillez saisir une adresse e-mail valide", - "passwordRequired": "Le mot de passe est obligatoire", + "emailRequired": "L'e-mail est requis", + "invalidEmail": "Veuillez entrer un e-mail valide", + "passwordRequired": "Le mot de passe est requis", "showPassword": "Afficher le mot de passe", "hidePassword": "Masquer le mot de passe", "signIn": "Se connecter", - "loginSuccess": "Bon retour !", + "loginSuccess": "Heureux de vous revoir !", "invalidCredentials": "E-mail ou mot de passe invalide", - "tooManyAttempts": "Trop de tentatives — réessayez plus tard.", - "networkError": "Impossible de contacter le serveur. Veuillez réessayer.", + "tooManyAttempts": "Trop de tentatives — veuillez réessayer plus tard.", + "networkError": "Impossible de joindre le serveur. Veuillez réessayer.", "generalError": "Échec de la connexion. Veuillez réessayer.", "acceptedToast": "Compte prêt — veuillez vous connecter.", "adminHint": "Vous cherchez le panneau d'administration ? Visitez /admin/login.", - "emailPlaceholder": "vous@exemple.com", + "emailPlaceholder": "vous@example.com", "passwordPlaceholder": "Votre mot de passe", "needHelp": "Besoin d'aide ?", "poweredBy": "Propulsé par PicPeak" }, "acceptInvite": { - "title": "Configurez votre compte", - "invalidToken": "Ce lien d'invitation est invalide ou expiré. Veuillez demander une nouvelle invitation à votre photographe.", - "emailWillBe": "L'e-mail de votre compte sera ", + "title": "Configurer votre compte", + "invalidToken": "Ce lien d'invitation est invalide ou a expiré. Veuillez contacter votre photographe pour obtenir une nouvelle invitation.", + "emailWillBe": "Votre e-mail de compte sera ", "invitedBy": ", invité par ", "name": "Votre nom", - "nameRequired": "Veuillez saisir votre nom", + "nameRequired": "Veuillez entrer votre nom", "password": "Choisissez un mot de passe", - "confirm": "Confirmez le mot de passe", + "confirm": "Confirmer le mot de passe", "passwordTooShort": "Le mot de passe doit comporter au moins 8 caractères", "passwordsMismatch": "Les mots de passe ne correspondent pas", - "passwordHint": "Au moins 8 caractères, avec une majuscule et un chiffre.", + "passwordHint": "Au moins 8 caractères, avec une lettre majuscule et un chiffre.", "submit": "Créer le compte", "successToast": "Compte créé — veuillez vous connecter.", - "alreadyExists": "Un compte avec cet e-mail existe déjà. Veuillez plutôt vous connecter.", + "alreadyExists": "Un compte avec cet e-mail existe déjà. Veuillez vous connecter à la place.", "invalidSubmission": "Impossible de créer votre compte.", "generalError": "Impossible de créer votre compte. Veuillez réessayer.", - "subtitle": "Confirmez ou complétez vos informations. Vous pouvez tout modifier depuis la page de profil plus tard.", - "displayName": "Nom affiché", + "subtitle": "Confirmez ou remplissez vos informations. Vous pourrez modifier tout cela plus tard depuis la page de profil.", + "displayName": "Nom d'affichage", "section": { "personal": "Personnel", - "contact": "Contact & entreprise (facultatif)", - "address": "Adresse de facturation (facultatif)", + "contact": "Contact & entreprise (optionnel)", + "address": "Adresse de facturation (optionnel)", "password": "Choisissez un mot de passe" } }, "dashboard": { "title": "Vos galeries", - "subtitle": "Cliquez sur une galerie pour l'ouvrir. Le bouton Télécharger regroupe toutes les photos dans un zip.", + "subtitle": "Cliquez sur une galerie pour l'ouvrir. Le bouton Télécharger crée une archive ZIP de toutes les photos.", "loadError": "Impossible de charger vos galeries. Veuillez réessayer.", - "emptyTitle": "Aucune galerie pour le moment", - "emptyBody": "Dès que votre photographe vous attribuera une galerie, elle apparaîtra ici.", + "emptyTitle": "Aucune galerie pour l'instant", + "emptyBody": "Dès que votre photographe vous aura assigné à une galerie, elle apparaîtra ici.", "openAria": "Ouvrir la galerie {{name}}", - "opening": "Ouverture…", + "opening": "Ouverture en cours…", "expiresOn": "Expire le {{date}}", - "expiredOn": "Expirée le {{date}}", + "expiredOn": "Expiré le {{date}}", "eventExpired": "Cette galerie a expiré.", "eventForbidden": "Vous n'avez plus accès à cette galerie.", "openError": "Impossible d'ouvrir cette galerie. Veuillez réessayer.", "download": "Télécharger", - "preparingDownload": "Préparation…", - "quickDownloadAria": "Télécharger toutes les photos de {{name}}", + "preparingDownload": "Préparation en cours…", + "quickDownloadAria": "Télécharger toutes les photos pour {{name}}", "downloadStarted": "Téléchargement démarré pour {{name}}", "downloadError": "Impossible de démarrer le téléchargement. Veuillez réessayer.", "sortLabel": "Trier par", - "sortNewest": "Plus récents d'abord", - "sortOldest": "Plus anciens d'abord", + "sortNewest": "Du plus récent au plus ancien", + "sortOldest": "Du plus ancien au plus récent", "sortName": "Par nom", "open": "Ouvrir" }, @@ -2725,19 +2782,19 @@ }, "calendar": { "title": "Calendrier", - "body": "Les prochaines séances, dates de livraison de galeries et autres événements liés à vos shootings apparaîtront ici. Nous vous préviendrons lorsque ce sera prêt." + "body": "Les séances à venir, les dates de livraison des galeries et autres événements liés aux séances s'afficheront ici. Nous vous préviendrons quand ce sera prêt." }, "quotes": { "title": "Devis", - "body": "Consultez et acceptez les devis pour vos prochaines séances en un seul endroit. Nous y travaillons encore — pour l'instant, votre photographe continuera à envoyer ses devis comme d'habitude." + "body": "Passez en revue et acceptez les devis pour les séances à venir en un seul endroit. Nous sommes encore en train de construire cela — pour l'instant, votre photographe continuera à vous envoyer les devis de la manière habituelle." }, "bills": { "title": "Factures", - "body": "Les factures et l'historique des paiements pour vos séances seront disponibles ici. Nous vous enverrons un e-mail lorsque ce sera en ligne." + "body": "Les factures et l'historique de paiement pour vos séances seront disponibles ici. Nous vous enverrons un e-mail lorsque cela sera opérationnel." }, "profile": { "title": "Profil client", - "subtitle": "Gardez vos coordonnées et informations de facturation à jour — elles apparaîtront sur les devis et factures lorsque ces fonctionnalités seront actives.", + "subtitle": "Gardez vos informations de contact et de facturation à jour — elles seront affichées sur les devis et factures une fois ces fonctionnalités disponibles.", "savedToast": "Profil enregistré", "saveError": "Impossible d'enregistrer le profil.", "loadError": "Impossible de charger votre profil.", @@ -2753,33 +2810,33 @@ "personal": "Informations personnelles", "contact": "Contact & entreprise", "address": "Adresse de facturation", - "password": "Changer le mot de passe" + "password": "Modifier le mot de passe" }, "field": { - "email": "E-mail (identifiant)", - "emailHint": "Contactez votre photographe si vous devez modifier votre e-mail de connexion.", + "email": "E-mail (connexion)", + "emailHint": "Contactez votre photographe si vous devez changer votre e-mail de connexion.", "salutation": "Civilité", "firstName": "Prénom", "lastName": "Nom", - "displayName": "Nom affiché", + "displayName": "Nom d'affichage", "displayNameHint": "Comment nous vous saluons dans le tableau de bord.", "phone": "Téléphone", "companyName": "Nom de l'entreprise", - "vatId": "N° TVA", + "vatId": "Numéro de TVA", "addressLine1": "Adresse ligne 1", "addressLine2": "Adresse ligne 2", "postalCode": "Code postal", "city": "Ville", - "state": "Région / département", + "state": "État / région", "countryCode": "Pays" }, "password": { "current": "Mot de passe actuel", "next": "Nouveau mot de passe", - "confirm": "Confirmez le nouveau mot de passe", + "confirm": "Confirmer le nouveau mot de passe", "submit": "Mettre à jour le mot de passe", - "hint": "Au moins 8 caractères avec une majuscule et un chiffre.", - "currentRequired": "Saisissez votre mot de passe actuel", + "hint": "Au moins 8 caractères avec une lettre majuscule et un chiffre.", + "currentRequired": "Entrez votre mot de passe actuel", "tooShort": "Au moins 8 caractères", "mismatch": "Les mots de passe ne correspondent pas", "wrong": "Le mot de passe actuel est incorrect", @@ -2788,13 +2845,13 @@ } }, "resetPassword": { - "title": "Réinitialisez votre mot de passe", - "invalidToken": "Ce lien de réinitialisation est invalide ou expiré. Demandez à votre photographe d'en envoyer un nouveau.", - "forEmail": "Définition d'un nouveau mot de passe pour ", + "title": "Réinitialiser votre mot de passe", + "invalidToken": "Ce lien de réinitialisation est invalide ou a expiré. Veuillez demander à votre photographe de vous en envoyer un nouveau.", + "forEmail": "Définir un nouveau mot de passe pour ", "password": "Nouveau mot de passe", - "confirm": "Confirmez le nouveau mot de passe", + "confirm": "Confirmer le nouveau mot de passe", "submit": "Mettre à jour le mot de passe", - "hint": "Au moins 8 caractères avec une majuscule et un chiffre.", + "hint": "Au moins 8 caractères avec une lettre majuscule et un chiffre.", "tooShort": "Le mot de passe doit comporter au moins 8 caractères", "mismatch": "Les mots de passe ne correspondent pas", "successToast": "Mot de passe mis à jour. Veuillez vous connecter.", @@ -2804,9 +2861,9 @@ }, "customers": { "pageTitle": "Clients", - "pageSubtitle": "Comptes clients récurrents pouvant se connecter sur /customer/login.", + "pageSubtitle": "Comptes clients récurrents qui peuvent se connecter via /customer/login.", "unnamed": "Sans nom", - "empty": "Aucun client pour le moment. Cliquez sur « Inviter un client » pour en ajouter un.", + "empty": "Aucun client pour l'instant. Cliquez sur \"Inviter un client\" pour en ajouter un.", "loadError": "Impossible de charger les clients", "loadInvitationsError": "Impossible de charger les invitations", "tabs": { @@ -2831,35 +2888,35 @@ "invite": { "button": "Inviter un client", "title": "Inviter un client", - "description": "Il recevra un e-mail avec un lien pour configurer son compte. Une fois accepté, vous pourrez l'assigner à des événements.", + "description": "Il/elle recevra un e-mail avec un lien pour configurer son compte. Une fois qu'il/elle aura accepté, vous pourrez l'assigner à des événements.", "email": "E-mail", "submit": "Envoyer l'invitation", "success": "Invitation envoyée", "error": "Impossible d'envoyer l'invitation.", "conflict": "Un client avec cet e-mail existe déjà ou a une invitation en attente.", - "invalidEmail": "Veuillez saisir un e-mail valide", - "showPrefill": "+ Ajouter des coordonnées (facultatif)", - "hidePrefill": "− Masquer les coordonnées", - "prefillHint": "Tout ce que vous saisirez sera pré-rempli sur la page d'inscription du client — il pourra toujours le modifier." + "invalidEmail": "Veuillez entrer un e-mail valide", + "showPrefill": "+ Ajouter les détails de contact (optionnel)", + "hidePrefill": "− Masquer les détails de contact", + "prefillHint": "Tout ce que vous remplissez sera pré-rempli sur la page d'inscription du client — il pourra toujours le modifier." }, "invitations": { "empty": "Aucune invitation en attente.", "email": "E-mail", "invitedBy": "Invité par", "expiresAt": "Expire", - "createdAt": "Créé le", + "createdAt": "Créé", "cancel": "Annuler" }, "deactivate": { "button": "Désactiver", "title": "Désactiver le client ?", - "body": "Il ne pourra plus se connecter. Vous pourrez le ré-inviter plus tard.", + "body": "Il/elle ne pourra plus se connecter. Vous pourrez l'inviter à nouveau plus tard.", "success": "Client désactivé", "error": "Impossible de désactiver le client" }, "cancelInvitation": { "title": "Annuler l'invitation ?", - "body": "Le lien d'invitation cessera immédiatement de fonctionner.", + "body": "Le lien d'invitation cessera de fonctionner immédiatement.", "success": "Invitation annulée", "error": "Impossible d'annuler l'invitation" }, @@ -2872,36 +2929,36 @@ "expires": "expire", "accountSection": "Compte", "personalSection": "Informations personnelles", - "billingSection": "Adresse & facturation", + "billingSection": "Adresse et facturation", "notesSection": "Notes internes", "eventsSection": "Événements assignés", - "noEvents": "Non assigné à des événements. Ajoutez ce client à un événement depuis le formulaire de l'événement.", + "noEvents": "Aucun événement assigné pour l'instant. Ajoutez ce client à un événement depuis le formulaire d'événement.", "email": "E-mail", "preferredLanguage": "Langue préférée", "salutation": "Civilité", "salutationNone": "—", "firstName": "Prénom", "lastName": "Nom", - "displayName": "Nom affiché", + "displayName": "Nom d'affichage", "phone": "Téléphone", "company": "Entreprise", "billingEmail": "E-mail de facturation", - "vatId": "N° TVA / fiscal", + "vatId": "Numéro de TVA / fiscal", "addressLine1": "Adresse ligne 1", "addressLine2": "Adresse ligne 2", "postalCode": "Code postal", "city": "Ville", - "state": "Région / département", + "state": "État / région", "countryCode": "Pays (ISO 2)", "notesHint": "Visible uniquement par les administrateurs. Jamais montré au client.", "featuresSection": "Fonctionnalités client", - "featuresHint": "Surcharges par client pour les onglets du portail. Les bascules globales dans Paramètres → Fonctionnalités sont le commutateur principal — quand global est sur OFF personne ne voit l'onglet, quel que soit le réglage ici. Les valeurs par défaut sont ON ; mettez un bouton sur OFF pour masquer un onglet pour ce client en particulier.", - "passwordSection": "Actions du compte", - "passwordHint": "Envoie un lien de réinitialisation à usage unique (7 jours) à l'e-mail du client. Le mot de passe actuel continue de fonctionner jusqu'à ce que le client clique sur le lien et en définisse un nouveau.", + "featuresHint": "Remplacements par client pour les onglets de la surface client. Les bascules globales dans Paramètres → Surface client sont le commutateur principal — lorsque le global est désactivé, personne ne voit l'onglet, quel que soit ce que vous définissez ici. Par défaut, tout est activé, donc désactivez un commutateur pour masquer un onglet pour ce client spécifique.", + "passwordSection": "Actions sur le compte", + "passwordHint": "Envoie un lien de réinitialisation à usage unique valable 7 jours à l'e-mail du client. Le mot de passe actuel du client continue de fonctionner jusqu'à ce qu'il clique sur le lien et définisse un nouveau mot de passe.", "passwordReset": { - "button": "Envoyer l'e-mail de réinitialisation", - "success": "E-mail de réinitialisation envoyé", - "error": "Impossible d'envoyer la réinitialisation", + "button": "Envoyer un e-mail de réinitialisation du mot de passe", + "success": "E-mail de réinitialisation du mot de passe envoyé", + "error": "Impossible d'envoyer la réinitialisation du mot de passe", "inactive": "Réactivez le client avant d'envoyer une réinitialisation." }, "manageEvents": "Gérer les galeries" @@ -2914,27 +2971,27 @@ "erase": { "button": "Effacer les données du client", "title": "Effacer les données du client ?", - "body": "Supprime le nom, l'e-mail, le téléphone, l'adresse, l'entreprise et les identifiants du client. La ligne de compte reste pour que les enregistrements d'accès historiques et les journaux d'audit y fassent toujours référence. Cette action est irréversible — vous ne pourrez pas restaurer les données ensuite.", + "body": "Supprime le nom, l'e-mail, le téléphone, l'adresse, l'entreprise et les identifiants du client. La ligne de compte reste afin que les enregistrements historiques d'accès aux événements et les journaux d'audit y fassent encore référence. Cette action est irréversible — vous ne pourrez pas restaurer les données ensuite.", "confirm": "Effacer définitivement", - "confirmInFlight": "Effacement…", + "confirmInFlight": "Effacement en cours…", "success": "Client effacé", "error": "Impossible d'effacer le client" }, "assignedEvents": { "title": "Gérer les galeries assignées", - "subtitle": "Sélectionnez toutes les galeries auxquelles ce client doit pouvoir accéder depuis son tableau de bord. Retirer une galerie ici révoque l'accès immédiatement à la prochaine requête du client.", + "subtitle": "Choisissez chaque galerie à laquelle ce client doit pouvoir accéder depuis son tableau de bord. La suppression d'une galerie ici révoque l'accès immédiatement lors de la prochaine demande du client.", "currentLabel": "Galeries assignées", - "empty": "Aucune galerie assignée pour le moment. Recherchez ci-dessous pour en ajouter une.", + "empty": "Aucune galerie assignée pour l'instant. Utilisez la recherche ci-dessous pour en ajouter une.", "searchLabel": "Ajouter une galerie", "searchPlaceholder": "Rechercher par nom d'événement", "searchHint": "Commencez à taper pour trouver des galeries.", "noResults": "Aucune galerie correspondante.", - "removeAria": "Retirer {{name}}", + "removeAria": "Supprimer {{name}}", "save": "Enregistrer les assignations", "saved": "Assignations mises à jour", "savedDiff": "Assignations mises à jour : {{parts}}", - "addedN": "{{count}} ajoutée(s)", - "removedN": "{{count}} retirée(s)", + "addedN": "{{count}} ajouté", + "removedN": "{{count}} supprimé", "error": "Impossible de mettre à jour les assignations", "clearSearchAria": "Effacer la recherche" } @@ -2942,7 +2999,7 @@ "clients": { "title": "Clients", "subtitle": "Comptes clients, planification, devis et facturation pour les clients récurrents.", - "navAriaLabel": "Navigation Clients", + "navAriaLabel": "Navigation clients", "empty": { "title": "Aucune fonctionnalité client activée", "body": "Activez Comptes (ou une autre sous-fonctionnalité Clients) dans Paramètres → Fonctionnalités pour commencer." From dae47518fba351461267a436eb63d594401f3347 Mon Sep 17 00:00:00 2001 From: rpintodasilva Date: Wed, 20 May 2026 13:13:35 +0200 Subject: [PATCH 2/2] fixes --- frontend/src/i18n/locales/fr.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/i18n/locales/fr.json b/frontend/src/i18n/locales/fr.json index b753a6b2..93e9fd4a 100644 --- a/frontend/src/i18n/locales/fr.json +++ b/frontend/src/i18n/locales/fr.json @@ -1805,7 +1805,7 @@ "invalidTokenMessage": "Ce lien d'invitation est invalide ou a expiré. Veuillez contacter votre administrateur pour obtenir une nouvelle invitation.", "alreadyUsedMessage": "Cette invitation a déjà été utilisée pour créer un compte.", "invitedAs": "Vous avez été invité en tant que", - "expiresAt": "L'invitation expire", + "expiresAt": "L'invitation expire le", "usernameLabel": "Nom d'utilisateur", "usernamePlaceholder": "Choisissez un nom d'utilisateur", "usernameHelp": "3 à 50 caractères, lettres, chiffres, traits de soulignement et tirets uniquement", @@ -2903,8 +2903,8 @@ "empty": "Aucune invitation en attente.", "email": "E-mail", "invitedBy": "Invité par", - "expiresAt": "Expire", - "createdAt": "Créé", + "expiresAt": "Expire le", + "createdAt": "Créé le", "cancel": "Annuler" }, "deactivate": {