import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

// English Translations
const enTranslation = {
  sidebar: {
    library: 'Library',
    mainstage: 'Mainstage',
    newReleases: 'New Releases',
    allAlbums: 'All Albums',
    randomAlbums: 'Random Albums',
    artists: 'Artists',
    randomMix: 'Random Mix',
    favorites: 'Favorites',
    nowPlaying: 'Now Playing',
    system: 'System',
    statistics: 'Statistics',
    settings: 'Settings',
    help: 'Help',
    expand: 'Expand Sidebar',
    collapse: 'Collapse Sidebar',
    updateAvailable: 'Update available',
    updateReady: '{{version}} is ready',
    updateLink: 'Go to release →',
    downloadingTracks: 'Caching {{n}} tracks…',
    offlineLibrary: 'Offline Library',
    genres: 'Genres',
    playlists: 'Playlists',
    radio: 'Internet Radio',
  },
  home: {
    hero: 'Featured',
    starred: 'Personal Favorites',
    recent: 'Recently Added',
    mostPlayed: 'Most Played',
    recentlyPlayed: 'Recently Played',
    discover: 'Discover',
    loadMore: 'Load More',
    discoverMore: 'Discover More',
    discoverArtists: 'Discover Artists',
    discoverArtistsMore: 'All Artists'
  },
  hero: {
    eyebrow: 'Featured Album',
    playAlbum: 'Play Album',
    enqueue: 'Enqueue',
    enqueueTooltip: 'Add entire album to queue',
  },
  search: {
    placeholder: 'Search for artist, album or song…',
    noResults: 'No results for "{{query}}"',
    artists: 'Artists',
    albums: 'Albums',
    songs: 'Songs',
    clearLabel: 'Clear search',
    title: 'Search',
    resultsFor: 'Results for "{{query}}"',
    album: 'Album',
    advanced: 'Advanced Search',
    advancedSearchTerm: 'Search term',
    advancedSearchPlaceholder: 'Title, album, artist…',
    advancedGenre: 'Genre',
    advancedAllGenres: 'All genres',
    advancedYear: 'Year',
    advancedYearFrom: 'from',
    advancedYearTo: 'to',
    advancedAll: 'All',
    advancedSearch: 'Search',
    advancedEmpty: 'Enter a search term or select a filter to begin.',
    advancedNoResults: 'No results found.',
    advancedGenreNote: 'Songs are randomly selected from this genre.',
  },
  nowPlaying: {
    tooltip: 'Who is listening?',
    title: 'Who is listening?',
    loading: 'Loading…',
    nobody: 'Nobody is currently listening.',
    minutesAgo: '{{n}}m ago',
    nothingPlaying: 'Nothing playing yet. Start a track!',
    aboutArtist: 'About the Artist',
    fromAlbum: 'From this Album',
    viewAlbum: 'View Album',
    goToArtist: 'Go to Artist',
    readMore: 'Read more',
    showLess: 'Show less',
    genreInfo: 'Genre',
    trackInfo: 'Track Info',
  },
  contextMenu: {
    playNow: 'Play Now',
    playNext: 'Play Next',
    addToQueue: 'Add to Queue',
    enqueueAlbum: 'Enqueue Album',
    startRadio: 'Start Radio',
    lfmLove: 'Love on Last.fm',
    lfmUnlove: 'Unlove on Last.fm',
    favorite: 'Favorite',
    favoriteArtist: 'Favorite Artist',
    favoriteAlbum: 'Favorite Album',
    unfavorite: 'Remove from Favorites',
    unfavoriteArtist: 'Remove Artist from Favorites',
    unfavoriteAlbum: 'Remove Album from Favorites',
    removeFromQueue: 'Remove from Queue',
    openAlbum: 'Open Album',
    goToArtist: 'Go to Artist',
    download: 'Download (ZIP)',
    addToPlaylist: 'Add to Playlist',
    songInfo: 'Song Info',
  },
  albumDetail: {
    back: 'Back',
    playAll: 'Play All',
    enqueue: 'Enqueue',
    enqueueTooltip: 'Add entire album to queue',
    artistBio: 'Artist Bio',
    download: 'Download (ZIP)',
    downloading: 'Loading…',
    cacheOffline: 'Make available offline',
    offlineCached: 'Available offline',
    offlineDownloading: 'Caching… ({{n}}/{{total}})',
    removeOffline: 'Remove offline cache',
    offlineStorageFull: 'Offline storage full (limit: {{mb}} MB). Free up space by deleting an album from your Offline Library, or increase the limit in Settings.',
    offlineStorageGoToLibrary: 'Offline Library',
    offlineStorageGoToSettings: 'Settings',
    favoriteAdd: 'Add to Favorites',
    favoriteRemove: 'Remove from Favorites',
    favorite: 'Favorite',
    noBio: 'No biography available.',
    moreByArtist: 'More by {{artist}}',
    tracksCount: '{{n}} Tracks',
    goToArtist: 'Go to {{artist}}',
    moreLabelAlbums: 'More albums on {{label}}',
    trackTitle: 'Title',
    trackArtist: 'Artist',
    trackGenre: 'Genre',
    trackFormat: 'Format',
    trackFavorite: 'Favorite',
    trackRating: 'Rating',
    trackDuration: 'Duration',
    trackTotal: 'Total',
    columns: 'Columns',
    notFound: 'Album not found.',
    bioModal: 'Artist Biography',
    bioClose: 'Close',
    ratingLabel: 'Rating',
    enlargeCover: 'Enlarge',
  },
  artistDetail: {
    back: 'Back',
    albums: 'Albums',
    album: 'Album',
    playAll: 'Play All',
    shuffle: 'Shuffle',
    radio: 'Radio',
    loading: 'Loading…',
    noRadio: 'No similar tracks found for this artist.',
    notFound: 'Artist not found.',
    albumsBy: 'Albums by {{name}}',
    topTracks: 'Top Tracks',
    noAlbums: 'No albums found.',
    trackTitle: 'Title',
    trackAlbum: 'Album',
    trackDuration: 'Duration',
    favoriteAdd: 'Add to Favorites',
    favoriteRemove: 'Remove from Favorites',
    favorite: 'Favorite',
    albumCount_one: '{{count}} Album',
    albumCount_other: '{{count}} Albums',
    openedInBrowser: 'Opened in browser',
    featuredOn: 'Also Featured On',
    similarArtists: 'Similar Artists',
    cacheOffline: 'Save discography offline',
    offlineCached: 'Discography cached',
    offlineDownloading: 'Caching… ({{done}}/{{total}} albums)',
  },
  favorites: {
    title: 'Favorites',
    empty: "You haven't saved any favorites yet.",
    artists: 'Artists',
    albums: 'Albums',
    songs: 'Songs',
    enqueueAll: 'Add all to queue',
    playAll: 'Play all',
    removeSong: 'Remove from favorites',
  },
  randomAlbums: {
    title: 'Random Albums',
    refresh: 'Refresh',
  },
  genres: {
    title: 'Genres',
    genreCount: 'Genres',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    loading: 'Loading genres…',
    empty: 'No genres found.',
    albumsLoading: 'Loading albums…',
    albumsEmpty: 'No albums found for this genre.',
    loadMore: 'Load more',
    back: 'Back',
  },
  randomMix: {
    title: 'Random Mix',
    remix: 'Remix',
    remixTooltip: 'Load new random songs',
    playAll: 'Play All',
    trackTitle: 'Title',
    trackArtist: 'Artist',
    trackAlbum: 'Album',
    trackFavorite: 'Favorite',
    trackDuration: 'Duration',
    favoriteAdd: 'Add to Favorites',
    favoriteRemove: 'Remove from Favorites',
    play: 'Play',
    trackGenre: 'Genre',
    excludeAudiobooks: 'Exclude audiobooks & radio plays',
    excludeAudiobooksDesc: 'Matches keywords against genre, title, album, and artist — e.g. Hörbuch, Audiobook, Spoken Word, …',
    genreBlocked: 'Keyword blocked',
    genreAddedToBlacklist: 'Added to filter list',
    genreAlreadyBlocked: 'Already blocked',
    artistBlocked: 'Artist blocked',
    artistAddedToBlacklist: 'Artist added to filter list',
    artistClickHint: 'Click to block this artist',
    blacklistToggle: 'Keyword Filter',
    genreMixTitle: 'Genre Mix',
    genreMixDesc: 'Top 20 genres by song count — click to load a random mix',
    genreMixLoadMore: 'Load 10 more',
    genreMixNoGenres: 'No genres found on server.',
    shuffleGenres: 'Show different genres',
    filterPanelTitle: 'Filters',
    filterPanelDesc: 'Click a genre tag or artist name in the tracklist below to block it from future mixes.',
    genreClickHint: 'Click a genre tag to add it\nas a filter keyword.\nMatches genre, title, album & artist.',
  },
  albums: {
    title: 'All Albums',
    sortByName: 'A–Z (Album)',
    sortByArtist: 'A–Z (Artist)',
    sortNewest: 'Newest first',
    sortRandom: 'Random',
  },
  artists: {
    title: 'Artists',
    search: 'Search…',
    all: 'All',
    gridView: 'Grid view',
    listView: 'List view',
    imagesOn: 'Artist images on — may increase network and system load',
    imagesOff: 'Artist images off — showing initials only',
    loadMore: 'Load more',
    notFound: 'No artists found.',
    albumCount_one: '{{count}} Album',
    albumCount_other: '{{count}} Albums',
  },
  login: {
    subtitle: 'Your Navidrome Desktop Player',
    serverName: 'Server Name (optional)',
    serverNamePlaceholder: 'My Navidrome',
    serverUrl: 'Server URL',
    serverUrlPlaceholder: '192.168.1.100:4533 or music.example.com',
    username: 'Username',
    usernamePlaceholder: 'admin',
    password: 'Password',
    showPassword: 'Show password',
    hidePassword: 'Hide password',
    connect: 'Connect',
    connecting: 'Connecting…',
    connected: 'Connected!',
    error: 'Connection failed – please check your details.',
    urlRequired: 'Please enter a server URL.',
    savedServers: 'Saved Servers',
    addNew: 'Or add a new server',
  },
  connection: {
    connected: 'Connected',
    connectedTo: 'Connected to {{server}}',
    disconnected: 'Disconnected',
    disconnectedFrom: 'Cannot reach {{server}} — click to check settings',
    checking: 'Connecting…',
    extern: 'Extern',
    offlineTitle: 'No server connection',
    offlineSubtitle: 'Cannot reach {{server}}. Check your network or server.',
    offlineModeBanner: 'Offline Mode — playing from local cache',
    offlineLibraryTitle: 'Offline Library',
    offlineLibraryEmpty: 'No albums cached yet. Go online, open an album and click "Make available offline".',
    offlineAlbumCount: '{{n}} album',
    offlineAlbumCount_plural: '{{n}} albums',
    offlineFilterAll: 'All',
    offlineFilterAlbums: 'Albums',
    offlineFilterPlaylists: 'Playlists',
    offlineFilterArtists: 'Discographies',
    retry: 'Retry',
    lastfmConnected: 'Last.fm connected as @{{user}}',
    lastfmSessionInvalid: 'Session invalid — click to re-connect',
  },
  common: {
    albums: 'Albums',
    album: 'Album',
    loading: 'Loading…',
    loadingMore: 'Loading…',
    loadingPlaylists: 'Loading Playlists…',
    noAlbums: 'No albums found.',
    downloading: 'Downloading…',
    downloadZip: 'Download (ZIP)',
    back: 'Back',
    cancel: 'Cancel',
    save: 'Save',
    delete: 'Delete',
    use: 'Use',
    add: 'Add',
    active: 'Active',
    download: 'Download',
    chooseDownloadFolder: 'Choose download folder',
    noFolderSelected: 'No folder selected',
    rememberDownloadFolder: 'Remember this folder',
    filterGenre: 'Genre Filter',
    filterSearchGenres: 'Search genres…',
    filterNoGenres: 'No genres match',
    filterClear: 'Clear',
    bulkSelected: '{{count}} selected',
    bulkAddToPlaylist: 'Add to Playlist',
    bulkRemoveFromPlaylist: 'Remove from Playlist',
    bulkClear: 'Clear selection',
    updaterAvailable: 'Update available',
    updaterVersion: 'v{{version}} is ready',
    updaterInstall: 'Install & Restart',
    updaterDownloading: 'Downloading…',
    updaterInstalling: 'Installing…',
    updaterDownload: 'Download from GitHub',
    updaterExperimentalHint: 'Auto-update is still in development',
  },
  settings: {
    title: 'Settings',
    language: 'Language',
    languageEn: 'English',
    languageDe: 'German',
    languageFr: 'French',
    languageNl: 'Dutch',
    languageZh: 'Chinese',
    font: 'Font',
    theme: 'Theme',
    appearance: 'Appearance',
    servers: 'Servers',
    serverName: 'Server Name',
    serverUrl: 'Server URL',
    serverUsername: 'Username',
    serverPassword: 'Password',
    addServer: 'Add Server',
    addServerTitle: 'Add New Server',
    useServer: 'Use',
    deleteServer: 'Delete',
    noServers: 'No servers saved.',
    serverActive: 'Active',
    confirmDeleteServer: 'Delete server "{{name}}"?',
    serverConnecting: 'Connecting…',
    serverConnected: 'Connected!',
    serverFailed: 'Connection failed.',
    testBtn: 'Test Connection',
    testingBtn: 'Testing…',
    serverCompatible: 'Compatible with: Navidrome · Gonic · Airsonic · Subsonic',
    connected: 'Connected',
    failed: 'Failed',
    eqTitle: 'Equalizer',
    eqEnabled: 'Enable Equalizer',
    eqPreset: 'Preset',
    eqPresetCustom: 'Custom',
    eqPresetBuiltin: 'Built-in Presets',
    eqPresetCustomGroup: 'My Presets',
    eqSavePreset: 'Save as Preset',
    eqPresetName: 'Preset name…',
    eqDeletePreset: 'Delete preset',
    eqResetBands: 'Reset to Flat',
    eqPreGain: 'Pre-gain',
    eqResetPreGain: 'Reset pre-gain',
    eqAutoEqTitle: 'AutoEQ Headphone Lookup',
    eqAutoEqPlaceholder: 'Search headphone / IEM model…',
    eqAutoEqSearching: 'Searching…',
    eqAutoEqNoResults: 'No results found',
    eqAutoEqError: 'Search failed',
    eqAutoEqRateLimit: 'GitHub rate limit reached — try again in a minute',
    eqAutoEqFetchError: 'Failed to fetch EQ profile',
    lfmTitle: 'Last.fm',
    lfmConnect: 'Connect with Last.fm',
    lfmConnecting: 'Waiting for authorisation…',
    lfmConfirm: 'I have authorised the app',
    lfmConnected: 'Connected as',
    lfmDisconnect: 'Disconnect',
    lfmConnectDesc: 'Connect your Last.fm account to enable scrobbling and Now Playing updates directly from Psysonic — no Navidrome configuration required.',
    lfmOpenBrowser: 'A browser window will open. Authorise Psysonic on Last.fm, then click the button below.',
    lfmScrobbles: '{{n}} scrobbles',
    lfmMemberSince: 'Member since {{year}}',
    scrobbleEnabled: 'Scrobbling enabled',
    scrobbleDesc: 'Send songs to Last.fm after 50% playtime',
    behavior: 'App Behavior',
    cacheTitle: 'Max. Storage Size',
    cacheDesc: 'Cover art and artist images. When full, the oldest entries are removed automatically. Offline albums are not auto-removed, but will be deleted when clearing the cache manually.',
    cacheUsed: 'Used: {{images}} images · {{offline}} offline tracks',
    cacheClearBtn: 'Clear Cache',
    cacheClearWarning: 'This will also remove all offline albums from the library.',
    cacheClearConfirm: 'Clear Everything',
    cacheClearCancel: 'Cancel',
    showArtistImages: 'Show Artist Images',
    showArtistImagesDesc: 'Load and display artist images in the Artists overview. Disabled by default to reduce server disk I/O and network load on large libraries.',
    minimizeToTray: 'Minimize to Tray',
    minimizeToTrayDesc: 'When closing the window, keep Psysonic running in the system tray instead of quitting.',
    discordRichPresence: 'Discord Rich Presence',
    discordRichPresenceDesc: 'Show the currently playing track on your Discord profile. Requires Discord to be running.',
    nowPlayingEnabled: 'Show in Now Playing',
    nowPlayingEnabledDesc: 'Broadcast your currently playing track to the server\'s live listener view. Disable to stop sending playback data.',
    downloadsTitle: 'Download Folder',
    downloadsDefault: 'Default Downloads Folder',
    pickFolder: 'Select',
    pickFolderTitle: 'Select Download Folder',
    clearFolder: 'Clear download folder',
    logout: 'Logout',
    aboutTitle: 'About Psysonic',
    aboutDesc: 'A modern desktop music player for Subsonic-compatible servers (Navidrome, Gonic, and others). Built on Tauri v2 with a native Rust audio engine — lightweight and fast, yet packed with features: waveform seekbar, synchronized lyrics, Last.fm integration, 10-band EQ, crossfade, gapless playback, Replay Gain, genre browsing, and a large library of themes.',
    aboutFeatures: 'Multi-server · Last.fm scrobbling & love · Fullscreen Ambient Stage · Waveform seek · Synced lyrics · 10-band EQ · Crossfade & Gapless · Replay Gain · Genres · 63 themes · 5 languages',
    aboutLicense: 'License',
    aboutLicenseText: 'GNU GPL v3 — free to use, modify, and distribute under the same license.',
    aboutRepo: 'Source Code on GitHub',
    aboutVersion: 'Version',
    aboutBuiltWith: 'Built with Tauri · React · TypeScript · Rust/rodio',
    aboutAiCredit: 'Developed with the support of Claude Code by Anthropic',
    aboutContributorsLabel: 'Contributors',
    aboutSpecialThanksLabel: 'Special Thanks',
    changelog: 'Changelog',
    showChangelogOnUpdate: "Show 'What's New' on update",
    showChangelogOnUpdateDesc: "Automatically show what's new when a new version is launched for the first time.",
    randomMixTitle: 'Random Mix',
    randomMixBlacklistTitle: 'Custom Filter Keywords',
    randomMixBlacklistDesc: 'Songs are excluded when any keyword matches their genre, title, album, or artist (active when the checkbox above is on).',
    randomMixBlacklistPlaceholder: 'Add keyword…',
    randomMixBlacklistAdd: 'Add',
    randomMixBlacklistEmpty: 'No custom keywords added yet.',
    randomMixHardcodedTitle: 'Built-in keywords (active when checkbox is on)',
    tabPlayback: 'Playback',
    tabLibrary: 'Library',
    tabAppearance: 'Appearance',
    homeCustomizerTitle: 'Home Page',
    sidebarTitle: 'Sidebar',
    sidebarReset: 'Reset to default',
    sidebarDrag: 'Drag to reorder',
    sidebarFixed: 'Always visible',
    tabShortcuts: 'Shortcuts',
    tabServer: 'Server',
    tabAbout: 'About',
    shortcutsReset: 'Reset to defaults',
    shortcutListening: 'Press a key…',
    shortcutUnbound: '—',
    globalShortcutsTitle: 'Global Shortcuts',
    globalShortcutsNote: 'Work system-wide even when Psysonic is in the background. Requires Ctrl, Alt, or Super as a modifier.',
    shortcutClear: 'Clear',
    shortcutPlayPause: 'Play / Pause',
    shortcutNext: 'Next track',
    shortcutPrev: 'Previous track',
    shortcutVolumeUp: 'Volume up',
    shortcutVolumeDown: 'Volume down',
    shortcutSeekForward: 'Seek forward 10s',
    shortcutSeekBackward: 'Seek backward 10s',
    shortcutToggleQueue: 'Toggle queue',
    shortcutFullscreenPlayer: 'Fullscreen player',
    shortcutNativeFullscreen: 'Native fullscreen',
    playbackTitle: 'Playback',
    replayGain: 'Replay Gain',
    replayGainDesc: 'Normalize track volume using ReplayGain metadata',
    replayGainMode: 'Mode',
    replayGainTrack: 'Track',
    replayGainAlbum: 'Album',
    crossfade: 'Crossfade',
    crossfadeDesc: 'Fade between tracks',
    crossfadeSecs: '{{n}}s',
    notWithGapless: 'Not available while Gapless is active',
    notWithCrossfade: 'Not available while Crossfade is active',
    gapless: 'Gapless Playback',
    gaplessDesc: 'Pre-buffer next track to eliminate gaps between songs',
    infiniteQueue: 'Infinite Queue',
    infiniteQueueDesc: 'Automatically append random tracks when the queue runs out',
    experimental: 'Experimental',
  },
  changelog: {
    modalTitle: "What's New",
    dontShowAgain: "Don't show again",
    close: 'Got it',
  },
  help: {
    title: 'Help',
    s1: 'Getting Started',
    q1: 'Which servers are compatible?',
    a1: 'Psysonic works with any Subsonic-compatible server: Navidrome, Gonic, Subsonic, Airsonic, and others. Navidrome is the recommended choice.',
    q2: 'How do I connect to my server?',
    a2: 'Open Settings and click "Add Server". Enter the server URL (e.g. 192.168.1.100:4533), your username, and password. Psysonic tests the connection before saving — nothing is stored if the connection fails.',
    q3: 'Can I use multiple servers?',
    a3: 'Yes. You can add as many servers as you like in Settings and switch between them at any time. Only one server is active at a time.',
    s2: 'Playback',
    q4: 'How do I play music?',
    a4: 'Double-click any track to play it. On album and artist pages, use "Play All" to start the whole album. You can also drag tracks into the queue panel.',
    q5: 'What keyboard shortcuts are available?',
    a5: 'Space = Play / Pause · Escape = Close fullscreen player. Media keys (Play/Pause, Next, Previous) work on all platforms. On Linux, use the player bar buttons for media keys. In-app shortcuts and system-wide global shortcuts can be customized in Settings → Keyboard Shortcuts / Global Shortcuts.',
    q6: 'What is the queue?',
    a6: 'The queue shows all upcoming tracks. Open it with the panel icon in the top-right header (next to the Now Playing indicator). You can reorder tracks by dragging, shuffle with the shuffle button, and save the queue as a playlist.',
    q7: 'How do I open the fullscreen player?',
    a7: 'Click the album art thumbnail in the player bar at the bottom, or the expand icon next to it. Press Escape to close it again.',
    q8: 'How does repeat work?',
    a8: 'Click the repeat button in the player bar to cycle through: Off → Repeat All → Repeat One.',
    s3: 'Library',
    q9: 'How do I download an album?',
    a9: 'Open an album\'s detail page and click "Download (ZIP)". The server compresses the album into a ZIP file first — for large albums or lossless files (FLAC / WAV) this can take a moment before the download actually starts. This is normal: the progress bar appears once the server finishes zipping and the transfer begins.',
    q10: 'How do I star / favorite tracks and albums?',
    a10: 'Click the star icon on any track row or on the album header. Starred items appear in the Favorites section in the sidebar.',
    q11: 'What is the hero carousel on the home page?',
    a11: 'The banner at the top of the home page randomly picks albums from your library and rotates through them every 10 seconds. Click the dots to jump to a specific one, or click the banner to open the album.',
    s4: 'Settings',
    q12: 'How do I change the theme?',
    a12: 'Settings → Theme. Choose from a large selection of themes across 8 groups: Psysonic Themes, Mediaplayer, Operating Systems, Games, Movies, Series, Social Media, and Open Source Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'How do I change the language?',
    a13: 'Settings → Language. English, German, French, Dutch, and Chinese are supported.',
    q15: 'How do I set a download folder?',
    a15: 'Settings → App Behavior → Download Folder. Pick any folder — downloaded albums are saved there as ZIP files. Without a custom folder, your browser\'s default downloads location is used.',
    s5: 'Scrobbling',
    q16: 'How does scrobbling work?',
    a16: 'Psysonic scrobbles directly to Last.fm — no Navidrome configuration needed. Connect your Last.fm account in Settings → Last.fm and enable scrobbling there.',
    q17: 'When is a scrobble sent?',
    a17: 'A scrobble is submitted after you\'ve listened to 50% of a track.',
    q22: 'What is the waveform in the player bar?',
    a22: 'The waveform seekbar replaces the classic progress slider. Click anywhere on it to jump to that position, or drag to scrub. The played portion glows with a blue-to-mauve gradient, the buffered range appears slightly brighter, and the unplayed portion is faded.',
    q24: 'Can I shuffle the queue?',
    a24: 'Yes. Open the queue panel and click the shuffle icon in the queue header. The currently playing track stays at position 1 — all remaining tracks are randomly reordered.',
    q25: 'Do Last.fm and Wikipedia links on artist pages open in a browser?',
    a25: 'Yes — they open in your default system browser. The button briefly shows a confirmation label when clicked.',
    s7: 'Random Mix',
    q26: 'What is Random Mix?',
    a26: 'Random Mix builds a playlist of random tracks from your entire library. Open it via "Random Mix" in the sidebar and click "New Mix". You can adjust the track count before generating.',
    q27: 'What is the Keyword Filter?',
    a27: 'The Keyword Filter excludes tracks whose genre, title, or album name contains specific words. Audiobooks are filtered automatically. Add custom keywords in Settings → Random Mix, or click any genre tag in the track list to add it instantly.',
    q28: 'What is the Super Genre Mix?',
    a28: 'The Super Genre Mix groups your library into broad categories (Rock, Metal, Electronic, Jazz, Classical, etc.) and builds a focused mix from that style. Select a category chip below the track list. Results appear progressively as each sub-genre is fetched.',
    s6: 'Troubleshooting',
    q18: 'Cover art and artist images load slowly.',
    a18: 'Images are fetched from your server\'s disk on first load and then cached locally for 30 days. If your server\'s storage is slow, the first visit to a page may take a moment. Subsequent visits will be instant.',
    q19: 'The connection test fails.',
    a19: 'Check the URL including the port (e.g. http://192.168.1.100:4533). Make sure no firewall blocks the connection. Try http:// instead of https:// on a local network. Also verify that your username and password are correct.',
    q20: 'No audio on Linux.',
    a20: 'Psysonic is available as .deb (Ubuntu/Debian), .rpm (Fedora/RHEL), and via AUR on Arch/CachyOS (yay -S psysonic). There is no AppImage. If audio is missing, ensure PipeWire or PulseAudio is running.',
    q21: 'The app shows a black screen on Linux.',
    a21: 'This is usually a GPU/EGL driver issue in WebKitGTK. Launch with GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1. The AUR package and official .deb/.rpm installers set these automatically.',
    q29: 'What are Crossfade and Gapless Playback?',
    a29: 'Both are experimental audio features in Settings → Audio. Gapless pre-buffers the next track to eliminate silence between songs. Crossfade fades out the current track while fading in the next — adjust the duration (1–10 s) to taste.',
    q30: 'Does Psysonic show lyrics?',
    a30: 'Yes. Click the microphone icon in the player bar to open the Lyrics tab in the queue panel. Psysonic fetches lyrics automatically from LRCLIB. If synced lyrics are available, the active line is highlighted and scrolls in real time as the song plays. If only plain text is available, the full text is shown statically.',
    q31: 'Can I customize keyboard shortcuts?',
    a31: 'Yes. Settings → Keyboard Shortcuts lets you remap in-app actions (Play/Pause, Next, Previous, Volume Up/Down, Fullscreen, and more) to any key. Settings → Global Shortcuts lets you assign system-wide shortcuts that trigger even when Psysonic is in the background.',
    q32: 'Can I change the font?',
    a32: 'Yes. Settings → Font lets you choose from 10 fonts including IBM Plex Mono, Fira Code, JetBrains Mono, Courier Prime, and others. The selected font applies to the entire UI.',
    s8: 'Offline Mode',
    q34: 'What is Offline Mode?',
    a34: 'Offline Mode (Beta) lets you cache albums to your device so you can listen without an active server connection. Cached tracks are stored locally and played back directly from disk — no network request is made during playback.',
    q35: 'How do I cache an album for offline use?',
    a35: 'Open any album and click the download icon in the album header. Psysonic downloads all tracks in the background. Progress is shown on the button. Once cached, the icon turns green. You can view and remove cached albums in the Offline Library page (sidebar).',
    q36: 'How much storage can offline caching use?',
    a36: 'You can set a maximum cache size in Settings → Library. When the limit is reached, a warning banner appears on the album page. You can delete individual albums from the Offline Library to free up space.',
  },
  queue: {
    title: 'Queue',
    savePlaylist: 'Save Playlist',
    updatePlaylist: 'Update Playlist',
    filterPlaylists: 'Filter playlists…',
    playlistName: 'Playlist Name',
    cancel: 'Cancel',
    save: 'Save',
    loadPlaylist: 'Load Playlist',
    loading: 'Loading…',
    noPlaylists: 'No playlists found.',
    load: 'Replace queue & play',
    appendToQueue: 'Append to queue',
    delete: 'Delete',
    deleteConfirm: 'Delete playlist "{{name}}"?',
    clear: 'Clear',
    shuffle: 'Shuffle queue',
    gapless: 'Gapless',
    crossfade: 'Crossfade',
    infiniteQueue: 'Infinite Queue',
    autoAdded: '— Added automatically —',
    radioAdded: '— Radio —',
    hide: 'Hide',
    close: 'Close',
    nextTracks: 'Next Tracks',
    emptyQueue: 'The queue is empty.',
    trackSingular: 'track',
    trackPlural: 'tracks',
    showRemaining: 'Show remaining time',
    showTotal: 'Show total time',
  },
  statistics: {
    title: 'Statistics',
    recentlyPlayed: 'Recently Played',
    mostPlayed: 'Most Played Albums',
    highestRated: 'Highest Rated Albums',
    genreDistribution: 'Genre Distribution (Top 20)',
    loadMore: 'Load more',
    statArtists: 'Artists',
    statAlbums: 'Albums',
    statSongs: 'Songs',
    statGenres: 'Genres',
    genreSongs: '{{count}} Songs',
    genreAlbums: '{{count}} Albums',
    recentlyAdded: 'Recently Added',
    decadeDistribution: 'Albums by Decade',
    decadeAlbums_one: '{{count}} Album',
    decadeAlbums_other: '{{count}} Albums',
    decadeUnknown: 'Unknown',
    lfmTitle: 'Last.fm Stats',
    lfmTopArtists: 'Top Artists',
    lfmTopAlbums: 'Top Albums',
    lfmTopTracks: 'Top Tracks',
    lfmPlays: '{{count}} plays',
    lfmPeriodOverall: 'All Time',
    lfmPeriod7day: '7 Days',
    lfmPeriod1month: '1 Month',
    lfmPeriod3month: '3 Months',
    lfmPeriod6month: '6 Months',
    lfmPeriod12month: '12 Months',
    lfmNotConnected: 'Connect Last.fm in Settings to see your stats.',
    lfmRecentTracks: 'Recent Scrobbles',
    lfmNowPlaying: 'Now Playing',
    lfmJustNow: 'just now',
    lfmMinutesAgo: '{{n}}m ago',
    lfmHoursAgo: '{{n}}h ago',
    lfmDaysAgo: '{{n}}d ago',
  },
  player: {
    regionLabel: 'Music Player',
    openFullscreen: 'Open Fullscreen Player',
    fullscreen: 'Fullscreen Player',
    closeFullscreen: 'Close Fullscreen',
    closeTooltip: 'Close (Esc)',
    noTitle: 'No Title',
    stop: 'Stop',
    prev: 'Previous Track',
    play: 'Play',
    pause: 'Pause',
    next: 'Next Track',
    repeat: 'Repeat',
    repeatOff: 'Off',
    repeatAll: 'All',
    repeatOne: 'One',
    progress: 'Song Progress',
    volume: 'Volume',
    toggleQueue: 'Toggle Queue',
    lyrics: 'Lyrics',
    lyricsLoading: 'Loading lyrics…',
    lyricsNotFound: 'No lyrics found for this track',
  },
  songInfo: {
    title: 'Song Info',
    songTitle: 'Title',
    artist: 'Artist',
    album: 'Album',
    albumArtist: 'Album Artist',
    year: 'Year',
    genre: 'Genre',
    duration: 'Duration',
    track: 'Track',
    format: 'Format',
    bitrate: 'Bitrate',
    sampleRate: 'Sample Rate',
    bitDepth: 'Bit Depth',
    channels: 'Channels',
    fileSize: 'File Size',
    path: 'Path',
    replayGainTrack: 'RG Track Gain',
    replayGainAlbum: 'RG Album Gain',
    replayGainPeak: 'RG Track Peak',
    mono: 'Mono',
    stereo: 'Stereo',
  },
  playlists: {
    title: 'Playlists',
    newPlaylist: 'New Playlist',
    unnamed: 'Unnamed Playlist',
    createName: 'Playlist name…',
    create: 'Create',
    cancel: 'Cancel',
    empty: 'No playlists yet.',
    emptyPlaylist: 'This playlist is empty.',
    addFirstSong: 'Add your first song',
    notFound: 'Playlist not found.',
    songs: '{{n}} songs',
    playAll: 'Play All',
    shuffle: 'Shuffle',
    addToQueue: 'Add to Queue',
    back: 'Back to Playlists',
    deletePlaylist: 'Delete',
    confirmDelete: 'Click again to confirm',
    removeSong: 'Remove from playlist',
    addSongs: 'Add Songs',
    searchPlaceholder: 'Search your library…',
    noResults: 'No results.',
    suggestions: 'Suggested Songs',
    noSuggestions: 'No suggestions available.',
    titleBadge: 'Playlist',
    refreshSuggestions: 'New suggestions',
    addSong: 'Add to playlist',
    cacheOffline: 'Cache playlist offline',
    offlineCached: 'Playlist cached',
    offlineDownloading: 'Caching… ({{done}}/{{total}} albums)',
  },
  radio: {
    title: 'Internet Radio',
    empty: 'No radio stations configured.',
    addStation: 'Add Station',
    editStation: 'Edit',
    deleteStation: 'Delete station',
    confirmDelete: 'Click again to confirm',
    stationName: 'Station name…',
    streamUrl: 'Stream URL…',
    homepageUrl: 'Homepage URL (optional)',
    save: 'Save',
    cancel: 'Cancel',
    live: 'LIVE',
    liveStream: 'Internet Radio',
    openHomepage: 'Open homepage',
  }
};

