Files
arboretum/packages/web/src/i18n/en.ts
Johan LEROY e38b3a5d5e feat: groupes de travail (P5)
Ajoute la notion de groupe — collection nommée de repos (membership légère
persistée, many-to-many) — pour piloter plusieurs repos en simultané :

- DB : migration #5 (tables groups + group_repos, FK ON DELETE CASCADE).
- GroupManager (synchrone, EventEmitter) + routes REST /api/v1/groups ;
  ne persiste que la membership, worktrees/sessions filtrés par repoId côté client.
- Protocole : GroupSummary, DTOs, topic WS « groups », events group_update/removed
  (additifs, PROTOCOL_VERSION inchangé).
- Web : store groups, GroupsListView, GroupView (réutilise RepoSection),
  grille multi-terminaux (TerminalGrid/TerminalCell), action « feature cross-repo »
  (orchestration client, tolérante aux échecs partiels), routes + i18n EN/FR.
- Tests : group-manager.test.ts + extension protocol.test.ts ; acceptance-p5.mjs.
2026-06-18 10:03:19 +02:00

167 lines
4.7 KiB
TypeScript

export default {
common: {
appName: 'Arboretum',
loading: 'Loading…',
cancel: 'Cancel',
logout: 'Log out',
language: 'Language',
},
login: {
title: 'Sign in with your access token',
tokenLabel: 'Access token',
tokenPlaceholder: 'arb_…',
submit: 'Sign in',
submitting: 'Signing in…',
invalidToken: 'Invalid token',
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.',
newSession: 'New session',
cwdLabel: 'Working directory',
cwdPlaceholder: '/absolute/path/to/project',
commandLabel: 'Command',
creating: 'Creating…',
open: 'Open',
observe: 'Observe',
view: 'View',
resume: 'Resume',
fork: 'Fork',
kill: 'Kill',
confirmKill: 'Confirm kill',
live: 'live',
resumable: 'resumable',
sourceDiscovered: 'discovered',
clients: 'no client | 1 client | {n} clients',
exitCode: 'exit code {code}',
statusLabel: {
starting: 'starting',
running: 'running',
exited: 'exited',
},
registryStatus: {
busy: 'busy',
idle: 'idle',
waiting: 'waiting',
},
dialog: {
waiting: 'Waiting for your input',
deny: 'Deny (Esc)',
kind: {
trust: 'Trust',
permission: 'Permission',
question: 'Question',
plan: 'Plan',
},
},
},
dashboard: {
title: 'Worktrees',
allSessions: 'All sessions',
groups: 'Groups',
},
groups: {
title: 'Groups',
new: 'New group',
create: 'Create',
creating: 'Creating…',
nameLabel: 'Group name',
namePlaceholder: 'e.g. Payments stack',
colorLabel: 'Color',
reposLabel: 'Repositories',
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.',
open: 'Open',
edit: 'Edit repositories',
editDone: 'Done',
remove: 'Delete',
confirmDelete: 'Confirm delete',
repoCount: 'no repo | 1 repo | {n} repos',
dashboard: 'Dashboard',
missingRepo: 'Repository unavailable',
removeFromGroup: 'Remove from group',
sessionsActive: 'no active session | 1 active session | {n} active sessions',
viewList: 'Repos',
viewGrid: 'Terminals',
gridEmpty: 'No active session in this group.',
gridCapped: 'Showing {shown} of {total} sessions — close some terminals to see the rest.',
newFeature: 'New cross-repo feature',
},
crossRepo: {
title: 'New cross-repo feature',
intro: 'Create the same worktree across the selected repos, in one action.',
branchLabel: 'Branch name',
branchPlaceholder: 'feature/…',
newBranch: 'create branch',
baseRefLabel: 'Base ref (optional)',
startLabel: 'Start session',
startNone: 'no session',
reposLabel: 'Apply to',
create: 'Create across {n} repos',
creating: 'Creating…',
retryFailed: 'Retry failed',
close: 'Close',
pending: 'pending…',
ok: 'created',
error: 'failed',
},
repos: {
add: 'Add repo',
adding: 'Adding…',
remove: 'Remove',
pathLabel: 'Repository path',
pathPlaceholder: '/absolute/path/to/repo',
empty: 'No repository registered yet — add one above.',
invalid: 'unavailable',
},
worktrees: {
new: 'New worktree',
create: 'Create',
creating: 'Creating…',
branch: 'Branch',
newBranch: 'create branch',
start: 'Start',
startNone: 'no session',
delete: 'Delete',
confirmDelete: 'Confirm delete',
forceDelete: 'Force delete',
prune: 'Prune',
main: 'main',
detached: 'detached',
locked: 'locked',
prunable: 'prunable',
clean: 'clean',
dirty: '{n} changed',
noSession: 'no session',
},
terminal: {
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.',
},
push: {
enable: 'Enable notifications',
disable: 'Notifications on',
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: {
browse: 'Browse…',
up: 'Up',
useFolder: 'Use this folder',
showHidden: 'Show hidden',
loading: 'Loading…',
empty: 'No subfolders',
repoBadge: 'repo',
},
ws: {
reconnecting: 'Connection lost — reconnecting…',
},
};