Étape 67 : adresse + bouton dans l'onglet « Messages » pour envoyer tout de suite un email de test, résultat réel affiché (envoyé, désactivé, connexion ou message refusé, réponse du serveur SMTP) — POST .../notifications/test. Étape 66 : prénom et nom facultatifs à l'ajout manuel d'un bénévole ; un bénévole sans nom s'affiche « Sans nom » / « ? » partout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
788 lines
51 KiB
JSON
788 lines
51 KiB
JSON
{
|
||
"filter.all": "TOUS",
|
||
"legend.title": "LÉGENDE",
|
||
"action.close": "Fermer",
|
||
"action.remove": "Retirer",
|
||
"action.add": "Ajouter",
|
||
"app.loading": "Chargement…",
|
||
"app.error.generic": "Une erreur est survenue",
|
||
"app.error.reference": "Référence à communiquer : {id}",
|
||
"error.generic": "Erreur inattendue",
|
||
"error.internal": "Erreur interne du serveur",
|
||
"error.not_found": "Ressource introuvable",
|
||
"error.forbidden": "Accès refusé",
|
||
"error.unauthorized": "Authentification requise",
|
||
"error.validation_failed": "La validation a échoué (règle bloquante)",
|
||
"error.too_many_requests": "Trop de tentatives, réessayez dans un instant",
|
||
"assignment.duplicate": "Ce bénévole est déjà affecté à ce créneau",
|
||
"assignment.wrong_edition": "Bénévole ou créneau hors de cette édition",
|
||
"shift.ends_not_after_starts": "La fin doit être après le début",
|
||
"shift.position_wrong_edition": "Le poste n'appartient pas à cette édition",
|
||
"position.lead_must_be_referent_account": "Le référent d'un poste doit être un compte référent de cette édition",
|
||
"account.duplicate": "Un compte existe déjà pour cet email ou ce bénévole",
|
||
"account.volunteer_wrong_edition": "Le bénévole n'appartient pas à cette édition",
|
||
"account.password_required": "Un compte coordination requiert un mot de passe",
|
||
"account.password_not_allowed": "Un compte référent ou bénévole se connecte par lien magique, sans mot de passe",
|
||
"account.role_change_not_allowed": "Un compte coordination ne peut pas changer de rôle ainsi",
|
||
"auth.invalid_credentials": "Email ou mot de passe incorrect",
|
||
"auth.invalid_token": "Ce lien de connexion est invalide ou expiré",
|
||
"role.coordinator": "Coordination",
|
||
"role.lead": "Référent",
|
||
"role.volunteer": "Bénévole",
|
||
"auth.logout": "Déconnexion",
|
||
"auth.email": "Email",
|
||
"auth.password": "Mot de passe",
|
||
"auth.signIn": "Se connecter",
|
||
"auth.signingIn": "Connexion…",
|
||
"auth.admin.title": "Espace coordination",
|
||
"auth.demoCredentials": "Démo : {email} · mot de passe « {password} »",
|
||
"auth.notAdmin": "Bénévole ou référent ?",
|
||
"auth.magicLinkLink": "Recevoir un lien de connexion",
|
||
"auth.isAdmin": "Vous êtes de la coordination ?",
|
||
"auth.adminLink": "Connexion par mot de passe",
|
||
"auth.magic.title": "Connexion bénévole / référent",
|
||
"auth.magic.lead": "Entrez votre email : vous recevrez un lien de connexion, sans mot de passe.",
|
||
"auth.magic.send": "Envoyer le lien",
|
||
"auth.magic.sending": "Envoi…",
|
||
"auth.magic.sent": "Si un compte correspond à cet email, un lien de connexion vient d'être envoyé.",
|
||
"auth.magic.devHint": "Démo (email stubé) — cliquez ce lien :",
|
||
"auth.magic.another": "Utiliser un autre email",
|
||
"auth.magic.verifyTitle": "Connexion en cours",
|
||
"auth.magic.verifying": "Vérification du lien…",
|
||
"auth.magic.retry": "Demander un nouveau lien",
|
||
"header.title": "GESTION DES BÉNÉVOLES",
|
||
"header.meta": "BÉNÉVOLAT · {count} INSCRITS",
|
||
"header.mockMode": "DONNÉES DE DÉMO",
|
||
"header.openMenu": "Menu",
|
||
"header.closeMenu": "Fermer le menu",
|
||
"tab.grille": "Grille des besoins",
|
||
"tab.volunteers": "Vue par bénévole",
|
||
"tab.mobileVolunteer": "Bénévole · mobile",
|
||
"tab.mobileLead": "Référent · mobile",
|
||
"tab.config": "Configuration",
|
||
"tab.badges": "Badges",
|
||
"position.category.bar": "Bar",
|
||
"position.category.ticketing": "Billetterie",
|
||
"position.category.welcome": "Accueil",
|
||
"position.category.parking": "Parking",
|
||
"position.category.cleaning": "Propreté",
|
||
"position.category.catering": "Catering",
|
||
"position.category.setup": "Montage",
|
||
"position.category.stage": "Régie",
|
||
"position.category.other": "Autre",
|
||
"validation.SHIFT_OVERLAP": "Se chevauche avec un autre créneau",
|
||
"validation.SHIFT_OVERLAP.at": "Déjà affecté sur {position} au même moment",
|
||
"validation.SHIFT_OVERLAP.rule": "Deux créneaux d'un même bénévole se chevauchent (avertissement, non bloquant).",
|
||
"grille.filter.day": "JOUR",
|
||
"grille.filter.position": "POSTE",
|
||
"grille.legend.critical": "SOUS-EFFECTIF CRITIQUE",
|
||
"grille.legend.incomplete": "INCOMPLET",
|
||
"grille.legend.complete": "COMPLET",
|
||
"grille.legend.overstaffed": "SUREFFECTIF",
|
||
"grille.legend.undefined": "À DÉFINIR",
|
||
"grille.positionsCount": "{count} POSTES",
|
||
"grille.assignedRequired": "AFFECTÉS / IDÉAL",
|
||
"grille.footnote": "Chaque cellule est un créneau. Nombre = bénévoles affectés, / = effectif idéal. Cliquer ouvre le panneau d'affectation à droite.",
|
||
"grille.cellPreview.staffing": "{assigned}/{ideal} affecté(s) · min {min}",
|
||
"grille.empty": "Aucun créneau pour le moment. Créez des postes dans Configuration → « Postes & créneaux » — un créneau est généré par jour et par créneau type.",
|
||
"grille.panel.empty.title": "Cliquez une cellule de la grille pour affecter des bénévoles.",
|
||
"grille.panel.empty.body": "Le panneau s'ouvre ici, sans quitter la grille : candidats triés par charge, alertes bloquantes et avertissements du moteur de validation.",
|
||
"grille.panel.slotDuration": "CRÉNEAU DE {hours} H",
|
||
"grille.panel.assigned": "AFFECTÉS",
|
||
"grille.panel.min": "MINIMUM {count}",
|
||
"grille.panel.ideal": "IDÉAL {count}",
|
||
"grille.panel.assignmentsTitle": "AFFECTATIONS ({count})",
|
||
"grille.panel.noneAssigned": "Personne n'est encore affecté sur ce créneau.",
|
||
"grille.panel.hoursTotal": "{hours} H AU TOTAL",
|
||
"grille.panel.candidates": "CANDIDATS",
|
||
"grille.panel.searchVolunteer": "Rechercher un bénévole…",
|
||
"grille.panel.searchNoMatch": "Aucun bénévole ne correspond à cette recherche.",
|
||
"grille.panel.hoursAssigned": "{hours} H · {slots} CRÉNEAUX",
|
||
"grille.panel.assign": "AFFECTER",
|
||
"grille.panel.blocked": "BLOQUÉ",
|
||
"grille.panel.blockingPrefix": "BLOQUANT — {reason}",
|
||
"grille.panel.warningsTitle": "⚠ AVERTISSEMENTS — AFFECTATION POSSIBLE",
|
||
"volunteers.filter.show": "AFFICHER",
|
||
"volunteers.filter.all": "TOUS",
|
||
"volunteers.filter.unassigned": "SANS AFFECTATION",
|
||
"volunteers.legend.assigned": "AFFECTATION",
|
||
"volunteers.legend.overlap": "DEUX POSTES EN MÊME TEMPS",
|
||
"volunteers.legend.now": "MAINTENANT",
|
||
"volunteers.bar.title": "{position} · {time}",
|
||
"volunteers.bar.overlapTitle": "{position} · {time} — en même temps qu'un autre poste",
|
||
"volunteers.search.placeholder": "Rechercher un bénévole ou un poste…",
|
||
"volunteers.search.label": "Rechercher un bénévole ou un poste",
|
||
"volunteers.search.empty": "Aucun bénévole ni poste ne correspond à « {query} ».",
|
||
"volunteer.unnamed": "Sans nom",
|
||
"volunteers.count": "{count} BÉNÉVOLES",
|
||
"volunteers.totalHours": "TOTAL H",
|
||
"volunteers.sort.label": "TRIER PAR",
|
||
"volunteers.sort.name": "NOM",
|
||
"volunteers.sort.hoursAsc": "HEURES ↑",
|
||
"volunteers.sort.hoursDesc": "HEURES ↓",
|
||
"volunteers.sort.toggle": "Trier par total d'heures (croissant / décroissant)",
|
||
"volunteers.name": "NOM",
|
||
"volunteers.cumulative": "CUMUL",
|
||
"volunteers.badge.unassigned": "○ OUBLIÉ",
|
||
"volunteers.empty": "Aucun bénévole ne correspond à ce filtre — bonne nouvelle. Repassez sur « TOUS » pour revoir l'ensemble de l'équipe.",
|
||
"volunteers.noData": "Aucun bénévole pour le moment. Ajoutez-les dans Configuration → « Bénévoles & import ».",
|
||
"volunteers.footnote": "Oublié = aucune affectation.",
|
||
"mobileVol.greeting": "Salut {name}",
|
||
"mobileVol.summary.one": "{count} créneau · {duration} sur {days} jour",
|
||
"mobileVol.summary.other": "{count} créneaux · {duration} sur {days} jour(s)",
|
||
"mobileVol.summary.none": "Pas encore de créneau.",
|
||
"mobileVol.featured.now": "● EN COURS",
|
||
"mobileVol.featured.next": "PROCHAIN CRÉNEAU",
|
||
"mobileVol.featured.overlap": "⚠ Tu es aussi sur {position} de {start} à {end}. Vérifie avec la coordination.",
|
||
"mobileVol.featured.referent": "TON RÉFÉRENT",
|
||
"mobileVol.featured.call": "APPELER",
|
||
"mobileVol.allDone": "Festival terminé. Merci {name}, tu as assuré !",
|
||
"mobileVol.day.one": "{count} créneau · {duration}",
|
||
"mobileVol.day.other": "{count} créneaux · {duration}",
|
||
"mobileVol.slot.done": "TERMINÉ",
|
||
"mobileVol.slot.now": "EN COURS",
|
||
"mobileVol.slot.referent": " · réf. {name}",
|
||
"mobileVol.slot.overlap": "⚠ Chevauche {position} de {start} à {end}. Vérifie avec la coordination où tu dois être.",
|
||
"slot.duration.hours": "{h} h",
|
||
"slot.duration.hoursMinutes": "{h} h {m}",
|
||
"slot.countdown.endsAt": "FIN À {time}",
|
||
"slot.countdown.minutes": "DANS {count} MIN",
|
||
"slot.countdown.in": "DANS {duration}",
|
||
"slot.countdown.days": "DANS {count} J",
|
||
"mobileVol.orgMessage.title": "MESSAGE DE L'ORGANISATION",
|
||
"mobileVol.orgMessage.signature": "Coordination · {when}",
|
||
"message.save": "Enregistrer",
|
||
"message.remove": "Retirer le message",
|
||
"message.saving": "Enregistrement…",
|
||
"message.saved": "✓ Enregistré",
|
||
"message.updatedAt": "Publié {when}",
|
||
"message.length": "{count} / {max} caractères",
|
||
"message.date.today": "aujourd'hui {time}",
|
||
"message.date.yesterday": "hier {time}",
|
||
"message.date.other": "{day} · {time}",
|
||
"mobileVol.noSlots": "Aucun créneau pour l'instant. La coordination t'affectera bientôt.",
|
||
"mobileVol.noAccount": "Ce compte n'est rattaché à aucun bénévole. Contactez la coordination.",
|
||
"mobileLead.kicker": "Ton équipe",
|
||
"mobileLead.kickerNamed": "{name} · ton équipe",
|
||
"mobileLead.status.done": "terminé",
|
||
"mobileLead.status.now": "en cours",
|
||
"mobileLead.status.next": "à venir",
|
||
"mobileLead.count.present": "PRÉSENTS",
|
||
"mobileLead.count.waiting": "ATTENDUS",
|
||
"mobileLead.count.absent": "ABSENTS",
|
||
"mobileLead.absentAlert.one": "⚠ 1 absent sur le créneau — il manque du monde",
|
||
"mobileLead.absentAlert.other": "⚠ {count} absents sur le créneau — il manque du monde",
|
||
"mobileLead.roll": "POINTAGE · {count} BÉNÉVOLE(S)",
|
||
"mobileLead.when.now": "Créneau en cours",
|
||
"mobileLead.when.next": "Début {time}",
|
||
"mobileLead.when.done": "Créneau terminé",
|
||
"mobileLead.call": "APPEL",
|
||
"mobileLead.callLabel": "Appeler {name}",
|
||
"mobileLead.message.title": "MESSAGE À TON ÉQUIPE",
|
||
"mobileLead.message.audience": "{count} bénévole(s) le verront",
|
||
"mobileLead.message.help": "Consignes du poste (tenue, matériel, point de rendez-vous…), affichées sur l'écran de chaque bénévole affecté au poste.",
|
||
"mobileLead.message.placeholder": "Ex. Gilet jaune fourni à la base bénévoles. Rendez-vous 10 min avant le début.",
|
||
"mobileLead.view.team": "Mon équipe",
|
||
"mobileLead.view.planning": "Mon planning · {count}",
|
||
"mobileLead.you": "TOI",
|
||
"mobileLead.markedAt": "pointé à {time}",
|
||
"mobileLead.attendanceError": "Le pointage n'a pas pu être enregistré (réseau ?). Réessaie.",
|
||
"mobileLead.noPosition": "Vous n'êtes actuellement référent d'aucun poste.",
|
||
"mobileLead.noShift": "Aucun créneau sur ce poste.",
|
||
"mobileLead.badgePresent": "✓ PRÉSENT",
|
||
"mobileLead.badgeAbsent": "✕ ABSENT",
|
||
"mobileLead.markPresent": "PRÉSENT",
|
||
"mobileLead.markAbsent": "ABSENT",
|
||
"mobileLead.emptyTeam": "Aucun bénévole affecté à ce créneau.",
|
||
"config.admin": "ADMINISTRATION",
|
||
"config.reserved": "RÉSERVÉ À LA COORDINATION",
|
||
"config.tab.grid": "POSTES & CRÉNEAUX",
|
||
"config.tab.volunteers": "BÉNÉVOLES & IMPORT",
|
||
"config.mail.test.title": "Tester l'envoi d'emails",
|
||
"config.mail.test.help": "Envoie tout de suite un email de test à l'adresse de votre choix, pour vérifier que les emails partent bien (liens de connexion, confirmations d'inscription, plannings).",
|
||
"config.mail.test.email": "Adresse de test",
|
||
"config.mail.test.placeholder": "moi@exemple.fr",
|
||
"config.mail.test.send": "Envoyer un email de test",
|
||
"config.mail.test.sending": "Envoi en cours…",
|
||
"config.mail.test.result.sent": "✓ Email envoyé. Vérifiez la boîte de réception (et les indésirables).",
|
||
"config.mail.test.result.disabled": "L'envoi d'emails est désactivé sur ce serveur (EMAIL_ENABLED=false) : rien n'a été envoyé.",
|
||
"config.mail.test.result.connection_failed": "✕ Connexion au serveur d'envoi impossible (adresse, port ou identifiants SMTP).",
|
||
"config.mail.test.result.rejected": "✕ Le serveur d'envoi a refusé l'email (souvent : expéditeur non autorisé).",
|
||
"config.mail.test.serverSaid": "Réponse du serveur : {detail}",
|
||
"config.mail.test.config": "Serveur {host} · expéditeur {from}",
|
||
"notifications.invalid_email": "Adresse email invalide.",
|
||
"config.tab.message": "MESSAGE AUX BÉNÉVOLES",
|
||
"config.message.orgTitle": "Message de l'organisation",
|
||
"config.message.orgHelp": "Le même pour tous les bénévoles, affiché en bas de leur écran planning. Laissez vide pour ne rien afficher.",
|
||
"config.message.orgPlaceholder": "Ex. Badges et t-shirts à récupérer à l'accueil bénévoles dès 17:00.",
|
||
"config.message.positionsTitle": "Messages des postes",
|
||
"config.message.positionsHelp": "Saisis par chaque référent depuis son écran et montrés aux bénévoles du poste. Vous pouvez aussi les modifier ici.",
|
||
"config.message.none": "Pas de message",
|
||
"config.tab.mail": "MESSAGES",
|
||
"config.tab.rules": "RÈGLES & ÉDITION",
|
||
"config.grid.positionsHeader": "POSTES · {count} CRÉNEAUX",
|
||
"config.grid.slotsCount": "{count} créneaux",
|
||
"config.grid.addPosition": "+ AJOUTER UN POSTE",
|
||
"config.grid.newPositionName": "Nouveau poste",
|
||
"config.grid.minTotal": "BESOIN MINIMUM · TOTAL",
|
||
"config.grid.idealTotal": "BESOIN IDÉAL · TOTAL",
|
||
"config.grid.min": "MIN",
|
||
"config.grid.ideal": "IDÉAL",
|
||
"config.grid.emptyDay": "Aucun créneau ce jour.",
|
||
"config.grid.deletePosition": "SUPPRIMER LE POSTE",
|
||
"config.grid.deletePositionConfirm": "Supprimer ce poste et tous ses créneaux ?",
|
||
"config.grid.generateShifts": "GÉNÉRER LES CRÉNEAUX",
|
||
"config.grid.generated": "{count} créneau(x) ajouté(s).",
|
||
"config.grid.shiftStart": "Début du créneau",
|
||
"config.grid.shiftEnd": "Fin du créneau",
|
||
"config.grid.addShift": "+ AJOUTER CE CRÉNEAU",
|
||
"config.grid.nightHint": "Une heure de début avant {boundary} compte pour la nuit qui suit (ex. 00:00 → après minuit, à la suite de la soirée de ce jour).",
|
||
"config.grid.note": "Un poste ne crée aucun créneau à sa création : ajoutez-les à la main (heure de début et de fin) sur chaque jour, ou utilisez « Générer les créneaux » pour repartir des créneaux types de l'édition. Effectifs, créneaux, nom et catégorie du poste sont enregistrés immédiatement via l'API. Pour ajouter ou retirer des jours, modifiez les dates de l'édition dans l'onglet « Règles & édition ».",
|
||
"config.vol.importTitle": "IMPORTER DES BÉNÉVOLES",
|
||
"config.vol.importHint": "Trois façons d'ajouter des bénévoles : saisie manuelle, import d'un fichier CSV / Excel, ou (à venir) le formulaire d'inscription en ligne.",
|
||
"config.vol.profiles": "PROFILS ENREGISTRÉS",
|
||
"config.vol.colName": "NOM",
|
||
"config.vol.colPhone": "TÉLÉPHONE",
|
||
"config.vol.colEmail": "EMAIL",
|
||
"config.vol.ficheKicker": "FICHE BÉNÉVOLE",
|
||
"config.vol.firstName": "PRÉNOM",
|
||
"config.vol.lastName": "NOM",
|
||
"config.vol.phone": "TÉLÉPHONE",
|
||
"config.vol.email": "EMAIL (LIEN MAGIQUE)",
|
||
"config.vol.delete": "SUPPRIMER",
|
||
"config.vol.deleteConfirm": "Supprimer définitivement ce bénévole et toutes ses données (affectations, vœux) ?",
|
||
"config.vol.note": "Modifications enregistrées immédiatement via l'API. La suppression est un effacement complet en cascade.",
|
||
"config.mail.smtpBanner": "Envoie un récapitulatif de planning à chaque bénévole. L'email part si le serveur SMTP est configuré (EMAIL_ENABLED) ; sinon il est seulement journalisé.",
|
||
"config.mail.templateTitle": "MODÈLE DE MESSAGE",
|
||
"config.mail.senderNote": "Expéditeur défini côté serveur (SMTP_FROM).",
|
||
"config.mail.subject": "OBJET",
|
||
"config.mail.body": "CORPS DU MESSAGE",
|
||
"config.mail.variables": "VARIABLES DISPONIBLES",
|
||
"config.mail.variablesHint": "Cliquer une variable l'ajoute au corps. {lien_connexion} insère un lien de connexion personnel.",
|
||
"config.mail.send": "ENVOYER LE RÉCAPITULATIF",
|
||
"config.mail.sendWithLink": "ENVOYER AVEC LIEN DE CONNEXION",
|
||
"config.mail.sending": "ENVOI EN COURS…",
|
||
"config.mail.sent": "Envoi lancé : {queued} email(s), {skipped} bénévole(s) sans adresse.",
|
||
"config.mail.loginLinkLine": "Accède à ton planning : {lien_connexion}",
|
||
"config.mail.previewTitle": "APERÇU",
|
||
"config.mail.previewSender": "DE : expéditeur configuré côté serveur",
|
||
"config.rules.editionTitle": "ÉDITION",
|
||
"config.rules.editionName": "Nom",
|
||
"config.rules.editionStart": "Premier jour",
|
||
"config.rules.editionEnd": "Dernier jour",
|
||
"config.rules.editionDays": "{count} jour(s)",
|
||
"config.rules.editionSave": "ENREGISTRER L'ÉDITION",
|
||
"config.rules.editionSaved": "Édition enregistrée.",
|
||
"config.rules.apiMode": "Mode API",
|
||
"config.rules.volunteersCount": "Bénévoles",
|
||
"config.rules.positionsCount": "Postes",
|
||
"config.rules.shiftsCount": "Créneaux",
|
||
"edition.dates_inconsistent": "La date de fin doit être postérieure ou égale à la date de début.",
|
||
"day_part.code_required": "Le libellé du créneau type est requis.",
|
||
"day_part.duplicate_code": "Un créneau type porte déjà ce libellé.",
|
||
"config.rules.slotsTitle": "CRÉNEAUX TYPES",
|
||
"config.rules.slotLabel": "Libellé",
|
||
"config.rules.slotAdd": "AJOUTER",
|
||
"config.rules.slotsNote": "Ces créneaux sont ajoutés à besoin 0/0 sur chaque jour à la création d'un poste. Après un ajout ici (ou une extension des dates), utilisez « Générer les créneaux » sur le poste.",
|
||
"config.rules.thresholdsTitle": "MOTEUR DE VALIDATION",
|
||
"config.rules.thresholdsNote": "Seule règle : le double emploi au même moment donne un avertissement, sans bloquer (un bénévole peut tenir deux postes à la fois) ; le solveur évite de le proposer. Aucune limite d'heures par journée ni de temps de repos.",
|
||
"config.rules.rulesTitle": "RÈGLES APPLIQUÉES",
|
||
"config.rules.rolesTitle2": "RÔLES ET ACCÈS",
|
||
"config.rules.roleCoordinator": "Coordination",
|
||
"config.rules.roleCoordinatorDesc": "Accès complet, construit et publie les plannings",
|
||
"config.rules.roleLead": "Référent de poste",
|
||
"config.rules.roleLeadDesc": "Lecture sur l'édition, écriture sur ses postes",
|
||
"config.rules.roleVolunteer": "Bénévole",
|
||
"config.rules.roleVolunteerDesc": "Ses seules données, lien magique par email",
|
||
"config.vol.addButton": "AJOUTER MANUELLEMENT",
|
||
"config.vol.importButton2": "IMPORTER UN FICHIER",
|
||
"config.vol.exportButton": "EXPORTER EN EXCEL",
|
||
"config.vol.exporting": "EXPORT…",
|
||
"config.vol.mecenatReceiptsButton": "REÇUS MÉCÉNAT (PDF)",
|
||
"config.vol.mecenatReceiptsHint": "Génère un PDF regroupant le reçu fiscal (cerfa) de chaque bénévole ayant payé sa cotisation en mécénat, avec ses coordonnées et le montant déjà remplis. Les informations de l'association (encadré du haut) restent à compléter à la main avant remise.",
|
||
"config.vol.search": "Rechercher un nom, un email…",
|
||
"config.vol.emptyList": "Aucun bénévole pour l'instant. Ajoutez-en un ou importez un fichier.",
|
||
"config.vol.noMatch": "Aucun bénévole ne correspond à la recherche.",
|
||
"config.vol.count": "{count} bénévole(s)",
|
||
"config.vol.cancel": "ANNULER",
|
||
"config.vol.field.firstName": "Prénom",
|
||
"config.vol.field.lastName": "Nom",
|
||
"config.vol.field.email": "Email (lien magique)",
|
||
"config.vol.field.phone": "Téléphone",
|
||
"config.vol.field.comment": "Commentaire",
|
||
"config.vol.field.badgeText": "Texte du badge",
|
||
"config.vol.field.badgeCount": "Nombre de badges",
|
||
"config.vol.field.badgeCount.help": "Nombre d'exemplaires de son badge imprimés sur les planches (1 à 100). 1 par défaut.",
|
||
"config.vol.field.badgeText.help": "Remplace, pour ce bénévole seulement, le texte libre commun saisi dans l'écran Badges. Vide = texte commun.",
|
||
"config.vol.photo.title": "Photo",
|
||
"config.vol.photo.hint": "Imprimée sur le badge (champ « Photo du bénévole ») et affichée sur les écrans bénévole et référent. Celle envoyée au formulaire d'inscription, ou ajoutée ici. PNG ou JPEG.",
|
||
"config.vol.photo.none": "Aucune photo",
|
||
"config.vol.photo.add": "Ajouter une photo",
|
||
"config.vol.photo.replace": "Remplacer la photo",
|
||
"config.vol.photo.remove": "Retirer",
|
||
"config.vol.photo.removeConfirm": "Retirer la photo de ce bénévole ?",
|
||
"config.vol.access.title": "Accès de connexion",
|
||
"config.vol.access.hint": "Un email sur la fiche ne suffit pas à lui seul : sans un accès donné ici, le bénévole ne reçoit jamais de lien de connexion.",
|
||
"config.vol.access.grant": "Donner un accès de connexion",
|
||
"config.vol.access.active": "Accès actif : {email}",
|
||
"config.vol.access.revoke": "Révoquer",
|
||
"config.vol.access.revokeConfirm": "Révoquer l'accès de connexion de ce bénévole ?",
|
||
"config.vol.access.needEmail": "Renseignez un email ci-dessus pour pouvoir donner un accès.",
|
||
"config.vol.field.referentPositions": "Référent des postes",
|
||
"config.vol.referentHint": "Cocher un poste crée ou met à niveau son accès de connexion en référent : à sa prochaine connexion, il verra l'écran référent (son équipe, le pointage) au lieu de l'écran bénévole. Décocher retire seulement le poste, sans jamais rétrograder l'accès automatiquement.",
|
||
"config.vol.referentIsCoordinator": "Ce bénévole a un compte coordination : il a déjà accès à tous les postes, inutile de le désigner référent.",
|
||
"config.vol.referentNeedsEmail": "Renseignez un email sur la fiche pour pouvoir désigner ce bénévole référent.",
|
||
"config.vol.addTitle": "NOUVEAU BÉNÉVOLE",
|
||
"config.vol.addHint": "Renseigner un email ne donne pas d'accès à lui seul : une fois le bénévole créé, utilisez « Donner un accès de connexion » sur sa fiche.",
|
||
"config.vol.create": "CRÉER LE BÉNÉVOLE",
|
||
"config.vol.wiz.title": "IMPORTER UN FICHIER",
|
||
"config.vol.wiz.step1": "1 · FICHIER",
|
||
"config.vol.wiz.step2": "2 · COLONNES",
|
||
"config.vol.wiz.step3": "3 · APERÇU & IMPORT",
|
||
"config.vol.wiz.pickFile": "CHOISIR UN FICHIER CSV OU EXCEL",
|
||
"config.vol.wiz.fileHint": "Une ligne par bénévole. La première ligne contient les intitulés de colonnes. En mode démonstration, seuls les fichiers CSV sont pris en charge.",
|
||
"config.vol.wiz.analyzing": "Analyse du fichier…",
|
||
"config.vol.wiz.detected": "{rows} ligne(s) · {cols} colonne(s) détectée(s)",
|
||
"config.vol.wiz.preview": "APERÇU DES PREMIÈRES LIGNES",
|
||
"config.vol.wiz.mapTitle": "ASSOCIER LES COLONNES",
|
||
"config.vol.wiz.mapHint": "« Prénom » et « Nom » sont obligatoires. Laissez « — » pour ignorer une colonne.",
|
||
"config.vol.wiz.ignore": "—",
|
||
"config.vol.wiz.mapMissing": "Associez au moins les colonnes « Prénom » et « Nom ».",
|
||
"config.vol.wiz.simulate": "SIMULER",
|
||
"config.vol.wiz.runImport": "IMPORTER POUR DE VRAI",
|
||
"config.vol.wiz.back": "RETOUR",
|
||
"config.vol.wiz.next": "SUIVANT",
|
||
"config.vol.wiz.dryRunTitle": "SIMULATION — RIEN N'A ÉTÉ ENREGISTRÉ",
|
||
"config.vol.wiz.doneTitle": "IMPORT TERMINÉ",
|
||
"config.vol.wiz.created": "{count} créé(s)",
|
||
"config.vol.wiz.updated": "{count} mis à jour",
|
||
"config.vol.wiz.skipped": "{count} ignoré(s)",
|
||
"config.vol.wiz.rowsWithIssues": "LIGNES AVEC REMARQUES",
|
||
"config.vol.wiz.line": "Ligne {line}",
|
||
"config.vol.wiz.noIssues": "Aucune remarque : tout est prêt à être importé.",
|
||
"config.vol.wiz.close": "FERMER",
|
||
"import.error.empty_file": "Le fichier est vide.",
|
||
"import.error.encoding": "L'encodage du fichier n'est pas reconnu.",
|
||
"import.error.unreadable_file": "Fichier illisible ou format non pris en charge.",
|
||
"import.error.file_too_large": "Le fichier est trop volumineux (5 Mo maximum).",
|
||
"import.error.xlsx_demo_only": "En mode démonstration, l'import Excel n'est pas disponible : exportez votre fichier en CSV.",
|
||
"import.mapping.invalid": "Le paramétrage des colonnes est invalide.",
|
||
"import.mapping.required_field_missing": "Le champ « {field} » doit être associé à une colonne.",
|
||
"import.mapping.column_not_found": "La colonne « {column} » est absente du fichier.",
|
||
"import.row.missing_required_field": "Champ obligatoire manquant : {field}.",
|
||
"import.row.invalid_email": "Adresse email invalide : {value}.",
|
||
"import.row.duplicate_email_in_file": "Même bénévole (nom et email) déjà présent à la ligne {first_line} du fichier.",
|
||
"import.row.shared_email": "Email déjà utilisé par un autre bénévole à la ligne {first_line} du fichier.",
|
||
"import.row.duplicate_name_in_file": "Nom et prénom déjà présents à la ligne {first_line} du fichier.",
|
||
"import.row.updated_existing": "Bénévole existant mis à jour.",
|
||
"import.row.possible_duplicate_name": "Un bénévole portant le même nom existe déjà dans l’édition.",
|
||
"config.tab.artists": "PROGRAMMATION",
|
||
"config.artists.title": "PROGRAMMATION",
|
||
"config.artists.hint": "La liste des artistes de l'édition, jour par jour. Les bénévoles y choisissent ceux qu'ils veulent voir depuis leur fiche.",
|
||
"config.artists.count": "ARTISTES",
|
||
"config.artists.empty": "Aucun artiste ce jour.",
|
||
"config.artists.outside": "hors dates",
|
||
"config.artists.namePlaceholder": "Nom de l'artiste",
|
||
"config.vol.field.artists": "Artistes à voir",
|
||
"config.vol.field.positions": "Postes souhaités",
|
||
"config.vol.field.companions": "Bénévoles souhaités",
|
||
"config.vol.companionsHint": "Bénévoles avec qui il voudrait être affecté (à sens unique). Le solveur privilégie un candidat dont l'un des compagnons souhaités est déjà sur le créneau.",
|
||
"config.vol.noArtists": "Aucun artiste choisi",
|
||
"config.vol.noPositions": "Aucun poste choisi",
|
||
"config.vol.noCompanions": "Aucun bénévole choisi",
|
||
"config.vol.pickCompanion": "Ajouter un bénévole…",
|
||
"config.vol.searchCompanion": "Rechercher un bénévole…",
|
||
"config.vol.publicForm.title": "Formulaire public",
|
||
"config.vol.publicForm.hint": "Réponses saisies par le bénévole lui-même via le formulaire public d'inscription.",
|
||
"config.vol.colWishes": "VŒUX",
|
||
"config.vol.colFee": "COTISATION",
|
||
"config.vol.fee.title": "Cotisation",
|
||
"config.vol.fee.online": "Paiement en ligne (SumUp)",
|
||
"config.vol.fee.mecenat": "Mécénat — reçu fiscal",
|
||
"config.vol.fee.onSite": "Paiera sur place",
|
||
"config.vol.fee.none": "aucune cotisation déclarée",
|
||
"config.vol.fee.paidAt": "Payée le",
|
||
"config.vol.fee.transaction": "Transaction SumUp",
|
||
"config.vol.fee.transactionHint": "Code de la transaction tel qu'affiché dans le tableau de bord SumUp : recherchez-le là-bas pour retrouver ce paiement. Côté SumUp, la description de la transaction porte aussi le nom du bénévole.",
|
||
"config.vol.fee.transactionUnknown": "non enregistrée (paiement antérieur à ce suivi)",
|
||
"config.vol.fee.transactionId": "Identifiant",
|
||
"config.vol.fee.onSiteShort": "Sur place",
|
||
"config.vol.fee.onlineShort": "En ligne",
|
||
"config.vol.fee.mecenatShort": "Mécénat",
|
||
"config.vol.fee.short.pending": "en attente",
|
||
"config.vol.fee.short.paid": "payée",
|
||
"config.vol.fee.short.failed": "échouée",
|
||
"config.vol.fee.short.expired": "expirée",
|
||
"config.vol.wishesCount": "{count} vœu(x)",
|
||
"grille.solver.run": "SUGGESTIONS (SOLVEUR)",
|
||
"grille.solver.running": "CALCUL EN COURS…",
|
||
"grille.solver.result": "{count} suggestion(s)",
|
||
"grille.sheets.generate": "FEUILLES DE POSTE",
|
||
"grille.sheets.generating": "GÉNÉRATION…",
|
||
"grille.panel.suggested": "Suggéré",
|
||
"config.artists.startTime": "Heure de début du passage",
|
||
"config.artists.endTime": "Heure de fin du passage",
|
||
"grille.panel.wishesPosition": "Vœu de poste",
|
||
"grille.panel.artistConflict": "Manquerait un artiste souhaité",
|
||
"grille.panel.withCompanion": "Avec {count} compagnon(s) souhaité(s)",
|
||
|
||
"badges.admin": "PLANCHES DE BADGES",
|
||
"badges.tab.customize": "PERSONNALISER",
|
||
"badges.tab.generate": "GÉNÉRER",
|
||
"badges.front": "Recto",
|
||
"badges.front.help": "Fond personnalisable + champs positionnables (nom, postes avec horaires, catégorie, rôle, photo, texte libre). Le format du badge est celui de cette image (300 dpi supposés). Propre à cette édition.",
|
||
"badges.back": "Verso",
|
||
"badges.back.help": "Une seule image, la même pour tous les badges de cette édition — ajustée au format défini par le recto.",
|
||
"badges.fields": "Champs du recto",
|
||
"badges.field.fullName": "Prénom + nom",
|
||
"badges.field.fullName.placeholder": "Prénom Nom",
|
||
"badges.field.positions": "Créneaux affectés (tableau)",
|
||
"badges.field.positions.placeholder": "Bar central 19:00–22:00\nAccueil 09:00–13:00 (Référent : Sam Nuit)",
|
||
"badges.field.positions.sample1.day": "Vendredi 10",
|
||
"badges.field.positions.sample1.rows": "18:00–22:00|Bar central",
|
||
"badges.field.positions.sample2.day": "Samedi 11",
|
||
"badges.field.positions.sample2.rows": "09:00–13:00|Accueil\n23:00–01:00|Bar central",
|
||
"badges.field.category": "Catégorie",
|
||
"badges.field.category.placeholder": "Bar",
|
||
"badges.field.role": "Rôle (référent / bénévole)",
|
||
"badges.field.role.placeholder": "Référent",
|
||
"badges.field.photo": "Photo du bénévole",
|
||
"badges.field.photo.placeholder": "Photo",
|
||
"badges.field.photo.help": "La photo du bénévole (envoyée avec le formulaire d'inscription ou ajoutée sur sa fiche), recadrée au format du cadre. Rien n'est imprimé pour un bénévole sans photo.",
|
||
"badges.field.freeText": "Texte libre",
|
||
"badges.field.freeText.placeholder": "Accès backstage",
|
||
"badges.field.freeText.help": "Texte saisi ci-dessous, imprimé sur tous les badges. Pour un bénévole en particulier, le « Texte du badge » de sa fiche (Configuration › Bénévoles) le remplace.",
|
||
"badges.field.freeText.input": "Texte à imprimer (ex. STAFF 2026)",
|
||
"badges.field.size": "Taille",
|
||
"badges.editor.hint": "Badge {width} × {height} mm. Glissez un champ pour le déplacer, tirez son coin bas-droit pour le redimensionner.",
|
||
"badges.size.width": "Largeur du badge (mm)",
|
||
"badges.size.height": "× {height} mm (hauteur proportionnelle)",
|
||
"badges.image.choose": "Choisir une image",
|
||
"badges.image.replace": "Remplacer l'image",
|
||
"badges.uploading": "Envoi…",
|
||
"badges.save": "Enregistrer",
|
||
"badges.saving": "Enregistrement…",
|
||
"badges.saved": "Enregistré ✓",
|
||
"badges.generate.title": "Génération de la planche PDF",
|
||
"badges.generate.all": "Tous les bénévoles ({count})",
|
||
"badges.generate.total": "{count} badge(s) à imprimer",
|
||
"badges.generate.pick": "Choisir ({count} sélectionné(s))",
|
||
"badges.generate.action": "Générer le PDF",
|
||
"badges.generating": "Génération…",
|
||
"badges.face.front": "Recto",
|
||
"badges.face.back": "Verso",
|
||
"badges.face.front.short": "recto",
|
||
"badges.face.back.short": "verso",
|
||
"badges.dims": "{width} × {height} mm",
|
||
"badges.drop.front": "Déposez ici le visuel du recto (PNG ou JPEG)",
|
||
"badges.drop.back": "Déposez ici le visuel du verso (PNG ou JPEG)",
|
||
"badges.format.title": "Format du badge",
|
||
"badges.format.current": "Format actuel",
|
||
"badges.preset.cr80Portrait": "Carte CR80 portrait",
|
||
"badges.preset.cr80Landscape": "Carte CR80 paysage",
|
||
"badges.preset.a7": "A7 tour de cou",
|
||
"badges.fieldsOf": "Champs du {face}",
|
||
"badges.fieldsShown": "{count} affiché(s)",
|
||
"badges.layer.toggle": "Afficher / masquer",
|
||
"badges.layer.hidden": "masqué",
|
||
"badges.layer.meta": "{size} pt · {weight}",
|
||
"badges.layer.bold": "gras",
|
||
"badges.layer.regular": "normal",
|
||
"badges.layer.rect": "rectangle",
|
||
"badges.layer.oval": "ovale",
|
||
"badges.layer.issueCount": "▲ {count}",
|
||
"badges.layer.issueTruncated.one": "{count} badge avec texte coupé",
|
||
"badges.layer.issueTruncated.other": "{count} badges avec texte coupé",
|
||
"badges.layer.issueReduced.one": "{count} badge réduit automatiquement",
|
||
"badges.layer.issueReduced.other": "{count} badges réduits automatiquement",
|
||
"badges.keys.hint": "Clic sur un champ pour le régler. Flèches : déplacer de 0,5 mm. Maj + flèches : 2 mm. Échap : désélectionner. Ctrl/Cmd + Z : annuler.",
|
||
"badges.undo": "↶ Annuler",
|
||
"badges.undo.title": "Ctrl/Cmd + Z",
|
||
"badges.dirty": "Modifications non enregistrées",
|
||
"badges.clean": "✓ Enregistré",
|
||
"badges.savedAt": "✓ Enregistré à {time}",
|
||
"badges.sample.firstName": "Prénom",
|
||
"badges.sample.lastName": "Nom",
|
||
"badges.preview.with": "Aperçu avec",
|
||
"badges.preview.prev": "Bénévole précédent",
|
||
"badges.preview.next": "Bénévole suivant",
|
||
"badges.preview.counter": "Badge {index} / {total} · {role}",
|
||
"badges.preview.noVolunteer": "Aucun bénévole : exemple fictif",
|
||
"badges.preview.longest": "Tester le nom le plus long",
|
||
"badges.preview.guides": "Repères",
|
||
"badges.preview.guides.help": "Affiche la marge de découpe (1,5 mm) et le cadre de chaque champ",
|
||
"badges.preview.zoomIn": "Agrandir l'aperçu",
|
||
"badges.preview.zoomOut": "Réduire l'aperçu",
|
||
"badges.preview.zoom": "{percent} %",
|
||
"badges.preview.noPhoto": "sans photo",
|
||
"badges.preview.truncated": "▲ TEXTE COUPÉ",
|
||
"badges.preview.dims": "{width} × {height} mm",
|
||
"badges.preview.reducedTo": " · réduit à {size} pt",
|
||
"badges.pt": "{size} pt",
|
||
"badges.color.white": "Blanc",
|
||
"badges.color.black": "Noir",
|
||
"badges.color.yellow": "Jaune",
|
||
"badges.color.coral": "Corail",
|
||
"badges.color.none": "Aucun",
|
||
"badges.color.custom": "Autre",
|
||
"badges.align.left": "Gauche",
|
||
"badges.align.center": "Centre",
|
||
"badges.align.right": "Droite",
|
||
"badges.inspector.kicker": "{face} · champ sélectionné",
|
||
"badges.inspector.content": "Contenu",
|
||
"badges.inspector.contentHelp": "Identique sur tous les badges — sauf pour un bénévole dont la fiche porte un « Texte du badge », qui le remplace.",
|
||
"badges.inspector.fontSize": "Taille du texte",
|
||
"badges.inspector.reducedHere": "Ici réduit à {size} pt",
|
||
"badges.inspector.capHeight": "Hauteur ≈ {mm} mm",
|
||
"badges.inspector.smaller": "Diminuer la taille",
|
||
"badges.inspector.larger": "Augmenter la taille",
|
||
"badges.inspector.autoFit": "Réduire automatiquement si le texte est trop long",
|
||
"badges.inspector.align": "Alignement",
|
||
"badges.inspector.weight": "Graisse",
|
||
"badges.inspector.regular": "Normal",
|
||
"badges.inspector.bold": "Gras",
|
||
"badges.inspector.textColor": "Couleur du texte",
|
||
"badges.inspector.background": "Fond de la zone",
|
||
"badges.inspector.lowContrast": "⚠ Contraste faible : le texte risque d'être illisible à l'impression.",
|
||
"badges.inspector.photoShape": "Forme de la photo",
|
||
"badges.inspector.photoRect": "▢ Rectangle",
|
||
"badges.inspector.photoOval": "◯ Ovale",
|
||
"badges.inspector.photoStat": "{count} photo(s) reçue(s) sur {total}. Sans photo, le cadre reste vide.",
|
||
"badges.inspector.geometry": "Position et taille (mm)",
|
||
"badges.inspector.x": "X",
|
||
"badges.inspector.y": "Y",
|
||
"badges.inspector.w": "L",
|
||
"badges.inspector.h": "H",
|
||
"badges.inspector.center": "↔ Centrer",
|
||
"badges.inspector.fullWidth": "⇤⇥ Pleine largeur",
|
||
"badges.inspector.stack": "Superposition",
|
||
"badges.inspector.stack.position": "{rank} / {total} · 1 = dessus",
|
||
"badges.inspector.stack.front": "⤒ Premier plan",
|
||
"badges.inspector.stack.forward": "↑ Avancer",
|
||
"badges.inspector.stack.backward": "↓ Reculer",
|
||
"badges.inspector.stack.back": "⤓ Arrière-plan",
|
||
"badges.inspector.stack.help": "Quand des champs se chevauchent, celui du dessus recouvre les autres, sur l'aperçu comme à l'impression.",
|
||
"badges.inspector.hide": "Masquer ce champ",
|
||
"badges.inspector.empty.title": "Sélectionnez un champ sur le badge ou dans la liste de gauche.",
|
||
"badges.inspector.empty.hint": "Faites-le glisser pour le déplacer, tirez le carré jaune pour le redimensionner. Ses réglages apparaissent ici.",
|
||
"badges.inspector.empty.drop": "Pour changer le visuel de fond, déposez une image directement sur le recto ou le verso.",
|
||
"badges.check.title": "Contrôle des {count} badges",
|
||
"badges.check.subtitle": "Avant génération des planches",
|
||
"badges.check.critical": "⛔ À corriger",
|
||
"badges.check.warning": "⚠ À vérifier",
|
||
"badges.check.fixAutoFit": "Activer la réduction auto",
|
||
"badges.check.showExample": "Voir un exemple",
|
||
"badges.check.ok": "Les {count} badges s'affichent sans texte coupé ni champ hors zone de découpe.",
|
||
"badges.check.estimate": "Estimation faite dans le navigateur : le PDF généré reste la référence.",
|
||
"badges.issue.where": "{field} ({face})",
|
||
"badges.issue.truncated.one": "{where} : texte coupé sur {count} badge.",
|
||
"badges.issue.truncated.other": "{where} : texte coupé sur {count} badges.",
|
||
"badges.issue.reduced.one": "{where} : réduit automatiquement sur {count} badge, jusqu'à {size} pt.",
|
||
"badges.issue.reduced.other": "{where} : réduit automatiquement sur {count} badges, jusqu'à {size} pt.",
|
||
"badges.issue.margin": "{where} : touche la marge de découpe (1,5 mm), risque d'être rogné.",
|
||
"badges.issue.contrast": "{where} : texte et fond de zone trop proches, illisible.",
|
||
"badges.issue.noPhoto.one": "{count} bénévole n'a pas de photo : le cadre restera vide sur son badge.",
|
||
"badges.issue.noPhoto.other": "{count} bénévoles n'ont pas de photo : le cadre restera vide sur leur badge.",
|
||
"badge.image_type_not_supported": "L'image doit être au format PNG ou JPEG.",
|
||
"badge.empty_image": "L'image est vide.",
|
||
"badge.image_too_large": "L'image est trop volumineuse.",
|
||
"badge.duplicate_field_type": "Ce champ ne peut apparaître qu'une fois par face.",
|
||
"badge.invalid_color": "Couleur invalide (format attendu : #rrggbb).",
|
||
"badge.invalid_size": "La taille du badge doit être strictement positive.",
|
||
"badge.no_fields": "Activez au moins un champ sur le recto avant de générer.",
|
||
"badge.no_volunteers": "Aucun bénévole ne correspond à cette sélection.",
|
||
|
||
"tab.forms": "Inscriptions",
|
||
"tab.stats": "Statistiques",
|
||
"stats.kpi.registered": "Bénévoles inscrits · +{count} en 7 jours",
|
||
"stats.kpi.collected": "Cotisations encaissées en ligne",
|
||
"stats.kpi.coverage": "Places pourvues · {assigned} / {ideal}",
|
||
"stats.kpi.withAssignment": "Ont au moins une affectation · sur {total}",
|
||
"stats.attendance.title": "Présence",
|
||
"stats.attendance.help": "Présents et absents pointés par les référents sur leur écran, par poste. « En ce moment » : créneaux commencés et pas encore finis ; « Créneaux terminés » : tout ce qui est fini. Les créneaux à venir ne comptent pas. Mis à jour toutes les 30 secondes.",
|
||
"stats.attendance.live": "En ce moment",
|
||
"stats.attendance.past": "Créneaux terminés",
|
||
"stats.attendance.asOf": "mis à jour à {time}",
|
||
"stats.attendance.noLive": "Aucun créneau en cours.",
|
||
"stats.attendance.noPast": "Aucun créneau terminé pour l'instant.",
|
||
"stats.attendance.liveSummary": "{shifts} créneau(x) en cours · {expected} bénévole(s) attendu(s)",
|
||
"stats.attendance.shiftsCount": "{count} en cours",
|
||
"stats.attendance.expected": "Attendus",
|
||
"stats.attendance.present": "Présents",
|
||
"stats.attendance.absent": "Absents",
|
||
"stats.attendance.unmarked": "Non pointés",
|
||
"stats.attendance.rate": "Présence",
|
||
"stats.attendance.rateTip": "{present} présent(s) sur {marked} pointé(s)",
|
||
"stats.attendance.unmarkedHint": "{count} affectation(s) sur des créneaux terminés n'ont jamais été pointées : le taux de présence ne porte que sur les bénévoles pointés.",
|
||
"stats.empty": "Aucun bénévole inscrit pour l'instant.",
|
||
"stats.showTable": "Voir le tableau",
|
||
"stats.unit.hours": "h",
|
||
"stats.registrations.title": "Évolution des inscriptions",
|
||
"stats.registrations.help": "Nombre cumulé de bénévoles en base, par jour d'ajout (formulaire public, import ou ajout à la main).",
|
||
"stats.registrations.cumulative": "inscrits au total",
|
||
"stats.registrations.daily": "nouveaux ce jour",
|
||
"stats.answers.title": "Réponses",
|
||
"stats.answers.help": "Part des bénévoles ayant renseigné chaque information (formulaire public ou fiche).",
|
||
"stats.answers.email": "Email",
|
||
"stats.answers.phone": "Téléphone",
|
||
"stats.answers.available": "Case « disponible »",
|
||
"stats.answers.positionWishes": "Vœux de poste",
|
||
"stats.answers.artistWishes": "Vœux d'artiste",
|
||
"stats.answers.companionWishes": "Vœux de compagnon",
|
||
"stats.answers.companionNote": "Compagnon (texte libre)",
|
||
"stats.answers.photo": "Photo",
|
||
"stats.answers.comment": "Commentaire",
|
||
"stats.artists.title": "Artistes que les bénévoles veulent voir",
|
||
"stats.payments.title": "Cotisations",
|
||
"stats.payments.help": "En ligne : paiement SumUp confirmé. Sur place : « je paierai sur place » ou case cotisation cochée sans paiement en ligne.",
|
||
"stats.payments.online": "En ligne",
|
||
"stats.payments.onSite": "Sur place",
|
||
"stats.payments.none": "Aucune",
|
||
"stats.payments.byOption": "Paiements en ligne par type",
|
||
"stats.payments.noOnline": "Aucun paiement en ligne pour l'instant.",
|
||
"stats.payments.mecenatTag": "mécénat",
|
||
"stats.payments.total": "Total",
|
||
"stats.payments.mecenat": "Dont mécénat : {count} don(s), {amount} (reçus fiscaux).",
|
||
"stats.payments.unfinished": "{count} formulaire(s) rempli(s) sans paiement abouti : ces personnes ne sont pas comptées parmi les bénévoles (paiement refusé, abandonné ou expiré).",
|
||
"stats.needs.title": "Besoins et bénévoles",
|
||
"stats.needs.help": "Heures × personnes demandées par les créneaux, face aux heures déjà affectées — par journée de festival (une soirée qui passe minuit compte pour le jour où elle commence).",
|
||
"stats.needs.empty": "Aucun créneau défini pour l'instant.",
|
||
"stats.needs.byDay": "Par jour (heures × personnes)",
|
||
"stats.needs.byPosition": "Par poste (places = personnes × créneaux)",
|
||
"stats.needs.min": "Besoin minimal",
|
||
"stats.needs.ideal": "Besoin idéal",
|
||
"stats.needs.assigned": "Déjà affecté",
|
||
"stats.needs.filledWithExtra": "{filled} / {ideal} (+{extra} en sureffectif)",
|
||
"stats.needs.wishesHint": "Pourvues : places occupées, plafonnées à l'effectif idéal de chaque créneau (« +2 » = bénévoles en sureffectif, non comptés). Vœux / place : nombre de bénévoles qui ont demandé le poste, rapporté aux places idéales. En dessous de 1, le poste aura besoin de bénévoles qui ne l'ont pas choisi.",
|
||
"stats.col.date": "Date",
|
||
"stats.col.day": "Jour",
|
||
"stats.col.answer": "Information",
|
||
"stats.col.volunteers": "Bénévoles",
|
||
"stats.col.share": "Part",
|
||
"stats.col.artist": "Artiste",
|
||
"stats.col.paymentType": "Type de paiement",
|
||
"stats.col.amount": "Montant",
|
||
"stats.col.shifts": "Créneaux",
|
||
"stats.col.position": "Poste",
|
||
"stats.col.minSlots": "Places min.",
|
||
"stats.col.idealSlots": "Places idéales",
|
||
"stats.col.filled": "Pourvues",
|
||
"stats.col.wishes": "Vœux",
|
||
"stats.col.wishesPerSlot": "Vœux / place",
|
||
"form.field.email": "Email",
|
||
"form.field.phone": "Téléphone",
|
||
"form.field.positionWishes": "Vœux de poste",
|
||
"form.field.positionWishes.help": "Deux vœux au maximum, pour forcer une vraie priorisation.",
|
||
"form.field.artistWishes": "Concert(s) à voir",
|
||
"form.field.artistWishes.help": "Un seul artiste souhaité par soir de festival.",
|
||
"form.field.companionWish": "Collègue apprécié",
|
||
"form.field.companionWish.help": "Texte libre : la personne visée n'est pas forcément déjà inscrite. À résoudre ensuite depuis sa fiche.",
|
||
"form.field.available": "Case « je suis disponible »",
|
||
"form.field.available.help": "Purement informatif — simple case à cocher, sans effet sur les affectations.",
|
||
"form.field.willingToPayFee": "Case « je veux bien payer une cotisation »",
|
||
"config.vol.feeStatus.pending": "Cotisation : paiement en attente",
|
||
"config.vol.feeStatus.paid": "Cotisation payée ✓",
|
||
"config.vol.feeStatus.failed": "Cotisation : paiement échoué",
|
||
"config.vol.feeStatus.expired": "Cotisation : lien de paiement expiré",
|
||
"config.vol.mecenatAddress": "Adresse (cerfa)",
|
||
"form.field.photo": "Une magnifique photo de toi pour ton badge :",
|
||
"form.field.comment": "Commentaire",
|
||
"form.link.title": "Lien du formulaire",
|
||
"form.link.hint": "À partager aux bénévoles potentiels — n'importe qui muni du lien peut s'inscrire, mais lui seul : sans ce lien précis, impossible de tomber sur le formulaire.",
|
||
"form.link.copy": "Copier",
|
||
"form.link.copied": "Copié ✓",
|
||
"form.link.regenerate": "Régénérer le lien",
|
||
"form.link.regenerate.help": "Remplace le lien par un nouveau — utile si l'ancien a fuité. L'ancien lien cesse aussitôt de fonctionner ; il faudra repartager le nouveau.",
|
||
"form.status.title": "Inscriptions",
|
||
"form.status.open": "OUVERTES",
|
||
"form.status.closed": "FERMÉES",
|
||
"form.fields.title": "Champs du formulaire",
|
||
"form.save": "Enregistrer",
|
||
"form.saving": "Enregistrement…",
|
||
"form.saved": "Enregistré ✓",
|
||
"form.customize.title": "Personnalisation",
|
||
"form.customize.logo": "Logo",
|
||
"form.customize.logo.choose": "Choisir une image",
|
||
"form.customize.logo.replace": "Remplacer",
|
||
"form.customize.logo.uploading": "Envoi…",
|
||
"form.customize.description": "Texte d'introduction",
|
||
"form.customize.description.placeholder": "Un mot de bienvenue affiché en haut du formulaire (facultatif)…",
|
||
"form.customize.sumup.title": "Paiement de la cotisation (SumUp)",
|
||
"form.customize.sumup.help": "Facultatif : identifiants de votre compte marchand SumUp, et au moins un type de paiement ci-dessous (libellé + montant, ex. « Cotisation classique », « Mécénat »). Une fois les deux renseignés, le bénévole choisit un type à l'inscription et se voit proposer un lien de paiement juste après.",
|
||
"form.customize.sumup.merchantCode": "Code marchand",
|
||
"form.customize.sumup.merchantCode.placeholder": "MXXXXXXX",
|
||
"form.customize.sumup.apiKey": "Clé API",
|
||
"form.customize.sumup.apiKey.set": "(déjà enregistrée)",
|
||
"form.customize.sumup.apiKey.placeholder": "sup_sk_...",
|
||
"form.customize.paymentOptions.title": "Types de paiement",
|
||
"form.customize.paymentOptions.label": "Libellé (ex. Cotisation classique, Mécénat…)",
|
||
"form.customize.paymentOptions.active": "✓ Actif : le formulaire propose ces types de paiement (paiement en ligne SumUp, étape d'adresse pour le mécénat).",
|
||
"form.customize.paymentOptions.inactive.noCredentials": "⚠ Inactif : renseignez le code marchand et la clé API SumUp ci-dessus. En attendant, le formulaire n'affiche qu'une case « cotisation » à cocher : pas de choix du type de paiement, pas d'étape mécénat, pas de paiement en ligne.",
|
||
"form.customize.paymentOptions.inactive.noOptions": "⚠ Inactif : ajoutez au moins un type de paiement ci-dessous. En attendant, le formulaire n'affiche qu'une case « cotisation » à cocher.",
|
||
"form.customize.paymentOptions.add": "Ajouter",
|
||
"form.customize.paymentOptions.mecenat": "Mécénat",
|
||
"form.customize.paymentOptions.free": "Montant libre",
|
||
"form.customize.paymentOptions.free.help": "Le bénévole choisit lui-même son montant ; le montant indiqué ici devient le minimum.",
|
||
"form.customize.paymentOptions.mecenat.help": "Avant de payer, le bénévole passe par une étape d'adresse postale (reçu fiscal / cerfa).",
|
||
|
||
"publicForm.title": "Inscription bénévole",
|
||
"publicForm.positionWishes.count": "{count} / {max}",
|
||
"publicForm.artistWishes.none": "— Aucun —",
|
||
"publicForm.field.available": "Je suis bénévole les deux jours (vendredi 30 et samedi 31 oct.)",
|
||
"publicForm.field.willingToPayFee": "Je participe à la cotisation bénévole",
|
||
"publicForm.field.paymentOption": "Cotisation",
|
||
"publicForm.paymentOption.from": "{label} — à partir de {amount} €",
|
||
"publicForm.freeAmount.label": "Montant de ta contribution (€)",
|
||
"publicForm.freeAmount.hint": "Minimum {min} €.",
|
||
"publicForm.paymentOption.onSite": "Je paierai sur place",
|
||
"publicForm.photo.squareHint": "Recadrée automatiquement en carré.",
|
||
"publicForm.sumup.afterSubmitHint": "Un lien de paiement en ligne (SumUp) te sera proposé juste après l'envoi de ton inscription.",
|
||
"publicForm.captcha.disabled": "(Vérification anti-robot non configurée sur cette instance.)",
|
||
"publicForm.submitting": "Envoi…",
|
||
"publicForm.requiredLegend": "champ obligatoire",
|
||
"publicForm.submit": "Envoyer mon inscription",
|
||
"publicForm.success.title": "Inscription reçue",
|
||
"publicForm.success.body": "Merci ! Ton inscription a bien été enregistrée. La coordination du festival prendra contact avec toi.",
|
||
"publicForm.closed.title": "Inscriptions fermées",
|
||
"publicForm.closed.body": "Les inscriptions bénévoles ne sont pas ouvertes pour le moment. Reviens un peu plus tard !",
|
||
|
||
"publicForm.mecenat.title": "Reçu fiscal (mécénat)",
|
||
"publicForm.mecenat.hint": "Ces informations servent uniquement à établir ton reçu fiscal (cerfa) une fois le paiement effectué.",
|
||
"publicForm.mecenat.afterSubmitHint": "Une étape supplémentaire (adresse) te sera proposée juste après l'envoi de ton inscription, pour établir ton reçu fiscal.",
|
||
"publicForm.mecenat.address": "Adresse",
|
||
"publicForm.mecenat.city": "Ville",
|
||
"publicForm.mecenat.postalCode": "Code postal",
|
||
"publicForm.mecenat.country": "Pays",
|
||
"publicForm.mecenat.submit": "Continuer vers le paiement",
|
||
|
||
"publicForm.retry.title": "Paiement indisponible",
|
||
"publicForm.retry.body": "Le paiement en ligne n'a pas pu être initié pour le moment. Tes informations sont conservées : réessaie dans quelques instants.",
|
||
"publicForm.retry.cta": "Réessayer le paiement",
|
||
"publicForm.retry.stillUnavailable": "Toujours indisponible pour le moment, réessaie un peu plus tard.",
|
||
|
||
"publicForm.confirmation.title": "Confirmation du paiement",
|
||
"publicForm.confirmation.pending": "Vérification du paiement en cours…",
|
||
"publicForm.confirmation.paid": "Merci ! Cotisation « {label} » de {amount} € payée. Ton inscription est enregistrée. Tu vas recevoir un mail de confirmation de ton inscription et ton reçu fiscal si tu as choisi le mécénat.",
|
||
"publicForm.confirmation.failed": "Le paiement n'a pas abouti (refusé ou expiré).",
|
||
"form.closed": "Les inscriptions sont actuellement fermées.",
|
||
"form.captcha_failed": "Vérification anti-robot invalide, réessaie.",
|
||
"form.invalid_payload": "Données du formulaire invalides.",
|
||
"form.photo_type_not_supported": "La photo doit être au format PNG ou JPEG.",
|
||
"volunteer.empty_photo": "Le fichier de la photo est vide.",
|
||
"form.photo_too_large": "La photo est trop volumineuse.",
|
||
"form.logo_type_not_supported": "Le logo doit être au format PNG ou JPEG.",
|
||
"form.logo_empty": "Le logo est vide.",
|
||
"form.logo_too_large": "Le logo est trop volumineux.",
|
||
"form.invalid_sumup_amount": "Le montant doit être supérieur à 0.",
|
||
"form.invalid_free_amount": "Le montant saisi n'est pas valide (au-dessus du minimum indiqué, 10 000 € au plus, deux décimales au maximum).",
|
||
"form.unknown_payment_option": "Ce type de paiement n'existe pas pour cette édition.",
|
||
"form.duplicate_payment_option_label": "Un type de paiement porte déjà ce libellé.",
|
||
"form.pending_already_paid": "Cette inscription est déjà payée.",
|
||
"form.pending_not_awaiting_info": "Cette inscription n'attend pas ces informations.",
|
||
"form.too_many_position_wishes": "Deux vœux de poste au maximum.",
|
||
"form.too_many_artists_same_day": "Un seul artiste souhaité par soir de festival.",
|
||
"position_sheets.no_positions": "Aucun poste ne correspond à cette sélection.",
|
||
"position_sheets.no_shifts": "Aucun créneau à imprimer pour ces postes.",
|
||
"mecenat.no_receipts": "Aucun bénévole n'a payé la cotisation en mécénat pour cette édition."
|
||
}
|