Files
Psychotoxical-psysonic/src/locales/nl/settings.ts
T
Psychotoxical a451509d94 feat(discord): restore server cover source via public album-info URLs (#1299)
* feat(discord): allow the server cover source in the store again

DiscordCoverSource gains 'server' back. The rehydrate migration that
forced any persisted 'server' preference to 'none' is dropped — that
coercion only made sense while the source didn't exist.

* feat(discord): resolve server covers via credential-free album-info URLs

Add a resolver that fetches cover art for the Discord 'server' source
through the standard Subsonic getAlbumInfo2 endpoint, never through an
authenticated getCoverArt URL (that was the leak fixed in #1246).

- sanitizeDiscordCoverUrl rejects anything unfit to publish: non-https,
  embedded userinfo, auth-shaped query params (u/t/s/apiKey/jwt/token/...),
  LAN/loopback hosts
- resolveServerCoverForDiscord takes only an album id and a share-base
  string, never a server profile or credentials, and session-caches
  results (including negative ones) per album
- rewrites a LAN-scoped album-info response to the profile's public
  share address, keeping path + query, so the app being connected over
  LAN doesn't hide an otherwise-public /share/img/<jwt> link
- discordPresence.ts wires the 'server' branch in with a staleness
  guard so a slow resolve can't overwrite a newer track's presence

* feat(discord): add the server option back to the cover-source picker

Three-way segmented control again: none / server / apple. The cover
description now discloses that server covers reveal the server's
public address to anyone viewing the presence (no credentials).

Restores discordCoverServer in all 14 locales — the Italian locale
already carried an unused copy of the key from before it existed at
removal time, now wired up instead of left dead.

* fix(discord): reject non-publishable image URLs before they reach Discord

is_publishable_image_url is a backstop applied to every artwork_url
(cover_art_url param and the iTunes result alike) right before it can
become a large_image asset: https only, no userinfo, no auth-shaped
query params. This is the layer a future frontend refactor can't
silently bypass — the failure mode that turned the original
credential-free server-cover design (#462) into the leak fixed in
#1246 was exactly that kind of regression, on the frontend only.

* docs(changelog): note Discord server cover source restoration (#1299)

* fix(discord): close the LAN-host gap in the Rust publish backstop

is_publishable_image_url checked scheme/userinfo/credential params but
not host locality, despite its doc comment claiming parity with the TS
sanitizer's isLanUrl check — a self-review found the gap. Reuses
psysonic-core::log_sanitize's existing is_lan_host (now pub) instead
of a second hand-written LAN-detection copy.

* fix(discord): don't silently resurrect a pre-#1246 'server' preference

The rehydrate migration that forced any persisted 'server' cover
source to 'none' was dropped in the initial revival commit, which
meant a user skipping straight from a pre-#1246 build to this one
would have gotten it silently reactivated without ever seeing the new
opt-in disclosure. Restored as a one-time, sentinel-gated migration:
it still catches that stale value exactly once, but never coerces a
deliberate post-revival choice back.

* fix(discord): harden the server-cover sync against races and cross-server tracks

- Staleness guard on the async resolve now also rechecks
  discordRichPresence/discordCoverSource, not just the track id, so a
  slow resolve can't revive presence after it was disabled or the
  cover source was switched away from 'server' while in flight.
- Skip server-cover resolution (fall back to the app icon) when the
  playing track isn't from the active server — getAlbumInfo2 always
  queries the active server, so a mixed-server queue could otherwise
  ask the wrong server for an album id.
- The change-detection gate now also reacts to the active server
  profile's share-base changing (e.g. adding a public address), not
  only to track/play-state/cover-source/template changes.
- Server profile/shareBase is now computed once per sync and reused,
  instead of a second useAuthStore.getState() call inside the branch.

* fix(discord): preserve reverse-proxy paths and TTL the server-cover cache

- rewriteOriginToShareBase only swapped protocol/hostname/port, so a
  server reachable behind a reverse-proxy subpath (shareBase carrying
  a path prefix) lost that prefix and produced a 404ing URL. The
  prefix is now preserved.
- serverCoverCache entries (including negative ones) no longer live
  forever — a 1h TTL, matching the existing Rust iTunes-artwork cache,
  means a transient resolve failure doesn't hide an album's cover for
  the rest of the session.
2026-07-14 13:52:05 +02:00

810 lines
53 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const settings = {
title: 'Instellingen',
language: 'Taal',
languageEn: 'English',
languageDe: 'Deutsch',
languageEs: 'Español',
languageFr: 'Français',
languageIt: 'Italiano',
languageNl: 'Nederlands',
languageNb: 'Norsk',
languageRu: 'Русский',
languageZh: '中文',
languageRo: 'Română',
languageJa: '日本語',
languageHu: 'Magyar',
languagePl: 'Polski',
languageBg: 'Български',
font: 'Lettertype',
fontHintOpenDyslexic: 'Dyslexie-vriendelijk · geen Chinese ondersteuning',
theme: 'Thema',
appearance: 'Weergave',
servers: 'Servers',
serverName: 'Servernaam',
serverUrl: 'Server-URL',
serverUrlPlaceholder: '192.168.1.100:4533 of https://music.voorbeeld.nl',
serverAlternateUrl: 'Tweede adres (optioneel)',
serverAlternateUrlPlaceholderPublic: 'https://music.example.com',
serverAlternateUrlPlaceholderLocal: '192.168.1.100:4533',
serverAlternateUrlHintAddPublic: 'Voeg een openbaar adres toe om buiten je thuisnetwerk te verbinden.',
serverAlternateUrlHintAddLocal: 'Voeg een lokaal adres toe voor een snellere verbinding thuis.',
serverBothLanError: 'Beide adressen zijn lokaal — houd er één of voeg een openbaar adres toe.',
dualAddressVerifying: 'Controleren of beide adressen naar dezelfde server wijzen…',
dualAddressMismatch: 'De twee adressen wijzen naar verschillende servers. Controleer de spelling en probeer opnieuw.',
dualAddressInsufficient: 'Kon niet bevestigen dat beide adressen dezelfde server zijn. Verwijder één adres om door te gaan.',
dualAddressUnreachable: 'Kon {{host}} niet bereiken. Controleer het adres en je netwerk en probeer opnieuw.',
urlRemigrationTitle: 'Bibliotheekgegevens verplaatsen?',
urlRemigrationMessage: 'Bij het wijzigen van het adres worden alle bibliotheek-, analyse- en cover-cachegegevens van {{oldKey}} naar {{newKey}} verplaatst. Dit kan niet ongedaan gemaakt worden.',
urlRemigrationConfirm: 'Gegevens verplaatsen',
urlRemigrationProgress: 'Bibliotheekgegevens worden verplaatst…',
urlRemigrationFailureInspect: 'Kon niet controleren wat verplaatst zou worden. Probeer opnieuw of open het foutopsporingslogboek.',
urlRemigrationFailureRun: 'Verplaatsen van bibliotheekgegevens mislukt. Je opgeslagen gegevens zijn ongewijzigd — probeer opnieuw.',
urlRemigrationFailureCoverRename: 'Bibliotheekgegevens zijn verplaatst, maar coverbestanden konden niet worden hernoemd. Covers worden bij het volgende gebruik opnieuw opgebouwd.',
shareUsesLocalUrl: 'Lokaal adres gebruiken in deellinks',
shareUsesLocalUrlDesc: 'Geldt voor Orbit-uitnodigingen en bibliotheekdelen. Standaard: openbaar adres.',
serverUsername: 'Gebruikersnaam',
serverPassword: 'Wachtwoord',
customHeadersTitle: 'Aangepaste HTTP-headers',
customHeadersHelp: 'Voor reverse-proxy-gates (Pangolin, Cloudflare Access). Alleen naar je server gestuurd — niet naar diensten van derden.',
customHeadersNamePlaceholder: 'Headernaam',
customHeadersValuePlaceholder: 'Headervalue',
customHeadersAddRow: 'Header toevoegen',
customHeadersRemoveRow: 'Header verwijderen',
customHeadersApplyTo: 'Headers toepassen op',
customHeadersApplyTo_public: 'Openbaar adres',
customHeadersApplyTo_local: 'Lokaal adres',
customHeadersApplyTo_both: 'Beide adressen',
customHeadersNotInShare: 'Aangepaste headers worden niet opgenomen in uitnodigingen — configureer ze opnieuw op elk apparaat.',
'customHeadersValidation.tooMany': 'Te veel aangepaste headers (max. 16).',
'customHeadersValidation.nameRequired': 'Headernaam is verplicht.',
'customHeadersValidation.nameTooLong': 'Headernaam is te lang.',
'customHeadersValidation.valueTooLong': 'Headervalue is te lang.',
'customHeadersValidation.crlf': 'Headernamen en -waarden mogen geen regeleinden bevatten.',
'customHeadersValidation.blocked': 'Deze headernaam is niet toegestaan.',
'customHeadersValidation.duplicate': 'Dubbele headernaam.',
addServer: 'Server toevoegen',
addServerTitle: 'Nieuwe server toevoegen',
editServer: 'Bewerken',
editServerTitle: 'Server bewerken',
useServer: 'Gebruiken',
deleteServer: 'Verwijderen',
noServers: 'Geen servers opgeslagen.',
serverActive: 'Actief',
serverVersionUnknown: 'Serverversie onbekend',
confirmDeleteServer: 'Server "{{name}}" verwijderen?',
serverConnecting: 'Verbinden…',
serverConnected: 'Verbonden!',
serverFailed: 'Verbinding mislukt.',
serverUrlRequired: 'Serveradres is verplicht.',
serverUsernameRequired: 'Gebruikersnaam is verplicht.',
serverConnectFailedReason: 'Kan geen verbinding maken: {{reason}}',
testBtn: 'Verbinding testen',
testingBtn: 'Testen…',
serverCompatible: 'Gemaakt voor Navidrome. Andere Subsonic-compatibele servers (Gonic, Airsonic, …) kunnen met beperkte functionaliteit werken, omdat Psysonic veel Navidrome-specifieke API-endpoints gebruikt.',
userMgmtTitle: 'Gebruikersbeheer',
userMgmtDesc: 'Beheer gebruikers op deze server. Vereist admin-rechten.',
userMgmtNoAdmin: 'Je hebt admin-rechten nodig om gebruikers op deze server te beheren.',
userMgmtLoadError: 'Kon gebruikers niet laden.',
userMgmtLoadFriendly: 'Server antwoordde niet — meestal eenmalig.',
userMgmtRetry: 'Opnieuw proberen',
userMgmtEmpty: 'Geen gebruikers gevonden.',
userMgmtYouBadge: 'Jij',
userMgmtAdminBadge: 'Admin',
userMgmtAddUser: 'Gebruiker toevoegen',
userMgmtAddUserTitle: 'Nieuwe gebruiker',
userMgmtEditUserTitle: 'Gebruiker bewerken',
userMgmtUsername: 'Gebruikersnaam',
userMgmtName: 'Weergavenaam',
userMgmtEmail: 'E-mail',
userMgmtPassword: 'Wachtwoord',
userMgmtPasswordEditHint: 'Voer een nieuw wachtwoord in om het bij te werken.',
userMgmtRoleAdmin: 'Admin',
userMgmtLibraries: 'Bibliotheken',
userMgmtLibrariesAdminHint: 'Beheerders hebben automatisch toegang tot alle bibliotheken.',
userMgmtLibrariesEmpty: 'Geen bibliotheken beschikbaar op deze server.',
userMgmtLibrariesValidation: 'Selecteer ten minste één bibliotheek.',
userMgmtLibrariesUpdateError: 'Gebruiker opgeslagen, maar bibliotheektoewijzing mislukt',
userMgmtNoLibraries: 'Geen bibliotheken toegewezen',
userMgmtNeverSeen: 'Nooit',
userMgmtSave: 'Opslaan',
userMgmtCancel: 'Annuleren',
userMgmtDelete: 'Verwijderen',
userMgmtEdit: 'Bewerken',
userMgmtConfirmDelete: 'Gebruiker "{{username}}" verwijderen? Dit kan niet ongedaan worden gemaakt.',
userMgmtCreateError: 'Aanmaken van gebruiker mislukt.',
userMgmtUpdateError: 'Bijwerken van gebruiker mislukt.',
userMgmtDeleteError: 'Verwijderen van gebruiker mislukt.',
userMgmtCreated: 'Gebruiker aangemaakt.',
userMgmtUpdated: 'Gebruiker bijgewerkt.',
userMgmtDeleted: 'Gebruiker verwijderd.',
userMgmtValidationMissing: 'Gebruikersnaam, weergavenaam en wachtwoord zijn vereist.',
userMgmtValidationMissingIdentity: 'Gebruikersnaam en weergavenaam zijn vereist.',
userMgmtMagicStringGenerate: 'Magic string genereren',
userMgmtSaveAndMagicString: 'Opslaan en magic string kopiëren',
userMgmtMagicStringPasswordNavHint:
'Navidrome slaat dit wachtwoord voor de gebruiker op. Als het afwijkt van het huidige wachtwoord, wordt het inlogwachtwoord op de server bijgewerkt.',
userMgmtMagicStringPlaintextWarning:
'Wees voorzichtig met delen: de magic string bevat een onversleuteld wachtwoord (codering is geen encryptie). Wie de volledige string heeft, kan als deze gebruiker inloggen.',
userMgmtMagicStringCopied: 'Magic string naar het klembord gekopieerd.',
userMgmtMagicStringCopyFailed: 'Kopiëren naar het klembord is mislukt.',
userMgmtMagicStringLoginFailed: 'Wachtwoordcontrole mislukt — aanmeldgegevens konden niet worden geverifieerd.',
userMgmtMagicStringModalTitle: 'Magic string genereren',
userMgmtMagicStringModalDesc: 'Voer het Subsonic-wachtwoord voor „{{username}}" in. Het wordt opgenomen in de gekopieerde magic string.',
userMgmtMagicStringModalConfirm: 'String kopiëren',
audiomuseTitle: 'AudioMuse-AI (Navidrome)',
audiomuseBadge: 'AudioMuse-AI',
audiomuseStatusActive: 'Actief',
audiomuseStatusChecking: 'Controleren…',
audiomuseStatusNotDetected: 'Niet gedetecteerd',
audiomuseStatusProbeFailed: 'Detectie mislukt',
audiomuseDesc:
'Zet aan als deze server de <pluginLink>AudioMuse-AI Navidrome-plugin</pluginLink> gebruikt. Schakelt Instant Mix per nummer in en toont vergelijkbare artiesten van de server i.p.v. Last.fm op artiestpaginas.',
audiomuseIssueHint:
'Instant Mix is onlangs mislukt — controleer de Navidrome-plugin en AudioMuse API. Zonder serverresultaten worden vergelijkbare artiesten via Last.fm geladen.',
connected: 'Verbonden',
failed: 'Mislukt',
eqTitle: 'Equalizer',
eqEnabled: 'Equalizer inschakelen',
eqPreset: 'Voorinstelling',
eqPresetCustom: 'Aangepast',
eqPresetBuiltin: 'Ingebouwde voorinstellingen',
eqPresetCustomGroup: 'Mijn voorinstellingen',
eqPresetAutoEqGroup: 'AutoEQ',
eqSavePreset: 'Opslaan als voorinstelling',
eqPresetName: 'Naam voorinstelling…',
eqDeletePreset: 'Voorinstelling verwijderen',
eqResetBands: 'Terugzetten naar vlak',
eqPreGain: 'Voorversterking',
eqResetPreGain: 'Voorversterking resetten',
eqAutoEqTitle: 'AutoEQ Hoofdtelefoon Zoeken',
eqAutoEqPlaceholder: 'Zoek hoofdtelefoon / IEM model…',
eqAutoEqSearching: 'Zoeken…',
eqAutoEqNoResults: 'Geen resultaten gevonden',
eqAutoEqError: 'Zoeken mislukt',
eqAutoEqRateLimit: 'GitHub limiet bereikt — probeer over een minuut opnieuw',
eqAutoEqFetchError: 'EQ-profiel kon niet worden geladen',
behavior: 'App-gedrag',
groupTray: 'Systeemvak',
groupLinuxRendering: 'Linux-rendering',
groupClock: 'Klok',
groupDisplay: 'Weergave',
groupWindow: 'Venster',
cacheTitle: 'Max. opslaggrootte',
cacheDesc: 'Browsercache voor albumhoezen en artiestafbeeldingen (IndexedDB). Als de cache vol is, worden de oudste items automatisch verwijderd.',
cacheUsedImages: 'Afbeeldingen:',
cacheUsedOffline: 'Offline nummers:',
cacheUsedHot: 'Schijfgebruik:',
hotCacheTrackCount: 'Nummers in cache:',
cacheMaxLabel: 'Max. grootte',
imageCacheScopeLabel: 'Bereik',
imageCacheSubTitle: 'Voorbeelden in browser',
coverDiskCacheSubTitle: 'Hoescache op schijf',
coverCacheStrategyTitle: 'Hoescache',
coverCacheStrategyDesc: 'Je kunt per server een strategie kiezen: Lazy — laadt hoezen wanneer nodig; Aggressive — laadt wanneer nodig plus extra voorladen op de achtergrond.',
coverCacheStrategyLabel: 'Strategie',
coverCacheStrategyServerLabel: 'Server',
coverCacheStrategyProgressLabel: 'Cache',
coverCacheStrategyActionsLabel: 'Acties',
coverCacheStrategyLazy: 'Lazy',
coverCacheStrategyLazyDesc: 'Laadt hoezen alleen wanneer ze nodig zijn.',
coverCacheStrategyAggressive: 'Aggressive',
coverCacheStrategyAggressiveDesc: 'Lazy-gedrag plus extra voorladen op de achtergrond.',
coverCacheStrategyDiskUsage: 'Op schijf: {{size}}',
coverCacheStrategyProgressValue: '{{percent}}% ({{done}}/{{total}}) · {{size}}',
coverCacheStrategyClearAction: 'Hoescache wissen',
coverCacheStrategyClearTitle: 'Hoescache wissen?',
coverCacheStrategyClearDesc: 'Verwijder alle gecachte hoesafbeeldingen voor {{server}}. Ze worden opnieuw gedownload wanneer nodig.',
coverCacheStrategyClearConfirm: 'Wissen',
coverCacheStrategyClearCancel: 'Annuleren',
coverCacheStrategyClearSuccess: 'Hoescache gewist voor deze server.',
coverCacheStrategyClearError: 'Hoescache wissen mislukt.',
coverCacheStrategyServerRemoved: 'verwijderde server',
cacheClearBtn: 'Cache wissen',
cacheClearWarning: 'Wist alle gecachte hoesjes en artiestafbeeldingen. Ze worden opnieuw gedownload wanneer nodig.',
cacheClearConfirm: 'Beeldcache wissen',
cacheClearCancel: 'Annuleren',
mediaDirTitle: 'Mediamap',
mediaDirDesc: 'Hoofdmap voor lokaal afspelen. Offline-bibliotheek: library/; wachtrijbuffer: cache/.',
mediaDirDefault: 'Standaard (app-gegevens)',
mediaDirChange: 'Map wijzigen',
mediaDirClear: 'Terugzetten naar standaard',
mediaDirHint: 'Nieuwe downloads gebruiken deze locatie. Bestaande bestanden blijven op hun pad tot je ze verwijdert.',
offlineStorageTitle: 'Offline-opslag',
offlineDirTitle: 'Offline-bibliotheek (In-app)',
offlineDirDesc: 'Opslaglocatie voor nummers die je offline beschikbaar maakt in Psysonic.',
offlineDirDefault: 'Standaard (app-gegevens)',
offlineDirChange: 'Map wijzigen',
offlineDirClear: 'Terugzetten naar standaard',
offlineDirHint: 'Nieuwe downloads worden op deze locatie opgeslagen. Bestaande downloads blijven op hun oorspronkelijke locatie.',
hotCacheTitle: 'Warme afspeelcache',
hotCacheDisclaimer: 'Laadt aankomende wachtrijtracks voor en bewaart eerdere. Indien ingeschakeld: schijfruimte en netwerk.',
hotCacheDirDefault: 'Standaard (app-gegevens)',
hotCacheDirChange: 'Map wijzigen',
hotCacheDirClear: 'Terugzetten naar standaard',
hotCacheDirHint: 'Een andere map kiest: de index in de app wordt gereset; oude bestanden blijven staan tot je ze verwijdert.',
hotCacheEnabled: 'Warme afspeelcache inschakelen',
hotCacheMaxMb: 'Maximale cachegrootte',
hotCacheDebounce: 'Uitstel bij wachtrijwijziging',
hotCacheDebounceImmediate: 'Direct',
hotCacheDebounceSeconds: '{{n}} s',
hotCacheClearBtn: 'Warme cache wissen',
audioOutputDevice: 'Audio-uitvoerapparaat',
audioOutputDeviceDesc: 'Kies via welk audioapparaat Psysonic afspeelt. Wijzigingen worden direct toegepast en starten het huidige nummer opnieuw.',
audioOutputDeviceDefault: 'Systeemstandaard',
audioOutputDeviceRefresh: 'Apparatenlijst vernieuwen',
audioOutputDeviceOsDefaultNow: 'huidige systeemuitvoer',
audioOutputDeviceListError: 'De lijst met audio-apparaten kon niet worden geladen.',
audioOutputDeviceNotInCurrentList: 'staat niet in de huidige lijst',
audioOutputDeviceRememberEq: 'EQ per apparaat onthouden',
audioOutputDeviceRememberEqDesc: 'Slaat de equalizer-instellingen op voor elk audio-uitvoerapparaat en herstelt ze automatisch wanneer je van apparaat wisselt. Bij Systeemstandaard volgen profielen de actieve systeemuitvoer, ook wanneer die buiten Psysonic wordt gewijzigd.',
hiResTitle: 'Natieve hi-res-weergave',
hiResEnabled: 'Natieve hi-res-weergave inschakelen',
hiResDesc: "Speelt elke track af op zijn oorspronkelijke samplerate in plaats van alles te herbemonsteren naar 44,1 kHz, en stelt het uitvoerapparaat af op het bestand (88,2 kHz en hoger). Alleen inschakelen als hardware en netwerk hoge samplerates betrouwbaar aankunnen.",
hiResCrossfadeResampleTitle: 'Crossfade / AutoDJ / Gapless mengfrequentie',
hiResCrossfadeResampleDesc: 'Als aangrenzende tracks verschillende samplerates hebben, worden beide kanten naar deze frequentie geresampled tijdens crossfade-, AutoDJ- en gapless-overgangen.',
hiResCrossfadeResample44: '44,1 kHz',
hiResCrossfadeResample88: '88,2 kHz',
hiResCrossfadeResample96: '96 kHz',
hiResCrossfadeResampleWarning: 'Resampling kost extra CPU en geheugen — kies voorzichtig op tragere apparaten.',
showArtistImages: 'Artiestafbeeldingen weergeven',
showArtistImagesDesc: 'Laadt en toont artiestafbeeldingen in het artiestenoverzicht. Standaard uitgeschakeld om server-I/O en netwerkbelasting bij grote bibliotheken te beperken.',
showOrbitTrigger: '"Orbit" in de kop tonen',
showOrbitTriggerDesc: 'De knop in de kop voor starten of deelnemen aan een gedeelde luistersessie. Verberg hem als je Orbit niet gebruikt — je kunt hem hier weer aanzetten.',
showTrayIcon: 'Tray-pictogram weergeven',
showTrayIconDesc: 'Toont het Psysonic-pictogram in het systeemvak / de menubalk.',
minimizeToTray: 'Minimaliseren naar systeemvak',
minimizeToTrayDesc: 'Bij het sluiten van het venster blijft Psysonic actief in het systeemvak in plaats van af te sluiten.',
startMinimizedToTray: 'Start geminimaliseerd in systeemvak',
startMinimizedToTrayDesc: 'Start Psysonic met het hoofdvenster verborgen; gebruik het tray-pictogram om het te tonen.',
startMinimizedToTrayRequiresTray: 'Schakel eerst „Tray-pictogram weergeven” in — zonder tray kun je het venster na een verborgen start niet openen.',
clockFormat: 'Tijdformaat',
clockFormatDesc: 'Tijdsweergave voor de wachtrij-ETA en het voorbeeld van de slaaptimer.',
clockFormatAuto: 'Automatisch (systeemtaal)',
clockFormatTwentyFour: '24-uurs',
clockFormatTwelve: '12-uurs (AM/PM)',
preloadMiniPlayer: 'Mini-speler vooraf laden',
preloadMiniPlayerDesc: 'Bouwt het venster van de mini-speler op de achtergrond bij het opstarten van de app, zodat het bij de eerste opening direct inhoud toont. Gebruikt iets meer geheugen.',
linuxWebkitSmoothScroll: 'Vloeiend muiswiel (Linux)',
linuxWebkitSmoothScrollDesc: 'Aan: traag naloop. Uit: regel voor regel, GTK-stijl.',
linuxWebkitInputForceRepaint: 'Tekstvelden bij focus opnieuw tekenen (Linux)',
linuxWebkitInputForceRepaintDesc: 'Tijdelijke oplossing voor WebKitGTK 2.50.x waar tekstvelden bij klikken bevriezen. Zoekicoontjes flikkeren kort bij focus.',
linuxWaylandTextRender: 'Wayland-tekstweergave (Linux)',
linuxWaylandTextRenderDesc:
'Vloeiendheid in de UI werkt meteen. WebKit-hardwareversnelling (scherp/GPU) wordt bewaard en toegepast bij de volgende app-start — live schakelen kan WebKitGTK laten vastlopen.',
linuxWaylandTextRenderBalanced: 'Gebalanceerd',
linuxWaylandTextRenderSharp: 'Scherp (CPU-vriendelijk)',
linuxWaylandTextRenderGpu: 'GPU eerst',
linuxWaylandTextRenderMinimal: 'Minimaal (standaard CSS-verzachting)',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Toont het huidige nummer op je Discord-profiel. Discord moet daarvoor geopend zijn.',
discordRichPresenceNotice: 'Let op: dit is de in Psysonic ingebouwde Discord Rich Presence. Wil je liever de officiële Navidrome Discord Rich Presence-plug-in gebruiken, laat deze functie dan uitgeschakeld en schakel in plaats daarvan verderop op deze pagina „Weergeven in live-venster" in.',
discordCoverTitle: 'Bron albumhoes',
discordCoverDesc: 'Waar de albumhoes op je Discord-profiel vandaan komt. Serverhoezen gebruiken een openbare, credential-vrije afbeeldingslink — iedereen die je profiel bekijkt, kan het openbare adres van je server zien. Vereist een openbaar bereikbare server.',
discordCoverNone: 'Geen (alleen app-icoon)',
discordCoverServer: 'Server (via albuminfo)',
discordCoverApple: 'Apple Music',
discordOptions: 'Geavanceerde Discord-opties',
discordTemplates: 'Aangepaste tekstsjablonen',
discordTemplatesDesc: 'Pas aan welke informatie wordt weergegeven op je Discord-profiel. Variabelen: {title}, {artist}, {album}',
discordTemplateDetails: 'Primaire regel (details)',
discordTemplateState: 'Secundaire regel (state)',
discordTemplateLargeText: 'Album-tooltip (largeText)',
discordTemplateName: 'Gebruikerslijst-regel (name)',
nowPlayingEnabled: 'Weergeven in live-venster',
nowPlayingEnabledDesc: 'Stuurt het huidige nummer naar de live-luisteraarsweergave van de server. Uitschakelen om geen afspeelgegevens te verzenden.',
nowPlayingPluginNote: 'Vereist bij gebruik van de officiële Navidrome Discord Rich Presence-plug-in.',
externalArtwork: 'Externe artwork-scraper',
externalArtworkDesc: "Haalt hogeresolutie artiestachtergronden en -banners van fanart.tv op voor het hoofdpodium, artiestpagina's en de schermvullende speler. Standaard uit.",
externalArtworkNote: 'Indien aan, wordt de naam van de artiest (en het huidige album) naar musicbrainz.org gestuurd om de artiest te identificeren, daarna worden afbeeldingen van fanart.tv opgehaald — op aanvraag en alleen-lezen; je bibliotheektags worden nooit gewijzigd. Afbeeldingen worden geleverd door fanart.tv en zijn bijdragers.',
externalArtworkByokTitle: 'Persoonlijke API-sleutel (BYOK)',
externalArtworkByokDesc: 'Optioneel. Voer hier je eigen persoonlijke fanart.tv-API-sleutel in — deze wordt naast de app-sleutel verstuurd.',
externalArtworkByokSaved: 'Opgeslagen — wordt met de app-sleutel verstuurd terwijl de scraper aan staat.',
enableBandsintown: 'Bandsintown-tourdata',
enableBandsintownDesc: 'Toon aankomende concerten van de huidige artiest in het Info-tabblad. Gegevens komen van de openbare Bandsintown-API.',
lyricsServerFirst: 'Server-songtekst voorrang geven',
lyricsServerFirstDesc: 'Controleer eerst door de server geleverde songteksten (ingebedde tags, sidecar-bestanden) vóór LRCLIB. Uitschakelen om LRCLIB eerst te gebruiken.',
enableNeteaselyrics: 'Netease Cloud Music songteksten',
enableNeteaselyricsDesc: 'Gebruik Netease Cloud Music als laatste bron wanneer server en LRCLIB niets opleveren. Beste dekking voor Aziatische en internationale muziek.',
lyricsSourcesTitle: 'Songtekstbronnen',
lyricsSourcesDesc: 'Kies welke bronnen worden geraadpleegd en in welke volgorde. Sleep om te sorteren. Uitgeschakelde bronnen worden overgeslagen.',
lyricsSourceServer: 'Server',
lyricsSourceLrclib: 'LRCLIB',
lyricsSourceNetease: 'Netease Cloud Music',
lyricsYouLyPlus: 'YouLyPlus (Karaoke)',
lyricsYouLyPlusDesc: 'Woord-voor-woord-synchronisatie van een community-backend (Apple Music, Spotify, Musixmatch, QQ). Wordt eerst geprobeerd; de ingeschakelde bronnen hieronder dienen als fallback.',
lyricsSourcesFallbackHint: 'Worden als fallback gebruikt wanneer YouLyPlus niets vindt. Sleep om te herordenen.',
lyricsSourcesPrimaryHint: 'Worden op volgorde geprobeerd. Sleep om te herordenen. Alles uit = songteksten uitgeschakeld.',
lyricsServerWordSyncHint: 'Woord voor woord vereist Navidrome 0.63+ en songteksten met timing per woord, zoals TTML- of Enhanced LRC-bestanden. Al het andere wordt regel voor regel getoond.',
lyricsStaticOnly: 'Alleen statische tekst weergeven',
lyricsStaticOnlyDesc: 'Gesynchroniseerde songteksten worden zonder auto-scroll en zonder woordmarkering als statische tekst weergegeven.',
downloadsTitle: 'ZIP-export & Archivering',
downloadsFolderDesc: 'Doelmap voor albums die je als ZIP-bestand naar je computer downloadt.',
downloadsDefault: 'Standaard downloadmap',
pickFolder: 'Selecteren',
pickFolderTitle: 'Downloadmap selecteren',
clearFolder: 'Map wissen',
logout: 'Uitloggen',
aboutTitle: 'Over Psysonic',
aboutDesc: 'Een moderne desktopmuziekspeler gebouwd voor Navidrome. Gebruikt de Subsonic-API plus Navidrome-specifieke extensies. Gebouwd op Tauri v2 met een native Rust audio-engine — licht en snel, maar boordevol functies: golfvorm-zoekbalk, gesynchroniseerde songteksten, Last.fm-integratie, 10-bands equalizer, crossfade, naadloos afspelen, Replay Gain, genres en een uitgebreide themabibliotheek.',
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',
aboutReleaseNotesLabel: 'Release-notities',
aboutReleaseNotesLink: 'Nieuws van deze versie openen',
aboutContributorsLabel: 'Bijdragers',
showChangelogOnUpdate: "'Wat is nieuw' tonen bij update",
showChangelogOnUpdateDesc: 'Toont een discrete changelog-banner boven Now Playing na een update. Klik opent de release-notities; X verbergt hem.',
libraryGridMaxColumnsTitle: 'Kaartenrasters in de bibliotheek',
libraryGridMaxColumnsPerfHint: 'Meer kolommen betekent meer tegels per rij en vaak meer lay-out- en schilderwerk — merkbaar bij zeer grote bibliotheken of tragere hardware.',
libraryGridMaxColumnsRangeLabel: 'Maximum aantal kolommen ({{min}}{{max}})',
libraryGridMaxColumnsDesc: 'Geldt voor album-, artiest-, afspeellijst-, radio-, offline- en andere kaartweergaven. Minder kolommen = grotere tegels en meestal minder CPU-belasting.',
libraryIndexTitle: 'Lokale bibliotheeksindex (preview)',
libraryIndexDesc: 'Houdt een lokale kopie van de trackdatabase van elke server bij, zodat bladeren en zoeken snel blijven en offline werken. De eerste synchronisatie draait voor elke geconfigureerde server; offline servers worden automatisch opnieuw geprobeerd.',
libraryIndexDeltaHint: 'Achtergronddelta-synchronisatie controleert gekoppelde servers elke 30 seconden en draait wanneer nodig — meestal elke 545 minuten, afhankelijk van bibliotheekgrootte en belasting.',
libraryIndexEnable: 'Lokale bibliotheeksindex inschakelen',
libraryIndexEnableAllDesc: 'Alle geconfigureerde servers op de achtergrond indexeren en synchroniseren.',
libraryIndexNoServer: 'Voeg eerst een server toe.',
libraryIndexServerListTitle: 'Geïndexeerde servers',
libraryIndexAllExcluded: 'Alle servers zijn uitgesloten van synchronisatie. Schakel de index weer in of voeg een server toe.',
libraryIndexServerOffline: 'Server offline — synchronisatie uitgesteld',
libraryIndexServerSyncing: 'Synchroniseren…',
libraryIndexFullResync: 'Volledige resync',
libraryIndexDeltaSync: 'Delta-sync',
libraryIndexExcludeServer: 'Uitsluiten van synchronisatie',
libraryIndexExcludingServer: 'Uitsluiten…',
libraryIndexExcludedTitle: 'Uitgesloten van synchronisatie',
libraryIndexIncludeServer: 'Weer opnemen',
libraryIndexIncludingServer: 'Opnemen…',
libraryIndexStatus: 'Status',
libraryIndexStatusIdle: 'Inactief',
libraryIndexStatusProbing: 'Server controleren…',
libraryIndexStatusInitial: 'Eerste synchronisatie…',
libraryIndexStatusReady: 'Gereed ({{count}} nummers)',
libraryIndexStatusError: 'Fout — zie logs',
libraryIndexProgressIngest: '{{count}} nummers geïndexeerd…',
libraryIndexProgressVerify: '{{checked}} gecontroleerd ({{deleted}} verwijderd)',
libraryIndexSyncNow: 'Nu synchroniseren',
libraryIndexVerify: 'Bibliotheeksintegriteit controleren',
libraryIndexCancel: 'Annuleren',
libraryIndexAutoReconcile: 'Automatisch afstemmen bij dalend aantal',
libraryIndexAutoReconcileDesc: 'Controleert automatisch op verwijderde nummers wanneer de server minder meldt dan verwacht.',
libraryIndexSyncError: 'Bibliotheeksynchronisatie mislukt: {{error}}',
libraryIndexBindError: 'Index kon niet worden ingeschakeld: {{error}}',
randomMixTitle: 'Willekeurige mix-blacklist',
luckyMixMenuTitle: 'Toon Geluksmix in menu',
luckyMixMenuDesc: 'Schakelt Geluksmix in bij "Mix samenstellen" en als apart menu-item bij gesplitste navigatie. Alleen zichtbaar wanneer AudioMuse actief is op de huidige server.',
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)',
tabAudio: 'Audio',
tabStorage: 'Offline & Cache',
tabAppearance: 'Weergave',
tabThemes: "Thema's",
themesYourThemesTitle: "Jouw thema's",
themesCvdTooltip: 'Kleurenblind-veilig deuteranopie, protanopie, tritanopie',
themeAnimationWarning: 'Dit thema gebruikt animaties die het CPU-gebruik op jouw systeem kunnen verhogen (Nvidia/Linux of compositing uit).',
themeStoreTitle: 'Themawinkel',
themeStoreSubmitText: 'Eigen thema gemaakt? Deel het met de community — meer info in de themarepository.',
themeStoreSubmitLink: 'Themarepository openen',
themeStoreNetworkNotice: 'De Theme Store laadt de catalogus en previews van GitHub. Er worden geen persoonlijke gegevens verzonden.',
themeStoreStatsNotice: 'De laatst-gewijzigd-datums worden eenmaal per dag bijgewerkt (rond 04:17 UTC).',
themeStoreSearchPlaceholder: "Thema's zoeken…",
themeStoreFilterMode: 'Filteren op modus',
themeStoreModeAll: 'Alle',
themeStoreModeDark: 'Donker',
themeStoreModeLight: 'Licht',
themeStoreRefresh: 'Vernieuwen',
themeStoreLoading: "Thema's laden…",
themeStoreError: 'Kan de themawinkel niet laden. Controleer je verbinding.',
themeStoreRetry: 'Opnieuw proberen',
themeStoreOfflineTitle: 'De Theme Store is offline',
themeStoreEmpty: "Geen thema's komen overeen met je filters.",
themeStoreActive: 'Actief',
themeStoreEnlarge: 'Voorbeeld vergroten',
themeStoreSortNewest: 'Nieuwste',
themeStoreSortName: 'Alfabetisch',
themeStoreAnimAll: 'Alle',
themeStoreAnimAnimated: 'Geanimeerd',
themeStoreAnimStatic: 'Statisch',
themeStoreByAuthor: 'door {{author}}',
themeStoreLastChanged: 'Laatst gewijzigd',
themeStoreWhatsNew: 'Wat is er nieuw',
themeMigrationNoticeTitle: 'Thema verplaatst naar de store',
themeMigrationNoticeBody: '{{themes}} wordt niet meer met de app meegeleverd. Je kunt het opnieuw installeren via de Theme Store (Instellingen → Thema\'s) of een ander thema kiezen.',
themeMigrationNoticeOpen: 'Theme Store openen',
themeStoreOffline: 'De laatst gecachte catalogus wordt getoond — je lijkt offline te zijn.',
themeStoreInstall: 'Installeren',
themeStoreInstalling: 'Installeren…',
themeStoreApply: 'Toepassen',
themeStoreUpdate: 'Bijwerken',
themeStoreUpdating: 'Bijwerken…',
themeStoreUninstall: 'Verwijderen',
themeStoreInstallFailed: 'Installatie mislukt',
themeStorePagePrev: 'Vorige pagina',
themeStorePageNext: 'Volgende pagina',
themeStorePageStatus: 'Pagina {{page}} van {{total}}',
themeImportTitle: 'Een thema importeren',
themeImportButton: 'Thema importeren…',
themeImporting: 'Importeren…',
themeImportHint: 'Laadt een thema verpakt als .zip (manifest.json + theme.css).',
themeImportSuccess: '"{{name}}" geïmporteerd.',
themeImportErrorTitle: 'Dit thema kon niet worden geïmporteerd',
themeImportErrorBody: 'Het komt niet overeen met het Psysonic-themaformaat. Mogelijk is het voor een andere versie gemaakt of is het bestand onvolledig — controleer of je de juiste .zip hebt gekozen, of vraag de maker van het thema.',
themeImportErrorDetails: 'Technische details',
themeImportConfirmTitle: 'Thema installeren?',
themeImportConfirmBody: '"{{name}}" van {{author}} installeren?',
themeImportConfirmRisk: 'Geïmporteerde themas worden niet gecontroleerd — installeer alleen themas die je vertrouwt.',
tabLibrary: 'Bibliotheek',
tabServers: 'Servers',
tabLyrics: 'Songteksten',
tabPersonalisation: 'Personalisatie',
tabIntegrations: 'Integraties',
inputKeybindingsTitle: 'Sneltoetsen',
aboutContributorsCount_one: '{{count}} bijdrage',
aboutContributorsCount_other: '{{count}} bijdragen',
aboutContributorsApp: 'App',
aboutContributorsThemes: "Thema's",
aboutThemeContributorsCount_one: '{{count}} thema',
aboutThemeContributorsCount_other: "{{count}} thema's",
searchPlaceholder: 'Instellingen zoeken…',
searchNoResults: 'Geen instellingen komen overeen met je zoekopdracht.',
aboutMaintainersLabel: 'Beheerders',
integrationsPrivacyTitle: 'Privacyverklaring',
integrationsPrivacyBody: 'Alle integraties op dit tabblad zijn <strong>opt-in</strong> en sturen, eenmaal ingeschakeld, gegevens naar externe diensten of naar je Navidrome-server. Last.fm ontvangt je luistergeschiedenis, Discord toont het nu spelende nummer in je profiel, Bandsintown wordt per artiest bevraagd voor tourdatums, en de "Nu aan het afspelen"-deling publiceert je huidige nummer bij andere gebruikers van je Navidrome-server. Wil je dit niet, laat dan de bijbehorende sectie gewoon uitgeschakeld.',
homeCustomizerTitle: 'Hoofdpodium',
queueSettingsTitle: 'Wachtrij-instellingen',
queueModeTitle: 'Weergavemodus wachtrij',
queueModeQueueSub: 'Toont alleen komende nummers. Het huidige nummer blijft in de kop en verdwijnt uit de lijst zodra het is afgespeeld.',
queueModePlaylistSub: 'Houdt de hele wachtrij in de lijst met het huidige nummer bovenaan gemarkeerd; afgespeelde nummers blijven staan.',
queueModeTimelineSub: 'Houd de huidige track bovenaan de lijst, met scrollbare afgespeelde geschiedenis erboven en komende tracks (in shuffle-volgorde) eronder.',
queueToolbarTitle: 'Wachtrij-werkbalk',
queueToolbarReset: 'Standaard herstellen',
queueToolbarSeparator: 'Scheiding',
sidebarTitle: 'Zijbalk',
sidebarReset: 'Standaard herstellen',
artistLayoutTitle: 'Secties artiestenpagina',
artistLayoutDesc: 'Versleep om te herschikken, schakel om individuele secties van de artiestenpagina te verbergen. Secties zonder gegevens worden automatisch overgeslagen.',
artistLayoutReset: 'Standaard herstellen',
artistLayoutBio: 'Biografie van de artiest',
artistLayoutTopTracks: 'Populaire nummers',
artistLayoutSimilar: 'Soortgelijke artiesten',
artistLayoutAlbums: 'Albums',
artistLayoutFeatured: 'Ook te horen op',
playlistLayoutTitle: 'Afspeellijst pagina-indeling',
playlistLayoutDesc: 'Individuele elementen op de afspeellijstpagina tonen of verbergen.',
playlistLayoutReset: 'Standaard herstellen',
playerBarTitle: 'Speelbalk',
playerBarReset: 'Standaard herstellen',
playerBarStarRating: 'Sterbeoordeling',
playerBarFavorite: 'Favoriet (hart)',
playerBarLastfmLove: 'Like-knop',
playerBarPlaybackRate: 'Afspeelsnelheid',
playerBarEqualizer: 'Equalizer',
playerBarMiniPlayer: 'Mini-speler',
playerBarStop: 'Stopknop',
playerBarShuffle: 'Willekeurig afspelen',
playerBarTransportGroup: 'Transport',
playerBarActionsGroup: 'Acties',
playerBarTrackInfo: 'Trackinfo',
playerBarTrackInfoTitle: 'Alleen titel',
playerBarTrackInfoTitleAlbum: 'Titel + album',
playbackRateTitle: 'Afspeelsnelheid',
playbackRateEnabled: 'Afspeelsnelheid inschakelen',
playbackRateEnabledDesc: 'Globale snelheid voor alle nummers. Niet van toepassing op radio en previews.',
playbackRateStrategy: 'Strategie',
playbackRateStrategySpeed: 'Snelheid',
playbackRateStrategyVarispeed: 'Met toon',
playbackRateStrategyVarispeedSemitones: 'Halve tonen',
playbackRateStrategyPreserve: 'Toonhoogte',
playbackRateStrategySpeedTip: 'Verandert het tempo; de toonhoogte wordt automatisch gecorrigeerd.',
playbackRateStrategyVarispeedTip: 'Snelheid en toonhoogte veranderen samen, zoals bij tape. Toonhoogte uit snelheid: 12 × log2(snelheid).',
playbackRateStrategyVarispeedSemitonesTip: 'Zoals « Met toon », maar rechtstreeks in halve tonen ingesteld. Snelheid = 2^(ht/12).',
playbackRateStrategyPreserveTip: 'Instelbaar tempo plus een handmatige toonhoogteverschuiving (±12 ht).',
playbackRateSpeed: 'Snelheid',
playbackRatePitch: 'Toonhoogte',
playbackRateDerivedPitch: 'Toonhoogteverschuiving door snelheid: {{value}}',
playbackRateDerivedSpeed: 'Snelheid uit halve tonen: {{value}}',
playbackRateFineStep: 'Fijnafstelling',
playbackRateFineStepDesc: 'Kleinere schuifregelaarstappen: 0,01× voor snelheid en 0,01 ht voor toonhoogte.',
playbackRateAutoPitch: 'De toonhoogte wordt automatisch gecorrigeerd.',
playbackRateHint: '« Snelheid » behoudt de natuurlijke toonhoogte. « Met toon » verandert de toonhoogte met de snelheid. « Met toon (halve tonen) » stelt die verandering rechtstreeks in halve tonen in. « Toonhoogte » voegt een handmatige verschuiving toe. Meer CPU dan « Met toon ». Niet voor radio, previews of Orbit.',
playbackRateNeutral: 'Bij 1,0× en zonder toonverschuiving is afspelen normaal.',
playbackRateOrbitPaused: 'Niet actief tijdens Orbit-sessies — afspelen blijft 1,0× voor sync.',
playbackRateOrbitPausedShort: 'Orbit: 1,0× voor sync.',
advancedMode: 'Geavanceerd',
advancedModeTooltip: 'Toon geavanceerde opties in alle instellingstabbladen. Bijdragen van de community die niet noodzakelijk de ontwerpfilosofie van de Psysonic-onderhouders weerspiegelen.',
advancedBadge: 'Geavanceerd',
sidebarDrag: 'Slepen om te herordenen',
sidebarFixed: 'Altijd zichtbaar',
nowPlayingTopTitle: '"Nu bezig" bovenaan',
nowPlayingTopDesc: 'Zet "Nu bezig" bovenaan de zijbalk in plaats van onderaan.',
randomNavSplitTitle: 'Mix-navigatie splitsen',
randomNavSplitDesc: 'Toon "Willekeurige mix", "Willekeurige albums" en "Geluksmix" als afzonderlijke zijbalkitems in plaats van de "Mix samenstellen"-hub.',
tabInput: 'Invoer',
tabUsers: 'Gebruikers',
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',
shortcutOpenFolderBrowser: '{{folderBrowser}} openen',
shortcutFullscreenPlayer: 'Volledigschermspeler',
shortcutNativeFullscreen: 'Systeemvolledig scherm',
shortcutOpenMiniPlayer: 'Mini-speler openen',
shortcutStartSearch: 'Zoekopdracht starten',
shortcutStartAdvancedSearch: 'Geavanceerde zoekopdracht starten',
shortcutToggleSidebar: 'Zijbalk in-/uitschakelen',
shortcutMuteSound: 'Geluid dempen',
shortcutToggleEqualizer: 'Equalizer openen / schakelen',
shortcutToggleRepeat: 'Herhaling schakelen',
shortcutOpenNowPlaying: '"Nu speelt" openen',
shortcutShowLyrics: 'Songtekst tonen',
shortcutFavoriteCurrentTrack: 'Huidig nummer aan favorieten toevoegen',
shortcutOpenHelp: 'Help',
tabSystem: 'Systeem',
loggingTitle: 'Logboek',
loggingModeDesc: 'Bepaalt de uitgebreidheid van backendlogs in de terminal.',
loggingModeOff: 'Uit',
loggingModeNormal: 'Normaal',
loggingModeDebug: 'Debug',
loggingExport: 'Logs exporteren',
loggingExportSuccess: 'Logs geëxporteerd ({{count}} regels).',
loggingExportError: 'Kon logs niet exporteren.',
ratingsSectionTitle: 'Beoordelingen',
ratingsSkipStarTitle: 'Overslaan voor 1 ster',
ratingsSkipStarDesc:
'Na meerdere overslagen op rij: nummer op 1 ster zetten. Alleen voor nummers die nog niet beoordeeld waren.',
ratingsSkipStarThresholdLabel: 'Overslagen',
ratingsMixFilterTitle: 'Filter op beoordeling',
ratingsMixFilterDesc:
'Content met lage beoordeling filteren in {{mix}} en {{albums}}. Klik opnieuw op de gekozen ster om de drempel uit te zetten.',
ratingsMixMinSong: 'Nummers',
ratingsMixMinAlbum: 'Albums',
ratingsMixMinArtist: 'Artiesten',
ratingsMixMinThresholdAria: 'Minimum sterren: {{label}}',
backupTitle: 'Back-up & Herstel',
backupExport: 'Instellingen exporteren',
backupExportDesc: 'Slaat alle instellingen, serverprofielen, Last.fm-configuratie, thema, EQ en sneltoetsen op in een .psybkp-bestand. Wachtwoorden worden opgeslagen als leesbare tekst — bewaar het bestand veilig.',
backupImport: 'Instellingen importeren',
backupImportDesc: 'Herstelt instellingen vanuit een .psybkp-bestand. De app wordt herladen na het importeren.',
backupImportConfirm: 'Alle huidige instellingen worden overschreven. Doorgaan?',
backupSuccess: 'Back-up opgeslagen',
backupImportSuccess: 'Instellingen hersteld — herladen…',
backupImportError: 'Ongeldig of beschadigd back-upbestand.',
playbackTitle: 'Afspelen',
replayGain: 'Replay Gain',
replayGainDesc: 'Nummervolume normaliseren met ReplayGain-metadata',
replayGainMode: 'Modus',
replayGainAuto: 'Auto',
replayGainAutoDesc: 'Kiest album-gain wanneer aangrenzende nummers in de wachtrij van hetzelfde album zijn, anders nummer-gain.',
replayGainTrack: 'Nummer',
replayGainAlbum: 'Album',
replayGainPreGain: 'Pre-Gain (getagde bestanden)',
replayGainPreGainDesc: 'Universele boost bovenop elke ReplayGain-berekening. Handig als je bibliotheek over het geheel te zacht aanvoelt.',
replayGainFallback: 'Terugval (zonder tags / radio)',
replayGainFallbackDesc: 'Toegepast op nummers (en radiostreams) zonder ReplayGain-tags, zodat ongetagde inhoud er niet harder uitspringt dan de rest.',
normalization: 'Normalisatie',
normalizationDesc: 'Egaliseer de waargenomen luidheid tussen nummers, albums en radio.',
normalizationOff: 'Uit',
normalizationReplayGain: 'ReplayGain',
normalizationLufs: 'LUFS',
loudnessTargetLufs: 'Doel-LUFS',
loudnessTargetLufsDesc: 'Referentie-luidheid waarop alle nummers worden afgestemd. Lagere waarde = luidere uitvoer. Streamingdiensten zitten meestal rond -14 LUFS.',
loudnessPreAnalysisAttenuation: 'Demping vóór meting',
loudnessPreAnalysisAttenuationDesc:
'Extra zachter tot de loudness van het nummer is opgeslagen. Streamen gebruikt daarna grove schattingen, geen volledige meting. 0 dB = uit; negatiever = zachter. Rechts staat de effectieve dB voor het huidige doel.',
loudnessPreAnalysisAttenuationRef: 'Effectief {{eff}} dB bij doel {{tgt}} LUFS.',
loudnessPreAnalysisAttenuationReset: 'Standaard',
loudnessFirstPlayNote:
'Bij de eerste keer afspelen van een nieuw nummer kan het volume even fluctueren terwijl er gemeten wordt. De volgende keer gebruikt de speler de opgeslagen meting en blijft alles rotsvast. Komende nummers in de wachtrij worden meestal al tijdens het vorige nummer geanalyseerd, dus dit komt in de praktijk zelden voor.',
crossfade: 'Overgang',
crossfadeSecs: '{{n}} s',
autoDj: 'AutoDJ',
autoDjDesc: 'Geen vaste duur — AutoDJ volgt de werkelijke audio en overlapt echte fades en intros in plaats van een vast aantal seconden. Schakel voor betrouwbare resultaten de Warme afspeelcache in.',
autodjSmoothSkip: 'Zacht overslaan',
autodjSmoothSkipDesc: 'Bij overslaan naar het volgende of vorige nummer tijdens het afspelen fadet het huidige nummer kort uit in plaats van abrupt te stoppen.',
autodjOverlapCapTitle: 'Overlaplimiet',
autodjOverlapCapDesc: 'Beperkt hoe lang AutoDJ nummers mag overlappen. Auto volgt inhoudsanalyse (tot 12 s). Limiet stelt uw eigen maximum in.',
autodjOverlapCapAuto: 'Auto',
autodjOverlapCapLimit: 'Limiet',
autodjOverlapCapSecs: '{{n}} s',
gapless: 'Naadloos afspelen',
transitionsTitle: 'Overgangen tussen nummers',
transitionsDesc: 'Hoe opeenvolgende nummers in elkaar overvloeien. Er kan maar één modus tegelijk actief zijn.',
transitionOff: 'Uit',
transitionsHostControlled: 'Tijdens de Orbit-sessie beheerd door de host',
queueBehaviourTitle: 'Wachtrijgedrag',
preservePlayNextOrder: '"Volgende afspelen"-volgorde behouden',
preservePlayNextOrderDesc: 'Nieuwe "Volgende afspelen"-items komen achter bestaande te staan in plaats van ervoor.',
queueTrackListCovers: 'Album art in queue',
queueTrackListCoversSub: 'Show a small album cover beside each track in the queue panel, mini player queue, and fullscreen Up next. Aggressive caching is recommended.',
trackListCoverArtOnPages: 'Album art in track lists',
trackListCoverArtOnPagesSub: 'Klein albumhoesje naast nummers in Nummers, Zoeken, Playlists, Favorieten, willekeurige mix en andere bladerlijsten. Agressieve caching wordt aanbevolen.',
trackPreviewsTitle: 'Track-voorvertoning',
trackPreviewsToggle: 'Track-voorvertoning inschakelen',
trackPreviewsDesc: 'Inline Play- en Voorvertoning-knoppen in trackslijsten tonen voor een korte sample midden in het nummer.',
trackPreviewStart: 'Startpositie',
trackPreviewStartDesc: 'Hoever in de track de voorvertoning start (% van de duur).',
trackPreviewDuration: 'Duur',
trackPreviewDurationDesc: 'Hoe lang elke voorvertoning speelt voordat hij stopt.',
trackPreviewDurationSecs: '{{n}} s',
trackPreviewLocationsTitle: 'Waar voorvertoningen verschijnen',
trackPreviewLocationsDesc: 'Kies in welke lijsten de voorvertoning-knoppen worden weergegeven.',
trackPreviewLocation_suggestions: 'In playlist-suggesties',
trackPreviewLocation_albums: 'In albumlijsten',
trackPreviewLocation_playlists: 'In playlists',
trackPreviewLocation_favorites: 'In favorieten',
trackPreviewLocation_artist: 'In top-tracks van artiest',
trackPreviewLocation_randomMix: 'In Random Mix',
nextTrackBufferingTitle: 'Buffering',
infiniteQueue: 'Oneindige wachtrij',
infiniteQueueDesc: 'Automatisch willekeurige nummers toevoegen als de wachtrij leeg raakt',
experimental: 'Experimenteel',
sidebarLyricsStyle: 'Scrollstijl voor tekst',
sidebarLyricsStyleClassic: 'Klassiek',
sidebarLyricsStyleClassicDesc: 'Actieve regel wordt gecentreerd.',
sidebarLyricsStyleApple: 'Apple Music-like',
sidebarLyricsStyleAppleDesc: 'Actieve regel verankerd bovenaan met vloeiende animatie.',
seekbarStyle: 'Zoekbalkstijl',
fullscreenPlayerStyle: 'Stijl van volledig scherm-speler',
fsLyricsStyleRail: 'Rail',
fsLyricsStyleRailDesc: 'Klassieke 5-regels schuifrail.',
fsLyricsStyleApple: 'Scrollen',
fsLyricsStyleAppleDesc: 'Volledig scherm scrolllijst.',
fullscreenPlayerStyleDesc: 'Kies hoe de volledig scherm-weergave eruitziet.',
fullscreenPlayerMinimal: 'Minimaal',
fullscreenPlayerImmersive: 'Meeslepend',
fullscreenPlayerPrism: 'Prism',
fsShowArtistPortrait: 'Artiestfoto tonen',
fsShowArtistPortraitDesc: 'Artiestfoto (of albumhoes) weergeven aan de rechterkant van de volledigschermspeler.',
fsPortraitDim: 'Verduistering foto',
seekbarStyleDesc: 'Kies het uiterlijk van de afspeelbalk',
buttonSizeTitle: 'Compacte knoppen',
buttonSizeLabel: 'Knopgrootte',
buttonSizeDesc: 'Verkleint de actie- en werkbalkknoppen tot pictogrammen op detailpagina\'s en overzichten.',
buttonSize_large: 'Groot',
buttonSize_small: 'Klein',
seekbarTruewave: 'Echte golfvorm',
seekbarPseudowave: 'Pseudo-golfvorm',
seekbarLinedot: 'Lijn & punt',
seekbarBar: 'Balk',
seekbarThick: 'Dikke balk',
seekbarSegmented: 'Gesegmenteerd',
seekbarNeon: 'Neon',
seekbarPulsewave: 'Pulsgolf',
seekbarParticletrail: 'Deeltjesspoor',
seekbarLiquidfill: 'Vloeistofbuis',
seekbarRetrotape: 'Retrotape',
themeSchedulerTitle: 'Thema-planner',
themeSchedulerEnable: 'Thema-planner inschakelen',
themeSchedulerEnableSub: 'Schakelt automatisch tussen twee thema\'s op basis van de tijd of je systeemthema',
themeSchedulerDayTheme: 'Dagthema',
themeSchedulerDayStart: 'Dag begint om',
themeSchedulerNightTheme: 'Nachtthema',
themeSchedulerNightStart: 'Nacht begint om',
themeSchedulerActiveHint: "Thema-planner is actief - thema's worden automatisch gewisseld.",
themeSchedulerModeLabel: 'Wisselen op basis van',
themeSchedulerModeTime: 'Tijd van de dag',
themeSchedulerModeSystem: 'Systeemthema',
themeSchedulerLightTheme: 'Licht thema',
themeSchedulerDarkTheme: 'Donker thema',
themeSchedulerSystemRestartHint: 'Het wijzigen van de licht/donker-instelling van je systeem wordt pas na het herstarten van de app toegepast.',
visualOptionsTitle: 'Visuele Opties',
coverArtBackground: 'Cover Achtergrond',
coverArtBackgroundSub: 'Toon vervaagde cover als achtergrond in album/playlist headers',
backdropSourcesTitle: 'Achtergronden',
backdropSourcesSub: 'Kies welke afbeelding elk gebied als achtergrond gebruikt en in welke volgorde ze geprobeerd worden. Sleep om te herordenen of zet een bron uit om die over te slaan.',
backdropSurfaceMainstage: 'Hoofdpodium',
backdropSurfaceArtistDetail: 'Artiestpagina-kop',
backdropSurfaceFullscreen: 'Volledig scherm-speler',
backdropSourceBanner: 'Banner',
backdropSourceFanart: 'Fanart-artiestafbeelding',
backdropSourceNavidrome: 'Navidrome-afbeelding',
backdropMoveUp: 'Omhoog',
backdropMoveDown: 'Omlaag',
playlistCoverPhoto: 'Playlist Coverfoto',
playlistCoverPhotoSub: 'Toon coverfoto raster in playlist detailweergave',
showBitrate: 'Toon Bitrate',
showBitrateSub: 'Toon audio bitrate in tracklijsten',
floatingPlayerBar: 'Zwevende Spelerbalk',
floatingPlayerBarSub: 'Houd de spelerbalk zwevend boven de inhoud',
squareCorners: 'Rechte hoeken',
squareCornersSub: 'Verwijder afgeronde hoeken van kaarten voor een strakke, hoekige look',
uiScaleTitle: 'Interface schaal',
uiScaleLabel: 'Zoom',
confirmDeleteServerLibrary: 'Ook de lokale bibliotheekindex van deze server verwijderen? Klik op Annuleren om de gecachte kopie voor offline gebruik te behouden.',
waveformCacheClearBtn: 'Waveform-cache wissen',
waveformCacheCleared: 'Waveform-cache gewist ({{count}} rijen).',
waveformCacheClearFailed: 'Waveform-cache wissen mislukt.',
useCustomTitlebar: 'Aangepaste titelbalk',
useCustomTitlebarDesc: 'Vervang de systeemtitelbalk door een ingebouwde balk die bij het app-thema past. Schakel uit om de native GNOME/GTK-titelbalk te gebruiken.',
windowButtonStyle: 'Vensterknoppen',
windowButtonStyleDesc: 'Kies het uiterlijk van de knoppen minimaliseren, maximaliseren en sluiten.',
windowButtonsDots: 'Stippen',
windowButtonsDotsGlyph: 'Stippen + iconen',
windowButtonsFlat: 'Plat',
windowButtonsPill: 'Pil',
windowButtonsOutline: 'Omtrek',
windowButtonsGlyph: 'Minimaal',
showMinimizeButton: 'Minimaliseerknop tonen',
showMinimizeButtonDesc: 'Schakel uit om alleen maximaliseren en sluiten te tonen.',
analyticsStrategyTitle: 'Analysestrategieën',
analyticsStrategyDesc: 'Kies de analysemethode voor de bibliotheek.',
analyticsStrategyLabel: 'Strategie',
analyticsStrategyLazy: 'Lui',
analyticsStrategyLazyDesc: 'Analyseert alleen wanneer tracks worden afgespeeld of in de hot/offline-cache terechtkomen — minimaal CPU- en netwerkgebruik.',
analyticsStrategyAdvanced: 'Agressief',
analyticsStrategyAdvancedDesc: 'Agressievere achtergrondscan. Na voltooiing krijg je BPM voor alle tracks plus directe loudness- en waveform-lading.',
analyticsStrategyPriorityTitle: 'Analyseprioriteit (altijd actief)',
analyticsStrategyPriorityHigh: '1 — Nu afspelen: eerst downloaden en analyseren (playback-bytes, loudness-backfill of HTTP indien nodig).',
analyticsStrategyPriorityMiddle: '2 — Hierna: de volgende ~5 wachtrijtracks en hot-cache-buren — analyse vanuit cache/downloads waar mogelijk; HTTP-backfill alleen bij miss.',
analyticsStrategyPriorityLow: '3 — Bibliotheekbatch (alleen Agressief): automatische achtergrondwachtrij achteraan; wordt bijgevuld via watermark (~3× workers) zonder op een lege wachtrij te wachten.',
analyticsStrategyServerLabel: 'Server',
analyticsStrategyProgressLabel: 'Analysevoortgang:',
analyticsStrategyProgressValue: '{{percent}}% ({{done}}/{{total}})',
analyticsStrategyActionsLabel: 'Acties',
analyticsStrategyParallelismLabel: 'Parallelle workers',
analyticsStrategyParallelismValue: '{{n}} threads',
analyticsStrategyParallelismDesc: 'Hoeveel tracks tegelijk worden gedownload en geanalyseerd (HTTP + CPU). Hogere waarden versnellen het inhalen van de bibliotheek, maar gebruiken meer netwerk en CPU.',
analyticsStrategyAdvancedWarning: 'Agressief gebruikt meer CPU en netwerkbandbreedte terwijl de bibliotheekbatch op de achtergrond draait.',
analyticsStrategyServerRemoved: 'Verwijderde server',
analyticsStrategyClearAction: 'Analyse wissen',
analyticsStrategyClearTitle: 'Analyse wissen?',
analyticsStrategyClearDesc: 'Analyse wissen voor {{server}} verwijdert gecachte waveforms en loudness. Deze server later opnieuw toevoegen kan een lange herindexering vereisen.',
analyticsStrategyClearCancel: 'Annuleren',
analyticsStrategyClearConfirm: 'Analyse wissen',
analyticsStrategyClearSuccess: 'Analyse gewist voor de verwijderde server.',
analyticsStrategyClearError: 'Analyse wissen voor de verwijderde server mislukt.',
analyticsStrategyProgressEmptyAfterFailed: '100% (0/0, geblokkeerd door mislukte tracks)',
analyticsFailedTracksOpenTitle: 'Mislukte tracks: {{count}}',
analyticsFailedTracksTitle: 'Mislukte analysetracks — {{server}}',
analyticsFailedTracksDesc: 'Deze tracks faalden herhaaldelijk bij decode/enrichment en zijn uitgesloten van automatische achtergrondanalyse.',
analyticsFailedTracksLoading: 'Lijst met mislukte tracks laden…',
analyticsFailedTracksEmpty: 'Geen mislukte tracks voor deze server.',
analyticsFailedTracksClose: 'Sluiten',
analyticsFailedTracksExport: 'Lijst exporteren',
analyticsFailedTracksExportSuccess: 'Lijst met mislukte tracks geëxporteerd ({{count}}).',
analyticsFailedTracksExportError: 'Lijst met mislukte tracks kon niet worden geëxporteerd.',
analyticsFailedTracksRescan: 'Mislukte tracks opnieuw scannen',
analyticsFailedTracksRescanSuccess: 'Opnieuw scannen ingepland voor {{count}} mislukte tracks.',
analyticsFailedTracksRescanError: 'Mislukte tracks opnieuw scannen mislukt.',
analyticsFailedTracksLoadError: 'Mislukte tracks konden niet worden geladen.',
backupImportAny: 'Back-up importeren',
backupImportAnyConfirm: 'Geselecteerd back-upbestand importeren en inhoud toepassen (instellingen, bibliotheekdatabases of volledig). Doorgaan?',
backupModeFull: 'Volledig',
backupModeLibrary: 'Bibliotheekdatabases',
backupModeConfig: 'Configuratie',
backupFullDesc: 'Archiveert instellingen en bibliotheekdatabases in één back-upbestand.',
backupFullExport: 'Volledige back-up exporteren',
backupFullImport: 'Volledige back-up importeren',
backupFullImportConfirm: 'Dit overschrijft instellingen, vervangt huidige bibliotheekdatabases en verplaatst ze naar .bak. Doorgaan?',
backupFullExportSuccess: 'Volledige back-up geëxporteerd.',
backupFullImportSuccess: 'Volledige back-up geïmporteerd — herladen…',
backupFullImportError: 'Volledige back-up kon niet worden geïmporteerd.',
backupLibraryExport: 'Databases exporteren',
backupLibraryExportDesc: 'Maakt een gecomprimeerd archief met schone SQLite-snapshots van bibliotheekdatabases.',
backupLibraryImport: 'Databases importeren',
backupLibraryImportDesc: 'Herstelt bibliotheekdatabases uit een archiefbestand. Huidige databases worden voor het omschakelen naar .bak verplaatst.',
backupLibraryImportConfirm: 'Dit vervangt huidige bibliotheekdatabases en verplaatst ze naar .bak. Doorgaan?',
backupLibraryExportSuccess: 'Databaseback-up geëxporteerd.',
backupLibraryImportSuccess: 'Databaseback-up geïmporteerd.',
backupLibraryImportError: 'Databaseback-up kon niet worden geïmporteerd.',
backupOverlayExportTitle: 'Back-up maken…',
backupOverlayImportTitle: 'Back-up herstellen…',
backupOverlayHint: 'Je kunt het venster open laten terwijl we bestanden verwerken. Invoer is tijdelijk vergrendeld.',
};