Réglages : préférences (langue, notifications push + test), gestion complète des tokens d'accès (liste/création/révocation, garde anti lock-out sur le dernier token), URL Gitea configurable, infos serveur en lecture seule (port/bind/origines/VAPID + flags CLI). Aide : documentation bilingue EN/FR de toutes les fonctionnalités, avec recherche. Icône Gitea (lien externe) dans la nav (sidebar + MoreSheet mobile). Backend : routes /api/v1/auth/tokens (GET/POST/DELETE) + tokenId dans /me ; routes/settings.ts (GET/PATCH, allow-list stricte gitea_url, aucun secret exposé, URL validée http/https anti-XSS) ; AuthService.listTokens/revokeToken (transaction). Front : NavItem gère les liens externes, nav primaire/secondaire, store settings, vues SettingsView/HelpView. 236 tests verts (+15 nouveaux : auth-tokens, settings-routes). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
359 lines
9.9 KiB
TypeScript
359 lines
9.9 KiB
TypeScript
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',
|
|
},
|
|
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…',
|
|
},
|
|
nav: {
|
|
worktrees: 'Worktrees',
|
|
sessions: 'Sessions',
|
|
groups: 'Groups',
|
|
settings: 'Settings',
|
|
help: 'Help',
|
|
more: 'More',
|
|
gitea: 'Open Gitea',
|
|
waiting: 'waiting',
|
|
},
|
|
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: 'Idle',
|
|
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',
|
|
repoAdded: 'Repository added',
|
|
repoRemoved: 'Repository removed',
|
|
worktreeCreated: 'Worktree created',
|
|
worktreeDeleted: 'Worktree deleted',
|
|
pruned: 'Worktrees pruned',
|
|
groupCreated: 'Group created',
|
|
groupUpdated: 'Group updated',
|
|
groupDeleted: 'Group deleted',
|
|
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.',
|
|
// Intégrations
|
|
integrations: 'Integrations',
|
|
gitea: 'Gitea',
|
|
giteaUrlLabel: 'Gitea instance URL',
|
|
giteaUrlPlaceholder: 'https://git.example.com',
|
|
giteaUrlHint: 'Adds a shortcut icon to the navigation. Leave empty to hide it.',
|
|
save: 'Save',
|
|
saved: 'Saved',
|
|
// 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}',
|
|
},
|
|
help: {
|
|
title: 'Help',
|
|
intro: 'Everything Arboretum can do, and how to use it.',
|
|
searchPlaceholder: 'Search help…',
|
|
noMatch: 'No matching topic',
|
|
},
|
|
};
|