Scan borné du système de fichiers (racines configurables, défaut home ; profondeur/nombre/timeout bornés ; symlinks non suivis ; exclusions node_modules/dotdirs) qui auto-enregistre les nouveaux dépôts. Insertion atomique ON CONFLICT DO NOTHING (idempotence + anti-résurrection d'un dépôt masqué + anti-course). Scan au démarrage + bouton manuel + re-scan périodique (RepoDiscoveryService, démarré dans runDaemon). Colonne repos.hidden : masquer = conservé en DB mais exclu du dashboard et jamais ré-ajouté ; supprimer = re-découvrable. UI : bouton œil par dépôt + bascule afficher-les-masqués sur le dashboard, section Découverte dans les Réglages (racines + intervalle, allow-list stricte). Robustesse : listAllWorktrees tolère l'échec git par dépôt ; flag --no-discover (escape hatch + hermétisme des acceptations). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
378 lines
12 KiB
TypeScript
378 lines
12 KiB
TypeScript
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 d’accès',
|
||
tokenLabel: 'Jeton d’accè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',
|
||
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 d’abord 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 feature cross-repo',
|
||
},
|
||
crossRepo: {
|
||
title: 'Nouvelle feature cross-repo',
|
||
intro: 'Crée le même worktree dans les dépôts sélectionnés, en une seule action.',
|
||
branchLabel: 'Nom de branche',
|
||
branchPlaceholder: 'feature/…',
|
||
newBranch: 'créer la branche',
|
||
baseRefLabel: 'Réf. de base (optionnel)',
|
||
startLabel: 'Démarrer une session',
|
||
startNone: 'aucune session',
|
||
reposLabel: 'Appliquer à',
|
||
create: 'Créer dans {n} dépôts',
|
||
creating: 'Création…',
|
||
retryFailed: 'Réessayer les échecs',
|
||
close: 'Fermer',
|
||
pending: 'en cours…',
|
||
ok: 'créé',
|
||
error: 'échec',
|
||
},
|
||
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',
|
||
start: 'Démarrer',
|
||
startNone: 'aucune session',
|
||
delete: 'Supprimer',
|
||
confirmDelete: 'Confirmer',
|
||
forceDelete: 'Forcer la suppression',
|
||
prune: 'Élaguer',
|
||
main: 'principal',
|
||
detached: 'détaché',
|
||
locked: 'verrouillé',
|
||
prunable: 'élaguable',
|
||
clean: 'propre',
|
||
dirty: '{n} modifié(s)',
|
||
noSession: 'aucune session',
|
||
},
|
||
terminal: {
|
||
observer: 'observateur (lecture seule)',
|
||
sessionEnded: 'Session terminée',
|
||
back: 'Sessions',
|
||
notAttachable:
|
||
'Cette session tourne hors d’Arboretum — dupliquez-la pour interagir, ou reprenez-la une fois arrêtée.',
|
||
},
|
||
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 d’abord l’app sur l’écran d’accueil.',
|
||
},
|
||
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: 'Ouvrir Gitea',
|
||
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 d’abord',
|
||
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',
|
||
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é',
|
||
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 s’appliquent qu’à ce navigateur.',
|
||
language: 'Langue',
|
||
notifications: 'Notifications',
|
||
notificationsEnabled: 'Activées — vous serez notifié lorsqu’une 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 d’abord l’app sur l’écran d’accueil.',
|
||
// 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 n’utilisez plus.',
|
||
tokens: 'Jetons d’accè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 d’abord.',
|
||
// Intégrations
|
||
integrations: 'Intégrations',
|
||
gitea: 'Gitea',
|
||
giteaUrlLabel: 'URL de l’instance Gitea',
|
||
giteaUrlPlaceholder: 'https://git.exemple.com',
|
||
giteaUrlHint: 'Ajoute une icône de raccourci dans la navigation. Laissez vide pour la masquer.',
|
||
save: 'Enregistrer',
|
||
saved: 'Enregistré',
|
||
// 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}',
|
||
},
|
||
help: {
|
||
title: 'Aide',
|
||
intro: 'Tout ce qu’Arboretum sait faire, et comment l’utiliser.',
|
||
searchPlaceholder: 'Rechercher dans l’aide…',
|
||
noMatch: 'Aucun sujet correspondant',
|
||
},
|
||
};
|
||
|
||
export default fr;
|