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',
    playlists: 'Playlists',
    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 →'
  },
  home: {
    starred: 'Personal Favorites',
    recent: 'Recently Added',
    mostPlayed: 'Most 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',
  },
  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)',
  },
  albumDetail: {
    back: 'Back',
    playAll: 'Play All',
    enqueue: 'Enqueue',
    enqueueTooltip: 'Add entire album to queue',
    artistBio: 'Artist Bio',
    download: 'Download (ZIP)',
    downloading: 'Loading…',
    downloadHint: 'FLAC/WAV albums are zipped server-side first — large albums may take a moment before the download starts.',
    downloadHintShort: 'Server zips first — may take a moment depending on file size',
    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',
    trackFormat: 'Format',
    trackFavorite: 'Favorite',
    trackRating: 'Rating',
    trackDuration: 'Duration',
    trackTotal: 'Total',
    notFound: 'Album not found.',
    bioModal: 'Artist Biography',
    bioClose: 'Close',
    ratingLabel: 'Rating',
  },
  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',
  },
  favorites: {
    title: 'Favorites',
    empty: "You haven't saved any favorites yet.",
    artists: 'Artists',
    albums: 'Albums',
    songs: 'Songs',
    enqueueAll: 'Add all to queue',
    removeSong: 'Remove from favorites',
  },
  randomAlbums: {
    title: 'Random Albums',
    refresh: 'Refresh',
  },
  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: 'Select a genre to get a curated random mix',
    genreMixLoadMore: 'Load 10 more',
    genreMixNoGenres: 'No genres found on server.',
    filterPanelTitle: 'Filters',
    genreClickHint: 'Click a genre tag to add it\nas a filter keyword.\nMatches genre, title, album & artist.',
  },
  playlists: {
    title: 'Playlists',
    loading: 'Loading playlists…',
    empty: 'No playlists found.\nUse the queue to create playlists.',
    play: 'Play',
    deleteTooltip: 'Delete',
    confirmDelete: 'Really delete playlist "{{name}}"?',
    minutes: 'min.',
    track_one: '{{count}} Track',
    track_other: '{{count}} Tracks',
    filterPlaceholder: 'Filter playlists…',
    colName: 'Name',
    colTracks: 'Tracks',
    colDuration: 'Duration',
    noResults: 'No playlists match your filter.',
  },
  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',
    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.',
    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',
  },
  settings: {
    title: 'Settings',
    language: 'Language',
    languageEn: 'English',
    languageDe: 'German',
    languageFr: 'French',
    languageNl: 'Dutch',
    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…',
    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',
    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',
    trayTitle: 'Minimize to Tray',
    trayDesc: 'Minimize app to the system tray on close (X)',
    cacheTitle: 'Max. Cache Size',
    cacheDesc: 'For preloaded tracks',
    downloadsTitle: 'Download Folder',
    downloadsDefault: 'Default Downloads Folder',
    pickFolder: 'Select',
    pickFolderTitle: 'Select Download Folder',
    clearFolder: 'Clear download folder',
    logout: 'Logout',
    aboutTitle: 'About Psysonic',
    aboutDesc: 'A desktop music player for Subsonic-compatible servers (Navidrome, Gonic, and others). Streams your self-hosted music library with a clean, modern interface styled after the Catppuccin colour palette.',
    aboutFeatures: 'Multi-server support · Scrobbling · Fullscreen player · Album downloads · Image caching · Catppuccin themes',
    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',
    changelog: 'Changelog',
    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',
    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',
    experimental: 'Experimental',
  },
  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 zips the album first — this may take a moment for large albums or lossless files (FLAC / WAV). A progress bar shows the download status.',
    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 47 themes across 7 groups: Psysonic Themes, Psysonic Mediaplayer, Operating Systems, Games, Movies, Series, and Open Source Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'How do I change the language?',
    a13: 'Settings → Language. English, German, French, and Dutch are supported.',
    q14: 'What does "Minimize to Tray" do?',
    a14: 'When enabled, clicking the × button hides Psysonic to the system tray instead of closing it. Music keeps playing. Right-click the tray icon for controls or to quit.',
    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.',
    q33: 'Can I seek (scrub) within a FLAC file?',
    a33: 'Seeking in FLAC files requires a SEEKTABLE metadata block to be embedded in the file. Files that were encoded without one cannot be seeked — clicking the waveform will have no effect. Most modern encoders (e.g. ffmpeg, flac CLI) include a SEEKTABLE by default. You can add one to existing files using: flac --replay-gain *.flac or metaflac --add-seekpoint=10s *.flac',
    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.',
  },
  queue: {
    title: 'Queue',
    savePlaylist: 'Save Playlist',
    playlistName: 'Playlist Name',
    cancel: 'Cancel',
    save: 'Save',
    loadPlaylist: 'Load Playlist',
    loading: 'Loading…',
    noPlaylists: 'No playlists found.',
    load: 'Load',
    delete: 'Delete',
    deleteConfirm: 'Delete playlist "{{name}}"?',
    clear: 'Clear',
    shuffle: 'Shuffle queue',
    gapless: 'Gapless',
    crossfade: 'Crossfade',
    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',
  }
};

