332 lines
8.4 KiB
TypeScript
332 lines
8.4 KiB
TypeScript
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<T> = {
|
|
[K in keyof T]: T[K] extends Record<string, unknown>
|
|
? DeepString<T[K]>
|
|
: string;
|
|
};
|
|
export type Translations = DeepString<typeof en>;
|