From be2961a48726da058f506c52b0732778b1934590 Mon Sep 17 00:00:00 2001 From: Mariusz Jamro Date: Tue, 3 Nov 2026 12:53:50 +0100 Subject: [PATCH] feat(i18n): add Polish (pl) 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/pl/common.json | 76 +++ src/i18n/locales/pl/dialogs.json | 97 ++++ src/i18n/locales/pl/editor.json | 453 +++++++++++++++++ src/i18n/locales/pl/launch.json | 157 ++++++ src/i18n/locales/pl/settings.json | 457 ++++++++++++++++++ src/i18n/locales/pl/shortcuts.json | 43 ++ src/i18n/locales/pl/timeline.json | 135 ++++++ 13 files changed, 1431 insertions(+), 3 deletions(-) create mode 100644 src/i18n/locales/pl/common.json create mode 100644 src/i18n/locales/pl/dialogs.json create mode 100644 src/i18n/locales/pl/editor.json create mode 100644 src/i18n/locales/pl/launch.json create mode 100644 src/i18n/locales/pl/settings.json create mode 100644 src/i18n/locales/pl/shortcuts.json create mode 100644 src/i18n/locales/pl/timeline.json diff --git a/AGENTS.md b/AGENTS.md index 2a8faf3405..3b1dacb679 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 all the 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. @@ -180,7 +180,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..2a6b2ed213 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, Polish, 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 9b17919ccb..de53188065 100644 --- a/electron-builder.json5 +++ b/electron-builder.json5 @@ -76,6 +76,7 @@ "it", "ja", "ko", + "pl", "pt-BR", "pt_BR", "ru", @@ -478,6 +479,7 @@ "it", "ja-JP", "ko-KR", + "pl", "pt-BR", "ru", "tr", diff --git a/electron/i18n.ts b/electron/i18n.ts index 8c8d55bff8..c44db19167 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 commonPl from "../src/i18n/locales/pl/common.json"; +import dialogsPl from "../src/i18n/locales/pl/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" + | "pl" | "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 }, + pl: { common: commonPl, dialogs: dialogsPl }, "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 === "pl" || 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..f260b3f346 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 plDialogs from "@/i18n/locales/pl/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, + pl: plDialogs, ru: ruDialogs, tr: trDialogs, vi: viDialogs, diff --git a/src/i18n/config.ts b/src/i18n/config.ts index b11ec67932..b6450853c6 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -9,6 +9,7 @@ export const SUPPORTED_LOCALES = [ "it", "ja-JP", "ko-KR", + "pl", "ru", "tr", "vi", diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json new file mode 100644 index 0000000000..7e7ba4b178 --- /dev/null +++ b/src/i18n/locales/pl/common.json @@ -0,0 +1,76 @@ +{ + "actions": { + "cancel": "Anuluj", + "save": "Zapisz", + "delete": "Usuń", + "close": "Zamknij", + "resetToDefault": "Przywróć domyślne", + "share": "Wybierz", + "done": "Gotowe", + "open": "Otwórz", + "checkForUpdates": "Sprawdź aktualizacje", + "update": "Aktualizuj", + "updateTo": "Zaktualizuj do {{version}}", + "usagePing": "Wyślij anonimową liczbę użyć", + "viewRelease": "Zobacz wydanie", + "downloadUpdate": "Pobierz aktualizację", + "restartNow": "Uruchom ponownie teraz", + "upload": "Prześlij", + "export": "Eksportuj", + "showInFolder": "Pokaż w folderze", + "file": "Plik", + "edit": "Edycja", + "view": "Widok", + "window": "Okno", + "help": "Pomoc", + "quit": "Zakończ", + "stopRecording": "Zatrzymaj nagrywanie", + "undo": "Cofnij", + "redo": "Ponów", + "cut": "Wytnij", + "copy": "Kopiuj", + "paste": "Wklej", + "selectAll": "Zaznacz wszystko", + "minimize": "Minimalizuj", + "reload": "Przeładuj", + "forceReload": "Wymuś przeładowanie", + "toggleDevTools": "Przełącz narzędzia deweloperskie", + "actualSize": "Rzeczywisty rozmiar", + "zoomIn": "Powiększ", + "zoomOut": "Pomniejsz", + "toggleFullScreen": "Przełącz pełny ekran", + "recordingStatus": "Nagrywanie: {{source}}", + "about": "O programie OpenScreen", + "services": "Usługi", + "hide": "Ukryj OpenScreen", + "hideOthers": "Ukryj inne", + "unhide": "Pokaż wszystko", + "saveDiagnostics": "Zapisz diagnostykę", + "starOnGithub": "Oznacz gwiazdką na GitHubie", + "permissions": "Uprawnienia…", + "closeNotification": "Zamknij powiadomienie" + }, + "updates": { + "available": "Dostępna jest wersja OpenScreen {{latestVersion}}. Używasz wersji {{currentVersion}}.", + "current": "OpenScreen jest aktualny ({{currentVersion}}).", + "readyToInstall": "Pobrano OpenScreen {{latestVersion}}. Uruchom ponownie, aby dokończyć instalację.", + "blockedRecording": "Zakończ nagrywanie przed instalacją aktualizacji.", + "blockedLocation": "Przenieś OpenScreen do folderu Aplikacje przed aktualizacją.", + "failed": "Nie udało się sprawdzić aktualizacji.", + "downloadFailed": "Nie udało się pobrać aktualizacji." + }, + "units": { + "pixelsPerSecond": "{{value}} px/s", + "pixels": "{{value}} px" + }, + "locale": { + "name": "Polski", + "short": "PL" + }, + "recordingSource": { + "window": "Okno", + "screen": "Ekran", + "virtual": "Wirtualny ekran", + "unknown": "Nagrywanie ekranu" + } +} diff --git a/src/i18n/locales/pl/dialogs.json b/src/i18n/locales/pl/dialogs.json new file mode 100644 index 0000000000..1426db5795 --- /dev/null +++ b/src/i18n/locales/pl/dialogs.json @@ -0,0 +1,97 @@ +{ + "export": { + "complete": "Eksport zakończony", + "yourFormatReady": "Twój plik {{format}} jest gotowy", + "showInFolder": "Pokaż w folderze", + "finalizingVideo": "Finalizowanie eksportu wideo...", + "compilingGifProgress": "Tworzenie GIF-a... {{progress}}%", + "compilingGifWait": "Tworzenie GIF-a... może to chwilę potrwać", + "takeMoment": "To może chwilę potrwać...", + "failed": "Eksport nie powiódł się", + "tryAgain": "Spróbuj ponownie", + "finalizingVideoTitle": "Finalizowanie wideo", + "compilingGif": "Tworzenie GIF-a", + "exportingFormat": "Eksportowanie: {{format}}", + "compiling": "Tworzenie", + "renderingFrames": "Renderowanie klatek", + "processing": "Przetwarzanie...", + "finalizing": "Finalizowanie...", + "compilingStatus": "Tworzenie...", + "status": "Stan", + "format": "Format", + "frames": "Klatki", + "cancelExport": "Anuluj eksport", + "savedSuccessfully": "Zapisano plik {{format}}!" + }, + "tutorial": { + "triggerLabel": "Jak działa przycinanie", + "title": "Jak działa przycinanie", + "description": "Jak wycinać niechciane fragmenty wideo.", + "explanationBefore": "Narzędzie Przycinanie działa tak, że zaznaczasz fragmenty, które chcesz", + "remove": "usunąć", + "explanationMiddle": " — wszystko", + "covered": "objęte", + "explanationAfter": "czerwonym fragmentem przycięcia zostanie wycięte podczas eksportu.", + "visualExample": "Przykład wizualny", + "removed": "USUNIĘTE", + "kept": "Zachowane", + "part1": "Część 1", + "part2": "Część 2", + "part3": "Część 3", + "finalVideo": "Gotowe wideo", + "step1Title": "1. Dodaj przycięcie", + "step1DescriptionBefore": "Naciśnij ", + "step1DescriptionAfter": " lub kliknij ikonę nożyczek, aby oznaczyć fragment do usunięcia.", + "step2Title": "2. Dopasuj", + "step2Description": "Przeciągnij krawędzie czerwonego obszaru, aby objąć dokładnie to, co chcesz wyciąć." + }, + "unsavedChanges": { + "title": "Niezapisane zmiany", + "message": "Masz niezapisane zmiany.", + "detail": "Czy chcesz zapisać projekt przed zamknięciem?", + "saveAndClose": "Zapisz i zamknij", + "discardAndClose": "Odrzuć i zamknij", + "detailNewProject": "Czy chcesz zapisać projekt przed utworzeniem nowego?", + "saveAndNewProject": "Zapisz i utwórz nowy projekt", + "discardAndNewProject": "Odrzuć i utwórz nowy projekt", + "detailLoadProject": "Czy chcesz zapisać projekt przed wczytaniem innego?", + "saveAndLoadProject": "Zapisz i wczytaj projekt", + "discardAndLoadProject": "Odrzuć i wczytaj projekt", + "newProject": "Nowy projekt", + "importVideo": "Importuj plik wideo…", + "loadProject": "Wczytaj projekt…", + "saveProject": "Zapisz projekt…", + "saveProjectAs": "Zapisz projekt jako…", + "modal": { + "closeTitle": "Zapisać zmiany przed zamknięciem?", + "closeBody": "Twój projekt ma niezapisane zmiany. Zapisz je teraz, odrzuć lub pozostań w edytorze.", + "newTitle": "Zapisać zmiany przed utworzeniem nowego projektu?", + "openTitle": "Zapisać zmiany przed otwarciem innego projektu?", + "recordTitle": "Zapisać zmiany przed rozpoczęciem nowego nagrania?", + "sharedBody": "Bieżący projekt ma niezapisane zmiany. Zapisz je, odrzuć lub anuluj.", + "notSavedYet": "Bieżący projekt nie został jeszcze zapisany na dysku.", + "discard": "Odrzuć", + "saveAndContinue": "Zapisz i kontynuuj", + "saving": "Zapisywanie…" + } + }, + "fileDialogs": { + "saveGif": "Zapisz wyeksportowany GIF", + "saveVideo": "Zapisz wyeksportowane wideo", + "selectVideo": "Wybierz plik wideo", + "selectAudio": "Wybierz plik audio", + "saveProject": "Zapisz projekt OpenScreen", + "openProject": "Otwórz projekt OpenScreen", + "gifImage": "Obraz GIF", + "mp4Video": "Wideo MP4", + "videoFiles": "Pliki wideo", + "audioFiles": "Pliki audio", + "openscreenProject": "Projekt OpenScreen", + "allFiles": "Wszystkie pliki", + "selectRecordingsFolder": "Wybierz folder nagrań" + }, + "recording": { + "lowDiskSpace": "Za mało miejsca na dysku, aby rozpocząć nagrywanie (wolne tylko {{availableMb}} MB). Zwolnij miejsce lub wybierz inny folder nagrań, a następnie spróbuj ponownie.", + "folderUnavailable": "Nie można połączyć się z folderem nagrań {{path}}. Podłącz ponownie jego dysk lub wybierz inny folder w trybie Nagrywanie." + } +} diff --git a/src/i18n/locales/pl/editor.json b/src/i18n/locales/pl/editor.json new file mode 100644 index 0000000000..f885eb7ada --- /dev/null +++ b/src/i18n/locales/pl/editor.json @@ -0,0 +1,453 @@ +{ + "newRecording": { + "title": "Wróć do nagrywarki", + "description": "Twoja bieżąca sesja została zapisana.", + "cancel": "Anuluj", + "confirm": "Potwierdź" + }, + "loadingVideo": "Wczytywanie wideo...", + "loadingEditor": "Wczytywanie edytora...", + "errors": { + "exportBackgroundLoadFailed": "Eksport nie powiódł się: nie można wczytać obrazu tła ({{url}})", + "exportFailed": "Eksport nie powiódł się", + "exportFailedWithError": "Eksport nie powiódł się: {{error}}", + "failedToRevealInFolder": "Błąd podczas pokazywania w folderze: {{error}}", + "failedToSaveExport": "Nie udało się zapisać eksportu", + "failedToSaveExportedVideo": "Nie udało się zapisać wyeksportowanego wideo", + "failedToSaveGif": "Nie udało się zapisać GIF-a", + "failedToSaveVideo": "Nie udało się zapisać wideo", + "gifExportFailed": "Eksport GIF-a nie powiódł się", + "noVideoLoaded": "Nie wczytano wideo", + "previewCompositorUnavailable": "Podgląd niedostępny na tym komputerze", + "trimNoFilm": "Nie ma tu czego wyciąć — pod tymi słowami nie ma nagrania.", + "unableToDetermineSourcePath": "Nie można ustalić ścieżki źródłowego wideo", + "videoNotReady": "Wideo nie jest gotowe", + "wordEditFailed": "Nie udało się zmienić tego słowa", + "wordInsertFailed": "Nie udało się dodać tego słowa", + "wordRemoveFailed": "Nie udało się usunąć tego słowa" + }, + "export": { + "canceled": "Anulowano eksport", + "exportedSuccessfully": "Pomyślnie wyeksportowano: {{format}}" + }, + "project": { + "saveCanceled": "Anulowano zapisywanie projektu", + "failedToSave": "Nie udało się zapisać projektu", + "savedTo": "Projekt zapisano w {{path}}", + "failedToLoad": "Nie udało się wczytać projektu", + "invalidFormat": "Nieprawidłowy format pliku projektu", + "loadedFrom": "Projekt wczytano z {{path}}" + }, + "recording": { + "failedCameraAccess": "Nie udało się uzyskać dostępu do kamery.", + "cameraBlocked": "Dostęp do kamery jest zablokowany. Włącz go w ustawieniach systemu, aby korzystać z kamery internetowej.", + "systemAudioUnavailable": "Dźwięk systemowy jest niedostępny. Nagrywanie bez dźwięku systemowego.", + "microphoneDenied": "Odmówiono dostępu do mikrofonu. Nagrywanie będzie kontynuowane bez dźwięku.", + "cameraDenied": "Odmówiono dostępu do kamery. Nagrywanie będzie kontynuowane bez kamery internetowej.", + "cameraDisconnected": "Kamera internetowa została odłączona.", + "cameraNotFound": "Nie znaleziono kamery.", + "cameraCaptureUnavailable": "Nie udało się otworzyć kamery. Nagrywanie bez niej.", + "microphoneDefaulted": "Nie udało się zidentyfikować wybranego mikrofonu. Nagrywanie domyślnego wejścia.", + "microphoneUnavailable": "Ta wersja macOS nie może nagrywać mikrofonu. Nagrywanie bez niego.", + "restartFailed": "Nie udało się rozpocząć nowego nagrania. Poprzednie zostało usunięte.", + "permissionDenied": "Odmówiono uprawnienia do nagrywania. Zezwól na nagrywanie ekranu.", + "accessibilityAllowAndRetry": "Zezwól OpenScreen na dostęp do Dostępności, a następnie ponownie naciśnij nagrywanie, aby uruchomić odliczanie.", + "cursorAccessibilityUnavailable": "Dostępność jest wyłączona. Nagrywanie będzie kontynuowane, ale efekty kursora mogą być ograniczone. Włącz ją w Ustawieniach systemowych, aby korzystać z pełnych efektów kursora.", + "selectSource": "Wybierz ekran lub okno do nagrania" + }, + "emptyState": { + "title": "Zacznij od nagrania", + "description": "Nagraj ekran lub zaimportuj wideo, aby rozpocząć edycję.", + "titleHasAsset": "Dodaj wideo, aby zacząć", + "descriptionHasAsset": "Zaimportuj nagranie, aby rozpocząć edycję.", + "recordButton": "Nagraj ekran", + "newProjectButton": "Importuj wideo", + "importVideoButton": "Importuj wideo", + "loadProjectButton": "Otwórz projekt", + "supportedFormats": "Obsługiwane formaty: MP4, MOV, WebM, MKV, AVI, M4V, WMV", + "dragDropHint": "lub upuść tutaj zapisany projekt", + "dropOverlay": "Upuść plik projektu, aby go otworzyć", + "dropErrors": { + "unsupportedFormatTitle": "Nieobsługiwany plik", + "unsupportedFormatMessage": "Tutaj można upuścić tylko zapisane projekty (.openscreen). Aby dodać wideo, użyj przycisku importu na tym ekranie.", + "couldNotOpenTitle": "Nie udało się otworzyć tego projektu", + "couldNotOpenMessage": "Nie udało się otworzyć pliku projektu. Wideo, do którego się odwołuje, mogło zostać przeniesione lub usunięte." + } + }, + "regionClipboard": { + "copied": "Skopiowano atrybuty: {{region}}", + "pasted": "Wklejono atrybuty: {{region}}", + "nothingToCopy": "Zaznacz obszar, aby skopiować jego atrybuty", + "nothingToPaste": "Nie skopiowano jeszcze żadnych atrybutów", + "pasteAssetMissing": "Pliku tej ścieżki dźwiękowej nie ma w tym projekcie", + "pasteEffectOverlap": "W tym miejscu już działa inny efekt: jeden efekt naraz", + "kinds": { + "zoom": "Powiększenie", + "speed": "Prędkość", + "annotation": "Tekst" + } + }, + "topbar": { + "toggleChatPanel": "Panel czatu", + "openProject": "Otwórz projekt", + "newProject": "Nowy projekt", + "saveProject": "Zapisz projekt", + "unsaved": "Niezapisane", + "saved": "Zapisane", + "switchToLightTheme": "Przełącz na jasny motyw", + "switchToDarkTheme": "Przełącz na ciemny motyw", + "toggleTheme": "Przełącz motyw", + "export": "Eksport", + "renameProject": "Zmień nazwę projektu", + "noProject": "Brak projektu", + "changeLanguage": "Zmień język", + "editorMode": "Tryb edytora", + "modes": { + "media": "Multimedia", + "edit": "Edycja", + "rec": "Nagrywanie" + } + }, + "rec": { + "source": "Źródło", + "selectSource": "Wybierz, co nagrać", + "systemPicker": "System zapyta, co udostępnić", + "systemAudio": "Dźwięk systemowy", + "systemAudioTip": "Nagrywa dźwięk odtwarzany przez komputer", + "microphone": "Mikrofon", + "camera": "Kamera", + "editableCursor": "Edytowalny kursor", + "editableCursorTip": "Włączone: edytowalny kursor z możliwością zmiany wyglądu i auto-powiększaniem. Wyłączone: kursor systemowy w wideo.", + "autoZoom": "Automatyczne powiększanie po nagraniu", + "hideDesktopIcons": "Ukryj ikony pulpitu", + "hideDesktopIconsHintMac": "Pomija ikony pulpitu w nagraniach ekranu. Pozostają na pulpicie.", + "hideDesktopIconsHintWindows": "Zasłania ikony pulpitu podczas nagrywania. Wracają po zatrzymaniu.", + "on": "Wł.", + "off": "Wył.", + "loading": "Wczytywanie…", + "noCameraFound": "Nie znaleziono kamery", + "cameraAccessError": "Nie udało się uzyskać dostępu do tej kamery", + "noMicrophoneFound": "Nie znaleziono mikrofonu", + "microphoneUnavailable": "Nie udało się uzyskać dostępu do mikrofonu", + "startingCamera": "Uruchamianie kamery…", + "turnOnCameraHint": "Włącz kamerę, aby zobaczyć podgląd na żywo", + "entireScreen": "Cały ekran", + "cancel": "Anuluj", + "startRecording": "Rozpocznij nagrywanie", + "startRecordingHint": "Otwiera pasek nagrywania i zamyka to okno edytora.", + "sourceModal": { + "screens": "Ekrany ({{count}})", + "windows": "Okna ({{count}})", + "loadingSources": "Wczytywanie ekranów i okien…", + "noScreensFound": "Nie znaleziono ekranów", + "noWindowsFound": "Nie znaleziono okien", + "cancel": "Anuluj" + }, + "recordingsFolder": "Folder nagrań", + "resetRecordingsFolder": "Przywróć domyślny", + "recordingsFolderFailed": "Nie udało się przełączyć na ten folder" + }, + "mediaStage": { + "openProjectFirst": "Najpierw otwórz projekt", + "couldNotAddAsset": "Nie udało się dodać zasobu", + "searchPlaceholder": "Szukaj w multimediach…", + "dragHint": "Przeciągnij klip na oś czasu poniżej, aby go dodać", + "emptyHint": "Brak multimediów — zaimportuj nagranie, aby zacząć.", + "importMedia": "Importuj multimedia", + "added": "Dodano {{label}}", + "addToTimeline": "Dodaj do osi czasu", + "addedToTimeline": "Dodano {{label}} do osi czasu", + "sourceTranscript": "Transkrypcja", + "close": "Zamknij", + "transcriptReady": "Transkrypcja gotowa", + "transcribing": "Transkrybowanie", + "downloadingModel": "Pobieranie modelu mowy", + "initializingModel": "Uruchamianie modelu mowy", + "pendingTranscription": "Oczekuje na transkrypcję", + "transcriptionFailed": "Transkrypcja nie powiodła się", + "cpuBackendHint": "Działa na procesorze: około 2× wolniej niż na karcie graficznej", + "noTranscript": "Brak transkrypcji", + "regenerateAs": "Wygeneruj ponownie jako", + "namesAndTerms": "Nazwy i terminy", + "auto": "Automatycznie", + "regenerate": "Wygeneruj ponownie", + "regenerateTip": "Wygeneruj ponownie: transkrybuj jeszcze raz w wybranym języku", + "transcriptEmpty": "Transkrypcja jest pusta.", + "notGeneratedHint": "Jeszcze nie wygenerowano — wybierz język i kliknij wygeneruj ponownie.", + "generationFailedHint": "Generowanie nie powiodło się — wybierz język i wygeneruj ponownie.", + "detectedLanguage": "Wykryty język: {{language}}", + "noAudioTrack": "Brak ścieżki dźwiękowej", + "noAudioTrackHint": "Te multimedia nie mają ścieżki dźwiękowej — nie ma czego transkrybować.", + "mediaUnreadableHint": "Nie udało się odczytać dźwięku z tych multimediów. Upewnij się, że OpenScreen ma dostęp do folderu, w którym się znajdują, a następnie wygeneruj ponownie.", + "noSpeechDetected": "Nie wykryto mowy" + }, + "exportDialog": { + "title": "Eksport", + "subtitle": "Zapisz edycję jako wideo lub GIF", + "addVideoBeforeExporting": "Przed eksportem dodaj wideo.", + "quality": "Jakość", + "qualityMatchRecording": "Jak w nagraniu", + "frameRate": "Liczba klatek na sekundę", + "size": "Rozmiar", + "loopGif": "Zapętl GIF", + "loopOn": "Zapętlenie włączone", + "loopOff": "Zapętlenie wyłączone", + "savedTo": "Zapisano w", + "exportFailedGeneric": "Eksport nie powiódł się.", + "writingFile": "Zapisywanie pliku…", + "renderingFrames": "Eksportowanie wideo", + "framesEta": "Klatka {{current}} z {{total}} · pozostało około {{eta}} s", + "preparingEncoder": "Przygotowywanie…", + "close": "Zamknij", + "cancel": "Anuluj", + "rendering": "Renderowanie…", + "saving": "Zapisywanie…", + "starting": "Uruchamianie…", + "exportGif": "Eksportuj GIF", + "exportMp4": "Eksportuj MP4", + "exportedGif": "Wyeksportowano GIF", + "exportedVideo": "Wyeksportowano wideo", + "exportedVideoOf": "wideo wyeksportowane w", + "showInFolder": "Pokaż w folderze", + "starPrompt": "OpenScreen jest darmowy i na licencji MIT. Gwiazdka na GitHubie pomaga innym go znaleźć.", + "starPromptNoThanks": "Nie, dziękuję", + "rateOnStore": "Oceń w Microsoft Store", + "exportFailed": "Eksport nie powiódł się", + "failedToWriteFile": "Nie udało się zapisać pliku", + "qualityUpscaleWarning": "Powiększenie", + "nothingToExport": "Nic do wyeksportowania — oś czasu jest pusta.", + "validationFailed": "Nie udało się zweryfikować wyeksportowanego wideo. Miejsce docelowe nie zostało zastąpione. Spróbuj ponownie wyeksportować.", + "noReadableFrames": "Nie wyeksportowano żadnych klatek wideo. Sprawdź, czy klipy zawierają czytelne wideo, zanim eksportujesz ponownie.", + "cameraEnded": "Nie można wyeksportować klipu {{clip}}: wideo z kamery kończy się przed rozpoczęciem tego klipu. Nagraj kamerę ponownie lub usuń jej ścieżkę przed eksportem.", + "cameraUnreadable": "Nie można wyeksportować klipu {{clip}}: wideo z kamery nie ma czytelnej klatki na początku klipu. Nagraj kamerę ponownie lub usuń jej ścieżkę przed eksportem.", + "screenUnreadable": "Nie można wyeksportować klipu {{clip}}: wideo ekranu nie może zostać odczytane na początku klipu. Sprawdź nagranie lub dostosuj klip przed ponownym eksportem." + }, + "inspector": { + "resetFocusPoint": "Resetuj punkt ostrości", + "setColor": "Ustaw kolor {{color}}", + "trimHiddenDuration": "{{duration}} s materiału źródłowego jest ukryte na edytowanej osi czasu.", + "restoreDeleteTrim": "Przywróć tę część", + "collapseInspector": "Zwiń inspektor", + "editClipTip": "Edytuj klip: kadrowanie, początek i koniec", + "captionsDescription": "Wygeneruj napisy z czasami słów na podstawie transkrypcji i przeciągnij je na oś czasu.", + "generateCaptions": "Generuj napisy", + "cropDescription": "Zmień kadr nagrania — wybierz proporcje i przybliż obszar, który chcesz zachować.", + "openCrop": "Otwórz kadrowanie…", + "deleteRegion": "Usuń obszar", + "freehandRendersAsBox": "W eksporcie rozmycie wypełnia prostokąt wokół Twojego odręcznego kształtu, więc może zasłonić nieco więcej, niż narysowałeś.", + "effectError": "Nie kompiluje się na tym komputerze", + "effectTarget": "Stosuje się do", + "effectTargetImage": "Obrazu", + "effectTargetText": "Tekstu", + "effectTargetBoth": "Obu", + "effectCost": "Koszt", + "effectTierLight": "Lekki", + "effectTierMedium": "Średni", + "effectTierHeavy": "Ciężki", + "effectTierVeryHeavy": "Bardzo ciężki", + "effectCode": "Kod", + "copyEffectCode": "Kopiuj kod" + }, + "chat": { + "changeProvider": "Zmień dostawcę", + "back": "Wstecz", + "currentModel": "Bieżący model:", + "notSelected": "Nie wybrano", + "loadingModels": "Wczytywanie modeli…", + "searchModels": "Szukaj modeli…", + "fetchModelsFailed": "Nie udało się pobrać aktualnych modeli ({{error}}); otwórz ustawienia dostawcy, aby wpisać identyfikator modelu ręcznie.", + "noModelsAvailable": "Ten dostawca nie udostępnia żadnych modeli.", + "noModelsMatch": "Żaden model nie pasuje do wyszukiwania.", + "noProvidersConnected": "Brak połączonych dostawców.", + "selectModelFailed": "Nie udało się wybrać modelu", + "providerSettings": "Ustawienia dostawcy…", + "applyEditsFailed": "Nie udało się zastosować zmian agenta", + "agentEditConflict": "Zmiany agenta nie zostały zastosowane, ponieważ projekt zmienił się podczas jego pracy.", + "applyAnyway": "Zastosuj mimo to", + "chatFailed": "Czat nie powiódł się", + "rewindFailed": "Cofnięcie nie powiodło się", + "rewoundSuccess": "Cofnięto do początku tej wiadomości", + "notEnoughHistory": "Za mało historii, aby ją jeszcze podsumować.", + "compactedSuccess": "Podsumowano wcześniejszy kontekst", + "compactFailed": "Podsumowanie nie powiodło się", + "createSessionFailed": "Nie udało się utworzyć rozmowy", + "deleteSessionFailed": "Nie udało się usunąć rozmowy", + "renameSessionFailed": "Nie udało się zmienić nazwy rozmowy", + "reasoningEffortUpdateFailed": "Nie udało się zmienić poziomu rozumowania", + "contextTooltip": "{{usedTokens}} / {{budgetTokens}} szacowanych tokenów", + "contextPercent": "{{percent}}% kontekstu", + "compactContext": "Podsumuj wcześniejsze wiadomości, aby zużyć mniej kontekstu", + "aiSettings": "Ustawienia AI", + "history": "Historia rozmów", + "newConversation": "Nowa rozmowa", + "untitledConversation": "Rozmowa", + "clickToRename": "Kliknij, aby zmienić nazwę", + "renameConversation": "Zmień nazwę rozmowy", + "deleteConversation": "Usuń rozmowę", + "confirmDeleteConversation": "Usunąć „{{title}}”?", + "emptyState": "Brak wiadomości. Poproś agenta o wycięcie ciszy, skrócenie pauz lub dodanie napisów.", + "welcome": { + "title": "Przynieś własne AI", + "subtitle": "Czat edytuje Twoje wideo, rozmawiając z modelem językowym. Wybierz zaufanego dostawcę i połącz klucz API, aby zacząć.", + "feature1": "Wycinaj ciszę, skracaj pauzy, usuwaj słowa wypełniacze", + "feature2": "Dodawaj napisy, powiększaj kamerę, generuj tytuł", + "feature3": "Na życzenie przepisz fragment, sformułuj inaczej lub zmień kolejność klipów", + "cta": "Skonfiguruj dostawcę", + "disclaimer": "Transkrypcja Twojego wideo zostanie wysłana do wybranego dostawcy. Nic nie zostanie udostępnione, dopóki go nie połączysz." + }, + "authorUser": "Ty", + "authorAssistant": "OpenScreen", + "rewindToMessage": "Cofnij do tej wiadomości", + "rewindTip": "Cofnij do tej wiadomości. Późniejsze zmiany zostaną cofnięte.", + "copyMessage": "Kopiuj wiadomość", + "copiedToClipboard": "Skopiowano do schowka", + "copyFailed": "Nie udało się skopiować", + "appliedPrefix": "zastosowano:", + "thinking": "Myślenie…", + "composerPlaceholder": "Opisz edycję, której potrzebujesz.", + "composerDisabledNoProvider": "Skonfiguruj dostawcę, aby zacząć rozmowę.", + "modelLabel": "Model", + "reasoningEffortLabel": "Poziom rozumowania", + "send": "Wyślij", + "rewindConfirmTitle": "Cofnąć tutaj?", + "rewindConfirmBody": "Zmiany agenta i kolejne tury po tym miejscu zostaną wycofane. Stan projektu, rozmowy i agenta zostanie przywrócony. Wszystkie zmiany wprowadzone od tego czasu również zostaną zastąpione.", + "rewindConfirm": "Cofnij", + "configureModel": "Skonfiguruj model AI", + "historyDialog": { + "title": "Historia rozmów", + "subtitle": "Przełącz się lub utwórz sesje", + "empty": "Brak rozmów.", + "msgsCount": "{{count}} wiad. · {{date}}" + }, + "stop": "Zatrzymaj", + "stopping": "Zatrzymywanie…", + "stopped": "Zatrzymane przez Ciebie. Zmiany, które już zastosowano, zostały zachowane.", + "stopFailed": "Nie udało się zatrzymać tury agenta." + }, + "newProjectDialog": { + "title": "Nowy projekt", + "subtitle": "Wybierz punkt wyjścia i nadaj nazwę", + "nameLabel": "Nazwa projektu", + "startingPointLabel": "Punkt wyjścia", + "create": "Utwórz projekt", + "defaultTitle": "Projekt bez nazwy", + "templates": { + "screenRecordingTitle": "Nagranie ekranu", + "screenRecordingDesc": "Rozpocznij przechwytywanie systemowe", + "importMediaDesc": "Wideo, dźwięk i obrazy z dysku" + } + }, + "openProjectDialog": { + "title": "Otwórz projekt", + "subtitle": "Wybierz istniejący projekt lub przeglądaj pliki", + "searchPlaceholder": "Szukaj projektów…", + "noMatches": "Żaden projekt nie pasuje do „{{query}}”.", + "navigateHint": "aby nawigować ·", + "openHint": "aby otworzyć", + "browseFiles": "Przeglądaj pliki…", + "deleteProject": "Usuń projekt", + "confirmDelete": "Usunąć ten projekt? Twoje nagrania zostaną zachowane." + }, + "editClipDialog": { + "title": "Edytuj klip", + "adjustStart": "Dostosuj początek klipu", + "adjustEnd": "Dostosuj koniec klipu", + "originalDuration": "Czas oryginalny", + "trimRange": "Zakres przycięcia", + "duration": "Czas końcowy", + "reset": "Resetuj", + "apply": "Zastosuj", + "pickClipTitle": "Wybierz klip do edycji", + "clipLabel": "Klip {{index}}" + }, + "cropDialog": { + "subtitle": "Przeciągnij obszar lub jego uchwyty, aby dostosować kadrowanie" + }, + "transport": { + "playbackControls": "Sterowanie odtwarzaniem", + "play": "Odtwórz", + "pause": "Wstrzymaj", + "loop": "Zapętl" + }, + "shell": { + "aiEditor": "Edytor AI", + "resizeChatPanel": "Zmień rozmiar panelu czatu", + "previewStage": "Scena podglądu", + "resizeTimeline": "Zmień rozmiar osi czasu" + }, + "preview": { + "videoPreview": "Podgląd wideo", + "webcamPreview": "Podgląd kamery", + "mediaError": { + "title": "Podgląd zatrzymany", + "description": "Nie udało się zdekodować wideo. Plik może być uszkodzony, być jeszcze zapisywany albo nie znajdować się już tam, gdzie oczekuje projekt — sam projekt jest nienaruszony.", + "retry": "Spróbuj ponownie", + "detail": "Szczegóły: {{detail}}" + } + }, + "annotationOverlay": { + "imageAlt": "Adnotacja", + "noImage": "Brak obrazu", + "noArrowData": "Brak danych strzałki" + }, + "providerSettings": { + "title": "Ustawienia AI", + "subtitle": "Wybierz dostawcę. Twoje klucze są bezpiecznie przechowywane na tym komputerze.", + "loadFailed": "Nie udało się wczytać ustawień AI", + "saved": "Zapisano: {{provider}}", + "connected": "Połączono: {{provider}}", + "disconnected": "Rozłączono: {{provider}}", + "pillConnected": "Połączono", + "pillApiKey": "Klucz API", + "notConnected": "Nie połączono", + "back": "Wstecz", + "modelLabel": "Model", + "modelHintLive": "Modele z Twojego konta, pobierane na żywo.", + "modelHintError": "Nie udało się pobrać aktualnych modeli ({{error}}); wpisz identyfikator modelu ręcznie.", + "modelHintLoading": "Wczytywanie aktualnych modeli…", + "modelSavedOption": "{{model}} (zapisany)", + "loadingModels": "Wczytywanie modeli…", + "baseUrlLabel": "Adres bazowy", + "baseUrlHint": "Pozostaw puste, aby użyć domyślnego adresu dostawcy.", + "reasoningEffortLabel": "Poziom rozumowania", + "apiKeyLabel": "Klucz API", + "apiKeyHintStored": "Bezpiecznie przechowywany na tym komputerze. Pozostaw puste, aby zachować obecny klucz.", + "projectEditsLabel": "Zmiany przez agenta", + "projectEditsHint": "Gdy wyłączone, agent musi zapytać przed zmianą osi czasu. Zmiany można zawsze cofnąć.", + "allowAgentEdits": "Zezwól agentowi edytować projekt", + "disconnect": "Rozłącz", + "cancel": "Anuluj", + "save": "Zapisz", + "saveAndUse": "Zapisz i użyj" + }, + "mcpServer": { + "title": "Serwer MCP", + "description": "Pozwól klientom MCP uruchamianym przez Ciebie, takim jak Claude Code lub Codex, używać narzędzi edycji AI w dowolnym z Twoich projektów, nie tylko w tym otwartym w edytorze. Logują się własnymi kontami; OpenScreen ich nie widzi.", + "enableLabel": "Serwer", + "enable": "Włącz serwer MCP", + "editsLabel": "Zmiany przez MCP", + "allowEdits": "Zezwól klientom MCP edytować projekty, nagrywać i eksportować", + "editsHint": "Domyślnie wyłączone: klienci mogą czytać Twoje projekty, a każda próba edycji, nagrania lub eksportu zostanie odrzucona. Po włączeniu każda zmiana jest zapisywana od razu; zmianę w projekcie otwartym w edytorze można cofnąć tam.", + "statusRunning": "Działa", + "statusOff": "Wył.", + "statusError": "Nie działa", + "portLabel": "Port", + "portApply": "Zastosuj", + "tokenLabel": "Token dostępu", + "tokenHint": "Klienci muszą wysłać ten token. Wygenerowanie go od nowa rozłączy wszystkich klientów skonfigurowanych ze starym tokenem.", + "show": "Pokaż", + "hide": "Ukryj", + "copy": "Kopiuj", + "regenerate": "Wygeneruj ponownie", + "claudeCodeLabel": "Claude Code", + "codexLabel": "Codex", + "codexHint": "Codex odczytuje token ze zmiennej środowiskowej {{env}}. Ustaw ją w powłoce, z której uruchamiasz Codex.", + "copied": "Skopiowano do schowka", + "copyFailed": "Nie udało się skopiować", + "updateFailed": "Nie udało się zaktualizować serwera MCP" + }, + "cpuCompositor": { + "notice": "Działa bez zgodnej karty graficznej — renderowanie na procesorze, więc odtwarzanie jest wolniejsze.", + "exportWarning": "Brak zgodnej karty graficznej: ten eksport działa na procesorze i potrwa znacznie dłużej niż zwykle." + } +} diff --git a/src/i18n/locales/pl/launch.json b/src/i18n/locales/pl/launch.json new file mode 100644 index 0000000000..8df08a535e --- /dev/null +++ b/src/i18n/locales/pl/launch.json @@ -0,0 +1,157 @@ +{ + "tooltips": { + "hideHUD": "Ukryj pasek nagrywania", + "hideHUDTip": "Ukryj pasek nagrywania. Pokaż go ponownie z ikony w zasobniku.", + "closeApp": "Zakończ OpenScreen", + "restartRecording": "Usuń to nagranie i rozpocznij nowe", + "cancelRecording": "Zatrzymaj i usuń to nagranie", + "pauseRecording": "Wstrzymaj nagrywanie", + "resumeRecording": "Wznów nagrywanie", + "useVerticalTray": "Przełącz na pionowy pasek", + "useHorizontalTray": "Przełącz na poziomy pasek", + "changeSource": "Wybierz inny ekran lub okno", + "systemAudio": "Dźwięk systemowy: nagrywa dźwięk odtwarzany przez komputer", + "microphone": "Mikrofon: nagrywa Twój głos", + "camera": "Kamera: nagrywa Cię jako osobną warstwę, którą możesz przesuwać w edytorze", + "openStudio": "Otwórz Studio: edytor Twoich nagrań", + "openNotes": "Otwórz notatki: tekst do odczytania podczas nagrywania", + "openNotesPlaceholder": "Pisz notatki tutaj...", + "notesToolbar": { + "bold": "Pogrubienie", + "italic": "Kursywa", + "strikethrough": "Przekreślenie", + "bulletList": "Lista punktowana", + "numberedList": "Lista numerowana", + "blockquote": "Cytat", + "codeBlock": "Blok kodu", + "play": "Rozpocznij automatyczne przewijanie", + "pause": "Wstrzymaj automatyczne przewijanie", + "speed": "Prędkość przewijania", + "decreaseSpeed": "Zmniejsz prędkość przewijania", + "increaseSpeed": "Zwiększ prędkość przewijania", + "fontSize": "Rozmiar czcionki", + "decreaseFontSize": "Zmniejsz rozmiar czcionki", + "increaseFontSize": "Zwiększ rozmiar czcionki", + "mirror": "Odbicie poziome", + "mirrorTip": "Odwróć tekst w poziomie, aby czytać go w lustrze" + } + }, + "audio": { + "systemAudio": "Dźwięk systemowy", + "microphone": "Mikrofon", + "inputDevice": "Urządzenie wejściowe" + }, + "webcam": { + "searching": "Wyszukiwanie...", + "noneFound": "Nie znaleziono kamery", + "unavailable": "Kamera niedostępna", + "camera": "Kamera", + "cameraDevice": "Urządzenie kamery", + "quality": "Jakość kamery", + "quality1080p": "1080p", + "quality1440p": "1440p", + "quality2160p": "4K" + }, + "cursor": { + "name": "Edytowalny kursor", + "editableTip": "Edytowalny kursor: nagrywany osobno, dzięki czemu możesz zmienić jego wygląd i powiększanie w edytorze", + "systemTip": "Kursor systemowy: Twój prawdziwy kursor, nagrany w wideo. Bez zmiany wyglądu i bez automatycznego powiększania." + }, + "sourceSelector": { + "loading": "Wczytywanie ekranów i okien...", + "screens": "Ekrany ({{count}})", + "windows": "Okna ({{count}})", + "emptyTitle": "Nie znaleziono ekranów ani okien", + "emptyDescription": "Jeśli właśnie przyznano uprawnienie do nagrywania ekranu, przeładuj ten selektor. Na macOS może być konieczne ponowne otwarcie OpenScreen.", + "loadFailedDescription": "OpenScreen nie mógł wczytać Twoich ekranów i okien. Przeładuj ten selektor i spróbuj ponownie.", + "defaultSourceName": "Ekran" + }, + "recording": { + "selectSource": "Wybierz ekran lub okno do nagrania", + "systemPicker": "System zapyta, co udostępnić", + "start": "Rozpocznij nagrywanie", + "stop": "Zatrzymaj i zapisz nagranie", + "saving": "Zapisywanie..." + }, + "language": "Język", + "languageWithName": "Język: {{language}}", + "systemLanguagePrompt": { + "title": "Użyć języka systemu?", + "description": "Wykryto, że językiem systemu jest {{language}}. Czy chcesz przełączyć OpenScreen na {{language}}?", + "switch": "Przełącz na {{language}}", + "keepDefault": "Zachowaj obecny język" + }, + "softwareEncoderFallback": { + "title": "Przełączono na zapasowy koder", + "description": "Koder karty graficznej nie uruchomił się, więc OpenScreen przełączył się na zapasowy. Nagranie jest w porządku, ale komputer może pracować trochę mocniej.", + "dismiss": "Rozumiem", + "dontShowAgain": "Nie pokazuj ponownie" + }, + "deviceSettings": { + "title": "Ustawienia urządzeń", + "close": "Zamknij", + "micLevel": "Poziom wejścia", + "micHint": "Mów, aby sprawdzić mikrofon", + "noMicrophones": "Nie znaleziono mikrofonu", + "preview": "Podgląd", + "previewUnavailable": "Podgląd niedostępny", + "about": "Informacje", + "version": "Wersja {{version}}", + "checkingForUpdates": "Sprawdzanie…" + }, + "permissions": { + "title": "OpenScreen potrzebuje kilku uprawnień", + "subtitle": "macOS prosi o każde uprawnienie tylko raz. Możesz je zmienić w dowolnym momencie w Ustawieniach systemowych.", + "level": { + "required": "Wymagane", + "recommended": "Zalecane", + "optional": "Opcjonalne" + }, + "rows": { + "screen": { + "name": "Ekran i dźwięk systemowy", + "description": "Do nagrywania ekranu i dźwięku odtwarzanego przez Mac." + }, + "systemAudio": { + "name": "Dźwięk systemowy", + "description": "Do nagrywania dźwięku odtwarzanego przez Mac. Wybór ekranu lub okna nie wymaga uprawnień." + }, + "accessibility": { + "name": "Dostępność", + "description": "Do pokazywania właściwego kursora (wskaźnika, tekstu) w nagraniach." + }, + "microphone": { + "name": "Mikrofon", + "description": "Do nagrywania Twojego głosu." + }, + "camera": { + "name": "Kamera", + "description": "Do dodawania kamery internetowej do nagrań." + } + }, + "status": { + "granted": "Dozwolone", + "restricted": "Zarządzane przez organizację" + }, + "actions": { + "continue": "Dalej", + "allow": "Zezwól", + "openSettings": "Otwórz ustawienia", + "restart": "Uruchom ponownie OpenScreen", + "start": "Zaczynajmy" + }, + "help": { + "screenPrompt": "macOS poprosi następnie o włączenie OpenScreen w Ustawieniach systemowych.", + "screenSettings": "W Ustawieniach systemowych włącz OpenScreen. Jeśli macOS zaproponuje zamknięcie i ponowne otwarcie aplikacji, zaakceptuj: to okno wróci.", + "screenNotListed": "Nie ma OpenScreen na liście? Kliknij +, a następnie wybierz OpenScreen w Aplikacjach.", + "screenRestart": "Dozwolone. OpenScreen musi się uruchomić ponownie, zanim będzie mógł z tego korzystać.", + "screenRecurring": "Przy pierwszym nagraniu macOS zapyta, czy OpenScreen może bezpośrednio uzyskać dostęp do ekranu, bez systemowego selektora. Kliknij Zezwól. macOS czasem pyta ponownie; to normalne.", + "systemAudioPrompt": "macOS poprosi o zezwolenie OpenScreen na nagrywanie dźwięku odtwarzanego przez Mac.", + "systemAudioRequested": "Jeśli odmówiono, włącz OpenScreen w sekcji „Nagrywanie tylko dźwięku systemowego” w Ustawieniach systemowych." + }, + "footer": { + "screenRequired": "Nagrywanie ekranu jest potrzebne do nagrywania.", + "ready": "Wszystko gotowe." + } + } +} diff --git a/src/i18n/locales/pl/settings.json b/src/i18n/locales/pl/settings.json new file mode 100644 index 0000000000..eeb9e8de5d --- /dev/null +++ b/src/i18n/locales/pl/settings.json @@ -0,0 +1,457 @@ +{ + "background": { + "motion": "Animacja", + "motionNone": "Brak", + "motionDrift": "Dryf", + "motionAurora": "Zorza", + "motionWaves": "Fale", + "gradientLabel": "Gradient {{index}}", + "uploadCustom": "Prześlij obraz", + "unsupportedImage": "Nieobsługiwany obraz. Użyj pliku JPG lub PNG.", + "title": "Tło", + "imageLabel": "Tło {{index}}", + "custom": "Własne", + "customColor": "Własny kolor", + "customGradient": "Gradient z jednego koloru", + "help": "Wybierz, co pojawi się za nagraniem: dołączona tapeta, jednolity kolor, gradient lub własny obraz z dysku.", + "gradient": "Gradient", + "colorLabel": "Kolor {{color}}", + "customWallpaper": "Własna tapeta", + "colorPalette": "Paleta kolorów", + "imageReadFailed": "Nie udało się odczytać tego pliku obrazu.", + "image": "Obraz", + "presets": "Ustawienia gotowe", + "color": "Kolor", + "colorWheel": "Koło barw" + }, + "customFont": { + "namePlaceholder": "Moja czcionka", + "failedToAdd": "Nie udało się dodać czcionki", + "addingButton": "Dodawanie...", + "errorInvalidUrl": "Podaj prawidłowy adres URL Google Fonts", + "urlHelp": "Pobierz go z Google Fonts: wybierz czcionkę → kliknij „Get font” → skopiuj adres URL @import", + "urlLabel": "Adres importu Google Fonts", + "successMessage": "Czcionka „{{fontName}}” została dodana", + "nameLabel": "Nazwa wyświetlana", + "errorEmptyName": "Podaj nazwę czcionki", + "nameHelp": "Tak czcionka będzie widoczna w selektorze czcionek", + "errorEmptyUrl": "Podaj adres importu Google Fonts", + "errorExtractFailed": "Nie udało się odczytać rodziny czcionek z adresu URL", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "dialogTitle": "Dodaj czcionkę Google", + "errorTimeout": "Wczytywanie czcionki trwa zbyt długo. Sprawdź adres URL i spróbuj ponownie.", + "errorLoadFailed": "Nie udało się wczytać czcionki. Upewnij się, że adres URL Google Fonts jest poprawny.", + "addButton": "Dodaj czcionkę" + }, + "imageUpload": { + "invalidFileType": "Nieprawidłowy typ pliku", + "failedToUpload": "Nie udało się przesłać obrazu", + "jpgOnly": "Prześlij obraz w formacie JPG, JPEG lub PNG.", + "uploadSuccess": "Własny obraz został przesłany!", + "errorReading": "Wystąpił błąd podczas odczytu pliku." + }, + "annotation": { + "blurShapeRectangle": "Prostokąt", + "size": "Rozmiar", + "customSize": "Własny rozmiar", + "tipShiftTabCycle": "Użyj Shift+Tab, aby przechodzić wstecz.", + "clearBackground": "Wyczyść tło", + "colorPalette": "Paleta kolorów", + "invalidImageType": "Nieprawidłowy typ pliku", + "background": "Tło", + "typeText": "Tekst", + "active": "Aktywna", + "color": "Kolor", + "blurShapeFreehand": "Odręczny", + "arrowDirection": "Kierunek strzałki", + "blurTypeMosaic": "Mozaika", + "colorWheel": "Koło barw", + "textColor": "Kolor tekstu", + "title": "Ustawienia adnotacji", + "blurType": "Typ rozmycia", + "typeBlur": "Rozmycie", + "blurIntensity": "Siła rozmycia", + "selectStyle": "Wybierz styl", + "textContent": "Tekst", + "typeArrow": "Strzałka", + "none": "Brak", + "blurColor": "Kolor rozmycia", + "customFonts": "Własne czcionki", + "imageUploadSuccess": "Obraz został przesłany!", + "type": "Typ", + "arrowColor": "Kolor strzałki", + "textPlaceholder": "Wpisz tekst…", + "imageFormatsOnly": "Prześlij obraz w formacie JPG, PNG, GIF lub WebP.", + "blurShape": "Kształt rozmycia", + "uploadImage": "Prześlij obraz", + "blurTypeBlur": "Gładkie", + "tipTabCycle": "Użyj Tab, aby przechodzić między nakładającymi się elementami.", + "shortcutsAndTips": "Skróty i wskazówki", + "deleteAnnotation": "Usuń adnotację", + "fontStyle": "Styl czcionki", + "defaultText": "Cześć", + "mosaicBlockSize": "Rozmiar bloku mozaiki", + "blurColorBlack": "Czarny", + "strokeWidth": "Grubość: {{width}} px", + "blurShapeOval": "Owal", + "blurColorWhite": "Biały", + "tipMovePlayhead": "Przesuń głowicę odtwarzania do miejsca z nakładającymi się adnotacjami i wybierz element.", + "typeImage": "Obraz" + }, + "effects": { + "fitClipFew": "{{count}} klipy", + "title": "Kompozycja", + "shadow": "Cień", + "off": "wył.", + "on": "wł.", + "blurBg": "Rozmycie tła", + "help": "Stylizacja ramki nagrania: rozmycie tła, cień, rozmycie ruchu, zaokrąglenie rogów i odstęp wokół wideo.", + "fitClipOne": "{{count}} klip", + "formatAuto": "Automatycznie", + "formatAutoMixed": "Klipy się różnią", + "formatFill": "Nagranie", + "formatFillFit": "Całość", + "formatFillFollow": "Podążaj za kursorem", + "formatOriginal": "Oryginalny", + "fitClipMany": "{{count}} klipów", + "frame": "Ramka", + "motion": "Ruch", + "padding": "Odstęp", + "format": "Format", + "motionBlur": "Rozmycie ruchu", + "depthOfField": "Głębia ostrości", + "depthOfFieldTip": "Rozmywa dalszą stronę przechylonego ekranu", + "roundness": "Zaokrąglenie", + "frameStyle": "Styl", + "windowNone": "Brak", + "frameWindow": "Okno", + "frameLaptop": "Laptop", + "framePhone": "Telefon", + "frameScreen": "Ekran", + "frameTheme": "Motyw", + "frameThemeLight": "Jasny", + "frameThemeDark": "Ciemny", + "roundnessFrameHelp": "Zakres zależy od ramki. 100% to najbardziej zaokrąglona wersja, która nadal dobrze wygląda.", + "shadowNone": "Brak", + "shadowLight": "Lekki", + "shadowMedium": "Średni", + "shadowStrong": "Mocny" + }, + "stylePresets": { + "button": "Ustawienia gotowe", + "menuLabel": "Ustawienia gotowe stylu", + "factoryName": "OpenScreen", + "factoryBadge": "Wbudowane", + "empty": "Brak zapisanych ustawień gotowych", + "create": "Utwórz nowe ustawienie…", + "namePlaceholder": "Nazwa ustawienia", + "save": "Zapisz", + "moreActions": "Więcej działań dla: {{name}}", + "revealMac": "Pokaż w Finderze", + "revealWindows": "Pokaż w Eksploratorze", + "revealLinux": "Pokaż w folderze", + "rename": "Zmień nazwę", + "update": "Zaktualizuj z bieżącego projektu", + "useForNewProjects": "Używaj w nowych projektach", + "stopForNewProjects": "Przestań używać w nowych projektach", + "newProjectsBadge": "Nowe projekty", + "delete": "Usuń", + "confirmDelete": "Usunąć „{{name}}”?", + "applied": "Zastosowano „{{name}}”", + "saved": "Zapisano ustawienie", + "updated": "Zaktualizowano ustawienie", + "nameRequired": "Podaj nazwę", + "nameTaken": "Ustawienie o tej nazwie już istnieje", + "loadFailed": "Nie udało się wczytać ustawień", + "saveFailed": "Nie udało się zapisać ustawienia: {{error}}" + }, + "transcript": { + "laneRecording": "Nagranie", + "noTranscript": "Brak transkrypcji", + "title": "Transkrypcja", + "restoreWord": "Przywróć „{{word}}”", + "revertWord": "Przywróć „{{original}}”", + "editingHint": "Kliknij dwukrotnie słowo, aby je poprawić; Backspace wycina je z filmu.", + "restoreSilence": "Przywróć ciszę ({{duration}} s)", + "help": "Transkrypcja każdego klipu na osi czasu. Backspace / Delete na słowie lub zaznaczeniu wycina je z filmu (na czerwono). Kliknij dwukrotnie słowo, aby poprawić jego tekst. Najedź na zaznaczone słowo, aby je cofnąć.", + "editWord": "Edytuj „{{word}}”", + "laneFeedsCaptions": "Napisy są wypalane z tej ścieżki.", + "insertedWord": "Dodane przez Ciebie. Nie ma dla niego dźwięku.", + "whisperHint": "Transkrypcja używa lokalnego modelu Whisper — działa na Twoim komputerze, żadne dane nie opuszczają urządzenia.", + "insertAria": "Nowe słowo", + "editorAria": "Transkrypcja dla {{filename}}", + "transcribeNow": "Transkrybuj teraz", + "transcribing": "Transkrybowanie…", + "trimSilence": "Przytnij ciszę ({{duration}} s)", + "removeInserted": "Usuń „{{word}}”", + "laneLabel": "Czytaj transkrypcję z", + "noClips": "Brak klipów", + "laneVoiceover": "Lektor", + "silence": "[cisza {{duration}} s]", + "clipLabel": "Klip {{index}}", + "correctedWord": "Poprawiono. Transkryber usłyszał „{{original}}”.", + "noClipTranscript": "Brak transkrypcji dla tego klipu — otwórz kartę materiału i wygeneruj ją ponownie.", + "editingHintDev": "Kliknij dwukrotnie słowo, aby je poprawić; Backspace wycina je z filmu; wpisz tekst między dwoma słowami, aby dodać nowe.", + "noAudio": "Ten materiał nie ma ścieżki dźwiękowej", + "blankedWord": "wyciszone" + }, + "exportFormat": { + "mp4": "MP4", + "mp4Description": "Wysokiej jakości plik wideo", + "gifAnimation": "Animacja GIF", + "mp4Video": "Wideo MP4", + "gifDescription": "Animowany obraz do udostępniania", + "gif": "GIF" + }, + "captions": { + "showBackground": "Pokaż tło", + "deleteTranslation": "Usuń to tłumaczenie", + "legacyAnnotations": "Ten projekt nadal zawiera adnotacje napisów ze starej funkcji napisów ({{count}}). Są wyświetlane nad warstwą napisów.", + "backgroundOpacity": "Krycie", + "backgroundColor": "Kolor tła", + "translationIsNonDestructive": "Tłumaczenia są przechowywane obok transkrypcji, nigdy w niej — oryginalny tekst i jego czasy pozostają nietknięte.", + "distanceFromRight": "Odległość od prawej", + "language": "Język", + "text": "Tekst", + "distanceFromTop": "Odległość od góry", + "translateFailed": "Tłumaczenie nie powiodło się.", + "distanceFromBottom": "Odległość od dołu", + "derivedFromTranscript": "{{count}} wierszy napisów, generowanych na bieżąco z transkrypcji.", + "translate": "Przetłumacz", + "position": "Położenie", + "fontSize": "Rozmiar", + "hiddenHint": "Napisy pochodzą z transkrypcji tego materiału. Włącz je, aby zobaczyć je w podglądzie i eksportach.", + "noTranscript": "Napisy są odczytywane z transkrypcji materiału. Transkrybuj wideo, aby je włączyć.", + "distanceFromLeft": "Odległość od lewej", + "transcribe": "Transkrybuj wideo", + "bold": "Pogrubienie", + "minWords": "Min. słów w wierszu", + "translateHint": "Przetłumacz transkrypcję skonfigurowanym dostawcą AI", + "displayLanguage": "Wyświetlanie", + "removeLegacyAnnotations": "Usuń stare adnotacje napisów", + "background": "Tło", + "lineLength": "Długość wiersza", + "original": "Oryginał (transkrypcja)", + "maxWords": "Maks. słów w wierszu", + "font": "Czcionka", + "translating": "Tłumaczenie…", + "show": "Pokaż napisy", + "textColor": "Kolor tekstu", + "style": "Styl", + "styles": { + "classic": "Klasyczny", + "bold": "Pogrubiony", + "minimal": "Minimalny", + "light": "Lekki" + }, + "customize": "Dostosuj" + }, + "panes": { + "help": "Pomoc" + }, + "speed": { + "deleteRegion": "Usuń obszar zmiany prędkości", + "maxSpeedError": "Prędkość nie może przekroczyć {{max}}×", + "selectRegion": "Zaznacz obszar zmiany prędkości, aby go dostosować", + "playbackSpeed": "Prędkość odtwarzania", + "customPlaybackSpeed": "Własna prędkość", + "previewFrameSteppingHint": "Powyżej {{native}}× podgląd jest odtwarzany klatka po klatce i bez dźwięku. Eksport nie ulega zmianie." + }, + "gifSettings": { + "frameRate": "Liczba klatek GIF", + "loop": "Zapętl GIF", + "size": "Rozmiar GIF" + }, + "exportQuality": { + "title": "Rozdzielczość eksportu", + "low": "720p", + "high": "Źródłowa", + "medium": "1080p" + }, + "audioTrack": { + "defaultLabel": "Ścieżka dźwiękowa", + "importFailed": "Nie udało się dodać dźwięku", + "fadeOut": "Wyciszanie", + "fadeIn": "Wzmacnianie", + "remove": "Usuń ścieżkę", + "loop": "Zapętl", + "slipHint": "Przytrzymaj {{modifier}} i przeciągnij, aby przesunąć dźwięk w obrębie ścieżki", + "help": "Głośność, wyciszanie i zapętlanie tej ścieżki dźwiękowej. Miesza się z nagraniem w podglądzie i eksporcie. Ścieżka muzyczna sama ścisza się, gdy ktoś mówi. Przeciągnij ścieżkę na osi czasu, aby ją przesunąć lub zmienić jej długość, albo przytrzymaj Alt i przeciągnij, aby przesunąć dźwięk wewnątrz niej.", + "add": "Dodaj ścieżkę dźwiękową", + "mute": "Wycisz" + }, + "layout": { + "help": "Jak kamera jest komponowana z ekranem: obraz w obrazie, pionowy stos, podwójna ramka, kształt, zaokrąglenie, rozmiar, położenie i odbicie lustrzane.", + "mirrorWebcam": "Odbicie lustrzane kamery", + "webcamFraming": "Kadrowanie kamery", + "webcamFramingDrag": "Przeciągnij ramkę, aby ją przesunąć, lub róg, aby powiększyć.", + "shapes": { + "square": "Kwadrat", + "original": "Oryginalny" + }, + "webcamPosition": "Położenie", + "anchors": { + "topLeft": "Lewy górny", + "top": "Góra", + "topRight": "Prawy górny", + "left": "Lewa", + "right": "Prawa", + "bottomLeft": "Lewy dolny", + "bottom": "Dół", + "bottomRight": "Prawy dolny" + }, + "selectPreset": "Wybierz ustawienie", + "bgModes": { + "custom": "Własne", + "none": "Oryginalne", + "blur": "Rozmycie", + "transparent": "Wycięcie" + }, + "webcamBlurIntensity": "Siła rozmycia", + "preset": "Ustawienie", + "webcamSize": "Rozmiar kamery", + "dualFrame": "Podwójna ramka", + "verticalStack": "Pionowy stos", + "pictureInPicture": "Obraz w obrazie", + "webcamShape": "Kształt kamery", + "reactiveWebcam": "Zmniejszaj przy powiększeniu", + "reactiveWebcamTip": "Kamera zmniejsza się, gdy wideo jest powiększone", + "webcamBackground": "Tło kamery", + "helpNoWebcam": "Ten projekt nie ma kamery, więc sterowanie układem jest wyłączone, a ustawienie pokazuje „Brak kamery”. Zapisany układ zostanie zachowany na wypadek dodania kamery.", + "title": "Układ kamery", + "noWebcam": "Brak kamery" + }, + "textAnimation": { + "slideLeft": "Przesuń w lewo", + "pulse": "Pulsowanie", + "typewriter": "Maszyna do pisania", + "selectAnimation": "Wybierz animację", + "fade": "Zanikanie", + "title": "Animacja tekstu", + "none": "Brak", + "pop": "Wyskok", + "rise": "Wznoszenie" + }, + "facets": { + "transcript": "Transkrypcja", + "captions": "Napisy", + "tips": { + "effects": "Kompozycja: tło, ramka, cień i odstęp", + "layout": "Układ kamery: położenie, kształt i rozmiar kamery", + "audio": "Dźwięk: poziom wyjściowy całego wideo", + "cursor": "Kursor: styl, rozmiar i efekty", + "transcript": "Transkrypcja: edytuj słowa, aby przyciąć wideo" + } + }, + "crop": { + "title": "Kadrowanie", + "free": "Dowolny", + "unlockAspectRatio": "Odblokuj proporcje", + "dragInstruction": "Przeciągaj każdy bok, aby dostosować obszar kadrowania", + "done": "Gotowe", + "ratio": "Proporcje", + "cropVideo": "Kadruj wideo", + "lockAspectRatio": "Zablokuj proporcje" + }, + "zoom": { + "position": { + "y": "Y (%)", + "hint": "0 = najbardziej z lewej / najwyżej, 100 = najbardziej z prawej / najniżej", + "title": "Położenie ostrości", + "x": "X (%)" + }, + "deleteZoom": "Usuń powiększenie", + "focusMode": { + "lockedDisclaimer": "Ustawiane przyciskiem Automatyczna ostrość na osi czasu. Wyłącz go, aby wybrać tryb ostrości każdego powiększenia.", + "auto": "Automatycznie", + "manual": "Ręcznie", + "title": "Tryb ostrości" + }, + "camera": { + "title": "Kamera 3D", + "off": "Wył.", + "preset": { + "left": "Ekran obrócony w lewo", + "right": "Ekran obrócony w prawo", + "orbit": "Orbita 3D" + } + }, + "level": "Poziom powiększenia", + "customScale": "Własne powiększenie", + "customScaleRange": "Powiększenie od {{min}}× do {{max}}×", + "selectRegion": "Zaznacz obszar powiększenia, aby go dostosować", + "cursor": { + "title": "Kursor", + "show": "Widoczny", + "hide": "Ukryty" + } + }, + "audio": { + "outputGain": "Poziom wyjściowy", + "help": "Głosy są automatycznie wyrównywane do standardowej głośności. Dalej dostosuj poziom wyjściowy; działa on identycznie w podglądzie i w eksporcie.", + "reset": "Resetuj dźwięk", + "title": "Dźwięk" + }, + "language": { + "title": "Język" + }, + "project": { + "new": "Nowy projekt", + "load": "Wczytaj projekt", + "save": "Zapisz projekt" + }, + "support": { + "starOnGithub": "Oznacz gwiazdką na GitHubie", + "saveDiagnostics": "Zapisz diagnostykę", + "reportBug": "Zgłoś błąd" + }, + "cursor": { + "smoothing": "Wygładzanie", + "clickBounce": "Podskok przy kliknięciu", + "model3d": "Kursor 3D", + "model3dTip": "Rysuje domyślny kursor jako obiekt 3D z cieniem", + "clickImpact": "Uderzenie przy kliknięciu", + "clickImpactTip": "Ekran lekko drga przy każdym kliknięciu", + "clickSound": "Kliknięcia myszy", + "clickSoundTip": "Każde kliknięcie wydaje dźwięk w podglądzie i w eksporcie", + "clickSoundVolume": "Głośność kliknięcia", + "help": "Jak rysowany jest nagrany kursor: styl, rozmiar, wygładzanie, rozmycie ruchu i podskok przy kliknięciu.", + "size": "Rozmiar", + "title": "Kursor", + "show": "Pokaż kursor", + "themeDefault": "Domyślny", + "types": "Typy kursora", + "typeArrow": "Strzałka", + "typePointer": "Dłoń", + "typeText": "Tekst", + "typeGrab": "Chwytanie", + "typeResize": "Zmiana rozmiaru", + "typeBusy": "Zajęty", + "typeCrosshair": "Celownik", + "typeNotAllowed": "Niedozwolone", + "typeHelp": "Pomoc", + "typeUpArrow": "Alternatywny wybór", + "typeAsArrow": "{{type}}: zastąpiony strzałką", + "motionBlur": "Rozmycie ruchu", + "theme": "Styl kursora", + "autoHide": "Ukrywaj, gdy nieaktywny", + "autoHideTip": "Kursor zanika, gdy przestaje się poruszać", + "bounceNone": "Brak", + "bounceLight": "Lekki", + "bounceStrong": "Mocny" + }, + "export": { + "gifButton": "Eksportuj GIF", + "chooseSaveLocation": "Wybierz miejsce zapisu", + "videoButton": "Eksportuj wideo" + }, + "trim": { + "deleteRegion": "Usuń obszar przycięcia" + }, + "textPlate": { + "none": "Brak", + "dark": "Ciemne", + "light": "Jasne", + "custom": "Własne" + } +} diff --git a/src/i18n/locales/pl/shortcuts.json b/src/i18n/locales/pl/shortcuts.json new file mode 100644 index 0000000000..8bc5ffc90f --- /dev/null +++ b/src/i18n/locales/pl/shortcuts.json @@ -0,0 +1,43 @@ +{ + "title": "Skróty klawiszowe", + "customize": "Dostosuj", + "configurable": "Do zmiany", + "fixed": "Stałe", + "pressKey": "Naciśnij klawisz…", + "clickToChange": "Kliknij, aby zmienić", + "pressEscToCancel": "Naciśnij Esc, aby anulować", + "helpText": "Kliknij skrót, a następnie naciśnij nową kombinację klawiszy. Naciśnij Esc, aby anulować.", + "resetToDefaults": "Przywróć domyślne", + "alreadyUsedBy": "Już używane przez: {{action}}", + "swap": "Zamień", + "reservedShortcut": "Ten skrót jest zarezerwowany dla „{{label}}” i nie można go przypisać ponownie.", + "savedToast": "Zapisano skróty klawiszowe", + "resetToast": "Przywrócono domyślne skróty — kliknij Zapisz, aby je zastosować", + "registrationFailed": "Nie udało się zarejestrować skrótu. Może być używany przez inną aplikację. Wybierz inny klawisz.", + "actions": { + "openApp": "Otwórz aplikację", + "addZoom": "Dodaj powiększenie", + "addTrim": "Dodaj przycięcie", + "addSpeed": "Dodaj zmianę prędkości", + "addAnnotation": "Dodaj adnotację", + "addAudio": "Dodaj dźwięk", + "addVoiceover": "Nagraj lektora", + "addKeyframe": "Dodaj klatkę kluczową", + "addCameraFullscreen": "Zmień układ tutaj", + "deleteSelected": "Usuń zaznaczone", + "playPause": "Odtwórz / Wstrzymaj", + "copySelected": "Kopiuj zaznaczone", + "paste": "Wklej" + }, + "fixedActions": { + "undo": "Cofnij", + "redo": "Ponów", + "cycleAnnotationsForward": "Przełącz adnotacje do przodu", + "cycleAnnotationsBackward": "Przełącz adnotacje do tyłu", + "deleteSelectedAlt": "Usuń zaznaczone (alt)", + "panTimeline": "Przesuń oś czasu", + "zoomTimeline": "Powiększ oś czasu", + "frameBack": "Klatka wstecz", + "frameForward": "Klatka do przodu" + } +} diff --git a/src/i18n/locales/pl/timeline.json b/src/i18n/locales/pl/timeline.json new file mode 100644 index 0000000000..4626455e08 --- /dev/null +++ b/src/i18n/locales/pl/timeline.json @@ -0,0 +1,135 @@ +{ + "buttons": { + "addZoom": "Dodaj powiększenie w bieżącym czasie", + "autoFocusAll": "Automatyczne ustawianie ostrości dla wszystkich powiększeń", + "autoFocusAllTip": "Wszystkie powiększenia podążają za kursorem. Wyłączone: sam wybierasz ostrość każdego powiększenia.", + "clearTimeline": "Usuń wszystkie powiększenia, przycięcia, zmiany prędkości, adnotacje i Pełną kamerę. Klipy, dźwięk i napisy pozostają.", + "addTrim": "Dodaj przycięcie: usuwa fragment wideo w bieżącym czasie", + "addAnnotation": "Dodaj tekst, strzałkę, obraz lub rozmycie w bieżącym czasie", + "addSpeed": "Dodaj zmianę prędkości w bieżącym czasie", + "addCameraFullscreen": "Zmień układ tutaj" + }, + "hints": { + "pressZoom": "Naciśnij {{key}}, aby dodać powiększenie", + "pressTrim": "Naciśnij {{key}}, aby dodać przycięcie", + "pressAnnotation": "Naciśnij {{key}}, aby dodać adnotację", + "pressAudio": "Naciśnij {{audioKey}}, aby dodać dźwięk, {{voiceoverKey}}, aby nagrać lektora", + "pressSpeed": "Naciśnij {{key}}, aby dodać zmianę prędkości", + "pressCameraFullscreen": "Naciśnij {{key}}, aby dodać segment Pełnej kamery" + }, + "labels": { + "pan": "Przesuń", + "panTip": "Przewiń oś czasu", + "zoom": "Powiększ", + "zoomTip": "Powiększ oś czasu", + "trim": "Przytnij", + "speed": "Prędkość", + "zoomItem": "Powiększenie {{index}}", + "trimItem": "Przycięcie {{index}}", + "speedItem": "Prędkość {{index}}", + "annotationItem": "Adnotacja", + "imageItem": "Obraz", + "emptyText": "Pusty tekst", + "cameraFullscreen": "Pełna kamera", + "cameraFullscreenItem": "Pełna kamera {{index}}" + }, + "trails": { + "zoomIn": "Najazd: widok przybliża się aż do początku powiększenia", + "zoomOut": "Oddalenie: widok wraca po zakończeniu powiększenia", + "zoomInCut": "Przycięcie usuwa {{seconds}} s najazdu. Eksport przeskakuje w miejscu cięcia.", + "zoomOutCut": "Przycięcie usuwa {{seconds}} s oddalenia. Eksport przeskakuje w miejscu cięcia.", + "zoomInJunction": "Złączenie klipów usuwa {{seconds}} s najazdu. Eksport przeskakuje w miejscu złączenia.", + "zoomOutJunction": "Złączenie klipów usuwa {{seconds}} s oddalenia. Eksport przeskakuje w miejscu złączenia.", + "pan": "Przesunięcie: widok przechodzi prosto do następnego powiększenia" + }, + "emptyState": { + "noVideo": "Nie wczytano wideo", + "dragAndDrop": "Przeciągnij i upuść wideo, aby rozpocząć edycję" + }, + "errors": { + "cannotPlaceZoom": "Nie można tutaj umieścić powiększenia", + "zoomExistsAtLocation": "W tym miejscu już jest powiększenie lub brakuje miejsca.", + "zoomSuggestionUnavailable": "Obsługa sugestii powiększenia jest niedostępna", + "noCursorTelemetry": "Brak danych o kursorze w tym nagraniu", + "noCursorTelemetryDescription": "Nagraj ekran za pomocą OpenScreen, aby uzyskać powiększenia śledzące kursor.", + "noUsableTelemetry": "Za mało ruchu kursora", + "noUsableTelemetryDescription": "Nagranie nie zawiera wystarczającej ilości danych o ruchu kursora.", + "noDwellMoments": "Nie znaleziono wyraźnych momentów zatrzymania kursora", + "noDwellMomentsDescription": "Spróbuj nagrania z dłuższymi pauzami kursora przy ważnych działaniach.", + "noAutoZoomSlots": "Brak miejsca na automatyczne powiększenia", + "noAutoZoomSlotsDescription": "Znalezione momenty mają już powiększenia.", + "cannotPlaceTrim": "Nie można tutaj umieścić przycięcia", + "trimExistsAtLocation": "W tym miejscu już jest przycięcie lub brakuje miejsca.", + "cannotPlaceSpeed": "Nie można tutaj umieścić zmiany prędkości", + "speedExistsAtLocation": "W tym miejscu już jest obszar zmiany prędkości lub brakuje miejsca.", + "cannotPlaceCameraFullscreen": "Nie można tutaj umieścić Pełnej kamery", + "cameraFullscreenExistsAtLocation": "W tym miejscu już jest segment Pełnej kamery lub brakuje miejsca." + }, + "success": { + "addedZoomSuggestions": "Dodano {{count}} sugestię powiększenia opartą na kursorze", + "addedZoomSuggestionsPlural": "Dodano {{count}} sugestie powiększenia oparte na kursorze" + }, + "toolbar": { + "autoEnhance": "Automatyczne ulepszanie", + "automaticZooms": "Automatyczne powiększenia", + "automaticZoomsHint": "Na podstawie zarejestrowanych kliknięć", + "smartZoomsAndCuts": "Inteligentne cięcia", + "smartZoomsAndCutsHint": "Z AI", + "timelineTools": "Narzędzia osi czasu", + "arrangeClips": "Ułóż klipy", + "arrangeClipsHint": "Przeciągnij klipy poniżej, aby zmienić kolejność lub dodać nowe", + "newAnnotation": "Adnotacja", + "dragToReorderHint": "Przeciągnij, aby zmienić kolejność. Kliknij dwukrotnie, aby zmienić początek i koniec.", + "editInOutPoints": "Edytuj początek i koniec", + "deleteClip": "Usuń klip", + "dropToAdd": "Upuść, aby dodać do osi czasu", + "importRecordingFirst": "Najpierw zaimportuj nagranie", + "noAutoZoomMoments": "Nie znaleziono momentów do automatycznego powiększenia", + "noAutoZoomMomentsDescription": "To nagranie nie ma zarejestrowanych kliknięć albo żadnego z miejscem na powiększenie.", + "addedAutoZoom": "Dodano {{count}} automatyczne powiększenie", + "addedAutoZoomPlural": "Dodano {{count}} automatyczne powiększenia", + "autoZoomFailed": "Automatyczne powiększanie nie powiodło się", + "aiEnhanceRequested": "Poproszono agenta AI o wycięcie martwego czasu", + "smartCutsWaiting": "Transkrypcja… gotowe za chwilę", + "smartCutsNeedsTranscript": "Wymaga transkrypcji", + "smartCutsNoAudio": "Ten materiał nie ma dźwięku", + "smartCutsNoSpeech": "Nie wykryto mowy", + "smartCutsFailed": "Transkrypcja nie powiodła się — ponów ją z sekcji Multimedia", + "addAudioTooltip": "Dodaj dźwięk", + "addedWord": "Dodano słowo: „{{word}}” — nie ma pod nim dźwięku" + }, + "audio": { + "addVoiceover": "Dodaj lektora", + "addVoiceoverHint": "Nagraj narrację nad wideo", + "subtitle": "Umieść na osi czasu warstwę lektora lub muzyki w tle", + "record": "Nagraj lektora", + "importFile": "Importuj plik audio", + "importFileHint": "Dodaj muzykę lub plik audio", + "recording": "Nagrywanie", + "recordingHint": "Mów razem z wideo — jest odtwarzane podczas nagrywania", + "stop": "Stop", + "micDenied": "Odmówiono dostępu do mikrofonu", + "recordingUnavailable": "Nagrywanie nie jest tutaj dostępne", + "saveFailed": "Nie udało się zapisać nagrania", + "importFailed": "Nie udało się zaimportować pliku audio" + }, + "tracks": { + "annotation": "Warstwa adnotacji {{index}}", + "dragHint": "Przeciągnij w lewo lub w prawo, aby przesunąć w czasie. Przeciągnij w górę lub w dół, aby zmienić warstwę; wyższe warstwy są na wierzchu." + }, + "layouts": { + "title": "Układy", + "changeHere": "Zmień układ tutaj", + "wholeVideo": "Całe wideo", + "sharedSettings": "Ustawienia kamery · całe wideo", + "fromUntil": "Od {{start}} do {{end}}", + "noCamera": "Brak kamery w tym materiale; pokazywany jest tylko ekran.", + "removeChange": "Usuń tę zmianę", + "moveBoundary": "Przesuń zmianę na {{time}}", + "picture-in-picture": "Obraz w obrazie", + "dual-frame": "Obok siebie", + "vertical-stack": "Góra / dół", + "camera-only": "Tylko kamera", + "no-webcam": "Tylko ekran" + } +}