Files
arboretum/packages/web/src/i18n/fr.ts
Johan LEROY 8b9060e0c0 feat: création de projet (nouveau dossier + session) & en-tête de session enrichi
- POST /api/v1/projects : crée <root>/<name> (mkdir non récursif, 409 si existant),
  git init optionnel, puis lance une session dedans. Anti-traversal sur le nom (core/project.ts).
- Web : NewProjectModal (racine préremplie scanRoots[0], case git init) + bouton dans SessionsListView.
- SessionContextBar : badge du groupe (cliquable) + repos couverts avec leur branche dans l'en-tête
  de session ; session simple = repo+branche déduits du cwd.
- 14 tests (unitaires + route).
2026-06-23 18:52:22 +02:00

445 lines
15 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type en from './en';
const fr: typeof en = {
common: {
appName: 'Arboretum',
loading: 'Chargement…',
cancel: 'Annuler',
logout: 'Se déconnecter',
language: 'Langue',
refresh: 'Rafraîchir',
back: 'Retour',
search: 'Rechercher',
settings: 'Réglages',
close: 'Fermer',
retry: 'Réessayer',
},
login: {
title: 'Connectez-vous avec votre jeton daccès',
tokenLabel: 'Jeton daccès',
tokenPlaceholder: 'arb_…',
submit: 'Se connecter',
submitting: 'Connexion…',
invalidToken: 'Jeton invalide',
rateLimited: 'Trop de tentatives — patientez avant de réessayer',
genericError: 'Échec de la connexion ({status})',
},
sessions: {
title: 'Sessions',
refresh: 'Rafraîchir',
empty: 'Aucune session — démarrez-en une ci-dessous.',
newSession: 'Nouvelle session',
cwdLabel: 'Répertoire de travail',
cwdPlaceholder: '/chemin/absolu/du/projet',
commandLabel: 'Commande',
creating: 'Création…',
open: 'Ouvrir',
observe: 'Observer',
view: 'Voir',
resume: 'Reprendre',
fork: 'Dupliquer',
kill: 'Tuer',
confirmKill: 'Confirmer',
live: 'en cours',
resumable: 'reprenable',
sourceDiscovered: 'découverte',
hide: 'Masquer',
unhide: 'Réafficher',
hiddenBadge: 'masquée',
hideDiscovered: 'Masquer lhistorique externe',
showHidden: 'Afficher les masquées',
hideHidden: 'Masquer les masquées',
clients: 'aucun client | 1 client | {n} clients',
exitCode: 'code de sortie {code}',
statusLabel: {
starting: 'démarrage',
running: 'en cours',
exited: 'terminée',
},
registryStatus: {
busy: 'occupée',
idle: 'inactive',
waiting: 'en attente',
},
dialog: {
waiting: 'En attente de votre saisie',
deny: 'Refuser (Échap)',
kind: {
trust: 'Confiance',
permission: 'Permission',
question: 'Question',
plan: 'Plan',
},
},
},
dashboard: {
title: 'Worktrees',
allSessions: 'Toutes les sessions',
groups: 'Groupes',
},
groups: {
title: 'Groupes',
new: 'Nouveau groupe',
create: 'Créer',
creating: 'Création…',
nameLabel: 'Nom du groupe',
namePlaceholder: 'ex. Stack paiements',
colorLabel: 'Couleur',
reposLabel: 'Dépôts',
empty: 'Aucun groupe — créez-en un ci-dessus.',
noRepos: 'Aucun dépôt sélectionné.',
noReposInGroup: 'Aucun dépôt dans ce groupe — ajoutez-en ci-dessous.',
noReposRegistered: 'Aucun dépôt enregistré — ajoutez-en dabord depuis le tableau de bord.',
open: 'Ouvrir',
edit: 'Modifier les dépôts',
editDone: 'Terminé',
remove: 'Supprimer',
confirmDelete: 'Confirmer',
repoCount: 'aucun dépôt | 1 dépôt | {n} dépôts',
dashboard: 'Tableau de bord',
missingRepo: 'Dépôt indisponible',
removeFromGroup: 'Retirer du groupe',
sessionsActive: 'aucune session active | 1 session active | {n} sessions actives',
viewList: 'Dépôts',
viewGrid: 'Terminaux',
gridEmpty: 'Aucune session active dans ce groupe.',
gridCapped: '{shown} sessions affichées sur {total} — fermez des terminaux pour voir le reste.',
newFeature: 'Nouvelle session de groupe',
spanBadge: 'groupe · {n} dépôt | groupe · {n} dépôts',
},
crossRepo: {
title: 'Nouvelle session de groupe',
intro: 'Lance UNE session Claude couvrant tous les dépôts du groupe — une seule conversation reliant lensemble.',
modeLabel: 'Répertoires',
modeFeature: 'Nouvelle branche dans chaque dépôt',
modeMain: 'Checkouts principaux',
branchLabel: 'Nom de branche',
branchPlaceholder: 'feature/…',
branchHint: 'Créée si absente, réutilisée si déjà présente dans le dépôt.',
baseRefLabel: 'Branche de base (optionnel)',
baseRefPlaceholder: 'branche par défaut du dépôt',
commandLabel: 'Session',
reposLabel: 'Dépôts de la session',
launch: 'Lancer la session',
launching: 'Lancement…',
close: 'Fermer',
ok: 'worktree prêt',
error: 'échec',
skippedLabel: 'ignoré',
done: 'Session de groupe démarrée.',
sessionFailed: 'Impossible de démarrer la session.',
},
repos: {
add: 'Ajouter un repo',
adding: 'Ajout…',
remove: 'Retirer',
pathLabel: 'Chemin du dépôt',
pathPlaceholder: '/chemin/absolu/du/repo',
empty: 'Aucun dépôt enregistré — ajoutez-en un ci-dessus, ou lancez un scan.',
invalid: 'indisponible',
scan: 'Scanner',
scanResult: 'Aucun nouveau dépôt trouvé | 1 nouveau dépôt ajouté | {n} nouveaux dépôts ajoutés',
hide: 'Masquer',
show: 'Afficher',
showHidden: 'Afficher les masqués ({n})',
},
worktrees: {
new: 'Nouveau worktree',
create: 'Créer',
creating: 'Création…',
branch: 'Branche',
newBranch: 'créer la branche',
baseRefLabel: 'Branche de base',
baseRefPlaceholder: 'branche par défaut',
start: 'Démarrer',
starting: 'Démarrage…',
startNone: 'aucune session',
startWork: 'Démarrer le travail',
modeLabel: 'Mode',
modeWorktree: 'Worktree',
modeMain: 'Branche principale',
branchModeLabel: 'Branche',
currentBranch: 'branche actuelle',
newBranchOpt: 'nouvelle branche',
commandLabel: 'Commande',
delete: 'Supprimer',
confirmDelete: 'Confirmer',
forceDelete: 'Forcer la suppression',
prune: 'Élaguer',
commit: 'Commit',
commitPlaceholder: 'Message de commit',
committing: 'Commit…',
push: 'Push',
pushing: 'Push…',
promote: 'Passer en principal',
promoting: 'Promotion…',
promoteConfirm:
'La branche « {branch} » deviendra le checkout principal du dépôt ; ce worktree sera supprimé (lancienne branche principale est conservée). Continuer ?',
forcePromote: 'Forcer (arbre modifié)',
main: 'principal',
detached: 'détaché',
locked: 'verrouillé',
prunable: 'élaguable',
clean: 'propre',
dirty: '{n} modifié(s)',
noSession: 'aucune session',
externalSessions: 'externes',
showExternalSessions: 'Afficher les sessions externes ({n})',
},
project: {
new: 'Nouveau projet',
title: 'Nouveau projet',
intro: 'Crée un nouveau dossier sous la racine choisie, puis y lance une session.',
nameLabel: 'Nom du projet',
namePlaceholder: 'mon-projet',
rootLabel: 'Dossier racine',
rootPlaceholder: '/chemin/absolu/racine',
gitInit: 'Initialiser un dépôt git (git init)',
commandLabel: 'Commande',
create: 'Créer',
creating: 'Création…',
},
terminal: {
observer: 'observateur (lecture seule)',
sessionEnded: 'Session terminée',
back: 'Sessions',
notAttachable:
'Cette session tourne hors dArboretum — dupliquez-la pour interagir, ou reprenez-la une fois arrêtée.',
fullscreen: 'Plein écran',
exitFullscreen: 'Quitter le plein écran',
maximize: 'Agrandir',
restore: 'Réduire',
openFullscreen: 'Ouvrir en plein écran',
group: 'Groupe',
covers: 'couvre',
},
push: {
enable: 'Activer les notifications',
disable: 'Notifications activées',
denied: 'Permission de notification refusée — activez-la dans les réglages du navigateur.',
unsupported: 'Le push nécessite HTTPS (ex. Tailscale Serve) ; sur iOS, installez dabord lapp sur lécran daccueil.',
},
fs: {
browse: 'Parcourir…',
up: 'Remonter',
useFolder: 'Utiliser ce dossier',
showHidden: 'Afficher les cachés',
loading: 'Chargement…',
empty: 'Aucun sous-dossier',
repoBadge: 'dépôt',
},
ws: {
reconnecting: 'Connexion perdue — reconnexion…',
},
nav: {
worktrees: 'Worktrees',
sessions: 'Sessions',
groups: 'Groupes',
settings: 'Réglages',
help: 'Aide',
more: 'Plus',
gitea: 'Code source',
buymeacoffee: 'Offrez-moi un café',
waiting: 'en attente',
},
controls: {
searchPlaceholder: 'Rechercher…',
results: 'aucun résultat | 1 résultat | {n} résultats',
sortBy: 'Trier par',
filters: 'Filtres',
clearAll: 'Effacer',
},
sort: {
asc: 'Croissant',
desc: 'Décroissant',
session: {
state: 'État',
recent: 'Plus récentes',
clients: 'Clients',
cwd: 'Répertoire',
command: 'Commande',
},
worktree: {
main: 'Principal dabord',
branch: 'Branche',
dirty: 'Modifications',
ahead: 'En avance',
behind: 'En retard',
activity: 'Activité',
},
repo: {
label: 'Nom',
created: 'Créé le',
worktrees: 'Worktrees',
activity: 'Activité',
},
group: {
label: 'Nom',
created: 'Créé le',
repos: 'Dépôts',
activeSessions: 'Sessions actives',
},
},
filter: {
state: {
label: 'État',
live: 'Active',
waiting: 'En attente',
busy: 'Occupée',
idle: 'Au repos',
exited: 'Terminée',
resumable: 'Reprenable',
},
command: {
label: 'Commande',
},
source: {
label: 'Source',
managed: 'Gérée',
discovered: 'Découverte',
},
repo: {
label: 'Dépôt',
},
worktree: {
dirtiness: 'Modifications',
dirty: 'Modifié',
clean: 'Propre',
session: 'Session',
with: 'Avec session',
without: 'Sans session',
flags: 'Drapeaux',
locked: 'Verrouillé',
prunable: 'Élaguable',
},
},
pagination: {
prev: 'Précédent',
next: 'Suivant',
pageOf: 'Page {page} / {pageCount}',
perPage: 'Par page',
all: 'Tout',
},
palette: {
placeholder: 'Aller à un dépôt, worktree, session, groupe…',
empty: 'Aucun résultat',
hint: '↑↓ naviguer · ↵ ouvrir · échap fermer',
types: {
repo: 'Dépôt',
worktree: 'Worktree',
session: 'Session',
group: 'Groupe',
action: 'Action',
},
actions: {
newSession: 'Nouvelle session',
addRepo: 'Ajouter un dépôt',
newGroup: 'Nouveau groupe',
},
},
toast: {
sessionCreated: 'Session démarrée',
sessionKilled: 'Session tuée',
sessionResumed: 'Session reprise',
sessionForked: 'Session dupliquée',
sessionHidden: 'Session masquée',
sessionUnhidden: 'Session réaffichée',
sessionsHidden: 'aucune session masquée | 1 session masquée | {n} sessions masquées',
repoAdded: 'Dépôt ajouté',
repoRemoved: 'Dépôt retiré',
worktreeCreated: 'Worktree créé',
worktreeDeleted: 'Worktree supprimé',
pruned: 'Worktrees élagués',
groupCreated: 'Groupe créé',
groupUpdated: 'Groupe mis à jour',
groupDeleted: 'Groupe supprimé',
groupSessionLaunched: 'Session de groupe démarrée',
groupSessionPartial: 'Session de groupe démarrée ({n} dépôt(s) ignoré(s))',
projectCreated: 'Projet créé',
genericError: 'Une erreur est survenue',
dismiss: 'Fermer',
},
attention: {
title: 'À traiter',
count: 'aucune session en attente | 1 session en attente | {n} sessions en attente',
empty: 'Rien à traiter',
},
settings: {
title: 'Réglages',
// Préférences
preferences: 'Préférences',
preferencesHint: 'Ces réglages ne sappliquent quà ce navigateur.',
language: 'Langue',
notifications: 'Notifications',
notificationsEnabled: 'Activées — vous serez notifié lorsquune session attend une réponse.',
notificationsDisabled: 'Désactivées.',
enableNotifications: 'Activer les notifications',
disableNotifications: 'Désactiver les notifications',
testNotification: 'Envoyer un test',
testSent: 'Notification de test envoyée',
pushUnsupported: 'Le push exige HTTPS (ex. Tailscale Serve) ; sur iOS, installez dabord lapp sur lécran daccueil.',
// Accès & sécurité
security: 'Accès & sécurité',
securityHint: 'Les jetons donnent un accès complet à ce serveur. Créez-en un par appareil et révoquez ceux que vous nutilisez plus.',
tokens: 'Jetons daccès',
newTokenLabel: 'Libellé',
newTokenPlaceholder: 'ex. téléphone, portable',
createToken: 'Créer un jeton',
tokenCreated: 'Jeton créé',
copyTokenHint: 'Copiez ce jeton maintenant — par sécurité il ne sera plus jamais affiché.',
copy: 'Copier',
copied: 'Copié',
current: 'courant',
created: 'Créé le {date}',
lastUsed: 'utilisé le {date}',
neverUsed: 'jamais utilisé',
revoke: 'Révoquer',
confirmRevoke: 'Confirmer la révocation',
tokenRevoked: 'Jeton révoqué',
lastTokenError: 'Impossible de révoquer le dernier jeton actif — créez-en un autre dabord.',
save: 'Enregistrer',
saved: 'Enregistré',
// Sécurité & conformité
compliance: 'Sécurité & conformité',
complianceHint: 'Exportez ou effacez les données liées à votre jeton (RGPD), et consultez le journal daudit des opérations sensibles.',
exportData: 'Exporter mes données',
refreshAudit: 'Journal daudit',
deleteData: 'Effacer mes données',
deleteConfirm: 'Effacer les données liées à votre jeton (abonnements push) et révoquer ce jeton ? Action irréversible.',
deleteDone: 'Vos données ont été effacées.',
// Découverte des dépôts
discovery: 'Découverte des dépôts',
discoveryHint: 'Arboretum scanne ces dossiers à la recherche de dépôts git et les enregistre automatiquement. Les dépôts masqués sont conservés et jamais ré-ajoutés.',
scanRoots: 'Dossiers à scanner',
scanRootsEmpty: 'Aucun dossier configuré — votre dossier personnel est utilisé par défaut.',
addRoot: 'Ajouter un dossier',
removeRoot: 'Retirer',
scanInterval: 'Intervalle de re-scan (minutes)',
scanIntervalHint: '0 désactive le scan périodique. Les changements prennent effet au prochain redémarrage du daemon.',
// Serveur (lecture seule)
server: 'Serveur',
serverHint: 'Définis au démarrage via des flags CLI — les modifier nécessite de redémarrer le daemon.',
version: 'Version',
port: 'Port',
bind: 'Adresse de liaison',
allowedOrigins: 'Origines autorisées',
dataDir: 'Répertoire de données',
vapidPublicKey: 'Clé publique VAPID',
vapidContact: 'Contact VAPID',
none: 'aucune',
flagHint: 'Flag CLI : {flag}',
// Soutien
support: 'Soutenir le projet',
supportHint: 'Arboretum est un projet personnel libre et auto-financé. Sil vous fait gagner du temps, vous pouvez soutenir son développement.',
supportCta: 'Offrez-moi un café',
},
help: {
title: 'Aide',
intro: 'Tout ce quArboretum sait faire, et comment lutiliser.',
searchPlaceholder: 'Rechercher dans laide…',
noMatch: 'Aucun sujet correspondant',
},
};
export default fr;