feat: pivot to social media workflow app
Some checks failed
Backend CI/CD / build_and_deploy (push) Has been cancelled
Frontend CI/CD / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-04-24 12:58:35 -04:00
parent 0f4acc1b6d
commit df3e602015
349 changed files with 18685 additions and 16010 deletions

View File

@@ -33,9 +33,437 @@
"x": "X (Twitter)",
"youtube": "YouTube",
"website": "Site web",
"common": {
"cancel": "Annuler",
"creating": "Création..."
},
"workspaceSelector": {
"createAction": "Ajouter un espace"
},
"workspaceCreate": {
"eyebrow": "Espace",
"title": "Creer un nouvel espace",
"description": "Configurez un nouvel espace avec son slug, son fuseau horaire, ses membres, son workflow et ses connecteurs.",
"previewTitle": "URL de l'espace",
"previewDescription": "Le slug devient l'identifiant stable utilise pour l'espace.",
"formTitle": "Details de l'espace",
"formDescription": "Commencez par les champs essentiels. Les membres, le workflow et les connecteurs peuvent etre configures juste apres la creation.",
"createAction": "Creer l'espace",
"slugHint": "Apercu du slug : {slug}",
"fields": {
"name": "Nom de l'espace",
"namePlaceholder": "Northwind Studio",
"slug": "Slug de l'espace",
"slugPlaceholder": "northwind-studio",
"timeZone": "Fuseau horaire"
},
"errors": {
"required": "Tous les champs de l'espace sont requis.",
"createFailed": "L'espace n'a pas pu etre cree."
}
},
"nav": {
"brandCaption": "Flux d'approbation",
"workspace": "Espace de travail",
"notifications": "Notifications",
"dashboard": "Tableau de bord",
"overview": "Vue globale",
"workspacePlan": "Contenu",
"mediaLibrary": "Bibliotheque media",
"channels": "Canaux",
"projects": "Campagnes",
"reviewQueue": "File de révision",
"content": "Contenu",
"profile": "Profil",
"signIn": "Se connecter",
"settings": "Paramètres",
"language": "Langue",
"signOut": "Se déconnecter",
"noWorkspace": "Aucun espace"
},
"notifications": {
"title": "Notifications",
"unread": "non lues",
"loading": "Chargement des notifications...",
"empty": "Aucune notification de workflow pour le moment.",
"events": {
"approvalRequested": "Approbation demandée",
"approvalDecisionRecorded": "Décision d'approbation enregistrée",
"commentCreated": "Commentaire ajouté",
"commentResolved": "Commentaire résolu",
"contentCreated": "Élément de contenu créé",
"revisionCreated": "Révision créée",
"statusUpdated": "Statut mis à jour",
"assetLinked": "Ressource liée",
"assetRevisionCreated": "Révision de ressource créée"
}
},
"sidebar": {
"allClients": "Tous les clients",
"allChannels": "Tous les canaux",
"allProjects": "Toutes les campagnes",
"allReviewItems": "File de révision complète",
"noClients": "Aucun client pour le moment.",
"noChannels": "Aucun canal pour le moment.",
"noProjects": "Aucune campagne pour le moment.",
"noReviewItems": "Aucun élément à réviser pour le moment."
},
"settings": {
"eyebrow": "Paramètres",
"title": "Paramètres du compte",
"userInformation": "Informations utilisateur",
"workspaces": "Espaces de travail",
"integrations": "Intégrations"
},
"dashboard": {
"eyebrow": "Calendrier de l'espace",
"title": "Calendrier",
"description": "Voyez ce qui est prévu pour une journée donnée et consultez l'agenda des publications dans l'ordre.",
"workspaceLabel": "Espace actif",
"loading": "Chargement des données de l'espace...",
"calendarKicker": "Agenda du jour",
"executionKicker": "À venir",
"riskKicker": "Risque de livraison",
"reviewKicker": "État des révisions",
"upcomingContent": "Contenu à venir",
"deliveryRisks": "Ce qui peut glisser",
"overdueItems": "Éléments en retard",
"approvalBlockers": "En attente d'approbation ou de révision",
"unscheduledProjects": "Campagnes sans contenu planifié",
"reviewQueueSnapshot": "Aperçu de la file de révision",
"emptyUpcoming": "Aucun contenu planifié à venir.",
"emptyOverdue": "Rien n'est en retard pour le moment.",
"emptyApproval": "Aucun blocage d'approbation pour le moment.",
"emptyProjects": "Chaque campagne a au moins un élément de contenu planifié.",
"emptyReviewQueue": "Aucun élément actif dans la file de révision.",
"previousDay": "Jour précédent",
"nextDay": "Jour suivant",
"today": "Aujourd'hui",
"month": "Mois",
"week": "Semaine",
"campaignDeadline": "Échéance de campagne",
"emptyPeriod": "Aucun élément planifié.",
"daySummary": "{content} contenus · {projects} échéances de campagne",
"moreItems": "+{count} autres",
"emptyDayAgenda": "Aucun contenu n'est planifié pour cette journée.",
"projectProgress": "{scheduled} planifiés · {approved} approuvés",
"missingSchedule": "Contenu à planifier",
"noDueDate": "Aucune échéance",
"labels": {
"unassignedProject": "Campagne non attribuée"
},
"readiness": {
"building": "En production",
"approval": "En attente d'approbation",
"rework": "Révision requise",
"ready": "Prêt à publier",
"published": "Publié",
"blocked": "Bloqué",
"archived": "Archivé",
"scheduled": "Planifié",
"missing": "Aucun contenu planifié"
},
"stats": {
"scheduledThisDay": "Planifiés ce jour",
"overdue": "En retard",
"awaitingApproval": "En attente d'approbation",
"readyToShip": "Prêts à livrer"
}
},
"overview": {
"eyebrow": "Vue portefeuille",
"title": "Chronologie multi-espaces",
"description": "Suivez les livraisons à venir, les risques et l'activité sur tous les espaces auxquels vous avez accès.",
"loading": "Chargement des données globales...",
"workspacesKicker": "Périmètre d'accès",
"workspaceRollup": "Synthèse des espaces",
"timelineKicker": "À venir",
"upcomingTitle": "Planifié sur tous les espaces",
"riskKicker": "À surveiller",
"risksTitle": "Éléments déjà à risque",
"activityKicker": "Activité récente",
"activityTitle": "Derniers événements du workflow",
"emptyUpcoming": "Aucun élément planifié à venir sur vos espaces.",
"emptyRisks": "Aucun risque de livraison multi-espace pour le moment.",
"emptyActivity": "Aucune activité récente du workflow.",
"labels": {
"projects": "campagnes",
"upcoming": "à venir",
"blocked": "bloqués"
},
"stats": {
"workspaces": "Espaces",
"projects": "Campagnes",
"upcoming": "Éléments à venir",
"blockers": "Éléments à risque"
}
},
"clients": {
"eyebrow": "Gestion client",
"title": "Clients",
"description": "Comptes clients, identité de marque et contacts principaux d'approbation.",
"newClient": "Nouveau client",
"createTitle": "Créer un client",
"loading": "Chargement des clients...",
"empty": "Aucun client n'est disponible pour l'espace actif.",
"noPrimaryContact": "Aucun contact principal défini",
"noPrimaryContactEmail": "Aucun email de contact principal défini",
"errors": {
"nameRequired": "Le nom du client est requis.",
"createFailed": "Le client n'a pas pu être créé."
},
"fields": {
"name": "Nom du client",
"portraitUrl": "URL du logo ou portrait du client",
"primaryContactName": "Nom du contact principal",
"primaryContactEmail": "Email du contact principal",
"primaryContactPortraitUrl": "URL du portrait du contact principal"
}
},
"projects": {
"eyebrow": "Planification des campagnes",
"title": "Campagnes",
"description": "Campagnes regroupées dans l'espace actif par statut, plage de dates et notes de planification.",
"newProject": "Nouvelle campagne",
"createTitle": "Créer une campagne",
"loading": "Chargement des campagnes...",
"empty": "Aucune campagne n'est disponible pour l'espace actif.",
"unknownClient": "Client inconnu",
"noDateRange": "Aucune plage de dates",
"errors": {
"required": "Le nom de la campagne et la plage de dates sont requis.",
"invalidDateRange": "La date de fin doit être postérieure ou égale à la date de début.",
"workspaceAccountRequired": "Cet espace a besoin d'un compte opérationnel avant de créer des campagnes.",
"createFailed": "La campagne n'a pas pu être créée."
},
"fields": {
"client": "Client",
"selectClient": "Sélectionner un client",
"startDate": "Date de début",
"endDate": "Date de fin",
"name": "Nom de la campagne",
"description": "Description",
"notes": "Notes"
}
},
"channels": {
"title": "Canaux",
"description": "Ajoutez des canaux à l'espace.",
"createTitle": "Créer un canal",
"empty": "Aucun canal n'est disponible pour l'espace actif pour le moment.",
"emptyAction": "Ajouter un canal pour {network}",
"nextDue": "Prochaine échéance",
"noScheduled": "Rien de planifié",
"fields": {
"name": "Nom du canal",
"network": "Réseau"
},
"metrics": {
"scheduled": "Planifié",
"ready": "Prêt",
"blocked": "Bloqué"
},
"errors": {
"createFailed": "Le canal n'a pas pu être créé."
}
},
"reviewQueue": {
"eyebrow": "Flux de révision",
"title": "File de révision",
"description": "Approbations, révisions et demandes de changement en attente pour l'espace actif.",
"empty": "Aucun élément de révision n'est disponible pour l'espace actif."
},
"contentItems": {
"eyebrow": "Flux de contenu",
"title": "Éléments de contenu",
"description": "Unités révisables avec ressources, texte et statut d'approbation dans l'espace actif.",
"newItem": "Nouvel élément de contenu",
"createTitle": "Créer un élément de contenu",
"loading": "Chargement des éléments de contenu...",
"empty": "Aucun élément de contenu n'est disponible pour l'espace actif.",
"noDueDate": "Aucune échéance",
"assetsHelper": "Les ressources Google Drive sont maintenant liées depuis la page de détail de l'élément après sa création.",
"errors": {
"required": "Le titre, la campagne, le message et les cibles sont requis.",
"workspaceAccountRequired": "Cet espace a besoin d'un compte opérationnel avant de créer du contenu.",
"createFailed": "L'élément de contenu n'a pas pu être créé."
},
"fields": {
"title": "Titre",
"client": "Client",
"selectClient": "Sélectionner un client",
"project": "Campagne",
"selectProject": "Sélectionner une campagne",
"dueDate": "Date d'échéance",
"publicationTargets": "Cibles de publication",
"publicationTargetsPlaceholder": "Instagram Reel, TikTok",
"publicationMessage": "Message de publication",
"hashtags": "Hashtags",
"hashtagsPlaceholder": "#lancement #marque #campagne",
"assets": "Ressources"
}
},
"userSettings": {
"eyebrow": "Informations utilisateur",
"title": "Profil et identité",
"description": "Gérez le portrait et les informations du compte affichés dans l'espace.",
"updatePortrait": "Mettre à jour le portrait",
"accountDetails": "Détails du compte",
"accountDetailsDescription": "Des champs supplémentaires d'édition du compte peuvent être ajoutés ici ensuite.",
"alias": "Alias",
"fullName": "Nom complet",
"email": "Email",
"noEmail": "Aucun email défini",
"cropperTitle": "Mettre à jour le portrait utilisateur",
"savePortrait": "Enregistrer le portrait",
"choosePortrait": "Choisir un portrait"
},
"workspaceSettings": {
"eyebrow": "Paramètres",
"title": "Paramètres de l'espace",
"description": "Configurez l'espace courant avec les sections general, membres, workflow et connecteurs.",
"currentWorkspace": "Espace actuel",
"noWorkspaceSelected": "Aucun espace sélectionné",
"activeWorkspace": "Espace actif",
"contextNote": "Ces paramètres s'appliquent uniquement à l'espace courant.",
"inviteTitle": "Inviter des membres",
"inviteDescription": "Invitez des clients, sous-traitants ou collègues dans l'espace actif.",
"inviteEmpty": "Aucune invitation en attente pour cet espace.",
"sendInvite": "Envoyer l'invitation",
"reset": "Réinitialiser",
"errors": {
"required": "Tous les champs de l'espace sont requis.",
"createFailed": "L'espace n'a pas pu être créé.",
"inviteRequired": "L'email et le rôle sont requis pour inviter un membre.",
"inviteFailed": "L'invitation de l'espace n'a pas pu être créée."
},
"fields": {
"name": "Nom de l'espace",
"slug": "Slug de l'espace",
"timeZone": "Fuseau horaire",
"memberEmail": "Email du membre",
"memberRole": "Rôle"
},
"roles": {
"administrator": "Administrateur",
"manager": "Gestionnaire",
"client": "Réviseur client",
"provider": "Sous-traitant",
"workspaceMember": "Membre de l'espace"
},
"summary": {
"name": "Nom",
"slug": "Slug",
"timeZone": "Fuseau horaire",
"created": "Créé"
},
"tabs": {
"general": "Général",
"members": "Membres",
"workflow": "Workflow",
"connectors": "Connecteurs"
},
"members": {
"inviteTitle": "Inviter",
"activeTitle": "Membres",
"activeDescription": "Voyez toutes les personnes qui appartiennent actuellement à l'espace actif.",
"activeEmpty": "Aucun membre trouvé pour cet espace.",
"pendingTitle": "Invitations en attente",
"pendingDescription": "Suivez les personnes invitées dans l'espace actif."
},
"connectors": {
"title": "Connecteurs",
"description": "Gerez les connecteurs au niveau de l'espace qui alimentent des fonctions comme la bibliotheque media.",
"openMediaLibrary": "Ouvrir la bibliotheque media",
"googleDrive": {
"title": "Google Drive",
"description": "Ce connecteur doit alimenter la synchronisation media de l'espace pour les images, videos et autres fichiers partages.",
"status": "Configuration en attente"
}
},
"general": {
"summaryTitle": "Résumé de l'espace",
"summaryDescription": "Détails de référence pour l'espace actuellement en contexte."
},
"approvals": {
"flowTitle": "Flux d'approbation",
"flowDescription": "Personnalisez le passage du contenu par la révision interne, la révision client et la mise en publication pour cet espace.",
"previewTitle": "Aperçu du flux",
"previewDescription": "Voici la séquence que l'espace utilisera selon la configuration actuelle.",
"saved": "Le flux d'approbation a été enregistré pour cet espace dans ce navigateur.",
"fields": {
"requireInternalReview": "Exiger une révision interne",
"internalApproversRequired": "Approbateurs internes requis",
"requireClientReview": "Exiger une révision client",
"clientApproversRequired": "Approbateurs client requis",
"defaultReviewerRole": "Rôle du réviseur par défaut",
"publishBehaviour": "Après l'approbation finale"
},
"fieldHelp": {
"requireInternalReview": "Le contenu doit être approuvé en interne avant de passer à la révision client.",
"requireClientReview": "Le contenu doit encore passer par une approbation client avant la publication."
},
"publishBehaviour": {
"manual": "Marquer prêt à publier",
"auto": "Passer automatiquement à prêt"
},
"steps": {
"internal": "Révision interne",
"client": "Révision client",
"publish": "Passage à la publication"
},
"stepDetail": {
"approverCount": "{count} approbateur(s) requis",
"autoPublish": "Le contenu passe automatiquement à prêt après l'approbation finale.",
"manualPublish": "Le contenu reste dans une étape manuelle prêt à publier après l'approbation finale."
}
}
},
"integrations": {
"eyebrow": "Intégrations",
"title": "Google Drive et clés API",
"description": "C'est ici que doivent vivre les intégrations au niveau de l'espace et la configuration des identifiants.",
"statusLabel": "Statut",
"pendingTitle": "Interface de configuration en attente",
"googleDrive": {
"title": "Google Drive",
"description": "Configurez la connexion de l'espace utilisée pour la liaison des ressources et l'entrée des révisions.",
"nextStep": "Prochaine étape : ajouter des paramètres d'intégration stockés pour l'espace et les connecter au flux de liaison des ressources."
},
"apiKeys": {
"title": "Clés API",
"description": "Les secrets de l'espace et identifiants de services externes doivent être gérés ici.",
"nextStep": "Prochaine étape : ajouter une persistance backend sécurisée et une gestion masquée des clés."
}
},
"mediaLibrary": {
"eyebrow": "Bibliotheque media",
"title": "Medias de l'espace",
"description": "Gerez la bibliotheque partagee d'images et de videos qui devrait se synchroniser avec Google Drive pour cet espace.",
"syncCard": {
"title": "Synchronisation Google Drive",
"description": "Cette zone servira a connecter le Drive de l'espace, importer les medias approuves et garder la bibliotheque alignee sur les dossiers externes."
},
"mediaTypesTitle": "Medias pris en charge",
"mediaTypesDescription": "La bibliotheque doit devenir l'endroit unique pour parcourir les ressources visuelles avant de les lier au contenu.",
"mediaTypes": {
"images": "Images, visuels graphiques et elements de marque",
"videos": "Videos, reels et exports en mouvement"
},
"workflowTitle": "Flux prevu",
"workflowDescription": "Cette page est le point d'entree prevu pour le flux de synchronisation Google Drive dont on a parle.",
"workflow": {
"connectDrive": "Connecter la source Google Drive de l'espace.",
"syncAssets": "Synchroniser les images et videos dans la bibliotheque interne.",
"organizeLibrary": "Reviser, etiqueter et reutiliser les medias depuis un seul endroit au niveau de l'espace."
},
"statusLabel": "Statut",
"pendingTitle": "Interface de gestion en attente",
"pendingDescription": "L'entree de navigation et la page sont en place. La prochaine etape est de brancher la vraie synchro Drive, le listing, les filtres et les actions sur les ressources."
},
"errors": {
"unexpected": "Une erreur inattendue s'est produite",
"imageLoad": "Erreur lors du chargement de l'image",
"imageUpload": "Erreur lors du téléchargement de l'image"
}
}
}