// German Translations
const deTranslation = {
  sidebar: {
    library: 'Bibliothek',
    mainstage: 'Mainstage',
    newReleases: 'Neueste',
    allAlbums: 'Alle Alben',
    randomAlbums: 'Zufallsalben',
    artists: 'Künstler',
    randomMix: 'Zufallsmix',
    favorites: 'Favoriten',
    nowPlaying: 'Now Playing',
    system: 'System',
    statistics: 'Statistiken',
    settings: 'Einstellungen',
    help: 'Hilfe',
    expand: 'Sidebar einblenden',
    collapse: 'Sidebar ausblenden',
    updateAvailable: 'Update verfügbar',
    updateReady: '{{version}} ist bereit',
    updateLink: 'Zum Release →',
    downloadingTracks: '{{n}} Tracks werden gecacht…',
    offlineLibrary: 'Offline-Bibliothek',
    genres: 'Genres',
    playlists: 'Playlists',
    radio: 'Internetradio',
  },
  home: {
    hero: 'Featured',
    starred: 'Persönliche Favoriten',
    recent: 'Zuletzt hinzugefügt',
    mostPlayed: 'Meistgehört',
    recentlyPlayed: 'Kürzlich gespielt',
    discover: 'Entdecken',
    loadMore: 'Mehr laden',
    discoverMore: 'Mehr entdecken',
    discoverArtists: 'Künstler entdecken',
    discoverArtistsMore: 'Alle Künstler'
  },
  hero: {
    eyebrow: 'Album des Augenblicks',
    playAlbum: 'Album abspielen',
    enqueue: 'Einreihen',
    enqueueTooltip: 'Ganzes Album zur Warteschlange hinzufügen',
  },
  search: {
    placeholder: 'Suchen nach Künstler, Album oder Song…',
    noResults: 'Keine Ergebnisse für „{{query}}"',
    artists: 'Künstler',
    albums: 'Alben',
    songs: 'Songs',
    clearLabel: 'Suche leeren',
    title: 'Suche',
    resultsFor: 'Ergebnisse für „{{query}}"',
    album: 'Album',
    advanced: 'Erweiterte Suche',
    advancedSearchTerm: 'Suchbegriff',
    advancedSearchPlaceholder: 'Titel, Album, Künstler…',
    advancedGenre: 'Genre',
    advancedAllGenres: 'Alle Genres',
    advancedYear: 'Jahr',
    advancedYearFrom: 'von',
    advancedYearTo: 'bis',
    advancedAll: 'Alle',
    advancedSearch: 'Suchen',
    advancedEmpty: 'Suchbegriff eingeben oder Filter wählen, um zu beginnen.',
    advancedNoResults: 'Keine Ergebnisse gefunden.',
    advancedGenreNote: 'Songs werden zufällig aus dem Genre gewählt.',
  },
  nowPlaying: {
    tooltip: 'Wer hört was?',
    title: 'Wer hört was?',
    loading: 'Lädt…',
    nobody: 'Gerade hört niemand Musik.',
    minutesAgo: 'vor {{n}}m',
    nothingPlaying: 'Noch nichts am Laufen. Leg einen Track auf!',
    aboutArtist: 'Über den Künstler',
    fromAlbum: 'Aus diesem Album',
    viewAlbum: 'Album öffnen',
    goToArtist: 'Zum Künstler',
    readMore: 'Mehr lesen',
    showLess: 'Weniger anzeigen',
    genreInfo: 'Genre',
    trackInfo: 'Track-Info',
  },
  contextMenu: {
    playNow: 'Direkt abspielen',
    playNext: 'Als Nächstes abspielen',
    addToQueue: 'Zur Warteschlange hinzufügen',
    enqueueAlbum: 'Ganzes Album einreihen',
    startRadio: 'Radio starten',
    lfmLove: 'Auf Last.fm liken',
    lfmUnlove: 'Last.fm-Like entfernen',
    favorite: 'Favorisieren',
    favoriteArtist: 'Künstler favorisieren',
    favoriteAlbum: 'Album favorisieren',
    unfavorite: 'Aus Favoriten entfernen',
    unfavoriteArtist: 'Künstler aus Favoriten entfernen',
    unfavoriteAlbum: 'Album aus Favoriten entfernen',
    removeFromQueue: 'Diesen Song entfernen',
    openAlbum: 'Album öffnen',
    goToArtist: 'Zum Künstler',
    download: 'Herunterladen (ZIP)',
    addToPlaylist: 'Zur Playlist hinzufügen',
    songInfo: 'Song-Infos',
  },
  albumDetail: {
    back: 'Zurück',
    playAll: 'Alle abspielen',
    enqueue: 'Einreihen',
    enqueueTooltip: 'Ganzes Album zur Warteschlange hinzufügen',
    artistBio: 'Künstler-Bio',
    download: 'Download (ZIP)',
    downloading: 'Lade…',
    cacheOffline: 'Offline verfügbar machen',
    offlineCached: 'Offline verfügbar',
    offlineDownloading: 'Wird gecacht… ({{n}}/{{total}})',
    removeOffline: 'Offline-Cache löschen',
    offlineStorageFull: 'Offline-Speicher voll (Limit: {{mb}} MB). Lösche ein Album aus der Offline-Bibliothek oder erhöhe das Limit in den Einstellungen.',
    offlineStorageGoToSettings: 'Einstellungen',
    offlineStorageGoToLibrary: 'Offline-Bibliothek',
    favoriteAdd: 'Zu Favoriten hinzufügen',
    favoriteRemove: 'Aus Favoriten entfernen',
    favorite: 'Als Favorit',
    noBio: 'Keine Biografie verfügbar.',
    moreByArtist: 'Mehr von {{artist}}',
    tracksCount: '{{n}} Tracks',
    goToArtist: 'Zu {{artist}} wechseln',
    moreLabelAlbums: 'Weitere Alben von {{label}} anzeigen',
    trackTitle: 'Titel',
    trackArtist: 'Interpret',
    trackGenre: 'Genre',
    trackFormat: 'Format',
    trackFavorite: 'Favorit',
    trackRating: 'Bewertung',
    trackDuration: 'Dauer',
    trackTotal: 'Gesamt',
    columns: 'Spalten',
    notFound: 'Album nicht gefunden.',
    bioModal: 'Künstler-Biografie',
    bioClose: 'Schließen',
    ratingLabel: 'Bewertung',
    enlargeCover: 'Vergrößern',
  },
  artistDetail: {
    back: 'Zurück',
    albums: 'Alben',
    album: 'Album',
    playAll: 'Alle abspielen',
    shuffle: 'Zufallswiedergabe',
    radio: 'Radio',
    loading: 'Lädt…',
    noRadio: 'Keine ähnlichen Titel für diesen Künstler gefunden.',
    notFound: 'Künstler nicht gefunden.',
    albumsBy: 'Alben von {{name}}',
    topTracks: 'Beliebteste Titel',
    noAlbums: 'Keine Alben gefunden.',
    trackTitle: 'Titel',
    trackAlbum: 'Album',
    trackDuration: 'Dauer',
    favoriteAdd: 'Zu Favoriten hinzufügen',
    favoriteRemove: 'Aus Favoriten entfernen',
    favorite: 'Als Favorit',
    albumCount_one: '{{count}} Album',
    albumCount_other: '{{count}} Alben',
    openedInBrowser: 'Im Browser geöffnet',
    featuredOn: 'Auch enthalten auf',
    similarArtists: 'Ähnliche Künstler',
    cacheOffline: 'Diskografie offline speichern',
    offlineCached: 'Diskografie gecacht',
    offlineDownloading: 'Wird gecacht… ({{done}}/{{total}} Alben)',
  },
  favorites: {
    title: 'Favoriten',
    empty: 'Du hast noch keine Favoriten gespeichert.',
    artists: 'Künstler',
    albums: 'Alben',
    songs: 'Songs',
    enqueueAll: 'Alle in die Warteschlange',
    playAll: 'Alle abspielen',
    removeSong: 'Aus Favoriten entfernen',
  },
  randomAlbums: {
    title: 'Zufallsalben',
    refresh: 'Neu laden',
  },
  genres: {
    title: 'Genres',
    genreCount: 'Genres',
    albumCount_one: '{{count}} Album',
    albumCount_other: '{{count}} Alben',
    loading: 'Genres werden geladen…',
    empty: 'Keine Genres gefunden.',
    albumsLoading: 'Alben werden geladen…',
    albumsEmpty: 'Keine Alben in diesem Genre gefunden.',
    loadMore: 'Mehr laden',
    back: 'Zurück',
  },
  randomMix: {
    title: 'Zufallsmix',
    remix: 'Neu mixen',
    remixTooltip: 'Neue Songs laden',
    playAll: 'Alle abspielen',
    trackTitle: 'Titel',
    trackArtist: 'Künstler',
    trackAlbum: 'Album',
    trackFavorite: 'Favorit',
    trackDuration: 'Dauer',
    favoriteAdd: 'Zu Favoriten hinzufügen',
    favoriteRemove: 'Aus Favoriten entfernen',
    play: 'Abspielen',
    trackGenre: 'Genre',
    excludeAudiobooks: 'Hörbücher & Hörspiele ausschließen',
    excludeAudiobooksDesc: 'Prüft Keywords gegen Genre, Titel, Album und Künstler — z. B. Hörbuch, Audiobook, Spoken Word, …',
    genreBlocked: 'Keyword gesperrt',
    genreAddedToBlacklist: 'Zur Filterliste hinzugefügt',
    genreAlreadyBlocked: 'Bereits gesperrt',
    artistBlocked: 'Künstler gesperrt',
    artistAddedToBlacklist: 'Künstler zur Filterliste hinzugefügt',
    artistClickHint: 'Klicken um diesen Künstler zu sperren',
    blacklistToggle: 'Keyword-Filter',
    genreMixTitle: 'Genre-Mix',
    genreMixDesc: 'Top 20 Genres nach Songanzahl — klicken für einen Zufallsmix',
    genreMixLoadMore: '10 weitere laden',
    genreMixNoGenres: 'Keine Genres auf dem Server gefunden.',
    shuffleGenres: 'Andere Genres anzeigen',
    filterPanelTitle: 'Filter',
    filterPanelDesc: 'Genre-Tag oder Künstlername in der Liste anklicken, um ihn aus zukünftigen Mixes auszuschließen.',
    genreClickHint: 'Genre-Tag anklicken,\num es als Filter-Keyword hinzuzufügen.\nPrüft Genre, Titel, Album & Künstler.',
  },
  albums: {
    title: 'Alle Alben',
    sortByName: 'A–Z (Album)',
    sortByArtist: 'A–Z (Künstler)',
    sortNewest: 'Neueste zuerst',
    sortRandom: 'Zufällig',
  },
  artists: {
    title: 'Künstler',
    search: 'Suchen…',
    all: 'Alle',
    gridView: 'Gitteransicht',
    listView: 'Listenansicht',
    imagesOn: 'Künstlerbilder aktiv — kann Netzwerk- und Systemlast erhöhen',
    imagesOff: 'Künstlerbilder deaktiviert — zeigt nur Initialen',
    loadMore: 'Mehr laden',
    notFound: 'Keine Künstler gefunden.',
    albumCount_one: '{{count}} Album',
    albumCount_other: '{{count}} Alben',
  },
  login: {
    subtitle: 'Dein Navidrome Desktop Player',
    serverName: 'Server-Name (optional)',
    serverNamePlaceholder: 'Mein Navidrome',
    serverUrl: 'Server-URL',
    serverUrlPlaceholder: '192.168.1.100:4533 oder music.example.com',
    username: 'Benutzername',
    usernamePlaceholder: 'admin',
    password: 'Passwort',
    showPassword: 'Passwort anzeigen',
    hidePassword: 'Passwort verstecken',
    connect: 'Verbinden',
    connecting: 'Verbinde…',
    connected: 'Verbunden!',
    error: 'Verbindung fehlgeschlagen – bitte Daten prüfen.',
    urlRequired: 'Bitte Server-URL eingeben.',
    savedServers: 'Gespeicherte Server',
    addNew: 'Oder neuen Server hinzufügen',
  },
  connection: {
    connected: 'Verbunden',
    connectedTo: 'Verbunden mit {{server}}',
    disconnected: 'Getrennt',
    disconnectedFrom: '{{server}} nicht erreichbar — klicken für Einstellungen',
    checking: 'Verbinde…',
    extern: 'Extern',
    offlineTitle: 'Keine Serververbindung',
    offlineSubtitle: '{{server}} ist nicht erreichbar. Prüfe Netzwerk oder Server.',
    offlineModeBanner: 'Offline-Modus — Wiedergabe aus lokalem Cache',
    offlineLibraryTitle: 'Offline-Bibliothek',
    offlineLibraryEmpty: 'Noch keine Alben gecacht. Online gehen, Album öffnen und "Offline verfügbar machen" klicken.',
    offlineAlbumCount: '{{n}} Album',
    offlineAlbumCount_plural: '{{n}} Alben',
    offlineFilterAll: 'Alle',
    offlineFilterAlbums: 'Alben',
    offlineFilterPlaylists: 'Playlists',
    offlineFilterArtists: 'Diskografien',
    retry: 'Erneut versuchen',
    lastfmConnected: 'Last.fm verbunden als @{{user}}',
    lastfmSessionInvalid: 'Session ungültig — klicken zum Neu-Verbinden',
  },
  common: {
    albums: 'Alben',
    album: 'Album',
    loading: 'Lade…',
    loadingMore: 'Lade…',
    loadingPlaylists: 'Lade Playlists…',
    noAlbums: 'Keine Alben gefunden.',
    downloading: 'Lade…',
    downloadZip: 'Download (ZIP)',
    back: 'Zurück',
    cancel: 'Abbrechen',
    save: 'Speichern',
    delete: 'Löschen',
    use: 'Verwenden',
    add: 'Hinzufügen',
    active: 'Aktiv',
    download: 'Herunterladen',
    chooseDownloadFolder: 'Download-Ordner wählen',
    noFolderSelected: 'Kein Ordner ausgewählt',
    rememberDownloadFolder: 'Ordner merken',
    filterGenre: 'Genre-Filter',
    filterSearchGenres: 'Genres suchen…',
    filterNoGenres: 'Keine Genres gefunden',
    filterClear: 'Zurücksetzen',
    bulkSelected: '{{count}} ausgewählt',
    bulkAddToPlaylist: 'Zur Playlist hinzufügen',
    bulkRemoveFromPlaylist: 'Aus Playlist entfernen',
    bulkClear: 'Auswahl aufheben',
    updaterAvailable: 'Update verfügbar',
    updaterVersion: 'v{{version}} ist bereit',
    updaterInstall: 'Installieren & Neustart',
    updaterDownloading: 'Wird geladen…',
    updaterInstalling: 'Wird installiert…',
    updaterDownload: 'Von GitHub herunterladen',
    updaterExperimentalHint: 'Automatische Updates sind noch in Entwicklung',
  },
  settings: {
    title: 'Einstellungen',
    language: 'Sprache',
    languageEn: 'Englisch',
    languageDe: 'Deutsch',
    languageFr: 'Französisch',
    languageNl: 'Niederländisch',
    languageZh: 'Chinesisch',
    font: 'Schriftart',
    theme: 'Design',
    appearance: 'Darstellung',
    servers: 'Server',
    serverName: 'Server-Name',
    serverUrl: 'Server-URL',
    serverUsername: 'Benutzername',
    serverPassword: 'Passwort',
    addServer: 'Server hinzufügen',
    addServerTitle: 'Neuen Server hinzufügen',
    useServer: 'Verwenden',
    deleteServer: 'Löschen',
    noServers: 'Keine Server gespeichert.',
    serverActive: 'Aktiv',
    confirmDeleteServer: 'Server „{{name}}" löschen?',
    serverConnecting: 'Verbinde…',
    serverConnected: 'Verbunden!',
    serverFailed: 'Verbindung fehlgeschlagen.',
    testBtn: 'Verbindung testen',
    testingBtn: 'Teste…',
    serverCompatible: 'Kompatibel mit: Navidrome · Gonic · Airsonic · Subsonic',
    connected: 'Verbunden',
    failed: 'Fehlgeschlagen',
    eqTitle: 'Equalizer',
    eqEnabled: 'Equalizer aktivieren',
    eqPreset: 'Preset',
    eqPresetCustom: 'Benutzerdefiniert',
    eqPresetBuiltin: 'Eingebaute Presets',
    eqPresetCustomGroup: 'Meine Presets',
    eqSavePreset: 'Als Preset speichern',
    eqPresetName: 'Preset-Name…',
    eqDeletePreset: 'Preset löschen',
    eqResetBands: 'Auf Flat zurücksetzen',
    eqPreGain: 'Vorverstärkung',
    eqResetPreGain: 'Vorverstärkung zurücksetzen',
    eqAutoEqTitle: 'AutoEQ Kopfhörer-Suche',
    eqAutoEqPlaceholder: 'Kopfhörer / IEM Modell suchen…',
    eqAutoEqSearching: 'Suche…',
    eqAutoEqNoResults: 'Keine Ergebnisse gefunden',
    eqAutoEqError: 'Suche fehlgeschlagen',
    eqAutoEqRateLimit: 'GitHub Rate-Limit erreicht — in einer Minute erneut versuchen',
    eqAutoEqFetchError: 'EQ-Profil konnte nicht geladen werden',
    lfmTitle: 'Last.fm',
    lfmConnect: 'Mit Last.fm verbinden',
    lfmConnecting: 'Warte auf Bestätigung…',
    lfmConfirm: 'Ich habe die App autorisiert',
    lfmConnected: 'Verbunden als',
    lfmDisconnect: 'Trennen',
    lfmConnectDesc: 'Verbinde deinen Last.fm Account, um Scrobbling und Now-Playing-Updates direkt aus Psysonic heraus zu aktivieren — keine Navidrome-Konfiguration erforderlich.',
    lfmOpenBrowser: 'Es öffnet sich ein Browserfenster. Autorisiere Psysonic auf Last.fm und klicke dann unten auf den Button.',
    lfmScrobbles: '{{n}} Scrobbles',
    lfmMemberSince: 'Dabei seit {{year}}',
    scrobbleEnabled: 'Scrobbling aktiviert',
    scrobbleDesc: 'Songs nach 50% Laufzeit an Last.fm senden',
    behavior: 'App-Verhalten',
    cacheTitle: 'Max. Speichergröße',
    cacheDesc: 'Cover und Künstlerbilder. Wenn voll, werden die ältesten Einträge automatisch entfernt. Offline-Alben werden nicht automatisch gelöscht, aber beim manuellen Cache leeren entfernt.',
    cacheUsed: 'Belegt: {{images}} Bilder · {{offline}} Offline-Tracks',
    cacheClearBtn: 'Cache leeren',
    cacheClearWarning: 'Alle Offline-Alben werden damit aus der Bibliothek entfernt.',
    cacheClearConfirm: 'Alles löschen',
    cacheClearCancel: 'Abbrechen',
    showArtistImages: 'Künstlerbilder anzeigen',
    showArtistImagesDesc: 'Lädt und zeigt Künstlerbilder in der Künstlerübersicht. Standardmäßig deaktiviert, um Server-I/O und Netzwerklast bei großen Bibliotheken zu reduzieren.',
    minimizeToTray: 'Im Tray minimieren',
    minimizeToTrayDesc: 'Beim Schließen des Fensters läuft Psysonic weiter im System-Tray statt zu beenden.',
    discordRichPresence: 'Discord Rich Presence',
    discordRichPresenceDesc: 'Zeigt den aktuell gespielten Titel im Discord-Profil an. Discord muss dafür geöffnet sein.',
    nowPlayingEnabled: 'Im Livefenster anzeigen',
    nowPlayingEnabledDesc: 'Überträgt den aktuell gespielten Titel an die Livehörer-Ansicht des Servers. Deaktivieren, um keine Wiedergabedaten zu senden.',
    downloadsTitle: 'Download-Ordner',
    downloadsDefault: 'Standard-Downloads-Ordner',
    pickFolder: 'Auswählen',
    pickFolderTitle: 'Download-Ordner auswählen',
    clearFolder: 'Download-Ordner löschen',
    logout: 'Abmelden',
    aboutTitle: 'Über Psysonic',
    aboutDesc: 'Ein moderner Desktop-Musikplayer für Subsonic-kompatible Server (Navidrome, Gonic u. a.). Basiert auf Tauri v2 mit einer nativen Rust-Audio-Engine — schlank und schnell, aber vollgepackt mit Features: Wellenform-Seekbar, synchronisierte Lyrics, Last.fm-Integration, 10-Band-EQ, Crossfade, nahtlose Wiedergabe, Replay Gain, Genre-Browser und eine große Theme-Bibliothek.',
    aboutFeatures: 'Multi-Server · Last.fm Scrobbling & Love · Vollbild Ambient Stage · Wellenform-Seek · Sync-Lyrics · 10-Band-EQ · Crossfade & Gapless · Replay Gain · Genres · 63 Themes · 5 Sprachen',
    aboutLicense: 'Lizenz',
    aboutLicenseText: 'GNU GPL v3 — kostenlos nutzbar, veränderbar und unter gleicher Lizenz weiterzugeben.',
    aboutRepo: 'Quellcode auf GitHub',
    aboutVersion: 'Version',
    aboutBuiltWith: 'Gebaut mit Tauri · React · TypeScript · Rust/rodio',
    aboutAiCredit: 'Mit freundlicher Unterstützung von Claude Code by Anthropic',
    aboutContributorsLabel: 'Mitwirkende',
    aboutSpecialThanksLabel: 'Besonderer Dank',
    changelog: 'Changelog',
    showChangelogOnUpdate: "'Was ist neu' bei Update anzeigen",
    showChangelogOnUpdateDesc: 'Zeigt automatisch die Neuerungen an, wenn eine neue Version zum ersten Mal gestartet wird.',
    randomMixTitle: 'Zufallsmix',
    randomMixBlacklistTitle: 'Eigene Filter-Keywords',
    randomMixBlacklistDesc: 'Songs werden ausgeschlossen, wenn ein Keyword auf Genre, Titel, Album oder Künstler zutrifft (aktiv wenn die Checkbox oben an ist).',
    randomMixBlacklistPlaceholder: 'Keyword hinzufügen…',
    randomMixBlacklistAdd: 'Hinzufügen',
    randomMixBlacklistEmpty: 'Noch keine eigenen Keywords hinzugefügt.',
    randomMixHardcodedTitle: 'Eingebaute Keywords (aktiv wenn Checkbox an)',
    tabPlayback: 'Wiedergabe',
    tabLibrary: 'Bibliothek',
    tabAppearance: 'Darstellung',
    homeCustomizerTitle: 'Startseite',
    sidebarTitle: 'Seitenleiste',
    sidebarReset: 'Zurücksetzen',
    sidebarDrag: 'Ziehen zum Umsortieren',
    sidebarFixed: 'Immer sichtbar',
    tabShortcuts: 'Tastenkürzel',
    tabServer: 'Server',
    shortcutsReset: 'Auf Standard zurücksetzen',
    shortcutListening: 'Taste drücken…',
    shortcutUnbound: '—',
    shortcutClear: 'Löschen',
    globalShortcutsTitle: 'Globale Shortcuts',
    globalShortcutsNote: 'Funktionieren systemweit, auch wenn Psysonic im Hintergrund läuft. Mindestens Ctrl, Alt oder Super als Modifier erforderlich.',
    shortcutPlayPause: 'Wiedergabe / Pause',
    shortcutNext: 'Nächster Titel',
    shortcutPrev: 'Vorheriger Titel',
    shortcutVolumeUp: 'Lautstärke erhöhen',
    shortcutVolumeDown: 'Lautstärke verringern',
    shortcutSeekForward: '10s vorspulen',
    shortcutSeekBackward: '10s zurückspulen',
    shortcutToggleQueue: 'Warteschlange ein-/ausblenden',
    shortcutFullscreenPlayer: 'Vollbild-Player',
    shortcutNativeFullscreen: 'Nativer Vollbildmodus',
    tabAbout: 'Info',
    playbackTitle: 'Wiedergabe',
    replayGain: 'Replay Gain',
    replayGainDesc: 'Lautstärke mit ReplayGain-Metadaten normalisieren',
    replayGainMode: 'Modus',
    replayGainTrack: 'Track',
    replayGainAlbum: 'Album',
    crossfade: 'Crossfade',
    crossfadeDesc: 'Überblendung zwischen Tracks',
    crossfadeSecs: '{{n}}s',
    notWithGapless: 'Nicht verfügbar wenn Nahtlose Wiedergabe aktiv ist',
    notWithCrossfade: 'Nicht verfügbar wenn Crossfade aktiv ist',
    gapless: 'Nahtlose Wiedergabe',
    gaplessDesc: 'Nächsten Track vorpuffern um Lücken zwischen Songs zu vermeiden',
    infiniteQueue: 'Endlose Warteschlange',
    infiniteQueueDesc: 'Automatisch Zufallstitel anhängen wenn die Warteschlange leer wird',
    experimental: 'Experimentell',
  },
  changelog: {
    modalTitle: 'Was ist neu',
    dontShowAgain: 'Nicht mehr anzeigen',
    close: 'Verstanden',
  },
  help: {
    title: 'Hilfe',
    s1: 'Erste Schritte',
    q1: 'Welche Server sind kompatibel?',
    a1: 'Psysonic funktioniert mit jedem Subsonic-kompatiblen Server: Navidrome, Gonic, Subsonic, Airsonic und anderen. Navidrome ist die empfohlene Wahl.',
    q2: 'Wie verbinde ich mich mit meinem Server?',
    a2: 'Öffne die Einstellungen und klicke auf "Server hinzufügen". Gib die Server-URL (z. B. 192.168.1.100:4533), Benutzername und Passwort ein. Psysonic testet die Verbindung vor dem Speichern — bei Fehler wird nichts gespeichert.',
    q3: 'Kann ich mehrere Server verwenden?',
    a3: 'Ja. Du kannst beliebig viele Server in den Einstellungen hinzufügen und jederzeit zwischen ihnen wechseln. Immer ist nur ein Server aktiv.',
    s2: 'Wiedergabe',
    q4: 'Wie spiele ich Musik ab?',
    a4: 'Doppelklick auf einen Track startet die Wiedergabe. Auf Album- und Künstlerseiten gibt es "Alle abspielen". Tracks lassen sich auch per Drag & Drop in die Warteschlange ziehen.',
    q5: 'Welche Tastenkürzel gibt es?',
    a5: 'Leertaste = Play / Pause · Escape = Vollbild schließen. Medientasten (Play/Pause, Weiter, Zurück) funktionieren auf allen Plattformen. Unter Linux bitte die Buttons in der Playerleiste nutzen. In-App-Kürzel und systemweite globale Shortcuts können in Einstellungen → Tastenkürzel / Globale Shortcuts angepasst werden.',
    q6: 'Was ist die Warteschlange?',
    a6: 'Die Warteschlange zeigt alle kommenden Tracks. Öffnen mit dem Panel-Icon oben rechts im Header (neben dem Now-Playing-Indikator). Tracks per Drag & Drop umsortieren, mit dem Shuffle-Button mischen oder als Playlist speichern.',
    q7: 'Wie öffne ich den Vollbild-Player?',
    a7: 'Klick auf das Album-Cover unten in der Playerleiste oder auf das Expand-Icon daneben. Mit Escape wieder schließen.',
    q8: 'Wie funktioniert die Wiederholfunktion?',
    a8: 'Klick auf den Wiederhol-Button in der Playerleiste, um zwischen den Modi zu wechseln: Aus → Alles wiederholen → Einen wiederholen.',
    s3: 'Bibliothek',
    q9: 'Wie lade ich ein Album herunter?',
    a9: 'Auf der Album-Detailseite auf "Download (ZIP)" klicken. Der Server packt das Album zunächst in eine ZIP-Datei — bei großen Alben oder verlustfreien Dateien (FLAC / WAV) kann es einen Moment dauern, bevor der Download tatsächlich startet. Das ist normal: Der Fortschrittsbalken erscheint erst, wenn der Server fertig ist und die Übertragung beginnt.',
    q10: 'Wie markiere ich Tracks und Alben als Favoriten?',
    a10: 'Das Stern-Icon auf einem Track oder im Album-Header anklicken. Markierte Einträge erscheinen im Bereich "Favoriten" in der Seitenleiste.',
    q11: 'Was ist das Karussell auf der Startseite?',
    a11: 'Das Banner oben auf der Startseite wählt zufällige Alben aus der Bibliothek und rotiert alle 10 Sekunden weiter. Mit den Punkten kann man manuell springen, Klick auf das Banner öffnet das Album.',
    s4: 'Einstellungen',
    q12: 'Wie ändere ich das Theme?',
    a12: 'Einstellungen → Design. Eine große Auswahl an Themes in 8 Gruppen: Psysonic Themes, Mediaplayer, Betriebssysteme, Spiele, Filme, Serien, Social Media und Open-Source-Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'Wie ändere ich die Sprache?',
    a13: 'Einstellungen → Sprache. Englisch, Deutsch, Französisch, Niederländisch und Chinesisch werden unterstützt.',
    q15: 'Wie lege ich einen Download-Ordner fest?',
    a15: 'Einstellungen → App-Verhalten → Download-Ordner. Beliebigen Ordner wählen — heruntergeladene Alben werden dort als ZIP gespeichert. Ohne eigenen Ordner landet alles im Standard-Downloads-Ordner.',
    s5: 'Scrobbling',
    q16: 'Wie funktioniert Scrobbling?',
    a16: 'Psysonic scrobbled direkt zu Last.fm — keine Navidrome-Konfiguration nötig. Last.fm-Konto in Einstellungen → Last.fm verbinden und Scrobbling dort aktivieren.',
    q17: 'Wann wird ein Scrobble gesendet?',
    a17: 'Ein Scrobble wird übermittelt, wenn 50 % eines Tracks gehört wurden.',
    q22: 'Was ist die Waveform in der Playerleiste?',
    a22: 'Die Waveform-Leiste ersetzt den klassischen Fortschrittsbalken. Klick auf eine beliebige Stelle zum Springen, ziehen zum Scrubben. Der gespielte Teil leuchtet in einem Blau-Mauve-Farbverlauf, der gepufferte Bereich erscheint etwas heller, der ungespielter Teil ist abgeblendet.',
    q24: 'Kann ich die Warteschlange mischen?',
    a24: 'Ja. Die Warteschlange öffnen und auf das Shuffle-Icon im Header klicken. Der aktuell laufende Track bleibt an Position 1 — alle restlichen Tracks werden zufällig neu geordnet.',
    q25: 'Öffnen Last.fm- und Wikipedia-Links auf Künstlerseiten im Browser?',
    a25: 'Ja — sie öffnen sich im Standard-Systembrowser. Der Button zeigt kurz eine Bestätigungsmeldung beim Klick.',
    s7: 'Zufallsmix',
    q26: 'Was ist der Zufallsmix?',
    a26: 'Der Zufallsmix erstellt eine Playlist aus zufälligen Tracks deiner gesamten Bibliothek. Über "Zufallsmix" in der Seitenleiste erreichbar, dann "Neuer Mix" klicken. Die Anzahl der Tracks ist vor der Generierung einstellbar.',
    q27: 'Was ist der Keyword-Filter?',
    a27: 'Der Keyword-Filter schließt Tracks aus, deren Genre, Titel oder Album bestimmte Wörter enthält. Hörbücher werden automatisch gefiltert. Eigene Keywords in Einstellungen → Zufallsmix hinzufügen oder per Klick auf ein Genre-Tag direkt in der Trackliste.',
    q28: 'Was ist der Super-Genre-Mix?',
    a28: 'Der Super-Genre-Mix fasst die Bibliothek in übergeordnete Kategorien zusammen (Rock, Metal, Electronic, Jazz, Klassik usw.) und erstellt daraus einen fokussierten Mix. Einen Kategorie-Chip unterhalb der Trackliste auswählen. Ergebnisse erscheinen schrittweise, während die einzelnen Sub-Genres geladen werden.',
    s6: 'Problemlösung',
    q18: 'Cover und Künstlerbilder laden langsam.',
    a18: 'Bilder werden beim ersten Aufruf vom Server geholt und dann 30 Tage lokal gecacht. Bei langsamen Server-Festplatten kann der erste Seitenaufruf einen Moment dauern. Danach geht alles sofort.',
    q19: 'Der Verbindungstest schlägt fehl.',
    a19: 'URL inklusive Port prüfen (z. B. http://192.168.1.100:4533). Sicherstellen, dass keine Firewall die Verbindung blockiert. Im lokalen Netzwerk http:// statt https:// versuchen. Benutzername und Passwort kontrollieren.',
    q20: 'Kein Ton unter Linux.',
    a20: 'Psysonic ist als .deb (Ubuntu/Debian), .rpm (Fedora/RHEL) und über AUR für Arch/CachyOS verfügbar (yay -S psysonic). Es gibt kein AppImage. Falls kein Ton kommt, sicherstellen, dass PipeWire oder PulseAudio läuft.',
    q21: 'Die App zeigt einen schwarzen Bildschirm unter Linux.',
    a21: 'Meist ein GPU/EGL-Treiberproblem in WebKitGTK. Mit GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1 starten. Das AUR-Paket und die offiziellen .deb/.rpm-Pakete setzen diese Variablen automatisch.',
    q29: 'Was sind Crossfade und nahtlose Wiedergabe?',
    a29: 'Beides sind experimentelle Audiofunktionen in Einstellungen → Audio. Nahtlose Wiedergabe puffert den nächsten Track vor, um Stille zu eliminieren. Crossfade blendet den aktuellen Track aus, während der nächste eingeblendet wird — Dauer (1–10 s) einstellbar.',
    q30: 'Zeigt Psysonic Songtexte an?',
    a30: 'Ja. Klick auf das Mikrofon-Icon in der Playerleiste öffnet den Lyrics-Tab im Queue-Panel. Psysonic lädt Texte automatisch von LRCLIB. Sind synchronisierte Lyrics verfügbar, wird die aktuelle Zeile hervorgehoben und scrollt in Echtzeit mit. Bei reinen Texten wird der Volltext statisch angezeigt.',
    q31: 'Kann ich Tastenkürzel anpassen?',
    a31: 'Ja. Einstellungen → Tastenkürzel erlaubt das Neuzuordnen von In-App-Aktionen (Play/Pause, Weiter, Zurück, Lautstärke, Vollbild u. v. m.). Einstellungen → Globale Shortcuts ermöglicht systemweite Kürzel, die auch im Hintergrund ausgelöst werden.',
    q32: 'Kann ich die Schriftart ändern?',
    a32: 'Ja. Einstellungen → Schriftart bietet 10 Schriften zur Auswahl, darunter IBM Plex Mono, Fira Code, JetBrains Mono und Courier Prime. Die gewählte Schrift gilt für die gesamte Oberfläche.',
    s8: 'Offline-Modus',
    q34: 'Was ist der Offline-Modus?',
    a34: 'Der Offline-Modus (Beta) ermöglicht das Zwischenspeichern von Alben auf dem Gerät, sodass die Wiedergabe ohne aktive Serververbindung möglich ist. Gecachte Tracks werden lokal gespeichert und direkt von der Festplatte abgespielt — ohne Netzwerkzugriff.',
    q35: 'Wie speichere ich ein Album für die Offline-Nutzung?',
    a35: 'Album öffnen und auf das Download-Symbol im Album-Header klicken. Psysonic lädt alle Tracks im Hintergrund herunter. Der Fortschritt wird am Button angezeigt. Nach dem Download wird das Symbol grün. Gecachte Alben können in der Offline-Bibliothek (Seitenleiste) verwaltet und gelöscht werden.',
    q36: 'Wie viel Speicherplatz darf der Cache belegen?',
    a36: 'In Einstellungen → Bibliothek kann eine maximale Cache-Größe festgelegt werden. Wird das Limit erreicht, erscheint ein Warnbanner auf der Albumseite. Einzelne Alben können in der Offline-Bibliothek gelöscht werden, um Speicherplatz freizugeben.',
  },
  queue: {
    title: 'Warteschlange',
    savePlaylist: 'Playlist speichern',
    updatePlaylist: 'Playlist aktualisieren',
    filterPlaylists: 'Playlists filtern…',
    playlistName: 'Name der Playlist',
    cancel: 'Abbrechen',
    save: 'Speichern',
    loadPlaylist: 'Playlist laden',
    loading: 'Lade…',
    noPlaylists: 'Keine Playlists gefunden.',
    load: 'Warteschlange ersetzen & abspielen',
    appendToQueue: 'An Warteschlange anhängen',
    delete: 'Löschen',
    deleteConfirm: 'Playlist "{{name}}" löschen?',
    clear: 'Leeren',
    shuffle: 'Warteschlange mischen',
    gapless: 'Nahtlos',
    crossfade: 'Crossfade',
    infiniteQueue: 'Endlose Warteschlange',
    autoAdded: '— Automatisch hinzugefügt —',
    radioAdded: '— Radio —',
    hide: 'Verbergen',
    close: 'Schließen',
    nextTracks: 'Nächste Titel',
    emptyQueue: 'Die Warteschlange ist leer.',
    trackSingular: 'Titel',
    trackPlural: 'Titel',
    showRemaining: 'Restzeit anzeigen',
    showTotal: 'Gesamtzeit anzeigen',
  },
  statistics: {
    title: 'Statistiken',
    recentlyPlayed: 'Zuletzt gehört',
    mostPlayed: 'Meistgespielte Alben',
    highestRated: 'Höchstbewertete Alben',
    genreDistribution: 'Genre-Verteilung (Top 20)',
    loadMore: 'Mehr laden',
    statArtists: 'Künstler',
    statAlbums: 'Alben',
    statSongs: 'Songs',
    statGenres: 'Genres',
    genreSongs: '{{count}} Songs',
    genreAlbums: '{{count}} Alben',
    recentlyAdded: 'Neu hinzugefügt',
    decadeDistribution: 'Alben nach Jahrzehnt',
    decadeAlbums_one: '{{count}} Album',
    decadeAlbums_other: '{{count}} Alben',
    decadeUnknown: 'Unbekannt',
    lfmTitle: 'Last.fm Statistiken',
    lfmTopArtists: 'Top-Künstler',
    lfmTopAlbums: 'Top-Alben',
    lfmTopTracks: 'Top-Titel',
    lfmPlays: '{{count}} Plays',
    lfmPeriodOverall: 'Gesamt',
    lfmPeriod7day: '7 Tage',
    lfmPeriod1month: '1 Monat',
    lfmPeriod3month: '3 Monate',
    lfmPeriod6month: '6 Monate',
    lfmPeriod12month: '12 Monate',
    lfmNotConnected: 'Verbinde Last.fm in den Einstellungen, um deine Statistiken zu sehen.',
    lfmRecentTracks: 'Zuletzt gescrobbelt',
    lfmNowPlaying: 'Läuft gerade',
    lfmJustNow: 'gerade eben',
    lfmMinutesAgo: 'vor {{n}} Min.',
    lfmHoursAgo: 'vor {{n}} Std.',
    lfmDaysAgo: 'vor {{n}} Tagen',
  },
  player: {
    regionLabel: 'Musikplayer',
    openFullscreen: 'Vollbild-Player öffnen',
    fullscreen: 'Vollbild-Player',
    closeFullscreen: 'Vollbild schließen',
    closeTooltip: 'Schließen (Esc)',
    noTitle: 'Kein Titel',
    stop: 'Stop',
    prev: 'Vorheriger Titel',
    play: 'Play',
    pause: 'Pause',
    next: 'Nächster Titel',
    repeat: 'Wiederholen',
    repeatOff: 'Aus',
    repeatAll: 'Alle',
    repeatOne: 'Einen',
    progress: 'Songfortschritt',
    volume: 'Lautstärke',
    toggleQueue: 'Warteschlange umschalten',
    lyrics: 'Lyrics',
    lyricsLoading: 'Lyrics werden geladen…',
    lyricsNotFound: 'Keine Lyrics für diesen Titel gefunden',
  },
  songInfo: {
    title: 'Song-Infos',
    songTitle: 'Titel',
    artist: 'Künstler',
    album: 'Album',
    albumArtist: 'Album-Künstler',
    year: 'Jahr',
    genre: 'Genre',
    duration: 'Länge',
    track: 'Track',
    format: 'Format',
    bitrate: 'Bitrate',
    sampleRate: 'Abtastrate',
    bitDepth: 'Bittiefe',
    channels: 'Kanäle',
    fileSize: 'Dateigröße',
    path: 'Speicherort',
    replayGainTrack: 'RG Track Gain',
    replayGainAlbum: 'RG Album Gain',
    replayGainPeak: 'RG Track Peak',
    mono: 'Mono',
    stereo: 'Stereo',
  },
  playlists: {
    title: 'Playlists',
    newPlaylist: 'Neue Playlist',
    unnamed: 'Unbenannte Playlist',
    createName: 'Playlist-Name…',
    create: 'Erstellen',
    cancel: 'Abbrechen',
    empty: 'Noch keine Playlists.',
    emptyPlaylist: 'Diese Playlist ist leer.',
    addFirstSong: 'Ersten Song hinzufügen',
    notFound: 'Playlist nicht gefunden.',
    songs: '{{n}} Songs',
    playAll: 'Alle abspielen',
    shuffle: 'Zufallswiedergabe',
    addToQueue: 'Zur Warteschlange',
    back: 'Zurück zu Playlists',
    deletePlaylist: 'Löschen',
    confirmDelete: 'Nochmals klicken zum Bestätigen',
    removeSong: 'Aus Playlist entfernen',
    addSongs: 'Songs hinzufügen',
    searchPlaceholder: 'Bibliothek durchsuchen…',
    noResults: 'Keine Ergebnisse.',
    suggestions: 'Vorgeschlagene Songs',
    noSuggestions: 'Keine Vorschläge verfügbar.',
    titleBadge: 'Playlist',
    refreshSuggestions: 'Neue Vorschläge',
    addSong: 'Zur Playlist hinzufügen',
    cacheOffline: 'Playlist offline speichern',
    offlineCached: 'Playlist gecacht',
    offlineDownloading: 'Wird gecacht… ({{done}}/{{total}} Alben)',
  },
  radio: {
    title: 'Internetradio',
    empty: 'Keine Radiosender konfiguriert.',
    addStation: 'Sender hinzufügen',
    editStation: 'Bearbeiten',
    deleteStation: 'Sender löschen',
    confirmDelete: 'Zum Bestätigen erneut klicken',
    stationName: 'Sendername…',
    streamUrl: 'Stream-URL…',
    homepageUrl: 'Homepage-URL (optional)',
    save: 'Speichern',
    cancel: 'Abbrechen',
    live: 'LIVE',
    liveStream: 'Internetradio',
    openHomepage: 'Homepage öffnen',
  }
};

