chore: add missing multi-level editor for approval workflow, rename projects to campaings.

This commit is contained in:
2026-05-01 14:23:37 -04:00
parent 5077f557f4
commit 884ca4b96d
148 changed files with 11567 additions and 1383 deletions

View File

@@ -74,7 +74,7 @@
"myFeedback": "My Feedback",
"feedbackReview": "Feedback Review",
"channels": "Channels",
"projects": "Campaigns",
"campaigns": "Campaigns",
"reviewQueue": "Review Queue",
"content": "Content",
"profile": "Profile",
@@ -210,7 +210,7 @@
"title": "Context",
"workspace": "Workspace",
"client": "Client",
"project": "Campaign",
"campaign": "Campaign",
"contentItem": "Content item"
},
"activity": {
@@ -253,11 +253,11 @@
"sidebar": {
"allClients": "All clients",
"allChannels": "All channels",
"allProjects": "All campaigns",
"allCampaigns": "All campaigns",
"allReviewItems": "Full review queue",
"noClients": "No clients yet.",
"noChannels": "No channels yet.",
"noProjects": "No campaigns yet.",
"noCampaigns": "No campaigns yet.",
"noReviewItems": "No review items right now."
},
"settings": {
@@ -281,12 +281,12 @@
"deliveryRisks": "What can slip",
"overdueItems": "Overdue items",
"approvalBlockers": "Awaiting approval or revisions",
"unscheduledProjects": "Campaigns without scheduled content",
"unscheduledCampaigns": "Campaigns without scheduled content",
"reviewQueueSnapshot": "Review queue snapshot",
"emptyUpcoming": "No upcoming scheduled content.",
"emptyOverdue": "Nothing overdue right now.",
"emptyApproval": "No approval blockers at the moment.",
"emptyProjects": "Every campaign has at least one scheduled content item.",
"emptyCampaigns": "Every campaign has at least one scheduled content item.",
"emptyReviewQueue": "No active review queue items.",
"previousDay": "Previous day",
"nextDay": "Next day",
@@ -295,20 +295,20 @@
"week": "Week",
"campaignDeadline": "Campaign deadline",
"emptyPeriod": "No scheduled items.",
"daySummary": "{content} content items · {projects} campaign deadlines",
"daySummary": "{content} content items · {campaigns} campaign deadlines",
"moreItems": "+{count} more",
"emptyDayAgenda": "No content is scheduled for this day.",
"projectProgress": "{scheduled} scheduled · {approved} approved",
"campaignProgress": "{scheduled} scheduled · {approved} approved",
"missingSchedule": "Needs content scheduled",
"noDueDate": "No due date",
"labels": {
"unassignedProject": "Unassigned campaign"
"unassignedCampaign": "Unassigned campaign"
},
"readiness": {
"building": "In production",
"approval": "Awaiting approval",
"rework": "Needs revision",
"ready": "Ready to publish",
"ready": "Approved",
"published": "Published",
"blocked": "Blocked",
"archived": "Archived",
@@ -339,13 +339,13 @@
"emptyRisks": "No cross-workspace delivery risks right now.",
"emptyActivity": "No recent workflow activity yet.",
"labels": {
"projects": "campaigns",
"campaigns": "campaigns",
"upcoming": "upcoming",
"blocked": "blocked"
},
"stats": {
"workspaces": "Workspaces",
"projects": "Campaigns",
"campaigns": "Campaigns",
"upcoming": "Upcoming items",
"blockers": "At-risk items"
}
@@ -372,11 +372,11 @@
"primaryContactPortraitUrl": "Primary contact portrait URL"
}
},
"projects": {
"campaigns": {
"eyebrow": "Campaign planning",
"title": "Campaigns",
"description": "Campaigns grouped inside the active workspace by status, date range, and planning notes.",
"newProject": "New campaign",
"newCampaign": "New campaign",
"createTitle": "Create campaign",
"loading": "Loading campaigns...",
"empty": "No campaigns are available for the active workspace.",
@@ -444,8 +444,8 @@
"title": "Title",
"client": "Client",
"selectClient": "Select a client",
"project": "Campaign",
"selectProject": "Select a campaign",
"campaign": "Campaign",
"selectCampaign": "Select a campaign",
"dueDate": "Due date",
"publicationTargets": "Publication targets",
"publicationTargetsPlaceholder": "Instagram Reel, TikTok",
@@ -559,35 +559,83 @@
},
"approvals": {
"flowTitle": "Approval flow",
"flowDescription": "Personalize how content moves through internal review, client review, and publishing for this workspace.",
"flowDescription": "Configure how content approval works across this workspace.",
"previewTitle": "Flow preview",
"previewDescription": "This is the sequence the workspace will use based on the current configuration.",
"saved": "Approval flow saved for this workspace in this browser.",
"saved": "Approval flow saved.",
"saveAction": "Save approval flow",
"fields": {
"requireInternalReview": "Require internal review",
"internalApproversRequired": "Internal approvers required",
"requireClientReview": "Require client review",
"clientApproversRequired": "Client approvers required",
"defaultReviewerRole": "Default reviewer role",
"publishBehaviour": "After final approval"
"approvalMode": "Approval mode",
"schedulePostsAutomaticallyOnApproval": "Schedule posts automatically on approval",
"lockContentAfterApproval": "Lock content after approval",
"sendAutomaticApprovalReminders": "Send automatic approval reminders"
},
"fieldHelp": {
"requireInternalReview": "Content must be approved internally before client review can begin.",
"requireClientReview": "Content must still pass through client approval before publication."
"schedulePostsAutomaticallyOnApproval": "Final approval moves content to Scheduled when it already has a planned publish date.",
"lockContentAfterApproval": "Approval-controlled content becomes locked after final approval. Scheduling fields remain editable.",
"sendAutomaticApprovalReminders": "Current approvers receive daily reminders while an approval step is pending."
},
"publishBehaviour": {
"manual": "Mark ready to publish",
"auto": "Auto-advance to ready"
"modes": {
"none": "None",
"optional": "Optional",
"required": "Required",
"multiLevel": "Multi-level"
},
"modeHelp": {
"none": "Content skips approval workflow and can become Approved without approval actions.",
"optional": "A one-step approval workflow is available but does not block publication workflow.",
"required": "At least one approval is required before content can become Approved or Scheduled.",
"multiLevel": "Approval uses ordered steps with targeted approvers for each step."
},
"editor": {
"title": "Multi-level steps",
"description": "Define who approves each ordered step before content reaches final approval.",
"addStep": "Add step",
"empty": "Add at least one approval step before saving multi-level approval.",
"unnamedStep": "Unnamed step",
"moveUp": "Move step up",
"moveDown": "Move step down",
"removeStep": "Remove step",
"selectMember": "Select a member",
"selectMembers": "Select one or more members. Hold Ctrl or Command to select multiple.",
"defaultStepName": "Approval step {number}",
"stepNumber": "Step {number}",
"fields": {
"name": "Display name",
"targetType": "Target type",
"targetValue": "Target",
"requiredApproverCount": "Required approvers"
},
"targetTypes": {
"role": "Role",
"membership": "Membership",
"member": "Member"
},
"memberships": {
"team": "Team",
"client": "Client"
},
"errors": {
"atLeastOneStep": "Multi-level approval requires at least one step.",
"fixInvalidSteps": "Fix the highlighted approval steps before saving.",
"nameRequired": "Enter a step name.",
"targetRequired": "Choose who can approve this step.",
"notEnoughMembers": "Select at least as many members as required approvers.",
"requiredApproverCount": "Enter at least 1 required approver."
}
},
"steps": {
"internal": "Internal review",
"client": "Client review",
"none": "Approval skipped",
"approval": "Approval",
"publish": "Publishing handoff"
},
"stepDetail": {
"none": "No approval workflow is created for content in this workspace.",
"optional": "Approval can be collected, but it is not required before publication workflow.",
"approverCount": "{count} approver(s) required",
"autoPublish": "Content moves to ready automatically after the final approval.",
"manualPublish": "Content stays in a manual ready-to-publish handoff after the final approval."
"multiLevelTarget": "{count} approver(s) from {target}",
"autoSchedule": "Approved content with a planned publish date moves to Scheduled.",
"manualSchedule": "Approved content remains Approved until scheduling is handled."
}
}
},

View File

@@ -74,7 +74,7 @@
"myFeedback": "Mon feedback",
"feedbackReview": "Revue feedback",
"channels": "Canaux",
"projects": "Campagnes",
"campaigns": "Campagnes",
"reviewQueue": "File de révision",
"content": "Contenu",
"profile": "Profil",
@@ -210,7 +210,7 @@
"title": "Contexte",
"workspace": "Espace",
"client": "Client",
"project": "Campagne",
"campaign": "Campagne",
"contentItem": "Élément de contenu"
},
"activity": {
@@ -253,11 +253,11 @@
"sidebar": {
"allClients": "Tous les clients",
"allChannels": "Tous les canaux",
"allProjects": "Toutes les campagnes",
"allCampaigns": "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.",
"noCampaigns": "Aucune campagne pour le moment.",
"noReviewItems": "Aucun élément à réviser pour le moment."
},
"settings": {
@@ -281,12 +281,12 @@
"deliveryRisks": "Ce qui peut glisser",
"overdueItems": "Éléments en retard",
"approvalBlockers": "En attente d'approbation ou de révision",
"unscheduledProjects": "Campagnes sans contenu planifié",
"unscheduledCampaigns": "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é.",
"emptyCampaigns": "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",
@@ -295,20 +295,20 @@
"week": "Semaine",
"campaignDeadline": "Échéance de campagne",
"emptyPeriod": "Aucun élément planifié.",
"daySummary": "{content} contenus · {projects} échéances de campagne",
"daySummary": "{content} contenus · {campaigns} échéances de campagne",
"moreItems": "+{count} autres",
"emptyDayAgenda": "Aucun contenu n'est planifié pour cette journée.",
"projectProgress": "{scheduled} planifiés · {approved} approuvés",
"campaignProgress": "{scheduled} planifiés · {approved} approuvés",
"missingSchedule": "Contenu à planifier",
"noDueDate": "Aucune échéance",
"labels": {
"unassignedProject": "Campagne non attribuée"
"unassignedCampaign": "Campagne non attribuée"
},
"readiness": {
"building": "En production",
"approval": "En attente d'approbation",
"rework": "Révision requise",
"ready": "Prêt à publier",
"ready": "Approuvé",
"published": "Publié",
"blocked": "Bloqué",
"archived": "Archivé",
@@ -339,13 +339,13 @@
"emptyRisks": "Aucun risque de livraison multi-espace pour le moment.",
"emptyActivity": "Aucune activité récente du workflow.",
"labels": {
"projects": "campagnes",
"campaigns": "campagnes",
"upcoming": "à venir",
"blocked": "bloqués"
},
"stats": {
"workspaces": "Espaces",
"projects": "Campagnes",
"campaigns": "Campagnes",
"upcoming": "Éléments à venir",
"blockers": "Éléments à risque"
}
@@ -372,11 +372,11 @@
"primaryContactPortraitUrl": "URL du portrait du contact principal"
}
},
"projects": {
"campaigns": {
"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",
"newCampaign": "Nouvelle campagne",
"createTitle": "Créer une campagne",
"loading": "Chargement des campagnes...",
"empty": "Aucune campagne n'est disponible pour l'espace actif.",
@@ -444,8 +444,8 @@
"title": "Titre",
"client": "Client",
"selectClient": "Sélectionner un client",
"project": "Campagne",
"selectProject": "Sélectionner une campagne",
"campaign": "Campagne",
"selectCampaign": "Sélectionner une campagne",
"dueDate": "Date d'échéance",
"publicationTargets": "Cibles de publication",
"publicationTargetsPlaceholder": "Instagram Reel, TikTok",
@@ -559,35 +559,83 @@
},
"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.",
"flowDescription": "Configurez le fonctionnement de l'approbation du contenu dans 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.",
"saved": "Flux d'approbation enregistré.",
"saveAction": "Enregistrer le flux",
"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"
"approvalMode": "Mode d'approbation",
"schedulePostsAutomaticallyOnApproval": "Planifier automatiquement après approbation",
"lockContentAfterApproval": "Verrouiller le contenu après approbation",
"sendAutomaticApprovalReminders": "Envoyer des rappels automatiques"
},
"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."
"schedulePostsAutomaticallyOnApproval": "L'approbation finale passe le contenu à Planifié quand une date de publication est déjà prévue.",
"lockContentAfterApproval": "Le contenu contrôlé par l'approbation est verrouillé après l'approbation finale. Les champs de planification restent modifiables.",
"sendAutomaticApprovalReminders": "Les approbateurs courants reçoivent des rappels quotidiens tant qu'une étape est en attente."
},
"publishBehaviour": {
"manual": "Marquer prêt à publier",
"auto": "Passer automatiquement à prêt"
"modes": {
"none": "Aucun",
"optional": "Optionnel",
"required": "Requis",
"multiLevel": "Multi-niveaux"
},
"modeHelp": {
"none": "Le contenu saute le workflow d'approbation et peut devenir Approuvé sans action d'approbation.",
"optional": "Un workflow d'approbation en une étape est disponible, mais il ne bloque pas la publication.",
"required": "Au moins une approbation est requise avant que le contenu devienne Approuvé ou Planifié.",
"multiLevel": "L'approbation utilise des étapes ordonnées avec des approbateurs ciblés pour chaque étape."
},
"editor": {
"title": "Étapes multi-niveaux",
"description": "Définissez qui approuve chaque étape ordonnée avant l'approbation finale du contenu.",
"addStep": "Ajouter une étape",
"empty": "Ajoutez au moins une étape d'approbation avant d'enregistrer le mode multi-niveaux.",
"unnamedStep": "Étape sans nom",
"moveUp": "Monter l'étape",
"moveDown": "Descendre l'étape",
"removeStep": "Supprimer l'étape",
"selectMember": "Sélectionner un membre",
"selectMembers": "Sélectionnez un ou plusieurs membres. Maintenez Ctrl ou Commande pour une sélection multiple.",
"defaultStepName": "Étape d'approbation {number}",
"stepNumber": "Étape {number}",
"fields": {
"name": "Nom affiché",
"targetType": "Type de cible",
"targetValue": "Cible",
"requiredApproverCount": "Approbateurs requis"
},
"targetTypes": {
"role": "Rôle",
"membership": "Appartenance",
"member": "Membre"
},
"memberships": {
"team": "Équipe",
"client": "Client"
},
"errors": {
"atLeastOneStep": "L'approbation multi-niveaux requiert au moins une étape.",
"fixInvalidSteps": "Corrigez les étapes d'approbation indiquées avant d'enregistrer.",
"nameRequired": "Saisissez un nom d'étape.",
"targetRequired": "Choisissez qui peut approuver cette étape.",
"notEnoughMembers": "Sélectionnez au moins autant de membres que d'approbateurs requis.",
"requiredApproverCount": "Saisissez au moins 1 approbateur requis."
}
},
"steps": {
"internal": "Révision interne",
"client": "Révision client",
"none": "Approbation ignorée",
"approval": "Approbation",
"publish": "Passage à la publication"
},
"stepDetail": {
"none": "Aucun workflow d'approbation n'est créé pour le contenu de cet espace.",
"optional": "L'approbation peut être recueillie, mais elle n'est pas requise avant la publication.",
"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."
"multiLevelTarget": "{count} approbateur(s) de {target}",
"autoSchedule": "Le contenu approuvé avec une date de publication prévue passe à Planifié.",
"manualSchedule": "Le contenu approuvé reste Approuvé jusqu'à sa planification."
}
}
},