// German Translations
const deTranslation = {
  sidebar: {
    library: 'Bibliothek',
    mainstage: 'Mainstage',
    newReleases: 'Neueste',
    allAlbums: 'Alle Alben',
    randomAlbums: 'Zufallsalben',
    artists: 'Künstler',
    playlists: 'Playlists',
    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 →'
  },
  home: {
    starred: 'Persönliche Favoriten',
    recent: 'Zuletzt hinzugefügt',
    mostPlayed: 'Meistgehört',
    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',
  },
  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)',
  },
  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…',
    downloadHint: 'FLAC/WAV-Alben werden serverseitig zuerst gezippt — bei großen Alben kann es einen Moment dauern, bevor der Download startet.',
    downloadHintShort: 'Server zippt zuerst — je nach Dateigröße kann es etwas dauern bevor der Download startet',
    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',
    trackFormat: 'Format',
    trackFavorite: 'Favorit',
    trackRating: 'Bewertung',
    trackDuration: 'Dauer',
    trackTotal: 'Gesamt',
    notFound: 'Album nicht gefunden.',
    bioModal: 'Künstler-Biografie',
    bioClose: 'Schließen',
    ratingLabel: 'Bewertung',
  },
  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',
  },
  favorites: {
    title: 'Favoriten',
    empty: 'Du hast noch keine Favoriten gespeichert.',
    artists: 'Künstler',
    albums: 'Alben',
    songs: 'Songs',
    enqueueAll: 'Alle in die Warteschlange',
    removeSong: 'Aus Favoriten entfernen',
  },
  randomAlbums: {
    title: 'Zufallsalben',
    refresh: 'Neu laden',
  },
  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: 'Genre auswählen für einen passenden Zufallsmix',
    genreMixLoadMore: '10 weitere laden',
    genreMixNoGenres: 'Keine Genres auf dem Server gefunden.',
    filterPanelTitle: 'Filter',
    genreClickHint: 'Genre-Tag anklicken,\num es als Filter-Keyword hinzuzufügen.\nPrüft Genre, Titel, Album & Künstler.',
  },
  playlists: {
    title: 'Playlists',
    loading: 'Lade Playlists…',
    empty: 'Keine Playlists gefunden.\nNutze die Warteschlange, um Playlists zu erstellen.',
    play: 'Abspielen',
    deleteTooltip: 'Löschen',
    confirmDelete: 'Playlist "{{name}}" wirklich löschen?',
    minutes: 'Min.',
    track_one: '{{count}} Track',
    track_other: '{{count}} Tracks',
    filterPlaceholder: 'Playlists filtern…',
    colName: 'Name',
    colTracks: 'Tracks',
    colDuration: 'Dauer',
    noResults: 'Keine Playlists entsprechen dem Filter.',
  },
  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',
    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.',
    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',
  },
  settings: {
    title: 'Einstellungen',
    language: 'Sprache',
    languageEn: 'Englisch',
    languageDe: 'Deutsch',
    languageFr: 'Französisch',
    languageNl: 'Niederländisch',
    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…',
    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',
    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',
    trayTitle: 'In Tray minimieren',
    trayDesc: 'App beim Schließen (X) in den System-Tray minimieren',
    cacheTitle: 'Max. Cache-Größe',
    cacheDesc: 'Für vorgeladene Tracks',
    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 Desktop-Musikplayer für Subsonic-kompatible Server (Navidrome, Gonic u. a.). Streame deine selbst gehostete Musikbibliothek mit einer modernen Oberfläche im Catppuccin-Design.',
    aboutFeatures: 'Multi-Server · Scrobbling · Vollbild-Player · Album-Downloads · Bild-Cache · Catppuccin-Themes',
    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',
    changelog: 'Changelog',
    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',
    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',
    experimental: 'Experimentell',
  },
  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 zieht das Album zuerst zusammen — bei großen Alben oder verlustfreien Dateien (FLAC / WAV) kann das einen Moment dauern. Ein Fortschrittsbalken zeigt den Status.',
    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. 47 Designs in 7 Gruppen: Psysonic Themes, Psysonic Mediaplayer, Betriebssysteme, Spiele, Filme, Serien und Open-Source-Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'Wie ändere ich die Sprache?',
    a13: 'Einstellungen → Sprache. Englisch, Deutsch, Französisch und Niederländisch werden unterstützt.',
    q14: 'Was bewirkt "In Tray minimieren"?',
    a14: 'Wenn aktiviert, versteckt sich Psysonic beim Klick auf × im System-Tray statt sich zu schließen. Die Musik läuft weiter. Rechtsklick auf das Tray-Icon zeigt Steueroptionen und "Beenden".',
    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.',
    q33: 'Kann ich in FLAC-Dateien seekbar (spulen)?',
    a33: 'Das Spulen in FLAC-Dateien erfordert einen SEEKTABLE-Metadatenblock in der Datei. Dateien, die ohne diesen Block kodiert wurden, können nicht geseekt werden — ein Klick auf die Wellenform hat keinen Effekt. Die meisten modernen Encoder (z. B. ffmpeg, flac CLI) fügen standardmäßig eine SEEKTABLE ein. Mit folgendem Befehl kann man sie nachträglich hinzufügen: flac --replay-gain *.flac oder metaflac --add-seekpoint=10s *.flac',
    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.',
  },
  queue: {
    title: 'Warteschlange',
    savePlaylist: 'Playlist speichern',
    playlistName: 'Name der Playlist',
    cancel: 'Abbrechen',
    save: 'Speichern',
    loadPlaylist: 'Playlist laden',
    loading: 'Lade…',
    noPlaylists: 'Keine Playlists gefunden.',
    load: 'Laden',
    delete: 'Löschen',
    deleteConfirm: 'Playlist "{{name}}" löschen?',
    clear: 'Leeren',
    shuffle: 'Warteschlange mischen',
    gapless: 'Nahtlos',
    crossfade: 'Crossfade',
    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',
  }
};