// French Translations
const frTranslation = {
  sidebar: {
    library: 'Bibliothèque',
    mainstage: 'Scène principale',
    newReleases: 'Nouveautés',
    allAlbums: 'Tous les albums',
    randomAlbums: 'Albums aléatoires',
    artists: 'Artistes',
    randomMix: 'Mix aléatoire',
    favorites: 'Favoris',
    nowPlaying: 'En cours',
    system: 'Système',
    statistics: 'Statistiques',
    settings: 'Paramètres',
    help: 'Aide',
    expand: 'Développer la barre latérale',
    collapse: 'Réduire la barre latérale',
    updateAvailable: 'Mise à jour disponible',
    updateReady: '{{version}} est prêt',
    updateLink: 'Voir la version →',
    downloadingTracks: '{{n}} pistes en cache…',
    offlineLibrary: 'Bibliothèque hors ligne',
    genres: 'Genres',
    playlists: 'Playlists',
    radio: 'Radio Internet',
  },
  home: {
    hero: 'En vedette',
    starred: 'Favoris personnels',
    recent: 'Ajoutés récemment',
    mostPlayed: 'Les plus écoutés',
    recentlyPlayed: 'Récemment écoutés',
    discover: 'Découvrir',
    loadMore: 'Charger plus',
    discoverMore: 'Découvrir plus',
    discoverArtists: 'Découvrir des artistes',
    discoverArtistsMore: 'Tous les artistes'
  },
  hero: {
    eyebrow: 'Album en vedette',
    playAlbum: 'Lire l\'album',
    enqueue: 'Mettre en file',
    enqueueTooltip: 'Ajouter l\'album entier à la file d\'attente',
  },
  search: {
    placeholder: 'Rechercher un artiste, album ou morceau…',
    noResults: 'Aucun résultat pour « {{query}} »',
    artists: 'Artistes',
    albums: 'Albums',
    songs: 'Morceaux',
    clearLabel: 'Effacer la recherche',
    title: 'Recherche',
    resultsFor: 'Résultats pour « {{query}} »',
    album: 'Album',
    advanced: 'Recherche avancée',
    advancedSearchTerm: 'Terme de recherche',
    advancedSearchPlaceholder: 'Titre, album, artiste…',
    advancedGenre: 'Genre',
    advancedAllGenres: 'Tous les genres',
    advancedYear: 'Année',
    advancedYearFrom: 'de',
    advancedYearTo: 'à',
    advancedAll: 'Tous',
    advancedSearch: 'Rechercher',
    advancedEmpty: 'Entrez un terme de recherche ou sélectionnez un filtre.',
    advancedNoResults: 'Aucun résultat trouvé.',
    advancedGenreNote: 'Les morceaux sont sélectionnés aléatoirement dans ce genre.',
  },
  nowPlaying: {
    tooltip: 'Qui écoute ?',
    title: 'Qui écoute ?',
    loading: 'Chargement…',
    nobody: 'Personne n\'écoute en ce moment.',
    minutesAgo: 'il y a {{n}} min',
    nothingPlaying: 'Rien en cours. Lancez un morceau !',
    aboutArtist: "À propos de l'artiste",
    fromAlbum: 'De cet album',
    viewAlbum: "Voir l'album",
    goToArtist: "Aller à l'artiste",
    readMore: 'Lire la suite',
    showLess: 'Réduire',
    genreInfo: 'Genre',
    trackInfo: 'Infos piste',
  },
  contextMenu: {
    playNow: 'Lire maintenant',
    playNext: 'Lire ensuite',
    addToQueue: 'Ajouter à la file',
    enqueueAlbum: 'Mettre l\'album en file',
    startRadio: 'Démarrer la radio',
    lfmLove: 'Aimer sur Last.fm',
    lfmUnlove: 'Ne plus aimer sur Last.fm',
    favorite: 'Favori',
    favoriteArtist: 'Artiste favori',
    favoriteAlbum: 'Album favori',
    unfavorite: 'Retirer des favoris',
    unfavoriteArtist: 'Retirer l\'artiste des favoris',
    unfavoriteAlbum: 'Retirer l\'album des favoris',
    removeFromQueue: 'Retirer de la file',
    openAlbum: 'Ouvrir l\'album',
    goToArtist: 'Aller à l\'artiste',
    download: 'Télécharger (ZIP)',
    addToPlaylist: 'Ajouter à la playlist',
    songInfo: 'Infos du morceau',
  },
  albumDetail: {
    back: 'Retour',
    playAll: 'Tout lire',
    enqueue: 'Mettre en file',
    enqueueTooltip: 'Ajouter l\'album entier à la file d\'attente',
    artistBio: 'Biographie',
    download: 'Télécharger (ZIP)',
    downloading: 'Chargement…',
    cacheOffline: 'Rendre disponible hors ligne',
    offlineCached: 'Disponible hors ligne',
    offlineDownloading: 'Mise en cache… ({{n}}/{{total}})',
    removeOffline: 'Supprimer le cache hors ligne',
    offlineStorageFull: 'Stockage hors ligne plein (limite : {{mb}} Mo). Supprimez un album de votre bibliothèque hors ligne ou augmentez la limite dans les paramètres.',
    offlineStorageGoToSettings: 'Paramètres',
    offlineStorageGoToLibrary: 'Bibliothèque hors ligne',
    favoriteAdd: 'Ajouter aux favoris',
    favoriteRemove: 'Retirer des favoris',
    favorite: 'Favori',
    noBio: 'Aucune biographie disponible.',
    moreByArtist: 'Plus de {{artist}}',
    tracksCount: '{{n}} pistes',
    goToArtist: 'Aller à {{artist}}',
    moreLabelAlbums: 'Plus d\'albums sur {{label}}',
    trackTitle: 'Titre',
    trackArtist: 'Artiste',
    trackGenre: 'Genre',
    trackFormat: 'Format',
    trackFavorite: 'Favori',
    trackRating: 'Note',
    trackDuration: 'Durée',
    trackTotal: 'Total',
    columns: 'Colonnes',
    notFound: 'Album introuvable.',
    bioModal: 'Biographie de l\'artiste',
    bioClose: 'Fermer',
    ratingLabel: 'Note',
    enlargeCover: 'Agrandir',
  },
  artistDetail: {
    back: 'Retour',
    albums: 'Albums',
    album: 'Album',
    playAll: 'Tout lire',
    shuffle: 'Aléatoire',
    radio: 'Radio',
    loading: 'Chargement…',
    noRadio: 'Aucun morceau similaire trouvé pour cet artiste.',
    notFound: 'Artiste introuvable.',
    albumsBy: 'Albums de {{name}}',
    topTracks: 'Morceaux populaires',
    noAlbums: 'Aucun album trouvé.',
    trackTitle: 'Titre',
    trackAlbum: 'Album',
    trackDuration: 'Durée',
    favoriteAdd: 'Ajouter aux favoris',
    favoriteRemove: 'Retirer des favoris',
    favorite: 'Favori',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    openedInBrowser: 'Ouvert dans le navigateur',
    featuredOn: 'Également sur',
    similarArtists: 'Artistes similaires',
    cacheOffline: 'Enregistrer la discographie hors ligne',
    offlineCached: 'Discographie en cache',
    offlineDownloading: 'En cache… ({{done}}/{{total}} albums)',
  },
  favorites: {
    title: 'Favoris',
    empty: 'Vous n\'avez pas encore de favoris.',
    artists: 'Artistes',
    albums: 'Albums',
    songs: 'Morceaux',
    enqueueAll: 'Tout ajouter à la file',
    playAll: 'Tout lire',
    removeSong: 'Retirer des favoris',
  },
  randomAlbums: {
    title: 'Albums aléatoires',
    refresh: 'Actualiser',
  },
  genres: {
    title: 'Genres',
    genreCount: 'genres',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    loading: 'Chargement des genres…',
    empty: 'Aucun genre trouvé.',
    albumsLoading: 'Chargement des albums…',
    albumsEmpty: 'Aucun album trouvé pour ce genre.',
    loadMore: 'Charger plus',
    back: 'Retour',
  },
  randomMix: {
    title: 'Mix aléatoire',
    remix: 'Remixer',
    remixTooltip: 'Charger de nouveaux morceaux aléatoires',
    playAll: 'Tout lire',
    trackTitle: 'Titre',
    trackArtist: 'Artiste',
    trackAlbum: 'Album',
    trackFavorite: 'Favori',
    trackDuration: 'Durée',
    favoriteAdd: 'Ajouter aux favoris',
    favoriteRemove: 'Retirer des favoris',
    play: 'Lire',
    trackGenre: 'Genre',
    excludeAudiobooks: 'Exclure les livres audio et pièces radiophoniques',
    excludeAudiobooksDesc: 'Correspond aux mots-clés dans le genre, le titre, l\'album et l\'artiste — ex. Hörbuch, Audiobook, Spoken Word, …',
    genreBlocked: 'Mot-clé bloqué',
    genreAddedToBlacklist: 'Ajouté à la liste de filtres',
    genreAlreadyBlocked: 'Déjà bloqué',
    artistBlocked: 'Artiste bloqué',
    artistAddedToBlacklist: 'Artiste ajouté à la liste de filtres',
    artistClickHint: 'Cliquer pour bloquer cet artiste',
    blacklistToggle: 'Filtre par mot-clé',
    genreMixTitle: 'Mix par genre',
    genreMixDesc: 'Top 20 genres par nombre de morceaux — cliquer pour un mix aléatoire',
    genreMixLoadMore: 'Charger 10 de plus',
    genreMixNoGenres: 'Aucun genre trouvé sur le serveur.',
    shuffleGenres: 'Afficher d\'autres genres',
    filterPanelTitle: 'Filtres',
    filterPanelDesc: 'Cliquez sur un tag de genre ou un nom d\'artiste dans la liste pour l\'exclure des futurs mix.',
    genreClickHint: 'Cliquez sur un tag de genre pour l\'ajouter\ncomme mot-clé de filtre.\nCorrespond au genre, titre, album et artiste.',
  },
  albums: {
    title: 'Tous les albums',
    sortByName: 'A–Z (Album)',
    sortByArtist: 'A–Z (Artiste)',
    sortNewest: 'Plus récents',
    sortRandom: 'Aléatoire',
  },
  artists: {
    title: 'Artistes',
    search: 'Rechercher…',
    all: 'Tous',
    gridView: 'Vue en grille',
    listView: 'Vue en liste',
    imagesOn: 'Images d\'artistes activées — peut augmenter la charge réseau et système',
    imagesOff: 'Images d\'artistes désactivées — affichage des initiales uniquement',
    loadMore: 'Charger plus',
    notFound: 'Aucun artiste trouvé.',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
  },
  login: {
    subtitle: 'Votre lecteur de bureau Navidrome',
    serverName: 'Nom du serveur (facultatif)',
    serverNamePlaceholder: 'Mon Navidrome',
    serverUrl: 'URL du serveur',
    serverUrlPlaceholder: '192.168.1.100:4533 ou music.exemple.com',
    username: 'Nom d\'utilisateur',
    usernamePlaceholder: 'admin',
    password: 'Mot de passe',
    showPassword: 'Afficher le mot de passe',
    hidePassword: 'Masquer le mot de passe',
    connect: 'Se connecter',
    connecting: 'Connexion…',
    connected: 'Connecté !',
    error: 'Connexion échouée — vérifiez vos informations.',
    urlRequired: 'Veuillez saisir une URL de serveur.',
    savedServers: 'Serveurs enregistrés',
    addNew: 'Ou ajouter un nouveau serveur',
  },
  connection: {
    connected: 'Connecté',
    connectedTo: 'Connecté à {{server}}',
    disconnected: 'Déconnecté',
    disconnectedFrom: 'Impossible d\'atteindre {{server}} — cliquez pour vérifier les paramètres',
    checking: 'Connexion…',
    extern: 'Externe',
    offlineTitle: 'Pas de connexion au serveur',
    offlineSubtitle: 'Impossible d\'atteindre {{server}}. Vérifiez votre réseau ou le serveur.',
    offlineModeBanner: 'Mode hors ligne — lecture depuis le cache local',
    offlineLibraryTitle: 'Bibliothèque hors ligne',
    offlineLibraryEmpty: 'Aucun album en cache. Connectez-vous, ouvrez un album et cliquez sur "Rendre disponible hors ligne".',
    offlineAlbumCount: '{{n}} album',
    offlineAlbumCount_plural: '{{n}} albums',
    offlineFilterAll: 'Tout',
    offlineFilterAlbums: 'Albums',
    offlineFilterPlaylists: 'Playlists',
    offlineFilterArtists: 'Discographies',
    retry: 'Réessayer',
    lastfmConnected: 'Last.fm connecté en tant que @{{user}}',
    lastfmSessionInvalid: 'Session invalide — cliquez pour vous reconnecter',
  },
  common: {
    albums: 'Albums',
    album: 'Album',
    loading: 'Chargement…',
    loadingMore: 'Chargement…',
    loadingPlaylists: 'Chargement des listes…',
    noAlbums: 'Aucun album trouvé.',
    downloading: 'Téléchargement…',
    downloadZip: 'Télécharger (ZIP)',
    back: 'Retour',
    cancel: 'Annuler',
    save: 'Enregistrer',
    delete: 'Supprimer',
    use: 'Utiliser',
    add: 'Ajouter',
    active: 'Actif',
    download: 'Télécharger',
    chooseDownloadFolder: 'Choisir le dossier de téléchargement',
    noFolderSelected: 'Aucun dossier sélectionné',
    rememberDownloadFolder: 'Mémoriser ce dossier',
    filterGenre: 'Filtre genre',
    filterSearchGenres: 'Rechercher des genres…',
    filterNoGenres: 'Aucun genre trouvé',
    filterClear: 'Effacer',
    bulkSelected: '{{count}} sélectionné(s)',
    bulkAddToPlaylist: 'Ajouter à la playlist',
    bulkRemoveFromPlaylist: 'Retirer de la playlist',
    bulkClear: 'Désélectionner',
    updaterAvailable: 'Mise à jour disponible',
    updaterVersion: 'v{{version}} est prête',
    updaterInstall: 'Installer & Redémarrer',
    updaterDownloading: 'Téléchargement…',
    updaterInstalling: 'Installation…',
    updaterDownload: 'Télécharger depuis GitHub',
    updaterExperimentalHint: 'La mise à jour automatique est encore en développement',
  },
  settings: {
    title: 'Paramètres',
    language: 'Langue',
    languageEn: 'Anglais',
    languageDe: 'Allemand',
    languageFr: 'Français',
    languageNl: 'Néerlandais',
    languageZh: 'Chinois',
    font: 'Police',
    theme: 'Thème',
    appearance: 'Apparence',
    servers: 'Serveurs',
    serverName: 'Nom du serveur',
    serverUrl: 'URL du serveur',
    serverUsername: 'Nom d\'utilisateur',
    serverPassword: 'Mot de passe',
    addServer: 'Ajouter un serveur',
    addServerTitle: 'Ajouter un nouveau serveur',
    useServer: 'Utiliser',
    deleteServer: 'Supprimer',
    noServers: 'Aucun serveur enregistré.',
    serverActive: 'Actif',
    confirmDeleteServer: 'Supprimer le serveur « {{name}} » ?',
    serverConnecting: 'Connexion…',
    serverConnected: 'Connecté !',
    serverFailed: 'Connexion échouée.',
    testBtn: 'Tester la connexion',
    testingBtn: 'Test en cours…',
    serverCompatible: 'Compatible avec : Navidrome · Gonic · Airsonic · Subsonic',
    connected: 'Connecté',
    failed: 'Échec',
    eqTitle: 'Égaliseur',
    eqEnabled: 'Activer l\'égaliseur',
    eqPreset: 'Préréglage',
    eqPresetCustom: 'Personnalisé',
    eqPresetBuiltin: 'Préréglages intégrés',
    eqPresetCustomGroup: 'Mes préréglages',
    eqSavePreset: 'Enregistrer comme préréglage',
    eqPresetName: 'Nom du préréglage…',
    eqDeletePreset: 'Supprimer le préréglage',
    eqResetBands: 'Réinitialiser à plat',
    eqPreGain: 'Pré-amplification',
    eqResetPreGain: 'Réinitialiser la pré-amplification',
    eqAutoEqTitle: 'Recherche AutoEQ',
    eqAutoEqPlaceholder: 'Rechercher un casque / IEM…',
    eqAutoEqSearching: 'Recherche…',
    eqAutoEqNoResults: 'Aucun résultat',
    eqAutoEqError: 'Échec de la recherche',
    eqAutoEqRateLimit: 'Limite GitHub atteinte — réessayez dans une minute',
    eqAutoEqFetchError: 'Impossible de charger le profil EQ',
    lfmTitle: 'Last.fm',
    lfmConnect: 'Connecter avec Last.fm',
    lfmConnecting: 'En attente d\'autorisation…',
    lfmConfirm: 'J\'ai autorisé l\'application',
    lfmConnected: 'Connecté en tant que',
    lfmDisconnect: 'Déconnecter',
    lfmConnectDesc: 'Connectez votre compte Last.fm pour activer le scrobbling et les mises à jour « En cours de lecture » depuis Psysonic — aucune configuration Navidrome requise.',
    lfmOpenBrowser: 'Une fenêtre de navigateur s\'ouvrira. Autorisez Psysonic sur Last.fm, puis cliquez sur le bouton ci-dessous.',
    lfmScrobbles: '{{n}} scrobbles',
    lfmMemberSince: 'Membre depuis {{year}}',
    scrobbleEnabled: 'Scrobbling activé',
    scrobbleDesc: 'Envoyer les morceaux à Last.fm après 50% d\'écoute',
    behavior: 'Comportement de l\'application',
    cacheTitle: 'Taille max. du stockage',
    cacheDesc: 'Pochettes et images d\'artistes. Quand le cache est plein, les entrées les plus anciennes sont supprimées automatiquement. Les albums hors ligne ne sont pas supprimés automatiquement, mais le seront lors d\'un nettoyage manuel.',
    cacheUsed: 'Utilisé : {{images}} images · {{offline}} pistes hors ligne',
    cacheClearBtn: 'Vider le cache',
    cacheClearWarning: 'Cela supprimera aussi tous les albums hors ligne de la bibliothèque.',
    cacheClearConfirm: 'Tout supprimer',
    cacheClearCancel: 'Annuler',
    showArtistImages: 'Afficher les images d\'artistes',
    showArtistImagesDesc: 'Charge et affiche les images d\'artistes dans la vue d\'ensemble. Désactivé par défaut pour réduire les E/S disque serveur et la charge réseau sur les grandes bibliothèques.',
    minimizeToTray: 'Réduire dans la barre système',
    minimizeToTrayDesc: 'Lors de la fermeture, Psysonic continue de fonctionner dans la barre système au lieu de se fermer.',
    discordRichPresence: 'Discord Rich Presence',
    discordRichPresenceDesc: 'Affiche le titre en cours de lecture sur votre profil Discord. Discord doit être ouvert.',
    nowPlayingEnabled: 'Afficher dans la fenêtre live',
    nowPlayingEnabledDesc: 'Diffuse le titre en cours de lecture vers la vue des auditeurs en direct du serveur. Désactiver pour ne pas envoyer de données de lecture.',
    downloadsTitle: 'Dossier de téléchargement',
    downloadsDefault: 'Dossier de téléchargement par défaut',
    pickFolder: 'Sélectionner',
    pickFolderTitle: 'Sélectionner le dossier de téléchargement',
    clearFolder: 'Effacer le dossier',
    logout: 'Se déconnecter',
    aboutTitle: 'À propos de Psysonic',
    aboutDesc: 'Un lecteur de musique de bureau moderne pour les serveurs compatibles Subsonic (Navidrome, Gonic, et autres). Construit sur Tauri v2 avec un moteur audio Rust natif — léger et rapide, mais riche en fonctionnalités : barre waveform, paroles synchronisées, intégration Last.fm, égaliseur 10 bandes, crossfade, lecture sans blanc, Replay Gain, navigation par genre et une grande bibliothèque de thèmes.',
    aboutFeatures: 'Multi-serveur · Scrobbling & love Last.fm · Ambient Stage plein écran · Waveform seek · Paroles synchro · EQ 10 bandes · Crossfade & Gapless · Replay Gain · Genres · 63 thèmes · 5 langues',
    aboutLicense: 'Licence',
    aboutLicenseText: 'GNU GPL v3 — libre d\'utilisation, de modification et de distribution sous la même licence.',
    aboutRepo: 'Code source sur GitHub',
    aboutVersion: 'Version',
    aboutBuiltWith: 'Construit avec Tauri · React · TypeScript · Rust/rodio',
    aboutAiCredit: 'Développé avec le soutien de Claude Code par Anthropic',
    aboutContributorsLabel: 'Contributeurs',
    aboutSpecialThanksLabel: 'Remerciements spéciaux',
    changelog: 'Journal des modifications',
    showChangelogOnUpdate: "Afficher 'Quoi de neuf' lors des mises à jour",
    showChangelogOnUpdateDesc: 'Affiche automatiquement les nouveautés au premier lancement d\'une nouvelle version.',
    randomMixTitle: 'Mix aléatoire',
    randomMixBlacklistTitle: 'Mots-clés de filtre personnalisés',
    randomMixBlacklistDesc: 'Les morceaux sont exclus si un mot-clé correspond à leur genre, titre, album ou artiste (actif quand la case ci-dessus est cochée).',
    randomMixBlacklistPlaceholder: 'Ajouter un mot-clé…',
    randomMixBlacklistAdd: 'Ajouter',
    randomMixBlacklistEmpty: 'Aucun mot-clé personnalisé ajouté.',
    randomMixHardcodedTitle: 'Mots-clés intégrés (actifs quand la case est cochée)',
    tabPlayback: 'Lecture',
    tabLibrary: 'Bibliothèque',
    tabAppearance: 'Apparence',
    homeCustomizerTitle: 'Page d\'accueil',
    sidebarTitle: 'Barre latérale',
    sidebarReset: 'Réinitialiser',
    sidebarDrag: 'Glisser pour réorganiser',
    sidebarFixed: 'Toujours visible',
    tabShortcuts: 'Raccourcis',
    tabServer: 'Serveur',
    shortcutsReset: 'Réinitialiser',
    shortcutListening: 'Appuyez sur une touche…',
    shortcutUnbound: '—',
    shortcutClear: 'Effacer',
    globalShortcutsTitle: 'Raccourcis globaux',
    globalShortcutsNote: 'Fonctionnent à l\'échelle du système, même quand Psysonic est en arrière-plan. Nécessite Ctrl, Alt ou Super comme modificateur.',
    shortcutPlayPause: 'Lecture / Pause',
    shortcutNext: 'Piste suivante',
    shortcutPrev: 'Piste précédente',
    shortcutVolumeUp: 'Volume +',
    shortcutVolumeDown: 'Volume -',
    shortcutSeekForward: 'Avancer de 10s',
    shortcutSeekBackward: 'Reculer de 10s',
    shortcutToggleQueue: 'Afficher/masquer la file',
    shortcutFullscreenPlayer: 'Lecteur plein écran',
    shortcutNativeFullscreen: 'Plein écran natif',
    tabAbout: 'À propos',
    playbackTitle: 'Lecture',
    replayGain: 'Replay Gain',
    replayGainDesc: 'Normaliser le volume des pistes avec les métadonnées ReplayGain',
    replayGainMode: 'Mode',
    replayGainTrack: 'Piste',
    replayGainAlbum: 'Album',
    crossfade: 'Fondu enchaîné',
    crossfadeDesc: 'Fondu entre les pistes',
    crossfadeSecs: '{{n}}s',
    notWithGapless: 'Non disponible quand la lecture sans blanc est active',
    notWithCrossfade: 'Non disponible quand le fondu enchaîné est actif',
    gapless: 'Lecture sans blanc',
    gaplessDesc: 'Préparer la piste suivante pour éliminer les silences entre les morceaux',
    infiniteQueue: 'File infinie',
    infiniteQueueDesc: 'Ajouter automatiquement des morceaux aléatoires quand la file est épuisée',
    experimental: 'Expérimental',
  },
  changelog: {
    modalTitle: 'Quoi de neuf',
    dontShowAgain: 'Ne plus afficher',
    close: 'Compris',
  },
  help: {
    title: 'Aide',
    s1: 'Démarrage',
    q1: 'Quels serveurs sont compatibles ?',
    a1: 'Psysonic fonctionne avec tout serveur compatible Subsonic : Navidrome, Gonic, Subsonic, Airsonic, et autres. Navidrome est recommandé.',
    q2: 'Comment me connecter à mon serveur ?',
    a2: 'Ouvrez les Paramètres et cliquez sur « Ajouter un serveur ». Saisissez l\'URL du serveur (ex. 192.168.1.100:4533), votre nom d\'utilisateur et mot de passe. Psysonic teste la connexion avant d\'enregistrer.',
    q3: 'Puis-je utiliser plusieurs serveurs ?',
    a3: 'Oui. Vous pouvez ajouter autant de serveurs que vous le souhaitez dans les Paramètres et basculer entre eux à tout moment. Un seul serveur est actif à la fois.',
    s2: 'Lecture',
    q4: 'Comment lire de la musique ?',
    a4: 'Double-cliquez sur une piste pour la lire. Sur les pages d\'album et d\'artiste, utilisez « Tout lire » pour démarrer l\'album entier. Vous pouvez aussi glisser des pistes dans la file d\'attente.',
    q5: 'Quels raccourcis clavier sont disponibles ?',
    a5: 'Espace = Lecture / Pause · Échap = Fermer le lecteur plein écran. Les touches multimédia fonctionnent sur toutes les plateformes. Sur Linux, utilisez les boutons de la barre du lecteur. Les raccourcis in-app et les raccourcis système peuvent être personnalisés dans Paramètres → Raccourcis / Raccourcis globaux.',
    q6: 'Qu\'est-ce que la file d\'attente ?',
    a6: 'La file d\'attente affiche toutes les pistes à venir. Ouvrez-la avec l\'icône de panneau en haut à droite. Vous pouvez réorganiser les pistes par glisser-déposer, les mélanger et enregistrer la file comme liste de lecture.',
    q7: 'Comment ouvrir le lecteur plein écran ?',
    a7: 'Cliquez sur la pochette dans la barre du lecteur en bas, ou sur l\'icône d\'agrandissement à côté. Appuyez sur Échap pour fermer.',
    q8: 'Comment fonctionne la répétition ?',
    a8: 'Cliquez sur le bouton répéter pour alterner : Désactivé → Répéter tout → Répéter un.',
    s3: 'Bibliothèque',
    q9: 'Comment télécharger un album ?',
    a9: 'Ouvrez la page de détail d\'un album et cliquez sur « Télécharger (ZIP) ». Le serveur compresse d\'abord l\'album en ZIP — pour les grands albums ou les fichiers sans perte (FLAC / WAV), cela peut prendre un moment avant que le téléchargement ne démarre réellement. La barre de progression n\'apparaît qu\'une fois la compression terminée.',
    q10: 'Comment mettre des pistes et albums en favoris ?',
    a10: 'Cliquez sur l\'icône étoile sur une piste ou dans l\'en-tête de l\'album. Les éléments favoris apparaissent dans la section Favoris de la barre latérale.',
    q11: 'Qu\'est-ce que le carousel hero sur la page d\'accueil ?',
    a11: 'La bannière en haut de la page d\'accueil sélectionne aléatoirement des albums de votre bibliothèque et les fait défiler toutes les 10 secondes. Cliquez sur les points pour accéder à un album spécifique.',
    s4: 'Paramètres',
    q12: 'Comment changer le thème ?',
    a12: 'Paramètres → Thème. Un grand choix de thèmes en 8 groupes : Psysonic Themes, Mediaplayer, Systèmes d\'exploitation, Jeux, Films, Séries, Réseaux sociaux et Open Source Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'Comment changer la langue ?',
    a13: 'Paramètres → Langue. L\'anglais, l\'allemand, le français, le néerlandais et le chinois sont pris en charge.',
    q15: 'Comment définir un dossier de téléchargement ?',
    a15: 'Paramètres → Comportement → Dossier de téléchargement. Les albums téléchargés y sont enregistrés en ZIP.',
    s5: 'Scrobbling',
    q16: 'Comment fonctionne le scrobbling ?',
    a16: 'Psysonic envoie les scrobbles directement à Last.fm — aucune configuration Navidrome nécessaire. Connectez votre compte dans Paramètres → Last.fm et activez le scrobbling.',
    q17: 'Quand un scrobble est-il envoyé ?',
    a17: 'Un scrobble est soumis après avoir écouté 50% d\'une piste.',
    q22: 'Qu\'est-ce que la forme d\'onde dans la barre du lecteur ?',
    a22: 'La barre de forme d\'onde remplace le curseur de progression classique. Cliquez n\'importe où pour sauter à cette position, ou faites glisser pour naviguer.',
    q24: 'Puis-je mélanger la file d\'attente ?',
    a24: 'Oui. Ouvrez le panneau de file et cliquez sur l\'icône de mélange. La piste en cours reste en position 1 — les autres sont réorganisées aléatoirement.',
    q25: 'Les liens Last.fm et Wikipédia s\'ouvrent-ils dans un navigateur ?',
    a25: 'Oui — ils s\'ouvrent dans votre navigateur système par défaut. Le bouton affiche brièvement une confirmation au clic.',
    s7: 'Mix aléatoire',
    q26: 'Qu\'est-ce que le Mix aléatoire ?',
    a26: 'Le Mix aléatoire crée une liste de morceaux aléatoires depuis toute votre bibliothèque. Ouvrez-le via « Mix aléatoire » dans la barre latérale et cliquez sur « Nouveau mix ».',
    q27: 'Qu\'est-ce que le Filtre par mot-clé ?',
    a27: 'Le Filtre par mot-clé exclut les pistes dont le genre, le titre ou l\'album contient des mots spécifiques. Les livres audio sont filtrés automatiquement. Ajoutez des mots-clés dans Paramètres → Mix aléatoire.',
    q28: 'Qu\'est-ce que le Mix par super-genre ?',
    a28: 'Le Mix par super-genre regroupe votre bibliothèque en grandes catégories (Rock, Métal, Électronique, Jazz, Classique, etc.) et crée un mix ciblé. Sélectionnez une catégorie dans les puces sous la liste.',
    s6: 'Dépannage',
    q18: 'Les pochettes et images d\'artistes chargent lentement.',
    a18: 'Les images sont récupérées depuis le disque de votre serveur au premier chargement, puis mises en cache localement pendant 30 jours. Les visites suivantes seront instantanées.',
    q19: 'Le test de connexion échoue.',
    a19: 'Vérifiez l\'URL avec le port (ex. http://192.168.1.100:4533). Assurez-vous qu\'aucun pare-feu ne bloque la connexion. Essayez http:// au lieu de https:// sur un réseau local.',
    q20: 'Pas d\'audio sur Linux.',
    a20: 'Psysonic est disponible en .deb (Ubuntu/Debian), .rpm (Fedora/RHEL) et via AUR sur Arch/CachyOS (yay -S psysonic). Il n\'y a pas d\'AppImage. Si l\'audio ne fonctionne pas, vérifiez que PipeWire ou PulseAudio est actif.',
    q21: 'L\'application affiche un écran noir sur Linux.',
    a21: 'Cela est généralement dû à des problèmes de pilote GPU/EGL dans WebKitGTK. Lancez avec GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1. Les paquets AUR et installateurs .deb/.rpm officiels le configurent automatiquement.',
    q29: 'Que sont le fondu enchaîné et la lecture sans blanc ?',
    a29: 'Ce sont des fonctionnalités audio expérimentales dans Paramètres → Audio. La lecture sans blanc pré-charge la piste suivante pour éliminer les silences. Le fondu enchaîné effectue un fondu sortant de la piste en cours tout en faisant un fondu entrant de la suivante — durée réglable (1–10 s).',
    q30: 'Psysonic affiche-t-il les paroles ?',
    a30: 'Oui. Cliquez sur l\'icône microphone dans la barre du lecteur pour ouvrir l\'onglet Paroles. Psysonic récupère automatiquement les paroles depuis LRCLIB. Si des paroles synchronisées sont disponibles, la ligne active est mise en évidence et défile en temps réel. Sinon, le texte complet est affiché statiquement.',
    q31: 'Puis-je personnaliser les raccourcis clavier ?',
    a31: 'Oui. Paramètres → Raccourcis clavier permet de réattribuer les actions in-app (Lecture/Pause, Suivant, Précédent, Volume, Plein écran, etc.). Paramètres → Raccourcis globaux permet d\'assigner des raccourcis système actifs même quand l\'application est en arrière-plan.',
    q32: 'Puis-je changer la police ?',
    a32: 'Oui. Paramètres → Police propose 10 polices dont IBM Plex Mono, Fira Code, JetBrains Mono et Courier Prime. La police choisie s\'applique à toute l\'interface.',
    s8: 'Mode hors ligne',
    q34: 'Qu\'est-ce que le mode hors ligne ?',
    a34: 'Le mode hors ligne (Bêta) permet de mettre des albums en cache sur l\'appareil afin d\'écouter de la musique sans connexion serveur active. Les pistes mises en cache sont stockées localement et lues directement depuis le disque — sans requête réseau.',
    q35: 'Comment mettre un album en cache pour une utilisation hors ligne ?',
    a35: 'Ouvrez un album et cliquez sur l\'icône de téléchargement dans l\'en-tête de l\'album. Psysonic télécharge toutes les pistes en arrière-plan. La progression est affichée sur le bouton. Une fois en cache, l\'icône devient verte. Les albums mis en cache peuvent être consultés et supprimés dans la page Bibliothèque hors ligne (barre latérale).',
    q36: 'Quelle quantité de stockage le cache hors ligne peut-il utiliser ?',
    a36: 'Vous pouvez définir une taille de cache maximale dans Paramètres → Bibliothèque. Lorsque la limite est atteinte, une bannière d\'avertissement s\'affiche sur la page de l\'album. Vous pouvez supprimer des albums individuels dans la Bibliothèque hors ligne pour libérer de l\'espace.',
  },
  queue: {
    title: 'File d\'attente',
    savePlaylist: 'Enregistrer la liste',
    updatePlaylist: 'Mettre à jour la liste',
    filterPlaylists: 'Filtrer les listes…',
    playlistName: 'Nom de la liste',
    cancel: 'Annuler',
    save: 'Enregistrer',
    loadPlaylist: 'Charger une liste',
    loading: 'Chargement…',
    noPlaylists: 'Aucune liste trouvée.',
    load: 'Remplacer la file et lire',
    appendToQueue: 'Ajouter à la file',
    delete: 'Supprimer',
    deleteConfirm: 'Supprimer la liste « {{name}} » ?',
    clear: 'Vider',
    shuffle: 'Mélanger la file',
    gapless: 'Sans blanc',
    crossfade: 'Fondu',
    infiniteQueue: 'File infinie',
    autoAdded: '— Ajouté automatiquement —',
    radioAdded: '— Radio —',
    hide: 'Masquer',
    close: 'Fermer',
    nextTracks: 'Pistes suivantes',
    emptyQueue: 'La file d\'attente est vide.',
    trackSingular: 'piste',
    trackPlural: 'pistes',
    showRemaining: 'Afficher le temps restant',
    showTotal: 'Afficher la durée totale',
  },
  statistics: {
    title: 'Statistiques',
    recentlyPlayed: 'Écoutés récemment',
    mostPlayed: 'Albums les plus écoutés',
    highestRated: 'Albums les mieux notés',
    genreDistribution: 'Répartition par genre (Top 20)',
    loadMore: 'Charger plus',
    statArtists: 'Artistes',
    statAlbums: 'Albums',
    statSongs: 'Morceaux',
    statGenres: 'Genres',
    genreSongs: '{{count}} morceaux',
    genreAlbums: '{{count}} albums',
    recentlyAdded: 'Ajoutés récemment',
    decadeDistribution: 'Albums par décennie',
    decadeAlbums_one: '{{count}} album',
    decadeAlbums_other: '{{count}} albums',
    decadeUnknown: 'Inconnu',
    lfmTitle: 'Stats Last.fm',
    lfmTopArtists: 'Artistes favoris',
    lfmTopAlbums: 'Albums favoris',
    lfmTopTracks: 'Morceaux favoris',
    lfmPlays: '{{count}} écoutes',
    lfmPeriodOverall: 'Tout le temps',
    lfmPeriod7day: '7 jours',
    lfmPeriod1month: '1 mois',
    lfmPeriod3month: '3 mois',
    lfmPeriod6month: '6 mois',
    lfmPeriod12month: '12 mois',
    lfmNotConnected: 'Connectez Last.fm dans les Paramètres pour voir vos stats.',
    lfmRecentTracks: 'Scrobbles récents',
    lfmNowPlaying: 'En cours de lecture',
    lfmJustNow: 'à l\'instant',
    lfmMinutesAgo: 'il y a {{n}} min',
    lfmHoursAgo: 'il y a {{n}}h',
    lfmDaysAgo: 'il y a {{n}}j',
  },
  player: {
    regionLabel: 'Lecteur de musique',
    openFullscreen: 'Ouvrir le lecteur plein écran',
    fullscreen: 'Lecteur plein écran',
    closeFullscreen: 'Fermer le plein écran',
    closeTooltip: 'Fermer (Échap)',
    noTitle: 'Sans titre',
    stop: 'Arrêter',
    prev: 'Piste précédente',
    play: 'Lecture',
    pause: 'Pause',
    next: 'Piste suivante',
    repeat: 'Répéter',
    repeatOff: 'Désactivé',
    repeatAll: 'Tout',
    repeatOne: 'Un',
    progress: 'Progression',
    volume: 'Volume',
    toggleQueue: 'Afficher/masquer la file',
    lyrics: 'Paroles',
    lyricsLoading: 'Chargement des paroles…',
    lyricsNotFound: 'Aucune parole trouvée pour ce titre',
  },
  songInfo: {
    title: 'Infos du morceau',
    songTitle: 'Titre',
    artist: 'Artiste',
    album: 'Album',
    albumArtist: 'Artiste de l\'album',
    year: 'Année',
    genre: 'Genre',
    duration: 'Durée',
    track: 'Piste',
    format: 'Format',
    bitrate: 'Débit',
    sampleRate: 'Fréquence d\'échantillonnage',
    bitDepth: 'Profondeur de bits',
    channels: 'Canaux',
    fileSize: 'Taille du fichier',
    path: 'Emplacement',
    replayGainTrack: 'RG Gain de piste',
    replayGainAlbum: 'RG Gain d\'album',
    replayGainPeak: 'RG Crête de piste',
    mono: 'Mono',
    stereo: 'Stéréo',
  },
  playlists: {
    title: 'Playlists',
    newPlaylist: 'Nouvelle playlist',
    unnamed: 'Playlist sans nom',
    createName: 'Nom de la playlist…',
    create: 'Créer',
    cancel: 'Annuler',
    empty: 'Aucune playlist pour l\'instant.',
    emptyPlaylist: 'Cette playlist est vide.',
    addFirstSong: 'Ajouter votre premier titre',
    notFound: 'Playlist introuvable.',
    songs: '{{n}} titres',
    playAll: 'Tout lire',
    shuffle: 'Aléatoire',
    addToQueue: 'Ajouter à la file',
    back: 'Retour aux playlists',
    deletePlaylist: 'Supprimer',
    confirmDelete: 'Cliquer à nouveau pour confirmer',
    removeSong: 'Retirer de la playlist',
    addSongs: 'Ajouter des titres',
    searchPlaceholder: 'Rechercher dans la bibliothèque…',
    noResults: 'Aucun résultat.',
    suggestions: 'Titres suggérés',
    noSuggestions: 'Aucune suggestion disponible.',
    titleBadge: 'Playlist',
    refreshSuggestions: 'Nouvelles suggestions',
    addSong: 'Ajouter à la playlist',
    cacheOffline: 'Mettre la playlist hors ligne',
    offlineCached: 'Playlist en cache',
    offlineDownloading: 'En cache… ({{done}}/{{total}} albums)',
  },
  radio: {
    title: 'Radio Internet',
    empty: 'Aucune station radio configurée.',
    addStation: 'Ajouter une station',
    editStation: 'Modifier',
    deleteStation: 'Supprimer la station',
    confirmDelete: 'Cliquer à nouveau pour confirmer',
    stationName: 'Nom de la station…',
    streamUrl: 'URL du flux…',
    homepageUrl: 'URL de la page d\'accueil (optionnel)',
    save: 'Enregistrer',
    cancel: 'Annuler',
    live: 'LIVE',
    liveStream: 'Radio Internet',
    openHomepage: 'Ouvrir la page d\'accueil',
  }
};

