const en = { nav: { library: 'Library', search: 'Search & download', downloads: 'Downloads', upload: 'Upload', storage: 'Storage', playlists: 'Playlists', newPlaylist: 'New playlist', admin: 'Admin', settings: 'Settings', administration: 'Administration', }, conn: { connected: 'Connected', connecting: 'Connecting…', disconnected: 'Offline', error: 'Unreachable', manage: 'Connection — manage instances', cached: 'Showing last-seen data', }, user: { online: 'online', offline: 'offline', signOut: 'Sign out', }, connect: { domains: { title: 'Saved instances', addPlaceholder: 'https://your-server.example.com', addButton: 'Add instance', selected: 'Selected', use: 'Use', forgetTitle: 'Remove this instance', }, removeDialog: { title: 'Remove cached data?', description: 'This removes "{{name}}" from your saved instances and clears its cached data on this device.', cancel: 'Cancel', logout: 'Just log out', removeAndLogout: 'Remove data & log out', }, login: { title: 'Log in to {{name}}', registerTitle: 'Sign up for {{name}}', username: 'Username', password: 'Password', passwordHint: 'At least 8 characters.', submit: 'Log in', submitting: 'Logging in…', registerSubmit: 'Sign up', registering: 'Signing up…', noAccount: "Don't have an account?", registerLink: 'Sign up', haveAccount: 'Already have an account?', signInLink: 'Log in', }, errors: { unreachable: "Can't reach this server. Check the URL and that it's online.", badCredentials: 'Incorrect username or password.', generic: 'Sign-in failed. Please try again.', usernameTaken: 'That username is already taken.', passwordTooShort: 'Password must be at least 8 characters.', registrationDisabled: 'Registration is disabled on this server.', registerFailed: 'Could not create the account. Please try again.', }, }, library: { title: 'Library', searchPlaceholder: 'Search library…', tabs: { tracks: 'Tracks', albums: 'Albums', artists: 'Artists', }, playAll: '▶ Play all ({{count}})', empty: { tracks: { title: 'No tracks', description: 'Your library is empty. Start by downloading some music.', }, albums: { title: 'No albums', description: 'No albums in library.', }, artists: { title: 'No artists', description: 'No artists in library.', }, }, albumCard: { tracks: '{{count}} tracks', tracksDuration: '{{count}} tracks · {{duration}}', }, artistRow: { meta: '{{albumCount}} albums · {{trackCount}} tracks', }, }, album: { type: 'Album', play: '▶ Play', error: 'Failed to load album', tracksError: 'Failed to load tracks', empty: { title: 'No tracks', description: 'This album has no tracks.', }, }, playlist: { type: 'Playlist', play: '▶ Play', error: 'Failed to load playlist', tracksError: 'Failed to load tracks', empty: { title: 'Empty playlist', description: 'This playlist has no tracks yet.', }, }, player: { nothingPlaying: 'Nothing playing', previous: 'Previous', next: 'Next', pause: 'Pause', play: 'Play', streaming: 'Streaming', local: 'Local', queue: 'Play queue', mute: 'Mute', unmute: 'Unmute', }, queue: { title: 'Play queue', shuffle: 'Shuffle queue', loop: 'Repeat current track', clear: 'Clear queue', close: 'Close', from: 'From {{source}}', radio: 'Radio · {{source}}', nextUp: 'Next up', empty: 'Queue is empty', radioActive: 'Radio active', mixing: '∞ mixing', familiar: 'Familiar', new: 'New', loadingMore: 'Loading more from radio…', doubleClickPlay: 'Double-click to play', removeFromQueue: 'Remove from queue', menu: { options: 'Track options', playNow: 'Play now', moveNext: 'Move next', info: 'Track info', remove: 'Remove from queue', }, }, track: { menu: { options: 'Track options', playNow: 'Play now', playNext: 'Play next', addToQueue: 'Add to queue', info: 'Track info', addToPlaylist: 'Add to playlist…', editMetadata: 'Edit metadata', download: 'Download', delete: 'Delete', }, }, trackInfo: { title: 'Track info', open: 'View track info', close: 'Close', notFound: 'Track not found', play: 'Play', addToQueue: 'Queue', editMetadata: 'Edit metadata', liked: 'Liked', trackOf: 'No. {{n}} of {{total}}', kbps: '{{n}} kbps', sections: { status: 'Status', general: 'General', file: 'File', identifiers: 'Identifiers', }, fields: { artist: 'Artist', album: 'Album', trackNumber: 'Track', disc: 'Disc', year: 'Year', genre: 'Genre', duration: 'Duration', format: 'Format', bitrate: 'Bitrate', size: 'Size', source: 'Source', added: 'Added', enriched: 'Enriched', trackId: 'Track ID', albumId: 'Album ID', artistId: 'Artist ID', }, }, common: { error: 'Something went wrong', retry: 'Retry', comingSoon: 'Coming soon', back: 'Back', }, pages: { admin: 'Admin', settings: 'Settings', downloads: 'Downloads', search: 'Search & Download', storage: 'Storage', login: 'Sign in', artist: 'Artist', playlists: 'Playlists', upload: 'Upload files', metadata: 'Edit metadata', metadataBatch: 'Edit metadata (batch)', storageMaintenance: 'Storage maintenance', queue: 'Play queue', }, settings: { language: 'Language', theme: 'Theme', themeDark: 'Dark', themeLight: 'Light', tabs: { profile: 'Profile', playback: 'Playback', scrobbling: 'Scrobbling', instance: 'Instance', }, }, admin: { userDetail: 'User', tabs: { users: 'Users', sources: 'Sources', instance: 'Instance', }, }, notFound: { title: 'Page not found', description: "This screen doesn't exist yet.", backToLibrary: 'Back to library', }, upload: { title: 'Upload files', dropzone: { title: 'Drag & drop audio files here', hint: 'or click to choose files — one or many at a time', button: 'Choose files', }, queueTitle: 'Uploads ({{completed}}/{{total}})', clearCompleted: 'Clear completed', retry: 'Retry', editMetadata: 'Edit metadata', metadataPending: 'Uploaded tracks land as “Unknown Artist” with metadata pending — enrich them afterwards.', unknownArtist: 'Unknown Artist · metadata pending', status: { queued: 'Queued', uploading: 'Uploading', done: 'Uploaded', duplicate: 'Already in library', error: 'Failed', }, }, metadata: { status: { pending: 'Enriching…', enriched: 'Enriched', failed: 'No match', manual: 'Manual', }, statusHint: { pending: 'Identifying metadata…', enriched: 'Metadata identified', failed: 'Metadata could not be identified', manual: 'Edited manually — not auto-updated', }, }, metadataEditor: { error: 'Failed to load track', saved: 'Metadata saved.', saveError: 'Failed to save metadata.', save: 'Save', fields: { title: 'Title', artist: 'Artist', album: 'Album', year: 'Year', genre: 'Genre', trackNumber: 'Track number', }, autoEnrich: { title: 'AcoustID lookup', hint: 'Identify this track by audio fingerprint.', findMatches: 'Find matches', reEnrich: 'Re-run enrichment', enqueued: 'Enrichment queued — refresh in a moment.', error: 'Could not look up matches.', noMatches: 'No matches found.', }, matches: { use: 'Use', unknownTitle: 'Unknown title', }, diff: { title: 'Apply this match?', noChanges: 'No changes from current values.', cancel: 'Cancel', apply: 'Apply', }, }, } as const; export default en; type DeepString = { [K in keyof T]: T[K] extends Record ? DeepString : string; }; export type Translations = DeepString;