// 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',
    playlists: 'Listes de lecture',
    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 →'
  },
  home: {
    starred: 'Favoris personnels',
    recent: 'Ajoutés récemment',
    mostPlayed: 'Les plus é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',
  },
  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)',
  },
  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…',
    downloadHint: 'Les albums FLAC/WAV sont zippés côté serveur — les grands albums peuvent prendre un moment avant le démarrage du téléchargement.',
    downloadHintShort: 'Le serveur zippe d\'abord — peut prendre un moment selon la taille',
    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',
    trackFormat: 'Format',
    trackFavorite: 'Favori',
    trackRating: 'Note',
    trackDuration: 'Durée',
    trackTotal: 'Total',
    notFound: 'Album introuvable.',
    bioModal: 'Biographie de l\'artiste',
    bioClose: 'Fermer',
    ratingLabel: 'Note',
  },
  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',
  },
  favorites: {
    title: 'Favoris',
    empty: 'Vous n\'avez pas encore de favoris.',
    artists: 'Artistes',
    albums: 'Albums',
    songs: 'Morceaux',
    enqueueAll: 'Tout ajouter à la file',
    removeSong: 'Retirer des favoris',
  },
  randomAlbums: {
    title: 'Albums aléatoires',
    refresh: 'Actualiser',
  },
  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: 'Sélectionnez un genre pour obtenir un mix aléatoire',
    genreMixLoadMore: 'Charger 10 de plus',
    genreMixNoGenres: 'Aucun genre trouvé sur le serveur.',
    filterPanelTitle: 'Filtres',
    genreClickHint: 'Cliquez sur un tag de genre pour l\'ajouter\ncomme mot-clé de filtre.\nCorrespond au genre, titre, album et artiste.',
  },
  playlists: {
    title: 'Listes de lecture',
    loading: 'Chargement des listes…',
    empty: 'Aucune liste de lecture.\nUtilisez la file d\'attente pour en créer.',
    play: 'Lire',
    deleteTooltip: 'Supprimer',
    confirmDelete: 'Supprimer la liste « {{name}} » ?',
    minutes: 'min.',
    track_one: '{{count}} piste',
    track_other: '{{count}} pistes',
    filterPlaceholder: 'Filtrer les listes…',
    colName: 'Nom',
    colTracks: 'Pistes',
    colDuration: 'Durée',
    noResults: 'Aucune liste ne correspond au filtre.',
  },
  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',
    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.',
    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',
  },
  settings: {
    title: 'Paramètres',
    language: 'Langue',
    languageEn: 'Anglais',
    languageDe: 'Allemand',
    languageFr: 'Français',
    languageNl: 'Néerlandais',
    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…',
    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',
    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',
    trayTitle: 'Réduire dans la barre système',
    trayDesc: 'Réduire l\'application dans la barre système à la fermeture (X)',
    cacheTitle: 'Taille max. du cache',
    cacheDesc: 'Pour les pistes préchargées',
    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 pour les serveurs compatibles Subsonic (Navidrome, Gonic, et autres). Diffuse votre bibliothèque musicale auto-hébergée avec une interface moderne et épurée.',
    aboutFeatures: 'Multi-serveur · Scrobbling · Lecteur plein écran · Téléchargement d\'albums · Cache d\'images · Thèmes Catppuccin',
    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',
    changelog: 'Journal des modifications',
    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',
    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',
    experimental: 'Expérimental',
  },
  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 zippe d\'abord l\'album — cela peut prendre un moment pour les grands albums ou les fichiers sans perte.',
    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. 47 thèmes en 7 groupes : Psysonic Themes, Psysonic Mediaplayer, Systèmes d\'exploitation, Jeux, Films, Séries et Open Source Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'Comment changer la langue ?',
    a13: 'Paramètres → Langue. L\'anglais, l\'allemand, le français et le néerlandais sont pris en charge.',
    q14: 'Que fait « Réduire dans la barre système » ?',
    a14: 'Quand activé, cliquer sur × masque Psysonic dans la barre système au lieu de le fermer. La musique continue de jouer. Cliquez droit sur l\'icône pour accéder aux contrôles ou quitter.',
    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.',
    q33: 'Puis-je faire une recherche (scrubbing) dans un fichier FLAC ?',
    a33: 'La navigation dans les fichiers FLAC nécessite un bloc de métadonnées SEEKTABLE intégré dans le fichier. Les fichiers encodés sans ce bloc ne peuvent pas être recherchés — cliquer sur la forme d\'onde n\'aura aucun effet. La plupart des encodeurs modernes (p. ex. ffmpeg, flac CLI) incluent une SEEKTABLE par défaut. Vous pouvez en ajouter une aux fichiers existants avec : flac --replay-gain *.flac ou metaflac --add-seekpoint=10s *.flac',
    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.',
  },
  queue: {
    title: 'File d\'attente',
    savePlaylist: 'Enregistrer la liste',
    playlistName: 'Nom de la liste',
    cancel: 'Annuler',
    save: 'Enregistrer',
    loadPlaylist: 'Charger une liste',
    loading: 'Chargement…',
    noPlaylists: 'Aucune liste trouvée.',
    load: 'Charger',
    delete: 'Supprimer',
    deleteConfirm: 'Supprimer la liste « {{name}} » ?',
    clear: 'Vider',
    shuffle: 'Mélanger la file',
    gapless: 'Sans blanc',
    crossfade: 'Fondu',
    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',
  }
};