// Dutch Translations
const nlTranslation = {
  sidebar: {
    library: 'Bibliotheek',
    mainstage: 'Hoofdpodium',
    newReleases: 'Nieuw',
    allAlbums: 'Alle albums',
    randomAlbums: 'Willekeurige albums',
    artists: 'Artiesten',
    randomMix: 'Willekeurige mix',
    favorites: 'Favorieten',
    nowPlaying: 'Nu bezig',
    system: 'Systeem',
    statistics: 'Statistieken',
    settings: 'Instellingen',
    help: 'Help',
    expand: 'Zijbalk uitklappen',
    collapse: 'Zijbalk inklappen',
    updateAvailable: 'Update beschikbaar',
    updateReady: '{{version}} is klaar',
    updateLink: 'Naar release →',
    downloadingTracks: '{{n}} nummers worden gecached…',
    offlineLibrary: 'Offline bibliotheek',
    genres: 'Genres',
    playlists: 'Playlists',
    radio: 'Internetradio',
  },
  home: {
    hero: 'Uitgelicht',
    starred: 'Persoonlijke favorieten',
    recent: 'Recent toegevoegd',
    mostPlayed: 'Meest gespeeld',
    recentlyPlayed: 'Recent afgespeeld',
    discover: 'Ontdekken',
    loadMore: 'Meer laden',
    discoverMore: 'Meer ontdekken',
    discoverArtists: 'Artiesten ontdekken',
    discoverArtistsMore: 'Alle artiesten'
  },
  hero: {
    eyebrow: 'Uitgelicht album',
    playAlbum: 'Album afspelen',
    enqueue: 'In wachtrij',
    enqueueTooltip: 'Volledig album aan wachtrij toevoegen',
  },
  search: {
    placeholder: 'Zoek naar artiest, album of nummer…',
    noResults: 'Geen resultaten voor "{{query}}"',
    artists: 'Artiesten',
    albums: 'Albums',
    songs: 'Nummers',
    clearLabel: 'Zoekopdracht wissen',
    title: 'Zoeken',
    resultsFor: 'Resultaten voor "{{query}}"',
    album: 'Album',
    advanced: 'Geavanceerd zoeken',
    advancedSearchTerm: 'Zoekterm',
    advancedSearchPlaceholder: 'Titel, album, artiest…',
    advancedGenre: 'Genre',
    advancedAllGenres: 'Alle genres',
    advancedYear: 'Jaar',
    advancedYearFrom: 'van',
    advancedYearTo: 'tot',
    advancedAll: 'Alle',
    advancedSearch: 'Zoeken',
    advancedEmpty: 'Voer een zoekterm in of selecteer een filter.',
    advancedNoResults: 'Geen resultaten gevonden.',
    advancedGenreNote: 'Nummers worden willekeurig uit dit genre geselecteerd.',
  },
  nowPlaying: {
    tooltip: 'Wie luistert er?',
    title: 'Wie luistert er?',
    loading: 'Laden…',
    nobody: 'Er luistert momenteel niemand.',
    minutesAgo: '{{n}} min geleden',
    nothingPlaying: 'Nog niets bezig. Start een nummer!',
    aboutArtist: 'Over de artiest',
    fromAlbum: 'Van dit album',
    viewAlbum: 'Album openen',
    goToArtist: 'Naar artiest',
    readMore: 'Meer lezen',
    showLess: 'Minder tonen',
    genreInfo: 'Genre',
    trackInfo: 'Trackinfo',
  },
  contextMenu: {
    playNow: 'Nu afspelen',
    playNext: 'Volgende afspelen',
    addToQueue: 'Aan wachtrij toevoegen',
    enqueueAlbum: 'Album in wachtrij',
    startRadio: 'Radio starten',
    lfmLove: 'Liken op Last.fm',
    lfmUnlove: 'Niet meer liken op Last.fm',
    favorite: 'Favoriet',
    favoriteArtist: 'Favoriete artiest',
    favoriteAlbum: 'Favoriet album',
    unfavorite: 'Verwijderen uit favorieten',
    unfavoriteArtist: 'Artiest uit favorieten verwijderen',
    unfavoriteAlbum: 'Album uit favorieten verwijderen',
    removeFromQueue: 'Uit wachtrij verwijderen',
    openAlbum: 'Album openen',
    goToArtist: 'Naar artiest',
    download: 'Downloaden (ZIP)',
    addToPlaylist: 'Toevoegen aan playlist',
    songInfo: 'Nummerinfo',
  },
  albumDetail: {
    back: 'Terug',
    playAll: 'Alles afspelen',
    enqueue: 'In wachtrij',
    enqueueTooltip: 'Volledig album aan wachtrij toevoegen',
    artistBio: 'Artiest biografie',
    download: 'Downloaden (ZIP)',
    downloading: 'Laden…',
    cacheOffline: 'Offline beschikbaar maken',
    offlineCached: 'Offline beschikbaar',
    offlineDownloading: 'Wordt gecached… ({{n}}/{{total}})',
    removeOffline: 'Offline cache verwijderen',
    offlineStorageFull: 'Offline opslag vol (limiet: {{mb}} MB). Verwijder een album uit je offline bibliotheek of verhoog de limiet in de instellingen.',
    offlineStorageGoToSettings: 'Instellingen',
    offlineStorageGoToLibrary: 'Offline bibliotheek',
    favoriteAdd: 'Aan favorieten toevoegen',
    favoriteRemove: 'Uit favorieten verwijderen',
    favorite: 'Favoriet',
    noBio: 'Geen biografie beschikbaar.',
    moreByArtist: 'Meer van {{artist}}',
    tracksCount: '{{n}} nummers',
    goToArtist: 'Naar {{artist}}',
    moreLabelAlbums: 'Meer albums op {{label}}',
    trackTitle: 'Titel',
    trackArtist: 'Artiest',
    trackGenre: 'Genre',
    trackFormat: 'Formaat',
    trackFavorite: 'Favoriet',
    trackRating: 'Beoordeling',
    trackDuration: 'Duur',
    trackTotal: 'Totaal',
    columns: 'Kolommen',
    notFound: 'Album niet gevonden.',
    bioModal: 'Artiest biografie',
    bioClose: 'Sluiten',
    ratingLabel: 'Beoordeling',
    enlargeCover: 'Vergroten',
  },
  artistDetail: {
    back: 'Terug',
    albums: 'Albums',
    album: 'Album',
    playAll: 'Alles afspelen',
    shuffle: 'Willekeurig',
    radio: 'Radio',
    loading: 'Laden…',
    noRadio: 'Geen vergelijkbare nummers gevonden voor deze artiest.',
    notFound: 'Artiest niet gevonden.',
    albumsBy: 'Albums van {{name}}',
    topTracks: 'Populaire nummers',
    noAlbums: 'Geen albums gevonden.',
    trackTitle: 'Titel',
    trackAlbum: 'Album',
    trackDuration: 'Duur',
    favoriteAdd: 'Aan favorieten toevoegen',
    favoriteRemove: 'Uit favorieten verwijderen',
    favorite: 'Favoriet',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    openedInBrowser: 'Geopend in browser',
    featuredOn: 'Ook te vinden op',
    similarArtists: 'Vergelijkbare artiesten',
    cacheOffline: 'Discografie offline opslaan',
    offlineCached: 'Discografie gecached',
    offlineDownloading: 'Cachen… ({{done}}/{{total}} albums)',
  },
  favorites: {
    title: 'Favorieten',
    empty: 'Je hebt nog geen favorieten opgeslagen.',
    artists: 'Artiesten',
    albums: 'Albums',
    songs: 'Nummers',
    enqueueAll: 'Alles aan wachtrij toevoegen',
    playAll: 'Alles afspelen',
    removeSong: 'Verwijderen uit favorieten',
  },
  randomAlbums: {
    title: 'Willekeurige albums',
    refresh: 'Vernieuwen',
  },
  genres: {
    title: 'Genres',
    genreCount: 'genres',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
    loading: 'Genres laden…',
    empty: 'Geen genres gevonden.',
    albumsLoading: 'Albums laden…',
    albumsEmpty: 'Geen albums gevonden voor dit genre.',
    loadMore: 'Meer laden',
    back: 'Terug',
  },
  randomMix: {
    title: 'Willekeurige mix',
    remix: 'Opnieuw mixen',
    remixTooltip: 'Nieuwe willekeurige nummers laden',
    playAll: 'Alles afspelen',
    trackTitle: 'Titel',
    trackArtist: 'Artiest',
    trackAlbum: 'Album',
    trackFavorite: 'Favoriet',
    trackDuration: 'Duur',
    favoriteAdd: 'Aan favorieten toevoegen',
    favoriteRemove: 'Uit favorieten verwijderen',
    play: 'Afspelen',
    trackGenre: 'Genre',
    excludeAudiobooks: 'Luisterboeken en hoorspelen uitsluiten',
    excludeAudiobooksDesc: 'Vergelijkt trefwoorden met genre, titel, album en artiest — bijv. Hörbuch, Audiobook, Spoken Word, …',
    genreBlocked: 'Trefwoord geblokkeerd',
    genreAddedToBlacklist: 'Aan filterlijst toegevoegd',
    genreAlreadyBlocked: 'Al geblokkeerd',
    artistBlocked: 'Artiest geblokkeerd',
    artistAddedToBlacklist: 'Artiest aan filterlijst toegevoegd',
    artistClickHint: 'Klik om deze artiest te blokkeren',
    blacklistToggle: 'Trefwoordfilter',
    genreMixTitle: 'Genremix',
    genreMixDesc: 'Top 20 genres op aantal nummers — klik voor een willekeurige mix',
    genreMixLoadMore: '10 meer laden',
    genreMixNoGenres: 'Geen genres gevonden op server.',
    shuffleGenres: 'Andere genres tonen',
    filterPanelTitle: 'Filters',
    filterPanelDesc: 'Klik op een genre-tag of artiestennaam in de lijst om deze uit toekomstige mixes te weren.',
    genreClickHint: 'Klik op een genre-tag om het\ntoe te voegen als filtertrefwoord.\nVergelijkt genre, titel, album & artiest.',
  },
  albums: {
    title: 'Alle albums',
    sortByName: 'A–Z (Album)',
    sortByArtist: 'A–Z (Artiest)',
    sortNewest: 'Nieuwste eerst',
    sortRandom: 'Willekeurig',
  },
  artists: {
    title: 'Artiesten',
    search: 'Zoeken…',
    all: 'Alle',
    gridView: 'Rasterweergave',
    listView: 'Lijstweergave',
    imagesOn: 'Artiestafbeeldingen aan — kan netwerk- en systeembelasting verhogen',
    imagesOff: 'Artiestafbeeldingen uit — toont alleen initialen',
    loadMore: 'Meer laden',
    notFound: 'Geen artiesten gevonden.',
    albumCount_one: '{{count}} album',
    albumCount_other: '{{count}} albums',
  },
  login: {
    subtitle: 'Jouw Navidrome-desktopspeler',
    serverName: 'Servernaam (optioneel)',
    serverNamePlaceholder: 'Mijn Navidrome',
    serverUrl: 'Server-URL',
    serverUrlPlaceholder: '192.168.1.100:4533 of music.voorbeeld.nl',
    username: 'Gebruikersnaam',
    usernamePlaceholder: 'admin',
    password: 'Wachtwoord',
    showPassword: 'Wachtwoord tonen',
    hidePassword: 'Wachtwoord verbergen',
    connect: 'Verbinden',
    connecting: 'Verbinden…',
    connected: 'Verbonden!',
    error: 'Verbinding mislukt — controleer je gegevens.',
    urlRequired: 'Voer een server-URL in.',
    savedServers: 'Opgeslagen servers',
    addNew: 'Of een nieuwe server toevoegen',
  },
  connection: {
    connected: 'Verbonden',
    connectedTo: 'Verbonden met {{server}}',
    disconnected: 'Verbroken',
    disconnectedFrom: 'Kan {{server}} niet bereiken — klik om instellingen te controleren',
    checking: 'Verbinden…',
    extern: 'Extern',
    offlineTitle: 'Geen serververbinding',
    offlineSubtitle: 'Kan {{server}} niet bereiken. Controleer je netwerk of server.',
    offlineModeBanner: 'Offline modus — afspelen vanuit lokale cache',
    offlineLibraryTitle: 'Offline bibliotheek',
    offlineLibraryEmpty: 'Nog geen albums gecached. Ga online, open een album en klik op "Offline beschikbaar maken".',
    offlineAlbumCount: '{{n}} album',
    offlineAlbumCount_plural: '{{n}} albums',
    offlineFilterAll: 'Alles',
    offlineFilterAlbums: 'Albums',
    offlineFilterPlaylists: 'Afspeellijsten',
    offlineFilterArtists: 'Discografieën',
    retry: 'Opnieuw proberen',
    lastfmConnected: 'Last.fm verbonden als @{{user}}',
    lastfmSessionInvalid: 'Sessie ongeldig — klik om opnieuw te verbinden',
  },
  common: {
    albums: 'Albums',
    album: 'Album',
    loading: 'Laden…',
    loadingMore: 'Laden…',
    loadingPlaylists: 'Afspeellijsten laden…',
    noAlbums: 'Geen albums gevonden.',
    downloading: 'Downloaden…',
    downloadZip: 'Downloaden (ZIP)',
    back: 'Terug',
    cancel: 'Annuleren',
    save: 'Opslaan',
    delete: 'Verwijderen',
    use: 'Gebruiken',
    add: 'Toevoegen',
    active: 'Actief',
    download: 'Downloaden',
    chooseDownloadFolder: 'Downloadmap kiezen',
    noFolderSelected: 'Geen map geselecteerd',
    rememberDownloadFolder: 'Deze map onthouden',
    filterGenre: 'Genre-filter',
    filterSearchGenres: 'Genres zoeken…',
    filterNoGenres: 'Geen genres gevonden',
    filterClear: 'Wissen',
    bulkSelected: '{{count}} geselecteerd',
    bulkAddToPlaylist: 'Toevoegen aan afspeellijst',
    bulkRemoveFromPlaylist: 'Verwijderen uit afspeellijst',
    bulkClear: 'Selectie wissen',
    updaterAvailable: 'Update beschikbaar',
    updaterVersion: 'v{{version}} is klaar',
    updaterInstall: 'Installeren & Herstarten',
    updaterDownloading: 'Downloaden…',
    updaterInstalling: 'Installeren…',
    updaterDownload: 'Downloaden van GitHub',
    updaterExperimentalHint: 'Automatisch bijwerken is nog in ontwikkeling',
  },
  settings: {
    title: 'Instellingen',
    language: 'Taal',
    languageEn: 'Engels',
    languageDe: 'Duits',
    languageFr: 'Frans',
    languageNl: 'Nederlands',
    languageZh: 'Chinees',
    font: 'Lettertype',
    theme: 'Thema',
    appearance: 'Weergave',
    servers: 'Servers',
    serverName: 'Servernaam',
    serverUrl: 'Server-URL',
    serverUsername: 'Gebruikersnaam',
    serverPassword: 'Wachtwoord',
    addServer: 'Server toevoegen',
    addServerTitle: 'Nieuwe server toevoegen',
    useServer: 'Gebruiken',
    deleteServer: 'Verwijderen',
    noServers: 'Geen servers opgeslagen.',
    serverActive: 'Actief',
    confirmDeleteServer: 'Server "{{name}}" verwijderen?',
    serverConnecting: 'Verbinden…',
    serverConnected: 'Verbonden!',
    serverFailed: 'Verbinding mislukt.',
    testBtn: 'Verbinding testen',
    testingBtn: 'Testen…',
    serverCompatible: 'Compatibel met: Navidrome · Gonic · Airsonic · Subsonic',
    connected: 'Verbonden',
    failed: 'Mislukt',
    eqTitle: 'Equalizer',
    eqEnabled: 'Equalizer inschakelen',
    eqPreset: 'Voorinstelling',
    eqPresetCustom: 'Aangepast',
    eqPresetBuiltin: 'Ingebouwde voorinstellingen',
    eqPresetCustomGroup: 'Mijn voorinstellingen',
    eqSavePreset: 'Opslaan als voorinstelling',
    eqPresetName: 'Naam voorinstelling…',
    eqDeletePreset: 'Voorinstelling verwijderen',
    eqResetBands: 'Terugzetten naar vlak',
    eqPreGain: 'Voorversterking',
    eqResetPreGain: 'Voorversterking resetten',
    eqAutoEqTitle: 'AutoEQ Hoofdtelefoon Zoeken',
    eqAutoEqPlaceholder: 'Zoek hoofdtelefoon / IEM model…',
    eqAutoEqSearching: 'Zoeken…',
    eqAutoEqNoResults: 'Geen resultaten gevonden',
    eqAutoEqError: 'Zoeken mislukt',
    eqAutoEqRateLimit: 'GitHub limiet bereikt — probeer over een minuut opnieuw',
    eqAutoEqFetchError: 'EQ-profiel kon niet worden geladen',
    lfmTitle: 'Last.fm',
    lfmConnect: 'Verbinden met Last.fm',
    lfmConnecting: 'Wachten op autorisatie…',
    lfmConfirm: 'Ik heb de app geautoriseerd',
    lfmConnected: 'Verbonden als',
    lfmDisconnect: 'Verbinding verbreken',
    lfmConnectDesc: 'Verbind je Last.fm-account om scrobbling en Nu bezig-updates rechtstreeks vanuit Psysonic in te schakelen — geen Navidrome-configuratie vereist.',
    lfmOpenBrowser: 'Er opent een browservenster. Autoriseer Psysonic op Last.fm en klik daarna op de knop hieronder.',
    lfmScrobbles: '{{n}} scrobbles',
    lfmMemberSince: 'Lid sinds {{year}}',
    scrobbleEnabled: 'Scrobbling ingeschakeld',
    scrobbleDesc: 'Nummers naar Last.fm sturen na 50% afspeeltijd',
    behavior: 'App-gedrag',
    cacheTitle: 'Max. opslaggrootte',
    cacheDesc: 'Albumhoezen en artiestafbeeldingen. Als de cache vol is, worden de oudste items automatisch verwijderd. Offline albums worden niet automatisch verwijderd, maar wel bij handmatig leegmaken.',
    cacheUsed: 'Gebruikt: {{images}} afbeeldingen · {{offline}} offline nummers',
    cacheClearBtn: 'Cache wissen',
    cacheClearWarning: 'Dit verwijdert ook alle offline albums uit de bibliotheek.',
    cacheClearConfirm: 'Alles wissen',
    cacheClearCancel: 'Annuleren',
    showArtistImages: 'Artiestafbeeldingen weergeven',
    showArtistImagesDesc: 'Laadt en toont artiestafbeeldingen in het artiestenoverzicht. Standaard uitgeschakeld om server-I/O en netwerkbelasting bij grote bibliotheken te beperken.',
    minimizeToTray: 'Minimaliseren naar systeemvak',
    minimizeToTrayDesc: 'Bij het sluiten van het venster blijft Psysonic actief in het systeemvak in plaats van af te sluiten.',
    discordRichPresence: 'Discord Rich Presence',
    discordRichPresenceDesc: 'Toont het huidige nummer op je Discord-profiel. Discord moet daarvoor geopend zijn.',
    nowPlayingEnabled: 'Weergeven in live-venster',
    nowPlayingEnabledDesc: 'Stuurt het huidige nummer naar de live-luisteraarsweergave van de server. Uitschakelen om geen afspeelgegevens te verzenden.',
    downloadsTitle: 'Downloadmap',
    downloadsDefault: 'Standaard downloadmap',
    pickFolder: 'Selecteren',
    pickFolderTitle: 'Downloadmap selecteren',
    clearFolder: 'Map wissen',
    logout: 'Uitloggen',
    aboutTitle: 'Over Psysonic',
    aboutDesc: 'Een moderne desktopmuziekspeeler voor Subsonic-compatibele servers (Navidrome, Gonic en anderen). Gebouwd op Tauri v2 met een native Rust audio-engine — licht en snel, maar boordevol functies: golfvorm-zoekbalk, gesynchroniseerde songteksten, Last.fm-integratie, 10-bands equalizer, crossfade, naadloos afspelen, Replay Gain, genres en een uitgebreide themabibliotheek.',
    aboutFeatures: 'Multi-server · Last.fm scrobbling & love · Fullscreen Ambient Stage · Waveform seek · Syncteksten · 10-bands EQ · Crossfade & Gapless · Replay Gain · Genres · 63 thema\'s · 5 talen',
    aboutLicense: 'Licentie',
    aboutLicenseText: 'GNU GPL v3 — vrij te gebruiken, wijzigen en verspreiden onder dezelfde licentie.',
    aboutRepo: 'Broncode op GitHub',
    aboutVersion: 'Versie',
    aboutBuiltWith: 'Gebouwd met Tauri · React · TypeScript · Rust/rodio',
    aboutAiCredit: 'Ontwikkeld met ondersteuning van Claude Code door Anthropic',
    aboutContributorsLabel: 'Bijdragers',
    aboutSpecialThanksLabel: 'Speciale dank',
    changelog: 'Wijzigingslog',
    showChangelogOnUpdate: "'Wat is nieuw' tonen bij update",
    showChangelogOnUpdateDesc: 'Toont automatisch de nieuwigheden bij de eerste start van een nieuwe versie.',
    randomMixTitle: 'Willekeurige mix',
    randomMixBlacklistTitle: 'Aangepaste filtertrefwoorden',
    randomMixBlacklistDesc: 'Nummers worden uitgesloten als een trefwoord overeenkomt met hun genre, titel, album of artiest (actief wanneer het selectievakje hierboven is aangevinkt).',
    randomMixBlacklistPlaceholder: 'Trefwoord toevoegen…',
    randomMixBlacklistAdd: 'Toevoegen',
    randomMixBlacklistEmpty: 'Nog geen aangepaste trefwoorden toegevoegd.',
    randomMixHardcodedTitle: 'Ingebouwde trefwoorden (actief wanneer selectievakje is aangevinkt)',
    tabPlayback: 'Afspelen',
    tabLibrary: 'Bibliotheek',
    tabAppearance: 'Weergave',
    homeCustomizerTitle: 'Startpagina',
    sidebarTitle: 'Zijbalk',
    sidebarReset: 'Standaard herstellen',
    sidebarDrag: 'Slepen om te herordenen',
    sidebarFixed: 'Altijd zichtbaar',
    tabShortcuts: 'Sneltoetsen',
    tabServer: 'Server',
    shortcutsReset: 'Standaard herstellen',
    shortcutListening: 'Druk op een toets…',
    shortcutUnbound: '—',
    shortcutClear: 'Wissen',
    globalShortcutsTitle: 'Globale sneltoetsen',
    globalShortcutsNote: 'Werken systeembreed, ook als Psysonic op de achtergrond draait. Vereist Ctrl, Alt of Super als modifier.',
    shortcutPlayPause: 'Afspelen / Pauzeren',
    shortcutNext: 'Volgend nummer',
    shortcutPrev: 'Vorig nummer',
    shortcutVolumeUp: 'Volume omhoog',
    shortcutVolumeDown: 'Volume omlaag',
    shortcutSeekForward: '10s vooruitspoelen',
    shortcutSeekBackward: '10s terugspoelen',
    shortcutToggleQueue: 'Wachtrij tonen/verbergen',
    shortcutFullscreenPlayer: 'Volledigschermspeler',
    shortcutNativeFullscreen: 'Systeemvolledig scherm',
    tabAbout: 'Over',
    playbackTitle: 'Afspelen',
    replayGain: 'Replay Gain',
    replayGainDesc: 'Nummervolume normaliseren met ReplayGain-metadata',
    replayGainMode: 'Modus',
    replayGainTrack: 'Nummer',
    replayGainAlbum: 'Album',
    crossfade: 'Overgang',
    crossfadeDesc: 'Fade tussen nummers',
    crossfadeSecs: '{{n}}s',
    notWithGapless: 'Niet beschikbaar als naadloos afspelen actief is',
    notWithCrossfade: 'Niet beschikbaar als overgang actief is',
    gapless: 'Naadloos afspelen',
    gaplessDesc: 'Volgend nummer vooraf bufferen om stiltes tussen nummers te elimineren',
    infiniteQueue: 'Oneindige wachtrij',
    infiniteQueueDesc: 'Automatisch willekeurige nummers toevoegen als de wachtrij leeg raakt',
    experimental: 'Experimenteel',
  },
  changelog: {
    modalTitle: 'Wat is nieuw',
    dontShowAgain: 'Niet meer weergeven',
    close: 'Begrepen',
  },
  help: {
    title: 'Help',
    s1: 'Aan de slag',
    q1: 'Welke servers zijn compatibel?',
    a1: 'Psysonic werkt met elke Subsonic-compatibele server: Navidrome, Gonic, Subsonic, Airsonic en anderen. Navidrome is de aanbevolen keuze.',
    q2: 'Hoe verbind ik me met mijn server?',
    a2: 'Open Instellingen en klik op "Server toevoegen". Voer de server-URL in (bijv. 192.168.1.100:4533), je gebruikersnaam en wachtwoord. Psysonic test de verbinding voor het opslaan.',
    q3: 'Kan ik meerdere servers gebruiken?',
    a3: 'Ja. Je kunt zoveel servers toevoegen als je wilt in Instellingen en er op elk moment tussen wisselen. Slechts één server is tegelijk actief.',
    s2: 'Afspelen',
    q4: 'Hoe speel ik muziek af?',
    a4: 'Dubbelklik op een nummer om het af te spelen. Gebruik op album- en artiestpagina\'s "Alles afspelen" om het hele album te starten. Je kunt ook nummers naar de wachtrij slepen.',
    q5: 'Welke sneltoetsen zijn beschikbaar?',
    a5: 'Spatie = Afspelen / Pauzeren · Escape = Volledig scherm sluiten. Mediatoetsen werken op alle platforms. Gebruik op Linux de knoppen van de spelerbalk. In-app sneltoetsen en systeembrede globale sneltoetsen zijn aan te passen via Instellingen → Sneltoetsen / Globale sneltoetsen.',
    q6: 'Wat is de wachtrij?',
    a6: 'De wachtrij toont alle komende nummers. Open deze met het paneelpictogram rechtsboven. Je kunt nummers herordenen door te slepen, shufflen en de wachtrij opslaan als afspeellijst.',
    q7: 'Hoe open ik de volledig-schermspeler?',
    a7: 'Klik op de albumhoes in de spelerbalk onderaan, of het uitvouwpictogram ernaast. Druk op Escape om te sluiten.',
    q8: 'Hoe werkt herhalen?',
    a8: 'Klik op de herhalknop om te wisselen: Uit → Alles herhalen → Één herhalen.',
    s3: 'Bibliotheek',
    q9: 'Hoe download ik een album?',
    a9: 'Open de detailpagina van een album en klik op "Downloaden (ZIP)". De server comprimeert het album eerst naar een ZIP-bestand — voor grote albums of verliesvrije bestanden (FLAC / WAV) kan het even duren voordat de download daadwerkelijk start. De voortgangsbalk verschijnt pas als de server klaar is met inpakken.',
    q10: 'Hoe markeer ik nummers en albums als favoriet?',
    a10: 'Klik op het sterpictogram op een nummervak of de albumkoptekst. Gemarkeerde items verschijnen in de sectie Favorieten in de zijbalk.',
    q11: 'Wat is de hero-carrousel op de startpagina?',
    a11: 'De banner bovenaan de startpagina kiest willekeurig albums uit je bibliotheek en wisselt deze elke 10 seconden af. Klik op de puntjes om naar een specifiek album te springen.',
    s4: 'Instellingen',
    q12: 'Hoe verander ik het thema?',
    a12: 'Instellingen → Thema. Een ruime keuze aan thema\'s in 8 groepen: Psysonic Themes, Mediaplayer, Besturingssystemen, Games, Films, Series, Social Media en Open Source Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'Hoe verander ik de taal?',
    a13: 'Instellingen → Taal. Engels, Duits, Frans, Nederlands en Chinees worden momenteel ondersteund.',
    q15: 'Hoe stel ik een downloadmap in?',
    a15: 'Instellingen → App-gedrag → Downloadmap. Gedownloade albums worden daar opgeslagen als ZIP-bestanden.',
    s5: 'Scrobbling',
    q16: 'Hoe werkt scrobbling?',
    a16: 'Psysonic scrobbelt rechtstreeks naar Last.fm — geen Navidrome-configuratie nodig. Verbind je Last.fm-account in Instellingen → Last.fm en schakel scrobbling in.',
    q17: 'Wanneer wordt een scrobble verstuurd?',
    a17: 'Een scrobble wordt verstuurd nadat je 50% van een nummer hebt geluisterd.',
    q22: 'Wat is de golfvorm in de spelerbalk?',
    a22: 'De golfvormzoekbalk vervangt de klassieke voortgangsschuifregelaar. Klik ergens om naar die positie te springen, of sleep om door het nummer te navigeren.',
    q24: 'Kan ik de wachtrij shufflen?',
    a24: 'Ja. Open het wachtrijpaneel en klik op het shufflepictogram. Het huidige nummer blijft op positie 1 — alle overige nummers worden willekeurig geherordend.',
    q25: 'Openen Last.fm- en Wikipedia-links in een browser?',
    a25: 'Ja — ze openen in je standaard systeembrowser. De knop toont kort een bevestiging bij klikken.',
    s7: 'Willekeurige mix',
    q26: 'Wat is de Willekeurige mix?',
    a26: 'De Willekeurige mix bouwt een afspeellijst van willekeurige nummers uit je hele bibliotheek. Open het via "Willekeurige mix" in de zijbalk en klik op "Nieuwe mix".',
    q27: 'Wat is het Trefwoordfilter?',
    a27: 'Het Trefwoordfilter sluit nummers uit waarvan het genre, de titel of de albumnaam bepaalde woorden bevat. Luisterboeken worden automatisch gefilterd. Voeg aangepaste trefwoorden toe in Instellingen → Willekeurige mix.',
    q28: 'Wat is de Super-genremix?',
    a28: 'De Super-genremix groepeert je bibliotheek in brede categorieën (Rock, Metal, Elektronisch, Jazz, Klassiek, enz.) en bouwt een gerichte mix van die stijl. Selecteer een categoriechip onder de lijst.',
    s6: 'Probleemoplossing',
    q18: 'Albumhoezen en artiestenafbeeldingen laden langzaam.',
    a18: 'Afbeeldingen worden bij het eerste laden van de schijf van je server opgehaald en vervolgens 30 dagen lokaal gecachet. Volgende bezoeken zijn direct.',
    q19: 'De verbindingstest mislukt.',
    a19: 'Controleer de URL inclusief de poort (bijv. http://192.168.1.100:4533). Zorg dat geen firewall de verbinding blokkeert. Probeer http:// in plaats van https:// op een lokaal netwerk.',
    q20: 'Geen audio op Linux.',
    a20: 'Psysonic is beschikbaar als .deb (Ubuntu/Debian), .rpm (Fedora/RHEL) en via AUR voor Arch/CachyOS (yay -S psysonic). Er is geen AppImage. Controleer of PipeWire of PulseAudio actief is als er geen audio is.',
    q21: 'De app toont een zwart scherm op Linux.',
    a21: 'Dit is meestal een GPU/EGL-driverprobleem in WebKitGTK. Start met GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1. Het AUR-pakket en officiële .deb/.rpm-installatieprogramma\'s doen dit automatisch.',
    q29: 'Wat zijn overgang (crossfade) en naadloos afspelen?',
    a29: 'Dit zijn experimentele audiofuncties in Instellingen → Audio. Naadloos afspelen buffert het volgende nummer voor om stiltes te elimineren. Overgang fadeert het huidige nummer uit terwijl het volgende infadeert — duur (1–10 s) instelbaar.',
    q30: 'Toont Psysonic songteksten?',
    a30: 'Ja. Klik op het microfoonpictogram in de spelerbalk om het tabblad Songteksten te openen. Psysonic haalt teksten automatisch op van LRCLIB. Als gesynchroniseerde teksten beschikbaar zijn, wordt de actieve regel gemarkeerd en scrolt mee in realtime. Anders wordt de volledige tekst statisch getoond.',
    q31: 'Kan ik sneltoetsen aanpassen?',
    a31: 'Ja. Instellingen → Sneltoetsen laat je in-app acties (Afspelen/Pauzeren, Volgende, Vorige, Volume, Volledig scherm, enz.) hertoewijzen. Instellingen → Globale sneltoetsen laat je systeembrede sneltoetsen instellen die werken ook als de app op de achtergrond staat.',
    q32: 'Kan ik het lettertype wijzigen?',
    a32: 'Ja. Instellingen → Lettertype biedt 10 lettertypen waaronder IBM Plex Mono, Fira Code, JetBrains Mono en Courier Prime. Het gekozen lettertype geldt voor de gehele interface.',
    s8: 'Offlinemodus',
    q34: 'Wat is de Offlinemodus?',
    a34: 'De Offlinemodus (Beta) laat je albums op het apparaat opslaan zodat je zonder actieve serververbinding kunt luisteren. Gecachte nummers worden lokaal opgeslagen en direct van schijf afgespeeld — zonder netwerkverzoek.',
    q35: 'Hoe sla ik een album op voor offline gebruik?',
    a35: 'Open een album en klik op het downloadpictogram in de albumkoptekst. Psysonic downloadt alle nummers op de achtergrond. De voortgang wordt op de knop weergegeven. Na het cachen wordt het pictogram groen. Gecachte albums zijn te bekijken en verwijderen via de Offline bibliotheek (zijbalk).',
    q36: 'Hoeveel opslagruimte mag de offlinecache gebruiken?',
    a36: 'Je kunt een maximale cachegrootte instellen via Instellingen → Bibliotheek. Als de limiet is bereikt, verschijnt er een waarschuwingsbanner op de albumpagina. Je kunt afzonderlijke albums verwijderen in de Offline bibliotheek om ruimte vrij te maken.',
  },
  queue: {
    title: 'Wachtrij',
    savePlaylist: 'Afspeellijst opslaan',
    updatePlaylist: 'Afspeellijst bijwerken',
    filterPlaylists: 'Afspeellijsten filteren…',
    playlistName: 'Naam afspeellijst',
    cancel: 'Annuleren',
    save: 'Opslaan',
    loadPlaylist: 'Afspeellijst laden',
    loading: 'Laden…',
    noPlaylists: 'Geen afspeellijsten gevonden.',
    load: 'Wachtrij vervangen & afspelen',
    appendToQueue: 'Toevoegen aan wachtrij',
    delete: 'Verwijderen',
    deleteConfirm: 'Afspeellijst "{{name}}" verwijderen?',
    clear: 'Leegmaken',
    shuffle: 'Wachtrij shufflen',
    gapless: 'Naadloos',
    crossfade: 'Overgang',
    infiniteQueue: 'Oneindige wachtrij',
    autoAdded: '— Automatisch toegevoegd —',
    radioAdded: '— Radio —',
    hide: 'Verbergen',
    close: 'Sluiten',
    nextTracks: 'Volgende nummers',
    emptyQueue: 'De wachtrij is leeg.',
    trackSingular: 'nummer',
    trackPlural: 'nummers',
    showRemaining: 'Resterende tijd tonen',
    showTotal: 'Totale tijd tonen',
  },
  statistics: {
    title: 'Statistieken',
    recentlyPlayed: 'Recent afgespeeld',
    mostPlayed: 'Meest gespeelde albums',
    highestRated: 'Best beoordeelde albums',
    genreDistribution: 'Genreverdeling (Top 20)',
    loadMore: 'Meer laden',
    statArtists: 'Artiesten',
    statAlbums: 'Albums',
    statSongs: 'Nummers',
    statGenres: 'Genres',
    genreSongs: '{{count}} nummers',
    genreAlbums: '{{count}} albums',
    recentlyAdded: 'Recent toegevoegd',
    decadeDistribution: 'Albums per decennium',
    decadeAlbums_one: '{{count}} album',
    decadeAlbums_other: '{{count}} albums',
    decadeUnknown: 'Onbekend',
    lfmTitle: 'Last.fm-statistieken',
    lfmTopArtists: 'Topartiesten',
    lfmTopAlbums: 'Topalbums',
    lfmTopTracks: 'Topnummers',
    lfmPlays: '{{count}} keer gespeeld',
    lfmPeriodOverall: 'Alle tijd',
    lfmPeriod7day: '7 dagen',
    lfmPeriod1month: '1 maand',
    lfmPeriod3month: '3 maanden',
    lfmPeriod6month: '6 maanden',
    lfmPeriod12month: '12 maanden',
    lfmNotConnected: 'Verbind Last.fm in Instellingen om je statistieken te zien.',
    lfmRecentTracks: 'Recente scrobbles',
    lfmNowPlaying: 'Nu bezig',
    lfmJustNow: 'zojuist',
    lfmMinutesAgo: '{{n}} min geleden',
    lfmHoursAgo: '{{n}} uur geleden',
    lfmDaysAgo: '{{n}} dagen geleden',
  },
  player: {
    regionLabel: 'Muziekspeler',
    openFullscreen: 'Volledig-schermspeler openen',
    fullscreen: 'Volledig-schermspeler',
    closeFullscreen: 'Volledig scherm sluiten',
    closeTooltip: 'Sluiten (Escape)',
    noTitle: 'Geen titel',
    stop: 'Stoppen',
    prev: 'Vorig nummer',
    play: 'Afspelen',
    pause: 'Pauzeren',
    next: 'Volgend nummer',
    repeat: 'Herhalen',
    repeatOff: 'Uit',
    repeatAll: 'Alles',
    repeatOne: 'Één',
    progress: 'Nummervoortgang',
    volume: 'Volume',
    toggleQueue: 'Wachtrij in-/uitschakelen',
    lyrics: 'Songtekst',
    lyricsLoading: 'Songtekst laden…',
    lyricsNotFound: 'Geen songtekst gevonden voor dit nummer',
  },
  songInfo: {
    title: 'Nummerinfo',
    songTitle: 'Titel',
    artist: 'Artiest',
    album: 'Album',
    albumArtist: 'Albumartiest',
    year: 'Jaar',
    genre: 'Genre',
    duration: 'Duur',
    track: 'Track',
    format: 'Formaat',
    bitrate: 'Bitrate',
    sampleRate: 'Samplefrequentie',
    bitDepth: 'Bitdiepte',
    channels: 'Kanalen',
    fileSize: 'Bestandsgrootte',
    path: 'Locatie',
    replayGainTrack: 'RG Track Gain',
    replayGainAlbum: 'RG Album Gain',
    replayGainPeak: 'RG Track Peak',
    mono: 'Mono',
    stereo: 'Stereo',
  },
  playlists: {
    title: 'Playlists',
    newPlaylist: 'Nieuwe playlist',
    unnamed: 'Naamloze playlist',
    createName: 'Playlistnaam…',
    create: 'Aanmaken',
    cancel: 'Annuleren',
    empty: 'Nog geen playlists.',
    emptyPlaylist: 'Deze playlist is leeg.',
    addFirstSong: 'Voeg je eerste nummer toe',
    notFound: 'Playlist niet gevonden.',
    songs: '{{n}} nummers',
    playAll: 'Alles afspelen',
    shuffle: 'Willekeurig',
    addToQueue: 'Aan wachtrij toevoegen',
    back: 'Terug naar playlists',
    deletePlaylist: 'Verwijderen',
    confirmDelete: 'Nogmaals klikken om te bevestigen',
    removeSong: 'Uit playlist verwijderen',
    addSongs: 'Nummers toevoegen',
    searchPlaceholder: 'Doorzoek bibliotheek…',
    noResults: 'Geen resultaten.',
    suggestions: 'Aanbevolen nummers',
    noSuggestions: 'Geen suggesties beschikbaar.',
    titleBadge: 'Playlist',
    refreshSuggestions: 'Nieuwe suggesties',
    addSong: 'Toevoegen aan playlist',
    cacheOffline: 'Playlist offline opslaan',
    offlineCached: 'Playlist gecached',
    offlineDownloading: 'Cachen… ({{done}}/{{total}} albums)',
  },
  radio: {
    title: 'Internetradio',
    empty: 'Geen radiostations geconfigureerd.',
    addStation: 'Station toevoegen',
    editStation: 'Bewerken',
    deleteStation: 'Station verwijderen',
    confirmDelete: 'Klik opnieuw om te bevestigen',
    stationName: 'Stationsnaam…',
    streamUrl: 'Stream-URL…',
    homepageUrl: 'Homepage-URL (optioneel)',
    save: 'Opslaan',
    cancel: 'Annuleren',
    live: 'LIVE',
    liveStream: 'Internetradio',
    openHomepage: 'Homepage openen',
  }
};

