export default { common: { appName: 'Arboretum', loading: 'Loading…', cancel: 'Cancel', logout: 'Log out', language: 'Language', refresh: 'Refresh', back: 'Back', search: 'Search', settings: 'Settings', close: 'Close', retry: 'Retry', confirm: 'Confirm', delete: 'Delete', working: 'Working…', }, 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', hide: 'Hide', unhide: 'Unhide', hiddenBadge: 'hidden', hideDiscovered: 'Hide external history', showHidden: 'Show hidden', hideHidden: 'Hide hidden', archive: 'Archive', unarchive: 'Unarchive', archivedBadge: 'archived', showArchived: 'Show archived', hideArchived: 'Hide archived', clients: 'no client | 1 client | {n} clients', exitCode: 'exit code {code}', statusLabel: { starting: 'starting', running: 'running', exited: 'exited', }, registryStatus: { busy: 'busy', idle: 'available', 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', colorNone: 'No 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 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.', modeLabel: 'Directories', modeFeature: 'New branch in each repo', modeMain: 'Main checkouts', branchLabel: 'Branch name', branchPlaceholder: 'feature/…', branchHint: 'Created where missing, reused where it already exists in the repo.', baseRefLabel: 'Base branch (optional)', baseRefPlaceholder: "repo's default branch", commandLabel: 'Session', reposLabel: 'Repos in this session', launch: 'Launch session', launching: 'Launching…', close: 'Close', ok: 'worktree ready', error: 'failed', skippedLabel: 'skipped', done: 'Group session started.', sessionFailed: 'Could not start the session.', }, repos: { add: 'Add repo', adding: 'Adding…', remove: 'Remove', pathLabel: 'Repository path', pathPlaceholder: '/absolute/path/to/repo', 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', hide: 'Hide', show: 'Show', showHidden: 'Show hidden ({n})', }, worktrees: { new: 'New worktree', create: 'Create', creating: 'Creating…', branch: 'Branch', newBranch: 'create branch', baseRefLabel: 'Base branch', baseRefPlaceholder: 'default branch', start: 'Start', starting: 'Starting…', startNone: 'no session', startWork: 'Start work', modeLabel: 'Mode', modeWorktree: 'Worktree', modeMain: 'Main branch', branchModeLabel: 'Branch', currentBranch: 'current branch', newBranchOpt: 'new branch', commandLabel: 'Command', delete: 'Delete', confirmDelete: 'Confirm delete', forceDelete: 'Force delete', prune: 'Prune', commit: 'Commit', commitPlaceholder: 'Commit message', committing: 'Committing…', push: 'Push', pushing: 'Pushing…', promote: 'Make main', promoting: 'Promoting…', promoteConfirm: 'Branch “{branch}” will become the repository’s main checkout; this worktree will be removed (the previous main branch is kept). Continue?', forcePromote: 'Force (dirty tree)', main: 'main', detached: 'detached', locked: 'locked', prunable: 'prunable', clean: 'clean', dirty: '{n} changed', noSession: 'no session', externalSessions: 'external', showExternalSessions: 'Show external sessions ({n})', }, project: { new: 'New project', title: 'New project', intro: 'Creates a new folder under the chosen root, then starts a session in it.', nameLabel: 'Project name', namePlaceholder: 'my-project', rootLabel: 'Root folder', rootPlaceholder: '/absolute/path/root', gitInit: 'Initialize a git repository (git init)', commandLabel: 'Command', create: 'Create', creating: 'Creating…', }, workspace: { open: 'Open IDE', files: 'Files', changes: 'Changes', noChanges: 'No changes', changesTruncated: 'Too many changes. List truncated.', terminal: 'Terminal', editor: 'Editor', diff: 'Diff', noFileOpen: 'No file open', noFileHint: 'Pick a file in the tree to edit it, or a changed file to view its diff.', noSession: 'No session here', noSessionHint: 'Start a session on this worktree from the dashboard to get a terminal.', }, ide: { projects: 'Projects', addProject: 'Add project', noProjects: 'No project yet. Add one to get started.', noWorktrees: 'No worktree', activity: { explorer: 'Explorer', git: 'Git', sessions: 'Sessions', groups: 'Groups', }, startClaude: 'Start Claude', startBash: 'Start bash', noFileOpen: 'No file open', noFileHint: 'Pick a file in the tree to edit it, or a changed file to view its diff.', terminals: 'Terminals', noTerminal: 'No terminal open', noTerminalHint: 'Open a Claude session from the tree to attach a terminal here.', comingSoon: 'Coming soon', ready: 'Ready', menu: { newWorktree: 'New worktree', workOnMain: 'Work on main branch', openTerminal: 'Open terminal', commit: 'Commit changes', push: 'Push', promote: 'Promote to main', deleteWorktree: 'Delete worktree', prune: 'Prune worktrees', hideRepo: 'Hide repository', showRepo: 'Show repository', removeRepo: 'Remove repository', addLocal: 'Add local repository', cloneRemote: 'Clone remote repository', newSession: 'New session', newProject: 'New project', newGroup: 'New group', launchGroup: 'Launch group session', editGroup: 'Edit composition', deleteGroup: 'Delete group', }, }, editor: { save: 'Save', unsaved: 'Unsaved changes', conflict: 'This file changed on disk since you opened it.', reload: 'Reload', overwrite: 'Overwrite', }, diff: { binary: 'Binary file. No text diff.', tooLarge: 'Diff too large to display.', noChanges: 'No changes in this file.', }, git: { ahead: 'commits ahead', behind: 'commits behind', staged: 'staged', unstaged: 'unstaged', conflicts: 'conflicts', }, commit: { staged: 'Staged', changes: 'Changes', stage: 'Stage', unstage: 'Unstage', stageAll: 'Stage all', unstageAll: 'Unstage all', discard: 'Discard', confirmDiscard: 'Confirm discard (destructive)', amend: 'Amend last commit', amendPlaceholder: 'New message (leave empty to keep the previous one)', messagePlaceholder: 'Commit message…', commit: 'Commit', push: 'Push', fetch: 'Fetch', pull: 'Pull (fast-forward)', pullRebase: 'Pull --rebase', alreadyPushed: 'Cannot amend: this commit was already pushed.', }, gitconn: { title: 'Git connections', hint: 'Connect to Gitea, GitLab or GitHub to clone private repositories. Tokens are encrypted at rest and never shown again.', empty: 'No connection yet.', addConnection: 'Add a connection', add: 'Add', service: 'Service', authType: 'Authentication', pat: 'Personal access token', appPassword: 'App password', label: 'Label', labelPlaceholder: 'e.g. My Gitea', baseUrl: 'Instance URL', username: 'Username', usernamePlaceholder: 'optional', token: 'Token', password: 'Password', test: 'Test', added: 'Connection added', deleted: 'Connection deleted', testOk: 'Connected as {user}', testFailed: 'Connection failed: {error}', }, clone: { button: 'Clone', title: 'Clone a repository', noCredential: 'No git connection configured.', goSettings: 'Add one in Settings', credential: 'Connection', search: 'Search', searchPlaceholder: 'Filter repositories…', private: 'private', noRepos: 'No repository found.', more: 'Load more', dest: 'Destination folder', destPlaceholder: '/path/to/clone', destHint: 'Must be inside a configured scan folder; the folder is created by the clone.', clone: 'Clone', starting: 'Starting…', cloning: 'Cloning…', done: 'Clone complete', failed: 'Clone failed', back: 'Back', }, 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.', fullscreen: 'Fullscreen', exitFullscreen: 'Exit fullscreen', maximize: 'Maximize', restore: 'Restore', openFullscreen: 'Open fullscreen', group: 'Group', covers: 'covers', }, 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…', }, nav: { ide: 'IDE', worktrees: 'Worktrees', sessions: 'Sessions', groups: 'Groups', settings: 'Settings', help: 'Help', more: 'More', gitea: 'Source code', buymeacoffee: 'Buy me a coffee', waiting: 'waiting', }, theme: { label: 'Theme', dark: 'Dark', light: 'Light', system: 'System', toggle: 'Toggle theme', }, controls: { searchPlaceholder: 'Search…', results: 'no result | 1 result | {n} results', sortBy: 'Sort by', filters: 'Filters', clearAll: 'Clear', }, sort: { asc: 'Ascending', desc: 'Descending', session: { state: 'State', recent: 'Most recent', clients: 'Clients', cwd: 'Directory', command: 'Command', }, worktree: { main: 'Main first', branch: 'Branch', dirty: 'Changes', ahead: 'Ahead', behind: 'Behind', activity: 'Activity', }, repo: { label: 'Name', created: 'Created', worktrees: 'Worktrees', activity: 'Activity', }, group: { label: 'Name', created: 'Created', repos: 'Repositories', activeSessions: 'Active sessions', }, }, filter: { state: { label: 'State', live: 'Live', waiting: 'Waiting', busy: 'Busy', idle: 'Available', exited: 'Exited', resumable: 'Resumable', }, command: { label: 'Command', }, source: { label: 'Source', managed: 'Managed', discovered: 'Discovered', }, repo: { label: 'Repository', }, worktree: { dirtiness: 'Changes', dirty: 'Dirty', clean: 'Clean', session: 'Session', with: 'With session', without: 'Without session', flags: 'Flags', locked: 'Locked', prunable: 'Prunable', }, }, pagination: { prev: 'Previous', next: 'Next', pageOf: 'Page {page} / {pageCount}', perPage: 'Per page', all: 'All', }, palette: { placeholder: 'Jump to repo, worktree, session, group…', empty: 'No match', hint: '↑↓ navigate · ↵ open · esc close', types: { repo: 'Repo', worktree: 'Worktree', session: 'Session', group: 'Group', action: 'Action', }, actions: { newSession: 'New session', addRepo: 'Add repo', newGroup: 'New group', }, }, toast: { sessionCreated: 'Session started', sessionKilled: 'Session killed', sessionResumed: 'Session resumed', sessionForked: 'Session forked', sessionHidden: 'Session hidden', sessionUnhidden: 'Session shown', sessionsHidden: 'no session hidden | 1 session hidden | {n} sessions hidden', sessionArchived: 'Session archived', sessionUnarchived: 'Session unarchived', repoAdded: 'Repository added', repoRemoved: 'Repository removed', worktreeCreated: 'Worktree created', worktreeDeleted: 'Worktree deleted', pruned: 'Worktrees pruned', pushed: 'Pushed', groupCreated: 'Group created', groupUpdated: 'Group updated', groupDeleted: 'Group deleted', groupSessionLaunched: 'Group session started', groupSessionPartial: 'Group session started ({n} repo(s) skipped)', projectCreated: 'Project created', genericError: 'Something went wrong', dismiss: 'Dismiss', }, attention: { title: 'Needs attention', count: 'no session waiting | 1 session waiting | {n} sessions waiting', empty: 'Nothing waiting', }, settings: { title: 'Settings', // Préférences preferences: 'Preferences', preferencesHint: 'These apply to this browser only.', language: 'Language', notifications: 'Notifications', notificationsEnabled: 'Enabled. You will be notified when a session needs input.', notificationsDisabled: 'Disabled.', enableNotifications: 'Enable notifications', disableNotifications: 'Disable notifications', testNotification: 'Send a test', testSent: 'Test notification sent', pushUnsupported: 'Push needs HTTPS (e.g. Tailscale Serve); on iOS, install the app to your home screen first.', // Accès & sécurité security: 'Access & security', securityHint: 'Tokens grant full access to this server. Create one per device and revoke any you no longer use.', tokens: 'Access tokens', newTokenLabel: 'Label', newTokenPlaceholder: 'e.g. phone, laptop', createToken: 'Create token', tokenCreated: 'Token created', copyTokenHint: 'Copy this token now. For security it will never be shown again.', copy: 'Copy', copied: 'Copied', current: 'current', created: 'Created {date}', lastUsed: 'last used {date}', neverUsed: 'never used', revoke: 'Revoke', confirmRevoke: 'Confirm revoke', tokenRevoked: 'Token revoked', lastTokenError: 'You cannot revoke the last active token. Create another one first.', save: 'Save', saved: 'Saved', // Sécurité & conformité compliance: 'Security & compliance', complianceHint: 'Export or erase the data tied to your token (GDPR), and review the audit log of sensitive operations.', exportData: 'Export my data', refreshAudit: 'Audit log', deleteData: 'Erase my data', deleteConfirm: 'Erase the data tied to your token (push subscriptions) and revoke this token? This cannot be undone.', deleteDone: 'Your data has been erased.', // Découverte des dépôts 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.', 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.', 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.', claudeBinStatusBadPath: 'The configured path is not an executable file.', claudeBinSourceConfigured: 'configured', claudeBinSourcePath: 'PATH', claudeBinPathLabel: 'Binary path override', claudeBinPathHint: 'Absolute path to the `claude` executable. Leave empty to auto-detect via PATH. Takes effect on the next session.', claudeBinPathPlaceholder: 'e.g. /home/you/.local/bin/claude', claudeHomeLabel: 'Claude home directory', claudeHomeHint: 'Override the ~/.claude location (transcripts & session registry). Applies on the next daemon restart.', claudeHomePlaceholder: 'e.g. /home/you/.claude', // Serveur (lecture seule) server: 'Server', serverHint: 'Set at startup via CLI flags. Changing them requires restarting the daemon.', version: 'Version', port: 'Port', bind: 'Bind address', allowedOrigins: 'Allowed origins', dataDir: 'Data directory', vapidPublicKey: 'VAPID public key', vapidContact: 'VAPID contact', none: 'none', flagHint: 'CLI flag: {flag}', // Support support: 'Support', supportHint: 'Arboretum is a free, self-funded side project. If it saves you time, you can support its development.', supportCta: 'Buy me a coffee', }, help: { title: 'Help', intro: 'Everything Arboretum can do, and how to use it.', searchPlaceholder: 'Search help…', noMatch: 'No matching topic', }, };