feat(i18n): Add time blocks translations and fix deployment

- Add comprehensive timeBlocks translations (ES, FR, DE, EN)
- Add myAvailability translations (ES, FR, DE, EN)
- Add full helpTimeBlocks guide content (ES, FR, DE, EN)
- Add contracts guide translations (ES)
- Fix DATABASE_URL env var in deploy.sh for seed_platform_plugins
- Update Contracts page and HelpContracts guide

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-04 17:43:03 -05:00
parent 2d7c1dcd27
commit 29e99631c9
7 changed files with 1938 additions and 116 deletions

View File

@@ -1078,5 +1078,344 @@
}
}
}
},
"contracts": {
"title": "Contrats",
"description": "Gérez les modèles de contrats et les contrats envoyés",
"templates": "Modèles",
"sentContracts": "Contrats Envoyés",
"allContracts": "Tous les Contrats",
"createTemplate": "Créer un Modèle",
"newTemplate": "Nouveau Modèle",
"createContract": "Créer un Contrat",
"editTemplate": "Modifier le Modèle",
"viewContract": "Voir le Contrat",
"noTemplates": "Pas encore de modèles de contrats",
"noTemplatesEmpty": "Pas encore de modèles. Créez votre premier modèle pour commencer.",
"noTemplatesSearch": "Aucun modèle trouvé",
"noContracts": "Pas encore de contrats",
"noContractsEmpty": "Aucun contrat envoyé pour le moment.",
"noContractsSearch": "Aucun contrat trouvé",
"templateName": "Nom du Modèle",
"templateDescription": "Description",
"content": "Contenu",
"contentHtml": "Contenu du Contrat (HTML)",
"searchTemplates": "Rechercher des modèles...",
"searchContracts": "Rechercher des contrats...",
"all": "Tous",
"scope": {
"label": "Portée",
"customer": "Niveau Client",
"appointment": "Par Rendez-vous",
"customerDesc": "Contrats uniques par client (ex: politique de confidentialité, conditions d'utilisation)",
"appointmentDesc": "Signé à chaque réservation (ex: décharges de responsabilité, accords de service)"
},
"status": {
"label": "Statut",
"draft": "Brouillon",
"active": "Actif",
"archived": "Archivé",
"pending": "En Attente",
"signed": "Signé",
"expired": "Expiré",
"voided": "Annulé"
},
"table": {
"template": "Modèle",
"scope": "Portée",
"status": "Statut",
"version": "Version",
"actions": "Actions",
"customer": "Client",
"contract": "Contrat",
"created": "Créé",
"sent": "Envoyé"
},
"expiresAfterDays": "Expire Après (jours)",
"expiresAfterDaysHint": "Laisser vide pour sans expiration",
"versionNotes": "Notes de Version",
"versionNotesPlaceholder": "Qu'est-ce qui a changé dans cette version ?",
"services": "Services Applicables",
"servicesHint": "Laisser vide pour appliquer à tous les services",
"customer": "Client",
"appointment": "Rendez-vous",
"service": "Service",
"sentAt": "Envoyé",
"signedAt": "Signé",
"expiresAt": "Expire Le",
"createdAt": "Créé",
"availableVariables": "Variables Disponibles",
"actions": {
"send": "Envoyer le Contrat",
"resend": "Renvoyer l'E-mail",
"void": "Annuler le Contrat",
"duplicate": "Dupliquer le Modèle",
"preview": "Aperçu PDF",
"previewFailed": "Échec du chargement de l'aperçu PDF.",
"delete": "Supprimer",
"edit": "Modifier",
"viewDetails": "Voir les Détails",
"copyLink": "Copier le Lien de Signature",
"sendEmail": "Envoyer l'E-mail",
"openSigningPage": "Ouvrir la Page de Signature",
"saveChanges": "Enregistrer les Modifications"
},
"sendContract": {
"title": "Envoyer le Contrat",
"selectTemplate": "Modèle de Contrat",
"selectTemplatePlaceholder": "Sélectionnez un modèle...",
"selectCustomer": "Client",
"searchCustomers": "Rechercher des clients...",
"selectAppointment": "Sélectionner un Rendez-vous (Optionnel)",
"selectService": "Sélectionner un Service (Optionnel)",
"send": "Envoyer le Contrat",
"sendImmediately": "Envoyer la demande de signature par e-mail immédiatement",
"success": "Contrat envoyé avec succès",
"error": "Échec de l'envoi du contrat",
"loadingCustomers": "Chargement des clients...",
"loadCustomersFailed": "Échec du chargement des clients",
"noCustomers": "Aucun client disponible. Créez d'abord des clients.",
"noMatchingCustomers": "Aucun client correspondant"
},
"voidContract": {
"title": "Annuler le Contrat",
"description": "L'annulation de ce contrat le révoquera. Le client ne pourra plus signer.",
"reason": "Raison de l'annulation",
"reasonPlaceholder": "Entrez la raison...",
"confirm": "Annuler le Contrat",
"success": "Contrat annulé avec succès",
"error": "Échec de l'annulation du contrat"
},
"deleteTemplate": {
"title": "Supprimer le Modèle",
"description": "Êtes-vous sûr de vouloir supprimer ce modèle ? Cette action est irréversible.",
"confirm": "Supprimer",
"success": "Modèle supprimé avec succès",
"error": "Échec de la suppression du modèle"
},
"contractDetails": {
"title": "Détails du Contrat",
"customer": "Client",
"template": "Modèle",
"status": "Statut",
"created": "Créé",
"contentPreview": "Aperçu du Contenu",
"signingLink": "Lien de Signature"
},
"preview": {
"title": "Aperçu du Contrat",
"sampleData": "Utilisation de données d'exemple pour l'aperçu"
},
"signing": {
"title": "Signer le Contrat",
"businessName": "{{businessName}}",
"contractFor": "Contrat pour {{customerName}}",
"pleaseReview": "Veuillez examiner et signer ce contrat",
"signerName": "Votre Nom Complet",
"signerNamePlaceholder": "Entrez votre nom légal",
"signerEmail": "Votre E-mail",
"signatureLabel": "Signez Ci-dessous",
"signaturePlaceholder": "Dessinez votre signature ici",
"clearSignature": "Effacer",
"agreeToTerms": "J'ai lu et j'accepte les termes et conditions décrits dans ce document. En cochant cette case, je comprends que cela constitue une signature électronique légale.",
"consentToElectronic": "Je consens à effectuer des affaires électroniquement. Je comprends que j'ai le droit de recevoir des documents sous forme papier sur demande et peux retirer ce consentement à tout moment.",
"submitSignature": "Signer le Contrat",
"submitting": "Signature en cours...",
"success": "Contrat signé avec succès !",
"successMessage": "Vous recevrez un e-mail de confirmation avec une copie du contrat signé.",
"error": "Échec de la signature du contrat",
"expired": "Ce contrat a expiré",
"alreadySigned": "Ce contrat a déjà été signé",
"notFound": "Contrat non trouvé",
"voided": "Ce contrat a été annulé",
"signedBy": "Signé par {{name}} le {{date}}",
"thankYou": "Merci d'avoir signé !",
"loading": "Chargement du contrat...",
"geolocationHint": "La localisation sera enregistrée pour conformité légale"
},
"errors": {
"loadFailed": "Échec du chargement des contrats",
"createFailed": "Échec de la création du contrat",
"updateFailed": "Échec de la mise à jour du contrat",
"deleteFailed": "Échec de la suppression du contrat",
"sendFailed": "Échec de l'envoi du contrat",
"voidFailed": "Échec de l'annulation du contrat"
}
},
"timeBlocks": {
"title": "Blocs de Temps",
"subtitle": "Gérer les fermetures, jours fériés et indisponibilités des ressources",
"addBlock": "Ajouter un Bloc",
"businessTab": "Blocs de l'Entreprise",
"resourceTab": "Blocs de Ressources",
"calendarTab": "Vue Annuelle",
"businessInfo": "Les blocs de l'entreprise s'appliquent à toutes les ressources. Utilisez-les pour les jours fériés, fermetures et événements d'entreprise.",
"noBusinessBlocks": "Aucun Bloc d'Entreprise",
"noBusinessBlocksDesc": "Ajoutez des jours fériés et fermetures pour empêcher les réservations pendant ces périodes.",
"addFirstBlock": "Ajouter le Premier Bloc",
"titleCol": "Titre",
"typeCol": "Type",
"patternCol": "Modèle",
"actionsCol": "Actions",
"resourceInfo": "Les blocs de ressources s'appliquent à du personnel ou équipement spécifique. Utilisez-les pour les vacances, maintenance ou temps personnel.",
"noResourceBlocks": "Aucun Bloc de Ressource",
"noResourceBlocksDesc": "Ajoutez des blocs de temps pour des ressources spécifiques afin de gérer leur disponibilité.",
"deleteConfirmTitle": "Supprimer le Bloc de Temps ?",
"deleteConfirmDesc": "Cette action est irréversible.",
"blockTypes": {
"hard": "Bloc Strict",
"soft": "Bloc Souple"
},
"recurrenceTypes": {
"none": "Ponctuel",
"weekly": "Hebdomadaire",
"monthly": "Mensuel",
"yearly": "Annuel",
"holiday": "Jour Férié"
},
"inactive": "Inactif",
"activate": "Activer",
"deactivate": "Désactiver"
},
"myAvailability": {
"title": "Ma Disponibilité",
"subtitle": "Gérer vos congés et indisponibilités",
"noResource": "Aucune Ressource Liée",
"noResourceDesc": "Votre compte n'est pas lié à une ressource. Veuillez contacter votre responsable pour configurer votre disponibilité.",
"addBlock": "Bloquer du Temps",
"businessBlocks": "Fermetures de l'Entreprise",
"businessBlocksInfo": "Ces blocs sont définis par votre entreprise et s'appliquent à tous.",
"myBlocks": "Mes Blocs de Temps",
"noBlocks": "Aucun Bloc de Temps",
"noBlocksDesc": "Ajoutez des blocs de temps pour les vacances, pauses déjeuner ou tout temps dont vous avez besoin.",
"addFirstBlock": "Ajouter le Premier Bloc",
"titleCol": "Titre",
"typeCol": "Type",
"patternCol": "Modèle",
"actionsCol": "Actions",
"editBlock": "Modifier le Bloc de Temps",
"createBlock": "Bloquer du Temps",
"create": "Bloquer",
"deleteConfirmTitle": "Supprimer le Bloc de Temps ?",
"deleteConfirmDesc": "Cette action est irréversible.",
"form": {
"title": "Titre",
"description": "Description",
"blockType": "Type de Bloc",
"recurrenceType": "Récurrence",
"allDay": "Journée entière",
"startDate": "Date de Début",
"endDate": "Date de Fin",
"startTime": "Heure de Début",
"endTime": "Heure de Fin",
"daysOfWeek": "Jours de la Semaine",
"daysOfMonth": "Jours du Mois"
}
},
"helpTimeBlocks": {
"title": "Guide des Blocs de Temps",
"subtitle": "Apprenez à bloquer du temps pour les fermetures, jours fériés et indisponibilités",
"overview": {
"title": "Qu'est-ce que les Blocs de Temps ?",
"description": "Les blocs de temps vous permettent de marquer des dates, heures ou périodes récurrentes spécifiques comme indisponibles pour les réservations. Utilisez-les pour gérer les jours fériés, fermetures d'entreprise, vacances du personnel, fenêtres de maintenance et plus.",
"businessBlocks": "Blocs de l'Entreprise",
"businessBlocksDesc": "S'appliquent à toutes les ressources. Parfaits pour les jours fériés, fermetures de bureau et maintenance.",
"resourceBlocks": "Blocs de Ressources",
"resourceBlocksDesc": "S'appliquent à des ressources spécifiques. Utilisez-les pour les vacances individuelles, rendez-vous ou formations.",
"hardBlocks": "Blocs Stricts",
"hardBlocksDesc": "Empêchent complètement les réservations pendant la période bloquée. Ne peuvent pas être remplacés.",
"softBlocks": "Blocs Souples",
"softBlocksDesc": "Affichent un avertissement mais permettent les réservations avec confirmation."
},
"levels": {
"title": "Niveaux de Bloc",
"levelCol": "Niveau",
"scopeCol": "Portée",
"examplesCol": "Exemples d'Utilisation",
"business": "Entreprise",
"businessScope": "Toutes les ressources de votre entreprise",
"businessExamples": "Jours fériés, fermetures de bureau, événements d'entreprise, maintenance",
"resource": "Ressource",
"resourceScope": "Une ressource spécifique (employé, salle, etc.)",
"resourceExamples": "Vacances, rendez-vous personnels, pauses déjeuner, formation",
"additiveNote": "Les Blocs sont Additifs",
"additiveDesc": "Les blocs de niveau entreprise et ressource s'appliquent tous les deux. Si l'entreprise est fermée un jour férié, les blocs individuels de ressources n'importent pas pour ce jour."
},
"types": {
"title": "Types de Bloc : Strict vs Souple",
"hardBlock": "Bloc Strict",
"hardBlockDesc": "Empêche complètement toute réservation pendant la période bloquée. Les clients ne peuvent pas réserver et le personnel ne peut pas remplacer. Le calendrier affiche une superposition rayée rouge.",
"cannotOverride": "Ne peut pas être remplacé",
"showsInBooking": "Affiché dans les réservations clients",
"redOverlay": "Superposition rayée rouge",
"softBlock": "Bloc Souple",
"softBlockDesc": "Affiche un avertissement mais permet les réservations avec confirmation. Utile pour indiquer les temps de repos préférés qui peuvent être remplacés si nécessaire.",
"canOverride": "Peut être remplacé",
"showsWarning": "Affiche uniquement un avertissement",
"yellowOverlay": "Superposition pointillée jaune"
},
"recurrence": {
"title": "Modèles de Récurrence",
"patternCol": "Modèle",
"descriptionCol": "Description",
"exampleCol": "Exemple",
"oneTime": "Ponctuel",
"oneTimeDesc": "Une date ou plage de dates spécifique qui se produit une fois",
"oneTimeExample": "24-26 Déc (vacances de Noël), 15 Fév (Jour des Présidents)",
"weekly": "Hebdomadaire",
"weeklyDesc": "Se répète certains jours de la semaine",
"weeklyExample": "Chaque samedi et dimanche, Chaque lundi déjeuner",
"monthly": "Mensuel",
"monthlyDesc": "Se répète certains jours du mois",
"monthlyExample": "1er de chaque mois (inventaire), 15 (paie)",
"yearly": "Annuel",
"yearlyDesc": "Se répète à un mois et jour spécifique chaque année",
"yearlyExample": "4 juillet, 25 décembre, 1er janvier",
"holiday": "Jour Férié",
"holidayDesc": "Sélectionnez parmi les jours fériés américains populaires. Sélection multiple supportée - chaque jour férié crée son propre bloc.",
"holidayExample": "Noël, Thanksgiving, Memorial Day, Jour de l'Indépendance"
},
"visualization": {
"title": "Afficher les Blocs de Temps",
"description": "Les blocs de temps apparaissent dans plusieurs vues de l'application avec des indicateurs colorés :",
"colorLegend": "Légende des Couleurs",
"businessHard": "Bloc Strict de l'Entreprise",
"businessSoft": "Bloc Souple de l'Entreprise",
"resourceHard": "Bloc Strict de Ressource",
"resourceSoft": "Bloc Souple de Ressource",
"schedulerOverlay": "Superposition du Calendrier",
"schedulerOverlayDesc": "Les temps bloqués apparaissent directement sur le calendrier avec des indicateurs visuels. Les blocs d'entreprise utilisent des couleurs rouge/jaune, les blocs de ressources utilisent violet/cyan. Cliquez sur une zone bloquée en vue semaine pour naviguer vers ce jour.",
"monthView": "Vue Mensuelle",
"monthViewDesc": "Les dates bloquées s'affichent avec des fonds colorés et des indicateurs de badge. Plusieurs types de blocs le même jour affichent tous les badges applicables.",
"listView": "Vue Liste",
"listViewDesc": "Gérez tous les blocs de temps dans un format tabulaire avec des options de filtrage. Modifiez, activez/désactivez ou supprimez des blocs ici."
},
"staffAvailability": {
"title": "Disponibilité du Personnel (Ma Disponibilité)",
"description": "Les membres du personnel peuvent gérer leurs propres blocs de temps via la page \"Ma Disponibilité\". Cela leur permet de bloquer du temps pour des rendez-vous personnels, vacances ou autres engagements.",
"viewBusiness": "Voir les blocs de niveau entreprise (lecture seule)",
"createPersonal": "Créer et gérer des blocs de temps personnels",
"seeCalendar": "Voir le calendrier annuel de leur disponibilité",
"hardBlockPermission": "Permission de Bloc Strict",
"hardBlockPermissionDesc": "Par défaut, le personnel ne peut créer que des blocs souples. Pour permettre à un membre du personnel de créer des blocs stricts, activez la permission \"Peut créer des blocs stricts\" dans les paramètres de son profil."
},
"bestPractices": {
"title": "Bonnes Pratiques",
"tip1Title": "Planifiez les jours fériés à l'avance",
"tip1Desc": "Configurez les jours fériés annuels au début de chaque année en utilisant le type de récurrence Jour Férié.",
"tip2Title": "Utilisez des blocs souples pour les préférences",
"tip2Desc": "Réservez les blocs stricts pour les fermetures absolues. Utilisez des blocs souples pour les temps de repos préférés qui pourraient être remplacés.",
"tip3Title": "Vérifiez les conflits avant de créer",
"tip3Desc": "Le système affiche les rendez-vous existants qui entrent en conflit avec les nouveaux blocs. Vérifiez avant de confirmer.",
"tip4Title": "Définissez des dates de fin de récurrence",
"tip4Desc": "Pour les blocs récurrents qui ne sont pas permanents, définissez une date de fin pour éviter qu'ils ne s'étendent indéfiniment.",
"tip5Title": "Utilisez des titres descriptifs",
"tip5Desc": "Incluez des titres clairs comme \"Jour de Noël\", \"Réunion d'Équipe\" ou \"Maintenance Annuelle\" pour une identification facile."
},
"quickAccess": {
"title": "Accès Rapide",
"manageTimeBlocks": "Gérer les Blocs de Temps",
"myAvailability": "Ma Disponibilité"
}
}
}