Suite à la revue de conformité du module absences.
Fuite corrigée : GET /api/users et /api/users/{id} n'avaient aucun contrôle
d'accès alors que le groupe user:list exposait les données RH/familiales
(date d'embauche, contrat, soldes de CP, rôles…). Tout utilisateur authentifié
pouvait donc lire ces informations sur tous ses collègues.
- chaque champ RH (isEmployee, hireDate, endDate, contractType, workTimeRatio,
annualLeaveDays, referencePeriodStart, initialLeaveBalance) ainsi que roles
est désormais exposé via #[ApiProperty(security: "is_granted('ROLE_ADMIN') or
object == user")] : visible uniquement par un admin ou par l'utilisateur
lui-même. id et username restent publics (sélecteurs d'assigné, avatars).
Minimisation : suppression de familySituation et nbChildren, collectés et
exposés (form RH, API, outil MCP) mais utilisés par aucun calcul.
- entité User + enum FamilySituation + migration de drop des colonnes
- Serializer MCP, update-user (MCP), EmployeeDrawer, DTO, fixtures, i18n
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
743 lines
29 KiB
JSON
743 lines
29 KiB
JSON
{
|
|
"errors": {
|
|
"http": {
|
|
"get": "Impossible de récupérer les données.",
|
|
"post": "Impossible de créer la ressource.",
|
|
"put": "Impossible de mettre à jour la ressource.",
|
|
"patch": "Impossible de mettre à jour la ressource.",
|
|
"delete": "Impossible de supprimer la ressource."
|
|
},
|
|
"auth": {
|
|
"login": "Identifiants invalides.",
|
|
"logout": "Impossible de se déconnecter.",
|
|
"session": "Session expirée"
|
|
}
|
|
},
|
|
"success": {
|
|
"auth": {
|
|
"login": "Connexion réussie.",
|
|
"logout": "Déconnexion réussie."
|
|
}
|
|
},
|
|
"clients": {
|
|
"created": "Client créé avec succès.",
|
|
"updated": "Client mis à jour avec succès.",
|
|
"deleted": "Client supprimé avec succès.",
|
|
"addClient": "Ajouter un client",
|
|
"editClient": "Modifier un client"
|
|
},
|
|
"projects": {
|
|
"title": "Projets",
|
|
"created": "Projet créé avec succès.",
|
|
"updated": "Projet mis à jour avec succès.",
|
|
"deleted": "Projet supprimé avec succès.",
|
|
"archived": "Projet archivé avec succès.",
|
|
"unarchived": "Projet désarchivé avec succès.",
|
|
"showArchived": "Voir les projets archivés",
|
|
"hideArchived": "Masquer les projets archivés",
|
|
"noProjects": "Aucun projet trouvé.",
|
|
"noArchivedProjects": "Aucun projet archivé.",
|
|
"addProject": "Ajouter un projet",
|
|
"addProjectShort": "Projet",
|
|
"editProject": "Modifier un projet",
|
|
"deleteConfirmTitle": "Supprimer le projet",
|
|
"deleteConfirmMessage": "Êtes-vous sûr de vouloir supprimer ce projet ? Cette action est irréversible.",
|
|
"cannotDelete": "Impossible de supprimer un projet contenant des tickets."
|
|
},
|
|
"taskStatuses": {
|
|
"created": "Statut créé avec succès.",
|
|
"updated": "Statut mis à jour avec succès.",
|
|
"deleted": "Statut supprimé avec succès.",
|
|
"addStatus": "Ajouter un statut",
|
|
"editStatus": "Modifier un statut",
|
|
"deleteStatus": "Supprimer le statut « {label} »",
|
|
"linkedTasks": "{count} tâche est liée à ce statut. Choisissez où les déplacer :",
|
|
"linkedTasksPlural": "{count} tâches sont liées à ce statut. Choisissez où les déplacer :",
|
|
"moveTo": "Déplacer vers",
|
|
"backlog": "Backlog (sans statut)"
|
|
},
|
|
"workflows": {
|
|
"title": "Workflows",
|
|
"addWorkflow": "Ajouter un workflow",
|
|
"editWorkflow": "Modifier le workflow",
|
|
"name": "Nom",
|
|
"isDefault": "Workflow par défaut",
|
|
"statuses": "Statuts",
|
|
"addStatus": "Ajouter un statut",
|
|
"category": "Catégorie",
|
|
"created": "Workflow créé",
|
|
"updated": "Workflow mis à jour",
|
|
"deleted": "Workflow supprimé",
|
|
"switched": "Workflow du projet changé",
|
|
"switchTitle": "Changer de workflow",
|
|
"switchTargetLabel": "Nouveau workflow",
|
|
"switchMappingTitle": "Mapping des statuts",
|
|
"switchSourceCol": "Statut actuel",
|
|
"switchTargetCol": "Statut cible",
|
|
"switchTaskCountCol": "Tâches",
|
|
"switchToBacklog": "Mapper vers le backlog",
|
|
"switchConfirm": "Confirmer la migration",
|
|
"switchSummary": "{count} tâche(s) migrée(s), projet sur workflow « {name} »",
|
|
"deleteUsedBy": "Workflow utilisé par {count} projet(s) — impossible de supprimer.",
|
|
"categories": {
|
|
"todo": "À faire",
|
|
"in_progress": "En cours",
|
|
"blocked": "Bloqué",
|
|
"review": "En validation",
|
|
"done": "Terminé"
|
|
}
|
|
},
|
|
"taskEfforts": {
|
|
"created": "Effort créé avec succès.",
|
|
"updated": "Effort mis à jour avec succès.",
|
|
"deleted": "Effort supprimé avec succès.",
|
|
"addEffort": "Ajouter un effort",
|
|
"editEffort": "Modifier un effort"
|
|
},
|
|
"taskPriorities": {
|
|
"created": "Priorité créée avec succès.",
|
|
"updated": "Priorité mise à jour avec succès.",
|
|
"deleted": "Priorité supprimée avec succès.",
|
|
"addPriority": "Ajouter une priorité",
|
|
"editPriority": "Modifier une priorité"
|
|
},
|
|
"taskTags": {
|
|
"created": "Tag créé avec succès.",
|
|
"updated": "Tag mis à jour avec succès.",
|
|
"deleted": "Tag supprimé avec succès.",
|
|
"addTag": "Ajouter un tag",
|
|
"editTag": "Modifier un tag"
|
|
},
|
|
"taskGroups": {
|
|
"created": "Groupe créé avec succès.",
|
|
"updated": "Groupe mis à jour avec succès.",
|
|
"deleted": "Groupe supprimé avec succès.",
|
|
"archived": "Groupe archivé avec succès.",
|
|
"unarchived": "Groupe désarchivé avec succès.",
|
|
"addGroup": "Ajouter un groupe",
|
|
"editGroup": "Modifier un groupe"
|
|
},
|
|
"taskDocuments": {
|
|
"title": "Documents",
|
|
"dropzone": "Glisser des fichiers ici ou cliquer pour sélectionner",
|
|
"uploaded": "Document ajouté avec succès.",
|
|
"deleted": "Document supprimé avec succès.",
|
|
"uploadError": "Erreur lors de l'upload du document.",
|
|
"confirmDeleteTitle": "Supprimer le document",
|
|
"confirmDeleteMessage": "Êtes-vous sûr de vouloir supprimer ce document ?",
|
|
"download": "Télécharger",
|
|
"maxSizeError": "Le fichier dépasse la taille maximale de 50 Mo."
|
|
},
|
|
"tasks": {
|
|
"created": "Ticket créé avec succès.",
|
|
"updated": "Ticket mis à jour avec succès.",
|
|
"deleted": "Ticket supprimé avec succès.",
|
|
"archived": "Ticket archivé avec succès.",
|
|
"unarchived": "Ticket désarchivé avec succès.",
|
|
"deleteConfirmTitle": "Supprimer le ticket",
|
|
"deleteConfirmMessage": "Êtes-vous sûr de vouloir supprimer ce ticket ? Cette action est irréversible.",
|
|
"addTask": "Ajouter un ticket",
|
|
"editTask": "Modifier un ticket",
|
|
"detailsTab": "Détails",
|
|
"planningTab": "Planification",
|
|
"planning": {
|
|
"dates": "Dates",
|
|
"scheduledStart": "Début planifié",
|
|
"scheduledEnd": "Fin planifiée",
|
|
"deadline": "Deadline",
|
|
"calendar": "Calendrier",
|
|
"syncToCalendar": "Envoyer au calendrier Zimbra",
|
|
"syncOk": "Synchronisé",
|
|
"recurrence": "Récurrence",
|
|
"isRecurring": "Tâche récurrente",
|
|
"type": "Type",
|
|
"daily": "Quotidien",
|
|
"weekly": "Hebdomadaire",
|
|
"monthly": "Mensuel",
|
|
"yearly": "Annuel",
|
|
"interval": "Intervalle",
|
|
"daysOfWeek": "Jours de la semaine",
|
|
"days": {
|
|
"mon": "Lu",
|
|
"tue": "Ma",
|
|
"wed": "Me",
|
|
"thu": "Je",
|
|
"fri": "Ve",
|
|
"sat": "Sa",
|
|
"sun": "Di"
|
|
},
|
|
"dayOfMonth": "Jour du mois",
|
|
"dayOfMonthLabel": "Jour (1-31)",
|
|
"weekOfMonth": "Semaine du mois",
|
|
"weekOfMonthLabel": "Semaine",
|
|
"dayLabel": "Jour",
|
|
"endRecurrence": "Fin de la récurrence",
|
|
"neverEnds": "Jamais",
|
|
"afterOccurrences": "Après X occurrences",
|
|
"occurrences": "Occurrences",
|
|
"onDate": "À une date",
|
|
"endDate": "Date de fin"
|
|
}
|
|
},
|
|
"users": {
|
|
"created": "Utilisateur créé avec succès.",
|
|
"updated": "Utilisateur mis à jour avec succès.",
|
|
"deleted": "Utilisateur supprimé avec succès.",
|
|
"addUser": "Ajouter un utilisateur",
|
|
"editUser": "Modifier un utilisateur"
|
|
},
|
|
"timeEntries": {
|
|
"created": "Temps enregistré",
|
|
"updated": "Temps modifié",
|
|
"deleted": "Temps supprimé",
|
|
"noEntries": "Aucune activité pour cette période",
|
|
"addEntry": "Ajouter une Activité",
|
|
"editEntry": "Modifier un temps",
|
|
"export": "Exporter",
|
|
"exportTitle": "Exporter les temps",
|
|
"exportCurrentMonth": "Mois en cours",
|
|
"exportLastMonth": "Mois dernier",
|
|
"exportCustomPeriod": "Période personnalisée",
|
|
"exportFrom": "Du",
|
|
"exportTo": "Au",
|
|
"exportUsers": "Utilisateurs",
|
|
"exportClient": "Client",
|
|
"exportProjects": "Projets",
|
|
"exportTags": "Tags",
|
|
"exportAllClients": "Tous les clients",
|
|
"exportLoading": "Export en cours...",
|
|
"exportSuccess": "Export terminé !",
|
|
"exportError": "Erreur lors de l'export."
|
|
},
|
|
"archive": {
|
|
"title": "Archives",
|
|
"empty": "Aucun ticket archivé.",
|
|
"archiveButton": "Archiver",
|
|
"unarchiveButton": "Désarchiver",
|
|
"showArchived": "Voir les groupes archivés",
|
|
"hideArchived": "Masquer les groupes archivés",
|
|
"statusFinal": "Statut final",
|
|
"groupArchiveDisabled": "Tous les tickets doivent être en statut final pour archiver le groupe.",
|
|
"groupNonFinalTasks": "Il reste {count} ticket(s) sans statut final dans ce groupe."
|
|
},
|
|
"myTasks": {
|
|
"title": "Mes tâches",
|
|
"viewKanban": "Vue Kanban",
|
|
"viewList": "Vue Liste",
|
|
"allProjects": "Tous les projets",
|
|
"allGroups": "Tous les groupes",
|
|
"allTypes": "Tous les types",
|
|
"allPriorities": "Toutes les priorités",
|
|
"allEfforts": "Tous les efforts",
|
|
"allAssignees": "Tous",
|
|
"noTasks": "Aucune tâche",
|
|
"backlog": "Backlog",
|
|
"createTask": "Créer une tâche",
|
|
"sortBy": "Trier par",
|
|
"sortDefault": "Par défaut",
|
|
"sortDeadline": "Échéance",
|
|
"sortScheduledStart": "Date planifiée",
|
|
"dropRefused": "Aucun statut de cette colonne dans le workflow de ce projet"
|
|
},
|
|
"dashboard": {
|
|
"title": "Tableau de bord",
|
|
"noData": "Aucune donnée",
|
|
"noPriority": "Sans priorité",
|
|
"noProject": "Sans projet",
|
|
"hoursWorked": "Heures travaillées",
|
|
"inProgress": "En cours",
|
|
"done": "Terminé",
|
|
"filters": {
|
|
"period": "Période",
|
|
"project": "Projet",
|
|
"user": "Utilisateur",
|
|
"allProjects": "Tous les projets",
|
|
"allUsers": "Tous les utilisateurs"
|
|
},
|
|
"periods": {
|
|
"thisWeek": "Cette semaine",
|
|
"lastWeek": "Semaine dernière",
|
|
"thisMonth": "Ce mois",
|
|
"lastMonth": "Mois dernier"
|
|
},
|
|
"stats": {
|
|
"hoursPeriod": "Heures sur la période",
|
|
"myActiveTasks": "Mes tâches actives",
|
|
"completed": "terminée(s)",
|
|
"totalTasks": "Tâches totales",
|
|
"unassigned": "non assignée(s)",
|
|
"projects": "Projets",
|
|
"users": "utilisateur(s)"
|
|
},
|
|
"charts": {
|
|
"hoursByDay": "Heures par jour",
|
|
"hoursByProject": "Temps par projet",
|
|
"tasksByStatus": "Tâches par statut",
|
|
"tasksByPriority": "Tâches par priorité",
|
|
"tasksByProject": "Tâches par projet"
|
|
},
|
|
"days": {
|
|
"mon": "Lun",
|
|
"tue": "Mar",
|
|
"wed": "Mer",
|
|
"thu": "Jeu",
|
|
"fri": "Ven",
|
|
"sat": "Sam",
|
|
"sun": "Dim"
|
|
}
|
|
},
|
|
"sidebar": {
|
|
"myTasks": "Mes tâches"
|
|
},
|
|
"common": {
|
|
"cancel": "Annuler",
|
|
"save": "Enregistrer",
|
|
"edit": "Modifier",
|
|
"delete": "Supprimer",
|
|
"add": "Ajouter",
|
|
"loading": "Chargement...",
|
|
"archived": "Archivé",
|
|
"noClient": "Aucun client",
|
|
"untitled": "Sans titre",
|
|
"dateFilter": "Date",
|
|
"today": "Aujourd'hui",
|
|
"thisWeek": "Cette semaine",
|
|
"clear": "Effacer",
|
|
"day": "Jour",
|
|
"weekShort": "Sem."
|
|
},
|
|
"gitea": {
|
|
"settings": {
|
|
"title": "Configuration Gitea",
|
|
"url": "URL du serveur",
|
|
"urlPlaceholder": "https://git.example.com",
|
|
"token": "Token API",
|
|
"tokenPlaceholder": "Entrez un nouveau token",
|
|
"tokenConfigured": "Token configuré",
|
|
"save": "Enregistrer",
|
|
"saved": "Configuration Gitea sauvegardée.",
|
|
"testConnection": "Tester la connexion",
|
|
"testSuccess": "Connexion réussie.",
|
|
"testFailed": "Connexion échouée."
|
|
},
|
|
"branch": {
|
|
"title": "Git",
|
|
"create": "Créer une branche",
|
|
"created": "Branche créée avec succès.",
|
|
"copy": "Copier le nom",
|
|
"copied": "Nom de branche copié.",
|
|
"type": "Type",
|
|
"baseBranch": "Branche de base",
|
|
"preview": "Aperçu",
|
|
"types": {
|
|
"feature": "feature",
|
|
"fix": "fix",
|
|
"refactor": "refactor",
|
|
"hotfix": "hotfix",
|
|
"chore": "chore"
|
|
},
|
|
"noBranches": "Aucune branche liée.",
|
|
"commits": "Commits",
|
|
"noCommits": "Aucun commit."
|
|
},
|
|
"pr": {
|
|
"title": "Pull Requests",
|
|
"noPrs": "Aucune pull request.",
|
|
"open": "Ouverte",
|
|
"merged": "Mergée",
|
|
"closed": "Fermée",
|
|
"ci": "CI/CD"
|
|
},
|
|
"error": "Erreur de connexion à Gitea.",
|
|
"notConfigured": "Gitea non configuré pour ce projet."
|
|
},
|
|
"notification": {
|
|
"title": "Notifications",
|
|
"markAllRead": "Tout marquer comme lu",
|
|
"empty": "Aucune notification",
|
|
"ticketCreated": "Nouveau ticket client {number}",
|
|
"ticketStatusChanged": "Ticket {number} mis à jour",
|
|
"timeAgo": {
|
|
"now": "À l'instant",
|
|
"minutes": "Il y a {n} min",
|
|
"hours": "Il y a {n}h",
|
|
"days": "Il y a {n}j"
|
|
}
|
|
},
|
|
"profile": {
|
|
"title": "Mon profil",
|
|
"changeAvatar": "Changer l'avatar",
|
|
"removeAvatar": "Supprimer l'avatar",
|
|
"cropAvatar": "Recadrer l'avatar",
|
|
"apiToken": {
|
|
"title": "Token API MCP",
|
|
"help": "Utilisé pour authentifier le serveur MCP HTTP (à coller dans le header Authorization: Bearer …). Ne pas partager.",
|
|
"label": "Token",
|
|
"empty": "Aucun token généré pour le moment.",
|
|
"generate": "Générer un token",
|
|
"regenerate": "Régénérer",
|
|
"copy": "Copier",
|
|
"copied": "Token copié dans le presse-papiers.",
|
|
"copyFailed": "Impossible de copier le token.",
|
|
"regenerated": "Nouveau token généré. L'ancien token est désormais invalide.",
|
|
"confirmTitle": "Régénérer le token MCP ?",
|
|
"confirmMessage": "L'ancien token sera immédiatement invalidé. Tous les clients MCP utilisant ce token devront être reconfigurés."
|
|
}
|
|
},
|
|
"bookstack": {
|
|
"settings": {
|
|
"title": "Configuration BookStack",
|
|
"url": "URL du serveur",
|
|
"urlPlaceholder": "https://wiki.example.com",
|
|
"tokenId": "Token ID",
|
|
"tokenIdPlaceholder": "Entrez le Token ID",
|
|
"tokenSecret": "Token Secret",
|
|
"tokenSecretPlaceholder": "Entrez le Token Secret",
|
|
"tokenConfigured": "Token configuré",
|
|
"save": "Enregistrer",
|
|
"saved": "Configuration BookStack sauvegardée.",
|
|
"testConnection": "Tester la connexion",
|
|
"testSuccess": "Connexion réussie.",
|
|
"testFailed": "Connexion échouée."
|
|
},
|
|
"links": {
|
|
"title": "Documentation",
|
|
"searchPlaceholder": "Rechercher une page ou un livre...",
|
|
"noResults": "Aucun résultat",
|
|
"empty": "Aucun document lié"
|
|
}
|
|
},
|
|
"zimbra": {
|
|
"settings": {
|
|
"title": "Calendrier Zimbra",
|
|
"serverUrl": "URL du serveur CalDAV",
|
|
"serverUrlPlaceholder": "https://mail.ovh.com",
|
|
"username": "Nom d'utilisateur",
|
|
"usernamePlaceholder": "user{'@'}domain.com",
|
|
"calendarPath": "Chemin du calendrier",
|
|
"calendarPathPlaceholder": "/dav/user{'@'}domain.com/Calendar/",
|
|
"password": "Mot de passe",
|
|
"passwordConfigured": "Mot de passe configuré",
|
|
"enabled": "Activer la synchronisation CalDAV",
|
|
"save": "Enregistrer",
|
|
"saved": "Configuration Zimbra enregistrée",
|
|
"testConnection": "Tester la connexion",
|
|
"testSuccess": "Connexion réussie",
|
|
"testFailed": "Connexion échouée"
|
|
}
|
|
},
|
|
"taskRecurrence": {
|
|
"created": "Récurrence créée",
|
|
"updated": "Récurrence mise à jour",
|
|
"deleted": "Récurrence supprimée"
|
|
},
|
|
"recurrence": {
|
|
"daily": "Quotidien",
|
|
"weekly": "Hebdomadaire",
|
|
"monthly": "Mensuel",
|
|
"yearly": "Annuel"
|
|
},
|
|
"mail": {
|
|
"title": "Messagerie",
|
|
"sidebar": {
|
|
"title": "Messagerie",
|
|
"ariaLabel": "Accès à la messagerie, {count} messages non lus"
|
|
},
|
|
"admin": {
|
|
"title": "Configuration messagerie",
|
|
"protocol": "Protocole",
|
|
"imapSection": "Réception (IMAP)",
|
|
"smtpSection": "Envoi (SMTP)",
|
|
"host": "Serveur",
|
|
"port": "Port",
|
|
"encryption": "Chiffrement",
|
|
"username": "Adresse e-mail",
|
|
"password": "Mot de passe",
|
|
"passwordSet": "Mot de passe déjà configuré — laisser vide pour conserver",
|
|
"sentFolderPath": "Dossier des envois",
|
|
"enabled": "Activer la synchronisation mail",
|
|
"test": "Tester la connexion",
|
|
"testSuccess": "Connexion IMAP réussie",
|
|
"testFailed": "Échec de connexion",
|
|
"save": "Enregistrer",
|
|
"saveSuccess": "Configuration enregistrée",
|
|
"ovhDefaultsHelp": "OVH : ssl0.ovh.net (port 993 IMAP / 465 SMTP)"
|
|
},
|
|
"folders": "Dossiers",
|
|
"messages": "Messages",
|
|
"viewer": "Lecture",
|
|
"empty": {
|
|
"folder": "Aucun dossier disponible.",
|
|
"list": "Aucun message dans ce dossier.",
|
|
"viewer": "Sélectionnez un message pour le lire."
|
|
},
|
|
"preview": {
|
|
"open": "Prévisualiser",
|
|
"close": "Fermer l'aperçu",
|
|
"loading": "Chargement de l'aperçu…",
|
|
"unavailable": "Aperçu indisponible pour ce type de fichier."
|
|
},
|
|
"folderTree": {
|
|
"expand": "Déplier le dossier",
|
|
"collapse": "Replier le dossier"
|
|
},
|
|
"systemFolder": {
|
|
"inbox": "Boîte de réception",
|
|
"sent": "Éléments envoyés",
|
|
"drafts": "Brouillons",
|
|
"archive": "Archives",
|
|
"trash": "Corbeille",
|
|
"junk": "Indésirables"
|
|
},
|
|
"actions": {
|
|
"refresh": "Actualiser",
|
|
"createTask": "Créer une tâche",
|
|
"linkTask": "Lier à une tâche",
|
|
"markRead": "Marquer comme lu",
|
|
"markUnread": "Marquer comme non lu",
|
|
"flag": "Marquer important",
|
|
"unflag": "Retirer l'importance",
|
|
"download": "Télécharger",
|
|
"showImages": "Afficher les images"
|
|
},
|
|
"errors": {
|
|
"syncFailed": "Erreur lors de la synchronisation.",
|
|
"fetchFailed": "Impossible de charger les messages.",
|
|
"notAuthorized": "Vous n'avez pas accès à la messagerie."
|
|
},
|
|
"configuration": {
|
|
"saved": "Configuration mail enregistrée."
|
|
},
|
|
"task": {
|
|
"created": "Tâche créée depuis le mail.",
|
|
"linked": "Mail lié à la tâche.",
|
|
"unlinked": "Lien supprimé."
|
|
},
|
|
"createTaskModal": {
|
|
"title": "Créer une tâche depuis ce mail",
|
|
"submit": "Créer la tâche",
|
|
"projectLabel": "Projet *",
|
|
"projectPlaceholder": "Sélectionner un projet",
|
|
"groupLabel": "Groupe (optionnel)",
|
|
"groupPlaceholder": "Aucun groupe",
|
|
"statusLabel": "Statut",
|
|
"assigneeLabel": "Assigné à",
|
|
"assigneePlaceholder": "Aucun",
|
|
"titleHint": "Le titre sera rempli depuis le sujet du mail.",
|
|
"descriptionHint": "La description sera remplie depuis le corps du mail."
|
|
},
|
|
"linkTaskModal": {
|
|
"title": "Lier à une tâche existante",
|
|
"submit": "Lier la tâche",
|
|
"searchPlaceholder": "Rechercher une tâche par titre…",
|
|
"projectFilter": "Filtrer par projet",
|
|
"projectAll": "Tous les projets",
|
|
"empty": "Aucune tâche correspondante.",
|
|
"loading": "Recherche en cours…"
|
|
},
|
|
"taskTab": {
|
|
"title": "Mails",
|
|
"empty": "Aucun mail lié à cette tâche.",
|
|
"openInMailer": "Ouvrir dans la messagerie",
|
|
"unlinkConfirm": "Délier ce mail ?"
|
|
},
|
|
"sync": {
|
|
"dispatched": "Synchronisation lancée en arrière-plan."
|
|
},
|
|
"attachments": "Pièces jointes",
|
|
"noAttachments": "Aucune pièce jointe.",
|
|
"from": "De",
|
|
"to": "À",
|
|
"cc": "Cc",
|
|
"date": "Date",
|
|
"subject": "Sujet",
|
|
"noSubject": "(Sans objet)",
|
|
"loadMore": "Charger plus",
|
|
"loading": "Chargement…",
|
|
"hasAttachments": "Pièces jointes",
|
|
"unread": "non lu | non lus",
|
|
"remoteImagesBlocked": "Les images distantes sont masquées pour votre sécurité."
|
|
},
|
|
"absences": {
|
|
"title": "Mes absences",
|
|
"teamTitle": "Absences de l'équipe",
|
|
"newRequest": "Nouvelle demande",
|
|
"daySingular": "jour",
|
|
"daysPlural": "jours",
|
|
"noBalance": "Aucun solde à afficher.",
|
|
"noRequests": "Aucune demande.",
|
|
"remaining": "restants",
|
|
"acquired": "acquis",
|
|
"acquiredN1": "Acquis (N-1)",
|
|
"acquiringN": "En cours d'acquisition (N)",
|
|
"acquiringHint": "posables par anticipation",
|
|
"taken": "pris",
|
|
"pending": "en attente",
|
|
"available": "disponible",
|
|
"types": {
|
|
"cp": "Congés payés",
|
|
"mariage_pacs": "Mariage / PACS",
|
|
"conge_parental": "Congé parental",
|
|
"deces": "Décès proche",
|
|
"maladie": "Arrêt maladie"
|
|
},
|
|
"status": {
|
|
"pending": "En attente",
|
|
"approved": "Approuvée",
|
|
"rejected": "Refusée",
|
|
"cancelled": "Annulée"
|
|
},
|
|
"halfDay": {
|
|
"matin": "Matin",
|
|
"apres_midi": "Après-midi"
|
|
},
|
|
"table": {
|
|
"type": "Type",
|
|
"period": "Période",
|
|
"days": "Jours",
|
|
"status": "Statut",
|
|
"employee": "Salarié",
|
|
"year": "Année",
|
|
"requestedAt": "Demandé le",
|
|
"actions": "Actions"
|
|
},
|
|
"filters": {
|
|
"allStatuses": "Tous les statuts",
|
|
"allTypes": "Tous les types",
|
|
"allYears": "Toutes les années",
|
|
"allEmployees": "Tous les salariés"
|
|
},
|
|
"form": {
|
|
"type": "Type d'absence",
|
|
"startDate": "Date de début",
|
|
"endDate": "Date de fin",
|
|
"startHalfDay": "Demi-journée (début)",
|
|
"endHalfDay": "Demi-journée (fin)",
|
|
"halfDayCheckbox": "Demi-journée",
|
|
"reason": "Motif",
|
|
"reasonPlaceholder": "Précisez le motif si nécessaire…",
|
|
"justification": "Justificatif",
|
|
"computed": "{days} décompté(s)",
|
|
"balanceAfter": "Solde restant après cette demande : {value}",
|
|
"negativeWarning": "Cette demande dépasse votre solde disponible.",
|
|
"noticeWarning": "Le délai de prévenance ({days} jours) n'est pas respecté.",
|
|
"submit": "Soumettre la demande",
|
|
"justificationRequired": "Un justificatif est requis pour ce type d'absence.",
|
|
"fullDay": "Journée entière",
|
|
"balanceAt": "Solde au {date}",
|
|
"balanceAfterValidation": "Solde après validation",
|
|
"duration": "Durée de la demande",
|
|
"commentPlaceholder": "Écrire un commentaire…",
|
|
"serverError": "La demande n'a pas pu être enregistrée.",
|
|
"errors": {
|
|
"typeRequired": "Veuillez choisir un type d'absence.",
|
|
"startRequired": "Veuillez indiquer une date de début.",
|
|
"endRequired": "Veuillez indiquer une date de fin.",
|
|
"endBeforeStart": "La date de fin doit être après la date de début.",
|
|
"zeroDays": "La période sélectionnée ne décompte aucun jour.",
|
|
"justificationRequired": "Un justificatif est obligatoire pour ce type d'absence."
|
|
}
|
|
},
|
|
"detail": {
|
|
"title": "Détail de la demande",
|
|
"timeline": "Historique",
|
|
"created": "Demande créée",
|
|
"reviewed": "Traitée par {name}",
|
|
"rejectionReason": "Motif du refus",
|
|
"downloadJustification": "Télécharger le justificatif",
|
|
"cancel": "Annuler ma demande",
|
|
"cancelConfirm": "Annuler cette demande ?"
|
|
},
|
|
"review": {
|
|
"approve": "Valider",
|
|
"reject": "Refuser",
|
|
"rejectTitle": "Refuser la demande",
|
|
"rejectReasonLabel": "Motif du refus",
|
|
"rejectReasonPlaceholder": "Expliquez la raison du refus…",
|
|
"confirm": "Confirmer"
|
|
},
|
|
"admin": {
|
|
"tabs": {
|
|
"requests": "Demandes",
|
|
"calendar": "Calendrier",
|
|
"balances": "Soldes",
|
|
"employees": "Employés"
|
|
},
|
|
"kpis": {
|
|
"pending": "En attente",
|
|
"todayAbsent": "Absents aujourd'hui",
|
|
"weekAbsent": "Absents cette semaine"
|
|
},
|
|
"balancesTable": {
|
|
"employee": "Salarié",
|
|
"type": "Type",
|
|
"period": "Période",
|
|
"acquired": "Acquis (N-1)",
|
|
"acquiring": "En cours (N)",
|
|
"taken": "Pris",
|
|
"pending": "En attente",
|
|
"available": "Disponible",
|
|
"adjust": "Ajuster"
|
|
},
|
|
"adjust": {
|
|
"title": "Ajuster le solde",
|
|
"acquired": "Acquis (N-1)",
|
|
"acquiring": "En cours d'acquisition (N)",
|
|
"taken": "Pris",
|
|
"save": "Enregistrer"
|
|
},
|
|
"employees": {
|
|
"columns": {
|
|
"name": "Nom",
|
|
"contract": "Contrat",
|
|
"cpTaken": "CP pris",
|
|
"cpRemaining": "CP restants"
|
|
},
|
|
"empty": "Aucun employé. Cochez « Employé » sur un utilisateur dans l'administration.",
|
|
"noContract": "—",
|
|
"drawer": {
|
|
"title": "Informations employé",
|
|
"save": "Enregistrer"
|
|
},
|
|
"fields": {
|
|
"hireDate": "Date d'embauche",
|
|
"endDate": "Date de sortie",
|
|
"contractType": "Type de contrat",
|
|
"workTimeRatio": "Temps de travail (ex : 1.0)",
|
|
"annualLeaveDays": "CP annuels (jours)",
|
|
"referencePeriodStart": "Début période réf. (MM-DD)",
|
|
"initialLeaveBalance": "Solde CP initial"
|
|
},
|
|
"contract": {
|
|
"cdi": "CDI",
|
|
"cdd": "CDD",
|
|
"stage": "Stage",
|
|
"alternance": "Alternance",
|
|
"autre": "Autre"
|
|
}
|
|
}
|
|
},
|
|
"policies": {
|
|
"title": "Politiques d'absence",
|
|
"subtitle": "Réglez les défauts par type d'absence (convention collective).",
|
|
"type": "Type",
|
|
"daysPerYear": "Jours / an",
|
|
"daysPerEvent": "Jours / événement",
|
|
"justificationRequired": "Justificatif requis",
|
|
"noticeDays": "Délai prévenance (j)",
|
|
"countWorkingDaysOnly": "Jours ouvrés",
|
|
"active": "Actif",
|
|
"save": "Enregistrer"
|
|
},
|
|
"toast": {
|
|
"created": "Demande d'absence créée.",
|
|
"approved": "Demande validée.",
|
|
"rejected": "Demande refusée.",
|
|
"cancelled": "Demande annulée.",
|
|
"justificationUploaded": "Justificatif ajouté.",
|
|
"balanceAdjusted": "Solde ajusté.",
|
|
"policyUpdated": "Politique mise à jour."
|
|
}
|
|
}
|
|
}
|