From e11aca31da8bd1c3af63cdb1fd04843b03bd0525 Mon Sep 17 00:00:00 2001 From: Gryzze-CAW <288552797+Gryzze-CAW@users.noreply.github.com> Date: Sun, 25 Oct 2026 10:11:22 +0100 Subject: [PATCH] feat: add Dutch (nl) locale --- AGENTS.md | 4 +- README.md | 2 +- electron-builder.json5 | 2 + electron/i18n.ts | 5 + .../tutorialHelpTranslations.test.ts | 2 + src/i18n/config.ts | 1 + src/i18n/locales/nl/common.json | 79 +++ src/i18n/locales/nl/dialogs.json | 97 ++++ src/i18n/locales/nl/editor.json | 453 +++++++++++++++++ src/i18n/locales/nl/launch.json | 157 ++++++ src/i18n/locales/nl/settings.json | 457 ++++++++++++++++++ src/i18n/locales/nl/shortcuts.json | 43 ++ src/i18n/locales/nl/timeline.json | 120 +++++ 13 files changed, 1419 insertions(+), 3 deletions(-) create mode 100644 src/i18n/locales/nl/common.json create mode 100644 src/i18n/locales/nl/dialogs.json create mode 100644 src/i18n/locales/nl/editor.json create mode 100644 src/i18n/locales/nl/launch.json create mode 100644 src/i18n/locales/nl/settings.json create mode 100644 src/i18n/locales/nl/shortcuts.json create mode 100644 src/i18n/locales/nl/timeline.json diff --git a/AGENTS.md b/AGENTS.md index ceea69bb61..2e3dbaf622 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,7 +12,7 @@ OpenScreen is a free, open-source screen recorder and video editor (Electron + R - Test (e2e): `npm run test:e2e` (Playwright) - Lint: `npm run lint` (Biome 2.4) - Format: `npm run format` (Biome, tabs, double quotes, 100-col) -- i18n check: `npm run i18n:check` (validates the 15 locale folders) +- i18n check: `npm run i18n:check` (validates the 16 locale folders) **Use npm, not bun/pnpm/yarn/Deno.** Not a style preference. Node native modules are rebuilt against Electron's ABI by electron-builder + `@electron/rebuild`, which resolve the tree through `package-lock.json`. Another package manager writes a different lockfile, so that rebuild breaks. `packageManager` + `engines` in `package.json` pin the versions; CI installs with `npm ci`. Note what this does *not* cover: the standalone Swift (macOS) and C++ (Windows) capture helpers are separate executables, built by `npm run build:native:` and only *copied* into the package as `extraResources` — `build:win` even passes `--config.npmRebuild=false`. Nothing in a normal build compiles them. @@ -173,7 +173,7 @@ The one rule to know before you merge anything: **there is one release branch pe - **Native capture is platform-fragile**: macOS uses ScreenCaptureKit (Swift), Windows uses WGC (C++/Win32). CI unit-tests the Swift capture core, builds both macOS helpers and checks the compositor on macOS, Windows and Linux. These checks do not exercise real capture, permissions or devices; manual smoke tests on the affected platforms are still required for native changes. See [CI coverage](technical-documentation/engineering/ci-workflows.md#tier-1-application-and-documentation-ci). - **Rendering is native**: the Rust compositor in `crates/compositor/` renders the editor preview and every export, MP4 and GIF. It runs on Direct3D 11 on Windows, Metal on macOS and wgpu on Linux, with a CPU fallback on Windows and Linux. The renderer only paints the preview frames it pulls onto a ``. Details: `technical-documentation/README.md`, then `architecture/native-compositor.md`. -- **i18n**: 15 locales in `src/i18n/locales//` (e.g. `src/i18n/locales/en/settings.json`). The `i18n:check` script validates them — run it after touching translation files. +- **i18n**: 16 locales in `src/i18n/locales//` (e.g. `src/i18n/locales/en/settings.json`). The `i18n:check` script validates them — run it after touching translation files. - **Website i18n** is separate: 8 locales under `website/i18n/`. After changing an English doc, page or `` string in `website/`, follow `website/i18n/TRANSLATING.md` ("Keeping translations up to date"); `npm run i18n:check` in `website/` lists what is behind. - **Build pipeline**: `npm run build` is full electron-builder. For iterating on renderer only, use `npm run build-vite` (Vite + tsc, no packaging). - **Product constraints**: the project is free forever and explicitly "not production-grade". Don't add paywalls, premium tiers, or logic that gates a feature on who the user is, and don't add upsell language to the README or UI copy. This is a hard constraint, not a judgement call. (A flag that hides an unfinished capture backend is fine — it gates on readiness, not on the user.) diff --git a/README.md b/README.md index c5a0b2ffb1..fa6b8e8588 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ A raw capture goes in and comes out ready to post — on X, Reddit, YouTube, a d - Timeline snapping guides and an audio waveform to make trimming easier. - Customizable keyboard shortcuts. - Export to MP4 or GIF in multiple aspect ratios and resolutions, rendered and encoded on the GPU (Metal on macOS, D3D11 on Windows, Vulkan on Linux) with an automatic CPU fallback. -- Languages supported: Arabic, Czech, English, Spanish, French, German, Italian, Japanese, Korean, Portuguese (Brazil), Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. +- Languages supported: Arabic, Czech, English, Spanish, French, German, Italian, Japanese, Korean, Dutch, Portuguese (Brazil), Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. ## Command-line interface (headless) diff --git a/electron-builder.json5 b/electron-builder.json5 index 8b11d8cc77..1dd81dac6d 100644 --- a/electron-builder.json5 +++ b/electron-builder.json5 @@ -74,6 +74,7 @@ "it", "ja", "ko", + "nl", "pt-BR", "pt_BR", "ru", @@ -476,6 +477,7 @@ "it", "ja-JP", "ko-KR", + "nl", "pt-BR", "ru", "tr", diff --git a/electron/i18n.ts b/electron/i18n.ts index 8c8d55bff8..e402be48fa 100644 --- a/electron/i18n.ts +++ b/electron/i18n.ts @@ -19,6 +19,8 @@ import commonJa from "../src/i18n/locales/ja-JP/common.json"; import dialogsJa from "../src/i18n/locales/ja-JP/dialogs.json"; import commonKo from "../src/i18n/locales/ko-KR/common.json"; import dialogsKo from "../src/i18n/locales/ko-KR/dialogs.json"; +import commonNl from "../src/i18n/locales/nl/common.json"; +import dialogsNl from "../src/i18n/locales/nl/dialogs.json"; import commonPtBr from "../src/i18n/locales/pt-BR/common.json"; import dialogsPtBr from "../src/i18n/locales/pt-BR/dialogs.json"; import commonRu from "../src/i18n/locales/ru/common.json"; @@ -42,6 +44,7 @@ type Locale = | "it" | "ja-JP" | "ko-KR" + | "nl" | "pt-BR" | "ru" | "tr" @@ -61,6 +64,7 @@ const messages: Record> = { it: { common: commonIt, dialogs: dialogsIt }, "ja-JP": { common: commonJa, dialogs: dialogsJa }, "ko-KR": { common: commonKo, dialogs: dialogsKo }, + nl: { common: commonNl, dialogs: dialogsNl }, "pt-BR": { common: commonPtBr, dialogs: dialogsPtBr }, ru: { common: commonRu, dialogs: dialogsRu }, tr: { common: commonTr, dialogs: dialogsTr }, @@ -82,6 +86,7 @@ export function setMainLocale(locale: string) { locale === "it" || locale === "ja-JP" || locale === "ko-KR" || + locale === "nl" || locale === "pt-BR" || locale === "ru" || locale === "tr" || diff --git a/src/i18n/__tests__/tutorialHelpTranslations.test.ts b/src/i18n/__tests__/tutorialHelpTranslations.test.ts index fe9410370e..46e50a123b 100644 --- a/src/i18n/__tests__/tutorialHelpTranslations.test.ts +++ b/src/i18n/__tests__/tutorialHelpTranslations.test.ts @@ -9,6 +9,7 @@ import frDialogs from "@/i18n/locales/fr/dialogs.json"; import itDialogs from "@/i18n/locales/it/dialogs.json"; import jaJPDialogs from "@/i18n/locales/ja-JP/dialogs.json"; import koKRDialogs from "@/i18n/locales/ko-KR/dialogs.json"; +import nlDialogs from "@/i18n/locales/nl/dialogs.json"; import ptBRDialogs from "@/i18n/locales/pt-BR/dialogs.json"; import ruDialogs from "@/i18n/locales/ru/dialogs.json"; import trDialogs from "@/i18n/locales/tr/dialogs.json"; @@ -51,6 +52,7 @@ const dialogsByLocale = { it: itDialogs, "ja-JP": jaJPDialogs, "ko-KR": koKRDialogs, + nl: nlDialogs, ru: ruDialogs, tr: trDialogs, vi: viDialogs, diff --git a/src/i18n/config.ts b/src/i18n/config.ts index b11ec67932..8bd80b0718 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -9,6 +9,7 @@ export const SUPPORTED_LOCALES = [ "it", "ja-JP", "ko-KR", + "nl", "ru", "tr", "vi", diff --git a/src/i18n/locales/nl/common.json b/src/i18n/locales/nl/common.json new file mode 100644 index 0000000000..2e6f750f9d --- /dev/null +++ b/src/i18n/locales/nl/common.json @@ -0,0 +1,79 @@ +{ + "actions": { + "cancel": "Annuleren", + "save": "Opslaan", + "delete": "Verwijderen", + "close": "Sluiten", + "resetToDefault": "Standaardwaarde herstellen", + "share": "Selecteren", + "done": "Klaar", + "open": "Openen", + "checkForUpdates": "Controleren op updates", + "updateSettings": "Update-instellingen", + "updateModeNotify": "Melden wanneer een update beschikbaar is", + "updateModeDownload": "Updates automatisch downloaden", + "updateModeDownloadAndInstall": "Updates automatisch downloaden en installeren", + "usagePing": "Anoniem gebruiksaantal versturen", + "viewRelease": "Release bekijken", + "downloadUpdate": "Update downloaden", + "restartNow": "Nu herstarten", + "upload": "Uploaden", + "export": "Exporteren", + "showInFolder": "Tonen in map", + "file": "Bestand", + "edit": "Bewerken", + "view": "Weergave", + "window": "Venster", + "help": "Help", + "quit": "Afsluiten", + "stopRecording": "Opname stoppen", + "undo": "Ongedaan maken", + "redo": "Opnieuw uitvoeren", + "cut": "Knippen", + "copy": "Kopiëren", + "paste": "Plakken", + "selectAll": "Alles selecteren", + "minimize": "Minimaliseren", + "reload": "Herladen", + "forceReload": "Geforceerd herladen", + "toggleDevTools": "Developer Tools aan/uit", + "actualSize": "Werkelijke grootte", + "zoomIn": "Inzoomen", + "zoomOut": "Uitzoomen", + "toggleFullScreen": "Volledig scherm aan/uit", + "recordingStatus": "Opname: {{source}}", + "about": "Over OpenScreen", + "services": "Services", + "hide": "OpenScreen verbergen", + "hideOthers": "Andere verbergen", + "unhide": "Alles tonen", + "saveDiagnostics": "Diagnostiek opslaan", + "starOnGithub": "Ster geven op GitHub", + "permissions": "Machtigingen…", + "closeNotification": "Melding sluiten" + }, + "updates": { + "available": "OpenScreen {{latestVersion}} is beschikbaar. Je gebruikt {{currentVersion}}.", + "current": "OpenScreen is up-to-date ({{currentVersion}}).", + "readyToInstall": "OpenScreen {{latestVersion}} is gedownload. Herstart om de installatie af te ronden.", + "downloaded": "OpenScreen {{latestVersion}} is gedownload.", + "blockedRecording": "Rond je opname af voordat je de update installeert.", + "blockedLocation": "Verplaats OpenScreen naar je map Programma’s voordat je de update uitvoert.", + "failed": "Kon niet controleren op updates.", + "downloadFailed": "Kon de update niet downloaden." + }, + "units": { + "pixelsPerSecond": "{{value}} px/s", + "pixels": "{{value}} px" + }, + "locale": { + "name": "Nederlands", + "short": "NL" + }, + "recordingSource": { + "window": "Venster", + "screen": "Scherm", + "virtual": "Virtueel scherm", + "unknown": "Schermopname" + } +} diff --git a/src/i18n/locales/nl/dialogs.json b/src/i18n/locales/nl/dialogs.json new file mode 100644 index 0000000000..ce11c224dd --- /dev/null +++ b/src/i18n/locales/nl/dialogs.json @@ -0,0 +1,97 @@ +{ + "export": { + "complete": "Export voltooid", + "yourFormatReady": "Je {{format}} is klaar", + "showInFolder": "Tonen in map", + "finalizingVideo": "Video-export afronden…", + "compilingGifProgress": "GIF samenstellen… {{progress}}%", + "compilingGifWait": "GIF samenstellen… Dit kan even duren", + "takeMoment": "Dit kan even duren…", + "failed": "Export mislukt", + "tryAgain": "Probeer het opnieuw", + "finalizingVideoTitle": "Video afronden", + "compilingGif": "GIF samenstellen", + "exportingFormat": "{{format}} exporteren", + "compiling": "Samenstellen", + "renderingFrames": "Frames renderen", + "processing": "Verwerken…", + "finalizing": "Afronden…", + "compilingStatus": "Samenstellen…", + "status": "Status", + "format": "Formaat", + "frames": "Frames", + "cancelExport": "Export annuleren", + "savedSuccessfully": "{{format}} is opgeslagen!" + }, + "tutorial": { + "triggerLabel": "Hoe trimmen werkt", + "title": "Hoe trimmen werkt", + "description": "Zo knip je ongewenste delen uit je video.", + "explanationBefore": "Met de Trim-tool geef je de stukken aan die je wilt", + "remove": "verwijderen", + "explanationMiddle": ". Alles wat", + "covered": "bedekt is", + "explanationAfter": "door een rood trimsegment, wordt bij het exporteren weggesneden.", + "visualExample": "Voorbeeld", + "removed": "VERWIJDERD", + "kept": "Behouden", + "part1": "Deel 1", + "part2": "Deel 2", + "part3": "Deel 3", + "finalVideo": "Eindvideo", + "step1Title": "1. Trim toevoegen", + "step1DescriptionBefore": "Druk op ", + "step1DescriptionAfter": " of klik op het schaarpictogram om een deel te markeren voor verwijdering.", + "step2Title": "2. Bijstellen", + "step2Description": "Sleep de randen van het rode gebied zodat het precies bedekt wat je wilt knippen." + }, + "unsavedChanges": { + "title": "Niet-opgeslagen wijzigingen", + "message": "Je hebt niet-opgeslagen wijzigingen.", + "detail": "Wil je je project opslaan voordat je sluit?", + "saveAndClose": "Opslaan en sluiten", + "discardAndClose": "Negeren en sluiten", + "detailNewProject": "Wil je je project opslaan voordat je een nieuw project maakt?", + "saveAndNewProject": "Opslaan en nieuw project", + "discardAndNewProject": "Negeren en nieuw project", + "detailLoadProject": "Wil je je project opslaan voordat je een ander project laadt?", + "saveAndLoadProject": "Opslaan en project laden", + "discardAndLoadProject": "Negeren en project laden", + "newProject": "Nieuw project", + "importVideo": "Videobestand importeren…", + "loadProject": "Project laden…", + "saveProject": "Project opslaan…", + "saveProjectAs": "Project opslaan als…", + "modal": { + "closeTitle": "Wijzigingen opslaan voordat je sluit?", + "closeBody": "Je project bevat niet-opgeslagen wijzigingen. Sla ze nu op, negeer ze of blijf in de editor.", + "newTitle": "Wijzigingen opslaan voordat je een nieuw project maakt?", + "openTitle": "Wijzigingen opslaan voordat je een ander project opent?", + "recordTitle": "Wijzigingen opslaan voordat je een nieuwe opname start?", + "sharedBody": "Het huidige project bevat niet-opgeslagen wijzigingen. Sla ze eerst op, negeer ze of annuleer.", + "notSavedYet": "Het huidige project is nog niet op schijf opgeslagen.", + "discard": "Negeren", + "saveAndContinue": "Opslaan en doorgaan", + "saving": "Opslaan…" + } + }, + "fileDialogs": { + "saveGif": "Geëxporteerde GIF opslaan", + "saveVideo": "Geëxporteerde video opslaan", + "selectVideo": "Kies een videobestand", + "selectAudio": "Kies een audiobestand", + "saveProject": "OpenScreen-project opslaan", + "openProject": "OpenScreen-project openen", + "gifImage": "GIF-afbeelding", + "mp4Video": "MP4-video", + "videoFiles": "Videobestanden", + "audioFiles": "Audiobestanden", + "openscreenProject": "OpenScreen-project", + "allFiles": "Alle bestanden", + "selectRecordingsFolder": "Kies een map voor opnames" + }, + "recording": { + "lowDiskSpace": "Er is te weinig schijfruimte om de opname te starten (slechts {{availableMb}} MB vrij). Maak ruimte vrij of kies een andere map voor opnames en probeer het opnieuw.", + "folderUnavailable": "De map voor opnames {{path}} is niet bereikbaar. Verbind de schijf opnieuw of kies een andere map in de opnamemodus." + } +} diff --git a/src/i18n/locales/nl/editor.json b/src/i18n/locales/nl/editor.json new file mode 100644 index 0000000000..c57f2c50c4 --- /dev/null +++ b/src/i18n/locales/nl/editor.json @@ -0,0 +1,453 @@ +{ + "newRecording": { + "title": "Terug naar Recorder", + "description": "Je huidige sessie is opgeslagen.", + "cancel": "Annuleren", + "confirm": "Bevestigen" + }, + "loadingVideo": "Video laden…", + "loadingEditor": "Editor laden…", + "errors": { + "exportBackgroundLoadFailed": "Export mislukt: kon de achtergrondafbeelding niet laden ({{url}})", + "exportFailed": "Export mislukt", + "exportFailedWithError": "Export mislukt: {{error}}", + "failedToRevealInFolder": "Fout bij tonen in map: {{error}}", + "failedToSaveExport": "Kon de export niet opslaan", + "failedToSaveExportedVideo": "Kon de geëxporteerde video niet opslaan", + "failedToSaveGif": "Kon de GIF niet opslaan", + "failedToSaveVideo": "Kon de video niet opslaan", + "gifExportFailed": "GIF-export mislukt", + "noVideoLoaded": "Geen video geladen", + "previewCompositorUnavailable": "Voorbeeld niet beschikbaar op deze computer", + "trimNoFilm": "Daar valt niets te knippen. Onder die woorden zit geen beeldmateriaal.", + "unableToDetermineSourcePath": "Kon het pad van de bronvideo niet bepalen", + "videoNotReady": "Video niet gereed", + "wordEditFailed": "Kon dat woord niet wijzigen", + "wordInsertFailed": "Kon dat woord niet toevoegen", + "wordRemoveFailed": "Kon dat woord niet verwijderen" + }, + "export": { + "canceled": "Export geannuleerd", + "exportedSuccessfully": "{{format}} is geëxporteerd" + }, + "project": { + "saveCanceled": "Project opslaan geannuleerd", + "failedToSave": "Kon het project niet opslaan", + "savedTo": "Project opgeslagen in {{path}}", + "failedToLoad": "Kon het project niet laden", + "invalidFormat": "Ongeldig formaat van projectbestand", + "loadedFrom": "Project geladen uit {{path}}" + }, + "recording": { + "failedCameraAccess": "Kon geen cameratoegang aanvragen.", + "cameraBlocked": "Cameratoegang is geblokkeerd. Schakel die in via de systeeminstellingen om de webcam te gebruiken.", + "systemAudioUnavailable": "Systeemaudio is niet beschikbaar. Opnemen zonder systeemaudio.", + "microphoneDenied": "Toegang tot de microfoon geweigerd. De opname gaat verder zonder audio.", + "cameraDenied": "Cameratoegang geweigerd. De opname gaat verder zonder webcam.", + "cameraDisconnected": "Webcam losgekoppeld.", + "cameraNotFound": "Camera niet gevonden.", + "cameraCaptureUnavailable": "De camera kon niet worden geopend. Opnemen zonder camera.", + "microphoneDefaulted": "De gekozen microfoon kon niet worden geïdentificeerd. De standaardingang wordt opgenomen.", + "microphoneUnavailable": "Deze versie van macOS kan de microfoon niet opnemen. Opnemen zonder microfoon.", + "restartFailed": "De nieuwe opname kon niet starten. De vorige is verwijderd.", + "permissionDenied": "Opnamemachtiging geweigerd. Sta schermopname toe.", + "accessibilityAllowAndRetry": "Sta Toegankelijkheid toe voor OpenScreen en druk daarna opnieuw op opnemen om het aftellen te starten.", + "cursorAccessibilityUnavailable": "Toegankelijkheid staat uit. De opname gaat verder, maar cursoreffecten zijn mogelijk beperkt. Schakel het in via Systeeminstellingen voor volledige cursoreffecten.", + "selectSource": "Kies een scherm of venster om op te nemen" + }, + "emptyState": { + "title": "Begin met een opname", + "description": "Neem je scherm op of importeer een video om te beginnen met bewerken.", + "titleHasAsset": "Voeg een video toe om te beginnen", + "descriptionHasAsset": "Importeer een opname om te beginnen met bewerken.", + "recordButton": "Je scherm opnemen", + "newProjectButton": "Een video importeren", + "importVideoButton": "Video importeren", + "loadProjectButton": "Project openen", + "supportedFormats": "Ondersteunde formaten: MP4, MOV, WebM, MKV, AVI, M4V, WMV", + "dragDropHint": "of sleep hier een opgeslagen project naartoe", + "dropOverlay": "Laat het projectbestand los om te openen", + "dropErrors": { + "unsupportedFormatTitle": "Niet-ondersteund bestand", + "unsupportedFormatMessage": "Alleen opgeslagen projecten (.openscreen) kunnen hier worden neergezet. Gebruik de importknop op dit scherm om een video toe te voegen.", + "couldNotOpenTitle": "Kon dit project niet openen", + "couldNotOpenMessage": "Het projectbestand kon niet worden geopend. De video waarnaar het verwijst is mogelijk verplaatst of verwijderd." + } + }, + "regionClipboard": { + "copied": "Kenmerken van {{region}} gekopieerd", + "pasted": "Kenmerken van {{region}} geplakt", + "nothingToCopy": "Selecteer een gebied om de kenmerken te kopiëren", + "nothingToPaste": "Nog geen kenmerken gekopieerd", + "pasteAssetMissing": "Het bestand van dat audiospoor zit niet in dit project", + "pasteEffectOverlap": "Daar speelt al een ander effect: één effect tegelijk", + "kinds": { + "zoom": "Zoom", + "speed": "Snelheid", + "annotation": "Tekst" + } + }, + "topbar": { + "toggleChatPanel": "Chatpaneel", + "openProject": "Project openen", + "newProject": "Nieuw project", + "saveProject": "Project opslaan", + "unsaved": "Niet opgeslagen", + "saved": "Opgeslagen", + "switchToLightTheme": "Overschakelen naar licht thema", + "switchToDarkTheme": "Overschakelen naar donker thema", + "toggleTheme": "Thema wisselen", + "export": "Exporteren", + "renameProject": "Project hernoemen", + "noProject": "Geen project", + "changeLanguage": "Taal wijzigen", + "editorMode": "Editormodus", + "modes": { + "media": "Media", + "edit": "Bewerken", + "rec": "Opnemen" + } + }, + "rec": { + "source": "Bron", + "selectSource": "Kies wat je wilt opnemen", + "systemPicker": "Je systeem vraagt wat je wilt delen", + "systemAudio": "Systeemaudio", + "systemAudioTip": "Neemt het geluid op dat je computer afspeelt", + "microphone": "Microfoon", + "camera": "Camera", + "editableCursor": "Bewerkbare cursor", + "editableCursorTip": "Aan: bewerkbare cursor, met aanpassen en automatisch inzoomen. Uit: systeemcursor, opgenomen in de video.", + "autoZoom": "Automatisch inzoomen na opname", + "hideDesktopIcons": "Bureaubladpictogrammen verbergen", + "hideDesktopIconsHintMac": "Laat de bureaubladpictogrammen weg uit schermopnames. Ze blijven op je bureaublad staan.", + "hideDesktopIconsHintWindows": "Bedekt de bureaubladpictogrammen terwijl je opneemt. Ze komen terug zodra je stopt.", + "on": "Aan", + "off": "Uit", + "loading": "Laden…", + "noCameraFound": "Geen camera gevonden", + "cameraAccessError": "Kon geen toegang krijgen tot deze camera", + "noMicrophoneFound": "Geen microfoon gevonden", + "microphoneUnavailable": "Kon geen toegang krijgen tot de microfoon", + "startingCamera": "Camera starten…", + "turnOnCameraHint": "Schakel de camera in voor een live voorbeeld", + "entireScreen": "Volledig scherm", + "cancel": "Annuleren", + "startRecording": "Opname starten", + "startRecordingHint": "Opent de opnamebalk en sluit dit editorvenster.", + "sourceModal": { + "screens": "Schermen ({{count}})", + "windows": "Vensters ({{count}})", + "loadingSources": "Schermen en vensters laden…", + "noScreensFound": "Geen schermen gevonden", + "noWindowsFound": "Geen vensters gevonden", + "cancel": "Annuleren" + }, + "recordingsFolder": "Map voor opnames", + "resetRecordingsFolder": "Standaard herstellen", + "recordingsFolderFailed": "Kon niet overschakelen naar die map" + }, + "mediaStage": { + "openProjectFirst": "Open eerst een project", + "couldNotAddAsset": "Kon het item niet toevoegen", + "searchPlaceholder": "Media zoeken…", + "dragHint": "Sleep een clip naar de timeline hieronder om hem toe te voegen", + "emptyHint": "Nog geen media. Importeer een opname om te beginnen.", + "importMedia": "Media importeren", + "added": "{{label}} toegevoegd", + "addToTimeline": "Aan timeline toevoegen", + "addedToTimeline": "{{label}} aan de timeline toegevoegd", + "sourceTranscript": "Transcriptie", + "close": "Sluiten", + "transcriptReady": "Transcriptie klaar", + "transcribing": "Transcriberen", + "downloadingModel": "Spraakmodel downloaden", + "initializingModel": "Spraakmodel starten", + "pendingTranscription": "Transcriptie in wachtrij", + "transcriptionFailed": "Transcriptie mislukt", + "cpuBackendHint": "Draait op de CPU: ongeveer 2× langzamer dan op de GPU", + "noTranscript": "Geen transcriptie", + "regenerateAs": "Opnieuw genereren als", + "namesAndTerms": "Namen en termen", + "auto": "Auto", + "regenerate": "Opnieuw genereren", + "regenerateTip": "Opnieuw genereren: transcribeer opnieuw in de gekozen taal", + "transcriptEmpty": "De transcriptie is leeg.", + "notGeneratedHint": "Nog niet gegenereerd. Kies een taal en klik op opnieuw genereren.", + "generationFailedHint": "Genereren mislukt. Kies een taal en genereer opnieuw.", + "detectedLanguage": "Gedetecteerde taal: {{language}}", + "noAudioTrack": "Geen audiospoor", + "noAudioTrackHint": "Deze media heeft geen audiospoor. Er valt niets te transcriberen.", + "mediaUnreadableHint": "Kon de audio van deze media niet lezen. Controleer of OpenScreen toegang heeft tot de map waarin ze staat en genereer daarna opnieuw.", + "noSpeechDetected": "Geen spraak gedetecteerd" + }, + "exportDialog": { + "title": "Exporteren", + "subtitle": "Sla je bewerking op als video of GIF", + "addVideoBeforeExporting": "Voeg een video toe voordat je exporteert.", + "quality": "Kwaliteit", + "qualityMatchRecording": "Gelijk aan opname", + "frameRate": "Framerate", + "size": "Grootte", + "loopGif": "GIF herhalen", + "loopOn": "Herhalen aan", + "loopOff": "Herhalen uit", + "savedTo": "Opgeslagen in", + "exportFailedGeneric": "Export mislukt.", + "writingFile": "Bestand schrijven…", + "renderingFrames": "Je video exporteren", + "framesEta": "Frame {{current}} van {{total}} · nog ongeveer {{eta}}s", + "preparingEncoder": "Voorbereiden…", + "close": "Sluiten", + "cancel": "Annuleren", + "rendering": "Renderen…", + "saving": "Opslaan…", + "starting": "Starten…", + "exportGif": "GIF exporteren", + "exportMp4": "MP4 exporteren", + "exportedGif": "GIF geëxporteerd", + "exportedVideo": "Video geëxporteerd", + "exportedVideoOf": "aan video geëxporteerd in", + "showInFolder": "Tonen in map", + "starPrompt": "OpenScreen is gratis en heeft een MIT-licentie. Een ster op GitHub helpt anderen het te vinden.", + "starPromptNoThanks": "Nee, bedankt", + "rateOnStore": "Beoordelen in de Microsoft Store", + "exportFailed": "Export mislukt", + "failedToWriteFile": "Kon het bestand niet schrijven", + "qualityUpscaleWarning": "Opschalen", + "nothingToExport": "Niets om te exporteren. De timeline is leeg.", + "validationFailed": "De geëxporteerde video kon niet worden gevalideerd. De bestemming is niet vervangen. Probeer opnieuw te exporteren.", + "noReadableFrames": "Er zijn geen videoframes geëxporteerd. Controleer of de clips leesbare video bevatten voordat je opnieuw exporteert.", + "cameraEnded": "Kan clip {{clip}} niet exporteren: de cameravideo eindigt voordat deze clip begint. Neem de camera opnieuw op of verwijder het spoor voordat je exporteert.", + "cameraUnreadable": "Kan clip {{clip}} niet exporteren: de cameravideo heeft geen leesbaar frame aan het begin van de clip. Neem de camera opnieuw op of verwijder het spoor voordat je exporteert.", + "screenUnreadable": "Kan clip {{clip}} niet exporteren: de schermvideo kan aan het begin van de clip niet worden gelezen. Controleer de opname of pas de clip aan voordat je opnieuw exporteert." + }, + "inspector": { + "resetFocusPoint": "Focuspunt herstellen", + "setColor": "Kleur {{color}} instellen", + "trimHiddenDuration": "{{duration}}s bronmateriaal is verborgen in de bewerkte timeline.", + "restoreDeleteTrim": "Dit deel terugbrengen", + "collapseInspector": "Inspector inklappen", + "editClipTip": "Clip bewerken: bijsnijden, begin en einde", + "captionsDescription": "Genereer ondertitels met woordtiming uit de transcriptie en zet ze op de timeline.", + "generateCaptions": "Ondertitels genereren", + "cropDescription": "Kader de opname opnieuw: kies een beeldverhouding en zoom in op het gebied dat je wilt houden.", + "openCrop": "Bijsnijden openen…", + "deleteRegion": "Gebied verwijderen", + "freehandRendersAsBox": "In de export vult de blur de rechthoek rond je vrije vorm, dus er kan iets meer verborgen worden dan je tekende.", + "effectError": "Compileert niet op deze computer", + "effectTarget": "Geldt voor", + "effectTargetImage": "Afbeelding", + "effectTargetText": "Tekst", + "effectTargetBoth": "Beide", + "effectCost": "Belasting", + "effectTierLight": "Licht", + "effectTierMedium": "Gemiddeld", + "effectTierHeavy": "Zwaar", + "effectTierVeryHeavy": "Zeer zwaar", + "effectCode": "Code", + "copyEffectCode": "Code kopiëren" + }, + "chat": { + "changeProvider": "Provider wijzigen", + "back": "Terug", + "currentModel": "Huidig model:", + "notSelected": "Niet geselecteerd", + "loadingModels": "Modellen laden…", + "searchModels": "Modellen zoeken…", + "fetchModelsFailed": "Kon de actuele modellen niet ophalen ({{error}}). Open de providerinstellingen om handmatig een model-id in te voeren.", + "noModelsAvailable": "Geen modellen beschikbaar bij deze provider.", + "noModelsMatch": "Geen modellen gevonden voor deze zoekopdracht.", + "noProvidersConnected": "Nog geen providers verbonden.", + "selectModelFailed": "Kon het model niet selecteren", + "providerSettings": "Providerinstellingen…", + "applyEditsFailed": "Kon de bewerkingen van de agent niet toepassen", + "agentEditConflict": "De bewerkingen van de agent zijn niet toegepast omdat het project veranderde terwijl de agent bezig was.", + "applyAnyway": "Toch toepassen", + "chatFailed": "Chat mislukt", + "rewindFailed": "Terugspoelen mislukt", + "rewoundSuccess": "Teruggespoeld naar het begin van dat bericht", + "notEnoughHistory": "Nog niet genoeg geschiedenis om samen te vatten.", + "compactedSuccess": "Eerdere context samengevat", + "compactFailed": "Samenvatten mislukt", + "createSessionFailed": "Kon het gesprek niet maken", + "deleteSessionFailed": "Kon het gesprek niet verwijderen", + "renameSessionFailed": "Kon het gesprek niet hernoemen", + "reasoningEffortUpdateFailed": "Kon de redeneerinspanning niet bijwerken", + "contextTooltip": "{{usedTokens}} / {{budgetTokens}} geschatte tokens", + "contextPercent": "{{percent}}% context", + "compactContext": "Vat eerdere berichten samen om minder context te gebruiken", + "aiSettings": "AI-instellingen", + "history": "Gespreksgeschiedenis", + "newConversation": "Nieuw gesprek", + "untitledConversation": "Gesprek", + "clickToRename": "Klik om te hernoemen", + "renameConversation": "Gesprek hernoemen", + "deleteConversation": "Gesprek verwijderen", + "confirmDeleteConversation": "“{{title}}” verwijderen?", + "emptyState": "Nog geen berichten. Vraag de agent om stiltes weg te knippen, pauzes in te korten of ondertitels toe te voegen.", + "welcome": { + "title": "Gebruik je eigen AI", + "subtitle": "De chat bewerkt je video door met een taalmodel te praten. Kies een provider die je vertrouwt en koppel een API-sleutel om te beginnen.", + "feature1": "Stiltes wegknippen, pauzes inkorten, stopwoorden verwijderen", + "feature2": "Ondertitels toevoegen, op de camera inzoomen, een titel genereren", + "feature3": "Een sectie herschrijven, herformuleren of clips herschikken op verzoek", + "cta": "Een provider instellen", + "disclaimer": "De transcriptie van je video wordt verstuurd naar de provider die je kiest. Er wordt niets gedeeld totdat je er een koppelt." + }, + "authorUser": "Jij", + "authorAssistant": "OpenScreen", + "rewindToMessage": "Terugspoelen naar dit bericht", + "rewindTip": "Terugspoelen naar dit bericht. Latere wijzigingen worden ongedaan gemaakt.", + "copyMessage": "Bericht kopiëren", + "copiedToClipboard": "Gekopieerd naar klembord", + "copyFailed": "Kon niet kopiëren", + "appliedPrefix": "toegepast:", + "thinking": "Denken…", + "composerPlaceholder": "Beschrijf de bewerking die je wilt.", + "composerDisabledNoProvider": "Stel een provider in om te chatten.", + "modelLabel": "Model", + "reasoningEffortLabel": "Redeneerinspanning", + "send": "Versturen", + "rewindConfirmTitle": "Hier terugspoelen?", + "rewindConfirmBody": "De bewerkingen van de agent en de beurten daarna worden teruggedraaid. Project, gesprek en agentstatus worden hersteld. Bewerkingen die je sindsdien zelf hebt gedaan, worden ook vervangen.", + "rewindConfirm": "Terugspoelen", + "configureModel": "AI-model configureren", + "historyDialog": { + "title": "Gespreksgeschiedenis", + "subtitle": "Wissel tussen sessies of maak een nieuwe", + "empty": "Nog geen gesprekken.", + "msgsCount": "{{count}} berichten · {{date}}" + }, + "stop": "Stoppen", + "stopping": "Stoppen…", + "stopped": "Door jou gestopt. Bewerkingen die al zijn toegepast, blijven behouden.", + "stopFailed": "Kon de beurt van de agent niet stoppen." + }, + "newProjectDialog": { + "title": "Nieuw project", + "subtitle": "Kies een beginpunt en geef het een naam", + "nameLabel": "Projectnaam", + "startingPointLabel": "Beginpunt", + "create": "Project maken", + "defaultTitle": "Naamloos project", + "templates": { + "screenRecordingTitle": "Schermopname", + "screenRecordingDesc": "Systeemopname starten", + "importMediaDesc": "Video, audio, afbeeldingen van schijf" + } + }, + "openProjectDialog": { + "title": "Project openen", + "subtitle": "Ga verder met een bestaand project of blader door je bestanden", + "searchPlaceholder": "Projecten zoeken…", + "noMatches": "Geen projecten gevonden voor “{{query}}”.", + "navigateHint": "om te navigeren ·", + "openHint": "om te openen", + "browseFiles": "Bestanden doorbladeren…", + "deleteProject": "Project verwijderen", + "confirmDelete": "Dit project verwijderen? Je opnames blijven bewaard." + }, + "editClipDialog": { + "title": "Clip bewerken", + "adjustStart": "Begin van de clip aanpassen", + "adjustEnd": "Einde van de clip aanpassen", + "originalDuration": "Oorspronkelijke duur", + "trimRange": "Trimbereik", + "duration": "Eindduur", + "reset": "Herstellen", + "apply": "Toepassen", + "pickClipTitle": "Kies een clip om te bewerken", + "clipLabel": "Clip {{index}}" + }, + "cropDialog": { + "subtitle": "Sleep het gebied of de handvatten om het bijsnijdgebied aan te passen" + }, + "transport": { + "playbackControls": "Afspeelbediening", + "play": "Afspelen", + "pause": "Pauzeren", + "loop": "Herhalen" + }, + "shell": { + "aiEditor": "AI-editor", + "resizeChatPanel": "Formaat van chatpaneel wijzigen", + "previewStage": "Voorbeeldvenster", + "resizeTimeline": "Formaat van timeline wijzigen" + }, + "preview": { + "videoPreview": "Videovoorbeeld", + "webcamPreview": "Cameravoorbeeld", + "mediaError": { + "title": "Voorbeeld gestopt", + "description": "De video kon niet worden gedecodeerd. Het bestand is mogelijk beschadigd, wordt nog geschreven of staat niet meer waar het project het verwacht. Je project zelf is intact.", + "retry": "Opnieuw proberen", + "detail": "Details: {{detail}}" + } + }, + "annotationOverlay": { + "imageAlt": "Annotatie", + "noImage": "Geen afbeelding", + "noArrowData": "Geen pijlgegevens" + }, + "providerSettings": { + "title": "AI-instellingen", + "subtitle": "Kies een provider. Je sleutels worden veilig op deze computer opgeslagen.", + "loadFailed": "Kon de AI-instellingen niet laden", + "saved": "{{provider}} opgeslagen", + "connected": "{{provider}} verbonden", + "disconnected": "{{provider}} losgekoppeld", + "pillConnected": "Verbonden", + "pillApiKey": "API-sleutel", + "notConnected": "Niet verbonden", + "back": "Terug", + "modelLabel": "Model", + "modelHintLive": "Modellen uit je account, live opgehaald.", + "modelHintError": "Kon de actuele modellen niet ophalen ({{error}}). Voer handmatig een model-id in.", + "modelHintLoading": "Actuele modellen laden…", + "modelSavedOption": "{{model}} (opgeslagen)", + "loadingModels": "Modellen laden…", + "baseUrlLabel": "Basis-URL", + "baseUrlHint": "Laat leeg om de standaard van de provider te gebruiken.", + "reasoningEffortLabel": "Redeneerinspanning", + "apiKeyLabel": "API-sleutel", + "apiKeyHintStored": "Veilig opgeslagen op deze computer. Laat leeg om de huidige sleutel te behouden.", + "projectEditsLabel": "Bewerkingen door agent", + "projectEditsHint": "Als dit uit staat, moet de agent toestemming vragen voordat hij de timeline wijzigt. Bewerkingen zijn altijd ongedaan te maken.", + "allowAgentEdits": "De agent toestaan het project te bewerken", + "disconnect": "Loskoppelen", + "cancel": "Annuleren", + "save": "Opslaan", + "saveAndUse": "Opslaan en gebruiken" + }, + "mcpServer": { + "title": "MCP-server", + "description": "Laat MCP-clients die je zelf uitvoert, zoals Claude Code of Codex, de AI-bewerkingstools gebruiken op al je projecten, niet alleen op het project dat open staat in de editor. Ze melden zich aan met hun eigen accounts. OpenScreen ziet die nooit.", + "enableLabel": "Server", + "enable": "MCP-server inschakelen", + "editsLabel": "MCP-bewerkingen", + "allowEdits": "MCP-clients toestaan je projecten te bewerken, op te nemen en te exporteren", + "editsHint": "Standaard uit: clients kunnen je projecten lezen en elke bewerking, opname of export die ze proberen wordt geweigerd. Als dit aan staat, wordt elke bewerking opgeslagen zodra ze binnenkomt. Een bewerking aan het project dat in de editor open staat, kun je daar ongedaan maken.", + "statusRunning": "Actief", + "statusOff": "Uit", + "statusError": "Niet actief", + "portLabel": "Poort", + "portApply": "Toepassen", + "tokenLabel": "Toegangstoken", + "tokenHint": "Clients moeten dit token meesturen. Opnieuw genereren koppelt alle clients los die met het oude token zijn ingesteld.", + "show": "Tonen", + "hide": "Verbergen", + "copy": "Kopiëren", + "regenerate": "Opnieuw genereren", + "claudeCodeLabel": "Claude Code", + "codexLabel": "Codex", + "codexHint": "Codex leest het token uit de omgevingsvariabele {{env}}. Stel die in in de shell waarmee je Codex start.", + "copied": "Gekopieerd naar klembord", + "copyFailed": "Kon niet kopiëren", + "updateFailed": "Kon de MCP-server niet bijwerken" + }, + "cpuCompositor": { + "notice": "Zonder compatibele GPU: renderen op de CPU, dus het afspelen is trager.", + "exportWarning": "Geen compatibele GPU: deze export draait op de CPU en duurt veel langer dan normaal." + } +} diff --git a/src/i18n/locales/nl/launch.json b/src/i18n/locales/nl/launch.json new file mode 100644 index 0000000000..66232fd797 --- /dev/null +++ b/src/i18n/locales/nl/launch.json @@ -0,0 +1,157 @@ +{ + "tooltips": { + "hideHUD": "Opnamebalk verbergen", + "hideHUDTip": "Verberg de opnamebalk. Toon hem opnieuw via het tray-pictogram.", + "closeApp": "OpenScreen afsluiten", + "restartRecording": "Deze opname verwijderen en een nieuwe starten", + "cancelRecording": "Deze opname stoppen en verwijderen", + "pauseRecording": "Opname pauzeren", + "resumeRecording": "Opname hervatten", + "useVerticalTray": "Overschakelen naar verticale balk", + "useHorizontalTray": "Overschakelen naar horizontale balk", + "changeSource": "Kies een ander scherm of venster", + "systemAudio": "Systeemaudio: neemt het geluid op dat je computer afspeelt", + "microphone": "Microfoon: neemt je stem op", + "camera": "Camera: neemt jou op als aparte laag die je in de editor kunt verplaatsen", + "openStudio": "Studio openen: de editor voor je opnames", + "openNotes": "Notities openen: tekst om te lezen terwijl je opneemt", + "openNotesPlaceholder": "Maak hier notities…", + "notesToolbar": { + "bold": "Vet", + "italic": "Cursief", + "strikethrough": "Doorhalen", + "bulletList": "Lijst met opsommingstekens", + "numberedList": "Genummerde lijst", + "blockquote": "Citaat", + "codeBlock": "Codeblok", + "play": "Automatisch scrollen starten", + "pause": "Automatisch scrollen pauzeren", + "speed": "Scrollsnelheid", + "decreaseSpeed": "Scrollsnelheid verlagen", + "increaseSpeed": "Scrollsnelheid verhogen", + "fontSize": "Lettergrootte", + "decreaseFontSize": "Lettergrootte verkleinen", + "increaseFontSize": "Lettergrootte vergroten", + "mirror": "Horizontaal spiegelen", + "mirrorTip": "Draai de tekst van links naar rechts om, zodat je hem in een spiegel kunt lezen" + } + }, + "audio": { + "systemAudio": "Systeemaudio", + "microphone": "Microfoon", + "inputDevice": "Invoerapparaat" + }, + "webcam": { + "searching": "Zoeken…", + "noneFound": "Geen camera gevonden", + "unavailable": "Camera niet beschikbaar", + "camera": "Camera", + "cameraDevice": "Camera-apparaat", + "quality": "Camerakwaliteit", + "quality1080p": "1080p", + "quality1440p": "1440p", + "quality2160p": "4K" + }, + "cursor": { + "name": "Bewerkbare cursor", + "editableTip": "Bewerkbare cursor: apart opgenomen, zodat je hem in de editor kunt aanpassen en automatisch kunt inzoomen", + "systemTip": "Systeemcursor: je echte cursor, opgenomen in de video. Geen aanpassingen, geen automatische zoom." + }, + "sourceSelector": { + "loading": "Schermen en vensters laden…", + "screens": "Schermen ({{count}})", + "windows": "Vensters ({{count}})", + "emptyTitle": "Geen schermen of vensters gevonden", + "emptyDescription": "Als je zonet toestemming voor schermopname hebt gegeven, laad deze kiezer dan opnieuw. Op macOS moet je OpenScreen mogelijk opnieuw openen.", + "loadFailedDescription": "OpenScreen kon je schermen en vensters niet laden. Laad deze kiezer opnieuw en probeer het nogmaals.", + "defaultSourceName": "Scherm" + }, + "recording": { + "selectSource": "Kies een scherm of venster om op te nemen", + "systemPicker": "Je systeem vraagt wat je wilt delen", + "start": "Opname starten", + "stop": "Opname stoppen en opslaan", + "saving": "Opslaan…" + }, + "language": "Taal", + "languageWithName": "Taal: {{language}}", + "systemLanguagePrompt": { + "title": "Je systeemtaal gebruiken?", + "description": "We hebben {{language}} gedetecteerd als je systeemtaal. Wil je OpenScreen overschakelen naar {{language}}?", + "switch": "Overschakelen naar {{language}}", + "keepDefault": "Huidige taal behouden" + }, + "softwareEncoderFallback": { + "title": "Overgeschakeld op een back-upencoder", + "description": "De encoder van je grafische kaart is niet gestart, dus OpenScreen is overgeschakeld op een back-up. Je opname is in orde, al kan je computer iets harder werken.", + "dismiss": "Begrepen", + "dontShowAgain": "Niet meer tonen" + }, + "deviceSettings": { + "title": "Apparaatinstellingen", + "close": "Sluiten", + "micLevel": "Ingangsniveau", + "micHint": "Spreek om je microfoon te testen", + "noMicrophones": "Geen microfoon gevonden", + "preview": "Voorbeeld", + "previewUnavailable": "Voorbeeld niet beschikbaar", + "about": "Over", + "version": "Versie {{version}}", + "checkingForUpdates": "Controleren…" + }, + "permissions": { + "title": "OpenScreen heeft enkele machtigingen nodig", + "subtitle": "macOS vraagt je om elke machtiging één keer te verlenen. Je kunt ze op elk moment wijzigen in Systeeminstellingen.", + "level": { + "required": "Vereist", + "recommended": "Aanbevolen", + "optional": "Optioneel" + }, + "rows": { + "screen": { + "name": "Scherm en systeemaudio", + "description": "Om je scherm en het geluid dat je Mac afspeelt op te nemen." + }, + "systemAudio": { + "name": "Systeemaudio", + "description": "Om het geluid op te nemen dat je Mac afspeelt. Een scherm of venster kiezen vereist geen machtiging." + }, + "accessibility": { + "name": "Toegankelijkheid", + "description": "Om de juiste cursor (aanwijzer, tekst) in je opnames te tonen." + }, + "microphone": { + "name": "Microfoon", + "description": "Om je stem op te nemen." + }, + "camera": { + "name": "Camera", + "description": "Om je webcam aan je opnames toe te voegen." + } + }, + "status": { + "granted": "Toegestaan", + "restricted": "Beheerd door je organisatie" + }, + "actions": { + "continue": "Doorgaan", + "allow": "Toestaan", + "openSettings": "Instellingen openen", + "restart": "OpenScreen herstarten", + "start": "Aan de slag" + }, + "help": { + "screenPrompt": "macOS vraagt je daarna om OpenScreen in te schakelen in Systeeminstellingen.", + "screenSettings": "Schakel OpenScreen in via Systeeminstellingen. Als macOS aanbiedt om de app af te sluiten en opnieuw te openen, ga dan akkoord: dit venster komt terug.", + "screenNotListed": "Staat OpenScreen niet in de lijst? Klik op + en kies OpenScreen in Programma’s.", + "screenRestart": "Toegestaan. OpenScreen moet herstarten voordat het dit kan gebruiken.", + "screenRecurring": "Bij je eerste opname vraagt macOS of OpenScreen rechtstreeks toegang mag krijgen tot je scherm, zonder de systeemkiezer. Klik op Toestaan. macOS vraagt dit af en toe opnieuw. Dat is normaal.", + "systemAudioPrompt": "macOS vraagt je om OpenScreen toe te staan het geluid op te nemen dat je Mac afspeelt.", + "systemAudioRequested": "Als je nee hebt gezegd, schakel OpenScreen dan in onder “Alleen systeemaudio opnemen” in Systeeminstellingen." + }, + "footer": { + "screenRequired": "Schermopname is nodig om op te nemen.", + "ready": "Je bent klaar." + } + } +} diff --git a/src/i18n/locales/nl/settings.json b/src/i18n/locales/nl/settings.json new file mode 100644 index 0000000000..11d78bd942 --- /dev/null +++ b/src/i18n/locales/nl/settings.json @@ -0,0 +1,457 @@ +{ + "background": { + "motion": "Animatie", + "motionNone": "Geen", + "motionDrift": "Drift", + "motionAurora": "Aurora", + "motionWaves": "Golven", + "gradientLabel": "Verloop {{index}}", + "uploadCustom": "Afbeelding uploaden", + "unsupportedImage": "Niet-ondersteunde afbeelding. Gebruik een JPG- of PNG-bestand.", + "title": "Achtergrond", + "imageLabel": "Achtergrond {{index}}", + "custom": "Aangepast", + "customColor": "Aangepaste kleur", + "customGradient": "Verloop vanuit één kleur", + "help": "Kies wat er achter de opname verschijnt: een meegeleverde achtergrondafbeelding, een effen kleur, een kleurverloop of een eigen afbeelding van schijf.", + "gradient": "Kleurverloop", + "colorLabel": "Kleur {{color}}", + "customWallpaper": "Eigen achtergrond", + "colorPalette": "Kleurenpalet", + "imageReadFailed": "Kon dat afbeeldingsbestand niet lezen.", + "image": "Afbeelding", + "presets": "Presets", + "color": "Kleur", + "colorWheel": "Kleurenwiel" + }, + "customFont": { + "namePlaceholder": "Mijn eigen lettertype", + "failedToAdd": "Kon het lettertype niet toevoegen", + "addingButton": "Toevoegen…", + "errorInvalidUrl": "Voer een geldige Google Fonts-URL in", + "urlHelp": "Haal dit op bij Google Fonts: kies een lettertype → klik op “Get font” → kopieer de @import-URL", + "urlLabel": "Google Fonts import-URL", + "successMessage": "Lettertype “{{fontName}}” is toegevoegd", + "nameLabel": "Weergavenaam", + "errorEmptyName": "Voer een naam voor het lettertype in", + "nameHelp": "Zo verschijnt het lettertype in de lettertypekiezer", + "errorEmptyUrl": "Voer een Google Fonts import-URL in", + "errorExtractFailed": "Kon de lettertypefamilie niet uit de URL halen", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "dialogTitle": "Google Font toevoegen", + "errorTimeout": "Het lettertype deed er te lang over om te laden. Controleer de URL en probeer het opnieuw.", + "errorLoadFailed": "Het lettertype kon niet worden geladen. Controleer of de Google Fonts-URL klopt.", + "addButton": "Lettertype toevoegen" + }, + "imageUpload": { + "invalidFileType": "Ongeldig bestandstype", + "failedToUpload": "Kon de afbeelding niet uploaden", + "jpgOnly": "Upload een JPG-, JPEG- of PNG-afbeeldingsbestand.", + "uploadSuccess": "Eigen afbeelding is geüpload!", + "errorReading": "Er is een fout opgetreden bij het lezen van het bestand." + }, + "annotation": { + "blurShapeRectangle": "Rechthoek", + "size": "Grootte", + "customSize": "Aangepaste grootte", + "tipShiftTabCycle": "Gebruik Shift+Tab om achteruit te bladeren.", + "clearBackground": "Achtergrond wissen", + "colorPalette": "Kleurenpalet", + "invalidImageType": "Ongeldig bestandstype", + "background": "Achtergrond", + "typeText": "Tekst", + "active": "Actief", + "color": "Kleur", + "blurShapeFreehand": "Vrije vorm", + "arrowDirection": "Pijlrichting", + "blurTypeMosaic": "Mozaïek", + "colorWheel": "Kleurenwiel", + "textColor": "Tekstkleur", + "title": "Annotatie-instellingen", + "blurType": "Type blur", + "typeBlur": "Blur", + "blurIntensity": "Blur-intensiteit", + "selectStyle": "Stijl kiezen", + "textContent": "Tekst", + "typeArrow": "Pijl", + "none": "Geen", + "blurColor": "Blur-kleur", + "customFonts": "Eigen lettertypen", + "imageUploadSuccess": "Afbeelding is geüpload!", + "type": "Type", + "arrowColor": "Pijlkleur", + "textPlaceholder": "Typ je tekst…", + "imageFormatsOnly": "Upload een JPG-, PNG-, GIF- of WebP-afbeeldingsbestand.", + "blurShape": "Blur-vorm", + "uploadImage": "Afbeelding uploaden", + "blurTypeBlur": "Vloeiend", + "tipTabCycle": "Gebruik Tab om door overlappende items te bladeren.", + "shortcutsAndTips": "Sneltoetsen en tips", + "deleteAnnotation": "Annotatie verwijderen", + "fontStyle": "Lettertypestijl", + "defaultText": "Hallo", + "mosaicBlockSize": "Mozaïekblokgrootte", + "blurColorBlack": "Zwart", + "strokeWidth": "Dikte: {{width}}px", + "blurShapeOval": "Ovaal", + "blurColorWhite": "Wit", + "tipMovePlayhead": "Verplaats de afspeelkop naar het overlappende annotatiegedeelte en selecteer een item.", + "typeImage": "Afbeelding" + }, + "effects": { + "fitClipFew": "{{count}} clips", + "title": "Compositie", + "shadow": "Schaduw", + "off": "uit", + "on": "aan", + "blurBg": "Achtergrond vervagen", + "help": "Framestijl voor de opname: achtergrondblur, slagschaduw, bewegingsonscherpte, hoekafronding en marge rond de video.", + "fitClipOne": "{{count}} clip", + "formatAuto": "Auto", + "formatAutoMixed": "Clips verschillen", + "formatFill": "Opname", + "formatFillFit": "Geheel", + "formatFillFollow": "Cursor volgen", + "formatOriginal": "Origineel", + "fitClipMany": "{{count}} clips", + "frame": "Frame", + "motion": "Beweging", + "padding": "Marge", + "format": "Formaat", + "motionBlur": "Bewegingsonscherpte", + "depthOfField": "Scherptediepte", + "depthOfFieldTip": "Vervaagt de verre kant van een gekanteld scherm", + "roundness": "Afronding", + "frameStyle": "Stijl", + "windowNone": "Geen", + "frameWindow": "Venster", + "frameLaptop": "Laptop", + "framePhone": "Telefoon", + "frameScreen": "Scherm", + "frameTheme": "Thema", + "frameThemeLight": "Licht", + "frameThemeDark": "Donker", + "roundnessFrameHelp": "Het bereik hangt af van het frame. 100% is de meest afgeronde vorm die nog goed oogt.", + "shadowNone": "Geen", + "shadowLight": "Licht", + "shadowMedium": "Gemiddeld", + "shadowStrong": "Sterk" + }, + "stylePresets": { + "button": "Presets", + "menuLabel": "Stijlpresets", + "factoryName": "OpenScreen", + "factoryBadge": "Ingebouwd", + "empty": "Nog geen opgeslagen presets", + "create": "Nieuwe preset maken…", + "namePlaceholder": "Naam van preset", + "save": "Opslaan", + "moreActions": "Meer acties voor {{name}}", + "revealMac": "Tonen in Finder", + "revealWindows": "Tonen in Verkenner", + "revealLinux": "Tonen in map", + "rename": "Hernoemen", + "update": "Bijwerken vanuit huidig project", + "useForNewProjects": "Gebruiken voor nieuwe projecten", + "stopForNewProjects": "Niet meer gebruiken voor nieuwe projecten", + "newProjectsBadge": "Nieuwe projecten", + "delete": "Verwijderen", + "confirmDelete": "“{{name}}” verwijderen?", + "applied": "“{{name}}” toegepast", + "saved": "Preset opgeslagen", + "updated": "Preset bijgewerkt", + "nameRequired": "Voer een naam in", + "nameTaken": "Er bestaat al een preset met deze naam", + "loadFailed": "Kon de presets niet laden", + "saveFailed": "Kon de preset niet opslaan: {{error}}" + }, + "transcript": { + "laneRecording": "Opname", + "noTranscript": "Nog geen transcriptie", + "title": "Transcriptie", + "restoreWord": "“{{word}}” herstellen", + "revertWord": "“{{original}}” herstellen", + "editingHint": "Dubbelklik op een woord om het te corrigeren. Backspace knipt het uit de film.", + "restoreSilence": "Stilte herstellen ({{duration}}s)", + "help": "De transcriptie van elke clip op de timeline. Backspace / Delete op een woord of selectie knipt het uit de film (rood). Dubbelklik op een woord om de tekst te corrigeren. Beweeg over een gemarkeerd woord om het ongedaan te maken.", + "editWord": "“{{word}}” bewerken", + "laneFeedsCaptions": "Ondertitels worden uit dit spoor ingebrand.", + "insertedWord": "Door jou toegevoegd. Hiervoor is er geen audio.", + "whisperHint": "Transcriberen gebruikt lokale Whisper. Het draait op je computer, er verlaten geen gegevens het toestel.", + "insertAria": "Nieuw woord", + "editorAria": "Transcriptie voor {{filename}}", + "transcribeNow": "Nu transcriberen", + "transcribing": "Transcriberen…", + "trimSilence": "Stilte inkorten ({{duration}}s)", + "removeInserted": "“{{word}}” verwijderen", + "laneLabel": "Transcriptie lezen uit", + "noClips": "Nog geen clips", + "laneVoiceover": "Voice-over", + "silence": "[stilte {{duration}}s]", + "clipLabel": "Clip {{index}}", + "correctedWord": "Gecorrigeerd. De transcriptietool hoorde “{{original}}”.", + "noClipTranscript": "Geen transcriptie voor deze clip. Open de itemkaart en genereer opnieuw.", + "editingHintDev": "Dubbelklik op een woord om het te corrigeren. Backspace knipt het uit de film. Typ tussen twee woorden om er een toe te voegen.", + "noAudio": "Deze media heeft geen audiospoor", + "blankedWord": "weggelaten" + }, + "exportFormat": { + "mp4": "MP4", + "mp4Description": "Videobestand van hoge kwaliteit", + "gifAnimation": "GIF-animatie", + "mp4Video": "MP4-video", + "gifDescription": "Geanimeerde afbeelding om te delen", + "gif": "GIF" + }, + "captions": { + "showBackground": "Achtergrond tonen", + "deleteTranslation": "Deze vertaling verwijderen", + "legacyAnnotations": "Dit project bevat nog ondertitelannotaties van de oude ondertitelfunctie ({{count}}). Ze worden boven op de ondertitellaag weergegeven.", + "backgroundOpacity": "Dekking", + "backgroundColor": "Achtergrondkleur", + "translationIsNonDestructive": "Vertalingen worden naast de transcriptie bewaard, nooit erin. De oorspronkelijke tekst en timing blijven onaangetast.", + "distanceFromRight": "Afstand tot rechts", + "language": "Taal", + "text": "Tekst", + "distanceFromTop": "Afstand tot boven", + "translateFailed": "Vertalen mislukt.", + "distanceFromBottom": "Afstand tot onder", + "derivedFromTranscript": "{{count}} ondertitelregels, live afgeleid uit de transcriptie.", + "translate": "Vertalen", + "position": "Positie", + "fontSize": "Grootte", + "hiddenHint": "Ondertitels komen uit de transcriptie van deze media. Schakel ze in om ze te zien in het voorbeeld en in exports.", + "noTranscript": "Ondertitels worden gelezen uit de transcriptie van de media. Transcribeer deze video om ze in te schakelen.", + "distanceFromLeft": "Afstand tot links", + "transcribe": "Video transcriberen", + "bold": "Vet", + "minWords": "Min. woorden per regel", + "translateHint": "Vertaal de transcriptie met de geconfigureerde AI-provider", + "displayLanguage": "Weergave", + "removeLegacyAnnotations": "Oude ondertitelannotaties verwijderen", + "background": "Achtergrond", + "lineLength": "Regellengte", + "original": "Origineel (transcriptie)", + "maxWords": "Max. woorden per regel", + "font": "Lettertype", + "translating": "Vertalen…", + "show": "Ondertitels tonen", + "textColor": "Tekstkleur", + "style": "Stijl", + "styles": { + "classic": "Klassiek", + "bold": "Vet", + "minimal": "Minimaal", + "light": "Licht" + }, + "customize": "Aanpassen" + }, + "panes": { + "help": "Help" + }, + "speed": { + "deleteRegion": "Snelheidsgedeelte verwijderen", + "maxSpeedError": "Snelheid kan niet hoger dan {{max}}×", + "selectRegion": "Selecteer een snelheidsgedeelte om aan te passen", + "playbackSpeed": "Afspeelsnelheid", + "customPlaybackSpeed": "Aangepaste snelheid", + "previewFrameSteppingHint": "Boven {{native}}× wordt het voorbeeld frame voor frame getoond en gedempt. De export wordt niet beïnvloed." + }, + "gifSettings": { + "frameRate": "GIF-framerate", + "loop": "GIF herhalen", + "size": "GIF-grootte" + }, + "exportQuality": { + "title": "Exportresolutie", + "low": "720p", + "high": "Bron", + "medium": "1080p" + }, + "audioTrack": { + "defaultLabel": "Audiospoor", + "importFailed": "Kon de audio niet toevoegen", + "fadeOut": "Uitfaden", + "fadeIn": "Infaden", + "remove": "Spoor verwijderen", + "loop": "Herhalen", + "slipHint": "Houd {{modifier}} ingedrukt en sleep om de audio binnen het spoor te verschuiven", + "help": "Volume, fades en herhaling voor dit audiospoor. Het wordt in het voorbeeld en in de export over de opname gemixt. Een muziekspoor wordt vanzelf zachter terwijl iemand spreekt. Sleep het spoor op de timeline om het te verplaatsen of van grootte te wijzigen, of houd Alt ingedrukt en sleep om de audio erbinnen te verschuiven.", + "add": "Audiospoor toevoegen", + "mute": "Dempen" + }, + "layout": { + "help": "Hoe de webcam met het scherm wordt samengesteld: beeld-in-beeld, verticale stapel, dubbel frame, vorm, afronding, grootte, positie en spiegelen.", + "mirrorWebcam": "Webcam spiegelen", + "webcamFraming": "Webcam bijsnijden", + "webcamFramingDrag": "Sleep het kader om het te verplaatsen, of een hoek om te zoomen.", + "shapes": { + "square": "Vierkant", + "original": "Origineel" + }, + "webcamPosition": "Positie", + "anchors": { + "topLeft": "Linksboven", + "top": "Boven", + "topRight": "Rechtsboven", + "left": "Links", + "right": "Rechts", + "bottomLeft": "Linksonder", + "bottom": "Onder", + "bottomRight": "Rechtsonder" + }, + "selectPreset": "Preset kiezen", + "bgModes": { + "custom": "Aangepast", + "none": "Origineel", + "blur": "Blur", + "transparent": "Uitsnede" + }, + "webcamBlurIntensity": "Blur-intensiteit", + "preset": "Preset", + "webcamSize": "Webcamgrootte", + "dualFrame": "Dubbel frame", + "verticalStack": "Verticale stapel", + "pictureInPicture": "Beeld-in-beeld", + "webcamShape": "Camervorm", + "reactiveWebcam": "Verkleinen bij zoom", + "reactiveWebcamTip": "De camera wordt kleiner terwijl de video is ingezoomd", + "webcamBackground": "Camera-achtergrond", + "helpNoWebcam": "Dit project heeft geen camera, dus de lay-outbediening staat uit en de preset toont “Geen webcam”. Je opgeslagen lay-out blijft bewaard voor als er een camera wordt toegevoegd.", + "title": "Cameralay-out", + "noWebcam": "Geen webcam" + }, + "textAnimation": { + "slideLeft": "Naar links schuiven", + "pulse": "Pulseren", + "typewriter": "Typemachine", + "selectAnimation": "Animatie kiezen", + "fade": "Vervagen", + "title": "Tekstanimatie", + "none": "Geen", + "pop": "Pop", + "rise": "Opstijgen" + }, + "facets": { + "transcript": "Transcriptie", + "captions": "Ondertitels", + "tips": { + "effects": "Compositie: achtergrond, frame, schaduw en marge", + "layout": "Cameralay-out: positie, vorm en grootte van de camera", + "audio": "Audio: uitvoerniveau van de hele video", + "cursor": "Cursor: stijl, grootte en effecten", + "transcript": "Transcriptie: bewerk de woorden om de video te knippen" + } + }, + "crop": { + "title": "Bijsnijden", + "free": "Vrij", + "unlockAspectRatio": "Beeldverhouding ontgrendelen", + "dragInstruction": "Sleep aan elke zijde om het bijsnijdgebied aan te passen", + "done": "Klaar", + "ratio": "Verhouding", + "cropVideo": "Video bijsnijden", + "lockAspectRatio": "Beeldverhouding vergrendelen" + }, + "zoom": { + "position": { + "y": "Y (%)", + "hint": "0 = uiterst links / bovenaan, 100 = uiterst rechts / onderaan", + "title": "Focuspositie", + "x": "X (%)" + }, + "deleteZoom": "Zoom verwijderen", + "focusMode": { + "lockedDisclaimer": "Ingesteld met de knop Auto-Focus in de timeline. Zet die uit om de focusmodus van elke zoom te kiezen.", + "auto": "Auto", + "manual": "Handmatig", + "title": "Focusmodus" + }, + "camera": { + "title": "3D-camera", + "off": "Uit", + "preset": { + "left": "Scherm naar links gedraaid", + "right": "Scherm naar rechts gedraaid", + "orbit": "3D Orbit" + } + }, + "level": "Zoomniveau", + "customScale": "Aangepaste zoom", + "customScaleRange": "Zoom loopt van {{min}}× tot {{max}}×", + "selectRegion": "Selecteer een zoomgedeelte om aan te passen", + "cursor": { + "title": "Cursor", + "show": "Zichtbaar", + "hide": "Verborgen" + } + }, + "audio": { + "outputGain": "Uitvoerniveau", + "help": "Stemmen worden automatisch op een standaardvolume gebracht. Pas vanaf daar het uitvoerniveau aan. Het geldt identiek in het voorbeeld en in de export.", + "reset": "Audio herstellen", + "title": "Audio" + }, + "language": { + "title": "Taal" + }, + "project": { + "new": "Nieuw project", + "load": "Project laden", + "save": "Project opslaan" + }, + "support": { + "starOnGithub": "Ster geven op GitHub", + "saveDiagnostics": "Diagnostiek opslaan", + "reportBug": "Bug melden" + }, + "cursor": { + "smoothing": "Afvlakking", + "clickBounce": "Klik-bounce", + "model3d": "3D-cursor", + "model3dTip": "Tekent de standaardcursor als 3D-object met een schaduw", + "clickImpact": "Klikimpact", + "clickImpactTip": "Het scherm beweegt een beetje bij elke klik", + "clickSound": "Muisklikken", + "clickSoundTip": "Elke klik klinkt, in het voorbeeld en in de export", + "clickSoundVolume": "Klikvolume", + "help": "Hoe de opgenomen cursor wordt getekend: stijl, grootte, afvlakking, bewegingsonscherpte en klik-bounce.", + "size": "Grootte", + "title": "Cursor", + "show": "Cursor tonen", + "themeDefault": "Standaard", + "types": "Cursortypen", + "typeArrow": "Pijl", + "typePointer": "Hand", + "typeText": "Tekst", + "typeGrab": "Grijpen", + "typeResize": "Formaat wijzigen", + "typeBusy": "Bezig", + "typeCrosshair": "Draadkruis", + "typeNotAllowed": "Niet toegestaan", + "typeHelp": "Help", + "typeUpArrow": "Alternatieve selectie", + "typeAsArrow": "{{type}}: vervangen door de pijl", + "motionBlur": "Bewegingsonscherpte", + "theme": "Cursorstijl", + "autoHide": "Automatisch verbergen bij inactiviteit", + "autoHideTip": "De cursor vervaagt wanneer hij stopt met bewegen", + "bounceNone": "Geen", + "bounceLight": "Licht", + "bounceStrong": "Sterk" + }, + "export": { + "gifButton": "GIF exporteren", + "chooseSaveLocation": "Opslaglocatie kiezen", + "videoButton": "Video exporteren" + }, + "trim": { + "deleteRegion": "Trimgedeelte verwijderen" + }, + "textPlate": { + "none": "Geen", + "dark": "Donker", + "light": "Licht", + "custom": "Aangepast" + } +} diff --git a/src/i18n/locales/nl/shortcuts.json b/src/i18n/locales/nl/shortcuts.json new file mode 100644 index 0000000000..0d7253cbe6 --- /dev/null +++ b/src/i18n/locales/nl/shortcuts.json @@ -0,0 +1,43 @@ +{ + "title": "Sneltoetsen", + "customize": "Aanpassen", + "configurable": "Instelbaar", + "fixed": "Vast", + "pressKey": "Druk op een toets…", + "clickToChange": "Klik om te wijzigen", + "pressEscToCancel": "Druk op Esc om te annuleren", + "helpText": "Klik op een sneltoets en druk daarna op de nieuwe toetscombinatie. Druk op Esc om te annuleren.", + "resetToDefaults": "Standaardwaarden herstellen", + "alreadyUsedBy": "Al in gebruik door {{action}}", + "swap": "Wisselen", + "reservedShortcut": "Deze sneltoets is gereserveerd voor “{{label}}” en kan niet opnieuw worden toegewezen.", + "savedToast": "Sneltoetsen opgeslagen", + "resetToast": "Standaardsneltoetsen hersteld. Klik op Opslaan om toe te passen", + "registrationFailed": "Sneltoets registreren is mislukt. Mogelijk gebruikt een andere app hem al. Probeer een andere toets.", + "actions": { + "openApp": "App openen", + "addZoom": "Zoom toevoegen", + "addTrim": "Trim toevoegen", + "addSpeed": "Snelheid toevoegen", + "addAnnotation": "Annotatie toevoegen", + "addAudio": "Audio toevoegen", + "addVoiceover": "Voice-over opnemen", + "addKeyframe": "Keyframe toevoegen", + "addCameraFullscreen": "Full Camera toevoegen", + "deleteSelected": "Selectie verwijderen", + "playPause": "Afspelen / Pauzeren", + "copySelected": "Selectie kopiëren", + "paste": "Plakken" + }, + "fixedActions": { + "undo": "Ongedaan maken", + "redo": "Opnieuw uitvoeren", + "cycleAnnotationsForward": "Annotaties vooruit doorlopen", + "cycleAnnotationsBackward": "Annotaties achteruit doorlopen", + "deleteSelectedAlt": "Selectie verwijderen (alt)", + "panTimeline": "Timeline verschuiven", + "zoomTimeline": "Timeline zoomen", + "frameBack": "Frame terug", + "frameForward": "Frame vooruit" + } +} diff --git a/src/i18n/locales/nl/timeline.json b/src/i18n/locales/nl/timeline.json new file mode 100644 index 0000000000..13b6a9dae3 --- /dev/null +++ b/src/i18n/locales/nl/timeline.json @@ -0,0 +1,120 @@ +{ + "buttons": { + "addZoom": "Zoom toevoegen op het huidige tijdstip", + "autoFocusAll": "Auto-Focus voor alle zooms", + "autoFocusAllTip": "Alle zooms volgen de cursor. Uit: je kiest zelf de focus van elke zoom.", + "clearTimeline": "Alle zooms, trims, snelheden, annotaties en Full Camera verwijderen. Clips, audio en ondertitels blijven staan.", + "addTrim": "Trim toevoegen: verwijdert een deel van de video op het huidige tijdstip", + "addAnnotation": "Tekst, pijl, afbeelding of blur toevoegen op het huidige tijdstip", + "addSpeed": "Snelheidswijziging toevoegen op het huidige tijdstip", + "addCameraFullscreen": "Full Camera toevoegen: toont de camera op volledig scherm op het huidige tijdstip" + }, + "hints": { + "pressZoom": "Druk op {{key}} om zoom toe te voegen", + "pressTrim": "Druk op {{key}} om trim toe te voegen", + "pressAnnotation": "Druk op {{key}} om een annotatie toe te voegen", + "pressAudio": "Druk op {{audioKey}} om audio toe te voegen, op {{voiceoverKey}} om een voice-over op te nemen", + "pressSpeed": "Druk op {{key}} om snelheid toe te voegen", + "pressCameraFullscreen": "Druk op {{key}} om een Full Camera-segment toe te voegen" + }, + "labels": { + "pan": "Pan", + "panTip": "De timeline scrollen", + "zoom": "Zoom", + "zoomTip": "De timeline zoomen", + "trim": "Trim", + "speed": "Snelheid", + "zoomItem": "Zoom {{index}}", + "trimItem": "Trim {{index}}", + "speedItem": "Snelheid {{index}}", + "annotationItem": "Annotatie", + "imageItem": "Afbeelding", + "emptyText": "Lege tekst", + "cameraFullscreen": "Full Camera", + "cameraFullscreenItem": "Full Camera {{index}}" + }, + "trails": { + "zoomIn": "Inzoomen: het beeld beweegt naar binnen tot de zoom begint", + "zoomOut": "Uitzoomen: het beeld beweegt terug naar buiten nadat de zoom is afgelopen", + "zoomInCut": "Een trim verwijdert {{seconds}} s van het inzoomen. De export springt op de snede.", + "zoomOutCut": "Een trim verwijdert {{seconds}} s van het uitzoomen. De export springt op de snede.", + "zoomInJunction": "Een clipovergang verwijdert {{seconds}} s van het inzoomen. De export springt op de overgang.", + "zoomOutJunction": "Een clipovergang verwijdert {{seconds}} s van het uitzoomen. De export springt op de overgang.", + "pan": "Pan: het beeld beweegt rechtstreeks naar de volgende zoom" + }, + "emptyState": { + "noVideo": "Geen video geladen", + "dragAndDrop": "Sleep een video hierheen om te beginnen met bewerken" + }, + "errors": { + "cannotPlaceZoom": "Zoom kan hier niet worden geplaatst", + "zoomExistsAtLocation": "Er bestaat al een zoom op deze plek of er is onvoldoende ruimte.", + "zoomSuggestionUnavailable": "Zoomsuggestie-handler niet beschikbaar", + "noCursorTelemetry": "Geen cursorgegevens in deze opname", + "noCursorTelemetryDescription": "Neem je scherm op met OpenScreen om zooms te krijgen die de cursor volgen.", + "noUsableTelemetry": "Onvoldoende cursorbeweging", + "noUsableTelemetryDescription": "De opname bevat onvoldoende gegevens over cursorbeweging.", + "noDwellMoments": "Geen duidelijke momenten gevonden waarop de cursor stilstaat", + "noDwellMomentsDescription": "Probeer een opname met langzamere cursorpauzes bij belangrijke acties.", + "noAutoZoomSlots": "Geen ruimte voor automatische zooms", + "noAutoZoomSlotsDescription": "Op de gevonden momenten staan al zooms.", + "cannotPlaceTrim": "Trim kan hier niet worden geplaatst", + "trimExistsAtLocation": "Er bestaat al een trim op deze plek of er is onvoldoende ruimte.", + "cannotPlaceSpeed": "Snelheid kan hier niet worden geplaatst", + "speedExistsAtLocation": "Er bestaat al een snelheidsgedeelte op deze plek of er is onvoldoende ruimte.", + "cannotPlaceCameraFullscreen": "Full Camera kan hier niet worden geplaatst", + "cameraFullscreenExistsAtLocation": "Er bestaat al een Full Camera-segment op deze plek of er is onvoldoende ruimte." + }, + "success": { + "addedZoomSuggestions": "{{count}} op de cursor gebaseerde zoomsuggestie toegevoegd", + "addedZoomSuggestionsPlural": "{{count}} op de cursor gebaseerde zoomsuggesties toegevoegd" + }, + "toolbar": { + "autoEnhance": "Automatisch verbeteren", + "automaticZooms": "Automatische zooms", + "automaticZoomsHint": "Op basis van opgenomen klikken", + "smartZoomsAndCuts": "Slim knippen", + "smartZoomsAndCutsHint": "Met AI", + "timelineTools": "Timeline-tools", + "arrangeClips": "Clips ordenen", + "arrangeClipsHint": "Sleep clips hieronder om ze te herordenen of voeg nieuwe toe", + "newAnnotation": "Annotatie", + "dragToReorderHint": "Sleep om te herordenen. Dubbelklik om het begin en einde te wijzigen.", + "editInOutPoints": "Begin en einde bewerken", + "deleteClip": "Clip verwijderen", + "dropToAdd": "Loslaten om aan de timeline toe te voegen", + "importRecordingFirst": "Importeer eerst een opname", + "noAutoZoomMoments": "Geen momenten voor automatische zoom gevonden", + "noAutoZoomMomentsDescription": "Deze opname bevat geen opgenomen klikken, of geen klikken met ruimte voor een zoom.", + "addedAutoZoom": "{{count}} automatische zoom toegevoegd", + "addedAutoZoomPlural": "{{count}} automatische zooms toegevoegd", + "autoZoomFailed": "Automatische zoom mislukt", + "aiEnhanceRequested": "De AI-agent gevraagd om de dode tijd weg te knippen", + "smartCutsWaiting": "Transcriberen… zo meteen klaar", + "smartCutsNeedsTranscript": "Transcriptie nodig", + "smartCutsNoAudio": "Deze media bevat geen audio", + "smartCutsNoSpeech": "Geen spraak gedetecteerd", + "smartCutsFailed": "Transcriptie mislukt. Probeer opnieuw via Media", + "addAudioTooltip": "Audio toevoegen", + "addedWord": "Woord toegevoegd: “{{word}}”. Er zit geen audio achter" + }, + "audio": { + "addVoiceover": "Voice-over toevoegen", + "addVoiceoverHint": "Neem een verteltekst op over je video", + "subtitle": "Plaats een voice-over of achtergrondmuziek op de timeline", + "record": "Voice-over opnemen", + "importFile": "Audiobestand importeren", + "importFileHint": "Voeg muziek of een audiobestand toe", + "recording": "Opnemen", + "recordingHint": "Vertel mee met de video. Die speelt af terwijl je opneemt", + "stop": "Stoppen", + "micDenied": "Toegang tot de microfoon is geweigerd", + "recordingUnavailable": "Opnemen is hier niet beschikbaar", + "saveFailed": "Kon de opname niet opslaan", + "importFailed": "Kon het audiobestand niet importeren" + }, + "tracks": { + "annotation": "Annotatielaag {{index}}", + "dragHint": "Sleep naar links of rechts om in de tijd te verplaatsen. Sleep omhoog of omlaag om van laag te wisselen. Hogere lagen verschijnen bovenaan." + } +}