chore(typo): retire tous les tirets cadratins/demi-cadratins + garde CI
Some checks failed
CI / Build & test (Node 24) (push) Has been cancelled
CI / Pack & boot smoke (Node 22) (push) Has been cancelled
CI / No em/en dashes (push) Has been cancelled
CI / Build & test (Node 22) (push) Has been cancelled
Deploy site (production) / build-and-deploy (push) Successful in 20s

Remplace les 547 tirets cadratins (U+2014) et demi-cadratins (U+2013) des fichiers versionnés par la ponctuation contextuelle adaptée (point médian, deux-points, virgule, parenthèses ; tiret simple pour les plages), sur 122 fichiers (appli, vitrine, doc, tests, workflows, scripts).

Ajoute le job CI « lint-dashes » (git grep -P) qui échoue si un tiret cadratin/demi-cadratin réapparaît, hors logo binaire et captures brutes du terminal (fidélité des fixtures de détection de dialogue).
This commit is contained in:
2026-07-17 16:44:00 +02:00
parent 985531a986
commit 65ef616867
122 changed files with 538 additions and 521 deletions

View File

@@ -21,13 +21,13 @@ export default {
submit: 'Sign in',
submitting: 'Signing in…',
invalidToken: 'Invalid token',
rateLimited: 'Too many attempts — please wait before retrying',
rateLimited: 'Too many attempts. Please wait before retrying',
genericError: 'Sign-in failed ({status})',
},
sessions: {
title: 'Sessions',
refresh: 'Refresh',
empty: 'No sessions yet — start one below.',
empty: 'No sessions yet. Start one below.',
newSession: 'New session',
cwdLabel: 'Working directory',
cwdPlaceholder: '/absolute/path/to/project',
@@ -91,10 +91,10 @@ export default {
namePlaceholder: 'e.g. Payments stack',
colorLabel: 'Color',
reposLabel: 'Repositories',
empty: 'No group yet — create one above.',
empty: 'No group yet. Create one above.',
noRepos: 'No repository selected.',
noReposInGroup: 'No repository in this group yet — add some below.',
noReposRegistered: 'No repository registered yet — add some from the dashboard first.',
noReposInGroup: 'No repository in this group yet. Add some below.',
noReposRegistered: 'No repository registered yet. Add some from the dashboard first.',
open: 'Open',
edit: 'Edit repositories',
editDone: 'Done',
@@ -108,13 +108,13 @@ export default {
viewList: 'Repos',
viewGrid: 'Terminals',
gridEmpty: 'No active session in this group.',
gridCapped: 'Showing {shown} of {total} sessions — close some terminals to see the rest.',
gridCapped: 'Showing {shown} of {total} sessions. Close some terminals to see the rest.',
newFeature: 'New group session',
spanBadge: 'group · {n} repo | group · {n} repos',
},
crossRepo: {
title: 'New group session',
intro: 'Launch one Claude session that spans every repo in this group a single conversation across all of them.',
intro: 'Launch one Claude session that spans every repo in this group: a single conversation across all of them.',
modeLabel: 'Directories',
modeFeature: 'New branch in each repo',
modeMain: 'Main checkouts',
@@ -140,7 +140,7 @@ export default {
remove: 'Remove',
pathLabel: 'Repository path',
pathPlaceholder: '/absolute/path/to/repo',
empty: 'No repository registered yet — add one above, or scan for repos.',
empty: 'No repository registered yet. Add one above, or scan for repos.',
invalid: 'unavailable',
scan: 'Scan',
scanResult: 'No new repository found | 1 new repository added | {n} new repositories added',
@@ -209,7 +209,7 @@ export default {
files: 'Files',
changes: 'Changes',
noChanges: 'No changes',
changesTruncated: 'Too many changes — list truncated.',
changesTruncated: 'Too many changes. List truncated.',
terminal: 'Terminal',
editor: 'Editor',
diff: 'Diff',
@@ -226,7 +226,7 @@ export default {
overwrite: 'Overwrite',
},
diff: {
binary: 'Binary file — no text diff.',
binary: 'Binary file. No text diff.',
tooLarge: 'Diff too large to display.',
noChanges: 'No changes in this file.',
},
@@ -304,7 +304,7 @@ export default {
observer: 'observer (read-only)',
sessionEnded: 'Session ended',
back: 'Sessions',
notAttachable: 'This session runs outside Arboretum — fork it to interact, or resume it once it has stopped.',
notAttachable: 'This session runs outside Arboretum. Fork it to interact, or resume it once it has stopped.',
fullscreen: 'Fullscreen',
exitFullscreen: 'Exit fullscreen',
maximize: 'Maximize',
@@ -316,7 +316,7 @@ export default {
push: {
enable: 'Enable notifications',
disable: 'Notifications on',
denied: 'Notification permission denied — enable it in your browser settings.',
denied: 'Notification permission denied. Enable it in your browser settings.',
unsupported: 'Push needs HTTPS (e.g. Tailscale Serve); on iOS, install the app to your home screen first.',
},
fs: {
@@ -329,7 +329,7 @@ export default {
repoBadge: 'repo',
},
ws: {
reconnecting: 'Connection lost — reconnecting…',
reconnecting: 'Connection lost. Reconnecting…',
},
nav: {
worktrees: 'Worktrees',
@@ -473,7 +473,7 @@ export default {
preferencesHint: 'These apply to this browser only.',
language: 'Language',
notifications: 'Notifications',
notificationsEnabled: 'Enabled — you will be notified when a session needs input.',
notificationsEnabled: 'Enabled. You will be notified when a session needs input.',
notificationsDisabled: 'Disabled.',
enableNotifications: 'Enable notifications',
disableNotifications: 'Disable notifications',
@@ -488,7 +488,7 @@ export default {
newTokenPlaceholder: 'e.g. phone, laptop',
createToken: 'Create token',
tokenCreated: 'Token created',
copyTokenHint: 'Copy this token now — for security it will never be shown again.',
copyTokenHint: 'Copy this token now. For security it will never be shown again.',
copy: 'Copy',
copied: 'Copied',
current: 'current',
@@ -498,7 +498,7 @@ export default {
revoke: 'Revoke',
confirmRevoke: 'Confirm revoke',
tokenRevoked: 'Token revoked',
lastTokenError: 'You cannot revoke the last active token — create another one first.',
lastTokenError: 'You cannot revoke the last active token. Create another one first.',
save: 'Save',
saved: 'Saved',
// Sécurité & conformité
@@ -513,21 +513,21 @@ export default {
discovery: 'Repository discovery',
discoveryHint: 'Arboretum scans these folders for git repositories and registers them automatically. Hidden repos are kept and never re-added.',
scanRoots: 'Scan folders',
scanRootsEmpty: 'No folder configured — your home directory is used by default.',
scanRootsEmpty: 'No folder configured. Your home directory is used by default.',
addRoot: 'Add folder',
removeRoot: 'Remove',
scanInterval: 'Re-scan interval (minutes)',
scanIntervalHint: '0 disables periodic scanning. Changes apply on the next daemon restart.',
// Sessions (rétention / archivage auto)
sessions: 'Sessions',
sessionsHint: 'Finished sessions older than the retention window are automatically archived (hidden from the list by default). Nothing is deleted — archived sessions stay resumable and forkable.',
sessionsHint: 'Finished sessions older than the retention window are automatically archived (hidden from the list by default). Nothing is deleted. Archived sessions stay resumable and forkable.',
retentionDays: 'Auto-archive after (days)',
retentionDaysHint: '0 never archives. Archived sessions are hidden by default; toggle "Show archived" in the sessions list to see them.',
// Claude CLI
claudeCli: 'Claude CLI',
claudeCliHint: 'Where Arboretum finds the `claude` binary and its data. Handy when the daemon runs as a service with a minimal PATH that does not include ~/.local/bin.',
claudeBinStatusOk: 'Detected',
claudeBinStatusNotFound: 'Not found — sessions cannot start until this is resolved.',
claudeBinStatusNotFound: 'Not found. Sessions cannot start until this is resolved.',
claudeBinStatusBadPath: 'The configured path is not an executable file.',
claudeBinSourceConfigured: 'configured',
claudeBinSourcePath: 'PATH',
@@ -539,7 +539,7 @@ export default {
claudeHomePlaceholder: 'e.g. /home/you/.claude',
// Serveur (lecture seule)
server: 'Server',
serverHint: 'Set at startup via CLI flags — changing them requires restarting the daemon.',
serverHint: 'Set at startup via CLI flags. Changing them requires restarting the daemon.',
version: 'Version',
port: 'Port',
bind: 'Bind address',

View File

@@ -23,13 +23,13 @@ const fr: typeof en = {
submit: 'Se connecter',
submitting: 'Connexion…',
invalidToken: 'Jeton invalide',
rateLimited: 'Trop de tentatives — patientez avant de réessayer',
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.',
empty: 'Aucune session. Démarrez-en une ci-dessous.',
newSession: 'Nouvelle session',
cwdLabel: 'Répertoire de travail',
cwdPlaceholder: '/chemin/absolu/du/projet',
@@ -93,10 +93,10 @@ const fr: typeof en = {
namePlaceholder: 'ex. Stack paiements',
colorLabel: 'Couleur',
reposLabel: 'Dépôts',
empty: 'Aucun groupe — créez-en un ci-dessus.',
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.',
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é',
@@ -110,13 +110,13 @@ const fr: typeof en = {
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.',
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.',
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',
@@ -142,7 +142,7 @@ const fr: typeof en = {
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.',
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',
@@ -211,7 +211,7 @@ const fr: typeof en = {
files: 'Fichiers',
changes: 'Changements',
noChanges: 'Aucun changement',
changesTruncated: 'Trop de changements — liste tronquée.',
changesTruncated: 'Trop de changements. Liste tronquée.',
terminal: 'Terminal',
editor: 'Éditeur',
diff: 'Diff',
@@ -228,7 +228,7 @@ const fr: typeof en = {
overwrite: 'Écraser',
},
diff: {
binary: 'Fichier binaire — pas de diff texte.',
binary: 'Fichier binaire. Pas de diff texte.',
tooLarge: 'Diff trop volumineux à afficher.',
noChanges: 'Aucun changement dans ce fichier.',
},
@@ -307,7 +307,7 @@ const fr: typeof en = {
sessionEnded: 'Session terminée',
back: 'Sessions',
notAttachable:
'Cette session tourne hors dArboretum — dupliquez-la pour interagir, ou reprenez-la une fois arrêtée.',
'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',
@@ -319,7 +319,7 @@ const fr: typeof en = {
push: {
enable: 'Activer les notifications',
disable: 'Notifications activées',
denied: 'Permission de notification refusée — activez-la dans les réglages du navigateur.',
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: {
@@ -332,7 +332,7 @@ const fr: typeof en = {
repoBadge: 'dépôt',
},
ws: {
reconnecting: 'Connexion perdue — reconnexion…',
reconnecting: 'Connexion perdue. Reconnexion…',
},
nav: {
worktrees: 'Worktrees',
@@ -476,7 +476,7 @@ const fr: typeof en = {
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.',
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',
@@ -491,7 +491,7 @@ const fr: typeof en = {
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é.',
copyTokenHint: 'Copiez ce jeton maintenant. Par sécurité il ne sera plus jamais affiché.',
copy: 'Copier',
copied: 'Copié',
current: 'courant',
@@ -501,7 +501,7 @@ const fr: typeof en = {
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.',
lastTokenError: 'Impossible de révoquer le dernier jeton actif. Créez-en un autre dabord.',
save: 'Enregistrer',
saved: 'Enregistré',
// Sécurité & conformité
@@ -516,21 +516,21 @@ const fr: typeof en = {
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.',
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.',
// Sessions (rétention / archivage auto)
sessions: 'Sessions',
sessionsHint: 'Les sessions terminées plus anciennes que la fenêtre de rétention sont archivées automatiquement (masquées de la liste par défaut). Rien nest supprimé — une session archivée reste reprenable et forkable.',
sessionsHint: 'Les sessions terminées plus anciennes que la fenêtre de rétention sont archivées automatiquement (masquées de la liste par défaut). Rien nest supprimé. Une session archivée reste reprenable et forkable.',
retentionDays: 'Auto-archiver après (jours)',
retentionDaysHint: '0 narchive jamais. Les sessions archivées sont masquées par défaut ; activez « Afficher les archivées » dans la liste pour les voir.',
// Claude CLI
claudeCli: 'CLI Claude',
claudeCliHint: 'Où Arboretum trouve le binaire `claude` et ses données. Utile quand le daemon tourne en service avec un PATH minimal qui ninclut pas ~/.local/bin.',
claudeBinStatusOk: 'Détecté',
claudeBinStatusNotFound: 'Introuvable — impossible de lancer une session tant que ce nest pas résolu.',
claudeBinStatusNotFound: 'Introuvable. Impossible de lancer une session tant que ce nest pas résolu.',
claudeBinStatusBadPath: 'Le chemin configuré nest pas un fichier exécutable.',
claudeBinSourceConfigured: 'configuré',
claudeBinSourcePath: 'PATH',
@@ -542,7 +542,7 @@ const fr: typeof en = {
claudeHomePlaceholder: 'ex. /home/vous/.claude',
// Serveur (lecture seule)
server: 'Serveur',
serverHint: 'Définis au démarrage via des flags CLI — les modifier nécessite de redémarrer le daemon.',
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',