- PWA: public/manifest.webmanifest + icon.svg + meta index.html (theme-color, apple-touch-icon) - public/sw.js: service worker push-only (push → showNotification tag=sessionId ; notificationclick → focus/ouvre /sessions/<id>) — pas de précache (hors périmètre) - lib/push.ts + stores/push.ts: enable/disable, abonnement VAPID, enregistrement SW au boot - DashboardView: toggle « Notifications » (gardé par pushSupported) + i18n en/fr - campagne de fiabilité (verdict S3): classification de tous les types de dialogue sur captures réelles (trust/permission×2/question) + refus Esc (deny-esc2) + plan (synthétique) - acceptance-p4.mjs: VAPID/auth/Origin, subscribe idempotent/unsubscribe, answer (rejets) Choix: SW écrit à la main plutôt que vite-plugin-pwa (qui tirait ~295 paquets Workbox + 2 vulns esbuild high pour un SW push-only). Zéro dépendance front nouvelle. 175 tests verts, acceptance p1..p4 ALL GREEN. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
115 lines
3.2 KiB
TypeScript
115 lines
3.2 KiB
TypeScript
import type en from './en';
|
||
|
||
const fr: typeof en = {
|
||
common: {
|
||
appName: 'Arboretum',
|
||
loading: 'Chargement…',
|
||
cancel: 'Annuler',
|
||
logout: 'Se déconnecter',
|
||
language: 'Langue',
|
||
},
|
||
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',
|
||
},
|
||
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.',
|
||
invalid: 'indisponible',
|
||
},
|
||
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.',
|
||
},
|
||
ws: {
|
||
reconnecting: 'Connexion perdue — reconnexion…',
|
||
},
|
||
};
|
||
|
||
export default fr;
|