// Dutch Translations
const nlTranslation = {
  sidebar: {
    library: 'Bibliotheek',
    mainstage: 'Hoofdpodium',
    newReleases: 'Nieuw',
    allAlbums: 'Alle albums',
    randomAlbums: 'Willekeurige albums',
    artists: 'Artiesten',
    playlists: 'Afspeellijsten',
    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 →'
  },
  home: {
    starred: 'Persoonlijke favorieten',
    recent: 'Recent toegevoegd',
    mostPlayed: 'Meest gespeeld',
    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',
  },
  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)',
  },
  albumDetail: {
    back: 'Terug',
    playAll: 'Alles afspelen',
    enqueue: 'In wachtrij',
    enqueueTooltip: 'Volledig album aan wachtrij toevoegen',
    artistBio: 'Artiest biografie',
    download: 'Downloaden (ZIP)',
    downloading: 'Laden…',
    downloadHint: 'FLAC/WAV-albums worden eerst ingepakt door de server — grote albums kunnen even duren voordat de download begint.',
    downloadHintShort: 'Server pakt eerst in — kan even duren afhankelijk van bestandsgrootte',
    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',
    trackFormat: 'Formaat',
    trackFavorite: 'Favoriet',
    trackRating: 'Beoordeling',
    trackDuration: 'Duur',
    trackTotal: 'Totaal',
    notFound: 'Album niet gevonden.',
    bioModal: 'Artiest biografie',
    bioClose: 'Sluiten',
    ratingLabel: 'Beoordeling',
  },
  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',
  },
  favorites: {
    title: 'Favorieten',
    empty: 'Je hebt nog geen favorieten opgeslagen.',
    artists: 'Artiesten',
    albums: 'Albums',
    songs: 'Nummers',
    enqueueAll: 'Alles aan wachtrij toevoegen',
    removeSong: 'Verwijderen uit favorieten',
  },
  randomAlbums: {
    title: 'Willekeurige albums',
    refresh: 'Vernieuwen',
  },
  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: 'Selecteer een genre voor een samengestelde willekeurige mix',
    genreMixLoadMore: '10 meer laden',
    genreMixNoGenres: 'Geen genres gevonden op server.',
    filterPanelTitle: 'Filters',
    genreClickHint: 'Klik op een genre-tag om het\ntoe te voegen als filtertrefwoord.\nVergelijkt genre, titel, album & artiest.',
  },
  playlists: {
    title: 'Afspeellijsten',
    loading: 'Afspeellijsten laden…',
    empty: 'Geen afspeellijsten gevonden.\nGebruik de wachtrij om afspeellijsten aan te maken.',
    play: 'Afspelen',
    deleteTooltip: 'Verwijderen',
    confirmDelete: 'Afspeellijst "{{name}}" echt verwijderen?',
    minutes: 'min.',
    track_one: '{{count}} nummer',
    track_other: '{{count}} nummers',
    filterPlaceholder: 'Afspeellijsten filteren…',
    colName: 'Naam',
    colTracks: 'Nummers',
    colDuration: 'Duur',
    noResults: 'Geen afspeellijsten komen overeen met het filter.',
  },
  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',
    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.',
    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',
  },
  settings: {
    title: 'Instellingen',
    language: 'Taal',
    languageEn: 'Engels',
    languageDe: 'Duits',
    languageFr: 'Frans',
    languageNl: 'Nederlands',
    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…',
    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',
    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',
    trayTitle: 'Minimaliseren naar systeemvak',
    trayDesc: 'App naar het systeemvak minimaliseren bij sluiten (X)',
    cacheTitle: 'Max. cachegrootte',
    cacheDesc: 'Voor vooraf geladen nummers',
    downloadsTitle: 'Downloadmap',
    downloadsDefault: 'Standaard downloadmap',
    pickFolder: 'Selecteren',
    pickFolderTitle: 'Downloadmap selecteren',
    clearFolder: 'Map wissen',
    logout: 'Uitloggen',
    aboutTitle: 'Over Psysonic',
    aboutDesc: 'Een desktopmuziekspeeler voor Subsonic-compatibele servers (Navidrome, Gonic en anderen). Streamt je zelf gehoste muziekbibliotheek met een strakke, moderne interface.',
    aboutFeatures: 'Multi-server · Scrobbling · Volledig scherm · Album downloads · Afbeeldingscache · Catppuccin-thema\'s',
    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',
    changelog: 'Wijzigingslog',
    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',
    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',
    experimental: 'Experimenteel',
  },
  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 pakt het album eerst in — dit kan even duren voor grote albums of verliesvrije bestanden.',
    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. 47 thema\'s in 7 groepen: Psysonic Themes, Psysonic Mediaplayer, Besturingssystemen, Games, Films, Series en Open Source Classics (Catppuccin, Nord, Gruvbox).',
    q13: 'Hoe verander ik de taal?',
    a13: 'Instellingen → Taal. Engels, Duits, Frans en Nederlands worden momenteel ondersteund.',
    q14: 'Wat doet "Minimaliseren naar systeemvak"?',
    a14: 'Wanneer ingeschakeld verbergt het klikken op × Psysonic naar het systeemvak in plaats van het te sluiten. Muziek blijft spelen. Klik rechts op het pictogram voor besturingen of om af te sluiten.',
    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.',
    q33: 'Kan ik door een FLAC-bestand scrubben (zoeken)?',
    a33: 'Zoeken in FLAC-bestanden vereist een SEEKTABLE-metadatablok in het bestand. Bestanden die zonder dit blok zijn gecodeerd, kunnen niet worden doorzocht — klikken op de golfvorm heeft geen effect. De meeste moderne encoders (bijv. ffmpeg, flac CLI) bevatten standaard een SEEKTABLE. U kunt er een toevoegen aan bestaande bestanden met: flac --replay-gain *.flac of metaflac --add-seekpoint=10s *.flac',
    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.',
  },
  queue: {
    title: 'Wachtrij',
    savePlaylist: 'Afspeellijst opslaan',
    playlistName: 'Naam afspeellijst',
    cancel: 'Annuleren',
    save: 'Opslaan',
    loadPlaylist: 'Afspeellijst laden',
    loading: 'Laden…',
    noPlaylists: 'Geen afspeellijsten gevonden.',
    load: 'Laden',
    delete: 'Verwijderen',
    deleteConfirm: 'Afspeellijst "{{name}}" verwijderen?',
    clear: 'Leegmaken',
    shuffle: 'Wachtrij shufflen',
    gapless: 'Naadloos',
    crossfade: 'Overgang',
    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',
  }
};

// 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 }
    },
    lng: savedLanguage,
    fallbackLng: 'en',
    interpolation: {
      escapeValue: false
    }
  });

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

export default i18n;