// Chinese Translations
const zhTranslation = {
  sidebar: {
    library: '音乐库',
    mainstage: '主舞台',
    newReleases: '新发布',
    allAlbums: '全部专辑',
    randomAlbums: '随机专辑',
    artists: '艺术家',
    randomMix: '随机混音',
    favorites: '收藏夹',
    nowPlaying: '正在播放',
    system: '系统',
    statistics: '统计',
    settings: '设置',
    help: '帮助',
    expand: '展开侧边栏',
    collapse: '收起侧边栏',
    updateAvailable: '有可用更新',
    updateReady: '{{version}} 已就绪',
    updateLink: '前往发布页面 →',
    downloadingTracks: '正在缓存 {{n}} 首歌曲…',
    offlineLibrary: '离线音乐库',
    genres: '流派',
    playlists: '播放列表',
    radio: '网络电台',
  },
  home: {
    hero: '精选',
    starred: '个人收藏',
    recent: '最近添加',
    mostPlayed: '最常播放',
    recentlyPlayed: '最近播放',
    discover: '发现',
    loadMore: '加载更多',
    discoverMore: '发现更多',
    discoverArtists: '发现艺术家',
    discoverArtistsMore: '全部艺术家'
  },
  hero: {
    eyebrow: '精选专辑',
    playAlbum: '播放专辑',
    enqueue: '加入队列',
    enqueueTooltip: '将整张专辑添加到播放队列',
  },
  search: {
    placeholder: '搜索艺术家、专辑或歌曲…',
    noResults: '未找到 "{{query}}" 的相关结果',
    artists: '艺术家',
    albums: '专辑',
    songs: '歌曲',
    clearLabel: '清除搜索',
    title: '搜索',
    resultsFor: '"{{query}}" 的搜索结果',
    album: '专辑',
    advanced: '高级搜索',
    advancedSearchTerm: '搜索词',
    advancedSearchPlaceholder: '标题、专辑、艺术家…',
    advancedGenre: '流派',
    advancedAllGenres: '所有流派',
    advancedYear: '年份',
    advancedYearFrom: '从',
    advancedYearTo: '至',
    advancedAll: '全部',
    advancedSearch: '搜索',
    advancedEmpty: '请输入搜索词或选择过滤器。',
    advancedNoResults: '未找到结果。',
    advancedGenreNote: '歌曲从该流派中随机选取。',
  },
  nowPlaying: {
    tooltip: '谁正在收听？',
    title: '谁正在收听？',
    loading: '加载中…',
    nobody: '当前无人收听。',
    minutesAgo: '{{n}} 分钟前',
    nothingPlaying: '尚未开始播放。开始播放一首歌曲吧！',
    aboutArtist: '关于艺术家',
    fromAlbum: '来自此专辑',
    viewAlbum: '查看专辑',
    goToArtist: '前往艺术家',
    readMore: '阅读更多',
    showLess: '收起',
    genreInfo: '流派',
    trackInfo: '曲目信息',
  },
  contextMenu: {
    playNow: '立即播放',
    playNext: '下一首播放',
    addToQueue: '添加到队列',
    enqueueAlbum: '专辑加入队列',
    startRadio: '开始电台',
    lfmLove: '在 Last.fm 上标记喜欢',
    lfmUnlove: '取消 Last.fm 喜欢标记',
    favorite: '收藏',
    favoriteArtist: '收藏艺术家',
    favoriteAlbum: '收藏专辑',
    unfavorite: '取消收藏',
    unfavoriteArtist: '取消收藏艺术家',
    unfavoriteAlbum: '取消收藏专辑',
    removeFromQueue: '从队列中移除',
    openAlbum: '打开专辑',
    goToArtist: '前往艺术家',
    download: '下载 (ZIP)',
    addToPlaylist: '添加到播放列表',
    songInfo: '歌曲信息',
  },
  albumDetail: {
    back: '返回',
    playAll: '全部播放',
    enqueue: '加入队列',
    enqueueTooltip: '将整张专辑添加到播放队列',
    artistBio: '艺术家简介',
    download: '下载 (ZIP)',
    downloading: '加载中…',
    cacheOffline: '设为离线可用',
    offlineCached: '已离线缓存',
    offlineDownloading: '正在缓存… ({{n}}/{{total}})',
    removeOffline: '移除离线缓存',
    offlineStorageFull: '离线存储空间已满（限制：{{mb}} MB）。请从离线音乐库中删除专辑以释放空间，或在设置中增加限制。',
    offlineStorageGoToLibrary: '离线音乐库',
    offlineStorageGoToSettings: '设置',
    favoriteAdd: '添加到收藏',
    favoriteRemove: '从收藏中移除',
    favorite: '收藏',
    noBio: '暂无简介。',
    moreByArtist: '{{artist}} 的更多作品',
    tracksCount: '{{n}} 首曲目',
    goToArtist: '前往 {{artist}}',
    moreLabelAlbums: '{{label}} 的更多专辑',
    trackTitle: '标题',
    trackArtist: '艺术家',
    trackGenre: '流派',
    trackFormat: '格式',
    trackFavorite: '收藏',
    trackRating: '评分',
    trackDuration: '时长',
    trackTotal: '总计',
    columns: '列',
    notFound: '未找到专辑。',
    bioModal: '艺术家简介',
    bioClose: '关闭',
    ratingLabel: '评分',
    enlargeCover: '放大',
  },
  artistDetail: {
    back: '返回',
    albums: '专辑',
    album: '专辑',
    playAll: '全部播放',
    shuffle: '随机播放',
    radio: '电台',
    loading: '加载中…',
    noRadio: '未找到该艺术家的相似曲目。',
    notFound: '未找到艺术家。',
    albumsBy: '{{name}} 的专辑',
    topTracks: '热门曲目',
    noAlbums: '未找到专辑。',
    trackTitle: '标题',
    trackAlbum: '专辑',
    trackDuration: '时长',
    favoriteAdd: '添加到收藏',
    favoriteRemove: '从收藏中移除',
    favorite: '收藏',
    albumCount_one: '{{count}} 张专辑',
    albumCount_other: '{{count}} 张专辑',
    openedInBrowser: '已在浏览器中打开',
    featuredOn: '还出现在',
    similarArtists: '相似艺术家',
    cacheOffline: '离线保存全部专辑',
    offlineCached: '全部专辑已缓存',
    offlineDownloading: '正在缓存… ({{done}}/{{total}} 张专辑)',
  },
  favorites: {
    title: '收藏夹',
    empty: '您还没有保存任何收藏。',
    artists: '艺术家',
    albums: '专辑',
    songs: '歌曲',
    enqueueAll: '全部加入队列',
    playAll: '全部播放',
    removeSong: '从收藏中移除',
  },
  randomAlbums: {
    title: '随机专辑',
    refresh: '刷新',
  },
  genres: {
    title: '流派',
    genreCount: '个流派',
    albumCount_one: '{{count}} 张专辑',
    albumCount_other: '{{count}} 张专辑',
    loading: '正在加载流派…',
    empty: '未找到流派。',
    albumsLoading: '正在加载专辑…',
    albumsEmpty: '未找到该流派的专辑。',
    loadMore: '加载更多',
    back: '返回',
  },
  randomMix: {
    title: '随机混音',
    remix: '重新混音',
    remixTooltip: '加载新的随机歌曲',
    playAll: '全部播放',
    trackTitle: '标题',
    trackArtist: '艺术家',
    trackAlbum: '专辑',
    trackFavorite: '收藏',
    trackDuration: '时长',
    favoriteAdd: '添加到收藏',
    favoriteRemove: '从收藏中移除',
    play: '播放',
    trackGenre: '流派',
    excludeAudiobooks: '排除有声读物和广播剧',
    excludeAudiobooksDesc: '根据流派、标题、专辑和艺术家匹配关键词 — 例如 Hörbuch、Audiobook、Spoken Word 等',
    genreBlocked: '关键词已屏蔽',
    genreAddedToBlacklist: '已添加到过滤列表',
    genreAlreadyBlocked: '已屏蔽',
    artistBlocked: '艺术家已屏蔽',
    artistAddedToBlacklist: '艺术家已添加到过滤列表',
    artistClickHint: '点击屏蔽此艺术家',
    blacklistToggle: '关键词过滤',
    genreMixTitle: '流派混音',
    genreMixDesc: '按歌曲数量排列的前 20 个流派 — 点击获取随机混音',
    genreMixLoadMore: '加载 10 首更多',
    genreMixNoGenres: '服务器上未找到流派。',
    shuffleGenres: '显示其他流派',
    filterPanelTitle: '过滤器',
    filterPanelDesc: '点击下方列表中的流派标签或艺术家名称，将其从未来的混音中排除。',
    genreClickHint: '点击流派标签将其添加为过滤关键词。\\n匹配流派、标题、专辑和艺术家。',
  },
  albums: {
    title: '全部专辑',
    sortByName: '按名称排序 (A-Z)',
    sortByArtist: '按艺术家排序 (A-Z)',
    sortNewest: '最新优先',
    sortRandom: '随机排序',
  },
  artists: {
    title: '艺术家',
    search: '搜索…',
    all: '全部',
    gridView: '网格视图',
    listView: '列表视图',
    imagesOn: '艺术家图片已开启 — 可能增加网络和系统负载',
    imagesOff: '艺术家图片已关闭 — 仅显示首字母',
    loadMore: '加载更多',
    notFound: '未找到艺术家。',
    albumCount_one: '{{count}} 张专辑',
    albumCount_other: '{{count}} 张专辑',
  },
  login: {
    subtitle: '您的 Navidrome 桌面播放器',
    serverName: '服务器名称（可选）',
    serverNamePlaceholder: '我的 Navidrome',
    serverUrl: '服务器地址',
    serverUrlPlaceholder: '192.168.1.100:4533 或 music.example.com',
    username: '用户名',
    usernamePlaceholder: 'admin',
    password: '密码',
    showPassword: '显示密码',
    hidePassword: '隐藏密码',
    connect: '连接',
    connecting: '正在连接…',
    connected: '已连接！',
    error: '连接失败 — 请检查您的信息。',
    urlRequired: '请输入服务器地址。',
    savedServers: '已保存的服务器',
    addNew: '或添加新服务器',
  },
  connection: {
    connected: '已连接',
    connectedTo: '已连接到 {{server}}',
    disconnected: '已断开连接',
    disconnectedFrom: '无法连接到 {{server}} — 点击检查设置',
    checking: '正在连接…',
    extern: '外部',
    offlineTitle: '无服务器连接',
    offlineSubtitle: '无法连接到 {{server}}。请检查您的网络或服务器。',
    offlineModeBanner: '离线模式 — 正在从本地缓存播放',
    offlineLibraryTitle: '离线音乐库',
    offlineLibraryEmpty: '尚未缓存任何专辑。请联网，打开专辑并点击"设为离线可用"。',
    offlineAlbumCount_one: '{{n}} 张专辑',
    offlineAlbumCount_plural: '{{n}} 张专辑',
    retry: '重试',
    lastfmConnected: 'Last.fm 已连接为 @{{user}}',
    lastfmSessionInvalid: '会话无效 — 点击重新连接',
  },
  common: {
    albums: '专辑',
    album: '专辑',
    loading: '加载中…',
    loadingMore: '加载中…',
    loadingPlaylists: '正在加载播放列表…',
    noAlbums: '未找到专辑。',
    downloading: '正在下载…',
    downloadZip: '下载 (ZIP)',
    back: '返回',
    cancel: '取消',
    save: '保存',
    delete: '删除',
    use: '使用',
    add: '添加',
    active: '当前使用',
    download: '下载',
    chooseDownloadFolder: '选择下载文件夹',
    noFolderSelected: '未选择文件夹',
    rememberDownloadFolder: '记住此文件夹',
    filterGenre: '流派筛选',
    filterSearchGenres: '搜索流派…',
    filterNoGenres: '未找到匹配流派',
    filterClear: '清除',
    bulkSelected: '已选 {{count}} 首',
    bulkAddToPlaylist: '添加到播放列表',
    bulkRemoveFromPlaylist: '从播放列表移除',
    bulkClear: '取消选择',
    updaterAvailable: '有可用更新',
    updaterVersion: 'v{{version}} 已就绪',
    updaterInstall: '安装并重启',
    updaterDownloading: '下载中…',
    updaterInstalling: '安装中…',
    updaterDownload: '从 GitHub 下载',
    updaterExperimentalHint: '自动更新功能仍在开发中',
  },
  settings: {
    title: '设置',
    language: '语言',
    languageEn: '英语',
    languageDe: '德语',
    languageFr: '法语',
    languageNl: '荷兰语',
    languageZh: '中文',
    font: '字体',
    theme: '主题',
    appearance: '外观',
    servers: '服务器',
    serverName: '服务器名称',
    serverUrl: '服务器地址',
    serverUsername: '用户名',
    serverPassword: '密码',
    addServer: '添加服务器',
    addServerTitle: '添加新服务器',
    useServer: '使用',
    deleteServer: '删除',
    noServers: '未保存任何服务器。',
    serverActive: '当前使用',
    confirmDeleteServer: '删除服务器 "{{name}}"？',
    serverConnecting: '正在连接…',
    serverConnected: '已连接！',
    serverFailed: '连接失败。',
    testBtn: '测试连接',
    testingBtn: '正在测试…',
    serverCompatible: '兼容：Navidrome · Gonic · Airsonic · Subsonic',
    connected: '已连接',
    failed: '失败',
    eqTitle: '均衡器',
    eqEnabled: '启用均衡器',
    eqPreset: '预设',
    eqPresetCustom: '自定义',
    eqPresetBuiltin: '内置预设',
    eqPresetCustomGroup: '我的预设',
    eqSavePreset: '保存为预设',
    eqPresetName: '预设名称…',
    eqDeletePreset: '删除预设',
    eqResetBands: '重置为平直',
    eqPreGain: '预增益',
    eqResetPreGain: '重置预增益',
    eqAutoEqTitle: 'AutoEQ 耳机查询',
    eqAutoEqPlaceholder: '搜索耳机/入耳式型号…',
    eqAutoEqSearching: '搜索中…',
    eqAutoEqNoResults: '未找到结果',
    eqAutoEqError: '搜索失败',
    eqAutoEqRateLimit: 'GitHub 请求限制 — 请一分钟后重试',
    eqAutoEqFetchError: '无法获取 EQ 配置',
    lfmTitle: 'Last.fm',
    lfmConnect: '连接 Last.fm',
    lfmConnecting: '等待授权…',
    lfmConfirm: '我已完成授权',
    lfmConnected: '已连接为',
    lfmDisconnect: '断开连接',
    lfmConnectDesc: '连接您的 Last.fm 账户以启用歌曲记录和正在播放更新，直接从 Psysonic 发送 — 无需配置 Navidrome。',
    lfmOpenBrowser: '将打开浏览器窗口。在 Last.fm 上授权 Psysonic，然后点击下方按钮。',
    lfmScrobbles: '{{n}} 次记录',
    lfmMemberSince: '{{year}} 年加入',
    scrobbleEnabled: '启用歌曲记录',
    scrobbleDesc: '播放 50% 后发送歌曲到 Last.fm',
    behavior: '应用行为',
    cacheTitle: '最大存储大小',
    cacheDesc: '封面和艺术家图片。存满时，最旧的条目将自动移除。离线专辑不会自动移除，但手动清除缓存时会被删除。',
    cacheUsed: '已使用：{{images}} 张图片 · {{offline}} 首离线曲目',
    cacheClearBtn: '清除缓存',
    cacheClearWarning: '这将同时移除音乐库中的所有离线专辑。',
    cacheClearConfirm: '全部清除',
    cacheClearCancel: '取消',
    showArtistImages: '显示艺术家图片',
    showArtistImagesDesc: '在艺术家概览中加载并显示艺术家图片。默认关闭以减少大型音乐库的服务器磁盘I/O和网络负载。',
    minimizeToTray: '最小化到托盘',
    minimizeToTrayDesc: '关闭窗口时，Psysonic 将继续在系统托盘中运行，而不是退出。',
    discordRichPresence: 'Discord Rich Presence',
    discordRichPresenceDesc: '在 Discord 个人资料上显示当前播放的曲目。需要 Discord 处于运行状态。',
    nowPlayingEnabled: '在实时窗口中显示',
    nowPlayingEnabledDesc: '将当前播放的曲目广播到服务器的实时听众视图。禁用以停止发送播放数据。',
    downloadsTitle: '下载文件夹',
    downloadsDefault: '默认下载文件夹',
    pickFolder: '选择',
    pickFolderTitle: '选择下载文件夹',
    clearFolder: '清除下载文件夹',
    logout: '退出登录',
    aboutTitle: '关于 Psysonic',
    aboutDesc: '适用于 Subsonic 兼容服务器（Navidrome、Gonic 等）的现代桌面音乐播放器。基于 Tauri v2 和原生 Rust 音频引擎构建——轻量快速，功能丰富：波形进度条、同步歌词、Last.fm 集成、10 段均衡器、交叉淡入淡出、无缝播放、响度增益、流派浏览以及大量精美主题。',
    aboutFeatures: '多服务器 · Last.fm 记录 & 喜爱 · 全屏环境舞台 · 波形跳转 · 同步歌词 · 10 段 EQ · 交叉淡入淡出 & 无缝播放 · 响度增益 · 流派 · 63 个主题 · 5 种语言',
    aboutLicense: '许可证',
    aboutLicenseText: 'GNU GPL v3 — 在相同许可证下可自由使用、修改和分发。',
    aboutRepo: 'GitHub 上的源代码',
    aboutVersion: '版本',
    aboutBuiltWith: '使用 Tauri · React · TypeScript · Rust/rodio 构建',
    aboutAiCredit: '在 Anthropic 的 Claude Code 支持下开发',
    aboutContributorsLabel: '贡献者',
    aboutSpecialThanksLabel: '特别感谢',
    changelog: '更新日志',
    showChangelogOnUpdate: '更新时显示"新功能"',
    showChangelogOnUpdateDesc: '新版本首次启动时自动显示更新内容。',
    randomMixTitle: '随机混音',
    randomMixBlacklistTitle: '自定义过滤关键词',
    randomMixBlacklistDesc: '当任何关键词匹配流派、标题、专辑或艺术家时，歌曲将被排除（当上方复选框开启时生效）。',
    randomMixBlacklistPlaceholder: '添加关键词…',
    randomMixBlacklistAdd: '添加',
    randomMixBlacklistEmpty: '尚未添加自定义关键词。',
    randomMixHardcodedTitle: '内置关键词（复选框开启时生效）',
    tabPlayback: '播放',
    tabLibrary: '音乐库',
    tabAppearance: '外观',
    homeCustomizerTitle: '首页',
    sidebarTitle: '侧边栏',
    sidebarReset: '重置为默认',
    sidebarDrag: '拖动以重新排序',
    sidebarFixed: '始终显示',
    tabShortcuts: '快捷键',
    tabServer: '服务器',
    tabAbout: '关于',
    shortcutsReset: '恢复默认',
    shortcutListening: '请按下按键…',
    shortcutUnbound: '—',
    globalShortcutsTitle: '全局快捷键',
    globalShortcutsNote: '即使 Psysonic 在后台也能在系统范围内工作。需要 Ctrl、Alt 或 Super 作为修饰键。',
    shortcutClear: '清除',
    shortcutPlayPause: '播放 / 暂停',
    shortcutNext: '下一首',
    shortcutPrev: '上一首',
    shortcutVolumeUp: '音量增大',
    shortcutVolumeDown: '音量减小',
    shortcutSeekForward: '快进 10 秒',
    shortcutSeekBackward: '快退 10 秒',
    shortcutToggleQueue: '切换队列',
    shortcutFullscreenPlayer: '全屏播放器',
    shortcutNativeFullscreen: '原生全屏',
    playbackTitle: '播放',
    replayGain: '回放增益',
    replayGainDesc: '使用 ReplayGain 元数据标准化曲目音量',
    replayGainMode: '模式',
    replayGainTrack: '曲目',
    replayGainAlbum: '专辑',
    crossfade: '交叉淡入淡出',
    crossfadeDesc: '曲目间淡入淡出',
    crossfadeSecs: '{{n}} 秒',
    notWithGapless: '无缝播放开启时不可用',
    notWithCrossfade: '交叉淡入淡出开启时不可用',
    gapless: '无缝播放',
    gaplessDesc: '预缓冲下一首曲目以消除歌曲间的间隙',
    infiniteQueue: '无限队列',
    infiniteQueueDesc: '队列播完时自动追加随机曲目',
    experimental: '实验性',
  },
  changelog: {
    modalTitle: '新功能',
    dontShowAgain: '不再显示',
    close: '知道了',
  },
  help: {
    title: '帮助',
    s1: '入门指南',
    q1: '支持哪些服务器？',
    a1: 'Psysonic 可与任何 Subsonic 兼容服务器配合使用：Navidrome、Gonic、Subsonic、Airsonic 等。推荐使用 Navidrome。',
    q2: '如何连接服务器？',
    a2: '打开设置并点击"添加服务器"。输入服务器地址（如 192.168.1.100:4533）、用户名和密码。Psysonic 会在保存前测试连接 — 如果连接失败则不会存储任何信息。',
    q3: '可以使用多个服务器吗？',
    a3: '可以。您可以在设置中添加任意数量的服务器，并随时切换。同一时间只能有一个服务器处于活动状态。',
    s2: '播放',
    q4: '如何播放音乐？',
    a4: '双击任意曲目即可播放。在专辑和艺术家页面，使用"全部播放"开始播放整张专辑。您也可以将曲目拖入队列面板。',
    q5: '有哪些键盘快捷键？',
    a5: '空格键 = 播放 / 暂停 · Esc = 关闭全屏播放器。媒体键（播放/暂停、下一首、上一首）在所有平台上都有效。在 Linux 上，请使用播放器栏按钮作为媒体键。应用内快捷键和系统级全局快捷键可在 设置 → 键盘快捷键 / 全局快捷键 中自定义。',
    q6: '什么是播放队列？',
    a6: '队列显示所有即将播放的曲目。点击右上角标题栏的面板图标（正在播放指示器旁边）打开队列。您可以通过拖拽重新排序，使用随机播放按钮打乱顺序，并将队列保存为播放列表。',
    q7: '如何打开全屏播放器？',
    a7: '点击底部播放器栏的专辑封面缩略图，或其旁边的展开图标。按 Esc 键关闭。',
    q8: '重复播放如何工作？',
    a8: '点击播放器栏的重复按钮可在以下模式间循环：关闭 → 重复全部 → 重复单曲。',
    s3: '音乐库',
    q9: '如何下载专辑？',
    a9: '打开专辑详情页并点击"下载 (ZIP)"。服务器会先将专辑压缩为 ZIP 文件 — 对于大型专辑或无损文件（FLAC / WAV），在实际下载开始前可能需要一些时间。这是正常的：进度条会在服务器完成压缩并开始传输后显示。',
    q10: '如何收藏曲目和专辑？',
    a10: '点击任意曲目行或专辑标题上的星形图标。收藏的项目会显示在侧边栏的收藏夹中。',
    q11: '首页的英雄轮播是什么？',
    a11: '首页顶部的横幅会随机从您的音乐库中选择专辑，每 10 秒轮换一次。点击圆点可跳转到特定专辑，或点击横幅打开专辑。',
    s4: '设置',
    q12: '如何更改主题？',
    a12: '设置 → 主题。从 8 个分组中的大量主题中选择：Psysonic 主题、媒体播放器、操作系统、游戏、电影、电视剧、社交媒体，以及开源经典（Catppuccin、Nord、Gruvbox）。',
    q13: '如何更改语言？',
    a13: '设置 → 语言。支持英语、德语、法语、荷兰语和中文。',
    q15: '如何设置下载文件夹？',
    a15: '设置 → 应用行为 → 下载文件夹。选择任意文件夹 — 下载的专辑将以 ZIP 文件形式保存在那里。未设置自定义文件夹时，将使用浏览器的默认下载位置。',
    s5: '歌曲记录',
    q16: '歌曲记录如何工作？',
    a16: 'Psysonic 直接向 Last.fm 发送记录 — 无需配置 Navidrome。在 设置 → Last.fm 中连接您的 Last.fm 账户并启用记录功能。',
    q17: '何时发送记录？',
    a17: '在您听完曲目的 50% 后提交记录。',
    q22: '播放器栏中的波形是什么？',
    a22: '波形进度条取代了传统的进度滑块。点击任意位置跳转到该位置，或拖动进行拖动播放。已播放部分显示蓝到紫的渐变，缓冲区域稍亮，未播放部分则淡化显示。',
    q24: '可以随机打乱队列吗？',
    a24: '可以。打开队列面板并点击队列标题栏的随机播放图标。当前播放曲目保持在第 1 位 — 其余曲目将随机重新排序。',
    q25: '艺术家页面上的 Last.fm 和 Wikipedia 链接会在浏览器中打开吗？',
    a25: '是的 — 它们会在您的默认系统浏览器中打开。点击时按钮会短暂显示确认标签。',
    s7: '随机混音',
    q26: '什么是随机混音？',
    a26: '随机混音从您的整个音乐库中构建一个随机曲目的播放列表。通过侧边栏的"随机混音"打开并点击"新混音"。您可以在生成前调整曲目数量。',
    q27: '什么是关键词过滤？',
    a27: '关键词过滤会排除流派、标题或专辑名称包含特定词汇的曲目。有声读物会被自动过滤。在 设置 → 随机混音 中添加自定义关键词，或点击曲目列表中的任意流派标签即时添加。',
    q28: '什么是超级流派混音？',
    a28: '超级流派混音将您的音乐库分组为宽泛的类别（摇滚、金属、电子、爵士、古典等），并从该风格构建一个专注的混音。在曲目列表下方选择类别标签。结果会随着每个子流派的获取而逐步显示。',
    s6: '故障排除',
    q18: '封面和艺术家图片加载缓慢。',
    a18: '图片首次加载时从服务器磁盘获取，然后本地缓存 30 天。如果服务器存储较慢，首次访问页面可能需要一些时间。后续访问将瞬间完成。',
    q19: '连接测试失败。',
    a19: '检查 URL 包括端口（如 http://192.168.1.100:4533）。确保防火墙没有阻止连接。在本地网络上尝试使用 http:// 而非 https://。同时验证用户名和密码是否正确。',
    q20: 'Linux 上没有音频。',
    a20: 'Psysonic 提供 .deb（Ubuntu/Debian）、.rpm（Fedora/RHEL）版本，以及通过 AUR 在 Arch/CachyOS 上安装（yay -S psysonic）。没有 AppImage。如果没有音频，请确保 PipeWire 或 PulseAudio 正在运行。',
    q21: '应用在 Linux 上显示黑屏。',
    a21: '这通常是 WebKitGTK 中的 GPU/EGL 驱动问题。使用 GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1 启动。AUR 包和官方 .deb/.rpm 安装程序会自动设置这些环境变量。',
    q29: '什么是交叉淡入淡出和无缝播放？',
    a29: '两者都是 设置 → 音频 中的实验性音频功能。无缝播放预缓冲下一首曲目以消除歌曲间的静音。交叉淡入淡出让当前曲目淡出同时下一首淡入 — 调整持续时间（1-10 秒）以符合您的喜好。',
    q30: 'Psysonic 显示歌词吗？',
    a30: '是的。点击播放器栏的麦克风图标可在队列面板中打开歌词标签。Psysonic 自动从 LRCLIB 获取歌词。如果可用同步歌词，活动行会高亮并随歌曲实时滚动。如果只有纯文本歌词，则静态显示完整文本。',
    q31: '可以自定义键盘快捷键吗？',
    a31: '可以。设置 → 键盘快捷键 允许您重新映射应用内操作（播放/暂停、下一首、上一首、音量增/减、全屏等）到任意按键。设置 → 全局快捷键 允许您分配即使 Psysonic 在后台也能触发的系统级快捷键。',
    q32: '可以更改字体吗？',
    a32: '可以。设置 → 字体 允许您从 10 种字体中选择，包括 IBM Plex Mono、Fira Code、JetBrains Mono、Courier Prime 等。所选字体将应用于整个界面。',
    s8: '离线模式',
    q34: '什么是离线模式？',
    a34: '离线模式（测试版）允许您将专辑缓存到设备，以便在没有活动服务器连接时收听。缓存的曲目存储在本地并直接从磁盘播放 — 播放期间不进行网络请求。',
    q35: '如何缓存专辑以供离线使用？',
    a35: '打开任意专辑并点击专辑标题栏的下载图标。Psysonic 会在后台下载所有曲目。按钮上会显示进度。缓存完成后，图标变为绿色。您可以在离线音乐库页面（侧边栏）查看和移除缓存的专辑。',
    q36: '离线缓存可以使用多少存储空间？',
    a36: '您可以在 设置 → 音乐库 中设置最大缓存大小。达到限制时，专辑页面会显示警告横幅。您可以从离线音乐库中删除单个专辑以释放空间。',
  },
  queue: {
    title: '队列',
    savePlaylist: '保存为播放列表',
    updatePlaylist: '更新播放列表',
    filterPlaylists: '筛选播放列表…',
    playlistName: '播放列表名称',
    cancel: '取消',
    save: '保存',
    loadPlaylist: '加载播放列表',
    loading: '加载中…',
    noPlaylists: '未找到播放列表。',
    load: '替换队列并播放',
    appendToQueue: '追加到队列',
    delete: '删除',
    deleteConfirm: '删除播放列表 "{{name}}"？',
    clear: '清空',
    shuffle: '随机打乱队列',
    gapless: '无缝播放',
    crossfade: '交叉淡入淡出',
    infiniteQueue: '无限队列',
    autoAdded: '— 自动添加 —',
    radioAdded: '— 收音机 —',
    hide: '隐藏',
    close: '关闭',
    nextTracks: '即将播放',
    emptyQueue: '队列为空。',
    trackSingular: '首曲目',
    trackPlural: '首曲目',
    showRemaining: '显示剩余时间',
    showTotal: '显示总时间',
  },
  statistics: {
    title: '统计',
    recentlyPlayed: '最近播放',
    mostPlayed: '最常播放的专辑',
    highestRated: '评分最高的专辑',
    genreDistribution: '流派分布（前 20）',
    loadMore: '加载更多',
    statArtists: '艺术家',
    statAlbums: '专辑',
    statSongs: '歌曲',
    statGenres: '流派',
    genreSongs: '{{count}} 首歌曲',
    genreAlbums: '{{count}} 张专辑',
    recentlyAdded: '最近添加',
    decadeDistribution: '按年代分布的专辑',
    decadeAlbums_one: '{{count}} 张专辑',
    decadeAlbums_other: '{{count}} 张专辑',
    decadeUnknown: '未知',
    lfmTitle: 'Last.fm 统计',
    lfmTopArtists: '热门艺术家',
    lfmTopAlbums: '热门专辑',
    lfmTopTracks: '热门曲目',
    lfmPlays: '{{count}} 次播放',
    lfmPeriodOverall: '全部时间',
    lfmPeriod7day: '7 天',
    lfmPeriod1month: '1 个月',
    lfmPeriod3month: '3 个月',
    lfmPeriod6month: '6 个月',
    lfmPeriod12month: '12 个月',
    lfmNotConnected: '在设置中连接 Last.fm 以查看您的统计。',
    lfmRecentTracks: '最近记录',
    lfmNowPlaying: '正在播放',
    lfmJustNow: '刚刚',
    lfmMinutesAgo: '{{n}} 分钟前',
    lfmHoursAgo: '{{n}} 小时前',
    lfmDaysAgo: '{{n}} 天前',
  },
  player: {
    regionLabel: '音乐播放器',
    openFullscreen: '打开全屏播放器',
    fullscreen: '全屏播放器',
    closeFullscreen: '关闭全屏',
    closeTooltip: '关闭 (Esc)',
    noTitle: '无标题',
    stop: '停止',
    prev: '上一首',
    play: '播放',
    pause: '暂停',
    next: '下一首',
    repeat: '重复',
    repeatOff: '关闭',
    repeatAll: '全部',
    repeatOne: '单曲',
    progress: '播放进度',
    volume: '音量',
    toggleQueue: '切换队列',
    lyrics: '歌词',
    lyricsLoading: '正在加载歌词…',
    lyricsNotFound: '未找到此曲目的歌词',
  },
  songInfo: {
    title: '歌曲信息',
    songTitle: '标题',
    artist: '艺术家',
    album: '专辑',
    albumArtist: '专辑艺术家',
    year: '年份',
    genre: '流派',
    duration: '时长',
    track: '曲目',
    format: '格式',
    bitrate: '比特率',
    sampleRate: '采样率',
    bitDepth: '位深度',
    channels: '声道',
    fileSize: '文件大小',
    path: '文件路径',
    replayGainTrack: 'RG 曲目增益',
    replayGainAlbum: 'RG 专辑增益',
    replayGainPeak: 'RG 曲目峰值',
    mono: '单声道',
    stereo: '立体声',
  },
  playlists: {
    title: '播放列表',
    newPlaylist: '新建播放列表',
    unnamed: '未命名播放列表',
    createName: '播放列表名称…',
    create: '创建',
    cancel: '取消',
    empty: '暂无播放列表。',
    emptyPlaylist: '此播放列表为空。',
    addFirstSong: '添加第一首歌曲',
    notFound: '未找到播放列表。',
    songs: '{{n}} 首歌曲',
    playAll: '全部播放',
    shuffle: '随机播放',
    addToQueue: '添加到队列',
    back: '返回播放列表',
    deletePlaylist: '删除',
    confirmDelete: '再次点击确认删除',
    removeSong: '从播放列表中移除',
    addSongs: '添加歌曲',
    searchPlaceholder: '搜索音乐库…',
    noResults: '无结果。',
    suggestions: '推荐歌曲',
    noSuggestions: '暂无推荐。',
    titleBadge: '播放列表',
    refreshSuggestions: '新建议',
    addSong: '添加到播放列表',
    cacheOffline: '离线缓存播放列表',
    offlineCached: '播放列表已缓存',
    offlineDownloading: '正在缓存… ({{done}}/{{total}} 张专辑)',
  },
  radio: {
    title: '网络电台',
    empty: '未配置任何电台。',
    addStation: '添加电台',
    editStation: '编辑',
    deleteStation: '删除电台',
    confirmDelete: '再次点击确认',
    stationName: '电台名称…',
    streamUrl: '流地址…',
    homepageUrl: '主页地址（可选）',
    save: '保存',
    cancel: '取消',
    live: '直播',
    liveStream: '网络电台',
    openHomepage: '打开主页',
  }
};

// Retrieve language from local storage or default to 'en'
const savedLanguage = localStorage.getItem('psysonic_language') || 'en';

i18n
  .use(initReactI18next)
  .init({
    resources: {
      en: { translation: enTranslation },
      de: { translation: deTranslation },
      fr: { translation: frTranslation },
      nl: { translation: nlTranslation },
      zh: { translation: zhTranslation }
    },
    lng: savedLanguage,
    fallbackLng: 'en',
    interpolation: {
      escapeValue: false
    }
  });

i18n.on('languageChanged', (lng) => {
  localStorage.setItem('psysonic_language', lng);
});

export default i18n;
