/** French (fr) UI pack — keys must stay in sync with en.ts. */
exportconstfr: MessageDict={
"app.name":"Descrybe",
"app.home":"Accueil Descrybe",
"common.cancel":"Annuler",
"common.save":"Enregistrer les modifications",
"common.saveShort":"Enregistrer",
"common.continue":"Continuer",
"common.open":"Ouvrir",
"common.markDone":"Marquer comme terminé",
"common.viewAll":"Tout voir",
"common.close":"Fermer",
"common.askAdmin":"Demandez à un administrateur de l'entreprise",
"common.you":"Vous",
"common.active":"Actif",
"common.pending":"En attente",
"common.email":"E-mail",
"common.password":"Mot de passe",
"common.name":"Votre nom",
"common.viewPricing":"Voir les tarifs",
"common.backToSignIn":"Retour à la connexion",
"common.signingOut":"Déconnexion…",
"common.signOutAndContinue":"Se déconnecter et continuer",
"common.staySignedIn":"Rester connecté",
"a11y.skipToContent":"Aller au contenu",
"theme.switchToDark":"Passer au thème sombre",
"theme.switchToLight":"Passer au thème clair",
"header.signOut":"Déconnexion",
"header.signingOut":"Déconnexion…",
"status.emDash":"—",
"status.pending":"En attente",
"status.processing":"Traitement",
"status.completed":"Terminé",
"status.failed":"Échoué",
"status.cancelled":"Annulé",
"nav.section.overview":"Vue d'ensemble",
"nav.section.catalog":"Catalogue",
"nav.section.feeds":"Feeds",
"nav.section.stores":"Boutiques",
"nav.section.processing":"Traitement",
"nav.section.marketing":"Marketing",
"nav.section.integrations":"Intégrations",
"nav.section.account":"Compte",
"nav.section.platform":"Plateforme",
"nav.dashboard":"Tableau de bord",
"nav.products":"Produits",
"nav.categories":"Catégories",
"nav.attributes":"Attributs",
"nav.fields":"Champs",
"nav.feeds":"Feeds",
"nav.exports":"Exportations",
"nav.stores":"Boutiques",
"nav.jobs":"Tâches",
"nav.campaigns":"Campagnes",
"nav.calendar":"Calendrier",
"nav.seo":"SEO",
"nav.brand":"Marque",
"nav.reviews":"Avis",
"nav.ai":"IA",
"nav.email":"E-mail",
"nav.billing":"Facturation",
"nav.settings":"Paramètres",
"nav.support":"Assistance",
"nav.admin":"Admin",
"nav.main":"Navigation principale",
"nav.sidebar":"Barre latérale de l'application",
"nav.close":"Fermer la navigation",
"nav.closeMenu":"Fermer le menu",
"nav.open":"Ouvrir la navigation",
"nav.commandPalette":"Rechercher des pages",
"nav.commandPaletteLabel":"Rechercher",
"auth.login.title":"Se connecter",
"auth.login.description":"Utilisez votre e-mail et mot de passe Descrybe.",
"auth.login.submit":"Se connecter",
"auth.login.submitting":"Connexion…",
"auth.login.failed":"Échec de la connexion",
"auth.login.passwordNotSet":"Ce compte a encore besoin d'un mot de passe. Ouvrez votre lien d'invitation, ou demandez à un administrateur d'en émettre un nouveau.",
"auth.login.setPasswordFirstTitle":"Définissez d'abord le mot de passe :",
"auth.login.setPasswordFirstBody":"utilisez le lien d'invitation de votre e-mail. Si le lien a été envoyé à une ancienne adresse (dérive d'e-mail), demandez à un administrateur de l'entreprise de renvoyer une invitation de définition de mot de passe à {email}.",
"auth.login.yourEmail":"votre e-mail",
"auth.login.platformAdminsReissue":"Les administrateurs de la plateforme peuvent réémettre depuis",
"auth.login.forgotPassword":"Mot de passe oublié ?",
"auth.login.forgotPasswordHelp":"Saisissez votre e-mail sur la page de réinitialisation. Si vous n’avez jamais défini de mot de passe, utilisez le lien d’invitation / définition.",
"auth.forgot.title":"Mot de passe oublié",
"auth.forgot.description":"Saisissez l’e-mail de votre compte. S’il correspond à un compte actif, nous enverrons un lien de réinitialisation.",
"auth.forgot.submit":"Envoyer le lien",
"auth.forgot.submitting":"Envoi…",
"auth.forgot.failed":"Impossible de demander une réinitialisation",
"auth.forgot.sentTitle":"Vérifiez votre e-mail",
"auth.forgot.sentBody":"Si un compte existe pour cette adresse, un lien de réinitialisation est en route. Le lien expire dans une heure.",
"auth.forgot.backToSignIn":"Retour à la connexion",
"auth.reset.title":"Réinitialiser le mot de passe",
"auth.reset.description":"Choisissez un nouveau mot de passe pour votre compte Descrybe (au moins 8 caractères).",
"auth.reset.submit":"Enregistrer le nouveau mot de passe",
"auth.reset.submitting":"Enregistrement…",
"auth.reset.failed":"Impossible de réinitialiser le mot de passe",
"auth.reset.doneTitle":"Mot de passe mis à jour",
"auth.reset.doneDescription":"Connectez-vous avec votre e-mail et le nouveau mot de passe.",
"auth.reset.goToSignIn":"Aller à la connexion",
"auth.reset.passwordConfirm":"Confirmer le mot de passe",
"auth.reset.passwordMismatch":"Les mots de passe ne correspondent pas",
"auth.reset.missingTitle":"Lien de réinitialisation manquant",
"auth.reset.missingDescription":"Ouvrez le lien reçu par e-mail pour choisir un nouveau mot de passe.",
"auth.reset.requestNewLink":"Demander un nouveau lien de réinitialisation",
"auth.reset.tokenMissing":"Aucun lien de réinitialisation n’a été fourni. Utilisez le lien de votre e-mail, ou demandez-en un nouveau.",
"auth.reset.tokenInvalid":"Ce lien de réinitialisation est invalide ou expiré. Demandez-en un nouveau depuis la page mot de passe oublié.",
"auth.reset.linkRecognized":"Lien de réinitialisation reconnu. Saisissez un nouveau mot de passe ci-dessous — le secret n’est pas affiché sur cette page.",
"auth.reset.tokenLabel":"Jeton de réinitialisation",
"auth.reset.passwordHint":"Au moins 8 caractères. Pas d’autres règles de complexité.",
"auth.register.title":"Créer une entreprise",
"auth.register.description":"Enregistre une entreprise et son utilisateur administrateur.",
"auth.register.companyName":"Nom de l'entreprise",
"auth.register.submit":"Créer un compte",
"auth.register.submitting":"Création…",
"auth.register.failed":"Échec de l'inscription",
"auth.register.haveAccount":"Vous avez déjà un compte ?",
"auth.register.signIn":"Se connecter",
"auth.invite.title":"Accepter l'invitation",
"auth.invite.setPasswordTitle":"Définir le mot de passe",
"auth.invite.description":"Définissez votre mot de passe pour rejoindre l'entreprise. Votre administrateur a attribué Membre (travail quotidien) ou Admin (équipe et facturation).",
"auth.invite.setPasswordDescription":"Choisissez un mot de passe pour votre compte Descrybe migré (au moins 8 caractères).",
"auth.invite.checking":"Vérification de l'invitation…",
"auth.invite.forEmail":"Invitation pour {email}.",
"auth.invite.linkRecognized":"Lien d'invitation reconnu. Saisissez un mot de passe ci-dessous pour continuer — le secret n'est pas affiché sur cette page.",
"auth.invite.resetLinkRecognized":"Lien de réinitialisation reconnu. Saisissez un mot de passe ci-dessous pour continuer — le secret n'est pas affiché sur cette page.",
"auth.invite.tokenLabel":"Jeton d'invitation",
"auth.invite.resetTokenLabel":"Jeton de réinitialisation",
"auth.invite.tokenHelp":"Collez le jeton de votre e-mail d'invitation. Il est masqué dans ce champ.",
"auth.invite.passwordHint":"Au moins 8 caractères. Aucune autre règle de complexité.",
"auth.invite.submit":"Accepter l'invitation",
"auth.invite.setPasswordSubmit":"Définir le mot de passe",
"auth.invite.accepting":"Acceptation…",
"auth.invite.saving":"Enregistrement…",
"auth.invite.verifyFailed":"Impossible de vérifier l'invitation",
"auth.invite.verifySetPasswordFailed":"Impossible de vérifier le lien de définition du mot de passe",
"auth.invite.setPasswordFailed":"Impossible de définir le mot de passe",
"auth.invite.expired":"Cette invitation est invalide ou expirée. Demandez à votre administrateur d'envoyer une nouvelle invitation, puis ouvrez le nouveau lien (ou collez le nouveau jeton ci-dessous).",
"auth.invite.setPasswordExpired":"Ce lien de définition de mot de passe est invalide ou expiré. Demandez à un administrateur de l'entreprise ou de la plateforme de le réémettre, puis ouvrez le nouveau lien (ou collez le nouveau jeton ci-dessous).",
"auth.invite.emailMismatchDefault":"Vous êtes connecté avec un e-mail différent de celui de cette invitation.",
"auth.invite.expiredFooter":"Lien expiré ? Demandez à un administrateur de le réémettre — il n'y a pas d'API de renvoi en libre-service. Administrateurs de plateforme :",
"auth.invite.doneTitle":"Vous faites partie de l'équipe",
"auth.invite.doneSetPasswordTitle":"Mot de passe enregistré",
"auth.invite.doneDescription":"Votre compte est prêt. Ensuite, ouvrez le tableau de bord pour travailler avec les flux et les produits, ou consultez les paramètres de l'entreprise.",
"auth.invite.doneSetPasswordDescription":"Connectez-vous avec votre e-mail et le nouveau mot de passe pour ouvrir votre espace de travail.",
"auth.invite.openDashboard":"Ouvrir le tableau de bord",
"auth.invite.companySettings":"Paramètres de l'entreprise",
"auth.invite.goToSignIn":"Aller à la connexion",
"auth.invite.afterSignInNote":"Après la connexion, vous arrivez dans votre espace de travail — le parcours de configuration initiale est ignoré.",
"auth.invite.mismatchTitle":"Mauvais compte pour cette invitation",
"auth.invite.mismatchDescription":"Ce lien est destiné à un e-mail différent de celui avec lequel vous êtes connecté. Déconnectez-vous pour continuer en tant qu'utilisateur invité, ou restez connecté et demandez à un administrateur de réémettre l'invitation.",
"auth.invite.mismatchDetail":"Connecté en tant que {session}, mais cette invitation est pour {invite}.",
"auth.invite.mismatchFallback":"L'e-mail de la session ne correspond pas à cette invitation.",
"auth.invite.switchAccountTitle":"Changer de compte :",
"auth.invite.switchAccountBody":"déconnectez-vous, puis terminez ce formulaire avec l'e-mail invité{emailSuffix}.",
"auth.invite.reissueTitle":"Chemin de réémission :",
"auth.invite.reissueBody":"si votre vrai e-mail de connexion a changé (dérive d'e-mail), demandez à un administrateur de l'entreprise de révoquer cette invitation et d'en envoyer une nouvelle à l'e-mail que vous utilisez pour vous connecter. Les administrateurs de la plateforme peuvent aussi réémettre des liens de définition de mot de passe depuis Admin → Utilisateurs.",
"locale.switcher":"Langue de l'interface",
"locale.menu":"Choisir la langue de l'interface",
"locale.label":"Langue du tableau de bord",
"locale.help":"Modifie les libellés de la navigation et des paramètres. La langue du contenu généré se règle séparément sous Entreprise.",
"settings.contentLanguage":"Langue du contenu",
"settings.contentLanguageHelp":"Langue utilisée pour les titres, descriptions et autres contenus générés",
"settings.tab.profile":"Profil",
"settings.tab.company":"Entreprise",
"settings.tab.alerts":"Alertes",
"settings.tab.apiKeys":"Clés API",
"settings.tab.team":"Équipe",
"settings.title":"Paramètres",
"settings.description":"Compte, entreprise, clés API et équipe.",
"settings.accessDenied":"Vous n'avez pas l'autorisation d'ouvrir les paramètres de l'entreprise. Demandez de l'aide à un administrateur.",
"settings.loadFailed":"Échec du chargement des paramètres",
"settings.personalInfoHelp":"Mettez à jour vos informations personnelles",
"settings.firstName":"Prénom",
"settings.firstNamePlaceholder":"Votre prénom",
"settings.lastName":"Nom",
"settings.lastNamePlaceholder":"Votre nom",
"settings.email":"E-mail",
"settings.profileUpdated":"Profil mis à jour.",
"settings.profileUpdateFailed":"Impossible de mettre à jour le profil",
"settings.role.member":"Membre",
"settings.role.admin":"Admin",
"settings.teamHeading":"Membres de l'équipe",
"settings.inviteUser":"Inviter un utilisateur",
"settings.teamAdminOnly":"Seuls les administrateurs de l'entreprise peuvent inviter, promouvoir, rétrograder ou retirer des coéquipiers.",
"settings.shareAcceptLink":"Partager le lien d'acceptation",
"settings.shareAcceptLinkHelp":"L'e-mail sortant n'est pas configuré. Copiez ce lien à usage unique et envoyez-le à l'invité. Il définira un mot de passe (au moins 8 caractères) et rejoindra avec le rôle que vous avez choisi.",
"settings.acceptLinkLabel":"Lien d'acceptation d'invitation à usage unique",
"settings.teamForbidden":"Vous n'avez pas l'autorisation de voir la liste de l'équipe. Demandez de l'aide à un administrateur.",
"settings.noTeammates":"Pas encore de coéquipiers",
"settings.noTeammatesHelp":"Invitez des collègues en tant que Membre (produits et flux) ou Admin (équipe et paramètres de l'entreprise). Les invitations en attente s'affichent ici jusqu'à acceptation.",
"settings.noTeammatesMemberHelp":"Aucun coéquipier listé pour le moment. Demandez à un administrateur d'envoyer des invitations.",
"settings.memberActions":"Actions du membre",
"settings.makeAdmin":"Rendre admin",
"settings.makeMember":"Rendre membre",
"settings.removeMember":"Retirer",
"settings.revokeInvite":"Révoquer l'invitation",
"settings.needOneAdmin":"Les entreprises ont besoin d'au moins un administrateur",
"settings.expires":"Expire le {date}",
"settings.invalidEmail":"Saisissez une adresse e-mail valide.",
"settings.inviteCreatedNoMail":"Invitation créée pour {email} en tant que {role}. Copiez le lien d'acceptation ci-dessous et partagez-le — l'e-mail sortant n'est pas configuré.",
"settings.inviteSent":"Invitation envoyée à {email} en tant que {role}. La personne doit ouvrir l'e-mail et accepter avant expiration.",
"settings.inviteRoleHint":"Les membres gèrent les produits et les flux. Les administrateurs peuvent aussi inviter des coéquipiers et modifier les paramètres de l'entreprise.",
"settings.sendInvite":"Envoyer l'invitation",
"settings.companyHeading":"Paramètres de l'entreprise",
"settings.activeCompany":"Entreprise active",
"settings.creditsOverview":"Aperçu des crédits",
"settings.plan":"Offre",
"settings.used":"Utilisé",
"settings.companyInfo":"Informations sur l'entreprise",
"settings.companyInfoHelp":"Mettez à jour les détails de votre entreprise",
"settings.companyName":"Nom de l'entreprise",
"settings.companyNamePlaceholder":"Le nom de votre entreprise",
"settings.contentSettings":"Paramètres de contenu",
"settings.mergeProducts":"Fusionner les produits avec le même GTIN",
"settings.emailIntegration":"Intégration e-mail",
"settings.aiIntegrations":"Intégrations IA",
"settings.alertsHeading":"Alertes opérateur",
"settings.inAppToasts":"Toasts dans l'application",
"settings.emailAlerts":"Alertes e-mail",
"settings.apiKeysHeading":"Clés API",
"settings.createApiKey":"Créer une clé API",
"settings.createApiKeyShort":"Créer une clé API",
"settings.createApiKeyTitle":"Créer une clé API",
"settings.apiKeyLabel":"Clé API",
"settings.keyName":"Nom de la clé",
"settings.storeKeySafe":"Conservez-la en lieu sûr — vous ne pourrez plus voir le secret complet.",
"settings.apiKeysIntro":"Créez une clé API d’entreprise pour appeler les endpoints publics /api/v1. Le secret complet n’est affiché qu’une fois à la création — copiez-le immédiatement.",
"settings.apiKeysUseWhere":"Envoyez-la en Authorization: Bearer <key> (préféré) ou X-API-Key.",
"settings.apiKeyOnceWarning":"C’est la seule fois où le secret complet est affiché. Copiez-le maintenant avant de fermer cette boîte de dialogue.",
"settings.table.name":"Nom",
"settings.table.key":"Clé",
"settings.table.lastUsed":"Dernière utilisation",
"dashboard.demoSandbox":"Bac à sable démo",
"dashboard.demoEmptyTitle":"Le bac à sable démo est vide",
"dashboard.demoEmptyHint":"Le bac à sable démo est vide — basculez vers A1 ou connectez un flux pour voir de vraies stats catalogue.",
"dashboard.overviewTitle":"Vue d'ensemble",
"dashboard.quickLinks":"Liens rapides",
"dashboard.whatsNew":"Nouveautés",
"dashboard.startTutorial":"Lancer le tutoriel",
"dashboard.resumeTutorial":"Reprendre le tutoriel",
"dashboard.restartTutorial":"Relancer le tutoriel",
"dashboard.tourTopics":"Sujets de la visite",
"dashboard.browseTutorialSections":"Parcourir les sections du tutoriel",
"dashboard.connectFeed":"Connecter un flux",
"dashboard.processProducts":"Traiter les produits",
"dashboard.openProducts":"Ouvrir les produits",
"dashboard.welcomeTo":"Bienvenue sur {name}",
"dashboard.trialBadge":"Essai",
"dashboard.actions":"Actions du tableau de bord",
"dashboard.emptyPaygHint":"Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Utilisez Premiers pas ci-dessous.",
"dashboard.emptyCreditsHint":"Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Vous avez {credits} — commencez avec Premiers pas ci-dessous.",
"dashboard.workflowTitle":"Flux catalogue",
"dashboard.recentActivity":"Activité récente",
"dashboard.loadFailed":"Échec du chargement du tableau de bord",
"dashboard.workspaceFallback":"Cet espace de travail",
"dashboard.jobFallback":"Tâche {id}",
"dashboard.workflow.feeds.connect":"Connecter une source",
"dashboard.workflow.processRun":"Lancer les tâches IA",
"dashboard.workflow.export":"Exporter",
"dashboard.workflow.exportReady":"Modèles et téléchargement",
"dashboard.workflow.exportMap":"Mapper puis exporter",
"dashboard.workflowHint":"Catalogue entrant → enrichir / traiter → exporter ou pousser vers les boutiques. Passez à l’étape suivante pour {name}.",
"dashboard.overviewHint":"Totaux en direct pour {name}",
"dashboard.demoEmptyMessage":"Basculez vers A1 (ou une autre entreprise seedée) dans l'en-tête, ou connectez un flux ici pour remplir ce bac à sable.",
"dashboard.emptyTitle":"Importez un catalogue",
"dashboard.emptyMessage":"Catalogue entrant → enrichir / traiter → exporter ou pousser vers les boutiques. Commencez avec Premiers pas ci-dessous (ou connectez un flux / téléversez un CSV).",
"dashboard.connectFeedAnyway":"Connecter un flux quand même",
"dashboard.connectFeedShort":"Connecter un flux",
"dashboard.uploadCsv":"Téléverser un CSV",
"dashboard.goToBilling":"Aller à la facturation",
"dashboard.freePlanTitle":"Vous êtes sur l'offre Free",
"dashboard.freePlanMessageWithLimit":"{used} sur {max} produits utilisés. Le mapping des flux, le nettoyage de base et les labels énergétiques UE (EPREL) sont inclus ; passez à une offre supérieure pour les titres et descriptions IA, et plus de capacité.",
"dashboard.freePlanMessage":"Le mapping des flux, le nettoyage de base et les labels énergétiques UE (EPREL) sont inclus ; passez à une offre supérieure pour les titres et descriptions IA, et plus de capacité.",
"dashboard.outOfCreditsTitle":"Vous n'avez plus de crédits IA",
"dashboard.outOfCreditsMessage":"Achetez plus de crédits ou passez à une offre supérieure pour continuer le traitement.",
"dashboard.productLimitTitle":"Limite de produits atteinte",
"dashboard.productLimitMessage":"Votre offre {plan} autorise {max} produits ({count} dans le catalogue). Passez à une offre supérieure pour en traiter plus.",
"dashboard.productLimitMessageFull":"La limite de produits de votre offre {plan} est atteinte. Passez à une offre supérieure pour en traiter plus.",
"dashboard.comparePlans":"Comparer les offres",
"dashboard.viewPlans":"Voir les offres",
"dashboard.trialTitle":"Essai · {plan}",
"dashboard.trialMessageDated":"L'essai se termine le {date}. {credits} crédits restants.",
"dashboard.trialMessage":"{credits} crédits restants sur votre essai.",
"dashboard.lowCreditsMessage":"Il reste {remaining} crédits sur {total}. Rechargez ou passez à une offre supérieure avant que les tâches ne s'arrêtent.",
"dashboard.latestJobs":"Dernières tâches de traitement",
"dashboard.noJobsEmpty":"Pas encore de tâches — importez d'abord des produits.",
"dashboard.noJobsReady":"Aucune tâche récente. Démarrez-en une depuis Produits quand vous êtes prêt.",
"dashboard.startJob":"Démarrer un job depuis Produits",
"dashboard.quickLinksHint":"Flux, produits, tâches et export.",
"dashboard.feedsImportMap":"Importer et mapper",
"dashboard.productsBrowse":"Parcourir et traiter",
"dashboard.jobsMonitor":"Surveiller les tâches",
"dashboard.exportsTemplates":"Modèles et téléchargement",
"activation.title":"Premiers pas",
"activation.description":"Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques. Terminez l’étape en cours, puis continuez — le parcours démo explique les écrans sans modifier la progression de la checklist.",
"activation.descriptionShort":"Commencez par l’étape mise en évidence ci-dessous — une action à la fois. La connexion boutique est facultative.",
"activation.nextCta":"Faire cette étape",
"activation.valueProp":"Descrybe importe un catalogue, l’enrichit et le traite, puis l’exporte ou le pousse vers vos boutiques.",
"activation.alreadyDone":"Déjà fait",
"activation.skipForNow":"Passer pour l’instant",
"activation.showAllSteps":"Afficher les {total} étapes",
"activation.showFewerSteps":"Afficher moins d’étapes",
"activation.corePathLabel":"En bref",
"activation.corePath":"Catalogue entrant → Enrichir / traiter → Exporter ou pousser vers les boutiques",
"activation.storeWizardHint":"Pas nécessaire pour les flux ou les exports — ignorez sauf si vous voulez pousser des produits vers une boutique en ligne.",
"activation.storeWizardCta":"Lancer la configuration guidée",
"activation.focus.map":"Ensuite : ouvrez Map sur un flux, associez les colonnes, puis enregistrez. Ajoutez d’abord un flux si la liste est vide.",
"activation.focus.sync":"Ensuite : synchronisez un échantillon après l’enregistrement du mapping. Utilisez Sync sur un flux mappé — évitez les sources non mappées.",
"activation.focus.dismiss":"Fermer l’indication",
"activation.dismiss":"Masquer la checklist",
"hypercare.report.title":"Hypercare de bascule",
"hypercare.report.message":"Données manquantes ou incorrectes après la migration ? Signalez-le pour que nous corrigions votre espace de travail.",
"hypercare.report.cta":"Signaler des données manquantes ou incorrectes",
"hypercare.report.dismiss":"Ignorer",
"hypercare.report.adminTriage":"Ouvrir la file hypercare",
"etl.gaps.title":"What did not migrate",
"etl.gaps.message":"These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.",
"etl.gaps.dismiss":"Dismiss",
"etl.gaps.apiKeys.title":"API keys",
"etl.gaps.apiKeys.body":"Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.",
"etl.gaps.apiKeys.cta":"Open API keys",
"etl.gaps.blobs.title":"File contents (blobs)",
"etl.gaps.blobs.body":"Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.",
"etl.gaps.blobs.countHint":"{count} file records are metadata-only (bytes were not migrated).",
"etl.gaps.blobs.cta":"Open Files",
"etl.gaps.jobs.title":"Processing history",
"etl.gaps.jobs.body":"Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.",
"etl.gaps.jobs.emptyHint":"Optional jobs domain was not run — empty history is expected.",
"etl.gaps.jobs.migratedHint":"{count} jobs were tagged migrated from an optional backfill.",
"etl.gaps.jobs.cta":"Open Processing",
"etl.gaps.woo.title":"Store credentials",
"etl.gaps.woo.body":"WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.",
"etl.gaps.woo.cta":"Open Stores",
"etl.gaps.settings.title":"Company settings",
"etl.gaps.settings.body":"Only language and merge-products settings were imported. Re-check other company preferences in Settings.",
"etl.gaps.settings.cta":"Open company settings",
"activation.progress":"{done} sur {total} terminés",
"activation.stepsLabel":"Étapes d'activation",
"activation.pausedTitle":"Premiers pas en pause",
"activation.pausedBody":"Reprenez à tout moment — des champs produit jusqu’à l’export. La connexion boutique reste facultative.",
"activation.resume":"Reprendre la checklist",
"activation.step.enable-fields.title":"Activer les champs produit",
"activation.step.enable-fields.body":"Choisissez les colonnes produit standard que Descrybe doit mapper et nettoyer.",
"activation.step.connect-source.title":"Ajouter un flux produit",
"activation.step.connect-source.body":"Ajoutez un flux catalogue CSV ou XML pour faire entrer les produits dans Descrybe. Connecter une boutique en ligne est une étape facultative ultérieure.",
"activation.step.map.title":"Mapper les colonnes du flux",
"activation.step.map.body":"Dans Feeds, ouvrez Map sur votre flux, faites correspondre les colonnes fournisseur, puis enregistrez.",
"activation.step.sync-sample.title":"Synchroniser un échantillon",
"activation.step.sync-sample.body":"Dans Feeds, synchronisez un petit échantillon depuis un flux mappé pour vérifier le mapping avant l’exécution complète.",
"activation.step.process.title":"Traiter les produits",
"activation.step.process.body":"Ouvrez les produits non traités et lancez le traitement pour générer un contenu catalogue nettoyé.",
"activation.step.store-connect.title":"Connecter une boutique",
"activation.step.store-connect.body":"Facultatif. Liez WooCommerce ou Shopify pour pousser les produits vers votre boutique. Ignorez si vous n’utilisez que les flux et exports.",
"activation.step.export.title":"Créer un export",
"activation.step.export.body":"Créez un flux d’export pour télécharger ou publier les produits nettoyés en XML ou CSV.",
"docs.tryIt.memberCannotCreate":"Seuls les admins peuvent créer des clés API. Les clés héritées n’ont pas été migrées — collez une clé ci-dessous ou demandez à un admin d’en créer une.",
"docs.tryIt.noKeysLegacyAdmin":"Les clés API héritées n’ont pas été migrées. Créez-en une via Use my API key ou Paramètres → Clés API — le secret n’est affiché qu’une fois.",
"docs.tryIt.noKeysLegacyMember":"Aucune clé API. Les clés héritées n’ont pas été migrées — demandez à un admin d’en créer une, ou collez une clé dk_.",
"errors.couldNotUpdateLanguage":"Impossible de mettre à jour la langue",
"toast.support.replyTitle":"Réponse du support",
"toast.support.replyBody":"L'équipe a répondu à votre ticket de support.",
"toast.support.replyRe":"Re : {subject}",
"toast.support.statusTitle":"Statut du ticket mis à jour",
"toast.support.statusBody":"Le statut de votre ticket de support a changé.",
"toast.support.updateTitle":"Mise à jour du support",
"tutorial.pickerBody":"Choisissez une section pour rouvrir cette partie de la démo. Parcourir la visite ne modifie pas les données de votre compte.",
"tutorial.sectionsAria":"Sections du tutoriel",
"tutorial.open":"Ouvrir",
"tutorial.close":"Fermer",
"tutorial.resumeLastStep":"Reprendre la dernière étape",
"tutorial.startFromBeginning":"Reprendre depuis le début",
"tutorial.stepOf":"Étape {current} sur {total}",
"tutorial.jumpTo":"Aller à…",
"tutorial.jumpToSectionAria":"Aller à la section",
"tutorial.back":"Retour",
"tutorial.pause":"Mettre en pause",
"tutorial.continue":"Continuer",
"tutorial.finishTour":"Terminer la visite",
"tutorial.missingTargetHint":"Ce contrôle n'est pas encore sur cet écran. Vous pouvez quand même Continuer — la visite n'exige jamais d'enregistrement ni de synchronisation.",
"tutorial.section.welcome":"Welcome",
"tutorial.section.catalog":"Catalog setup",
"tutorial.section.sources":"Feeds",
"tutorial.section.mapping":"Map & sync",
"tutorial.section.products":"Process",
"tutorial.section.export":"Export & stores",
"tutorial.section.grow":"Grow",
"tutorial.section.done":"Done",
"tutorial.step.welcome.title":"Bienvenue sur Descrybe",
"tutorial.step.welcome.body":"La boucle principale de Descrybe est Feeds → Process → Export / Stores. Cette démo guidée met en avant ces écrans sur votre vrai tableau de bord — sans vous demander d’enregistrer, synchroniser, activer des champs ou créer des feeds. Pause à tout moment ; reprise depuis l’en-tête. Sautez à une section si vous n’avez besoin d’aide que sur un sujet.",
"tutorial.step.welcome.tip":"Demo tour — your data stays unchanged until you choose to act outside the tour.",
"tutorial.step.welcome.nextLabel":"Start tour",
"tutorial.step.welcome.missingHint":"You’re on the dashboard — continue when ready.",
"tutorial.step.dashboard-overview.title":"Votre centre de commande",
"tutorial.step.dashboard-overview.body":"La bande de workflow catalogue montre le parcours quotidien : Feeds → Map → Sync → Process. Getting started suit le vrai progrès de l’espace de travail (séparé de cette démo). Quand vous êtes prêt, utilisez Manage feeds ou Start processing — puis exportez ou connectez une boutique.",
"tutorial.step.dashboard-overview.tip":"Completing this tour does not mark checklist steps done — only real workspace progress does.",
"tutorial.step.dashboard-overview.missingHint":"The workflow strip and checklist appear after the dashboard loads.",
"tutorial.step.enable-fields.body":"Les Standard Fields sont les colonnes produit que Descrybe mappe, traite et exporte — titre, description, GTIN, images, etc. Enable recommended active un jeu par défaut adapté à la plupart des catalogues. Vous pourrez affiner la liste plus tard sans casser les mappings existants.",
"tutorial.step.enable-fields.tip":"In the demo you don’t need to click Enable recommended — Continue when you understand the idea.",
"tutorial.step.enable-fields.warning":"Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.",
"tutorial.step.enable-fields.missingHint":"Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.",
"tutorial.step.catalog-depth.title":"Catégories et attributs",
"tutorial.step.catalog-depth.body":"Dans la section Catalog de la barre latérale vous trouverez aussi Categories et Attributes. Categories organisent le catalogue ; les attributs alimentent filtres et descriptions structurées. Pas besoin de les configurer pour finir cette visite.",
"tutorial.step.catalog-depth.tip":"Return to this section anytime from Jump to… if you revisit taxonomy later.",
"tutorial.step.catalog-depth.missingHint":"Expand Catalog in the sidebar to open Categories or Attributes after the tour.",
"tutorial.step.connect-source.title":"Ajouter une source produit",
"tutorial.step.connect-source.body":"Les feeds font entrer les catalogues fournisseurs dans Descrybe — fichiers CSV, XML ou URL. Add Feed crée une nouvelle source ; chaque ligne montre le statut (prêt pour le mapping, mappé, actif). Map ouvre l'écran de correspondance des champs pour ce feed.",
"tutorial.step.connect-source.tip":"You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.",
"tutorial.step.connect-source.warning":"Avoid deleting live feeds unless you intend to remove that source and its sync history.",
"tutorial.step.connect-source.missingHint":"Open Feeds from the sidebar if this screen hasn’t loaded.",
"tutorial.step.map.title":"Mapper les champs source",
"tutorial.step.map.body":"Sur l'écran Map d'un feed, vous associez les colonnes fournisseur aux standard fields Descrybe. Auto-map propose des correspondances d'après les noms de colonnes ; confirmez les floues, puis corrigez le reste. Save Mappings enregistre la carte pour que sync et traitement sachent lire chaque ligne.",
"tutorial.step.map.tip":"Demo tip: open Map on a feed when you have one — you are not required to save.",
"tutorial.step.map.warning":"Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.",
"tutorial.step.map.missingHint":"Add a feed and click Map to see the mapping UI; or Continue to keep learning.",
"tutorial.step.sync-sample.title":"Synchroniser un échantillon (quand prêt)",
"tutorial.step.sync-sample.body":"Après enregistrement des mappings, Sync + Process sample tire un petit lot et lance le traitement pour vérifier titres, images et attributs avant un run complet. Full Sync now dans la liste des feeds sert aux imports plus larges une fois l'échantillon bon.",
"tutorial.step.sync-sample.tip":"Skip Sync during the demo — use it only after Save Mappings on a real feed.",
"tutorial.step.sync-sample.warning":"Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.",
"tutorial.step.sync-sample.missingHint":"Sync controls appear on feed rows and on the mapping screen footer.",
"tutorial.step.process.title":"Revoir les produits",
"tutorial.step.process.body":"Products liste les articles synchronisés et traités. Filtrez par statut, ouvrez une ligne pour le détail, et utilisez les badges EPREL quand des données d’étiquette énergétique existent. C’est ici que vous repérez les erreurs de mapping avant export ou sync boutique.",
"tutorial.step.process.tip":"Browsing products is read-only for exploration — editing a row changes live catalog data.",
"tutorial.step.process.missingHint":"Wait for the products table, or Continue if the catalog is still empty.",
"tutorial.step.processing-hub.title":"Traitement en arrière-plan",
"tutorial.step.processing-hub.body":"Les jobs sous Processing montrent la progression AI et pipeline : exécutions terminées et échecs. Lancez des jobs depuis le tableau de bord ou les produits quand vous voulez dépenser des crédits sur un lot.",
"tutorial.step.processing-hub.tip":"Jobs consume credits — watch Billing before large runs.",
"tutorial.step.processing-hub.missingHint":"Open Jobs from the Processing section in the sidebar if the page is empty.",
"tutorial.step.stores-hub.title":"Boutiques et plateformes",
"tutorial.step.stores-hub.body":"Après traitement, Stores connecte WooCommerce ou Shopify pour pousser le catalogue nettoyé vers votre boutique. Utilisez-le quand un marketplace ou CMS est la destination — ou passez à Export feeds si les partenaires n’ont besoin que d’un fichier/URL.",
"tutorial.step.stores-hub.tip":"Reconnect banners appear if a token expires — fix those before relying on sync.",
"tutorial.step.stores-hub.missingHint":"Open Stores from the sidebar to see connection cards.",
"tutorial.step.export.title":"Exporter des produits nettoyés",
"tutorial.step.export.body":"Les export feeds publient des produits nettoyés en XML ou CSV pour canaux, partenaires ou votre boutique. Créez un export, choisissez format et filtres, puis partagez l'URL du feed ou téléchargez. Les exports lisent les données catalogue traitées — mappez et traitez d'abord pour de meilleurs résultats.",
"tutorial.step.export.tip":"You don’t need to create an export during the demo.",
"tutorial.step.export.warning":"Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.",
"tutorial.step.export.missingHint":"Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.",
"tutorial.step.billing-hub.title":"Crédits et facturation",
"tutorial.step.billing-hub.body":"Billing affiche votre plan, portefeuille et crédits restants. Le traitement et certaines fonctions AI puisent dans ce solde. Surveillez l'usage avant de grands runs catalogue.",
"tutorial.step.billing-hub.tip":"Demo accounts may show unlimited or large balances — treat production credits carefully.",
"tutorial.step.billing-hub.missingHint":"Open Billing from the Account section in the sidebar.",
"tutorial.step.grow-hub.title":"Campagnes, SEO et avis",
"tutorial.step.grow-hub.body":"Dans Marketing : Campaigns génère du contenu, Content calendar planifie les posts, SEO vérifie les fiches et Reviews s’intègre à WooCommerce. Ils s’appuient sur un catalogue bien mappé — terminez Feeds → Process → Export / Stores avant de vous y appuyer.",
"tutorial.step.grow-hub.tip":"Jump back here when you’re ready to market, not during first mapping.",
"tutorial.step.grow-hub.missingHint":"Open Campaigns from Marketing in the sidebar, or Continue.",
"tutorial.step.tour-done.title":"Prêt à explorer",
"tutorial.step.tour-done.body":"Voici la carte produit : Feeds → Map → Sync → Process → Export / Stores. Utilisez Getting started sur le tableau de bord pour la vraie configuration. Reprenez ou relancez cette visite depuis l’en-tête à tout moment, ou Jump to… une section pour un rappel. Skip tour termine la démo sans changer votre checklist.",
"tutorial.step.tour-done.tip":"Demo complete — no cleanup needed. Your account was not modified by Continue alone.",
"admin.analytics.noCompaniesMsg":"La liste des entreprises est vide.",
"admin.analytics.company":"Entreprise",
"admin.analytics.internal":"Interne",
"admin.analytics.popular":"Populaire",
"admin.analytics.custom":"Personnalisé",
"admin.analytics.noBillingCycles":"Pas encore de cycles de facturation",
"admin.analytics.linkDiagnostics":"Bilans",
"admin.analytics.linkStuck":"Produits bloqués",
"admin.users.eyebrow":"Admin plateforme",
"admin.users.title":"Utilisateurs et organisations",
"admin.users.description":"Annuaire utilisateurs de la plateforme, rôles du personnel et affectations de plans d'entreprise.",
"admin.users.staffRoleUnavailable":"Les mises à jour de rôle du personnel ne sont pas encore disponibles sur ce déploiement. Contactez votre administrateur de plateforme si besoin.",
"admin.users.cloneCatalogWarning":"Remplace catégories, feeds, produits, attributs, mappings et marque sur la destination. Forfait, facturation, membres, clés API et connecteurs boutique ne sont pas copiés.",
"admin.users.cloneCatalogCancel":"Annuler",
"admin.users.cloneCatalogConfirm":"Copier le catalogue",
"admin.users.noUsers":"Aucun utilisateur ne correspond à ce filtre.",
"admin.users.noCompanies":"Aucune entreprise ne correspond à ce filtre.",
"admin.users.assignRoleTitle":"Assigner un rôle du personnel",
"admin.users.assignRoleDesc":"Les rôles plateforme contrôlent le panneau admin (Admin et Developer) et le bureau d'assistance (personnel support).",
"admin.users.staffRole":"Rôle du personnel",
"admin.users.saveRole":"Enregistrer le rôle",
"admin.users.assignPlanTitle":"Assigner une offre",
"admin.users.assignPlanDesc":"Attacher une offre publique, legacy ou personnalisée à cette entreprise.",
"admin.users.selectPlan":"Sélectionner une offre",
"admin.users.assign":"Assigner",
"admin.settings.title":"Paramètres de la plateforme",
"admin.settings.description":"Identifiants plateforme, rôles IA, e-mail et intégrations pour ce déploiement",
"admin.settings.intro":"Configurez ici les rôles IA plateforme, SMTP, OAuth, EPREL, Pinecone et Stripe. Laissez les secrets vides pour conserver la valeur stockée. Les clés par entreprise restent sous Intégrations du locataire.",
"admin.settings.aiRolesUnavailable":"Les rôles IA complets ne sont pas encore disponibles sur ce déploiement. Le traitement continue via les paramètres OpenAI plateforme ; les autres rôles seront persistés une fois pris en charge.",
"admin.settings.creditPackPricesHint":"Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.",
"admin.settings.syncCreditPacksModeHint":"Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.",
"admin.settings.syncCreditPacksFailed":"Could not sync credit packs to Stripe.",
"admin.diagnostics.description":"Console ops pour la santé de l'app, profondeur de file, tâches récentes et indicateurs de config. Secrets et DSN ne sont jamais affichés ; les erreurs de tâches sont sanitizées.",
"admin.diagnostics.filterAria":"Filtre d'état de la tâche",
"admin.diagnostics.queue":"File",
"admin.diagnostics.noJobsInQueue":"Aucune tâche en file.",
"admin.diagnostics.sanitizedErrors":"Erreurs sanitizées · max 25",
"admin.diagnostics.colId":"ID",
"admin.diagnostics.colCompany":"Entreprise",
"admin.diagnostics.colStatus":"Statut",
"admin.diagnostics.colProgress":"Progression",
"admin.diagnostics.colUpdated":"Mis à jour",
"admin.diagnostics.colError":"Erreur",
"admin.diagnostics.colTicket":"Ticket",
"admin.diagnostics.colWhen":"Quand",
"admin.diagnostics.noJobsFilter":"Aucune tâche pour ce filtre.",
"admin.stuck.title":"Produits bloqués",
"admin.stuck.description":"Examinez les tâches de traitement récentes et réinitialisez celles bloquées plus de 2 heures",
"admin.stuck.noJobs":"Aucune tâche trouvée.",
"admin.stuck.filterAria":"Filtrer les tâches par statut",
"admin.orphan.title":"Orphan processed",
"admin.orphan.description":"Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.",
"admin.orphan.cutoverHint":"Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.",
"admin.orphan.refreshReport":"Refresh report",
"admin.orphan.dryRunBtn":"Dry-run cleanup",
"admin.orphan.deleteBtn":"Confirm delete…",
"admin.orphan.loadFailed":"Could not load orphan report",
"admin.orphan.confirmDesc":"This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.",
"admin.orphan.confirmDelete":"Delete orphans",
"admin.billing.title":"Admin facturation",
"admin.billing.description":"Gérez les offres, crédits, permissions de fonctions par forfait et interrupteurs de fonctions à l'échelle de la plateforme.",
"admin.billing.noCompaniesFilter":"Aucune entreprise ne correspond à ce filtre.",
"admin.billing.assignPlanTitle":"Assigner une offre",
"admin.billing.assignPlanDesc":"Attachez une offre de facturation à une entreprise. Les crédits d'essai facultatifs réinitialisent le solde de l'entreprise pour la période d'essai.",
"admin.billing.creditsTitle":"Ajouter / ajuster des crédits",
"admin.billing.creditsDesc":"Créditer ou débiter le solde d'une entreprise.",
"admin.billing.searchCompany":"Rechercher une entreprise…",
"admin.knowledge.noArticles":"Aucun article de connaissance",
"admin.knowledge.emptyCategoryMsg":"La catégorie « {category} » est prête — ajoutez une coquille d’article pour qu’un agent contenu la remplisse.",
"admin.knowledge.emptyArticlesMsg":"Ajoutez des coquilles FAQ avec catégories et mots-clés. Laissez des placeholders dans le corps pour les agents contenu.",
"admin.knowledge.col.title":"Titre",
"admin.knowledge.col.name":"Nom",
"admin.knowledge.edit":"Modifier",
"admin.knowledge.newTemplate":"Nouveau modèle",
"admin.knowledge.editTemplate":"Modifier le modèle",
"admin.permissions.noteBody":"These toggles set what this package may include. Plateforme-wide on/désactivé masters are on the {global} tab — a plan can enable a feature that still stays désactivé when the platform switch is désactivé.",
"admin.permissions.applyProfile":"Appliquer le profil",
"admin.permissions.applyLegacy":"Appliquer le profil hérité",
"admin.permissions.profilesHint":"One-click matrices for public ladder packages and migrated legacy navigation. Enregistrers overrides for the sélectionné package only.",
"admin.permissions.enableSection":"Activer la section",
"admin.permissions.disableSection":"Désactiver la section",
"admin.permissions.noMatch":"Aucune fonctionnalité ne correspond aux filtres actuels.",
"admin.permissions.differs":"Diffère",
"admin.permissions.platformOffHint":"Désactivé à l'échelle de la plateforme even if this plan enables it.",
"admin.permissions.sectionToggled":"{label} {state} pour ce forfait.",
"admin.permissions.state.enabled":"activé",
"admin.permissions.state.disabled":"désactivé",
"admin.permissions.loadFailed":"Échec du chargement permissions de l'désactivére",
"admin.permissions.saveFailed":"Échec de l'enregistrement feature",
"admin.permissions.enableAllFailed":"Tout activer a échoué",
"admin.permissions.disableAllFailed":"Tout désactiver a échoué",
"admin.permissions.profileFailed":"Échec de apply profile",
"admin.permissions.resetFailed":"Échec de reset defaults",
"admin.permissions.sectionFailed":"Section update a échoué",
"admin.profile.legacy.label":"Legacy",
"admin.profile.legacy.description":"Migrated legacy navigation: catalog, flux, facturation, and paramètres; no Retourground Tasks, boutiques, or marketing.",
"admin.profile.free.label":"Gratuit",
"admin.profile.free.description":"Public Free ladder — AI, clé APIs, live email, and own-key AI désactivé.",
"admin.profile.starter.label":"Starter",
"admin.profile.starter.description":"Public Starter — AI on; own-key AI désactivé.",
"admin.profile.growth.label":"Growth",
"admin.profile.growth.description":"Toutes les fonctionnalités du catalogue activées.",
"admin.profile.business.label":"Business",
"admin.profile.business.description":"Toutes les fonctionnalités du catalogue activées.",
"admin.profile.enterprise.label":"Enterprise / tout activé",
"admin.profile.enterprise.description":"Full matrice de fonctionnalités (custom and Enterprise default).",
"admin.gates.noteBody":"Ces interrupteurs s’appliquent à tous les forfaits. L’accès effectif est {combo}. Les droits par forfait restent dans l’onglet {permissions}.",
"admin.gates.combo":"permission du forfait ET section globale ET fonctionnalité globale",
"admin.gates.permissionsTab":"Autorisations du plan",
"admin.gates.title":"Maîtres de fonctionnalités globales",
"admin.gates.description":"Disable a feature here to turn it désactivé for every package, even when a plan enables it.",
"admin.gates.section":"Section",
"admin.gates.allSections":"Toutes les sections",
"admin.gates.search":"Rechercher",
"admin.gates.searchPlaceholder":"Filtrer par clé ou libellé",
"admin.gates.sectionOff":"Section désactivé",
"admin.gates.noMatch":"Aucune fonctionnalité ne correspond aux filtres actuels.",
"admin.gates.featureAria":"{label} global",
"admin.gates.sectionsTitle":"Interrupteurs de section globale",
"admin.gates.sectionsDesc":"Turn an entire produit area on or désactivé for all packages. “Section + features” also updates every feature master in that section.",
"admin.knowledge.field.weight":"Poids de priorité",
"admin.knowledge.publishedEligible":"Publié (éligible à la correspondance)",
"admin.knowledge.field.name":"Nom",
"admin.knowledge.field.templateBody":"Corps",
"admin.knowledge.active":"Actif",
"admin.settings.card.aiRolesTitle":"Plateforme AI roles",
"admin.settings.card.aiRolesDesc":"Traitement, vectorization, docs/API, and assistance — separate keys/models",
"admin.settings.roleOff":" (désactivé)",
"admin.settings.roleNotSet":"· not set",
"admin.settings.someRolesUnavailable":"Some AI roles are not disponible on this deployment yet. Traitement still uses the platform OuvrirAI paramètres until all roles are assistanceed.",
"admin.support.disableAuto":"Désactiver l’auto pour ce ticket",
"admin.support.aiDraftTitle":"Brouillon IA (approuver ou modifier)",
"admin.support.aiDraftDesc":"Le mode brouillon seul a laissé une note interne. Modifiez si besoin, puis envoyez au client — ou ignorez et reprenez manuellement.",
"admin.support.confidence":"Confiance {value}",
"admin.support.statusAfterSend":"Statut après envoi",
"admin.support.approveSend":"Approuver et envoyer",
"admin.support.discardDraft":"Ignorer le brouillon",
"admin.support.threadTitle":"Fil",
"admin.support.threadMeta":"{count} · dernière activité {when}",
"admin.support.replyDesc":"Les réponses publiques notifient le client. Les notes internes restent réservées au staff. Le statut par défaut après une réponse publique est en attente.",
"admin.support.internalNote":"Note interne (invisible au client)",
"admin.support.setStatus":"Définir le statut",
"admin.support.statusDefault":"Par défaut",
"admin.support.saveNote":"Enregistrer la note",
"admin.support.sendReply":"Envoyer la réponse",
"admin.support.replyAndResolve":"Répondre et résoudre",
"admin.support.closedBanner":"Ce ticket est fermé. Rouvrez-le pour poursuivre la conversation.",
"admin.support.flash.resolved":"Ticket marqué comme résolu.",
"admin.support.flash.pending":"Ticket marqué en attente (en attente du client).",
"admin.support.flash.reopened":"Ticket rouvert.",
"admin.support.flash.statusSet":"Statut du ticket défini sur {status}.",
"admin.support.flash.autoDisabled":"Réponses automatiques désactivées pour ce ticket.",
"admin.support.flash.autoEnabled":"Réponses automatiques réactivées pour ce ticket.",
"admin.support.loadTicketFailed":"Échec du chargement du ticket",
"admin.support.replyFailed":"Échec de l’envoi de la réponse",
"admin.support.statusFailed":"Échec de la mise à jour du statut",
"admin.support.unassignFailed":"Échec de la désassignation",
"admin.support.assignFailed":"Échec de l’assignation",
"admin.support.autoFailed":"Échec de la mise à jour de la réponse auto",
"admin.support.approveFailed":"Échec de l’approbation du brouillon IA",
"admin.support.discardFailed":"Échec de l’abandon du brouillon IA",
"admin.settings.sourceResolved":"Résolu depuis {sources}",
"admin.settings.sourceUpdated":" · mis à jour {when}",
"admin.settings.updatedAt":"Mis à jour {when}",
"admin.settings.tenantDesc":"Les clés IA et l’e-mail marketing de l’entreprise restent sous Intégrations. Les secrets de session et de chiffrement restent dans l’environnement serveur et ne s’éditent pas ici.",
"admin.settings.perCompanyAiEmail":"IA/e-mail par entreprise —",
"admin.settings.plansCredits":"Forfaits et crédits —",
"admin.settings.fromDatabase":"Depuis la base de données",
"admin.settings.clearApiKey":"Effacer la clé API stockée",
"admin.settings.apiKeyKeepPlaceholder":"•••• laissez vide pour conserver",
"admin.settings.apiKeyNewPlaceholder":"sk-… ou local",
"admin.settings.smtpCardTitle":"Plateforme SMTP",
"admin.settings.smtpCardDesc":"Utilisé pour les invitations mot de passe et l’e-mail sortant plateforme. Resend/SMTP marketing reste par entreprise sous Intégrations → E-mail.",
"admin.settings.clearClientSecret":"Effacer le secret client stocké",
"admin.settings.eprelDesc":"Données publiques gratuites d’étiquettes énergétiques UE pendant le traitement. Activé par défaut pour tous les forfaits — aucune activation ni surclassement payant. Utilisez les contrôles uniquement pour désactiver ou régler le client.",
"admin.settings.optionalKeySaved":"Clé API optionnelle enregistrée",
"admin.settings.noApiKeyNeeded":"Aucune clé API requise",
"admin.settings.optionalApiKey":"Clé API optionnelle",
"admin.settings.optionalApiKeySavedHint":"(enregistré — leave blank to keep)",
"admin.settings.clearEprelKey":"Effacer la clé API EPREL stockée",
"admin.settings.pineconeDesc":"Suggestions optionnelles de catégories vectorielles pendant le traitement. Les valeurs d’environnement hôte sont utilisées si ces champs sont vides.",
"admin.settings.apiKeyConfigured":"Clé API configurée",
"admin.settings.noApiKey":"Pas de clé API",
"admin.settings.apiKeyLabel":"Clé API",
"admin.settings.clearPineconeKey":"Effacer la clé API Pinecone stockée",
"admin.settings.stripeDesc":"Remplacements optionnels de la configuration Stripe serveur. Préférez les champs mot de passe ; les valeurs ne sont plus réaffichées après enregistrement.",
"admin.settings.stripeMock":"Forcer le mode mock Stripe (hors production uniquement — désactive les vrais paiements)",
"admin.settings.webhookSecret":"Secret webhook",
"admin.settings.clearStripeSecret":"Effacer la clé secrète Stripe",
"admin.settings.clearStripeWebhook":"Effacer le secret webhook Stripe",
"admin.settings.feedAllowlistDesc":"Hôtes/CIDR séparés par des virgules autorisés pour les URL de flux privés.",
"admin.settings.adminsDesc":"Administrateurs plateforme actuellement sur ce déploiement",
"admin.settings.onboardingDesc":"Utilisez les e-mails d’invitation set-password pour intégrer les utilisateurs éligibles qui ont encore besoin d’un mot de passe.",
"admin.settings.sendInvites":"Envoyer les e-mails set-password",
"admin.settings.adminStatusBefore":"Les admins plateforme ne peuvent pas être créés depuis cet écran. Confirmez votre accès sur la",
"admin.settings.adminStatusAfter":", ou demandez à un admin/ops existant de promouvoir votre compte.",
"admin.settings.loadUsersFailed":"Échec du chargement des utilisateurs admin",
"admin.settings.sendFailed":"Échec de l’envoi",
"admin.settings.saveMailFailed":"Impossible d’enregistrer les réglages mail",
"admin.settings.smtpNotConfigured":"SMTP n’est pas configuré — activez et enregistrez d’abord les réglages mail.",
"admin.settings.smtpTestFailed":"Échec du test SMTP",
"admin.settings.testEmailFailed":"Impossible d’envoyer l’e-mail de test",
"admin.settings.saveIntegrationFailed":"Impossible d’enregistrer les réglages d’intégration",
"admin.settings.aiSaved":"Paramètres IA {label} enregistrés. Les clés API ne sont plus jamais affichées.",
"admin.settings.aiSaveFailed":"Impossible d’enregistrer les réglages IA {label}",
"admin.settings.aiRole.support.desc":"IA de secours pour auto-réponse tickets — configurez fournisseur/clé/modèle ici ; activez l’envoi dans Connaissances support → Auto-réponse.",
"admin.support.searchPlaceholder":"Rechercher objet, e-mail ou entreprise",
"admin.support.searchAria":"Rechercher des tickets",
"admin.support.assignStaffAria":"Assigner au personnel",
"admin.support.aiDraftAria":"Brouillon IA",
"admin.support.replyPlaceholder":"Écrire une réponse…",
"admin.support.replyAria":"Corps de la réponse",
"admin.knowledge.eyebrow":"Admin plateforme",
"admin.knowledge.title":"Base de connaissances",
"admin.knowledge.description":"Structurez les articles d'aide pour la correspondance FAQ auto. Les agents de contenu remplissent les corps — gardez les faits exacts.",
"admin.knowledge.notReady":"La base de connaissance support n'est pas prête",
"admin.knowledge.noTemplates":"Aucun modèle de réponse",
"admin.knowledge.articleDesc":"Le corps Markdown prend en charge les images via téléversement sécurisé. N'inventez pas de faits produit — laissez des espaces réservés aux agents de contenu.",
"admin.knowledge.faqAutoMatchDesc":"Correspondance de mots-clés à la création du ticket. Seuil par défaut 0,78 (plage 0,50–0,95).",
"admin.knowledge.aiFallbackTitle":"Secours IA",
"admin.knowledge.aiFallbackDesc":"Utilisé lorsque la correspondance FAQ est sous le seuil. Les réponses utilisent le rôle IA plateforme {role}.",
"admin.knowledge.noModel":"aucun modèle",
"admin.knowledge.keyLast4":"clé …{last4}",
"admin.knowledge.sourceLabel":"source {source}",
"admin.knowledge.apiKeyNote":"La clé API vient toujours de ce rôle ; les overrides ci-dessus ne changent que fournisseur / modèle / URL de base.",
"admin.knowledge.saveAutoSettings":"Enregistrer les paramètres d’auto-réponse",
"admin.knowledge.insertImage":"Insérer une image",
"admin.knowledge.uploading":"Téléversement…",
"admin.knowledge.imageUploadHint":"PNG / JPEG / WebP, max 2 Mio. Stocké sous UPLOAD_DIR/support-kb (URL publique HMAC).",
"admin.knowledge.unavailableMsg":"La base de connaissances support n’est pas disponible sur ce déploiement. Contactez votre administrateur de plateforme.",
"admin.knowledge.loadFailed":"Échec du chargement des connaissances support",
"admin.knowledge.loadArticleFailed":"Échec du chargement de l’article",
"admin.knowledge.loadTemplateFailed":"Échec du chargement du modèle",
"admin.knowledge.saveArticleFailed":"Échec de l’enregistrement de l’article",
"admin.knowledge.saveTemplateFailed":"Échec de l’enregistrement du modèle",
"admin.knowledge.deleteArticleFailed":"Échec de la suppression de l’article",
"admin.knowledge.deleteTemplateFailed":"Échec de la suppression du modèle",
"admin.knowledge.saveAutoFailed":"Échec de l’enregistrement des paramètres d’auto-réponse",
"admin.knowledge.uploadImageFailed":"Échec du téléversement de l’image",
"admin.translations.eyebrow":"Plateforme",
"admin.translations.title":"Traductions",
"admin.translations.description":"Examinez la couverture UI du tableau de bord et modifiez les packs de locale basés sur fichiers.",
"admin.bootstrap.description":"Confirmez si votre compte a déjà l'accès admin plateforme. Les nouveaux admins doivent être accordés par un administrateur existant.",
"admin.bootstrap.statusDesc":"L'accès admin plateforme est accordé par un administrateur existant. Il n'y a pas de bootstrap en libre-service pour ce rôle.",
"admin.bootstrap.alreadyAdmin":"Vous avez déjà l'accès admin plateforme.",
"admin.bootstrap.signedInAs":"Connecté en tant que {email}. Ouvrez le panneau admin pour continuer.",
"admin.bootstrap.signedInAsShort":"Connecté en tant que {email}",
"admin.bootstrap.notAdminTitle":"Vous n'êtes pas admin plateforme",
"admin.bootstrap.notAdminMsg":"Votre compte est connecté mais n'est pas marqué admin plateforme. Demandez à un admin existant d'accorder l'accès, puis déconnectez-vous et reconnectez-vous.",
"admin.bootstrap.goToPanel":"Aller au panneau admin",
"admin.bootstrap.loadFailed":"Échec du chargement du profil",
"admin.migrate.title":"Migration d'organisation",
"admin.migrate.description":"Cet outil de migration est retiré et ne modifie aucune donnée.",
"admin.migrate.notAvailable":"Indisponible",
"admin.migrate.body":"La migration d'organisation depuis l'ancien fournisseur d'identité n'est plus nécessaire. Les entreprises et l'auth locale sont gérées dans Utilisateurs et organisations.",
"admin.migrate.hint":"Si vous avez ouvert ceci depuis un ancien signet, continuez avec Utilisateurs et organisations, Facturation plateforme ou Produits bloqués.",
"admin.migrate.adminHome":"Accueil admin",
"admin.migrate.users":"Utilisateurs",
"admin.redirect.diagnostics":"Redirection vers Diagnostics…",
"admin.redirect.stuck":"Redirection vers Produits bloqués…",
"common.refresh":"Actualiser",
"common.delete":"Supprimer",
"common.clearSearch":"Effacer la recherche",
"common.loading":"Chargement…",
"common.never":"Jamais",
"common.back":"Retour",
"common.startOver":"Recommencer",
"common.create":"Créer",
"common.required":"Obligatoire",
"common.actions":"Actions",
"common.status":"Statut",
"common.nameCol":"Nom",
"common.products":"Produits",
"common.more":"+{count} de plus",
"feeds.title":"Vos feeds",
"feeds.loadingDesc":"Chargement de vos feeds fournisseur…",
"feeds.desc":"{page} sur cette page · {total} feeds au total — URL CSV/XML fournisseur et téléversements. Connectez depuis Boutiques pour des options guidées.",
"feeds.storesHub":"Hub des boutiques",
"feeds.addFeed":"Ajouter un feed",
"feeds.searchPlaceholder":"Rechercher des feeds...",
"feeds.emptyTitle":"Pas encore de feeds produits",
"feeds.emptyMessage":"Connectez une URL CSV/XML fournisseur ou téléversez un fichier pour synchroniser des produits dans votre catalogue.",
"feeds.connectFeed":"Connecter un feed",
"feeds.uploadCsvCta":"Téléverser un CSV",
"feeds.noMatchTitle":"Aucun feed correspondant",
"feeds.noMatchMessage":"Essayez un autre terme de recherche, ou effacez la recherche pour voir tous les feeds.",
"feeds.mappingsSaved":"Correspondances de champs enregistrées",
"feeds.mapped":"Mappé",
"feeds.notMapped":"Non mappé",
"feeds.notMappedTitle":"Pas encore de correspondances de champs — ouvrez Mapper pour configurer",
"feeds.productsFromFeed":"{count} produits de ce feed",
"feeds.noProductsYet":"Aucun produit importé depuis ce feed pour l'instant",
"feeds.syncing":"Synchronisation…",
"feeds.syncingShort":"Synchronisation",
"feeds.syncingHint":"Peut prendre quelques minutes pour les grands feeds",
"feeds.liveSync":"Sync du flux",
"feeds.productData":"Données catalogue",
"feeds.mapFields":"Mapper les champs",
"feeds.map":"Mapper",
"feeds.sync":"Synchroniser",
"feeds.syncNow":"Synchroniser maintenant",
"feeds.syncManualTitle":"Lancer une synchronisation ponctuelle maintenant. La sync auto utilise l'intervalle défini à l'édition du feed.",
"feeds.syncInProgress":"Sync en cours",
"feeds.addTitle":"Ajouter un feed",
"feeds.addDesc":"Connectez une URL de feed produits ou téléversez un CSV. Utilisez les exemples ci-dessous pour correspondre à la structure attendue.",
"feeds.fileHint":"Max 5 MiB. Après création, mappez les colonnes puis synchronisez — même flux que les feeds URL.",
"feeds.field.interval":"Intervalle de sync auto (minutes)",
"feeds.field.intervalHint":"Fréquence à laquelle Descrybe doit tirer ce feed automatiquement tant qu'il est actif. Sync dans la liste lance un tirage ponctuel — cela ne modifie pas ce planning.",
"feeds.createFeed":"Créer un feed",
"feeds.editTitle":"Modifier le feed",
"feeds.editDesc":"Mettre à jour le nom, le type, le planning de sync auto ou l'URL source. Sync dans la liste des feeds lance un tirage ponctuel.",
"feeds.csvSource":"Source CSV",
"feeds.uploadedCsv":"CSV téléversé",
"feeds.replaceFileHint":"Pour remplacer le fichier, créez un nouveau feed. La sync relit le téléversement stocké.",
"feeds.csvTypeLocked":"Les feeds CSV téléversés restent de type CSV.",
"feeds.saveChanges":"Enregistrer les modifications",
"feeds.historyTitle":"Historique de sync",
"feeds.historyDesc":"Tâches de sync récentes pour « {name} ».",
"feeds.historyNeverSynced":"Pas encore de sync réussie.",
"feeds.historyLoading":"Chargement de l'historique de sync…",
"feeds.historyEmpty":"Pas encore de tâches de sync.",
"feeds.history.started":"Démarré",
"feeds.history.completed":"Terminé",
"feeds.loadFailed":"Échec du chargement des feeds",
"feeds.copyFailed":"Impossible de copier l'URL",
"feeds.created":"Feed créé",
"feeds.updated":"Feed mis à jour.",
"feeds.mapBeforeSync":"Mappez les champs avant de synchroniser ce feed.",
"feeds.activateBeforeSync":"Activez le feed avant de synchroniser.",
"feeds.syncFinished":"Synchronisation terminée",
"feeds.viewProducts":"Voir les produits",
"feeds.processing":"Traitement",
"feeds.syncFailed":"Échec de la synchronisation",
"feeds.statusUpdateFailed":"Impossible de mettre à jour le statut",
"feeds.deleteConfirm":"Supprimer le feed « {name} » ? Action irréversible.",
"feeds.deleted":"Feed supprimé.",
"feeds.deleteFailed":"Impossible de supprimer le feed",
"feeds.historyLoadFailed":"Impossible de charger l'historique de sync",
"feeds.ftpUnsupported":"La sync FTP/FTPS n'est pas prise en charge. Demandez une URL HTTPS publique à votre fournisseur, téléversez un feed CSV ici, ou importez un fichier depuis Uploads.",
"feeds.ftpUnsupportedShort":"Sync FTP non prise en charge",
"feeds.ftpBadge":"FTP",
"feeds.ftpMigrateBanner":"Certains feeds utilisent encore FTP/FTPS. Descrybe ne peut pas les récupérer. Passez à une URL HTTPS publique, ajoutez un feed CSV, ou téléversez depuis Uploads.",
"feeds.preview.title":"Aperçu de la source du feed",
"feeds.preview.truncated":"Tronqué",
"feeds.preview.refresh":"Actualiser l'aperçu",
"feeds.preview.copy":"Copier l'aperçu",
"feeds.preview.loading":"Chargement de l'aperçu…",
"feeds.preview.empty":"Extrayez le schéma pour prévisualiser la source du feed.",
"feeds.schema.search":"Rechercher des champs…",
"feeds.schema.fieldName":"Nom du champ",
"feeds.schema.sourcePath":"Chemin source",
"feeds.schema.confirm":"Confirmer",
"feeds.schema.apply":"Appliquer",
"feeds.preflight.missingItemPath":"Sélectionnez un chemin d'élément produit avant de synchroniser.",
"feeds.preflight.emptyMappings":"Mappez au moins un champ source avant de synchroniser.",
"feeds.preflight.missingRequired":"Mappez les champs obligatoires avant de synchroniser : {fields}.",
"feeds.preflight.unknownSource":"Certaines sources mappées sont introuvables dans le schéma extrait : {fields}{more}. Ré-extrayez ou corrigez les chemins avant de vous fier aux valeurs d'exemple.",
"feeds.preflight.emptySample":"Les champs obligatoires ont des valeurs d'exemple vides : {fields}. Vérifiez les colonnes source avant une sync complète.",
"feeds.preflight.fix":"Corrigez les correspondances de champs avant de synchroniser.",
"mapping.title":"Mapping du feed",
"mapping.titleNamed":"Mapper : {name}",
"mapping.description":"Sélectionnez l’élément produit répétitif, extrayez les champs source, puis mappez-les vers les champs produit Descrybe.",
"mapping.autoMap":"Auto-mapper",
"mapping.fuzzy":"{count} approximatifs",
"mapping.extractSchema":"Extraire le schéma",
"mapping.backToFeeds":"Retour aux Feeds",
"mapping.ftpStillEdit":"{message} Vous pouvez toujours modifier les mappings. Pour actualiser les produits, passez en HTTPS ou téléversez un fichier.",
"mapping.ftpUploadCta":"Aller aux Uploads",
"mapping.ftpHttpsCta":"Ajouter un feed HTTPS",
"mapping.ftpCsvCta":"Téléverser un feed CSV",
"mapping.loading":"Chargement des détails du feed…",
"mapping.csvHint":"Les feeds CSV utilisent les en-têtes de colonnes comme champs source. Extrayez le schéma pour charger les colonnes, puis continuez le mapping.",
"mapping.howToSelect":"Comment sélectionner l’élément produit :",
"mapping.howToHint":"Guide facultatif",
"mapping.howTo.1":"Extrayez le schéma ou cliquez sur une balise répétée dans l’aperçu",
"mapping.howTo.2":"Chaque élément doit contenir les détails d’un seul produit",
"mapping.howTo.3":"Confirmez le chemin (par exemple",
"mapping.howTo.4":"Continuez à mapper les champs source vers les champs produit",
"mapping.productElementPath":"Chemin de l’élément produit",
"mapping.pathPlaceholder":"ex. rss/channel/item ou products/product",
"mapping.continue":"Continuer →",
"mapping.continueFields":"Continuer vers le mapping des champs →",
"mapping.discovered":"{fields} champs source découverts sur {rows} ligne(s) d’échantillon.",
"mapping.step2Help":"Mappez les colonnes ou nœuds XPath vers vos champs produit. Les obligatoires sont marqués *. Survolez l’aide pour une courte tip.",
"mapping.formatHelp.https":"Utilisez des URL HTTPS publiques pour les feeds distants (pas FTP ni localhost). L’upload CSV convient aux fichiers locaux.",
"mapping.sourcePreview.loading":"Chargement de l’échantillon…",
"mapping.sourcePreview.errorHint":"Vous pouvez encore saisir le chemin de l’élément produit manuellement. Extrayez le schéma quand l’URL est joignable.",
"mapping.sourcePreview.retry":"Réessayer",
"mapping.sourcePreview.empty":"Pas encore d’aperçu",
"mapping.sourcePreview.emptyHintXml":"Cliquez sur « Extraire le schéma » pour télécharger un échantillon et découvrir les champs, ou saisissez un chemin manuellement.",
"mapping.sourcePreview.emptyHintCsv":"Cliquez sur « Extraire le schéma » pour télécharger un échantillon et découvrir les champs.",
"mapping.sourcePreview.selectPath":"Sélectionner le chemin : {path}",
"mapping.sourcePreview.clickTag":"Cliquez sur une ligne de balise pour définir le chemin de l’élément produit.",
"mapping.preview.empty":"Aucun champ mappé pour l’instant",
"mapping.preview.emptyHint":"Mappez des colonnes ou nœuds XPath vers des champs produit. Un aperçu d’échantillon apparaîtra ici.",
"mapping.preview.rawSample":"Extrait brut",
"imports.title":"Téléversements",
"imports.description":"Imports CSV enregistrés pour cet espace de travail — produits, catégories et attributs.",
"imports.importProducts":"Importer des produits",
"imports.emptyTitle":"Aucun upload pour l’instant",
"imports.emptyMessage":"Les imports CSV produits, catégories et attributs apparaîtront ici après téléversement.",
"imports.goProducts":"Aller aux produits",
"imports.categories":"Catégories",
"imports.recent":"Téléversements récents",
"imports.fileCount":"{count} fichier",
"imports.fileCountPlural":"{count} fichiers",
"imports.col.fileName":"Nom du fichier",
"imports.col.kind":"Type",
"imports.col.uploaded":"Téléversé",
"imports.col.size":"Taille",
"imports.actions":"Actions de téléversement",
"imports.loadFailed":"Échec du chargement des téléversements",
"imports.metadataOnlyNotice":"{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.",
"imports.metadataOnlyBadge":"Metadata only (blob not migrated)",
"imports.deleteConfirm":"Supprimer « {name} » ? Cela supprime l’enregistrement d’upload (et le blob local s’il existe).",
"imports.deleted":"Upload suppressé.",
"imports.deleteFailed":"Impossible de supprimer le téléversement",
"imports.status.uploaded":"Téléversé",
"reviews.redirectLoading":"Ouverture des avis WooCommerce…",
"reviews.syncDesc":"Import entrant — tirez les avis produits WooCommerce dans Descrybe pour campagnes et réputation",
"reviews.syncQueued":"Sync des avis mis en file",
"reviews.statusBadge":"Avis : {status}",
"reviews.syncedCount":"{count} synchronisés",
"reviews.lastSync":"Dernière sync : {date}",
"reviews.noSyncYet":"Aucune sync d'avis n'est encore terminée.",
"reviews.needsReconnect":"L’import d’avis ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.",
"reviews.queueImport":"Mettre en file l’import d’avis (boutique → Descrybe)",
"reviews.queueing":"Mise en file...",
"reviews.saveTestFirst":"Enregistrez les identifiants et testez la connexion avant de synchroniser",
"reviews.refreshList":"Actualiser la liste",
"reviews.loading":"Chargement des avis…",
"reviews.emptyTitle":"Aucun avis pour l’instant",
"reviews.emptyMessage":"Mettez en file une synchro d’avis après connexion de la boutique. Cet onglet reste utilisable avec une liste vide.",
"reviews.col.product":"Produit",
"reviews.col.reviewer":"Auteur",
"reviews.col.rating":"Note",
"reviews.col.review":"Examiner",
"reviews.queuedSuccess":"Synchro avis en file. Elle s’exécutera bientôt.",
"reviews.queueFailed":"Impossible de mettre la synchro des avis en file",
"campaigns.title":"Campagnes",
"campaigns.description":"Créez des campagnes e-mail saisonnières à partir de votre catalogue — choisissez une saison, sélectionnez des produits, définissez l’audience, puis générez.",
"campaigns.new":"Nouvelle campagne",
"campaigns.loading":"Chargement campagnes…",
"campaigns.loadFailed":"Échec du chargement campagnes",
"campaigns.deleteConfirm":"Supprimer la campagne « {name} » ? Cette action est irréversible.",
"campaigns.deleted":"Campagne supprimée",
"campaigns.deleteFailed":"Échec de la suppression de la campagne",
"campaigns.partialUnavailable":"Les campagnes ne sont pas pleinement accessibles pour le moment. Générer et envoyer peuvent échouer jusqu’au retour du service.",
"campaigns.unavailableMessage":"Le service campagnes est injoignable. Vous pouvez ouvrir l’assistant, mais générer et envoyer attendront le retour du service.",
"campaigns.openWizard":"Ouvrir l’assistant de création",
"campaigns.backDashboard":"Retour au tableau de bord",
"campaigns.browseProducts":"Parcourir les produits",
"campaigns.emptyTitle":"Pas encore de campagnes",
"campaigns.noMatches":"Aucune correspondance",
"campaigns.emptyMessage":"Créez une campagne Black Friday, Noël ou personnalisée en quelques étapes — des modèles saisonniers sont prêts à l’emploi.",
"campaigns.noMatchesMessage":"Essayez un autre nom, saison ou statut.",
"campaigns.create":"Créer campagne",
"campaigns.col.season":"Saison",
"campaigns.col.updated":"Mis à jour",
"campaigns.scheduled":"Planifié {date}",
"campaigns.newTitle":"Nouvelle campagne",
"campaigns.newDesc":"Choisissez une saison, sélectionnez produits et audience, rédigez le prompt, puis générez, testez et planifiez.",
"campaigns.editTitle":"Modifier campagne",
"campaigns.editDesc":"Mettez à jour la saison, les produits et l’audience — puis régénérez, envoyez un test ou planifiez.",
"campaignWizard.loading":"Chargement de l'assistant de campagne…",
"campaignWizard.apiMissing":"L'API campagnes est temporairement indisponible. Vous pouvez explorer l'assistant ; enregistrer / générer / envoyer nécessitent /api/campaigns joignable.",
"campaignWizard.upgradeTitle":"Les campagnes IA sont une fonctionnalité payante",
"campaignWizard.upgradeMessage":"Les offres Free peuvent préparer saisons et audiences, mais Générer IA nécessite Starter ou plus. Améliorez pour débloquer les brouillons e-mail IA.",
"campaignWizard.comparePlans":"Comparer les offres",
"campaignWizard.step.season":"Saison",
"campaignWizard.step.catalog":"Produits",
"campaignWizard.step.audience":"Audience",
"campaignWizard.step.prompt":"Invite",
"campaignWizard.step.preview":"Aperçu",
"campaignWizard.step.send":"Envoyer",
"campaignWizard.pickSeason":"Choisissez une saison",
"campaignWizard.pickSeasonHelp":"Parte d'un modèle — vous pourrez tout modifier ensuite.",
"campaignWizard.useDefaultPrompt":"Utiliser l'invite saisonnière par défaut",
"campaignWizard.promptLabel":"Invite",
"campaignWizard.advanced":"Options avancées",
"campaignWizard.advancedHelp":"La génération IA utilise votre kit de marque (si défini) et les produits sélectionnés. L'aperçu modèle seul ignore l'IA et sert de maquette.",
"campaignWizard.planFree":"Gratuit",
"campaignWizard.planPaid":"Payant",
"campaignWizard.planLine":"Offre :",
"campaignWizard.aiLocked":"— Générer IA est verrouillé.",
"campaignWizard.generateAi":"Générer IA",
"campaignWizard.templatePreview":"Aperçu du modèle",
"campaignWizard.saveDraft":"Enregistrer le brouillon",
"campaignWizard.previewTitle":"Aperçu",
"campaignWizard.status":"Statut :",
"campaignWizard.generateToSee":"Générez un brouillon pour voir le corps de l'e-mail.",
"campaignWizard.noPreview":"Pas encore d'aperçu. Revenez à Invite et lancez Générer IA ou Aperçu du modèle.",
"campaignWizard.backToPrompt":"Retour à l'invite",
"campaignWizard.subject":"Objet",
"campaignWizard.emailPreview":"Aperçu de l'e-mail",
"campaignWizard.regenerateAi":"Régénérer avec l'IA",
"campaignWizard.regenerate":"Régénérer",
"campaignWizard.continueSend":"Continuer vers l'envoi",
"campaignWizard.testSend":"Envoi test",
"campaignWizard.testSendHelp":"Envoyez-vous une copie avant de planifier.",
"campaignWizard.scheduleHelp":"Choisissez quand cette campagne doit partir.",
"campaignWizard.sendAt":"Envoyer à",
"campaignWizard.schedule":"Planifier la campagne",
"campaignWizard.generateToContinue":"Générez pour continuer",
"campaignWizard.done":"Terminé",
"campaignWizard.loadFailed":"Échec du chargement de l'assistant",
"campaignWizard.pickCatalog":"Choisissez au moins une catégorie ou un produit",
"campaignWizard.pickAudienceCats":"Choisissez des catégories d’audience pour ce filtre",
"campaignWizard.completeStep":"Terminez cette étape pour continuer",
"campaignWizard.aiDraftReady":"Brouillon IA généré",
"campaignWizard.templateReady":"Aperçu du modèle prêt",
"campaignWizard.unavailableSave":"Les campagnes ne sont pas disponibles. Les brouillons ne peuvent pas être enregistrés tant que la fonctionnalité n’est pas en ligne.",
"campaignWizard.generateFailed":"Échec de la génération",
"campaignWizard.generateFirst":"Générez d’abord un aperçu",
"campaignWizard.enterTestEmail":"Saisissez une adresse e-mail de test",
"campaignWizard.testFailed":"Échec de l’envoi de test",
"campaignWizard.pickSchedule":"Choisissez une date et une heure",
"campaignWizard.scheduled":"Campagne planifiée",
"campaignWizard.scheduleFailed":"Échec de la planification",
"marketing.emptyMessage":"Les préréglages du calendrier apparaîtront ici lorsque l’API marketing sera disponible.",
"marketing.openCampaigns":"Ouvrir les campagnes e-mail",
"marketing.window":"Fenêtre :",
"marketing.linkedExport":"Export lié :",
"marketing.openPrepared":"Ouvrir le feed préparé",
"marketing.preparing":"Préparation…",
"marketing.prepareNamed":"Préparer la campagne {name}",
"marketing.footer":"Les campagnes e-mail restent sur {link} — cette page prépare seulement les feeds d'export catalogue.",
"common.done":"Terminé",
"common.copied":"Copié dans le presse-papiers.",
"common.copyFailed":"Impossible de copier. Sélectionnez le texte et copiez-le manuellement.",
"common.submitting":"Envoi…",
"common.sending":"Envoi…",
"settings.companyAdminOnlyView":"Seuls les admins de l'entreprise peuvent modifier les paramètres. Vous pouvez voir les détails de l'espace de travail actuel.",
"settings.activeCompanyHelp":"Espace de travail pour catalogue, feeds, facturation et clés API. Changez à tout moment ici ou dans l'en-tête.",
"settings.creditsOverviewHelp":"Solde de crédits IA de l'entreprise active. L'utilisation détaillée est dans Facturation.",
"settings.billingLabel":"Facturation",
"settings.remainingLabel":"Restants",
"settings.creditsUnavailable":"Le solde de crédits n'est pas encore disponible pour cet espace de travail.",
"settings.openBilling":"Ouvrir utilisation et facturation",
"settings.companyNameHelp":"Ce nom apparaît dans les invitations et les paramètres de l'organisation",
"settings.contentSettingsHelp":"Configurez la langue et la correspondance produits pour le contenu généré",
"settings.mergeProductsHelp":"Lorsque activé, les imports CSV combinent les lignes partageant un GTIN en un produit. Désactivez pour garder chaque ligne indépendante.",
"settings.emailIntegrationHelp":"Configurez Resend ou SMTP pour invitations, campagnes et e-mails transactionnels.",
"settings.configureEmail":"Configurer l'e-mail",
"settings.aiIntegrationsHelp":"Crédits plateforme ou votre propre clé, plus invites modifiables pour titres, descriptions, SEO et campagnes. Clés chiffrées au repos.",
"settings.openAiIntegrations":"Ouvrir les intégrations IA",
"settings.companyNameRequired":"Saisissez un nom d'entreprise.",
"settings.companySaved":"Paramètres de l'entreprise enregistrés.",
"settings.companyUpdateFailed":"Impossible de mettre à jour l'entreprise",
"settings.mergeOn":"Les produits avec le même GTIN seront fusionnés entre feeds.",
"settings.mergeOff":"Les produits avec le même GTIN restent séparés.",
"settings.mergeUpdateFailed":"Impossible de mettre à jour le paramètre de fusion",
"settings.inAppToastsHelp":"Stocké uniquement dans ce navigateur. Les échecs sont activés par défaut ; les achèvements sont masqués pour réduire le bruit. Les retours de formulaire et Annuler ne sont jamais masqués.",
"settings.emailAlertsHelp":"Les préférences d’alertes e-mail arrivent bientôt. Les alertes d’échec seront activées par défaut (comme in-app) ; les e-mails d’achèvement resteront off sauf opt-in.",
"settings.emailAlertsBody":"Pour l’instant, configurez le mail transactionnel sous Entreprise → Intégration e-mail. Les alertes in-app ci-dessus s’appliquent toujours.",
"settings.apiKeysLegacyNotice":"Les clés API héritées n’ont pas été migrées. Créez-en une nouvelle pour restaurer l’accès — le secret n’est affiché qu’une fois.",
"settings.apiKeysAdminOnly":"Seuls les administrateurs peuvent créer ou révoquer des clés API. Vous pouvez voir les préfixes existants.",
"settings.apiKeysCopyUnavailableNotice":"Copie indisponible pour les clés existantes — seul le préfixe est stocké. Créez une nouvelle clé pour copier le secret une fois, puis révoquez l’ancienne si besoin.",
"settings.apiKeysForbidden":"Vous n’avez pas l’autorisation de voir les clés API. Demandez de l’aide à un administrateur.",
"settings.noApiKeys":"Pas encore de clés API",
"settings.noApiKeysHelpAdmin":"Les clés API héritées n’ont pas été migrées. Créez-en une pour authentifier les requêtes Descrybe (X-API-Key). Le secret complet n’est affiché qu’une fois.",
"settings.noApiKeysHelpMember":"Aucune clé API pour cette entreprise. Les clés héritées n’ont pas été migrées — demandez à un administrateur d’en créer une.",
"settings.unnamedKey":"Clé sans nom",
"settings.neverUsed":"Jamais utilisé",
"settings.apiKeyActions":"Actions de clé API",
"settings.copyUnavailable":"Copie indisponible",
"settings.copyUnavailableTitle":"Le secret complet n’est affiché qu’une fois à la création de la clé",
"settings.revoke":"Révoquer",
"settings.apiKeyNameRequired":"Saisissez un nom pour cette clé API.",
"settings.apiKeyCreatedOnce":"Clé API créée. Copiez-la maintenant — elle ne sera plus affichée.",
"settings.apiKeyCreated":"Clé API créée.",
"settings.apiKeyCreateFailed":"Impossible de créer la clé API",
"settings.apiKeyRevokeConfirm":"Révoquer cette clé API ? Les requêtes qui l’utilisent cesseront de fonctionner.",
"settings.apiKeyRevoked":"Clé API révoquée.",
"settings.apiKeyRevokeFailed":"Impossible de révoquer la clé API",
"settings.apiKeyCopied":"Clé API copiée.",
"settings.createApiKeyOnceHelp":"Copiez cette clé maintenant — elle ne sera plus affichée. Utilisez-la en Authorization: Bearer ou X-API-Key sur /api/v1.",
"settings.createApiKeyNameHelp":"Nommez la clé pour la distinguer plus tard. Après création, envoyez-la en Authorization: Bearer (préféré) ou X-API-Key.",
"settings.alert.ai_done.description":"Lorsqu’une tâche d’arrière-plan se termine avec succès. Les toasts de démarrage restent toujours actifs pour qu’Annuler reste disponible.",
"toast.structured.fieldAddedBody":"Le champ de description structurée a été ajouté.",
"toast.structured.fieldDeleted":"Champ supprimé",
"toast.structured.fieldDeletedBody":"Le champ de description structurée a été supprimé.",
"toast.structured.addFailed":"Échec de l’ajout du champ",
"toast.structured.deleteFailed":"Échec de la suppression du champ",
"toast.brand.saved":"Kit de marque enregistré",
"toast.brand.logoUploaded":"Logo téléversé",
"toast.brand.saveFailed":"Échec de l’enregistrement du kit de marque",
"toast.brand.uploadFailed":"Échec du téléversement du logo",
"toast.vector.indexCreated":"Index vectoriel créé avec succès",
"toast.vector.dbInitialized":"Base de données vectorielle initialisée avec succès",
"toast.vector.indexFailed":"Échec de la création de l’index vectoriel",
"toast.vector.initFailed":"Échec de l’initialisation de la base vectorielle",
"toast.vector.searchFailed":"Échec de la recherche de catégories",
"toast.export.refreshFailed":"Échec de l'actualisation du feed",
"toast.mapping.loadFailed":"Échec du chargement du mapping du feed",
"toast.mapping.extractFailed":"Échec de l’extraction du schéma",
"toast.mapping.saveFailed":"Échec de l’enregistrement des mappages",
"toast.mapping.sampleFailed":"Échec de la synchro + traitement de l’échantillon",
"toast.attrs.createFailed":"Échec de la création",
"toast.attrs.importFailed":"Échec de l'import",
"toast.attrs.updateFailed":"Échec de la mise à jour",
"toast.attrs.deleteFailed":"Échec de la suppression",
"toast.switcher.loadUsersFailed":"Impossible de charger les utilisateurs commutables",
"toast.switcher.switchFailed":"Impossible de changer d’utilisateur",
"toast.switcher.returnFailed":"Impossible de revenir à l’utilisateur d’origine",
"toast.switcher.companyFailed":"Impossible de changer d’entreprise",
"toast.requestFailed":"Échec de la requête",
"flash.campaign.unavailableDraft":"Les campagnes ne sont pas disponibles. Les brouillons ne peuvent pas être enregistrés tant que la fonctionnalité n’est pas en ligne.",
"flash.campaign.testEmailRequired":"Saisissez une adresse e-mail de test",
"flash.campaign.scheduleRequired":"Choisissez une date et une heure",
"flash.campaign.unavailable":"Les campagnes ne sont pas disponibles pour le moment.",
"flash.campaign.generateFailed":"Échec de la génération",
"flash.campaign.testFailed":"Échec de l’envoi de test",
"flash.campaign.scheduleFailed":"Échec de la planification",
"flash.campaign.saveFailed":"Échec de l'enregistrement",
"flash.feed.copyFailed":"Impossible de copier l'URL",
"flash.feed.csvRequired":"Veuillez choisir un fichier .csv.",
"flash.feed.csvFileRequired":"Veuillez choisir un fichier CSV.",
"flash.feed.urlRequired":"L’URL du feed est obligatoire.",
"flash.feed.updated":"Feed mis à jour.",
"flash.feed.syncFinishedNamed":"Synchronisation terminée pour « {name} » ({status} : {products}).",
"flash.feed.deleted":"Feed supprimé.",
"flash.feed.createFailed":"Impossible de créer le feed",
"flash.feed.updateFailed":"Impossible de mettre à jour le feed",
"flash.settings.companyNameRequired":"Saisissez un nom d'entreprise.",
"flash.settings.companySaved":"Paramètres de l'entreprise enregistrés.",
"flash.settings.companyFailed":"Impossible de mettre à jour l'entreprise",
"flash.settings.mergeFailed":"Impossible de mettre à jour le paramètre de fusion",
"flash.settings.apiKeyNameRequired":"Saisissez un nom pour cette clé API.",
"flash.settings.apiKeyCreatedFailed":"Impossible de créer la clé API",
"flash.settings.apiKeyRevoked":"Clé API révoquée.",
"flash.settings.apiKeyRevokeFailed":"Impossible de révoquer la clé API",
"flash.settings.copyFailed":"Impossible de copier. Sélectionnez le texte et copiez-le manuellement.",
"flash.products.accepted":"{count} produit(s) accepté(s) — déplacés vers Traités.",
"flash.products.updated":"Produit mis à jour.",
"flash.products.enrichmentAccepted":"Enrichissement accepté — déplacé vers Traités.",
"flash.products.originalEmpty":"La valeur d'origine est vide ; l'enrichissement ne peut pas être effacé via PATCH.",
"flash.products.selectExport":"Sélectionnez au moins un produit à exporter.",
"flash.products.exported":"{count} produit(s) exporté(s) via le feed d’export.",
"flash.support.missingId":"Identifiant de ticket manquant",
"flash.support.notFound":"Ticket introuvable",
"flash.support.unavailable":"Le support est temporairement indisponible.",
"flash.support.ratingUnavailable":"L’évaluation est temporairement indisponible. Réessayez plus tard.",
"flash.support.alreadyRated":"Vous avez déjà évalué ce ticket.",
"flash.support.queueUnavailable":"La file de support n’est pas disponible sur ce déploiement.",
"flash.support.deploymentUnavailable":"Le support n'est pas disponible sur ce déploiement.",
"flash.support.replyRequired":"Le corps de la réponse est obligatoire.",
"flash.support.draftRequired":"Le corps du brouillon est obligatoire avant approbation.",
"flash.admin.articleUpdated":"Article mis à jour.",
"flash.admin.articleCreated":"Article créé.",
"flash.admin.templateUpdated":"Modèle mis à jour.",
"flash.admin.templateCreated":"Modèle créé.",
"flash.admin.articleDeleted":"Article supprimé.",
"flash.admin.templateDeleted":"Modèle supprimé.",
"flash.admin.autoReplySaved":"Paramètres de réponse automatique enregistrés.",
"flash.admin.imageUploaded":"Image téléversée et insérée dans le markdown.",
"flash.admin.translationsSaved":"{count} chaîne(s) enregistrée(s) pour {locale}. Commitez le pack de messages quand prêt.",
"flash.admin.featuresUpdated":"{key} mis à jour.",
"flash.admin.featuresAllOn":"Toutes les fonctionnalités activées pour cette offre.",
"flash.admin.featuresAllOff":"Toutes les fonctionnalités désactivées pour cette offre.",
"flash.admin.profileApplied":"Profil {label} appliqué à {name}.",
"flash.admin.overridesCleared":"Overrides effacés — utilisation des valeurs par défaut du nom d’offre.",
"empty.plans.none":"Aucune offre trouvée.",
"empty.plans.noMatch":"Aucune offre ne correspond à ce filtre.",
"empty.plans.selectPackage":"Sélectionnez un forfait pour modifier les fonctionnalités.",
"empty.products.processingTitle":"Aucun produit en cours de traitement",
"empty.products.processingMessageCan":"La progression en direct est sur Traitement. Ouvrez une tâche en cours pour voir le statut des étapes ; cet onglet listera les produits en cours lorsque le filtrage par éléments sera disponible.",
"empty.products.processingMessageCannot":"Les produits actuellement dans une tâche apparaissent ici une fois le traitement démarré depuis le catalogue.",
"empty.products.reviewTitle":"Aucun produit nécessitant une révision",
"empty.products.reviewMessage":"Après une tâche, les produits enrichis arrivent ici. Ouvrez une ligne pour comparer original vs enrichi, puis Accepter, modifier ou Rejeter.",
"empty.products.errorTitle":"Aucun produit avec erreurs",
"empty.products.errorMessage":"Lorsqu’une tâche échoue pour un produit, il apparaît ici pour que vous puissiez réessayer.",
"empty.products.filterTitleUnprocessed":"Aucune correspondance non traitée",
"empty.products.filterTitle":"Aucun produit ne correspond",
"empty.products.filterMessage":"Essayez une autre recherche, catégorie ou feed — ou effacez les filtres pour tout voir.",
"empty.products.unprocessedTitle":"Pas encore de produits non traités",
"empty.products.unprocessedMessage":"Connectez un feed fournisseur ou téléversez un CSV pour importer des produits.",
"empty.products.noneTitle":"Pas encore de produits",
"empty.products.noneMessageStores":"Importez depuis un feed ou une boutique, puis démarrez un traitement pour construire le catalogue.",
"empty.products.noneMessage":"Importez depuis un feed ou téléversez un CSV, puis démarrez un traitement.",
"empty.products.viewJobs":"Voir les tâches",
"empty.products.startJob":"Démarrer une tâche",
"empty.products.clearFilters":"Effacer les filtres",
"empty.products.viewProcessed":"Voir les traités",
"empty.products.retryCatalog":"Réessayer depuis le catalogue",
"empty.products.connectFeed":"Connecter un feed",
"empty.products.addProduct":"Ajouter un produit",
"empty.products.uploadCsv":"Téléverser CSV",
"empty.feeds.noneTitle":"Pas encore de feeds produits",
"empty.feeds.noneMessage":"Connectez une URL CSV/XML fournisseur ou téléversez un fichier. Ensuite : Map → Sync → Process.",
"empty.feeds.noMatchMessage":"Essayez un autre terme de recherche, ou effacez la recherche pour voir tous les feeds.",
"empty.export.loadFailedTitle":"Impossible de charger les feeds d’export",
"empty.export.loadFailedMessage":"Une erreur s'est produite lors du chargement de vos exports. Réessayez ou consultez l'erreur ci-dessus pour plus de détails.",
"empty.export.noneTitle":"Pas encore de feeds d'export",
"empty.export.noneMessage":"Créez un feed Google Shopping, Meta ou CSV/XML personnalisé pour choisir quels produits et champs sortir. Générez une URL publique pour Merchant Center ou tout partenaire — ou exportez une sous-sélection depuis Produits.",
"empty.export.noMatchMessage":"Essayez un autre terme de recherche.",
"empty.files.noneTitle":"Aucun upload pour l’instant",
"empty.files.noneMessage":"Les imports CSV (produits, catégories, attributs) apparaissent ici après upload. Après une migration plateforme, les contenus de fichiers (blobs) n’ont pas été copiés — ré-uploadez-les si besoin.",
"empty.files.uploadCta":"Téléverser un CSV",
"empty.export.fromProductsCta":"Exporter depuis Produits",
"empty.dashboard.noJobsTitle":"Aucun job récent",
"empty.dashboard.noJobsMessage":"Les jobs apparaissent ici après un démarrage depuis Produits. Enrichissez titres et descriptions avant d’exporter.",
"empty.stores.noneMessage":"Connectez WooCommerce ou Shopify pour synchroniser catalogue et commandes. Fichier fournisseur ? Utilisez une URL de flux ou un CSV.",
"empty.stores.noneMessageMember":"Seuls les admins de l'entreprise peuvent connecter WooCommerce ou Shopify. Demandez de l'aide à un admin, ou utilisez Feed URL/CSV si votre rôle le permet.",
"empty.woo.openConnection":"Ouvrir les paramètres de connexion",
"empty.shopify.openConnection":"Ouvrir les paramètres de connexion",
"empty.processing.noneTitle":"Aucun job pour l'instant",
"empty.processing.noneMessage":"Démarrez un job depuis Produits quand vous êtes prêt. La progression et l'historique apparaîtront ici.",
"empty.campaigns.unavailableMessage":"Le service campagnes est injoignable. Vous pouvez ouvrir l’assistant, mais générer et envoyer attendront le retour du service.",
"empty.structured.unavailableMessage":"Cette API n’est pas encore sur ce backend. Vous ne pouvez pas gérer les champs Export ID ici tant que /api/structured-descriptions n’est pas branchée.",
"empty.structured.noneTitle":"Aucun champ de description structurée pour l’instant",
"empty.structured.noneMessage":"Ajoutez un champ ici, ou créez des Export ID dans une formule de description de catégorie — ils apparaîtront pour les feeds d’export.",
"empty.support.noneTitle":"Aucun ticket pour l’instant",
"empty.support.unavailableMessage":"L’API support est injoignable. Réessayez sous peu, ou ouvrez un nouveau ticket une fois le service disponible.",
"empty.support.filterMessage":"Aucun ticket ne correspond à ce statut. Essayez un autre filtre ou créez un ticket.",
"empty.support.noneMessage":"Décrivez votre problème ; notre équipe répondra dans ce fil. Vous recevrez aussi une notification in-app lorsque le personnel répond.",
"empty.support.ticketNotFoundMessage":"Ce ticket a peut-être été supprimé ou vous n’y avez pas accès.",
"empty.support.noMessagesTitle":"Aucun message",
"empty.support.noMessagesMessage":"Ce fil n’a pas encore de messages.",
"empty.settings.noApiKeysTitle":"Pas encore de clés API",
"empty.shopify.noOrdersTitle":"Pas encore de commandes",
"empty.shopify.noOrdersMessage":"Les commandes apparaissent après connexion Shopify et un import commandes. Les listes vides sont normales jusqu’au premier sync.",
"empty.woo.noOrdersTitle":"Pas encore de commandes",
"empty.woo.noOrdersMessage":"Les commandes apparaissent après connexion WooCommerce et une sync commandes. Les listes vides sont normales jusqu’au premier sync.",
"empty.woo.noReviewsTitle":"Aucun avis pour l’instant",
"empty.woo.noReviewsMessage":"Les avis apparaissent après une mise en file d’import depuis une boutique connectée. Cet onglet reste utilisable avec une liste vide.",
"empty.admin.noProviderTitle":"Aucune ligne fournisseur",
"empty.admin.noProviderMessage":"Les jetons apparaissent ici lorsque les produits enregistrent un type de fournisseur.",
"empty.admin.noCompaniesMatch":"Aucune entreprise ne correspond à ce filtre.",
"empty.admin.notPlatformTitle":"Vous n'êtes pas admin plateforme",
"empty.admin.notPlatformMessage":"Votre compte est connecté mais n'est pas marqué admin plateforme. Demandez à un admin existant d'accorder l'accès, puis déconnectez-vous et reconnectez-vous.",
"empty.admin.noJobsFilter":"Aucune tâche pour ce filtre.",
"support.emptyTitle":"Aucun ticket pour l’instant",
"support.unavailableEmpty":"L’API support est injoignable. Réessayez sous peu, ou ouvrez un nouveau ticket une fois le service disponible.",
"support.emptyFiltered":"Aucun ticket ne correspond à ce statut. Essayez un autre filtre ou créez un ticket.",
"support.emptyHelp":"Décrivez votre problème ; notre équipe répondra dans ce fil. Vous recevrez aussi une notification in-app lorsque le personnel répond.",
"support.new.description":"Dites-nous de quoi vous avez besoin. Incluez étapes, messages d’erreur ou détails de facture si pertinent.",
"support.new.back":"Retour to tickets",
"support.new.details":"Détails du ticket",
"support.new.detailsHelp":"Statut starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.",
"support.new.subject":"Objet",
"support.new.subjectPlaceholder":"Résumé court",
"support.new.category":"Catégorie",
"support.new.priority":"Priorité",
"support.new.optional":"Facultatif details",
"support.new.optionalHint":"(SKU, tags — aide au routage)",
"catalog.saveChanges":"Enregistrer les modifications",
"catalog.saveFormula":"Enregistrer la formule",
"catalog.saveFormulaShort":"Enregistrer la formule",
"catalog.noResults":"Aucun résultat",
"products.title":"Produits",
"products.description":"Parcourez, examinez et traitez votre catalogue.",
"products.loadFailed":"Échec du chargement des produits",
"products.unnamed":"Produit sans nom",
"products.tabs.navLabel":"Vues produits",
"products.tab.processed":"Traités",
"products.tab.processedHint":"Produits terminés prêts à exporter ou synchroniser",
"products.tab.needsReview":"À revoir",
"products.tab.needsReviewHint":"Produits enrichis à accepter, modifier ou rejeter",
"products.tab.needsReviewShort":"Examiner",
"products.tab.error":"Erreurs",
"products.tab.errorHint":"Produits ayant échoué pendant un job",
"products.tab.processing":"En cours",
"products.tab.processingHint":"Produits dans un job en cours",
"products.tab.busy":"En cours",
"products.tab.unprocessed":"Non traités",
"products.tab.unprocessedHint":"Produits du catalogue pas encore traités",
"products.tab.raw":"Non traités",
"products.status.processed":"Traités",
"products.status.needsReview":"À revoir",
"products.status.processing":"Traitement",
"products.status.error":"Erreur",
"products.status.failed":"Échoué",
"products.status.unprocessed":"Non traités",
"products.status.pending":"En attente",
"products.status.unknown":"Inconnu",
"products.pagination.showing":"Affichage {start}–{end} sur {total}",
"products.empty.processing.title":"Aucun job pour l'instant",
"products.empty.processing.messageJobs":"Rien n'est en cours. Démarrez un job depuis Non traités, ou ouvrez Traitement pour suivre la progression.",
"products.empty.processing.messageBasic":"Les produits apparaissent ici pendant qu'un job tourne.",
"products.empty.needsReview.title":"Aucun produit nécessitant une révision",
"products.empty.needsReview.message":"Après une tâche, les produits enrichis arrivent ici. Ouvrez une ligne pour comparer original vs enrichi, puis Accepter, modifier ou Rejeter.",
"products.empty.error.title":"Aucun produit avec erreurs",
"products.empty.error.message":"Lorsqu’une tâche échoue pour un produit, il apparaît ici pour que vous puissiez réessayer.",
"products.empty.noUnprocessedMatches":"Aucune correspondance non traitée",
"products.empty.noMatch":"Aucun produit ne correspond",
"products.empty.filtersHint":"Essayez une autre recherche, catégorie ou feed — ou effacez les filtres pour tout voir.",
"products.empty.noUnprocessed.title":"Pas encore de produits non traités",
"products.empty.noUnprocessed.message":"Connectez un feed fournisseur ou téléversez un CSV pour importer des produits.",
"products.empty.none.title":"Pas encore de produits",
"products.empty.none.messageStores":"Terminez d’abord Feeds → Map → Sync, puis Process. Importez depuis un flux ou une boutique.",
"products.empty.none.messageBasic":"Terminez d’abord Feeds → Map → Sync, puis Process. Connectez un flux ou téléversez un CSV.",
"products.actions.viewJobs":"Voir les tâches",
"products.actions.startJob":"Démarrer une tâche",
"products.actions.viewProcessed":"Voir les traités",
"products.actions.retryFromCatalog":"Réessayer depuis le catalogue",
"products.actions.connectFeed":"Connecter un feed",
"products.actions.addProduct":"Ajouter un produit",
"products.actions.uploadCsv":"Téléverser CSV",
"products.actions.exportSelected":"Exporter la sélection",
"products.export.title":"Exporter les produits sélectionnés",
"products.export.confirm":"Confirmer l'export",
"products.export.loadFailed":"Échec du chargement des options de feed d'export. Veuillez réessayer.",
"products.export.noneFound":"Aucun feed d'export pour l'instant. Créez-en un sous Feeds d'export, puis revenez exporter votre sélection.",
"products.export.selectFormat":"Veuillez sélectionner un feed d'export.",
"products.export.failed":"Impossible d'exporter les produits sélectionnés",
"products.upload.title":"Téléverser CSV",
"products.upload.description":"Importez des produits depuis un CSV (GTIN/EAN, nom, catégorie, …). Téléchargez l'échantillon pour l'ensemble complet des colonnes.",
"products.upload.submit":"Téléverser et importer",
"products.upload.chooseFirst":"Choisissez d'abord un fichier CSV.",
"products.upload.csvOnly":"Veuillez téléverser un fichier CSV.",
"products.upload.tooLarge":"CSV must be 5 MB or smaller.",
"products.processing.started":"Tâche de traitement démarrée",
"products.processing.startFailed":"Impossible de démarrer le traitement",
"products.processing.startJobFailed":"Impossible de démarrer la tâche de traitement",
"products.processing.jobsCancelled":"Tâches de traitement annulées",
"products.processing.cancelFailed":"Impossible d'annuler la tâche de traitement",
"products.processing.justCancelled":"La tâche qui vient de démarrer a été annulée.",
"products.processing.viewInProcessing":"Voir dans Traitement",
"products.processing.confirm":"Confirmer le traitement",
"products.processing.freePlanTitle":"Offre Free — traitement sans IA",
"products.processing.freePlanBody":"Normalisation, spécifications, complétion et EPREL n’utilisent aucun crédit. Les titres/descriptions AI nécessitent une formule payante ou des crédits.",
"products.enrichment.state.feed":"Depuis le feed",
"products.enrichment.state.missing":"Manquants",
"products.enrichment.help.name":"Titre du produit. Vert = nom traité par AI ; orange = nom du flux/original uniquement ; gris = manquant.",
"products.enrichment.help.description":"Description du produit. Vert = traitée par AI ; orange = flux/original uniquement ; gris = manquante.",
"products.enrichment.help.attributes":"Spécifications et attributs. Vert = attributs AI/enrichis ; orange = depuis le flux uniquement ; gris = aucun.",
"products.enrichment.help.category":"Catégorie assignée. Vert = catégorie définie ; gris = manquante.",
"categories.searchPlaceholder":"Rechercher par nom ou ID...",
"categories.created":"{name} a été créé.",
"categories.updated":"La catégorie a été mise à jour avec succès.",
"categories.deleted":"La catégorie a été supprimée avec succès.",
"categories.notFound":"Catégorie introuvable.",
"categories.loadCategoryFailed":"Échec du chargement de la catégorie",
"categories.noCategoriesYet":"Aucune catégorie pour l'instant",
"categories.noMatch":"Aucune catégorie ne correspond à « {query} ». Effacez la recherche ou essayez un autre terme.",
"categories.emptyHint":"Ajoutez une catégorie ou importez un CSV pour construire votre arbre.",
"categories.promptCountOne":"{count} catégorie a un prompt de génération IA. Ouvrez le menu ⋮ → Modifier le prompt IA, ou modifiez une catégorie et choisissez Modifier le prompt IA.",
"categories.promptCountMany":"{count} catégories ont un prompt de génération IA. Ouvrez le menu ⋮ → Modifier le prompt IA, ou modifiez une catégorie et choisissez Modifier le prompt IA.",
"categories.actions":"Actions de catégorie",
"categories.chooseCsv":"Choisir CSV",
"categories.createSingleOrImport":"Créez une seule catégorie ou importez-en plusieurs depuis un CSV.",
"categories.createSingle":"Créer une seule catégorie.",
"fields.deleteFieldConfirm":"Cette action est irréversible. Elle supprimera définitivement le champ et le retirera de tout modèle qui l'utilise.",
"fields.deleteGroupConfirm":"Cette action est irréversible. Elle supprimera définitivement le groupe. Les champs de ce groupe devront être réaffectés.",
"attributes.type.multiselect.hint":"Choisissez une ou plusieurs options dans une liste",
"standardFields.title":"Champs standard",
"standardFields.description":"Définissez des champs produit standard et organisez-les en groupes",
"standardFields.apiUnavailable":"L'API des champs standard n'est pas disponible. Les modifications ne peuvent pas être enregistrées.",
"standardFields.apiUnreachable":"L'API des champs standard n'est pas joignable pour le moment. Créer/modifier reste désactivé jusqu'à ce que /api/standard-fields et /api/field-groups répondent.",
"standardFields.loading":"Chargement des champs standard…",
"standardFields.tab.fields":"Champs",
"standardFields.tab.groups":"Groupes",
"standardFields.heading":"Champs standard",
"standardFields.headingHint":"Activez les champs pour le mapping et le traitement — une bascule par ligne.",
"standardFields.enableRecommended":"Activer les recommandés",
"standardFields.enableSelected":"Activer la sélection ({count})",
"standardFields.disableSelected":"Désactiver la sélection",
"standardFields.addField":"Ajouter un champ",
"standardFields.searchFields":"Rechercher des champs...",
"standardFields.col.enabled":"Activé",
"standardFields.col.name":"Nom",
"standardFields.col.key":"Clé",
"standardFields.col.type":"Type",
"standardFields.col.unit":"Unité",
"standardFields.col.group":"Groupe",
"standardFields.col.status":"Statut",
"standardFields.emptySearch":"Aucun champ ne correspond à votre recherche",
"standardFields.emptyHint":"Aucun champ trouvé. Cliquez sur « Ajouter un champ » pour en créer un.",
"standardFields.updateField":"Mettre à jour le champ",
"standardFields.createField":"Créer un champ",
"standardFields.editGroup":"Modifier le groupe",
"standardFields.addNewGroup":"Ajouter un groupe",
"standardFields.editGroupDesc":"Mettez à jour les détails de ce groupe de champs",
"standardFields.addGroupDesc":"Créez un nouveau groupe pour organiser vos champs standard",
"standardFields.group.name":"Nom",
"standardFields.group.namePlaceholder":"Informations de base",
"standardFields.group.nameHint":"Nom affiché de ce groupe",
"standardFields.group.description":"Description",
"standardFields.group.descriptionPlaceholder":"Saisissez une description pour ce groupe",
"standardFields.group.descriptionHint":"Description facultative expliquant le but de ce groupe",
"standardFields.group.order":"Ordre d'affichage",
"standardFields.group.orderHint":"Les numéros plus bas apparaissent en premier",
"standardFields.updateGroup":"Mettre à jour le groupe",
"standardFields.createGroup":"Créer un groupe",
"standardFields.deleteFieldDesc":"Cette action est irréversible. Elle supprimera définitivement le champ et le retirera de tout modèle qui l'utilise.",
"standardFields.deleteGroupDesc":"Cette action est irréversible. Elle supprimera définitivement le groupe. Les champs de ce groupe devront être réaffectés.",
"standardFields.tip.specifications":"Champ specs hérité ; préférez specs lorsque les deux existent.",
"export.dialog.title":"Exporter les produits sélectionnés",
"export.dialog.description":"Exporter {count} produit(s) sélectionné(s). Choisissez le feed d'export qui définit format et champs — comme choisir quoi synchroniser, mais pour un téléchargement ou un partenaire.",
"export.dialog.loadFailed":"Échec du chargement des options de feed d'export. Veuillez réessayer.",
"export.dialog.selectPlaceholder":"Sélectionnez un feed d'export…",
"export.dialog.help":"Votre sélection choisit les produits ; le feed choisit le format du canal et les champs mappés.",
"export.dialog.emptyTitle":"Aucun feed d'export pour l'instant",
"export.dialog.emptyMessage":"Créez un feed d'export pour choisir format et champs, puis revenez exporter cette sélection.",
"export.dialog.createFeedCta":"Créer un feed d'export",
"export.dialog.confirmAria":"Confirmer l'export",
"export.dialog.export":"Exporter",
"billing.title":"Utilisation et facturation",
"billing.loadFailed":"Échec du chargement de la facturation",
"billing.usageLoadFailed":"Échec du chargement de l'utilisation",
"billing.checkoutComplete":"Checkout terminé. Votre plan et vos crédits seront actualisés sous peu.",
"billing.checkoutCompletePlan":"Plan mis à jour. Vos crédits {plan} sont prêts.",
"billing.checkoutCanceled":"Checkout a été annulé. Aucune modification n'a été effectuée.",
"billing.portalReturned":"Retour du portail de facturation. Gérez votre plan ici ou dans Plans.",
"billing.comparePlans":"Comparer les forfaits",
"billing.managePayment":"Gérer le paiement",
"billing.addCredits":"Ajouter des crédits",
"billing.addingCredits":"Ajout…",
"billing.addCreditsTitle":"Ajouter des crédits",
"billing.addCreditsDescription":"Administrateur plateforme uniquement. Les crédits sont immédiatement disponibles pour les titres IA, descriptions et autres étapes payantes.",
"billing.creditAmount":"Montant de crédit",
"billing.invalidCreditAmount":"Veuillez saisir un montant de crédits valide.",
"billing.checkoutUnavailable":"Les achats en libre-service sont indisponibles tant que Stripe n'est pas configuré. Contactez les ventes pour un forfait.",
"billing.whatUsesCredits":"Ce qui consomme des crédits",
"billing.burnsCredits":"Consomme des crédits",
"billing.noCreditCost":"Sans coût de crédits",
"billing.publicPricing":"Tarifs publics",
"billing.managePlanOnPlans":"Gérer le plan dans Plans",
"billing.recovery.pastDueTitle":"Paiement en retard",
"billing.recovery.pastDueAdmin":"Le paiement de votre abonnement a échoué. Mettez à jour le paiement dans le Customer Portal — l'accès reste ouvert pendant cette période de grâce.",
"billing.recovery.pastDueMember":"La facturation nécessite une attention. Demandez à un administrateur de mettre à jour le paiement dans le Customer Portal. L'accès reste ouvert pendant cette période de grâce.",
"billing.recovery.openPortal":"Ouvrir le Customer Portal",
"billing.recovery.contactAdmin":"Contacter un administrateur",
"billing.recovery.goToBilling":"Aller à la facturation",
"billing.recovery.missingPlanMessage":"Cette entreprise n'a pas de plan actif (souvent après une migration ignorée). Assignez un plan via Checkout ou contactez le support — ne supposez pas une capacité Unlimited.",
"billing.recovery.choosePlan":"Choisir une offre",
"billing.upgrade":"Mettre à niveau",
"billing.askCompanyAdmin":"Demandez à un administrateur de l'entreprise",
"billing.memberHint":"Seuls les administrateurs peuvent changer de plan ou ouvrir Checkout.",
"exports.howTo.choose":"Ce qui entre dans le feed",
"exports.howTo.chooseBody":"— définissez le feed source et les statuts produit à la création/édition pour que l'URL publique n'inclue que ces produits.",
"exports.howTo.subset":"Sous-ensemble ponctuel",
"exports.howTo.subsetBody":"— sur",
"exports.howTo.productsLink":"Produits",
"exports.howTo.subsetTail":", sélectionnez des lignes et Exporter pour télécharger uniquement ces produits avec le format et les champs du feed.",
"exports.howTo.google":"Google Shopping",
"exports.howTo.googleBody":"— créez un préréglage CSV ou XML, Generate, copiez l'URL publique dans Merchant Center → Products → Feeds → scheduled fetch.",
"exports.howTo.meta":"Catalogue Meta",
"exports.howTo.metaBody":"— préréglage CSV pour les sources de données Commerce Manager.",
"exports.howTo.custom":"CSV/XML personnalisé",
"exports.howTo.customBody":"— tout partenaire ; la même URL publique fonctionne pour les pollers cron / webhook.",
"exports.searchPlaceholder":"Rechercher des feeds...",
"exports.searchAria":"Rechercher des feeds",
"exports.clearSearch":"Effacer la recherche",
"exports.loading":"Chargement des feeds…",
"exports.loadErrorTitle":"Impossible de charger les feeds d'export",
"exports.loadErrorBody":"Une erreur s'est produite lors du chargement de vos exports. Réessayez ou consultez l'erreur ci-dessus pour plus de détails.",
"exports.tryAgain":"Réessayer",
"exports.emptyTitle":"Pas encore de feeds d'export",
"exports.emptyBody":"Créez un feed Google Shopping, Meta ou CSV/XML personnalisé pour choisir quels produits et champs sortir. Générez une URL publique pour Merchant Center ou tout partenaire — ou exportez une sous-sélection depuis Produits.",
"exports.emptyCta":"Créer un flux Google Shopping",
"exports.rotateToken":"Renouveler le jeton d URL",
"exports.rotateFailed":"Echec du renouvellement du jeton d URL",
"exports.deleting":"Suppression…",
"exports.channelPreset":"Préréglage de canal",
"exports.name":"Nom",
"exports.format":"Format",
"exports.sourceFeed":"Feed source (facultatif)",
"exports.sourceFeedHelp":"Limitez ce feed aux produits d'un feed d'entrée, ou laissez Tous les produits — c'est ainsi que vous choisissez ce que l'URL publique inclut.",
"exports.allProducts":"Tous les produits",
"exports.rootElement":"Élément racine",
"exports.itemElement":"Élément item",
"exports.productStatuses":"Statuts produits (séparés par des virgules)",
"exports.productStatusesHelp":"N'inclure que les produits avec ces statuts (par ex. active). Laissez vide pour tous les statuts.",
"exports.status":"Statut",
"exports.active":"Actif",
"exports.inactive":"Inactif",
"exports.fieldMappings":"Correspondances de champs",
"exports.fieldHelp":"Les exports lisent les produits traités (avec mapped_data brut en secours). Utilisez eprel_* / energy_* pour les champs EPREL, spec.* pour une spécification, ou specifications.* pour développer toutes les specs en nœuds XML.",
"exports.saving":"Enregistrement…",
"exports.saveChanges":"Enregistrer",
"exports.createFeed":"Créer un feed",
"exports.updated":"Feed d'export mis à jour.",
"exports.created":"Feed d'export créé.",
"exports.saveFailed":"Échec de l'enregistrement",
"exports.urlCopied":"URL publique du feed {format} copiée. Collez-la dans tout système qui récupère des feeds produit.",
"exports.copyFailed":"Échec de la copie de l'URL dans le presse-papiers",
"exports.preset.google_shopping_csv.description":"Feed produit Merchant Center avec les colonnes Google standard (id, title, price, gtin, …).",
"exports.preset.google_shopping_csv.hint":"Après avoir actualisé le feed, copiez l'URL CSV publique dans Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.",
"exports.preset.google_shopping_xml.description":"Mêmes colonnes Google que les éléments XML (g:id, g:title, …) pour les feeds XML Merchant Center.",
"exports.preset.google_shopping_xml.hint":"Collez l'URL XML publique dans Merchant Center en tant que scheduled fetch. Mappez les champs boutique manquants (link, price) sous Field mappings si besoin.",
"exports.preset.custom_xml.description":"Créez une forme XML personnalisée avec vos propres noms root/item et mappings de champs.",
"exports.preset.custom_xml.hint":"Définissez les noms d'éléments root et item, puis mappez chaque clé de sortie à une source produit.",
"exports.preset.custom_xml.defaultName":"Export XML personnalisé",
"processing.title":"Traitement",
"processing.description":"Progression en direct du pipeline pour les tâches de traitement produit. Actualisation automatique tant que cet onglet est visible. Les tâches terminées renvoient vers Needs Review pour accepter / modifier / rejeter.",
"processing.refresh":"Actualiser",
"processing.loadFailed":"Échec du chargement des tâches de traitement",
"processing.tooManyRequests":"Trop de requêtes — attendez un moment et réessayez.",
"processing.serverError":"{fallback} (erreur serveur {status}). Réessayez sous peu.",
"processing.reviewResults":"Examiner les résultats",
"processing.reviewTitle":"Ouvrez Needs Review pour accepter, modifier ou rejeter l'enrichissement",
"processing.cancel":"Annuler",
"processing.cancelling":"Annulation…",
"processing.cancelTitle":"Annuler cette tâche en attente ou en cours",
"processing.retry":"Réessayer",
"processing.retrying":"Nouvel essai…",
"processing.actions.onPage":"{count} sur cette page",
"processing.actions.clearSelection":"Effacer la sélection",
"processing.actions.processSelected":"Traiter la sélection",
"processing.actions.processAria":"Traiter les produits sélectionnés",
"processing.actions.processAriaCount":"Traiter {count} produit{plural} sélectionné(s) sur cette page",
"processing.actions.whatToProcess":"Que traiter",
"processing.actions.freeNoAiTitle":"Offre Free — pas de crédits IA",
"processing.actions.freeNoAiBody":"Normalize, specs, fill et EPREL s'exécutent toujours. Les titres/descriptions IA nécessitent un plan payant ou des crédits.",
"processing.actions.comparePlans":"Comparer les offres",
"processing.actions.resetUnprocessed":"Réinitialiser à Non traité",
"processing.actions.confirmTitle":"Confirmer le traitement",
"processing.actions.confirmBody":"Traiter {count} produit(s) sur cette page pour {credits} crédits. Les crédits sont consommés au démarrage de la tâche et ne peuvent pas être annulés depuis cette action.",
"processing.actions.confirmStart":"Démarrer le traitement",
"processing.receipt.cancelledMany":"Tâches de traitement annulées",
"processing.receipt.cancelledDesc":"La tâche qui vient de démarrer a été annulée.",
"processing.receipt.cancelFailed":"Impossible d'annuler la tâche de traitement",
"unsubscribe.title":"Se désabonner",
"unsubscribe.me":"Me désabonner",
"unsubscribe.invalidLink":"Lien invalide",
"unsubscribe.failedShort":"Échec du désabonnement",
"unsubscribe.already":"Vous êtes déjà désabonné.",
"unsubscribe.confirmPrompt":"Confirmez ci-dessous pour vous désabonner des e-mails marketing.",
"unsubscribe.done":"Vous êtes désabonné.",
"stores.title":"Boutiques et sources",
"stores.description":"Connectez n’importe quelle boutique ou fournisseur au même endroit — Woo, Shopify, URL de flux ou CSV. Boutiques live : produits Descrybe → boutique ; commandes/avis boutique → Descrybe. Exportez quand le catalogue est prêt.",
"stores.allInputFeeds":"Tous les feeds d'entrée",
"stores.exportFeeds":"Feeds d'export",
"stores.migrationNote":"Après une migration de plateforme Descrybe, les identifiants WooCommerce et Shopify peuvent devoir être ressaisis — c’est une reconnexion, pas une sync cassée.",
"stores.docsPrefix":"Docs :",
"stores.docsApiOverview":"Aperçu de l'API",
"stores.docsSuffix":"pour l’accès produit public ; utilisez WooCommerce ou Shopify ci-dessous pour la sync boutique en direct.",
"stores.connectorsHeading":"Connecteurs boutique et catalogue",
"stores.statusAria":"Statut : {label}",
"stores.ctaAria":"{cta} : {title}",
"stores.startTitle":"Par où commencer ?",
"stores.startBody":"Boutique Woo → WooCommerce. Shopify ou une autre plateforme → URL de flux ou import CSV. Prêt pour Merchant Center ou partenaires → Flux d’export (préréglage Google Shopping ou champs personnalisés). Après une migration, reconnectez Woo/Shopify avant d’attendre que la sync fonctionne.",
"stores.startBodyMember":"Demandez à un admin de connecter WooCommerce ou Shopify. Vous pouvez toujours ouvrir les boutiques connectées (sync/navigation) et utiliser Feed URL, CSV ou les feeds d'export selon le forfait.",
"stores.wizard.title":"Configuration guidée de boutique",
"stores.wizard.description":"Connectez une boutique, testez la connexion, lancez la première sync produits, puis c'est terminé.",
"stores.wizard.guidedSetupAria":"Démarrer la configuration guidée de boutique",
"stores.wizard.adminOnly":"Seuls les admins peuvent lancer la configuration guidée (enregistrer les identifiants et premier sync). Vous pouvez toujours ouvrir les boutiques connectées.",
"stores.wizard.pickChannel":"Choisir un connecteur",
"stores.wizard.pickChannelBody":"Choisissez WooCommerce ou Shopify. Terminez connecter → tester → première sync sur la page du connecteur, puis revenez ici.",
"stores.wizard.step.sync.body":"Mettez en file la première sync produits (activez la sync si besoin).",
"stores.wizard.step.done.title":"Terminé",
"stores.wizard.step.done.body":"Votre boutique est connectée et une sync a démarré ou est terminée.",
"stores.wizard.openConnector":"Ouvrir le connecteur",
"stores.wizard.viewProducts":"Voir les produits",
"stores.wizard.backToHub":"Retour aux boutiques",
"stores.wizard.banner.generic":"Configuration guidée : terminez cette étape, puis revenez à l'assistant.",
"stores.wizard.banner.test":"Configuration guidée — testez la connexion, puis revenez à l'assistant.",
"stores.wizard.banner.sync":"Configuration guidée — lancez la première sync produits, puis revenez à l'assistant.",
"stores.wizard.banner.return":"Retour à l'assistant",
"stores.wizard.banner.dismiss":"Fermer",
"stores.woo.title":"WooCommerce",
"stores.woo.description":"Poussez les produits Descrybe → WooCommerce. Importez commandes et avis WooCommerce → Descrybe.",
"stores.woo.ctaReconnect":"Reconnecter Woo",
"stores.woo.ctaOpen":"Ouvrir Woo",
"stores.woo.ctaConnect":"Connecter Woo",
"stores.woo.ctaView":"Voir Woo",
"stores.shopify.title":"Shopify",
"stores.shopify.description":"Poussez les produits Descrybe → Shopify. Importez les commandes Shopify → Descrybe. Les avis ne sont pas disponibles via l’Admin API Shopify.",
"stores.feedUrl.description":"Pull any supplier or boutique catalog from a public CSV or XML URL on a schedule. Map fields, then sync.",
"stores.feedUrl.cta":"Ajouter l'URL du feed",
"stores.csv.title":"Téléversement CSV",
"stores.csv.description":"Téléversez un CSV produits comme flux d’entrée. Idéal pour des fichiers fournisseur ponctuels ou des exports admin Shopify.",
"stores.csv.cta":"Téléverser CSV",
"stores.export.title":"Export / REST",
"stores.export.description":"Publiez Google Shopping ou un CSV/XML personnalisé avec une URL publique. Ou récupérez les produits via une clé API (/api/v1).",
"stores.export.cta":"Ouvrir les exports",
"stores.apiKeys.title":"Clés API",
"stores.apiKeys.description":"Les anciennes clés API n’ont pas été migrées. Créez une nouvelle clé dans Paramètres pour restaurer l’accès /api/v1 — le secret n’est affiché qu’une fois.",
"stores.apiKeys.descriptionMember":"Clés API entreprise pour /api/v1. Les clés héritées n’ont pas été migrées — seuls les admins peuvent créer ou révoquer ; préfixes visibles dans Paramètres.",
"store.connectionFailedDot":"Échec de la connexion.",
"store.connectionTestFailed":"Échec du test de connexion",
"store.testFailed":"Échec du test",
"store.setupSteps":"Étapes de configuration",
"store.col.order":"Commande",
"store.col.customer":"Client",
"store.col.status":"Statut",
"store.col.total":"Total",
"store.col.date":"Date",
"store.loadingOrders":"Chargement des commandes…",
"store.loadingOrdersDot":"Chargement des commandes.",
"flash.store.saveFailed":"Impossible d’enregistrer les paramètres",
"flash.store.queueSyncFailed":"Impossible de mettre la synchronisation en file",
"flash.store.queueOrdersFailed":"Impossible de mettre la synchro des commandes en file",
"flash.store.connectedTo":"Connecté à {name}.",
"flash.shopify.loadFailed":"Échec du chargement de la config Shopify",
"flash.shopify.productSyncQueued":"Synchro produits en file. Le worker l’exécutera bientôt.",
"flash.shopify.ordersSyncQueued":"Synchro commandes en file. Le worker l’exécutera bientôt.",
"flash.woo.loadFailed":"Échec du chargement de la config WooCommerce",
"flash.woo.productSyncQueued":"Synchro produits en file. Elle s’exécutera bientôt.",
"flash.woo.ordersSyncQueued":"Synchro commandes en file. Elle s’exécutera bientôt.",
"flash.woo.reviewsSyncQueued":"Synchro avis en file. Elle s’exécutera bientôt.",
"flash.woo.queueReviewsFailed":"Impossible de mettre la synchro des avis en file",
"flash.woo.remoteMapsFailed":"Échec du chargement des maps distantes",
"flash.woo.syncSettingsFailed":"Impossible d’enregistrer les paramètres de synchronisation",
"flash.woo.categoryAutoMapFailed":"Échec du mappage auto des catégories",
"flash.woo.attributeAutoMapFailed":"Échec du mappage auto des attributs",
"shopify.title":"Intégration Shopify",
"shopify.description":"Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.",
"shopify.adminOnly":"Only entreprise admins can change Shopify connection paramètres. Synchroniser and browse stay disponible.",
"shopify.noCredentialsMember":"Aucun identifiant Shopify n’est encore enregistré. Demandez à un administrateur de connecter la boutique. Sync et consultation des commandes restent disponibles après enregistrement et test de connexion.",
"shopify.enterToken":"Saisir les identifiants",
"shopify.noCredentials":"Aucun identifiant Shopify enregistré. Saisissez votre domaine *.myshopify.com et le Client ID + secret du Dev Dashboard (ou un jeton Admin API hérité), puis Enregistrer et Tester la connexion. Après une migration de plateforme, les anciens secrets ne sont pas repris — reconnectez avec un jeton neuf.",
"shopify.allConnectors":"Tous les connecteurs de boutique",
"shopify.setupDesc":"New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.",
"shopify.setup.oauthNote":"Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.",
"shopify.setup.scopesTitle":"Scopes Admin API requis",
"shopify.setup.scopesIntro":"Add these scopes on the app version in the Dev Dashboard before you release and install:",
"shopify.setup.openDevelopAppsNeedDomain":"Enter your shop domain below to unlock a direct Admin link for this store.",
"shopify.setup.openDevelopAppsHint":"Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.",
"shopify.field.shopDomainHelp":"Admin API host only — use the *.myshopify.com name, not a custom storefront domain.",
"shopify.field.clientId":"Client ID",
"shopify.field.clientSecret":"Client secret",
"shopify.field.clientSecretHelp":"From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.",
"shopify.field.accessTokenHelp":"Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.",
"shopify.placeholder.clientId":"Client ID from Dev Dashboard",
"shopify.placeholder.clientIdKeep":"Client ID on file — enter a new one to replace",
"shopify.setup.scope.read_productsWhy":"Trouver les produits existants par SKU avant mise à jour",
"shopify.setup.scope.read_orders":"read_orders",
"shopify.setup.scope.read_ordersWhy":"Importer les commandes dans Descrybe (entrant)",
"shopify.setup.step1":"Si vous avez connecté Shopify avant une migration de plateforme : créez une nouvelle app Dev Dashboard (ou reconnectez avec un jeton hérité neuf) — les anciens secrets enregistrés ne sont pas repris.",
"shopify.setup.step2.before":"Open the",
"shopify.setup.step2.path":"Shopify Dev Dashboard",
"shopify.setup.step2.after":"→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).",
"shopify.setup.step3.before":"Create a version: set App URL (default home is fine for API-only), add scopes",
"shopify.setup.step3.after":".",
"shopify.setup.step4.before":"From the app Home tab,",
"shopify.setup.step4.after":"on your store (merchant must approve scopes).",
"shopify.testSectionTitle":"Vérifier la connexion",
"shopify.testHint":"Enregistrez d’abord le domaine boutique et le jeton, puis lancez Tester la connexion. Un test réussi confirme le jeton et les scopes avant de mettre la sync en file.",
"shopify.overwriteTitle":"Écraser les produits Shopify ?",
"shopify.overwriteBodyCount":"Cela met en file une poussée de produits sortante. {count} produit(s) Shopify déjà liés peuvent être mis à jour avec le contenu Descrybe.",
"shopify.overwriteBody":"Cela met en file une poussée de produits sortante. Les produits Shopify correspondants peuvent être mis à jour avec le contenu Descrybe.",
"shopify.credentialsTitle":"Identifiants de la boutique",
"shopify.credentialsDesc.before":"Le domaine de la boutique doit être votre",
"shopify.credentialsDesc.code":"*.myshopify.com",
"shopify.credentialsDesc.after":"domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.",
"shopify.field.shopDomain":"Domaine de la boutique",
"shopify.dryRunLabel":"Essai à blanc (aucun appel Shopify live)",
"shopify.ordersTitle":"Import des commandes (Shopify → Descrybe)",
"shopify.ordersDesc":"Shopify → Descrybe — importe commandes et lignes dans Descrybe (n’écrit pas vers Shopify).",
"shopify.ordersNeedsReconnect":"L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.",
"shopify.notesTitle":"Notes",
"shopify.notesDesc":"Capacités du connecteur Shopify",
"shopify.notes.productsBody":"— les produits Descrybe traités sont créés ou mis à jour dans Shopify (correspondance SKU via GraphQL s’il n’y a pas d’id produit Shopify en cache). Une re-sync peut écraser les champs distants correspondants.",
"shopify.notes.ordersBody":"— récupérés pour le reporting et de futurs workflows d’audience.",
"shopify.notes.reviewsLabel":"Avis",
"shopify.notes.reviewsBody":"-- not assistanceed. Shopify has no first-party produit reviews Admin API (third-party review apps are out of scope here).",
"shopify.notes.encryption.before":"Jetons are encrypted at rest with",
"woo.title":"Intégration WooCommerce",
"woo.description":"Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).",
"woo.allStores":"Toutes les boutiques",
"woo.adminOnly":"Seuls les administrateurs de l’entreprise peuvent modifier la connexion et le mapping WooCommerce. La synchronisation et la navigation restent disponibles.",
"woo.enterCredentials":"Saisir les identifiants",
"woo.noCredentials":"Aucun identifiant WooCommerce enregistré. Saisissez l’URL de la boutique, créez une clé REST API Lecture/Écriture dans WordPress, collez Consumer Key et Secret, puis Enregistrer et Tester la connexion. Après une migration de plateforme, les anciens secrets ne sont pas repris — reconnectez avec une clé neuve.",
"woo.noCredentialsMember":"Aucun identifiant WooCommerce n’est encore enregistré. Demandez à un administrateur de connecter la boutique. Sync, commandes et avis restent disponibles après enregistrement et test de connexion.",
"woo.setupDesc":"Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.",
"woo.setup.step1":"Si vous avez connecté WooCommerce avant une migration de plateforme : créez une nouvelle clé REST API — les anciens identifiants enregistrés ne sont pas utilisables.",
"woo.setup.step2.before":"Enter your store",
"woo.setup.step2.path":"HTTPS URL",
"woo.setup.step2.after":"in the form below (example: https://yourstore.com).",
"woo.setup.openKeysNeedUrl":"Enregistrez d’abord une URL de boutique valide pour ouvrir les liens admin.",
"woo.setup.docsLink":"Documentation REST API WooCommerce",
"woo.overwriteTitle":"Écraser les produits WooCommerce ?",
"woo.overwriteBodyCount":"Cela met en file une poussée de produits sortante. {count} produit(s) WooCommerce déjà liés peuvent être mis à jour avec le contenu Descrybe.",
"woo.overwriteBody":"Cela met en file une poussée de produits sortante. Les produits WooCommerce correspondants peuvent être mis à jour avec le contenu Descrybe.",
"woo.connectionTitle":"Store connection",
"woo.connectionDesc":"Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.",
"woo.attributesEmptyHint":"Testez la connexion, puis actualisez pour charger les attributs WooCommerce.",
"woo.ordersTitle":"Import des commandes (WooCommerce → Descrybe)",
"woo.ordersDesc":"WooCommerce → Descrybe — importe commandes et lignes dans Descrybe (n’écrit pas vers la boutique).",
"woo.ordersNeedsReconnect":"L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.",
"woo.syncSettingsTitle":"Paramètres de sync",
"woo.syncSettingsDesc":"Configurer comment les produits sont poussés Descrybe → WooCommerce",
"woo.matchStrategy":"Produit Matching Strategy",
"woo.matchStrategyHelp":"L’envoi produits (Descrybe → WooCommerce) associe les produits distants par SKU ou EAN/GTIN. Mettez en file depuis l’onglet Connexion (manuel).",
"woo.lastSyncLabel":"Dernière sync",
"woo.saveSyncSettings":"Enregistrer les paramètres de sync",
"woo.match.sku":"SKU",
"woo.match.ean":"EAN/GTIN",
"plan.feature.section.shell":"Environnement",
"plan.feature.section.dashboard":"Tableau de bord",
"products.edit.coverageTitle":"Combien de Nom, Description, Attributs et Catégorie sont présents (flux ou traités).",
"products.edit.coverageReady":"{count}/4 prêts",
"products.edit.eprelPresentTitle":"L'id European Product Registry for Energy Labelling (EPREL) est présent sur ce produit.",
"products.edit.noEprelBadge":"Sans EPREL",
"products.edit.specsBadge":"Specs",
"products.edit.reviewBannerTitle":"Révisez les champs enrichis avant d’accepter",
"products.edit.reviewBannerHelp":"Utilisez l’onglet Révision pour comparer originaux et IA. Raccourcis : A accepter · R rejeter · Alt+1/2 champ · ⌘/Ctrl+Entrée tout accepter.",
"products.edit.tab.review":"Examiner",
"products.edit.tab.details":"Détails",
"products.edit.tab.content":"Contenu",
"products.edit.tab.attributes":"Attributs",
"products.edit.tab.feed":"Flux",
"products.edit.changed":"Modifié",
"products.edit.matched":"Correspondant",
"products.edit.original":"Original",
"products.edit.enriched":"Enrichi",
"products.edit.discardName":"Rejeter le nom",
"products.edit.acceptName":"Accepter le nom",
"products.edit.discardDescription":"Rejeter la description",
"products.edit.acceptDescription":"Accepter la description",
"products.edit.noCategory":"No Catégorie",
"products.edit.whatsFilledIn":"Ce qui est renseigné",
"products.edit.coverageLegend":"Gray = missing · Orange = from flux · Green = processed",
"products.edit.feedSource":"Flux source",
"products.edit.updatedRelative":"· mis à jour {when}",
"products.edit.viewAllFeedFields":"View all flux fields ({filled}/{total})",
"products.edit.noAttrsYet":"No attribut or specification data on this produit yet.",
"products.edit.fromFeed":"Depuis le feed",
"products.edit.feedAttrsHelp":"Valeurs extraites du flux (spécifications HTML, garantie, dimensions, EPREL). Les clés sont liées à attribute_key lorsque possible.",
"products.edit.editableAttributesHelp":"Les modifications sont enregistrées dans la carte d’attributs du produit. Les lignes feed et IA ci-dessous restent en référence lorsqu’elles diffèrent.",
"products.edit.addAttribute":"Ajouter un attribut",
"products.table.selectProduct":"Sélectionner le produit {name}",
"products.table.rename":"Renommer {name}",
"products.table.productNameAria":"Nom du produit pour {name}",
"products.table.selectPage":"Sélectionner {count} on this page",
"products.table.deselectPage":"Désélectionner {count} sur cette page",
"categories.assign":"Assigner",
"categories.titleFormulaSubtitle":"Configurez comment les titres de produits doivent être générés pour {name}",
"categories.addText":"Ajouter du texte",
"categories.aboutTitleFormulas":"À propos des formules de titre",
"categories.aboutTitleFormulasHelp":"Les titres sont assemblés de gauche à droite à partir des éléments ci-dessous.",
"categories.variablesReplacedHelp":"Les variables sont remplacées par les données produit lorsqu’elles sont disponibles. Les valeurs manquantes sont ignorées.",
"categories.variableTypeHelp":"Champ dynamique issu des données produit (exemple : marque).",
"categories.textTypeHelp":"Texte statique qui apparaît toujours tel qu’écrit.",
"categories.assignTitleCopyHelp":"Utilisez Assigner pour copier cette formule vers d’autres catégories qui doivent partager le même modèle de titre.",
"categories.titleFormulaInvalid":"Cette page de formule de titre nécessite une catégorie valide. Revenez aux catégories et rouvrez Modifier la formule de titre.",
"categories.preview.title":"Aperçu du titre",
"categories.preview.description":"Voici comment vos titres de produits seront structurés",
"categories.aiInstructionsBody":"Écrivez un objectif clair par section (contenu, ton, longueur). Des consignes floues produisent un texte flou.",
"categories.exportIdsHeading":"IDs d’export",
"categories.exportIdsBody":"Les IDs facultatifs associent une section aux flux d’export (par exemple short_description).",
"categories.assignDescCopyHelp":"Utilisez Assigner pour copier ce modèle vers d’autres catégories qui doivent partager la même structure.",
"categories.descriptionFormulaInvalid":"Cette page de formule de description nécessite une catégorie valide. Revenez aux catégories et rouvrez Modifier la formule de description.",
"categories.sectionType.h1":"Titre 1",
"categories.sectionType.h2":"Titre 2",
"categories.sectionType.h3":"Titre 3",
"categories.sectionType.h4":"Titre 4",
"categories.sectionType.p":"Paragraphe",
"categories.sectionType.ul":"Liste à puces",
"categories.aiGenerationPrompt":"Prompt de génération IA",
"categories.aiPromptOverrides":"Remplace le prompt utilisateur d’amélioration produit de l’entreprise pour {name}",
"categories.promptTemplate":"Modèle de prompt",
"categories.promptTemplateHelp":"Utilisez des espaces réservés comme {{name}} et {{description}}. Laissez vide pour utiliser la valeur par défaut de l’entreprise dans Intégrations → IA.",
"categories.activeOverride":"· remplacement actif pour cette catégorie",
"categories.usingCompanyDefault":"· utilisation de la valeur par défaut de l’entreprise / intégrée",
"categories.usingCompanyDefaultForLang":"· vide pour cette langue — la valeur par défaut entreprise / intégrée s’applique",
"categories.aiPromptSavedLang":"Prompt IA enregistré pour {lang}.",
"categories.aiPromptClearedLang":"Prompt IA effacé pour {lang} (la valeur par défaut de l’entreprise s’appliquera).",
"contentLang.switcherLabel":"Langue de contenu",
"contentLang.primary":"principal",
"contentLang.hasOverride":"personnalisé",
"contentLang.addLanguage":"Ajouter une langue…",
"contentLang.add":"Ajouter",
"contentLang.removeLanguage":"Retirer {lang}",
"contentLang.resultsHint":"Changez de langue pour examiner les titres et descriptions IA de chaque langue de contenu.",
"contentLang.settingsTitle":"Langues de contenu",
"contentLang.settingsHelp":"La langue principale est utilisée par défaut. Les langues supplémentaires ont leurs propres prompts et résultats IA (chaque passage consomme des crédits).",
"ai.prompts.languageHelp":"Modifiez les prompts de l’entreprise par langue de contenu. Une langue vide utilise la valeur intégrée par défaut pour cette langue.",
"header.accountSettingsAria":"Paramètres du compte pour {email}",
"products.enrichment.rejectSelectedTitle":"Rejeter les produits sélectionnés ?",
"products.enrichment.resetTitle":"Réinitialiser à non traité ?",
"products.selectedOnPage":"{count} sélectionnés sur cette page",
"products.selectionPageOnly":"Affichage de {shown} sur {total} — sélection limitée à cette page",
"products.edit.coverageHint":"Combien de Nom, Description, Attributs et Catégorie sont présents (flux ou traités).",
"products.edit.noEprelShort":"Sans EPREL",
"products.edit.specs":"Specs",
"products.edit.reviewBannerBody":"Utilisez l’onglet Révision pour comparer originaux et IA. Raccourcis : A accepter · R rejeter · Alt+1/2 champ · ⌘/Ctrl+Entrée tout accepter.",
"products.edit.whatsFilled":"Ce qui est renseigné",
"products.edit.legend":"Gray = missing · Orange = from flux · Green = processed",
"products.edit.updatedAgo":"· mis à jour {relative}",
"products.edit.status":"Statut",
"products.edit.noRawUpdate":"No raw produit update time",
"products.edit.noMappedFields":"No mapped flux fields on this produit.",
"products.edit.emptyBadge":"Vide",
"products.edit.coreBadge":"Cœur",
"products.edit.feedAttrsHint":"Valeurs extraites du flux (spécifications HTML, garantie, dimensions, EPREL). Les clés sont liées à attribute_key lorsque possible.",
"products.edit.aiAttrs":"Attributs IA / enrichis",
"mapping.confidence.exact":"Exact",
"mapping.confidence.alias":"Alias",
"mapping.confidence.fuzzy":"Flou",
"field.group.basic":"Informations de base",
"field.group.pricing":"Tarification",
"field.group.media":"Médias",
"field.group.taxonomy":"Taxonomie",
"field.group.inventory":"Inventaire",
"field.group.attributes":"Attributs",
"field.group.shipping":"Expédition",
"field.group.compliance":"Conformité",
"field.group.other":"Autre",
"common.yes":"Oui",
"common.no":"Non",
"status.running":"En cours",
"flash.admin.analyticsLoadFailed":"Échec du chargement des analyses",
"flash.admin.diagnosticsLoadFailed":"Échec du chargement des diagnostics",
"flash.admin.diagnosticsUnavailable":"Les diagnostics ne sont pas disponibles sur ce déploiement. Contactez l’administrateur de la plateforme.",
"flash.admin.diagnosticsUnreachable":"Impossible d’atteindre l’API de diagnostics. Vérifiez que l’API tourne et que PUBLIC_API_URL / le proxy Vite pointent vers elle.",
"admin.charts.statusEmpty":"Aucune ligne dans cette répartition pour l’instant.",
"admin.charts.seriesEmpty":"Aucune donnée pour cette période.",
"admin.charts.primaryDefault":"Principal",
"admin.charts.statusAria":"Répartition par statut",
"admin.diagnostics.etlInventoryTitle":"ETL gap inventory",
"admin.diagnostics.etlInventoryHint":"Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.",
"categories.aiPromptSavedForCategory":"Un prompt de génération IA est enregistré pour cette catégorie.",
"categories.titleAndDescriptionFormulasSaved":"Les formules de titre et de description sont enregistrées pour cette catégorie.",
"categories.titleFormulaSavedForCategory":"Une formule de titre est enregistrée pour cette catégorie.",
"categories.descriptionFormulaSavedForCategory":"Une formule de description est enregistrée pour cette catégorie.",
"site.account":"Compte",
"site.goToApp":"Aller à l’app",
"site.logIn":"Connexion",
"site.getStarted":"Commencer",
"site.nav.primary":"Principal",
"site.nav.mobile":"Mobile",
"site.nav.home":"Accueil",
"site.nav.pricing":"Tarifs",
"site.nav.apiDocs":"Docs API",
"seo.home.title":"Descrybe — Transformez les flux fournisseurs en fiches produit prêtes",
"seo.home.description":"Connectez des flux CSV ou XML de fournisseurs, mappez-les à vos catégories et attributs, générez des titres et descriptions conformes à vos règles, puis exportez ou synchronisez avec WooCommerce.",
"seo.pricing.title":"Tarifs — Free, Starter, Growth, Business | Descrybe",
"seo.pricing.description":"Commencez gratuitement avec 100 produits et le mapping de flux. Les offres payantes ajoutent titres et descriptions IA, plus de SKU, flux d'export et sync WooCommerce — à partir de 49 $/mois. Enterprise pour les catalogues illimités.",
"seo.privacy.title":"Politique de confidentialité | Descrybe",
"seo.privacy.description":"Comment Descrybe collecte, utilise et protège les données de compte, catalogues de produits et flux fournisseurs lorsque vous utilisez notre plateforme de données produit.",
"seo.terms.description":"Conditions d'utilisation de Descrybe : import de flux, enrichissement de catalogue, contenu assisté par IA, exports et synchronisation WooCommerce pour votre entreprise.",
"seo.features.title":"Fonctionnalités — Flux, enrichissement et export | Descrybe",
"seo.features.description":"Découvrez comment Descrybe importe les flux fournisseurs, mappe les champs à votre taxonomie, enrichit les données produit et diffuse les catalogues via flux d'export, WooCommerce ou API.",
"pricing.page.eyebrow":"Tarifs",
"pricing.page.title":"Des offres simples pour des catalogues en croissance",
"pricing.page.lead":"Commencez gratuitement avec le mapping de flux et un nettoyage de base. Passez à un plan supérieur quand vous avez besoin de titres et descriptions IA, de plus de produits, d’exports ou de la sync WooCommerce — de Starter à Enterprise.",
"pricing.page.subscribedMid":"ou comparez les offres dans",
"pricing.page.plansLink":"Offres",
"pricing.page.subscribedAfter":".",
"legal.lastUpdated":"Dernière mise à jour : {date}",
"legal.backHome":"← Retour à l’accueil",
"legal.emailLabel":"E-mail :",
"legal.postalLabel":"Adresse postale :",
"legal.privacy.title":"Politique de confidentialité",
"legal.privacy.intro.h":"Introduction",
"legal.privacy.intro.p1":"Chez Descrybe (\"nous\", \"notre\" ou \"nos\"), nous respectons votre vie privée et nous engageons à protéger vos informations personnelles. La présente Politique de confidentialité explique comment nous collectons, utilisons, divulguons et protégeons vos informations lorsque vous utilisez la plateforme de données produit de Descrybe et les services associés (collectivement, les \"Services\").",
"legal.privacy.intro.p2":"En accédant à nos Services ou en les utilisant, vous acceptez les pratiques décrites dans la présente Politique de confidentialité. Si vous n'êtes pas d'accord avec les politiques et pratiques décrites ici, veuillez ne pas utiliser nos Services.",
"legal.privacy.collect.h":"Informations que nous collectons",
"legal.privacy.collect.lead":"Nous collectons plusieurs types d'informations auprès des utilisateurs de nos Services et à leur sujet, notamment :",
"legal.privacy.collect.personal.p":"Lorsque vous créez un compte, nous collectons des informations pouvant servir à vous identifier, telles que votre nom, adresse e-mail, numéro de téléphone, nom d'entreprise et informations de facturation. Nous collectons ces informations directement auprès de vous lorsque vous nous les fournissez.",
"legal.privacy.collect.userData.p":"Pour fournir nos Services, nous collectons et traitons des données produit, des flux fournisseurs, des descriptions de produits et tout autre contenu que vous téléversez, saisissez ou soumettez autrement sur notre plateforme. Cela peut inclure des attributs produit, des structures de taxonomie, des modèles et d'autres données nécessaires au fonctionnement de nos Services.",
"legal.privacy.collect.usage.p":"Nous collectons automatiquement certaines informations sur votre appareil et sur la façon dont vous interagissez avec nos Services, notamment l'adresse IP, le type d'appareil, le type de navigateur, le système d'exploitation, les heures d'accès, les pages consultées, les fonctionnalités utilisées et toute autre activité système. Nous utilisons ces informations pour améliorer nos Services et l'expérience utilisateur.",
"legal.privacy.collect.cookies.h":"Cookies et technologies de suivi",
"legal.privacy.collect.cookies.p":"Nous utilisons des cookies, des balises web et des technologies de suivi similaires pour collecter des informations sur vos activités de navigation sur notre site. Vous pouvez contrôler les cookies via les paramètres de votre navigateur et d'autres outils. Toutefois, si vous bloquez certains cookies, vous pourriez ne pas pouvoir utiliser toutes les fonctionnalités de nos Services.",
"legal.privacy.use.h":"Comment nous utilisons vos informations",
"legal.privacy.use.lead":"Nous utilisons les informations collectées à diverses fins, notamment pour :",
"legal.privacy.use.li1":"Fournir, maintenir et améliorer nos Services",
"legal.privacy.use.li2":"Traiter les transactions et envoyer les informations associées, y compris confirmations, factures et notifications de service",
"legal.privacy.use.li3":"Développer de nouveaux produits, services, fonctionnalités et capacités",
"legal.privacy.use.li4":"Personnaliser votre expérience et proposer du contenu et des fonctionnalités pertinents pour vos intérêts",
"legal.privacy.use.li5":"Répondre à vos demandes, commentaires et questions",
"legal.privacy.use.li6":"Vous envoyer des avis techniques, des mises à jour, des alertes de sécurité ainsi que des messages d'assistance et d'administration",
"legal.privacy.use.li7":"Surveiller et analyser les tendances, l'utilisation et les activités liées à nos Services",
"legal.privacy.use.li8":"Détecter, enquêter et prévenir les transactions frauduleuses et autres activités illégales",
"legal.privacy.use.li9":"Protéger nos droits, notre propriété et notre sécurité, ainsi que les droits, la propriété et la sécurité de nos utilisateurs ou de tiers",
"legal.privacy.use.li10":"Respecter les obligations légales et faire appliquer nos conditions d'utilisation",
"legal.privacy.ai.h":"IA et apprentissage automatique",
"legal.privacy.ai.p1":"Nos Services utilisent des technologies d'intelligence artificielle et d'apprentissage automatique pour traiter les données produit, générer du contenu et fournir d'autres fonctionnalités automatisées. Les données que vous fournissez à nos Services peuvent être utilisées pour entraîner et améliorer nos modèles d'IA. Nous mettons toutefois en œuvre des garanties appropriées pour protéger vos données et préserver leur confidentialité.",
"legal.privacy.ai.p2":"Nous n'utilisons pas d'informations personnellement identifiables pour entraîner nos modèles d'IA généraux sans votre consentement explicite. Les données produit utilisées pour l'entraînement de l'IA sont anonymisées et agrégées dans la mesure du possible.",
"legal.privacy.share.h":"Comment nous partageons vos informations",
"legal.privacy.share.lead":"Nous pouvons partager vos informations dans les circonstances suivantes :",
"legal.privacy.share.providers.h":"Prestataires de services",
"legal.privacy.share.providers.p":"Nous pouvons partager vos informations avec des fournisseurs tiers, prestataires de services, sous-traitants ou agents qui exécutent des services pour notre compte, tels que le traitement des paiements, l'analyse de données, l'envoi d'e-mails, l'hébergement, le support client et l'assistance marketing.",
"legal.privacy.share.transfers.p":"Si nous participons à une fusion, une acquisition, un financement, une réorganisation, une faillite ou une cession d'actifs de l'entreprise, vos informations peuvent être transférées dans le cadre de cette opération. Nous vous informerons de tout changement de ce type concernant la propriété ou le contrôle de vos informations personnelles.",
"legal.privacy.share.legal.p":"Nous pouvons divulguer vos informations si la loi l'exige ou en réponse à des demandes valides d'autorités publiques (p. ex. un tribunal ou un organisme gouvernemental). Nous pouvons également divulguer vos informations pour faire appliquer nos conditions d'utilisation, protéger nos droits, notre vie privée, notre sécurité ou notre propriété, et/ou ceux de nos affiliés, utilisateurs ou de tiers.",
"legal.privacy.share.consent.p":"Nous pouvons partager vos informations avec des tiers lorsque vous nous avez donné votre consentement à cet effet.",
"legal.privacy.security.h":"Sécurité des données",
"legal.privacy.security.p1":"Nous avons mis en œuvre des mesures techniques et organisationnelles appropriées destinées à protéger vos informations personnelles contre la perte accidentelle et contre l'accès, l'utilisation, l'altération et la divulgation non autorisés. Toutes les informations que vous nous fournissez sont stockées sur des serveurs sécurisés derrière des pare-feu.",
"legal.privacy.security.p2":"La sécurité de vos informations dépend également de vous. Lorsque nous vous avons fourni (ou que vous avez choisi) un mot de passe pour accéder à certaines parties de nos Services, vous êtes responsable du maintien de la confidentialité de ce mot de passe. Nous vous demandons de ne partager votre mot de passe avec personne.",
"legal.privacy.security.p3":"Malheureusement, la transmission d'informations via Internet n'est pas totalement sécurisée. Bien que nous fassions de notre mieux pour protéger vos informations personnelles, nous ne pouvons garantir la sécurité des informations personnelles transmises à nos Services. Toute transmission d'informations personnelles s'effectue à vos propres risques.",
"legal.privacy.rights.h":"Vos droits et choix",
"legal.privacy.rights.lead":"Nous nous efforçons de vous offrir des choix concernant les informations personnelles que vous nous fournissez. Selon votre localisation, vous pouvez disposer de certains droits relatifs à vos informations personnelles, notamment :",
"legal.privacy.rights.li1":"Accéder à vos informations personnelles et les mettre à jour",
"legal.privacy.rights.li2":"Demander la suppression de vos informations personnelles",
"legal.privacy.rights.li3":"Vous opposer au traitement de vos informations personnelles ou le restreindre",
"legal.privacy.rights.li4":"La portabilité des données",
"legal.privacy.rights.li5":"Retirer votre consentement (le cas échéant)",
"legal.privacy.rights.footer":"Pour exercer vos droits, veuillez nous contacter à l'aide des coordonnées figurant à la fin de la présente Politique de confidentialité. Notez que certains de ces droits peuvent être limités ou non applicables selon votre localisation et les circonstances particulières.",
"legal.privacy.retention.h":"Conservation des données",
"legal.privacy.retention.p1":"Nous conserverons vos informations personnelles aussi longtemps que nécessaire pour atteindre les finalités décrites dans la présente Politique de confidentialité, sauf si une durée de conservation plus longue est exigée ou autorisée par la loi. Pour déterminer la durée de conservation, nous prenons en compte la quantité, la nature et la sensibilité des informations, le risque potentiel de préjudice en cas d'utilisation ou de divulgation non autorisée, les finalités du traitement et les exigences légales applicables.",
"legal.privacy.retention.p2":"Nous pouvons conserver certaines informations après la fermeture de votre compte, notamment pour respecter nos obligations légales, résoudre des litiges et faire appliquer nos accords.",
"legal.privacy.intl.h":"Transferts internationaux de données",
"legal.privacy.intl.p1":"Vos informations personnelles peuvent être transférées et traitées dans des pays autres que celui dans lequel vous résidez. Ces pays peuvent disposer de lois sur la protection des données différentes de celles de votre pays.",
"legal.privacy.intl.p2":"Si nous transférons vos informations personnelles vers des pays situés hors de l'Espace économique européen ou d'autres régions disposant de lois complètes sur la protection des données, nous veillerons à ce que des garanties appropriées soient en place pour protéger vos informations personnelles et à ce que le transfert soit conforme à la réglementation applicable en matière de protection des données.",
"legal.privacy.children.h":"Confidentialité des mineurs",
"legal.privacy.children.p":"Nos Services ne sont pas destinés aux personnes de moins de 16 ans, et nous ne collectons pas sciemment d'informations personnelles auprès de mineurs de moins de 16 ans. Si nous apprenons que nous avons collecté ou reçu des informations personnelles d'un mineur de moins de 16 ans sans vérification du consentement parental, nous supprimerons ces informations. Si vous pensez que nous pourrions détenir des informations provenant d'un mineur de moins de 16 ans ou le concernant, veuillez nous contacter.",
"legal.privacy.changes.h":"Modifications de notre Politique de confidentialité",
"legal.privacy.changes.p1":"Nous pouvons mettre à jour notre Politique de confidentialité de temps à autre. Si nous apportons des modifications substantielles à la manière dont nous traitons les informations personnelles des utilisateurs, nous vous en informerons par e-mail à l'adresse indiquée dans votre compte et/ou via un avis sur notre site web.",
"legal.privacy.changes.p2":"La date de la dernière révision de la Politique de confidentialité figure en haut de la page. Il vous incombe de vous assurer que nous disposons d'une adresse e-mail à jour, active et joignable, et de consulter périodiquement notre site web et la présente Politique de confidentialité pour vérifier s'il y a des modifications.",
"legal.privacy.contact.h":"Contact",
"legal.privacy.contact.lead":"Si vous avez des questions ou des préoccupations concernant notre Politique de confidentialité ou nos pratiques en matière de données, veuillez nous contacter à :",
"legal.terms.title":"Conditions d'utilisation",
"legal.terms.s1.h":"1. Acceptation des conditions",
"legal.terms.s1.p":"En accédant à la plateforme de données produit de Descrybe et aux services associés (collectivement, les \"Services\") ou en les utilisant, vous acceptez d'être lié par les présentes Conditions d'utilisation et par toutes les lois et réglementations applicables. Si vous n'êtes pas d'accord avec l'une quelconque de ces conditions, il vous est interdit d'utiliser ou d'accéder aux Services.",
"legal.terms.s2.h":"2. Licence d'utilisation",
"legal.terms.s2.p1":"Sous réserve du respect des présentes Conditions d'utilisation, Descrybe vous accorde une licence limitée, non exclusive, non transférable et révocable pour accéder aux Services et les utiliser à des fins professionnelles.",
"legal.terms.s2.lead":"Cette licence n'inclut pas :",
"legal.terms.s2.li1":"La modification ou la copie des Services ou de tout contenu qu'ils contiennent",
"legal.terms.s2.li2":"L'utilisation des Services à toute fin commerciale autre que l'usage professionnel autorisé",
"legal.terms.s2.li3":"La tentative de décompilation ou d'ingénierie inverse de tout logiciel contenu dans les Services",
"legal.terms.s2.li4":"La suppression de tout avis de droits d'auteur ou de propriété des matériaux",
"legal.terms.s2.li5":"Le transfert des matériaux à une autre personne ou le \"miroir\" des matériaux sur tout autre serveur",
"legal.terms.s2.p2":"Cette licence prendra fin automatiquement si vous violez l'une quelconque de ces restrictions et pourra être résiliée par Descrybe à tout moment.",
"legal.terms.s3.h":"3. Abonnement et paiement",
"legal.terms.s3.p1":"L'accès aux Services peut nécessiter un abonnement payant. Les conditions de paiement seront précisées lors du processus d'abonnement. Tous les paiements sont non remboursables, sauf indication écrite contraire de Descrybe.",
"legal.terms.s3.p2":"Descrybe se réserve le droit de modifier les tarifs d'abonnement moyennant un préavis raisonnable. L'utilisation continue des Services après une modification tarifaire constitue l'acceptation des nouveaux tarifs.",
"legal.terms.s4.h":"4. Contenu utilisateur",
"legal.terms.s4.p1":"Vous conservez tous les droits sur tout contenu que vous soumettez, publiez ou affichez sur ou via les Services (\"Contenu utilisateur\"). En fournissant du Contenu utilisateur à Descrybe, vous accordez à Descrybe une licence mondiale, non exclusive et libre de redevances pour utiliser, reproduire, modifier, adapter, publier, traduire et distribuer ce contenu dans le cadre de la fourniture des Services.",
"legal.terms.s4.lead":"Vous déclarez et garantissez que :",
"legal.terms.s4.li1":"Vous détenez ou contrôlez tous les droits sur le Contenu utilisateur que vous fournissez",
"legal.terms.s4.li2":"Le Contenu utilisateur ne viole pas les présentes Conditions d'utilisation",
"legal.terms.s4.li3":"Le Contenu utilisateur ne causera de préjudice à aucune personne ni entité",
"legal.terms.s5.p1":"Les Services utilisent des technologies d'intelligence artificielle et d'apprentissage automatique. Vous reconnaissez que le contenu généré par IA peut ne pas être parfait et acceptez de relire tout contenu généré par IA avant de l'utiliser dans vos opérations commerciales.",
"legal.terms.s5.p2":"Descrybe peut utiliser du Contenu utilisateur anonymisé et agrégé pour entraîner et améliorer nos modèles d'IA, sous réserve de notre Politique de confidentialité. Vous pouvez refuser que vos données soient utilisées pour l'entraînement de l'IA en nous contactant.",
"legal.terms.s6.h":"6. Propriété intellectuelle",
"legal.terms.s6.p":"Les Services ainsi que leur contenu, leurs fonctionnalités et leurs capacités d'origine sont la propriété de Descrybe et sont protégés par les lois internationales sur le droit d'auteur, les marques, les brevets, les secrets commerciaux et autres droits de propriété intellectuelle ou de propriété.",
"legal.terms.s7.h":"7. Exclusion de garanties",
"legal.terms.s7.p1":"Les Services sont fournis \"en l'état\" et \"selon disponibilité\". Descrybe n'émet aucune garantie, expresse ou implicite, et décline par les présentes toutes les garanties, y compris, sans limitation, les garanties implicites de qualité marchande, d'adéquation à un usage particulier, d'absence de contrefaçon ou de cours d'exécution.",
"legal.terms.s7.p2":"Descrybe ne garantit pas que les Services fonctionneront de manière ininterrompue, sécurisée ou disponible à un moment ou un lieu particulier, ni que les erreurs ou défauts seront corrigés.",
"legal.terms.s8.h":"8. Limitation de responsabilité",
"legal.terms.s8.lead":"En aucun cas Descrybe ne pourra être tenu responsable de dommages indirects, accessoires, spéciaux, consécutifs ou punitifs, y compris, sans limitation, la perte de bénéfices, de données, d'usage, de clientèle ou d'autres pertes intangibles, résultant de :",
"legal.terms.s8.li1":"Votre accès aux Services ou leur utilisation, ou l'impossibilité d'y accéder ou de les utiliser",
"legal.terms.s8.li2":"Toute conduite ou tout contenu de tiers sur les Services",
"legal.terms.s8.li3":"Tout contenu obtenu à partir des Services",
"legal.terms.s8.li4":"L'accès, l'utilisation ou l'altération non autorisés de vos transmissions ou de votre contenu",
"legal.terms.s9.h":"9. Résiliation",
"legal.terms.s9.p1":"Descrybe peut résilier ou suspendre votre accès aux Services immédiatement, sans préavis ni responsabilité, pour quelque motif que ce soit, y compris, sans limitation, si vous violez les présentes Conditions d'utilisation.",
"legal.terms.s9.p2":"En cas de résiliation, votre droit d'utiliser les Services cessera immédiatement. Si vous souhaitez résilier votre compte, vous pouvez simplement cesser d'utiliser les Services ou nous contacter pour demander la suppression du compte.",
"legal.terms.s10.h":"10. Droit applicable",
"legal.terms.s10.p":"Les présentes Conditions sont régies et interprétées conformément aux lois de la Slovénie, sans égard aux principes de conflit de lois.",
"legal.terms.s11.h":"11. Modifications des conditions",
"legal.terms.s11.p":"Descrybe se réserve le droit de modifier ou de remplacer les présentes Conditions d'utilisation à tout moment. Il vous incombe de consulter périodiquement ces Conditions pour y déceler d'éventuelles modifications. L'utilisation continue des Services après la publication de toute modification constitue l'acceptation de ces modifications.",
"legal.terms.s12.h":"12. Contact",
"legal.terms.s12.lead":"Si vous avez des questions concernant les présentes Conditions d'utilisation, veuillez nous contacter à :",
"plans.loadFailed":"Impossible de charger les plans",
"plans.loading":"Chargement des plans…",
"plans.apiUnavailable":"L'API des plans n'est pas encore disponible sur ce backend. Affichage de la comparaison publique des tarifs.",
"plans.title":"Choisissez votre plan",
"plans.sub.onPrefix":"Vous êtes sur",
"plans.sub.enterpriseSuffix":"— produits et IA illimités. Aucune mise à niveau en libre-service n'est nécessaire.",
"plans.sub.paygSuffix":"— paiement à l'usage. Comparez les plans publics ci-dessous, ou contactez les ventes pour Enterprise.",
"plans.sub.creditsMid":"avec {remaining} crédits IA restants.",
"plans.sub.creditsSuffix":"Passez de Starter → Growth → Business via Checkout, ou contactez les ventes pour Enterprise.",
"plans.sub.none":"Aucun plan n'est encore attribué (par exemple après une migration ignorée). Choisissez un plan ci-dessous — la capacité n'est pas Illimitée tant que Checkout ou un administrateur n'en a pas attribué un.",
"plans.stripeHint":"Les mises à niveau en libre-service utilisent Stripe Checkout.",
"plans.checkoutUnavailable":"Le paiement en libre-service est indisponible tant que Stripe n'est pas configuré. Contactez les ventes pour un forfait.",
"plans.capacity.creditsPerMonth":"{count} crédits IA / mois",
"plans.cta.requestUpgrade":"Demander une mise à niveau",
"plans.cta.current":"Plan actuel",
"plans.cta.contactSales":"Contacter les ventes",
"plans.cta.switchInBilling":"Changer dans la facturation",
"plans.cta.upgradeTo":"Passer à {name}",
"plans.cta.startingCheckout":"Démarrage du checkout…",
"plans.planApplied":"Plan {plan} appliqué. Vos crédits sont prêts.",
"plans.faq.title":"Questions fréquentes",
"plans.faq.limit.q":"Que se passe-t-il si j'atteins une limite ?",
"plans.faq.limit.a":"Des bandeaux d'avertissement apparaissent d'abord. Lorsque vous n'avez plus de crédits IA ou que vous atteignez le plafond de SKU, les tâches nécessitant cette capacité sont bloquées jusqu'à ce que vous libériez de l'espace, attendiez le cycle suivant ou passiez à un plan supérieur.",
"plans.faq.selfServe.q":"Puis-je mettre à niveau moi-même ?",
"plans.faq.selfServe.a":"Les administrateurs de l'entreprise peuvent souscrire Starter, Growth et Business en libre-service via Checkout sur la carte du plan. Les membres doivent s'adresser à un administrateur — Checkout exige le rôle d'administrateur. Enterprise passe toujours par les ventes. Les administrateurs de plateforme peuvent toujours attribuer des plans dans Billing Admin.",
"plans.faq.enterprise.q":"Enterprise et des millions de SKU",
"plans.faq.enterprise.a":"La capacité sur mesure, la clé IA apportée (BYOK), le SLA et la gestion de compte passent par les ventes. Réservez un créneau via Calendly — Enterprise n'est pas en libre-service à l'échelle de millions de SKU. L'application affiche Illimité pour la capacité SKU et IA.",
"plans.faq.pricing.q":"Où trouver les tarifs publics ?",
"plans.faq.pricing.aBefore":"Consultez la comparaison marketing sur la",
"plans.faq.pricing.pricingPage":"page Tarifs",
"plans.faq.pricing.aMid":"— les CTA sont Commencer (inscription) ou Contacter les ventes. Gérez l'utilisation à tout moment dans",
"plans.faq.pricing.aAfter":".",
"plans.custom.title":"Besoin d'un plan sur mesure ?",
"plans.custom.body":"La capacité Enterprise, la clé IA apportée et les SLA sont gérés avec notre équipe.",
"plans.custom.looking":"Vous cherchez les détails des plans publics ?",
"ai.title":"Intégrations IA",
"ai.description":"Choisissez les crédits de la plateforme ou votre propre clé, puis personnalisez les prompts avec des variables.",
"ai.crumb":"Intégrations IA",
"ai.adminOnly":"Seuls les administrateurs de l’entreprise peuvent modifier les paramètres IA. Vous pouvez consulter la configuration actuelle.",
"ai.badge.ownKey":"Votre propre clé",
"ai.badge.platform":"Crédits / clé de la plateforme",
"ai.providerMode.desc":"La plateforme utilise les crédits Descrybe et notre clé. Populaire ou Personnalisé utilise votre clé compatible OpenAI (l’appel au fournisseur ne consomme pas de crédits plateforme ; les règles de crédits des fonctionnalités s’appliquent toujours).",
"ai.useCompanyKey":"Utiliser cette clé d’entreprise pour le traitement, le SEO IA et les campagnes IA",
"ai.popular.title":"Fournisseur populaire",
"ai.popular.desc":"Endpoints compatibles OpenAI. Anthropic via OpenRouter.",
"ai.field.provider":"Fournisseur",
"ai.field.model":"Modèle",
"ai.placeholder.modelId":"id du modèle",
"ai.baseUrlLabel":"URL de base : {url}",
"ai.custom.title":"Endpoint personnalisé",
"ai.custom.desc":"Saisissez l’URL de base HTTPS de votre fournisseur d’IA.",
"ai.field.baseUrl":"URL de base",
"ai.apiKey.title":"Clé API",
"ai.apiKey.desc":"Laissez vide pour conserver la clé existante. Les secrets bruts ne sont jamais renvoyés — uniquement un last4 masqué.",
"ai.storedKey":"Clé enregistrée : {masked}",
"ai.field.apiKey":"Clé API",
"ai.placeholder.keepKey":"•••• laissez vide pour conserver",
"ai.clearStoredKey":"Effacer la clé API enregistrée",
"ai.saveProvider":"Enregistrer le fournisseur",
"ai.testConnection":"Tester la connexion",
"ai.prompts.title":"Modèles de prompt",
"ai.prompts.descBefore":"Personnalisez les prompts système et utilisateur pour les textes produit, les méta SEO et les e-mails de campagne. Insérez des variables comme",
"ai.prompts.descMid":"— elles sont renseignées à l’exécution. La voix du kit de marque est disponible sous",
"ai.prompts.descAfter":".",
"ai.field.feature":"Fonctionnalité",
"ai.badge.custom":"Personnalisé",
"ai.badge.builtin":"Valeur par défaut intégrée",
"ai.badge.disabledDefault":"Désactivé → utilisation du défaut",
"ai.useCustomPrompt":"Utiliser ce prompt personnalisé (désactivé = défaut intégré)",
"ai.insertVariableInto":"Insérer la variable dans",
"ai.insert.system":"Système",
"ai.insert.user":"Utilisateur",
"ai.field.systemPrompt":"Prompt système",
"ai.field.userPrompt":"Prompt utilisateur",
"ai.savePrompts":"Enregistrer les prompts",
"ai.resetDefault":"Réinitialiser par défaut",
"ai.editBrandVoice":"Modifier la voix de marque",
"ai.flash.loadFailed":"Échec du chargement des paramètres IA",
"ai.flash.usingPlatform":"Utilisation de l’IA de la plateforme (crédits / clé Descrybe lorsqu’ils sont configurés).",
"ai.flash.providerSaved":"Fournisseur IA enregistré. Les clés sont chiffrées et ne sont plus affichées.",
"ai.flash.savePromptsFailed":"Impossible d’enregistrer les prompts",
"ai.flash.resetFailed":"Impossible de réinitialiser le prompt",
"ai.flash.connectionFailed":"Échec de la connexion",
"ai.flash.testFailed":"Échec du test",
"ai.action.changeSettings":"modifier les paramètres du fournisseur IA",
"ai.action.changePrompts":"modifier les prompts IA",
"ai.action.testProvider":"tester le fournisseur IA",
"email.title":"Envoi d’e-mails",
"email.description":"Resend ou SMTP pour les campagnes marketing. Secrets chiffrés au repos.",
"email.adminOnly":"Seuls les administrateurs de l’entreprise peuvent modifier les paramètres du fournisseur d’e-mail. Vous pouvez consulter la configuration actuelle.",
"email.crumb":"Intégration e-mail",
"email.dryRunForced":"Le mode dry-run est forcé ({reason}). Les plans Free et EMAIL_DRY_RUN n’envoient jamais de vrais envois massifs.",
"email.dryRunPolicy":"politique",
"email.badge.verified":"Vérifié",
"email.badge.notVerified":"Non vérifié",
"email.badge.canSendReal":"Envoi réel autorisé",
"email.badge.realBlocked":"Envoi réel bloqué",
"email.badge.lastTest":"Dernier test : {status}",
"email.provider.title":"Fournisseur",
"email.provider.desc":"Configuration par entreprise. Le SMTP/Resend d’environnement de la plateforme sert de secours uniquement en cas de secrets manquants.",
"email.field.provider":"Fournisseur",
"email.provider.resend":"Resend",
"email.provider.smtp":"SMTP",
"email.field.fromEmail":"E-mail de l’expéditeur",
"email.field.domain":"Domaine",
"email.field.from":"De",
"email.field.fromName":"Nom de l’expéditeur",
"email.field.replyTo":"Reply-To",
"email.resendKeySaved":"Clé API Resend (enregistrée — laissez vide pour conserver)",
"email.resendKey":"Clé API Resend",
"email.field.smtpHost":"Hôte SMTP",
"email.field.port":"Port",
"email.field.username":"Nom d’utilisateur",
"email.field.passwordSaved":"Mot de passe (enregistré)",
"email.field.password":"Mot de passe",
"email.verifyDomain":"Vérifier le domaine",
"email.testGate.title":"Test et contrôle des envois",
"email.testGate.desc":"Les envois de test vérifient l’adresse de l’expéditeur. Les vrais envois massifs exigent de saisir “I understand”.",
"email.field.recipient":"Destinataire",
"email.sendTest":"Envoyer un test",
"email.confirmBlast":"Confirmer l’envoi massif…",
"email.flash.loadFailed":"Échec du chargement des paramètres e-mail",
"email.flash.verifyUpdated":"Vérification mise à jour.",
"email.flash.verifyFailed":"Échec de la vérification",
"email.flash.testFailed":"Échec de l’envoi de test",
"email.flash.blastDryRun":"Contrôle de livraison enregistré en mode dry-run — aucun e-mail n’a été envoyé.",
"email.flash.blastDone":"Contrôle de livraison terminé : {sent} envoyés, {failed} échoués.",
"email.flash.blastFailed":"Échec de l’envoi massif",
"email.blast.subject":"Contrôle de livraison e-mail Descrybe",
"email.blast.body":"Ceci est un contrôle de livraison à une seule adresse depuis Descrybe pour confirmer que votre intégration e-mail peut envoyer. Destinataire : {recipient}",
"email.action.changeSettings":"modifier les paramètres du fournisseur d’e-mail",
"email.action.verifyDomain":"vérifier le domaine e-mail",
"email.action.sendTest":"envoyer un e-mail de test",
"email.action.sendBlasts":"envoyer des campagnes e-mail",
"seo.title":"Recommandations SEO",
"seo.description":"Scores de checklist pour les méta du catalogue, titres, images et mots-clés. Le remplissage par modèle est gratuit ; la réécriture IA est payante.",
"seo.upgradeTitle":"La réécriture IA est une fonctionnalité payante",
"seo.upgradeMessage":"Les plans Free peuvent encore corriger les méta manquantes avec des modèles basés sur des règles. Passez à un forfait supérieur ou ajoutez des crédits pour utiliser les réécritures IA.",
"seo.comparePlans":"Comparer les forfaits",
"seo.openProducts":"Ouvrir les produits",
"seo.overallScore":"Score SEO global",
"seo.overallScoreHint":"Moyenne des éléments de la checklist",
"seo.productsScanned":"Produits analysés",
"seo.productsScannedHint":"Produits traités dans l’entreprise",
"seo.categoriesScanned":"Catégories analysées",
"seo.categoriesScannedHint":"Y compris les contrôles de formules méta",
"seo.aiRewrite":"Réécriture IA",
"seo.available":"Disponible",
"seo.gated":"Restreint",
"seo.templateFree":"Le remplissage par modèle reste gratuit sur tous les forfaits",
"seo.noFindings":"Aucun constat pour ce filtre — beau travail.",
"seo.col.issue":"Problème",
"seo.col.entity":"Entité",
"seo.col.severity":"Gravité",
"seo.col.actions":"Actions",
"seo.filling":"Remplissage…",
"seo.templateFill":"Remplissage par modèle",
"seo.aiTitleAllowed":"Réécrire avec l’IA (utilise des crédits)",
"seo.aiTitleGated":"Nécessite un forfait payant ou des crédits",
"seo.rewriting":"Réécriture…",
"seo.aiRewriteBtn":"Réécriture IA",
"seo.viewProduct":"Voir le produit",
"seo.flash.loadFailed":"Échec du chargement des recommandations SEO",
"seo.flash.aiPaid":"La réécriture IA nécessite un forfait payant ou des crédits.",
"seo.flash.applyFailed":"Échec de l’application de la correction",
"brand.title":"Kit de marque",
"brand.description":"Définissez la voix, les consignes et les couleurs pour que les titres et descriptions produit restent fidèles à la marque.",
"brand.loading":"Chargement du kit de marque…",
"brand.adminOnly":"Seuls les administrateurs de l’entreprise peuvent modifier le kit de marque. Vous pouvez consulter la voix, les couleurs et le logo actuels.",
"brand.aiApplyFreeAdmin":"Vous pouvez modifier votre kit de marque en Free. L’application IA (injection de la voix de marque dans les prompts d’amélioration) se débloque à partir de Starter.",
"brand.aiApplyGated":"L’application IA (injection de la voix de marque dans les prompts d’amélioration) se débloque à partir de Starter.",
"brand.aiEnhanceUses":"L’amélioration IA utilisera cette voix de marque lors du traitement des produits.",
"brand.comparePlans":"Comparer les forfaits",
"brand.voice.title":"Voix et consignes",
"brand.voice.desc":"Ton, règles à faire / à éviter et formulations préférées",
"brand.field.voiceTone":"Voix / ton",
"brand.placeholder.voiceTone":"ex. Assuré, concis, technique mais accessible",
"brand.field.dos":"À faire (une par ligne)",
"brand.placeholder.dos":"Commencez par le bénéfice principal\nGardez les titres sous 80 caractères",
"brand.field.donts":"À éviter (une par ligne)",
"brand.placeholder.donts":"Pas de MAJUSCULES\nÉvitez les superlatifs sans preuve",
"brand.field.preferredTerms":"Termes préférés (un par ligne ou séparés par des virgules)",
"brand.placeholder.preferredTerms":"sans fil, premium, classe énergétique",
"brand.visual.title":"Identité visuelle",
"brand.visual.desc":"Couleurs et logo utilisés dans les conseils et campagnes adaptés à la marque",
"brand.logoHint":"PNG, JPEG ou WebP jusqu’à 2 MiB. Stocké dans les téléversements de votre entreprise.",
"brand.uploading":"Téléversement…",
"brand.uploadLogo":"Téléverser le logo",
"brand.clear":"Effacer",
"brand.field.logoUrl":"URL du logo",
"brand.placeholder.logoUrl":"https://… ou téléversé /api/brand/logo/files/…",
"brand.logoAlt":"Aperçu du logo de marque",
"brand.tipsTitle":"Conseils formule / aperçu",
"brand.saving":"Enregistrement…",
"brand.save":"Enregistrer le kit de marque",
"brand.flash.loadFailed":"Échec du chargement du kit de marque",
"structured.title":"Champs de description structurée",
"structured.loading":"Chargement des champs de description structurée…",
"structured.backDashboard":"Retour au tableau de bord",
"structured.categoryFormulas":"Formules de catégorie",
"structured.exportFeeds":"Flux d’export",
"structured.intro":"Ces champs sont créés automatiquement lorsque vous ajoutez des Export IDs aux sections de formule de description. Ils peuvent être utilisés dans vos flux d’export pour inclure des parties précises de vos descriptions produit.",
"structured.addField":"Ajouter un champ",
"structured.openCategories":"Ouvrir les catégories",
"structured.tableCaption":"Ces champs servent à structurer des parties des descriptions produit pour l’export.",
"structured.col.fieldKey":"Clé du champ",
"structured.col.type":"Type",
"structured.col.created":"Créé",
"structured.col.actions":"Actions",
"structured.dialogTitle":"Ajouter un champ de description structurée",
"structured.fieldKeyLabel":"Clé du champ (obligatoire)",
"structured.flash.loadFailed":"Échec du chargement des champs de description structurée",
"assistant.ariaLabel":"Assistant système",
"assistant.title":"Assistant système",
"assistant.subtitle":"Naviguez, guidez et exécutez les actions prises en charge",
"assistant.resetAria":"Réinitialiser la conversation",
"assistant.resetTitle":"Réinitialiser",
"assistant.closeAria":"Fermer l’assistant",
"assistant.messageLabel":"Message",
"assistant.placeholder":"ex. ajouter une URL de flux, clés API, attributs, traitement…",
"assistant.sendAria":"Envoyer",
"site.bookDemo":"Réserver une démo",
"site.demoShort":"Démo",
"site.allRightsReserved":"Tous droits réservés.",
"site.cookiePolicy":"Politique de cookies",
"site.cookieSettings":"Paramètres des cookies",
"consent.title":"Cookies et analytique",
"consent.description":"Nous utilisons des cookies nécessaires pour faire fonctionner Descrybe. Les cookies optionnels d’analytique et de marketing nous aident à comprendre l’usage et mesurer les campagnes. Vous pouvez modifier votre choix à tout moment.",
"consent.acceptAll":"Tout accepter",
"consent.rejectNonEssential":"Refuser les non essentiels",
"consent.customize":"Personnaliser",
"consent.save":"Enregistrer les préférences",
"consent.necessary":"Nécessaires",
"consent.necessaryDesc":"Requis pour la connexion, la sécurité (CSRF), le thème, la langue et mémoriser ce choix.",
"consent.alwaysOn":"Toujours actifs",
"consent.analytics":"Analytique",
"consent.analyticsDesc":"Aide à comprendre l’usage du produit (Google Analytics via GTM).",
"consent.marketing":"Marketing",
"consent.marketingDesc":"Pour la mesure publicitaire et la personnalisation lorsque des balises ads sont configurées dans GTM.",
"consent.policyLink":"Lire la Politique de cookies",
"seo.cookies.title":"Politique de cookies | Descrybe",
"seo.cookies.description":"Comment Descrybe utilise les cookies nécessaires, analytiques et marketing, y compris GTM et GA4, et comment modifier votre consentement.",
"legal.cookies.title":"Politique de cookies",
"legal.cookies.intro.h":"Aperçu",
"legal.cookies.intro.p1":"Cette Politique de cookies explique comment Descrybe utilise les cookies et technologies similaires sur le site et l’application. À lire avec notre Politique de confidentialité.",
"legal.cookies.intro.p2":"Lorsque requis, nous demandons votre consentement avant d’activer les cookies analytiques ou marketing. Les cookies nécessaires assurent le service de façon sécurisée et ne requièrent pas de consentement.",
"legal.cookies.types.h":"Catégories de cookies",
"legal.cookies.necessary.h":"Nécessaires",
"legal.cookies.necessary.p":"Ils maintiennent la session, protègent les formulaires (CSRF), stockent le thème et la langue, et mémorisent votre choix. Sans eux, le produit ne fonctionne pas correctement.",
"legal.cookies.analytics.h":"Analytique",
"legal.cookies.analytics.p":"Si vous autorisez l’analytique, nous chargeons des balises GTM pouvant déposer des cookies GA4 pour mesurer les pages et événements. Les événements sont bloqués tant que analytics_storage n’est pas accordé.",
"legal.cookies.marketing.h":"Marketing",
"legal.cookies.marketing.p":"Si vous autorisez le marketing, les balises publicitaires GTM peuvent utiliser le stockage publicitaire et signaux associés pour la mesure et la personnalisation.",
"legal.cookies.gtm.h":"Google Tag Manager et GA4",
"legal.cookies.gtm.p":"Lorsqu’il est configuré, Descrybe charge un conteneur GTM. GA4 est configuré dans ce conteneur. Le Consent Mode v2 refuse par défaut le stockage analytique et publicitaire jusqu’à acceptation des catégories.",
"legal.cookies.third.h":"Tiers",
"legal.cookies.third.p":"Google (Tag Manager / Analytics) peut traiter des données techniques (URL, appareil/navigateur, noms d’événements) avec consentement. Nous n’envoyons pas volontairement mots de passe, clés API ou coordonnées dans les événements.",
"legal.cookies.manage.p":"Utilisez Paramètres des cookies dans le pied de page (ou le bouton ci-dessous) pour rouvrir la bannière. Vous pouvez aussi effacer les données du site dans le navigateur.",
"site.privacyPolicy":"Politique de confidentialité",
"site.termsOfService":"Conditions d’utilisation",
"site.legalNav":"Mentions légales",
"site.footer.aria":"Site",
"site.footer.description":"Descrybe transforme les flux fournisseurs en catalogues produits propres et prêts pour les canaux — mappez les champs, enrichissez attributs et textes, puis exportez ou synchronisez avec WooCommerce.",
"home.hero.tagline":"Données produit pour les équipes e-commerce",
"home.hero.title":"Des flux fournisseurs aux fiches produit",
"home.hero.lead":"Connectez des flux fournisseurs, mappez-les à vos catégories, renseignez les attributs requis et rédigez titres et descriptions selon vos règles — puis exportez ou synchronisez avec votre boutique.",
"home.hero.learnMore":"En savoir plus",
"home.hero.apply":"Demander l’accès",
"home.hero.supportedBy":"Soutenu par",
"home.hero.msAlt":"Microsoft for Startups",
"home.image.previewAlt":"Aperçu de la plateforme Descrybe : du flux à la fiche produit",
"home.how.title":"Voici comment Descrybe vous fait gagner du temps pour mettre les produits en vente",
"home.how.lead":"Importez une fois des données fournisseurs en désordre. Descrybe vous aide à les catégoriser, compléter les attributs, rédiger les fiches et envoyer des produits prêts vers vos canaux.",
"home.how.step1.desc":"Configurez les catégories et attributs déjà utilisés par votre boutique",
"home.how.step1.f1":"Définissez les attributs obligatoires par catégorie",
"home.how.step1.f2":"Définissez des formules de titre par catégorie",
"home.how.step1.f3":"Définissez des modèles de description et d’extrait de recherche",
"home.how.step2.title":"Importez les données fournisseurs",
"home.how.step2.desc":"Connectez une URL de flux ou téléversez un fichier produits",
"home.how.step2.f1":"Importez depuis CSV, XML ou API",
"home.how.step2.f2":"Planifiez des imports automatiques depuis vos fournisseurs",
"home.how.step2.f3":"Mappez les champs avec une interface simple en glisser-déposer",
"home.how.step3.title":"Transformez et enrichissez",
"home.how.step3.desc":"Choisissez les produits à traiter et laissez Descrybe :",
"home.how.step3.f1":"Attribuer les bonnes catégories",
"home.how.step3.f2":"Compléter les attributs produit requis",
"home.how.step3.f3":"Créer des titres et descriptions clairs et adaptés à la recherche",
"home.how.step4.title":"Exportez vers les canaux",
"home.how.step4.desc":"Envoyez des données produit prêtes là où vous vendez",
"home.how.step4.f1":"Générez des flux produit spécifiques par canal",
"home.how.step4.f2":"Gardez le contrôle total des champs exportés",
"home.how.step4.f3":"Restez à jour quand les données fournisseurs changent",
"home.benefits.title":"Tout ce qu’il faut pour des données produit plus propres",
"home.benefits.lead":"De l’import de flux aux fiches prêtes pour le canal — sans reconstruire chaque fichier à la main.",
"home.benefits.shield.title":"Repérez tôt les fiches incomplètes",
"home.benefits.shield.desc":"Contrôlez les données selon les règles de catégorie pour corriger attributs manquants et textes faibles avant mise en ligne.",
"home.benefits.chart.title":"Fiches plus claires, meilleure conversion",
"home.benefits.chart.desc":"Titres et descriptions qui mettent en avant ce qui compte pour l’acheteur — bénéfices, specs et termes de recherche de votre catalogue.",
"home.benefits.database.title":"Une structure produit cohérente",
"home.benefits.database.desc":"Gardez le même arbre de catégories et la même forme d’attributs sur les exports et canaux pour que les clients trouvent les produits de la même façon partout.",
"home.benefits.search.title":"Contenu produit adapté à la recherche",
"home.benefits.search.desc":"Rédigez titres, descriptions et meta snippets plus faciles à comprendre pour acheteurs et moteurs de recherche.",
"home.benefits.cost.title":"Moins de saisie manuelle",
"home.benefits.cost.desc":"Automatisez mapping, remplissage d’attributs et textes pour que l’équipe se concentre sur le merchandising — pas le nettoyage de tableurs.",
"home.benefits.scale.title":"Prêt pour chaque canal de vente",
"home.benefits.scale.desc":"Adaptez flux d’export et sync WooCommerce aux formats attendus par chaque canal, sans reconstruire le catalogue à la main.",
"home.cta.titleLead":"Mettez les produits sur le marché ",
"home.cta.titleHighlight":"plus vite",
"home.cta.description":"Arrêtez de reconstruire les données produit à chaque fichier fournisseur. Mappez une fois, enrichissez avec vos règles et publiez des fiches prêtes à vendre.",
"home.cta.f1":"Démo personnalisée",
"home.cta.f2":"Conseil d’experts",
"home.cta.f3":"Prochaines étapes claires",
"home.cta.apply":"Demander l’accès",
"home.cta.imageAlt":"Pages produit Descrybe",
"home.product.eyebrow":"Ce que fait Descrybe",
"home.product.title":"Flux fournisseurs en entrée. Fiches prêtes en sortie — export, WooCommerce ou API.",
"home.product.description":"Descrybe aide les équipes e-commerce à transformer des flux CSV et XML fournisseurs en catalogues propres. Mappez vers vos catégories, enrichissez attributs et textes, puis livrez via exports, sync WooCommerce ou API publique.",
"home.product.pipelineAria":"Pipeline produit",
"home.product.p1.label":"Flux entrants",
"home.product.p1.detail":"CSV / XML depuis des URL fournisseurs",
"home.product.p2.label":"Mapper",
"home.product.p2.detail":"Associez les colonnes à vos champs",
"pricing.section.title":"Commencez gratuitement. Scalez quand le catalogue grandit.",
"pricing.section.lead":"Free inclut le mapping de flux, un nettoyage produit de base et les étiquettes énergétiques UE (EPREL) jusqu’à 100 SKU (sans crédits IA). Les offres payantes ajoutent titres et descriptions IA, plus de capacité et d’exports — Starter, Growth, Business, ou contactez les ventes pour Enterprise.",
"pricing.section.billingPeriod":"Période de facturation",
"pricing.section.monthly":"Mensuel",
"pricing.section.yearly":"Annuel",
"pricing.section.savePercent":"Économisez 20 %",
"pricing.section.publicBefore":"Offres publiques : Free, Starter, Growth, Business et Enterprise. Créez un compte Free, puis passez à un plan supérieur sous",
"pricing.section.publicOr":"ou",
"pricing.section.publicAfter":"via Stripe Checkout. Enterprise reste géré par les ventes.",
"pricing.section.plansLink":"Offres",
"pricing.section.billingLink":"Facturation",
"pricing.section.capabilitiesTitle":"Ce pour quoi chaque offre est conçue",
"pricing.section.capabilitiesLead":"Importez des flux, enrichissez votre catalogue, puis exportez ou synchronisez avec WooCommerce",
"pricing.cap.limits.f2":"Packs mensuels de crédits IA",
"pricing.cap.limits.f3":"Rôles et invitations d’équipe",
"pricing.cap.limits.f4":"Options SLA Enterprise",
"pricing.faq.credits.q":"Que sont les crédits IA ?",
"pricing.faq.credits.a":"Les crédits IA paient des étapes comme la génération de titres et descriptions. Free inclut 0 crédit IA — vous pouvez quand même mapper des flux et nettoyer les données. Packs mensuels payants : Starter 150, Plus 500, Growth 1 200, Business 4 000, Scale 8 000. Enterprise inclut un large pack géré (et votre propre clé). À partir de Growth, vous pouvez optionnellement utiliser votre propre clé.",
"pricing.faq.packs.q":"Can I buy extra AI credits?",
"pricing.faq.packs.a":"Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.",
"pricing.faq.limits.q":"Que se passe-t-il si j’atteins la limite produits ou crédits ?",
"pricing.faq.limits.a":"Nous vous prévenons à l’approche. Au plafond produits ou sans crédits IA, les jobs qui en ont besoin se mettent en pause jusqu’à libérer de la capacité, attendre le prochain cycle ou changer d’offre.",
"pricing.faq.change.q":"Puis-je monter ou descendre d’offre ?",
"pricing.faq.change.a":"Oui. Commencez sur Free, puis passez à Starter, Plus, Growth, Business ou Scale depuis Plans ou Facturation (Stripe Checkout). Enterprise est toujours géré par les ventes.",
"pricing.faq.free.q":"Que comprend Free ?",
"pricing.faq.free.a":"Free pour toujours : 50 produits, un flux, nettoyage et remplissage d’attributs, étiquettes énergétiques UE (EPREL — données publiques, sans crédits), plus un export manuel — avec 0 crédit IA. Sans carte. Passez à une offre supérieure pour l’IA ou plus de capacité.",
"pricing.faq.why.q":"Pourquoi ne pas payer par produit comme les outils de contenu seuls ?",
"pricing.faq.why.a":"Descrybe couvre le parcours complet du flux fournisseur au catalogue jusqu’à WooCommerce ou l’export — pas seulement le copy IA. Vous payez la capacité plateforme (produits et flux) ; l’IA est une couche d’usage par-dessus.",
"pricing.faq.annual.q":"Comment fonctionne la facturation annuelle ?",
"pricing.faq.annual.a":"La facturation annuelle offre environ 20 % de moins que le prix mensuel. Commencez gratuitement, puis choisissez l’annuel au Checkout (ou contactez les ventes).",
"pricing.calc.badge":"Plan calculator",
"pricing.calc.title":"Find the right plan",
"pricing.calc.lead":"Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).",
"pricing.calc.feeds":"Feed sources",
"pricing.calc.feedsHint":"Supplier / import feeds you need to connect",
"pricing.calc.skus":"Catalog products (SKUs)",
"pricing.calc.skusHint":"Total products you will store and process",
"pricing.calc.aiVolume":"AI process volume",
"pricing.calc.aiHint":"Roughly products × languages you want to enhance per month",
"pricing.calc.recommendedLabel":"Recommended",
"pricing.calc.budgetLabel":"Budget option",
"pricing.calc.coversCredits":"Needs about {count} AI credits / month",
"pricing.calc.aiIncluded":"Included monthly credits cover this AI volume",
"pricing.calc.aiNeedsPacks":"Add {count}× {pack} (~{usd}) for the AI shortfall",
"pricing.calc.orYearly":"or ~{amount}/mo yearly",
"pricing.calc.budgetNote":"Lower list price with yearly discount and/or credit packs when that still fits.",
"pricing.calc.noBudget":"The recommended plan is already the leanest fit for these inputs.",
"pricing.calc.enterpriseTitle":"Sounds like Enterprise",
"pricing.calc.enterpriseBody":"Your feeds or catalog size exceed self-serve caps. Talk to sales for unlimited capacity and a managed AI grant or BYOK.",
"pricing.calc.ctaPlan":"Choose {name}",
"pricing.calc.disclaimer":"Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.",
"pricing.pack.xxl.desc":"Large multi-language buffer (3,000 credits ≈ 1,500 AI products)",
"pricing.pack.mega.name":"Scale pack",
"pricing.pack.mega.desc":"Distributor / agency burst (8,000 credits ≈ 4,000 AI products)",
"pricing.section.faqDescription":"Réponses claires sur les forfaits, les crédits et ce qu’inclut Free.",
"billing.buyCreditPacks":"Buy AI credit packs",
"billing.buyCreditPacksHint":"Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.",
"billing.packCredits":"{credits} crédits",
"billing.packApproxProducts":"~{count} AI products",
"billing.buyPack":"Buy",
"billing.checkoutCompletePack":"Credit pack purchased — {credits} AI credits added.",
"billing.packCheckoutFailed":"Could not start credit pack checkout.",
"empty.default.noItems":"Aucun élément trouvé.",
"settings.tabLockedHint":"Not on your plan",
"stores.connectorLocked":"Not on your plan",
"stores.connectorUpgrade":"Upgrade to unlock",
"plan.upgrade.title":"Cette fonctionnalité n’est pas dans votre forfait",
"plan.upgrade.message":"Passez à un forfait supérieur pour débloquer cette partie de Descrybe.",
"plan.upgrade.defaultMessage":"Votre forfait actuel n’inclut pas cette partie de Descrybe. Passez à un forfait supérieur pour la débloquer, ou demandez à un admin de l’entreprise si vous ne pouvez pas modifier la facturation.",
"plan.upgrade.sectionOff.title":"Cette fonctionnalité est temporairement indisponible",
"plan.upgrade.sectionOff.message":"Cette partie de Descrybe est désactivée sur la plateforme pour le moment. Ce n’est pas un problème d’upgrade — réessayez plus tard ou contactez le support.",
"plan.upgrade.sectionOff.cta":"Retour au tableau de bord",
"plan.upgrade.stores.message":"Les connecteurs WooCommerce et Shopify nécessitent un forfait qui inclut Boutiques. Passez à un forfait supérieur pour les connecter — ou continuez avec les flux et l’API sur votre forfait actuel.",
"plan.upgrade.stillWorks.title":"Ce qui fonctionne encore avec votre forfait",
"plan.upgrade.stillWorks.feeds.description":"Ajoutez des URL CSV ou XML et des imports de fichiers pour synchroniser les catalogues sans connecteurs de boutique.",
"plan.upgrade.stillWorks.export.description":"Générez des flux sortants pour les canaux shopping et les partenaires.",
"plan.upgrade.stillWorks.processing.label":"Tâches en arrière-plan",
"plan.upgrade.stillWorks.processing.description":"Surveillez les jobs IA et catalogue dans Traitement — disponible sur votre forfait même sans connecteurs de boutique.",
"plan.upgrade.stillWorks.api.label":"Clés API",
"plan.upgrade.stillWorks.api.description":"Créez une clé dans Paramètres pour utiliser /api/v1 — le secret n’est affiché qu’une fois.",
"plan.upgrade.stillWorks.docs.label":"Docs API",
"plan.upgrade.stillWorks.docs.description":"Lisez l’aperçu de l’API et intégrez sans WooCommerce ni Shopify.",
"plan.upgrade.feature.settings.api_keys":"Les clés API nécessitent un forfait payant",
"plan.upgrade.feature.catalog.products.process_ai_titles":"Les titres IA sont une fonctionnalité payante",
"plan.upgrade.feature.catalog.products.process_ai_descriptions":"Les descriptions IA sont une fonctionnalité payante",
"plan.upgrade.feature.marketing.campaigns.generate_ai":"L’IA des campagnes nécessite un forfait payant",
"plan.upgrade.feature.marketing.campaigns.send":"L’envoi réel de campagnes nécessite un forfait payant",
"plan.upgrade.feature.marketing.brand_ai_apply":"La voix de marque dans l’IA nécessite un forfait payant",
"plan.upgrade.feature.marketing.seo.ai_rewrite":"La réécriture SEO IA nécessite un forfait payant",
"plan.upgrade.feature.integrations.ai.byok":"Apporter votre propre clé IA commence avec Growth",
"plan.upgrade.feature.capability.byok":"Apporter votre propre clé IA commence avec Growth",
"plan.upgrade.feature.marketing.campaigns":"Les campagnes ne sont pas dans votre forfait",
"plan.upgrade.feature.marketing.content_calendar":"Le calendrier de contenu n’est pas dans votre forfait",
"plan.upgrade.feature.marketing.seo":"Les outils SEO ne sont pas dans votre forfait",
"plan.upgrade.feature.marketing.brand_kit":"Le kit de marque n’est pas dans votre forfait",
"plan.upgrade.feature.marketing.reviews":"Les avis ne sont pas dans votre forfait",
"plan.upgrade.feature.integrations.ai":"Les intégrations IA ne sont pas dans votre forfait",
"plan.upgrade.feature.integrations.email":"L’envoi d’e-mails n’est pas dans votre forfait",
"plan.upgrade.feature.processing.monitor":"Le traitement n’est pas dans votre forfait",
"plan.upgrade.feature.stores.hub":"Les connecteurs de boutique ne sont pas dans votre forfait",
"plan.upgrade.feature.stores.woocommerce":"WooCommerce n’est pas dans votre forfait",
"plan.upgrade.feature.stores.shopify":"Shopify n’est pas dans votre forfait",
"plan.upgrade.feature.support.center":"Le centre d’assistance n’est pas dans votre forfait",
"plan.upgrade.feature.support.ticket_create":"La création de tickets d’assistance n’est pas dans votre forfait",
"plan.upgrade.feature.support.ticket_thread":"Les fils de tickets d’assistance ne sont pas dans votre forfait",
"plan.upgrade.feature.catalog.structured_descriptions":"Les descriptions structurées ne sont pas dans votre forfait",
"plan.upgrade.feature.catalog.vector_categories":"Les catégories vectorielles ne sont pas dans votre forfait",
"plan.checkingAccess":"Vérification de l’accès au forfait…",
"upgradeBanner.comparePlans":"Comparer les offres",
"upgradeBanner.talkToSales":"Parler aux ventes",
"commandPalette.closeAria":"Fermer la recherche",
"commandPalette.ariaLabel":"Rechercher des pages",
"commandPalette.placeholder":"Rechercher des pages…",
"commandPalette.searchAria":"Rechercher des pages",
"vector.title":"Test des catégories vectorielles",
"vector.description":"Recherchez dans l’index de catégories vectorielles lorsque Pinecone est configuré. Création d’index et initialisation ne sont pas encore disponibles en v2.",
"vector.probing":"Vérification de l’API des catégories vectorielles…",
"vector.unavailable":"Les catégories vectorielles ne sont pas encore sur ce backend. Rien à exécuter ici tant que /api/vector-categories/* n’est pas branché.",
"vector.browseCategories":"Parcourir les catégories",
"vector.initHeading":"Initialiser la base vectorielle",
"vector.initComingSoon":"Créer l’index et Initialiser la BD vectorielle ne sont pas encore disponibles en v2 (bientôt). La recherche fonctionne toujours lorsque Pinecone est configuré.",
"vector.createIndex":"Créer l’index",
"vector.initDb":"Initialiser la BD vectorielle",
"vector.searchHeading":"Rechercher des catégories",
"vector.searchPlaceholder":"Saisir une description de produit…",
"vector.results":"Résultats :",
"vector.categoryLabel":"Catégorie :",
"vector.idLabel":"ID :",
"vector.scoreLabel":"Score :",
"switcher.switching":"Changement…",
"switcher.returnTo":"Revenir à {email}",
"switcher.switchUser":"Changer d’utilisateur",
"switcher.loadingUsers":"Chargement des utilisateurs…",
"storeReconnect.primaryLabel":"Reconnecter la boutique",
"storeReconnect.titlePlural":"Reconnecter les boutiques après la migration",
"storeReconnect.titleChannel":"Reconnecter {channel} après la migration",
"storeReconnect.titleSingular":"Reconnecter la boutique après la migration",
"storeReconnect.messageWithItems":"Les identifiants API de boutique n’ont pas été repris (ou ne peuvent pas être utilisés) après la migration de la plateforme. Ce n’est pas une sync cassée — reconnectez chaque boutique, puis Testez la connexion avant de mettre une sync en file.",
"storeReconnect.messageSingle":"Les identifiants API de {channel} n’ont pas été repris (ou ne peuvent pas être utilisés) après la migration de la plateforme. Ce n’est pas une sync cassée — collez de nouveaux identifiants, Enregistrez, puis Testez la connexion avant de mettre une sync en file.",
"storeReconnect.channelFallback":"Boutique",
"storeReconnect.askAdmin":"Demandez à un administrateur de l’entreprise de reconnecter — seuls les administrateurs peuvent enregistrer les identifiants de boutique.",
"admin.storeReconnect.cutoverHint":"Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.",
"admin.storeReconnect.loadFailed":"Could not load store reconnect inventory.",
"admin.storeReconnect.refresh":"Refresh",
"admin.storeReconnect.description":"Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).",
"storeReconnect.wizardHint":"Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.",
"storeReconnect.wizardLabel":"Guided setup",
"storeReconnect.reviewsHint":"L’import d’avis ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.",
"storeReconnect.ordersHint":"L’import des commandes ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.",
"productSync.outboundBody":"— envoie les produits Descrybe traités vers la boutique (création ou mise à jour des produits distants correspondants). N’importe pas le catalogue boutique dans Descrybe.",
"productSync.firstSync":"Première sync",
"productSync.firstSyncBody":"— les produits sans correspondance sont créés dans {channel}. Les syncs suivantes mettent à jour les produits déjà liés par id ou stratégie de correspondance.",
"productSync.reSync":"Re-sync",
"productSync.reSyncBody":"— les produits distants correspondants peuvent être écrasés avec le contenu Descrybe ({count} liés pour l’instant).",
"productSync.queued":"Sync produits en file",
"productSync.live.queued":"En file — en attente du worker",
"productSync.live.running":"Synchronisation en cours",
"productSync.live.watching":"Suivi du statut… les compteurs apparaissent à la fin.",
"productSync.live.success":"Sync terminée : {total} total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés",
"productSync.live.partial":"Sync terminée avec des échecs : {total} total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés",
"productSync.live.failed":"Échec de la sync{detail}.",
"productSync.live.timedOut":"Toujours en cours — actualisez plus tard pour le statut et les compteurs.",
"productSync.noneYet":"Aucune sync produits n’est encore terminée.",
"productSync.lastRun":"Dernière exécution : {total} au total · {created} créés · {updated} mis à jour · {failed} échoués · {skipped} ignorés",
"productSync.needsReconnect":"La sync produits ne peut pas s’exécuter tant que les identifiants ne sont pas reconnectés après la migration. Dans l’onglet Connexion : Enregistrer, puis Tester la connexion.",
"productSync.scheduleTitle":"Planning de sync produits automatique",
"productSync.scheduleHelp":"Comme les intervalles des feeds : définissez la fréquence des pushes produits, ou mettez le planning en pause. La file manuelle reste disponible. Les webhooks boutique ne sont pas utilisés — interrogation/file uniquement.",
"productSync.scheduleInterval":"Intervalle de sync (heures)",
"productSync.scheduleIntervalHint":"1–168 heures. Par défaut 6 heures si non défini côté serveur.",
"productSync.schedulePause":"Mettre en pause la sync automatique",
"productSync.schedulePauseHint":"Arrête uniquement les pushes planifiés. Vous pouvez toujours lancer une sync manuellement.",
"productSync.scheduleSave":"Enregistrer le planning",
"productSync.scheduleSaved":"Planning de sync produits enregistré.",
"productSync.schedulePausedSaved":"Sync produits automatique en pause.",
"productSync.scheduleSaveFailed":"Impossible d’enregistrer le planning de sync",
"productSync.schedulePausedBadge":"Planning en pause",
"productSync.delivery.title":"Mises à jour par interrogation, pas par webhooks boutique",
"productSync.delivery.body":"Descrybe ne reçoit pas les webhooks Shopify ou WooCommerce. Les envois de produits s’exécutent quand vous les mettez en file ou selon le planning automatique. Cette page suit la progression en interrogeant l’état de la connexion — pas via des événements push boutique en direct.",
"productSync.delivery.inboundNote":"Commandes et avis utilisent aussi des tirages en file (planifiés ou manuels), pas des webhooks en direct.",
"productSync.delivery.hubNote":"Les connecteurs boutique synchronisent selon un planning ou quand vous lancez une tâche — pas via des webhooks boutique en direct.",