From eb42a3231530646a56ce20072eb60cdd4609c7ef Mon Sep 17 00:00:00 2001 From: Hive Mind Date: Thu, 25 Jun 2026 20:32:52 +0200 Subject: [PATCH] feat(i18n): add Polish (pl) translation (#1185) * Translated settings. Added polish option to other languages and in the fronted UI itself. Translated settings to polish * Corrections to the settings. Translated help page * Translated orbit. Made corrections to help and settings * playlists translated * deviceSync translated * search translated * Statistics translated * musicNetwork translated * common translated * player translated * queue translated * albumDetails translated * connection and random mix translated * artistDefails translated * albums translated * smartPlaylists translated * nowPlaying translated. smartPlaylists corrections * sidebar translated * contextMenu translated * translated radio * translated sharePaste * favorites translated * nowPlayingInfo translated * translated home and login * translated artists, genres, licences, migration, mostPlayed, songInfo and tracks * translated changelog, composerDetail, composers, entityRating, folderBrowser, hero, losslessAlbums, luckyMix, miniPlayer, randomAlbums, randomLanding, tray and whatsNew * chore(release): CHANGELOG and credits for Polish locale (PR #1185) * chore(release): mention Polish in 1.49.0 What's New highlights * settings updated with new strings. Deleted old unecessary ones * translated missing translations * Fixed typos * translated missing strings * Added missing translations that appeared in #1186 and #1189 --- CHANGELOG.md | 6 + WHATS_NEW.md | 4 +- src/components/settings/SystemTab.tsx | 1 + src/config/settingsCredits.ts | 7 + src/i18n.ts | 2 + src/locales/de/settings.ts | 1 + src/locales/en/settings.ts | 1 + src/locales/es/settings.ts | 1 + src/locales/fr/settings.ts | 1 + src/locales/nb/settings.ts | 1 + src/locales/nl/settings.ts | 1 + src/locales/pl/albumDetail.ts | 58 ++ src/locales/pl/albums.ts | 41 ++ src/locales/pl/artistDetail.ts | 52 ++ src/locales/pl/artists.ts | 19 + src/locales/pl/changelog.ts | 5 + src/locales/pl/common.ts | 70 +++ src/locales/pl/composerDetail.ts | 11 + src/locales/pl/composers.ts | 10 + src/locales/pl/connection.ts | 46 ++ src/locales/pl/contextMenu.ts | 33 ++ src/locales/pl/deviceSync.ts | 80 +++ src/locales/pl/entityRating.ts | 9 + src/locales/pl/favorites.ts | 26 + src/locales/pl/folderBrowser.ts | 4 + src/locales/pl/genres.ts | 15 + src/locales/pl/help.ts | 115 ++++ src/locales/pl/hero.ts | 9 + src/locales/pl/home.ts | 21 + src/locales/pl/index.ts | 95 ++++ src/locales/pl/licenses.ts | 13 + src/locales/pl/login.ts | 22 + src/locales/pl/losslessAlbums.ts | 7 + src/locales/pl/luckyMix.ts | 6 + src/locales/pl/migration.ts | 15 + src/locales/pl/miniPlayer.ts | 9 + src/locales/pl/mostPlayed.ts | 13 + src/locales/pl/musicNetwork.ts | 55 ++ src/locales/pl/nowPlaying.ts | 48 ++ src/locales/pl/nowPlayingInfo.ts | 24 + src/locales/pl/orbit.ts | 201 +++++++ src/locales/pl/player.ts | 69 +++ src/locales/pl/playlists.ts | 122 +++++ src/locales/pl/queue.ts | 64 +++ src/locales/pl/radio.ts | 37 ++ src/locales/pl/randomAlbums.ts | 4 + src/locales/pl/randomLanding.ts | 9 + src/locales/pl/randomMix.ts | 40 ++ src/locales/pl/search.ts | 87 +++ src/locales/pl/settings.ts | 759 ++++++++++++++++++++++++++ src/locales/pl/sharePaste.ts | 20 + src/locales/pl/sidebar.ts | 45 ++ src/locales/pl/smartPlaylists.ts | 41 ++ src/locales/pl/songInfo.ts | 27 + src/locales/pl/statistics.ts | 93 ++++ src/locales/pl/tracks.ts | 16 + src/locales/pl/tray.ts | 8 + src/locales/pl/whatsNew.ts | 12 + src/locales/ro/settings.ts | 1 + src/locales/ru/settings.ts | 1 + src/locales/zh/settings.ts | 1 + src/pages/Login.tsx | 1 + 62 files changed, 2613 insertions(+), 2 deletions(-) create mode 100644 src/locales/pl/albumDetail.ts create mode 100644 src/locales/pl/albums.ts create mode 100644 src/locales/pl/artistDetail.ts create mode 100644 src/locales/pl/artists.ts create mode 100644 src/locales/pl/changelog.ts create mode 100644 src/locales/pl/common.ts create mode 100644 src/locales/pl/composerDetail.ts create mode 100644 src/locales/pl/composers.ts create mode 100644 src/locales/pl/connection.ts create mode 100644 src/locales/pl/contextMenu.ts create mode 100644 src/locales/pl/deviceSync.ts create mode 100644 src/locales/pl/entityRating.ts create mode 100644 src/locales/pl/favorites.ts create mode 100644 src/locales/pl/folderBrowser.ts create mode 100644 src/locales/pl/genres.ts create mode 100644 src/locales/pl/help.ts create mode 100644 src/locales/pl/hero.ts create mode 100644 src/locales/pl/home.ts create mode 100644 src/locales/pl/index.ts create mode 100644 src/locales/pl/licenses.ts create mode 100644 src/locales/pl/login.ts create mode 100644 src/locales/pl/losslessAlbums.ts create mode 100644 src/locales/pl/luckyMix.ts create mode 100644 src/locales/pl/migration.ts create mode 100644 src/locales/pl/miniPlayer.ts create mode 100644 src/locales/pl/mostPlayed.ts create mode 100644 src/locales/pl/musicNetwork.ts create mode 100644 src/locales/pl/nowPlaying.ts create mode 100644 src/locales/pl/nowPlayingInfo.ts create mode 100644 src/locales/pl/orbit.ts create mode 100644 src/locales/pl/player.ts create mode 100644 src/locales/pl/playlists.ts create mode 100644 src/locales/pl/queue.ts create mode 100644 src/locales/pl/radio.ts create mode 100644 src/locales/pl/randomAlbums.ts create mode 100644 src/locales/pl/randomLanding.ts create mode 100644 src/locales/pl/randomMix.ts create mode 100644 src/locales/pl/search.ts create mode 100644 src/locales/pl/settings.ts create mode 100644 src/locales/pl/sharePaste.ts create mode 100644 src/locales/pl/sidebar.ts create mode 100644 src/locales/pl/smartPlaylists.ts create mode 100644 src/locales/pl/songInfo.ts create mode 100644 src/locales/pl/statistics.ts create mode 100644 src/locales/pl/tracks.ts create mode 100644 src/locales/pl/tray.ts create mode 100644 src/locales/pl/whatsNew.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 670c6ab2..cfc1b5eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Psysonic is now available in **Hungarian (Magyar)** — pick it from the language menu on the Settings and Login screens. +### Polish translation + +**By [@Rextens](https://github.com/Rextens), PR [#1185](https://github.com/Psychotoxical/psysonic/pull/1185)** + +* Full Polish (Polski) UI translation — selectable from the language picker on the Settings and Login screens. + ### Artist artwork from fanart.tv **By [@Psychotoxical](https://github.com/Psychotoxical), PR [#1137](https://github.com/Psychotoxical/psysonic/pull/1137)** diff --git a/WHATS_NEW.md b/WHATS_NEW.md index 908b13dd..bfac7156 100644 --- a/WHATS_NEW.md +++ b/WHATS_NEW.md @@ -34,9 +34,9 @@ Within each section, order by **user impact** (most noticeable first) — not PR - Settings are grouped into clear, labelled panels so related options sit together — less hunting around. The **Native Hi-Res Playback** option now explains in plain language what it actually does. - **Normalization** and **Track transitions** are now their own sections under **Settings → Audio**, and the queue options (display mode, toolbar, and Play-Next order) are gathered into one **Queue Settings** group under **Personalisation**. -### Japanese and Hungarian — now in your language +### Japanese, Hungarian, and Polish — now in your language -- Psysonic is now available in **Japanese (日本語)** and **Hungarian (Magyar)** — pick either from the language menu on the **Settings** and **Login** screens. +- Psysonic is now available in **Japanese (日本語)**, **Hungarian (Magyar)**, and **Polish (Polski)** — pick any of them from the language menu on the **Settings** and **Login** screens. ### Theme store — spot updates, pick your style diff --git a/src/components/settings/SystemTab.tsx b/src/components/settings/SystemTab.tsx index 15e9e5b2..2ad3b0ea 100644 --- a/src/components/settings/SystemTab.tsx +++ b/src/components/settings/SystemTab.tsx @@ -76,6 +76,7 @@ export function SystemTab() { { value: 'ro', label: t('settings.languageRo') }, { value: 'ja', label: t('settings.languageJa') }, { value: 'hu', label: t('settings.languageHu') }, + { value: 'pl', label: t('settings.languagePl') }, ]} /> diff --git a/src/config/settingsCredits.ts b/src/config/settingsCredits.ts index bccc06ad..636ca77f 100644 --- a/src/config/settingsCredits.ts +++ b/src/config/settingsCredits.ts @@ -413,6 +413,13 @@ const CONTRIBUTOR_ENTRIES = [ 'Japanese (ja) full UI translation (PR #1134)', ], }, + { + github: 'Rextens', + since: '1.49.0', + contributions: [ + 'Polish (pl) full UI translation (PR #1185)', + ], + }, ] as const; // PR number of a contributor's first listed contribution, used as the diff --git a/src/i18n.ts b/src/i18n.ts index e082e637..808844d0 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -11,6 +11,7 @@ import { esTranslation } from './locales/es'; import { roTranslation } from './locales/ro'; import { jaTranslation } from './locales/ja'; import { huTranslation } from './locales/hu'; +import { plTranslation } from './locales/pl'; const savedLanguage = localStorage.getItem('psysonic_language') || 'en'; @@ -29,6 +30,7 @@ i18n ro: { translation: roTranslation }, ja: { translation: jaTranslation }, hu: { translation: huTranslation }, + pl: { translation: plTranslation }, }, lng: savedLanguage, fallbackLng: 'en', diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts index d3d3c560..44f0509e 100644 --- a/src/locales/de/settings.ts +++ b/src/locales/de/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Schriftart', fontHintOpenDyslexic: 'Legasthenie-freundlich · keine Chinesisch-Unterstützung', theme: 'Design', diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.ts index 63aa8b8d..8eb28f5e 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Font', fontHintOpenDyslexic: 'Dyslexia-friendly · no Chinese support', theme: 'Theme', diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts index 3d823a06..eb2f83f5 100644 --- a/src/locales/es/settings.ts +++ b/src/locales/es/settings.ts @@ -10,6 +10,7 @@ export const settings = { languageRu: 'Русский', languageZh: '中文', languageRo: 'Română', + languagePl: 'Polski', languageJa: '日本語', languageHu: 'Magyar', font: 'Fuente', diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts index 483f7814..8a35566a 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Police', fontHintOpenDyslexic: 'Adapté à la dyslexie · sans prise en charge du chinois', theme: 'Thème', diff --git a/src/locales/nb/settings.ts b/src/locales/nb/settings.ts index 4b2bf269..cbd1534e 100644 --- a/src/locales/nb/settings.ts +++ b/src/locales/nb/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Skrifttype', fontHintOpenDyslexic: 'Dyslexivennlig · ingen kinesisk støtte', theme: 'Tema', diff --git a/src/locales/nl/settings.ts b/src/locales/nl/settings.ts index d3076169..e56181ed 100644 --- a/src/locales/nl/settings.ts +++ b/src/locales/nl/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Lettertype', fontHintOpenDyslexic: 'Dyslexie-vriendelijk · geen Chinese ondersteuning', theme: 'Thema', diff --git a/src/locales/pl/albumDetail.ts b/src/locales/pl/albumDetail.ts new file mode 100644 index 00000000..3a92cf58 --- /dev/null +++ b/src/locales/pl/albumDetail.ts @@ -0,0 +1,58 @@ +export const albumDetail = { + back: 'Powrót', + orbitDoubleClickHint: 'Naciśnij dwukrotnie by dodać ten utwór do kolejki Orbit', + playAll: 'Odtwórz wszystkie', + shareAlbum: 'Udostępnij album', + enqueue: 'Dodaj do kolejki', + enqueueTooltip: 'Dodaj cały album do kolejki', + artistBio: 'Biografia wykonawcy', + download: 'Pobierz (ZIP)', + playTooltip: 'Odtwórz ten album', + artistBioTooltip: 'Przeczytaj biografię wykonawcy', + downloadTooltip: 'Pobierz ten album jako ZIP', + downloading: 'Ładowanie…', + cacheOffline: 'Uczyń dostępnym offline', + offlineCached: 'Dostępne offline', + offlineQueued: 'W kolejce', + offlineDownloading: 'Pobieranie… ({{n}}/{{total}})', + removeOffline: 'Usuń z pamięci', + removeFromOfflineQueue: 'Usuń z kolejki offline', + offlineStorageFull: 'Pamięć offline jest pełna (limit: {{mb}} MB). Zwolnij miejsce, usuwając album z Biblioteki offline, albo zwiększ limit w Ustawieniach.', + offlineStorageGoToLibrary: 'Biblioteka offline', + offlineStorageGoToSettings: 'Ustawienia', + favoriteAdd: 'Dodaj do ulubionych', + favoriteRemove: 'Usuń z ulubionych', + favorite: 'Ulubione', + noBio: 'Brak dostępnej biografii.', + moreByArtist: 'Więcej od {{artist}}', + tracksCount: '{{n}} utwory', + goToArtist: 'Przejdź do {{artist}}', + moreLabelAlbums: 'Więcej albumów z wytwórni {{label}}', + moreGenreAlbums: 'Więcej albumów w gatunku {{genre}}', + genresModalTitle: 'Gatunki', + showAllGenres: 'Pokaż wszystkie gatunki', + trackTitle: 'Tytuł', + trackAlbum: 'Album', + trackArtist: 'Wykonawca', + trackGenre: 'Gatunek', + trackPlayCount: 'Pdtworzenia', + trackLastPlayed: 'Ostatnio odtworzono', + trackBpm: 'BPM', + trackFormat: 'Format', + trackFavorite: 'Ulubione', + trackRating: 'Ocena', + trackDuration: 'Czas trwania', + trackTotal: 'Łącznie', + columns: 'Kolumny', + resetColumns: 'Przywróć domyślne', + notFound: 'Nie znaleziono albumu.', + bioModal: 'Biografia wykonawcy', + bioClose: 'Zamknij', + ratingLabel: 'Ocena', + enlargeCover: 'Powiększ', + filterSongs: 'Filtruj utwory…', + sortNatural: 'Naturalnie', + sortByTitle: 'A–Z (Tytuł)', + sortByArtist: 'A–Z (Wykonawca)', + sortByAlbum: 'A–Z (Album)', +}; diff --git a/src/locales/pl/albums.ts b/src/locales/pl/albums.ts new file mode 100644 index 00000000..59cfb7a8 --- /dev/null +++ b/src/locales/pl/albums.ts @@ -0,0 +1,41 @@ +export const albums = { + title: 'Wszystkie albumy', + sortByName: 'A–Z (Album)', + sortByArtist: 'A–Z (Wykonawca)', + sortByArtistYear: 'Wykonawca → Rok', + sortNewest: 'Od najnowszych', + sortRandom: 'Losowo', + yearFrom: 'Od', + yearTo: 'Do', + yearFilterClear: 'Wyczyść filtr roku', + yearFilterLabel: 'Rok', + sortTooltip: 'Zmień kolejność sortowania', + yearFilterTooltip: 'Filtruj według roku wydania', + compilationLabel: 'Kompilacje', + compilationOnly: 'Tylko kompilacje', + compilationHide: 'Ukryj kompilacje', + compilationTooltipAll: 'Wszystkie albumy · kliknij: tylko kompilacje', + compilationTooltipOnly: 'Tylko kompilacje · kliknij: ukryj kompilacje', + compilationTooltipHide: 'Kompilacje ukryte · kliknij: pokaż wszystkie', + losslessLabel: 'Bezstratne', + losslessTooltipOn: 'Tylko albumy w jakości bezstratnej · kliknij: pokaż wszystkie', + losslessTooltipOff: 'Pokaż tylko albumy w jakości bezstratnej', + select: 'Wielokrotny wybór', + startSelect: 'Włącz wybór wielokrotny', + cancelSelect: 'Anuluj', + selectionCount: '{{count}} wybranych', + downloadZips: 'Pobierz ZIPy', + addOffline: 'Dodaj offline', + enqueueSelected_one: 'Dodaj do kolejki ({{count}})', + enqueueSelected_other: 'Dodaj do kolejki ({{count}})', + enqueueQueued_one: 'Dodano {{count}} album do kolejki', + enqueueQueued_other: 'Dodano {{count}} albumów do kolejki', + downloadingZip: 'Pobieranie {{current}}/{{total}}: {{name}}', + downloadZipDone: 'Pobrano {{count}} ZIP(ów)', + downloadZipFailed: 'Nie udało się pobrać {{name}}', + offlineQueuing: 'Dodawanie {{count}} albumów do kolejki offline…', + offlineFailed: 'Nie udało się zapisać offline: {{name}}', + noFavorites: 'Brak ulubionych albumów pasujących do bieżących filtrów.', + noCompilations: 'Brak kompilacji pasujących do bieżących filtrów.', + noMatchingFilters: 'Brak albumów pasujących do bieżących filtrów.', +}; diff --git a/src/locales/pl/artistDetail.ts b/src/locales/pl/artistDetail.ts new file mode 100644 index 00000000..c703651f --- /dev/null +++ b/src/locales/pl/artistDetail.ts @@ -0,0 +1,52 @@ +export const artistDetail = { + back: 'Powrót', + albums: 'Albumy', + album: 'Album', + playAll: 'Odtwórz wszystkie', + shareArtist: 'Udostępnij wykonawcę', + shuffle: 'Przetasuj', + radio: 'Radio', + lastfmTooltip: 'Otwórz tego wykonawcę na Last.fm', + wikipediaTooltip: 'Otwórz tego wykonawcę na Wikipedii', + playAllTooltip: 'Odtwórz całą dyskografię', + shuffleTooltip: 'Przetasuj całą dyskografię', + radioTooltip: 'Rozpocznij radio w oparciu o tego wykonawcę', + loading: 'Ładowanie…', + noRadio: 'Nie znaleziono podobnych utworów dla tego wykonawcy.', + notFound: 'Wykonawca nie znaleziony.', + albumsBy: 'Album autorstwa {{name}}', + albumsByLossless: 'Album w bezstratnej jakości wykonawcy {{name}}', + sortYearToggleAria: 'Przełącz sortowanie albumów według roku w ramach każdego typu wydania', + sortYearDesc: 'Rok, od najnowszych', + sortYearAsc: 'Rok, od najstarszych', + topTracks: 'Najpopularniejsze utwory', + topTracksLossless: 'Beztratne utwory', + noAlbums: 'Nie znaleziono albumów.', + trackTitle: 'Tytuł', + trackAlbum: 'Album', + trackDuration: 'Czas trwania', + favoriteAdd: 'Dodaj do ulubionych', + favoriteRemove: 'Usuń z ulubionych', + favorite: 'Ulubione', + albumCount_one: '{{count}} album', + albumCount_other: '{{count}} albumów', + openedInBrowser: 'Otwarto w przeglądarce', + featuredOn: 'Występuje też na', + similarArtists: 'Podobni wykonawcy', + cacheOffline: 'Zapisz dyskografię offline', + offlineCached: 'Dyskografia zapisana offline', + offlineQueued: 'W kolejce', + offlineDownloading: 'Zapisywanie offline… ({{done}}/{{total}} albumów)', + uploadImage: 'Prześlij zdjęcie wykonawcy', + uploadImageError: 'Nie udało się przesłać zdjęcia', + releaseTypes: { + album: 'Album', + ep: 'EP', + single: 'Singiel', + compilation: 'Kompilacja', + live: 'Na żywo', + soundtrack: 'Ścieżka dźwiękowa', + remix: 'Remix', + other: 'Inne', + }, +}; diff --git a/src/locales/pl/artists.ts b/src/locales/pl/artists.ts new file mode 100644 index 00000000..5c1643ea --- /dev/null +++ b/src/locales/pl/artists.ts @@ -0,0 +1,19 @@ +export const artists = { + title: 'Wykonawcy', + search: 'Szukaj…', + all: 'Wscyscy', + other: 'Inni', + gridView: 'Widok siatki', + listView: 'Widok listy', + imagesOn: 'Zdjęcia wykonawców włączone — mogą zwiększyć obciążenie sieci i systemu', + imagesOff: 'Zdjęcia wykonawców wyłączone — pokazywane są tylko inicjały', + loadMore: 'Wczytaj więcej', + notFound: 'Nie znaleziono wykonawców.', + albumCount_one: '{{count}} album', + albumCount_other: '{{count}} albumów', + selectionCount: 'Zaznaczono: {{count}}', + select: 'Wybór wielokrotny', + startSelect: 'Włącz wybór wielokrotny', + cancelSelect: 'Anuluj', + addToPlaylist: 'Dodaj do playlisty', +}; diff --git a/src/locales/pl/changelog.ts b/src/locales/pl/changelog.ts new file mode 100644 index 00000000..d13f6939 --- /dev/null +++ b/src/locales/pl/changelog.ts @@ -0,0 +1,5 @@ +export const changelog = { + modalTitle: "Co nowego", + dontShowAgain: "Nie pokazuj ponownie", + close: 'Rozumiem', +}; diff --git a/src/locales/pl/common.ts b/src/locales/pl/common.ts new file mode 100644 index 00000000..403dda0f --- /dev/null +++ b/src/locales/pl/common.ts @@ -0,0 +1,70 @@ +export const common = { + albums: 'Albumy', + album: 'Album', + loading: 'Ładowanie…', + loadingMore: 'Ładowanie…', + loadingPlaylists: 'Ładowanie playlist…', + noAlbums: 'Nie znaleziono żadnych albumów.', + downloading: 'Pobieranie…', + downloadZip: 'Pobierz (ZIP)', + back: 'Wstecz', + backToTop: 'Wróć na górę', + cancel: 'Anuluj', + close: 'Zamknij', + save: 'Zapisz', + delete: 'Usuń', + use: 'Użyj', + add: 'Dodaj', + new: 'Nowy', + active: 'Aktywuj', + download: 'Pobierz', + chooseDownloadFolder: 'Wybierz folder pobierania', + noFolderSelected: 'Nie wybrano folderu', + rememberDownloadFolder: 'Zapamiętaj ten folder', + filterGenre: 'Filtr gatunku', + filterGenreTooltip: 'Filtruj według gatunku', + filterSearchGenres: 'Szukaj gatunku…', + filterNoGenres: 'Brak pasujących gatunków', + filterClear: 'Wyczyść', + favorites: 'Ulubione', + favoritesTooltipOff: 'Pokaż tylko ulubione', + favoritesTooltipOn: 'Pokaż wszystkie', + play: 'Odtwórz', + addToQueue: 'Dodaj do kolejki', + bulkSelected: 'Zaznaczono: {{count}}', + clearSelection: 'Wyczyść zaznaczenie', + bulkAddToPlaylist: 'Dodaj do playlisty', + bulkRemoveFromPlaylist: 'Usuń z playlisty', + bulkClear: 'Wyczyść zaznaczenie', + updaterAvailable: 'Aktualizacja dostępna', + updaterVersion: 'Wersja v{{version}} dostępna', + updaterWebsite: 'Strona internetowa', + updaterModalTitle: 'Nowa wersja dostępna', + updaterChangelog: "Co nowego", + updaterDownloadBtn: 'Pobierz teraz', + updaterSkipBtn: 'Pomiń tę wersję', + updaterRemindBtn: 'Przypomnij mi później', + updaterDone: 'Pobieranie zakończone', + updaterShowFolder: 'Pokaż w folderze', + updaterInstallHint: 'Zamknij PsySonic i uruchom instalator ręcznie.', + updaterAurHint: 'Zainstaluj aktualizację przez AUR:', + updaterErrorMsg: 'Pobieranie nie powiodło się', + updaterRetryBtn: 'Spróbuj ponownie', + updaterInstallNow: 'Zainstaluj teraz', + updaterMacReadyTitle: 'Gotowe do instalacji', + updaterMacReady: 'Aktualizacja zostanie pobrana, zweryfikowana i zastosowana w miejscu — plik DMG nie jest potrzebny. Po zakończeniu aplikacja uruchomi się ponownie automatycznie.', + updaterTrustNotarized: 'Poświadczone przez Apple', + updaterTrustSignature: 'Podpis zweryfikowany', + updaterMacDoneTitle: 'Aktualizacja zainstalowana', + updaterRestartingIn: 'Ponowne uruchomienie za {{n}} s…', + updaterRestarting: 'Ponowne uruchamianie…', + updaterRestartNow: 'Uruchom ponownie teraz', + durationHoursMinutes: '{{hours}} godz. {{minutes}} min.', + durationMinutesOnly: '{{minutes}} min.', + updaterOpenGitHub: 'Otwórz w GitHubie', + filters: 'Filtry', + more: 'więcej', + yearRange: 'Zakres lat', + clearAll: 'Wyczyść wszystko', + libraryEmpty: 'Twoja biblioteka jest pusta.', +}; diff --git a/src/locales/pl/composerDetail.ts b/src/locales/pl/composerDetail.ts new file mode 100644 index 00000000..5bc8ea3b --- /dev/null +++ b/src/locales/pl/composerDetail.ts @@ -0,0 +1,11 @@ +export const composerDetail = { + back: 'Powrót', + notFound: 'Kompozytor nie znaleziony.', + about: 'O tym kompozytorze', + works: 'Dzieła', + noWorks: 'Nie znaleziono dzieł.', + workCount_one: '{{count}} dzieło', + workCount_other: '{{count}} dzieł', + shareComposer: 'Udostępnij kompozytora', + unknownComposer: 'Kompozytor', +}; diff --git a/src/locales/pl/composers.ts b/src/locales/pl/composers.ts new file mode 100644 index 00000000..58a19d5c --- /dev/null +++ b/src/locales/pl/composers.ts @@ -0,0 +1,10 @@ +export const composers = { + title: 'Kompozytorzy', + search: 'Szukaj…', + notFound: 'Nie znaleziono kompozytorów.', + unsupported: 'Przeglądanie według kompozytora wymaga Navidrome 0.55 lub nowszego.', + loadFailed: 'Nie udało się wczytać kompozytorów.', + retry: 'Spróbuj ponownie', + involvedIn_one: 'Udział w {{count}} albumie', + involvedIn_other: 'Udział w {{count}} albumach', +}; diff --git a/src/locales/pl/connection.ts b/src/locales/pl/connection.ts new file mode 100644 index 00000000..cc5aab46 --- /dev/null +++ b/src/locales/pl/connection.ts @@ -0,0 +1,46 @@ +export const connection = { + connected: 'Połączonoa', + connectedTo: 'Połączono z {{server}}', + disconnected: 'Rozłączono', + disconnectedFrom: 'Nie można było się połączyć z {{server}} — kliknij, aby sprawdzić ustawienia', + checking: 'Łączenie…', + extern: 'Zewnętrzne', + offlineTitle: 'Brak połączenia z serwerem', + offlineSubtitle: 'Nie można połączyć się z {{server}}. Sprawdź sieć lub serwer.', + offlineModeBanner: 'Tryb offline — odtwarzanie z lokalnej pamięci podręcznej', + offlineNoCacheBanner: 'Brak połączenia z serwerem — nie można połączyć się z {{server}}', + offlineLibraryTitle: 'Biblioteka offline', + offlineLibraryDiskLabel: 'Na dysku', + offlineLibraryDiskUsage: 'Na dysku: {{size}}', + offlineLibraryDiskUsageLoading: 'Na dysku: …', + offlineLibraryDiskTierLibrary: 'Biblioteka offline (media/library): {{size}}', + offlineLibraryDiskTierFavorites: 'Ulubione (media/favorites): {{size}}', + offlineLibraryEmpty: 'Nie zapisano jeszcze żadnych albumów offline. Przejdź online, otwórz album i kliknij „Udostępnij offline”.', + offlinePlaybackUnavailable: 'Brakuje lokalnych plików tego albumu albo nie zostały zindeksowane.', + offlineCachedOnServer: 'Na {{server}}', + offlineAlbumCount: '{{n}} album', + offlineAlbumCount_plural: '{{n}} albumów', + offlineFilterAll: 'Wszystko', + offlineFilterAlbums: 'Albumy', + offlineFilterPlaylists: 'Playlisty', + offlineFilterArtists: 'Dyskografie', + offlineCacheQueueTitle: 'Pamięć podręczna kolejki', + offlineCacheQueueSubtitle: '{{n}} utworów w media/cache — przetasuj i odtwórz', + offlineCacheQueuePlayAria: 'Przetasuj i odtwórz wszystkie utwory z pamięci podręcznej', + offlineFavoritesQueueTitle: 'Ulubione', + offlineFavoritesQueuePlayAria: 'Przetasuj i odtwórz wszystkie ulubione zapisane offline', + retry: 'Ponów', + serverSettings: 'Ustawienia serwera', + switchServerTitle: 'Przełącz serwer', + switchServerHint: 'Kliknij, aby wybrać inny zapisany serwer.', + manageServers: 'Zarządzaj serwerami…', + switchFailed: 'Nie udało się przełączyć — serwer nieosiągalny.', + queueSynced: 'Kolejka jest zsynchronizowana z serwerem', + queuePullHint: 'Kliknij, aby pobrać kolejkę odtwarzania z {{server}}', + queueLocalEditHint: 'Kolejka odtwarzania została zmieniona lokalnie — automatyczna synchronizacja wstrzymana. Kliknij, aby pobrać ją z serwera.', + queuePulling: 'Pobieranie kolejki odtwarzania…', + queuePullSuccess: 'Kolejka odtwarzania została zaktualizowana z serwera', + queuePullEmpty: 'Kolejka odtwarzania na serwerze jest pusta', + queuePullFailed: 'Nie udało się pobrać kolejki odtwarzania z serwera', + queuePullAria: 'Synchronizuj kolejkę odtwarzania z serwera', +}; diff --git a/src/locales/pl/contextMenu.ts b/src/locales/pl/contextMenu.ts new file mode 100644 index 00000000..07bf6270 --- /dev/null +++ b/src/locales/pl/contextMenu.ts @@ -0,0 +1,33 @@ +export const contextMenu = { + playNow: 'Odtwarzane teraz', + playNext: 'Odtwarzane jako następne', + addToQueue: 'Dodaj do kolejki', + enqueueAlbum: 'Dodaj album do kolejki', + enqueueAlbums_one: 'Dodaj {{count}} album do kolejki', + enqueueAlbums_other: 'Dodaj {{count}}aAlbumów do kolejki', + startRadio: 'Rozpocznij radio', + instantMix: 'Natychmiastowy miks', + instantMixFailed: 'Nie można było stworzyć natychmiastowego miksu — błąd serwera lub pluginu.', + cliMixNeedsTrack: 'Nic nie jest odtwarzane — najpierw rozpocznij odtwarzanie, a potem ponownie uruchom polecenie miksu.', + networkLove: 'Pulub w {{provider}}', + networkUnlove: 'Usuń z pulubionych w {{provider}}', + favorite: 'Dodaj do ulubionych', + favoriteArtist: 'Dodaj wykonawcę do ulubionych', + favoriteAlbum: 'Dodaj album do ulubionych', + unfavorite: 'Usuń z ulubionych', + unfavoriteArtist: 'Usuń wykonawcę z ulubionych', + unfavoriteAlbum: 'Usuń album z ulubionych', + removeFromQueue: 'Usuń z kolejki', + removeFromPlaylist: 'Usuń z playlisty', + openAlbum: 'Otwórz album', + goToArtist: 'Przejdź do wykonawcy', + download: 'Pobierz (ZIP)', + addToPlaylist: 'Dodaj do playlisty', + selectedPlaylists: 'Wybrano {{count}} playlist', + selectedAlbums: 'Wybrano {{count}} albumów', + selectedArtists: 'Wybrano {{count}} wykonawców', + songInfo: 'Informacje o utworze', + shareLink: 'Skopiuj link udostępniania', + shareCopied: 'Link udostępniania skopiowany do schowka.', + shareCopyFailed: 'Nie można było skopiować linku do schowka.', +}; diff --git a/src/locales/pl/deviceSync.ts b/src/locales/pl/deviceSync.ts new file mode 100644 index 00000000..836854ea --- /dev/null +++ b/src/locales/pl/deviceSync.ts @@ -0,0 +1,80 @@ +export const deviceSync = { + title: 'Synchronizacja urządzeń', + targetFolder: 'Folder docelowy', + noFolderChosen: 'Nie wybrano folderu', + selectDrive: 'Wybierz dysk…', + refreshDrives: 'Odświerz dyski', + noDrivesDetected: 'Nie wykryto dysków wymiennych', + browseManual: 'Wskaż ręcznie…', + free: 'dostępne', + notMountedVolume: 'Target is not on a mounted volume. The drive may have been disconnected.', + chooseFolder: 'Wybierz…', + targetDevice: 'Urządzenie docelowe', + schemaLabel: 'Schemat nazewnictwa', + schemaHint: 'Stały schemat zapewniający niezawodną synchronizację między systemami. Playlisty są zapisywane jako .m3u8 i odwołują się do utworów z albumów — bez duplikatów na urządzeniu.', + migrateButton: 'Uporządkuj istniejące pliki…', + migrateTooltip: 'Zmień nazwy istniejących plików na urządzeniu zgodnie z nowym schematem (ze starego szablonu nazw plików).', + migrateTitle: 'Uporządkuj istniejące pliki', + migrateLoading: 'Analizowanie istniejących plików…', + migrateNothingToDo: 'Wszystkie istniejące pliki już pasują do nowego schematu — nie ma nic do zrobienia.', + migrateNoTemplate: 'Nie znaleziono starszego szablonu nazw plików na urządzeniu. Migracja ma zastosowanie tylko wtedy, gdy nośnik był synchronizowany z wersją PsySonic obsługującą własne szablony.', + migrateFilesToRename: 'plików zostanie przemianowanych', + migrateUnchanged: '{{n}} plików jest już we właściwej ścieżce', + migrateCollisions: '{{n}} plików nie można automatycznie przemianować (wiele utworów wskazuje na to samo miejsce docelowe). Zostaną pozostawione bez zmian — następna synchronizacja pobierze je ponownie do właściwej lokalizacji.', + migratePreviewNote: 'Stary szablok: {{tpl}}', + migrateExecuting: 'Przemianowywanie plików…', + migrateSuccess: 'Pomyślnie przemianowano {{n}} plików', + migrateFailed: 'Nie udało się przemianować {{n}} plików', + migrateShowErrors: 'Pokaż błędy', + migrateStart: 'Rozpocznij przemianowywanie', + onDevice: 'Menadżer urządzenia', + addSources: 'Dodaj…', + colName: 'Nazwa', + colType: 'Typ', + colStatus: 'Status', + syncResult: 'Przeniesiono: {{done}}, już aktualne: {{skipped}} (łącznie: {{total}})', + deleteFromDevice: 'Oznacz do usunięcia ({{count}})', + confirmDelete: 'Usunąć {{count}} elementów z urządzenia: {{names}}?', + deleteComplete: 'Z urządzenia usunięto {{count}} elementów.', + manifestImported: 'Zaimportowano {{count}} źródeł z manifestu urządzenia.', + selectedSources: 'Wybrane źródła', + noSourcesSelected: 'Nie wybrano żadnych źródeł. Kliknij elementy w przeglądarce, aby je dodać.', + clearAll: 'Wyczyść wszystkie', + tabPlaylists: 'Plyalist', + tabAlbums: 'Albumów', + tabArtists: 'Wykonawców', + searchPlaceholder: 'Szukaj…', + syncButton: 'Synchronizuj z urządzeniem', + actionTransfer: 'Przenieś na urządzenie', + actionDelete: 'Usuń z urządzenia', + actionApplyAll: 'Zastosuj wszystkie zmiany', + cancel: 'Anuluj', + noTargetDir: 'Wybierz najpierw folder docelowy.', + noSources: 'Wybierz choć jedno źródło.', + noTracks: 'Nie znaleziono żadnych utwórów w wskazanym źródle.', + fetchError: 'Nie udało się pobrać utworów z serwera.', + syncComplete: 'Synchronizacja zakończona.', + dismiss: 'Zamknij', + cancelSync: 'Anuluj', + syncCancelled: 'Synchronizacja anulowana (przeniesiono: {{done}} / {{total}}).', + statusSynced: 'Zsynchronizowane', + statusPending: 'Oczekujące', + statusDeletion: 'Do usunięcia', + markForDeletion: 'Oznacz do usunięcia', + undoDeletion: 'Cofnij usunięcie', + removeSource: 'Usuń', + syncInBackground: 'Synchronizacja rozpoczęta w tle — możesz przejść gdzie indziej.', + syncInProgress: '{{done}} / {{total}} utworów…', + scanningDevice: 'Skanowanie urządzenia…', + syncSummary: 'Podsumowanie synchronizacji', + calculating: 'Obliczanie wymaganych danych…', + filesToAdd: 'Pliki do dodania:', + filesToDelete: 'Pliki do usunięcia:', + netChange: 'Zmiana netto:', + availableSpace: 'Dostępne miejsce na dysku:', + spaceWarning: 'Ostrzeżenie: urządzenie docelowe nie zgłasza wystarczającej ilości miejsca na dysku.', + proceed: 'Rozpocznij synchronizację', + notEnoughSpace: 'Brak wystarczającego miejsca na dysku!', + liveSearch: ' Na żywo', + randomAlbumsLabel: 'Losowe albumy', +}; diff --git a/src/locales/pl/entityRating.ts b/src/locales/pl/entityRating.ts new file mode 100644 index 00000000..57cf9598 --- /dev/null +++ b/src/locales/pl/entityRating.ts @@ -0,0 +1,9 @@ +export const entityRating = { + albumShort: 'Ocena albumu', + artistShort: 'Ocena wykonawcy', + albumAriaLabel: 'Ocena albumu', + artistAriaLabel: 'Ocena wykonawcy', + selectedArtistsRatingAriaLabel: 'Ocena gwiazdkowa dla {{count}} wybranych wykonawców', + selectedAlbumsRatingAriaLabel: 'Ocena gwiazdkowa dla {{count}} wybranych albumów', + saveFailed: 'Nie udało się zapisać oceny.', +}; diff --git a/src/locales/pl/favorites.ts b/src/locales/pl/favorites.ts new file mode 100644 index 00000000..fea29952 --- /dev/null +++ b/src/locales/pl/favorites.ts @@ -0,0 +1,26 @@ +export const favorites = { + title: 'Ulubione', + empty: "Nie masz jeszcze żadnych ulubionych.", + artists: 'Wykonawcy', + albums: 'Albumy', + songs: 'Utwory', + enqueueAll: 'Dodaj wszystkie do kolejki', + enqueueSelected: 'Dodaj wybrane do kolejki', + playAll: 'Odtwórz wszystkie', + playSelected: 'Odtwórz wybrane', + removeSong: 'Usuń z ulubionych', + stations: 'Stacje radiowe', + showingFiltered: 'Pokazywanie {{filtered}} z {{total}} ({{artist}})', + showingCount: 'Pokazywanie {{filtered}} z {{total}}', + clearArtistFilter: 'Wyczyść filtr wykonawcy', + noFilterResults: 'Brak wyników dla wybranych filtrów.', + allArtists: 'Wszyscy wykonawcy', + topArtists: 'Najpopularniejsi wykonawcy według ulubionych', + topArtistsSongCount_one: '{{count}} utwór', + topArtistsSongCount_other: '{{count}} utwory', + offlineTooltip: 'Zapisz ulubione do słuchania offline', + offlineJobName: 'Ulubione', + offlineSemaphoreSyncing: 'Synchronizowanie ulubionych… {{saved}} z {{total}}', + offlineSemaphoreSynced: 'Wszystkie ulubione zapisano do słuchania offline', + offlineSemaphoreError: 'Błąd synchronizacji — niektóre utwory nie zostały zapisane', +}; diff --git a/src/locales/pl/folderBrowser.ts b/src/locales/pl/folderBrowser.ts new file mode 100644 index 00000000..c833da57 --- /dev/null +++ b/src/locales/pl/folderBrowser.ts @@ -0,0 +1,4 @@ +export const folderBrowser = { + empty: 'Pusty folder', + error: 'Nie udało się załadować', +}; diff --git a/src/locales/pl/genres.ts b/src/locales/pl/genres.ts new file mode 100644 index 00000000..6f5072e6 --- /dev/null +++ b/src/locales/pl/genres.ts @@ -0,0 +1,15 @@ +export const genres = { + title: 'Gatunki', + genreCount: 'Gatunki', + albumCount_one: '{{count}} album', + albumCount_other: '{{count}} albumów', + loading: 'Ładowanie gatunków…', + empty: 'Nie znaleziono gatunków.', + albumsLoading: 'Ładowanie albumów…', + albumsEmpty: 'Nie znaleziono żadnego albumu dla tego gatunku.', + loadMore: 'Załaduj więcej', + back: 'Powrót', + playTooltip: 'Odtwórz (przytrzymaj by przetasować)', + shuffle: 'Przetasuj', + addToQueue: 'Dodaj do kolejki', +}; diff --git a/src/locales/pl/help.ts b/src/locales/pl/help.ts new file mode 100644 index 00000000..e7854abf --- /dev/null +++ b/src/locales/pl/help.ts @@ -0,0 +1,115 @@ +export const help = { + title: 'Pomoc', + searchPlaceholder: 'Szukaj w pomocy…', + noResults: 'Brak pasujących tematów. Spróbuj użyć innej frazy.', + // ── Section 1: Getting Started ───────────────────────────────────────── + s1: 'Pierwsze kroki', + q1: 'Jakie serwery są kompatybilne?', + a1: 'Psysonic został stworzony z przede wszystkim myślą o Navidrome, ale jest w pełni kompatybilny z API Subsonic — Gonic, Airsonic, LMS oraz inne serwery obsługujące API Subsonic również będą działać. Niektóre funkcje zaawansowane (oceny, inteligentne playlisty, udostępnianie magic-string, zarządzanie użytkownikami) wymagają Navidrome.', + q2: 'Jak dodać serwer?', + a2: 'Ustawienia → Serwery → Dodaj serwer. Wpisz adres URL (e.g. http://192.168.1.100:4533), nazwę użytkownika i hasło. PsySonic testuje połączenie przed zapisaniem — jeśli test się nie powiedzie, nic nie zostanie zapisane. Możesz dodać dowolną liczbę serwerów i przełączać się między nimi w nagłówku w dowolnym momencie; tylko jeden na raz może być aktywny.', + q3: 'Krótki przegląd interfejsu?', + a3: 'Pasek boczny po lewej służy do nawigacji, Scena główna / strony znajdują się pośrodku, pasek odtwarzacza jest na dole, a panel kolejki po prawej (można go przełączyć z prawej górnej części nagłówka, obok wskaźnika "Teraz odtwarzane"). Pasek wyszukiwania u góry przeszukuje całą bibliotekę; "Teraz odtwarzane" pokazuje, czego słuchają w tej chwili inni użytkownicy tego samego serwera Navidrome.', + // ── Section 2: Playback & Queue ──────────────────────────────────────── + s2: 'Odtwarzanie i kolejka', + q4: 'Jak używać kolejki?', + a4: 'Otwórz panel kolejki z prawej górnej części nagłówka. Przeciągaj wiersze, aby zmienić ich kolejność, upuść je poza panelem, aby je usunąć, albo użyj paska narzędzi kolejki, aby wymieszać kolejkę, zapisać ją jako playlistę lub przejść do konkretnego utworu. Przeciągnij wiersze poza panel, aby upuścić je gdzie indziej jako transfer.', + q5: 'Odtwarzanie bez przerw a Crossfade — czym się różnią?', + a5: 'Odtwarzanie bez przerw buforuje następny utwór z wyprzedzeniem, aby między utworami nie było ciszy (najlepsze dla albumów live i miksów DJ-skich). Crossfade wycisza bieżący utwór, jednocześnie wprowadzając następny przez 1–10 s (najlepsze dla losowych miksów). Te funkcje wzajemnie się wykluczają — włączenie jednej wyłącza drugą. Obie można skonfigurować w Ustawienia → Audio.', + q6: 'Czym jest Niekończąca się kolejka?', + a6: 'Gdy kolejka się skończy, a Powtarzanie jest wyłączone, PsySonic po cichu dodaje podobne / losowe utwory z biblioteki, aby odtwarzanie nigdy się nie zatrzymało. Automatycznie dodane utwory pojawiają się pod separatorem "— Dodano automatycznie —". Możesz przełączyć tę funkcję ikoną nieskończoności w nagłówku kolejki; automatyczne dodawanie można ograniczyć do wybranego gatunku w Ustawienia → Kolejka.', + q7: 'Wielokrotny wybór i zaznaczanie zakresu naciśnięciem Shift?', + a7: 'Włącz "Wybierz" w widokach Albumy / Nowe wydania / Losowe albumy / Playlisty. Kliknij element, aby go zaznaczyć lub odznaczyć, a następnie przytrzymaj Shift i kliknij inny element, aby zaznaczyć wszystko pomiędzy nimi w widocznej kolejności. Kliknięcia z Shift rozszerzają wybór od ostatnio klikniętego punktu początkowego. Pasek narzędzi nad siatką oferuje działania zbiorcze (kolejka, pobieranie, usuwanie itd.).', + q8: 'Skróty klawiszowe i skróty globalne?', + a8: 'Domyślne klawisze w aplikacji: Spacja = Odtwórz / pauza, Esc = zamknij tryb pełnoekranowy / okna modalne, F1 = ściąga ze skrótami. Ustawienia → Wejście pozwalają zmienić każdy skrót w aplikacji (także jako kombinacje, np. Ctrl+Shift+P) oraz ustawić globalne skróty systemowe, które działają nawet wtedy, gdy PsySonic jest w tle lub zminimalizowany. Klawisze multimedialne (Odtwórz/Pauza, Następny, Poprzedni) działają na wszystkich platformach.', + // ── Section 3: Audio Tools ───────────────────────────────────────────── + s3: 'Narzędzia audio', + q9: 'Tryby Replay Gain?', + a9: 'Ustawienia → Audio → Replay Gain. Tryb Utwór normalizuje każdy utwór do poziomu docelowego. Tryb Album zachowuje krzywą głośności w obrębie albumu. Tryb Automatycznie wybiera Utwór albo Album w zależności od tego, czy kolejka pochodzi z jednego albumu. Utwory bez tagów Replay Gain korzystają z konfigurowalnego przedwzmacniacza.', + q10: 'Czym jest inteligentna normalizacja głośności (LUFS)?', + a10: 'To nowoczesna alternatywa dla Replay Gain w Ustawienia → Audio. PsySonic analizuje każdy utwór do LUFS / EBU R128 i zapisuje wynik, dzięki czemu głośność pozostaje spójna w całej bibliotece — także dla utworów bez tagów Replay Gain. Analiza przy pustej pamięci podręcznej działa w tle i używa 35–40% procesora przez około minutę, a potem spada do 0. Wystarczy raz ustawić docelową głośność (domyślnie −10 LUFS).', + q11: 'EQ i AutoEQ?', + a11: '10-pasmowy korektor parametryczny znajdujący się w Ustawienia → Audio → Korektor i oferujący ręczne pasma oraz presety. AutoEQ koło niego pobiera zmierzony profil korekcji dla Twojego modelu słuchawek z bazy AutoEQ i automatycznie stosuje go do pasm — wybierz słuchawki, a EQ dopasuje się do właściwej krzywej.', + q12: 'HJak przełączyć urządzenie wyjściowe audio?', + a12: 'Ustawienia → Audio → Urządzenie wyjściowe. PsySonic pokazuje każde dostępne wyjście i przełącza się natychmiast po wybraniu jednego z nich. Przycisk odświeżania ponownie skanuje urządzenia które zostały podłączone po uruchomieniu aplikacji. Nazwy ALSA w Linuksie, takie jak "sysdefault", są automatycznie oczyszczane dla lepszej czytelności.', + q13: 'Czym jest Hot Cache?', + a13: 'Hot Cache wstępnie ładuje bieżący utwór oraz kilka następnych do RAM-u i na dysk, aby odtwarzanie zaczynało się bez buforowania — jest to szczególnie przydatne przy wolnych / zdalnych serwerach. Gdy zostanie osiągnięty limit rozmiaru, zaczyna działać usuwanie starszych danych. Rozmiar i opóźnienie debounce (żeby szybkie pominięcia nie powodowały nadmiernego pobierania) można skonfigurować w Ustawienia → Audio.', + // ── Section 4: Library & Discovery ───────────────────────────────────── + s4: 'Biblioteka i odkrywanie', + q14: 'Jak działają oceny i 1★ po pominięciach?', + a14: 'PsySonic obsługuje oceny od 1 do 5 gwiazdek przez OpenSubsonic (Navidrome ≥ 0.53). Utwory możesz oceniać na listach utworów, w menu pod prawym przyciskiem myszy albo na pasku odtwarzacza pod nazwą wykonawcy; albumy na stronie albumu; wykonawców na stronie wykonawcy. 1★ po pominięciach (Ustawienia → Biblioteka → Oceny) automatycznie przypisuje 1 gwiazdkę po konfigurowalnej liczbie kolejnych pominięć. Ten sam panel pozwala ustawić filtr minimalnej oceny dla losowego miksu i innych generowanych miksów.', + q15: 'Jak przeglądać bibliotekę — Foldery, Gatunki, Utwory?', + a15: 'Przeglądarka folderów (pasek boczny) pozwala poruszać się po katalogu muzycznym serwera w układzie kolumn Millera — kliknij folder, aby wejść głębiej, albo kliknij utwór lub ikonę odtwarzania folderu, aby odtworzyć / dodać do kolejki. Gatunki używają widoku chmury tagów skalowanej według liczby utworów; kliknij gatunek, aby go otworzyć. Utwory to płaski widok całej biblioteki z wirtualną listą sortowaną po kolumnach i wyszukiwaniem na żywo.', + q16: 'Wyszukiwanie i wyszukiwanie zaawansowane?', + a16: 'Pasek wyszukiwania w nagłówku wykonuje szybkie wyszukiwanie na żywo wśród wykonawców, albumów i utworów podczas pisania. Otwórz Wyszukiwanie zaawansowane (pasek boczny), aby uzyskać bogatszy widok: filtruj według roku, gatunku, oceny, formatu, kanałów, częstotliwości próbkowania, BPM, nastroju i łącz kryteria. Kliknij dowolny wynik prawym przyciskiem myszy, aby otworzyć to samo menu kontekstowe, które jest używane w innych miejscach aplikacji.', + q17: 'Czym są miksy (Losowy / Gatunek / Supergatunek / Lucky)?', + a17: 'Losowy miks tworzy playlistę z losowych utworów z biblioteki; filtr słów kluczowych wyklucza audiobooki, komedię itd. na podstawie fragmentów gatunku / tytułu / albumu. Miks supergatunku grupuje bibliotekę w szerokie style (Rock, Metal, Electronic, Jazz, Classical…) i tworzy z jednego z nich ukierunkowany miks. Lucky Mix używa historii słuchania, ocen i podobnych utworów z AudioMuse-AI, aby jednym kliknięciem utworzyć natychmiastową playlistę.', + q18: 'Strona statystyk?', + a18: 'Statystyki (pasek boczny) pokazują najpopularniejszych wykonawców, albumy i utwory, podział według gatunków, czas słuchania, oraz zakres dla poszczególnych bibliotek, jeśli masz skonfigurowany więcej niż jeden folder muzyki. Różne widoki zestawiań można wyeksportować jako udostępnialne karty - grafiki.', + q19: 'Jak mogę pobrać album jako ZIP?', + a19: 'Strona albumu → "Pobierz (ZIP)". Serwer najpierw kompresuje album — w przypadku dużych lub bezstratnych albumów (FLAC / WAV) pasek postępu pojawia się dopiero po zakończeniu pakowania i rozpoczęciu transferu. To normalne.', + // ── Section 5: Lyrics ────────────────────────────────────────────────── + s5: 'Teksty utworów', + q20: 'Jakie jest źródło tekstów utworów?', + a20: 'Three sources, configurable in Settings → Lyrics: your Navidrome server (embedded / OpenSubsonic lyrics), LRCLIB (community-contributed synced lyrics), and NetEase Cloud Music (large Asian + international catalog). Each source can be enabled / disabled and re-ordered by drag.', + q21: 'How do I view lyrics during playback?', + a21: 'Click the microphone icon in the player bar to open the Lyrics tab inside the queue panel. Synced lyrics auto-scroll and support click-to-seek; plain-text lyrics scroll as a static block. Toggle the Fullscreen Player from the player-bar artwork for an immersive lyrics view with mesh-blob background.', + // ── Section 6: Sharing & Social ──────────────────────────────────────── + s6: 'Udostępnianie i społeczność', + q22: 'Czym są Magic Strings?', + a22: 'Magic Strings to krótkie tokeny do kopiowania i wklejania, które pozwalają udostępniać rzeczy między użytkownikami PsySonic bez żadnego serwera pośredniczącego. Ciągi zaproszeń do serwera pozwalają znajomemu połączyć się z Twoim Navidrome jednym wklejeniem; Magic Strings albumu / wykonawcy / kolejki otwierają ten sam album / wykonawcę / kolejkę w zainstalowanym PsySonic odbiorcy. Wygenerujesz je z menu udostępniania, a użyjesz, wklejając je w pasku wyszukiwania.', + q23: 'Czym jest Orbit?', + a23: 'Orbit to zsynchronizowane wspólne słuchanie: gospodarz odtwarza utwór, każdy gość słyszy go w synchronizacji, a goście mogą proponować utwory, które gospodarz może dodać do kolejki. Rozpocznij sesję przyciskiem Orbit w nagłówku, udostępnij link z zaproszeniem, a inni mogą dołączyć z dowolnej instalacji PsySonic. Gospodarz kontroluje odtwarzanie (pomijanie, przewijanie, kolejkę) — goście widzą wszystko w czasie rzeczywistym i mają pole propozycji. Sesje są tymczasowe i kończą się, gdy gospodarz je zamknie.', + q24: 'Czym jest menu "Teraz odtwarzane"?', + a24: 'Ikona transmisji w prawym górnym rogu nagłówka pokazuje, czego aktualnie słuchają inni użytkownicy Twojego serwera Navidrome, i odświeża się co 10 sekund. Twój własny wpis znika w momencie wstrzymania odtwarzania. Działa osobno dla każdego serwera, więc użytkownicy na innym aktywnym serwerze nie są pokazywani.', + // ── Section 7: Personalization ───────────────────────────────────────── + s7: 'Personalizacja', + q25: 'Motywy i harmonogram motywów?', + a25: 'Ustawienia → Wygląd → Motyw pozwalają wybrać spośród ponad 60 motywów w 8 grupach (PsySonic, odtwarzacze multimedialne, systemy operacyjne, gry, filmy, seriale, media społecznościowe, klasyki open source — Catppuccin / Nord / Gruvbox / Nightfox / Dracula). Automatyczna zmiana motywu pozwala ustawić motyw dzienny i nocny wraz z godzinami rozpoczęcia, dzięki czemu PsySonic przełącza je automatycznie.', + q26: 'Czy mogę dostosować pasek boczny, stronę główną i strony wykonawców?', + a26: 'Tak — Ustawienia → Personalizacja. Konfigurator paska bocznego pozwala przeciągać elementy nawigacji do wybranej kolejności i ukrywać te, których nie używasz. Konfigurator strony głównej przełącza każdą sekcję Sceny głównej (Hero, Ostatnie, Odkrywaj, Ostatnio odtwarzane, Oznaczone gwiazdką…). Konfigurator strony wykonawcy pozwala zmieniać kolejność sekcji (Najpopularniejsze utwory, Albumy, Single, Kompilacje, Podobni wykonawcy itd.) i ukrywać te, z których nie korzystasz.', + q27: 'Czym jest miniodtwarzacz?', + a27: 'To małe okno jako nakładka z okładką, sterowaniem odtwarzaniem i kompaktową kolejką. Możesz je otworzyć ikoną miniodtwarzacza na pasku odtwarzacza albo skrótem klawiszowym. Okno zapamiętuje swoje położenie i rozmiar między sesjami. W Windows mini-WebView jest tworzone wstępnie przy uruchomieniu, więc otwiera się natychmiast; w Linuksie / macOS można to włączyć w Ustawienia → Wygląd → Wczytuj miniodtwarzacz z wyprzedzeniem.', + q28: 'Czym jest pasek odtwarzacza jako nakładka?', + a28: 'To opcjonalny styl paska odtwarzacza (Ustawienia → Wygląd), który odłącza go od dolnej krawędzi i dodaje tło motywu, obramowanie w kolorze akcentu, zaokrągloną okładkę albumu oraz wyśrodkowaną sekcję głośności. Przydatne na wysokich monitorach albo w kompaktowych motywach.', + q29: 'Podgląd utworu przy najechaniu?', + a29: 'Najedź na wiersz utworu a następnie naciśniej na mały przycisk podglądu lub uruchom odsłuch z menu pod prawym przyciskiem myszy — PsySonic strumieniuje pierwsze ~15 s przez ten sam silnik audio w Rust, więc normalizacja głośności działa także tutaj. Przydatne do szybkiego przesłuchania albumu, którego jeszcze nie znasz.', + q30: 'Wyłącznik czasowy?', + a30: 'Kliknij ikonę księżyca na pasku odtwarzacza, aby otworzyć wyłącznik czasowy. Wybierz czas trwania albo "koniec bieżącego utworu", a PsySonic wyciszy odtwarzanie i zatrzyma je na końcu. Podczas działania timera przycisk pokazuje okrągły wskaźnik oraz odliczanie.', + q31: 'Skala interfejsu, czcionka, styl paska postępu?', + a31: 'Ustawienia → Wygląd — Skala interfejsu (80–125% bez wpływu na rozmiar czcionki systemowej), Czcionka (10 czcionek UI, w tym IBM Plex Mono, Fira Code, Geist, Golos Text…), Styl paska postępu (analizowany waveform / deterministyczna pseudofala / Linia z punktem / Pasek / Gruby pasek / Segmenty / Neon / Pulsująca fala / Ślad cząstek / Wypełnienie cieczą / Taśma retro)', + // ── Section 8: Power User ────────────────────────────────────────────── + s8: 'Dla zaawansowanych użytkowników', + q32: 'Sterowanie odtwarzaczem z CLI?', + a32: 'Plik wykonywalny PsySonic działa też jako zdalne sterowanie. Przykłady: psysonic --player play / pause / next / prev, --player volume 75, --player seek 15, --player shuffle, --player repeat off|all|one, --player rating 1-5. Możesz przełączać serwery, urządzenia audio i biblioteki; uruchamiać Instant Mix; wyszukiwać wykonawców / albumy / utwory. Uruchom psysonic --player --help, aby zobaczyć pełną listę. Uzupełnianie poleceń dla bash i zsh jest dostępne przez psysonic completions.', + q33: 'Inteligentne playlisty (Navidrome)?', + a33: 'Inteligentne playlisty to dynamiczne playlisty po stronie Navidrome, definiowane regułami (genre = Rock AND year > 2020 itd.). Strona Playlisty w PsySonic pozwala je tworzyć, edytować i usuwać za pomocą wizualnego edytora reguł — PsySonic komunikuje się w tym celu z natywnym API Navidrome. W pozostałej części aplikacji działają jak zwykłe playlisty i aktualizują się automatycznie wraz ze zmianami w bibliotece.', + q34: 'Kopia zapasowa i przywracanie ustawień?', + a34: 'Ustawienia → Pamięć → Kopia zapasowa i przywracanie eksportuje profile serwerów, motywy, skróty klawiszowe i inne ustawienia do jednego pliku JSON. Zaimportuj ten plik na innym komputerze albo po ponownej instalacji, aby przywrócić wszystko naraz. Hasła serwerów są dołączone — zachowaj plik tylko dla siebie i nie udostępniaj go.', + q35: 'Gdzie znajdę wszystkie licencje open source?', + a35: 'Ustawienia → System → Licencje open source. Pełna lista zależności (crates Cargo i pakiety npm) jest dołączona do kompilacji razem z tekstami licencji. Kliknij pozycję, aby zobaczyć pełny tekst; wyróżniony blok u góry pokazuje najbardziej rozpoznawalne biblioteki (Tauri, React, rodio, symphonia itd.).', + // ── Section 9: Offline & Sync ────────────────────────────────────────── + s9: 'Offline i synchronizacja', + q36: 'Tryb offline — zapisywanie albumów i playlist w pamięci podręcznej?', + a36: 'Otwórz dowolny album lub playlistę i kliknij ikonę pobierania w nagłówku — PsySonic zapisze każdy utwór lokalnie, aby był odtwarzany z dysku bez połączenia z siecią. Strona Biblioteka offline (pasek boczny) pokazuje wszystko, co zapisano w pamięci podręcznej, wyświetla postęp trwających pobrań i pozwala usuwać pozycje ikoną kosza (pojawia się po zakończeniu pobierania).', + q37: 'Limit miejsca offline?', + a37: 'Ustawienia → Biblioteka → Offline pozwalają ustawić maksymalny rozmiar pamięci podręcznej. Po osiągnięciu limitu przycisk pobierania na stronie albumu pokazuje baner ostrzegawczy. Miejsce można zwolnić, usuwając albumy lub playlisty ze strony Biblioteka offline.', + q38: 'Synchronizacja urządzenia — kopiowanie muzyki na USB / SD?', + a38: 'Synchronizacja urządzenia (pasek boczny) kopiuje albumy, playlisty lub całych wykonawców na dysk zewnętrzny, w celu możliwości odsłuchu bez połączenia internetowego na innych urządzeniach. Wybierz folder docelowy, wybierz źródła z kart przeglądarki i kliknij "Przenieś na urządzenie". PsySonic zapisuje manifest (psysonic-sync.json), dzięki czemu wie, które pliki już tam są, nawet jeśli ponownie otworzysz Synchronizację urządzenia w innym systemie operacyjnym z innym szablonem nazw plików. Szablony obsługują tokeny {artist} / {album} / {title} / {track_number} / {disc_number} / {year}, a / służy jako separator folderów.', + // ── Section 10: Integrations & Troubleshooting ───────────────────────── + s10: 'Integracje i rozwiązywanie problemów', + q39: 'Scrobbling — Last.fm, ListenBrainz, Maloja…?', + a39: 'Ustawienia → Integracje → Sieć muzyczna. Połącz jedną lub więcej usług scrobblingu (Last.fm, Libre.fm, Rocksky, ListenBrainz, Maloja albo dowolny serwer zgodny z GNU FM) — konfiguracja Navidrome nie jest potrzebna. Każda połączona usługa z włączonym scrobblingiem otrzymuje odtworzenie; główny przełącznik "Włącz scrobbling" włącza lub wyłącza całe rozsyłanie informacji i odwtorzonych utworach. Scrobble jest wysyłany po odsłuchaniu 50% utworu; pingi "teraz odtwarzane" są wysyłane na początku do usług, które je obsługują. Jedna usługa jest główna — z niej pobierane są polubione utwory, podobni wykonawcy i statystyki słuchania. Wskazówka: jeśli Twój serwer Navidrome już scrobbluje do danej usługi (np. Maloja), nie podłączaj tej samej usługi tutaj, bo otrzymasz podwójne scrobble.', + q40: 'Discord Rich Presence?', + a40: 'Ustawienia → Integracje → Discord pokazuje bieżący utwór w Twoim profilu Discord. Możesz wybrać ikonę aplikacji, okładkę z Twojego serwera (przez getAlbumInfo2 — wymaga publicznie dostępnego serwera) albo okładki z Apple Music. Teksty wyświetlane w profilu (details, state, tooltip) możesz dostosować za pomocą szablonów z tokenami.', + q41: 'Daty koncertów z Bandsintown?', + a41: 'Włącz tę opcję w Ustawienia → Integracje → Informacje "Teraz odtwarzane". Karta "Teraz odtwarzane" na stronie "Teraz odtwarzane" będzie wtedy pokazywać nadchodzące koncerty odtwarzanego wykonawcy przez API widżetu Bandsintown. Domyślnie wyłączone — żadne żądania nie są wysyłane, dopóki tego nie włączysz.', + q42: 'Radio internetowe — odtwarzanie transmisji na żywo?', + a42: 'Radio internetowe (pasek boczny) odtwarza dowolną transmisję na żywo zapisaną na Twoim serwerze Navidrome (stacje dodaje się w panelu administratora Navidrome). Odtwarzanie działa przez silnik audio HTML5 przeglądarki — większość ustawień EQ / Replay Gain / głośności nie dotyczy radia, ale metadane ICY (nazwa bieżącego utworu) są wyświetlane. Obsługiwane są MP3, AAC, OGG Vorbis i większość strumieni HLS; obsługa kodeków zależy od platformy.', + q43: 'Test połączenia nie powiódł się — co dalej?', + a43: 'Sprawdź dokładnie adres URL wraz z portem (np. http://192.168.1.100:4533). W sieci lokalnej http:// często działa tam, gdzie https:// nie działa (brak certyfikatu). Upewnij się, że zapora systemowa nie blokuje portu oraz że nazwa użytkownika i hasło są poprawne. Jeśli serwer działa za reverse proxy, najpierw spróbuj bezpośredniego adresu URL, aby ustalić przyczynę problemu.', + q44: 'Okładki i zdjęcia wykonawców ładują się powoli.', + a44: 'Obrazy są pobierane z Twojego serwera przy pierwszym wyświetleniu, a potem przechowywane lokalnie przez 30 dni. Jeśli pamięć masowa serwera jest wolna, pierwsza wizyta na stronie może chwilę potrwać; kolejne będą natychmiastowe. Hot Cache pomaga też przy utworach, ale pamięć podręczna obrazów działa niezależnie.', + q45: 'Problemy na Linuksie — czarny ekran albo brak dźwięku?', + a45: 'Czarny ekran w Linuksie to zwykle problem z grafiką albo wyświetlaniem WebView. Spróbuj sesji X11 albo przed uruchomieniem ustaw GDK_BACKEND=x11 i EGL_PLATFORM=x11, jeśli używasz Waylanda. W przypadku dźwięku upewnij się, że działa PipeWire albo PulseAudio. Jeśli dźwięk przestaje działać po uśpieniu lub wybudzeniu, całkowicie zamknij PsySonic i uruchom go ponownie.', +}; diff --git a/src/locales/pl/hero.ts b/src/locales/pl/hero.ts new file mode 100644 index 00000000..59bb5f2b --- /dev/null +++ b/src/locales/pl/hero.ts @@ -0,0 +1,9 @@ +export const hero = { + eyebrow: 'Polecany album', + playAlbum: 'Odtwórz album', + playAlbumTooltip: 'Odtwórz album (przytrzymaj by przetasować)', + enqueue: 'Dodaj do kolejki', + enqueueTooltip: 'Dodaj cały album do kolejki', + previousAlbum: 'Poprzedni album', + nextAlbum: 'Następny album', +}; diff --git a/src/locales/pl/home.ts b/src/locales/pl/home.ts new file mode 100644 index 00000000..c1b93e26 --- /dev/null +++ b/src/locales/pl/home.ts @@ -0,0 +1,21 @@ +export const home = { + hero: 'Polecane', + starred: 'Osobiste ulubione', + mostPlayed: 'Najczęściej odtwarzane', + recentlyPlayed: 'Niedawno odtwarzane', + losslessAlbums: 'Albumy bezstratne', + discover: 'Odkrywaj', + discoverSongs: 'Odkrywaj utwory', + loadMore: 'Załaduj więcej', + discoverMore: 'Odkrywaj więcej', + discoverArtists: 'Odkrywaj wykonawców', + discoverArtistsMore: 'Wszyscy wykonawcy', + becauseYouLike: 'Ponieważ słuchałeś…', + becauseYouLikeFor: 'Ponieważ słuchałeś {{artist}}', + similarTo: 'Podobny do {{artist}}', + becauseYouLikeTracks_one: '{{count}} utwór', + becauseYouLikeTracks_other: '{{count}} utworów', + mainstageEmptyTitle: 'Twoja scena główna jest pusta', + mainstageEmptyBody: 'Wszystkie sekcje są wyłączone. Włącz sekcje ponownie albo ukryj Scenę główną na pasku bocznym.', + mainstageEmptyCta: 'Otwórz ustawienia personalizacji' +}; diff --git a/src/locales/pl/index.ts b/src/locales/pl/index.ts new file mode 100644 index 00000000..e8dbb2e6 --- /dev/null +++ b/src/locales/pl/index.ts @@ -0,0 +1,95 @@ +import { sidebar } from './sidebar'; +import { home } from './home'; +import { hero } from './hero'; +import { search } from './search'; +import { nowPlaying } from './nowPlaying'; +import { contextMenu } from './contextMenu'; +import { sharePaste } from './sharePaste'; +import { albumDetail } from './albumDetail'; +import { entityRating } from './entityRating'; +import { artistDetail } from './artistDetail'; +import { favorites } from './favorites'; +import { randomLanding } from './randomLanding'; +import { randomAlbums } from './randomAlbums'; +import { genres } from './genres'; +import { randomMix } from './randomMix'; +import { luckyMix } from './luckyMix'; +import { albums } from './albums'; +import { tracks } from './tracks'; +import { artists } from './artists'; +import { composers } from './composers'; +import { composerDetail } from './composerDetail'; +import { login } from './login'; +import { connection } from './connection'; +import { common } from './common'; +import { settings } from './settings'; +import { changelog } from './changelog'; +import { whatsNew } from './whatsNew'; +import { musicNetwork } from './musicNetwork'; +import { help } from './help'; +import { queue } from './queue'; +import { miniPlayer } from './miniPlayer'; +import { statistics } from './statistics'; +import { player } from './player'; +import { nowPlayingInfo } from './nowPlayingInfo'; +import { songInfo } from './songInfo'; +import { playlists } from './playlists'; +import { smartPlaylists } from './smartPlaylists'; +import { mostPlayed } from './mostPlayed'; +import { losslessAlbums } from './losslessAlbums'; +import { radio } from './radio'; +import { folderBrowser } from './folderBrowser'; +import { deviceSync } from './deviceSync'; +import { orbit } from './orbit'; +import { tray } from './tray'; +import { licenses } from './licenses'; +import { migration } from './migration'; + +export const plTranslation = { + sidebar, + home, + hero, + search, + nowPlaying, + contextMenu, + sharePaste, + albumDetail, + entityRating, + artistDetail, + favorites, + randomLanding, + randomAlbums, + genres, + randomMix, + luckyMix, + albums, + tracks, + artists, + composers, + composerDetail, + login, + connection, + common, + settings, + changelog, + whatsNew, + musicNetwork, + help, + queue, + miniPlayer, + statistics, + player, + nowPlayingInfo, + songInfo, + playlists, + smartPlaylists, + mostPlayed, + losslessAlbums, + radio, + folderBrowser, + deviceSync, + orbit, + tray, + licenses, + migration, +}; diff --git a/src/locales/pl/licenses.ts b/src/locales/pl/licenses.ts new file mode 100644 index 00000000..161a0270 --- /dev/null +++ b/src/locales/pl/licenses.ts @@ -0,0 +1,13 @@ +export const licenses = { + title: 'Licencje open source', + intro: 'PsySonic korzysta z oprogramowania open source. Poniższa lista pokazuje wszystkie zależności dołączone do aplikacji wraz z wersją, licencją i pełną treścią licencji.', + highlights: 'Kluczowe zależności', + searchPlaceholder: 'Szukaj według nazwy, wersji lub licencji…', + noResults: 'Brak wyników.', + loading: 'Ładowanie licencji…', + loadError: 'Nie udało się wczytać danych licencji.', + noLicenseText: 'Dla tej zależności nie dołączono treści licencji.', + viewSource: 'Wyświetl źródło', + totalLine: '{{total}} zależności — {{cargo}} cargo, {{npm}} npm', + generatedAt: 'Ostatnio wygenerowano: {{date}}', +}; diff --git a/src/locales/pl/login.ts b/src/locales/pl/login.ts new file mode 100644 index 00000000..8ab8f7b7 --- /dev/null +++ b/src/locales/pl/login.ts @@ -0,0 +1,22 @@ +export const login = { + subtitle: 'Twój odtwarzacz desktopowy dla Navidrome', + serverName: 'Nazwa serwera (opcjonalna)', + serverNamePlaceholder: 'Mój Navidrome', + serverUrl: 'URL serwera', + serverUrlPlaceholder: '192.168.1.100:4533 lub https://music.example.com', + username: 'Nazwa użytkownika', + usernamePlaceholder: 'administrator', + password: 'Hasło', + showPassword: 'Pokaż hasło', + hidePassword: 'Ukryj hasło', + connect: 'Połącz', + connecting: 'Łączenie…', + connected: 'Połączono!', + error: 'Połączenie nie powiodło się – sprawdź wprowadzone dane.', + urlRequired: 'Wprowadź adres URL serwera.', + savedServers: 'Zapisane serwery', + addNew: 'Lub dodaj nowy serwer', + orMagicString: 'Lub Magic String', + magicStringPlaceholder: 'Wklej ciąg udostępniania (psysonic1-…)', + magicStringInvalid: 'Nieprawidłowy albo nieczytelny Magic String.', +}; diff --git a/src/locales/pl/losslessAlbums.ts b/src/locales/pl/losslessAlbums.ts new file mode 100644 index 00000000..349944cb --- /dev/null +++ b/src/locales/pl/losslessAlbums.ts @@ -0,0 +1,7 @@ +export const losslessAlbums = { + empty: 'W tej bibliotece nie ma jeszcze albumów bezstratnych.', + unsupported: 'Ten serwer nie udostępnia metadanych potrzebnych do znalezienia albumów bezstratnych.', + slowFetchHint: 'Ładuje się wolniej niż inne strony albumów — PsySonic przechodzi przez cały katalog utworów według jakości.', + modeBanner: 'Tryb bezstratny — pokazywane są tylko FLAC, WAV i inne formaty bezstratne.', + modeBannerExit: 'Pokaż wszystkie formaty', +}; diff --git a/src/locales/pl/luckyMix.ts b/src/locales/pl/luckyMix.ts new file mode 100644 index 00000000..bcc1db82 --- /dev/null +++ b/src/locales/pl/luckyMix.ts @@ -0,0 +1,6 @@ +export const luckyMix = { + done: 'Szczęśliwy miks gotowy: {{count}} utworów', + failed: 'Nie udało się utworzyć szczęśliwego miksu. Spróbuj ponownie.', + unavailable: 'Szczęśliwy miks jest niedostępny dla tego serwera.', + cancelTooltip: 'Anuluj tworzenie szczęśliwego miksu', +}; diff --git a/src/locales/pl/migration.ts b/src/locales/pl/migration.ts new file mode 100644 index 00000000..b4c9e3b6 --- /dev/null +++ b/src/locales/pl/migration.ts @@ -0,0 +1,15 @@ +export const migration = { + preparing: 'Przygotowywanie aktualizacji danych…', + preparingBody: 'Sprawdzanie biblioteki i pamięci podręcznej analizy…', + migrating: 'Migracja danych', + working: 'pracuję nad tym…', + skippedRows: 'Pominięto wiersze usuniętych serwerów, a stara zapasowa baza danych zostanie usunięta po pomyślnym przełączeniu.', + failed: 'Migracja nie powiodła się', + retry: 'Spróbuj ponownie', + copyDetails: 'Skopiuj szczegóły', + complete: 'Aktualizacja zakończona', + completeRows: 'Zmigrowano {{count}} wierszy', + genreTagsTitle: 'Aktualizowanie indeksu gatunków…', + genreTagsBody: 'Indeksowanie gatunków do przeglądania i filtrów. Uruchamia się jednorazowo po aktualizacji.', + genreTagsFailed: 'Aktualizacja indeksu gatunków nie powiodła się', +}; diff --git a/src/locales/pl/miniPlayer.ts b/src/locales/pl/miniPlayer.ts new file mode 100644 index 00000000..69ae0e48 --- /dev/null +++ b/src/locales/pl/miniPlayer.ts @@ -0,0 +1,9 @@ +export const miniPlayer = { + showQueue: 'Pokaż kolejkę', + hideQueue: 'Ukryj kolejkę', + pinOnTop: 'Przypnij u góry', + pinOff: 'Odepnij', + openMainWindow: 'Otwórz okno główne', + close: 'Zamknij', + emptyQueue: 'Kolejka jest pusta', +}; diff --git a/src/locales/pl/mostPlayed.ts b/src/locales/pl/mostPlayed.ts new file mode 100644 index 00000000..13e3fca6 --- /dev/null +++ b/src/locales/pl/mostPlayed.ts @@ -0,0 +1,13 @@ +export const mostPlayed = { + title: 'Najczęściej odtwarzane', + topArtists: 'Najpopularniejsi wykonawcy', + topAlbums: 'Najpopularniejsze albumy', + plays: '{{n}} odtworzeń', + sortMost: 'Najczęściej odtwarzane najpierw', + sortLeast: 'Najrzadziej odtwarzane najpierw', + loadMore: 'Załaduj więcej albumów', + noData: 'Brak danych odtwarzania. Zacznij słuchać!', + noArtists: 'Wszyscy wykonawcy zostali odfiltrowani.', + filterCompilations: 'Ukryj wykonawców kompilacji (Różni wykonawcy, soundtracki itp.)', + filterCompilationsShort: 'Ukryj kompilacje', +}; diff --git a/src/locales/pl/musicNetwork.ts b/src/locales/pl/musicNetwork.ts new file mode 100644 index 00000000..c1a474c0 --- /dev/null +++ b/src/locales/pl/musicNetwork.ts @@ -0,0 +1,55 @@ +export const musicNetwork = { + title: 'Sieć muzyczna', + desc: 'Scrobbluj swoje odtworzenia do jednej lub kilku usług. Polubione utwory, podobni wykonawcy i statystyki słuchania pochodzą z wybranej usługi głównej.', + masterToggle: 'Włącz scrobbling', + masterToggleDesc: 'Główny przełącznik wysyłania odtworzeń do wszystkich połączonych usług.', + addService: 'Dodaj usługę', + connect: 'Połącz', + connecting: 'Łączenie…', + disconnect: 'Rozłącz', + scrobbleHere: 'Scrobbluj tutaj', + primaryLabel: 'Usługa główna', + primaryDesc: 'Polubione utwory (❤), podobni wykonawcy i statystyki słuchania pochodzą stąd — scrobbling trafia do wszystkich włączonych usług niezależnie od tego ustawienia.\'', + primaryNone: 'Żadna', + statusConnected: 'Połącz', + statusError: 'Wymagane ponowne połączenie', + scrobbles: '{{n}} scrobbli', + memberSince: 'Użytkownik od {{year}}', + connectFailed: 'Nie udało się połączyć — spróbuj ponownie.', + connectProbeFailed: 'Połączono z {{provider}}, ale nie udało się zweryfikować usługi: {{message}}', + fieldRequired: 'Pole {{field}} jest wymagane.', + malojaProxyWarning: 'Twój serwer Maloja może przekazywać scrobble do Last.fm. Wyłącz scrobbling po jednej stronie, aby uniknąć duplikatów.', + presets: { + lastfm: { desc: 'Oryginalna usługa scrobblingu, z polubieniami, podobnymi wykonawcami i statystykami.' }, + librefm: { desc: 'Open-source’owy scrobbling w zgodnym z Last.fm Libre.fm.' }, + rocksky: { desc: 'Miejsce docelowe tylko dla scrobbli w protokole AT.' }, + listenbrainz: { desc: 'Otwarta historia słuchania od MetaBrainz. Miejsce docelowe scrobblingu.' }, + malojaNative: { desc: 'Self-hostowany serwer scrobbli (natywne API).' }, + malojaCompat: { desc: 'Self-hostowana Maloja przez API Audioscrobbler (GNU FM).' }, + malojaListenbrainz: { desc: 'Self-hostowana Maloja przez API zgodne z ListenBrainz.' }, + koito: { desc: 'Self-hostowany tracker słuchania przez API zgodne z ListenBrainz.' }, + customGnufm: { desc: 'Dowolna self-hostowana instancja zgodna z GNU FM / Last.fm.' }, + }, + fields: { + lbToken: 'Token użytkownika', + malojaUrl: 'URL serwera', + malojaKey: 'Klucz API', + koitoUrl: 'URL serwera', + koitoToken: 'Klucz API', + koitoTokenHelp: 'Wygeneruj klucz API w Koito w Ustawienia → Klucze API, a następnie wklej go tutaj.', + rockskySessionKey: 'Klucz sesji', + rockskySessionKeyHelp: 'Rocksky wydaje ten klucz tylko przez swoje CLI:\n1. npx -y @rocksky/cli@latest login your-handle\n2. cat ~/.rocksky/token.json\n3. Wklej tutaj wartość „token”.', + gnufmUrl: 'URL serwera', + apiKey: 'Klucz API', + apiSecret: 'Współdzielony sekret', + }, + errors: { + AUTH_SESSION_INVALID: 'Sesja wygasła — połącz ponownie w Ustawieniach.', + AUTH_TIMEOUT: 'Autoryzacja przekroczyła limit czasu — spróbuj ponownie.', + PROBE_FAILED: 'Ta funkcja jest niedostępna w tej usłudze.', + CAPABILITY_UNSUPPORTED: 'Ta usługa nie obsługuje tej funkcji.', + NETWORK: 'Błąd sieci — sprawdź połączenie lub URL.', + MALOJA_BAD_KEY: 'Nieprawidłowy klucz API Maloja.', + CUSTOM_URL_INVALID: 'URL serwera jest nieosiągalny.', + }, +}; diff --git a/src/locales/pl/nowPlaying.ts b/src/locales/pl/nowPlaying.ts new file mode 100644 index 00000000..8a5cbcc4 --- /dev/null +++ b/src/locales/pl/nowPlaying.ts @@ -0,0 +1,48 @@ +export const nowPlaying = { + tooltip: 'Kto słucha?', + title: 'Kto słucha?', + loading: 'Ładowanie…', + nobody: 'Nikt teraz nie słucha.', + presence: { + playing: 'Odtwarzanie', + paused: 'Wstrzymane', + idle: 'Bezczynny', + }, + nothingPlaying: 'Nic jeszcze nie jest odtwarzane. Włącz utwór!', + aboutArtist: 'O wykonawcy', + fromAlbum: 'Z tego albumu', + viewAlbum: 'Zobacz album', + goToArtist: 'Idź do wykonawcy', + readMore: 'Czytaj więcej', + showLess: 'Pokaż mniej', + genreInfo: 'Gatunek', + trackInfo: 'Informacje o utworze', + topSongs: 'Najczęściej odtwarzane od tego wykonawcy', + topSongsCredit: 'Najpopularniejsze utwory od {{name}}', + trackPosition: 'Utwór {{pos}}', + playsCount_one: '{{count}} odtworzenie', + playsCount_other: '{{count}} odtworzeń', + releasedYearsAgo_one: '{{count}} rok temu', + releasedYearsAgo_other: '{{count}} lat temu', + discography: 'Dyskografia', + thisTrack: 'Ten utwór', + thisArtist: 'Ten wykonawca', + listeners: 'słuchaczy', + scrobbles: 'scrobbli', + yourScrobbles: 'przez Ciebie', + listenersN: '{{n}} słuchaczy', + scrobblesN: '{{n}} scrobbli', + playsByYouN: 'odtworzone {{n}}× razy przez ciebie', + rgTrackTooltip: 'ReplayGain (utwór)', + rgAlbumTooltip: 'ReplayGain (album)', + rgAutoTooltip: 'ReplayGain (auto)', + showMoreTracks: 'Pokaż jeszcze {{count}}', + showLessTracks: 'Pokaż mniej', + hideCard: 'Ukryj kartę', + layoutMenu: 'Układ', + visibleCards: 'Wydoczne karty', + hiddenCards: 'Ukryte karty', + noHiddenCards: 'Brak ukrytych kart', + resetLayout: 'Resetuj układ', + emptyColumn: 'Upuść karty tutaj', +}; diff --git a/src/locales/pl/nowPlayingInfo.ts b/src/locales/pl/nowPlayingInfo.ts new file mode 100644 index 00000000..b2250f09 --- /dev/null +++ b/src/locales/pl/nowPlayingInfo.ts @@ -0,0 +1,24 @@ +export const nowPlayingInfo = { + tab: 'Informacje', + empty: 'Odtwórz coś, by wyświetlić informacje', + artist: 'Wykonawca', + songInfo: 'Informacje o utworze', + onTour: 'W trasie', + noTourEvents: 'Żadnych nadchodzących koncertów', + tourLoading: 'Ładowanie…', + poweredByBandsintown: 'Dane o koncertach przez Bandsintown', + bioReadMore: 'Czytaj więcej', + bioReadLess: 'Pokaż mniej', + showMoreTours_one: 'Pokaż jeszcze {{count}}', + showMoreTours_other: 'Pokaż jeszcze {{count}}', + showLessTours: 'Pokaż mniej', + enableBandsintownPrompt: 'Pokazywać nadchodzące koncerty?', + enableBandsintownPromptDesc: 'Opcjonalne. Ładuje koncerty bieżącego wykonawcy przez publiczne API Bandsintown.', + enableBandsintownPrivacy: 'Po włączeniu nazwa aktualnie odtwarzanego wykonawcy jest wysyłana do API Bandsintown w celu pobrania dat koncertów. Żadne konto ani dane osobowe nie opuszczają Twojego urządzenia.', + enableBandsintownAction: 'Włącz', + role: { + artist: 'Wykonawca', + albumArtist: 'Wykonawca albumu', + composer: 'Kompozytor', + }, +}; diff --git a/src/locales/pl/orbit.ts b/src/locales/pl/orbit.ts new file mode 100644 index 00000000..932cc370 --- /dev/null +++ b/src/locales/pl/orbit.ts @@ -0,0 +1,201 @@ +export const orbit = { + triggerLabel: 'Orbit', + triggerTooltip: 'Rozpocznij lub dołącz do sesji wspólnego słuchania', + launchCreate: 'Stwórz sesję', + launchJoin: 'Dołącz do sesji', + launchHelp: 'Jak to działa?', + launchHelpSoon: 'Już wkrótce', + joinModalTitle: 'Dołącz do sesji Orbit', + joinModalSub: 'Wklej link z zaproszeniem który przesłał gospodarz.', + joinModalLinkLabel: 'Link z zaproszeniaem', + joinModalLinkPlaceholder: 'psysonic2-…', + joinModalLinkHelper: 'Działa z każdym poprawnym linkem Orbit, który wskazuje na serwer do którego jesteś zalogowany.', + joinModalPasteTooltip: 'Wklej z schowka', + joinModalSubmit: 'Dołącz', + joinModalBusy: 'Dołączanie…', + joinErrEmpty: 'Wklej link z zaproszeniem.', + joinErrInvalid: 'To nie wygląda na link z zaproszeniem Orbit.', + closeAria: 'Zamknij', + heroTitlePrefix: 'Słuchaj razem z', + heroTitleBrand: 'Orbit', + heroSub: 'Rozpocznij sesję — inni użytkownicy na {{server}} będą słuchać równocześnie i mogą proponować swoje utwory.', + fallbackServer: 'ten serwer', + tipLan: "Jesteś obecnie połączony przez adres sieci domowej. Goście spoza twojej sieci nie będą mogli dołączyć — przełącz się na adres serwera publicznego w ustawieniach przez rozpoczęciem.", + tipRemote: 'By goście spoza twojej sieci domowej mogli dołączyć, twój adres serwera musi być publicznie dostępny. Jeżeli twój serwer jest jedynie wewnętrzny, zmień to przed rozpoczęciem.', + labelName: 'Nazwa sesji', + namePlaceholder: 'Velvet Orbit', + reshuffleTooltip: 'Nowa sugestia', + reshuffleAria: 'Zasugeruj nową nazwę', + helperName: 'W jaki sposób sesja pokazuje się twoim gościom — zachowaj, lub wpisz swój.', + labelMax: 'Maksymalna liczba gości', + helperMax: "Nie liczysz się - to ogranicza tylko liczbę przychodzących gości.", + labelLink: 'Link z zaproszeniem', + tooltipCopied: 'Skopiowano', + tooltipCopy: 'Kopia', + ariaCopyLink: 'Skopiuj link z zaproszeniem', + helperLink: 'Wyślij ten link swoim gościom. Mogą go wkleić gdziekolwiek za pomocą Ctrl+V.', + labelClearQueue: 'Wyczyść najpierw moją kolejkę', + helperClearQueue: 'Rozpocznij sesję z świeżą, pustą kolejką. Wyłączone: utwory które masz już w kolejce zostaną zachowane i udostępnione gościom.', + btnCancel: 'Anuluj', + btnStarting: 'Rozpoczynanie…', + btnStart: 'Wystartuj Orbit', + btnCopyAndStart: 'Skopiuj link i rozpocznij', + errNameRequired: 'Nadaj swojej sesji nazwę.', + errStartFailed: "Nie można było uruchomić.", + hostLabel: 'Gospodarz: {{name}}', + participantsTooltip: 'Członkowie', + settingsTooltip: 'Ustawienia sesji', + shareTooltip: 'Udostępnij link z zaproszeniem', + shuffleLabel: 'Kolejka zostanie przetasowana za', + catchUpLabel: 'dogoń', + catchUpTooltip: "Przeskocz do bieżącej pozycji gospodarza", + hostAway: 'Gospodarz offline', + hostOnline: 'Gospodarz online', + endTooltip: 'Zakończ sesję', + leaveTooltip: 'Opóść sesję', + helpTooltip: 'Jak działa Orbit', + diag: { + openTooltip: 'Diagnostyka — kopiowalny dziennik zdarzeń', + title: 'Diagnostyka Orbit', + role: 'Rola', + hostTrack: 'Id utworu gospodarza', + hostPos: 'Pozycja gospodarza', + guestTrack: 'Id mojego utworu', + guestPos: 'Moja pozycja', + drift: 'Dryft', + stateAge: 'Wiek stanu', + eventLog: 'Dziennik zdarzeń ({{count}})', + copyLabel: 'Kopiuj', + copyTooltip: 'Kopiuj dziennik zdarzeń do schowka', + clearLabel: 'Wyczyść', + clearTooltip: 'Wyczyść bufor', + empty: 'Brak zdarzeń — pojawią się tutaj podczas synchronizacji Orbit.', + hint: 'Otwórz to przed odtworzeniem problemu, a potem kliknij Kopiuj i wklej zawartość do zgłoszenia błędu.', + copied: 'Skopiowano {{count}} wierszy zdarzeń', + copyFailed: 'Nie udało się skopiować do schowka', + cleared: 'Wyczyszczono bufor', + }, + helpTitle: 'Jak działa Orbit', + helpIntro: 'Orbit zamienia Psysonic w pokój wspólnego słuchania. Gospodarz wybiera muzykę; goście słuchają w synchronizacji i mogą proponować utwory.', + helpHostOnly: '(gospodarz)', + helpSec1Title: 'Czym jest Orbit?', + helpSec1Body: "Tryb wspólnego słuchania — gospodarz steruje odtwarzaniem, a goście dołączają do odsłuchu. Wszystko działa przez playlisty na Twoim własnym serwerze Navidrome; bez zewnętrznej infrastruktury.", + helpSec2Title: 'Gospodarz i goście', + helpSec2Body: 'Gospodarz steruje odtwarzaniem (odtwarzanie / pauza / pomijanie / przewijanie) i decyduje, kiedy sesja się kończy. Goście podążają za odtwarzaniem gospodarza, mogą proponować utwory oraz wychodzić i dołączać ponownie w dowolnym momencie. Tylko gospodarz może wyrzucić uczestnika albo trwale zablokować go w sesji.', + helpSec2WarnHead: 'Ważne: osobne konta.', + helpSec2WarnBody: "Każdy uczestnik potrzebuje własnego konta Navidrome. Jeśli gospodarz i gość zalogują się jako ten sam użytkownik, ich zgłoszenia będą ze sobą kolidować, a gospodarz nie zobaczy propozycji gościa.", + helpSec3Title: 'Rozpoczynanie i zapraszanie', + helpSec3Body: 'Kliknij przycisk "Orbit" → Utwórz sesję → okno startowe pokaże gotowy do skopiowania link z zaproszeniem i opcjonalnie pozwoli wyczyścić bieżącą kolejkę. Udostępnij link w dowolny sposób. Gdy sesja trwa, przycisk udostępniania na pasku sesji u góry pozwala w każdej chwili ponownie skopiować link.', + helpSec4Title: 'Dołączanie', + helpSec4Body: 'Wklej link z zaproszeniem gdziekolwiek w PsySonic za pomocą Ctrl+V / Cmd+V — okno dołączania pojawi się automatycznie. Alternatywnie: "Orbit" → Dołącz do sesji → wklej link w polu. Jeśli link prowadzi do serwera, na którym masz konto, PsySonic przełączy się na niego za Ciebie. Jeśli masz więcej niż jedno konto na tym serwerze, mały selektor zapyta, którego użyć.', + helpSec5Title: 'Proponowanie utworów', + helpSec5Body: 'Na dowolnej liście utworów: kliknij wiersz dwukrotnie albo kliknij prawym przyciskiem myszy → "Dodaj do sesji Orbit". Pojedyncze kliknięcie pokazuje podpowiedź zamiast wrzucać cały album do wspólnej kolejki — to celowe. Jawne akcje zbiorcze, takie jak "Odtwórz wszystko" albo "Odtwórz album", najpierw proszą o potwierdzenie, a potem dodają utwory na końcu kolejki, nigdy jej nie zastępując.', + helpSec6Title: 'Wspólna kolejka', + helpSec6Body: "Kolejka pokazuje nadchodzące utwory gospodarza — widzą ją wszyscy. Zbiorcze dodatki są zawsze dopisywane na końcu, więc propozycje gości nie giną. Automatyczne tasowanie okresowo zmienia kolejność kolejki (konfigurowalne: 1 / 5 / 10 / 15 / 30 min). Jeśli Twoje odtwarzanie odjedzie od gospodarza, przycisk \"Dogoń\" na pasku sesji przeniesie Cię z powrotem do bieżącej pozycji gospodarza.", + helpSec7Title: 'Zatwierdzanie', + helpSec7Body: 'Domyślnie propozycje gości wymagają ręcznego zatwierdzenia — pojawiają się w pasku "Zatwierdzenie" u góry panelu kolejki, z przyciskami akceptacji i odrzucenia. Automatyczne zatwierdzanie można włączyć w ustawieniach sesji, aby wszystko trafiało do kolejki od razu.', + helpSec8Title: 'Uczestnicy i ustawienia', + helpSec8Body: 'Otwórz ikonę ustawień na pasku sesji, aby ustawić częstotliwość tasowania, automatyczne zatwierdzanie i skrót "Przetasuj teraz". Kliknij licznik uczestników, aby zobaczyć, kto jest połączony — możesz wyrzucić uczestnika (może dołączyć ponownie przez link) albo go zbanować (zostanie zablokowany do końca sesji). Goście też widzą listę uczestników, ale tylko do odczytu.', + helpSec9Title: 'Kończenie sesji', + helpSec9Body: "X gospodarza → okno potwierdzenia → sesja zostaje zamknięta dla wszystkich, a playlisty na serwerze są automatycznie sprzątane. X gościa → gość opuszcza sesję, a sama sesja nadal trwa. Jeśli gospodarz milczy przez 5 minut, gość automatycznie opuszcza sesję z komunikatem; krótkie ponowne połączenia w tym czasie są niewidoczne.", + participantsInviteLabel: 'Link z zaproszeniem', + participantsCountLabel: '{{count}} w sesji', + participantsHost: 'gospodarz', + participantsEmpty: 'Nie ma jeszcze żadnych gości', + participantsKickTooltip: 'Usuń z sesji', + participantsKickAria: 'Wyrzuć {{user}}', + participantsRemoveTooltip: 'Usuń z sesji', + participantsRemoveAria: 'Usuń {{user}} z tej sesji', + participantsBanTooltip: 'Zbanuj na stałe', + participantsBanAria: 'Zbanuj na stałe użytkownika {{user}}', + participantsMuteTooltip: 'Wycisz proponowanie', + participantsUnmuteTooltip: 'Zezwól na proponowanie', + participantsMuteAria: 'Wycisz sugestie od użytkownika {{user}}', + participantsUnmuteAria: 'Zezwól na sugestie od użytkownika {{user}}', + confirmRemoveTitle: 'Usuń z sesji?', + confirmRemoveBody: '{{user}} zostanie wyrzucony z sesji, ale może ponownie dołączyć za pomocą linku z zaproszeniem.', + confirmRemoveConfirm: 'Wyrzuć', + confirmBanTitle: 'Zbanuj na stałe?', + confirmBanBody: '{{user}} zostanie wyrzucony i nie będzie mógł powrócić za pomocą linku z zaproszeniem. Ta operacja jest nieodwracalna dla tej sesji.', + confirmBanConfirm: 'Zbanuj', + confirmCancel: 'Anuluj', + confirmJoinTitle: 'Dołączyć do sesji Orbit?', + confirmJoinBody: '{{host}} zaprasza cię do "{{name}}". Dołączyć do sesji?', + confirmJoinConfirm: 'Dołącz', + confirmLeaveTitle: 'Wyjść z sesji?', + confirmLeaveBody: 'Wyjdź "{{name}}"? Możesz ponownie dołączyć za pomocą linku z zaproszeniem od {{host}}.', + confirmLeaveConfirm: 'Wyjdź', + confirmEndTitle: 'Zakończyć sesję dla wszystkich?', + confirmEndBody: '"{{name}}" zostanie zamknięta dla wszystkich użytkowników. Playlisty sesji zostaną automatycznie wyczyszczone.', + confirmEndConfirm: 'Zakończ sesję', + invalidLinkTitle: 'Link z zaproszeniem nie jest już ważny', + invalidLinkBody: 'Ta sesja Orbit już nie istnieje lub została zakończona. Poproś gospodarza o świeży link z zaproszeniem.', + settingsTitle: 'Ustawienia sesji', + settingAutoApprove: 'Automatycznie zatwierdzaj propozycje', + settingAutoApproveHint: "Propozycje gości trafiają natychmiast do Twojej kolejki. Wyłączone: zostają na liście sesji, aby można je było później przejrzeć.", + settingAutoShuffle: 'Automatyczne tasowanie', + settingAutoShuffleHint: "Okresowe tasowanie nadchodzącej kolejki algorytmem Fishera–Yatesa. Wyłączone: kolejność zmienia się tylko wtedy, gdy zmienisz ją ręcznie.", + settingShuffleInterval: 'Tasuj ponownie co', + settingShuffleIntervalHint: 'Jak często nadchodząca kolejka jest tasowana podczas trwania sesji.', + suggestBlockedMuted: 'Gospodarz wyciszył Cię w tej sesji — propozycje są wyłączone.', + settingShuffleIntervalValue_one: '{{count}} min', + settingShuffleIntervalValue_other: '{{count}} min', + settingShuffleNow: 'Przetasuj teraz', + toastSuggested: '{{user}} zaproponował "{{title}}"', + toastSuggestedMany: '{{count}} nowych propozycji w kolejce', + toastSuggestLost: 'Twoja propozycja mogła nie dotrzeć do gospodarza', + toastShuffled: 'Kolejka przetasowana', + toastJoined: 'Dołącz do sesji', + toastLoginFirst: 'Zaloguj się przed dołączeniem do sesji', + toastSwitchServer: 'Najpierw przełącz się na {{url}}, następnie wklej ponownie', + toastNoAccountForServer: "Nie masz dostępu do {{url}}. Poproś gospodarza o zaproszenie.", + toastSwitchFailed: "Nie udało przełączyć się na {{url}}", + accountPickerTitle: 'Które konto?', + accountPickerSub: 'Masz więcej niż jedno konto dla {{url}}. Wybierz konto, którego chcesz użyć do dołączenia do sesji.', + toastJoinFail: "Nie można było dołączyć do sesji", + joinErrNotFound: 'Nie znaleziono sesji', + joinErrEnded: 'Sesja się zakończyła', + joinErrFull: 'Sesja jest pełna', + joinErrKicked: "Nie możesz ponownie dołączyć do tej sesji", + joinErrNoUser: 'Brak aktywnego serwera', + joinErrServerError: "Nie udało się dołączyć", + ctxAddToSession: 'Dodaj sesję Orbit', + ctxSuggestedToast: 'Zaproponowano w sesji', + ctxSuggestFailed: "Nie udało się zaproponować — nie dołączono do sesji", + ctxAddToSessionHost: 'Dodaj do sesji Orbit', + ctxAddedHostToast: 'Dodano do sesji', + ctxAddHostFailed: "Nie udało się dodać do sesji", + bulkConfirmTitle: 'Dodać wszystko do kolejki Orbit?', + bulkConfirmBody: "Spowoduje to dodanie {{count}} utworów do wspólnej kolejki naraz. To dużo dla Twoich gości. Kontynuować?", + bulkConfirmYes: 'Dodaj wszystkie', + bulkConfirmNo: 'Anuluj', + guestLive: 'Live', + guestPlaying: 'Odtwarzane teraz', + guestPaused: 'Wstrzymane', + guestLoading: 'Ładowanie…', + guestSuggestions: 'Propozycje', + guestUpNext: 'Następne', + guestUpNextEmpty: 'Nie ma nic w kolejce. Otwórz menu kontekstowe utworu i wybierz "Dodaj do sesji Orbit", aby go zaproponować.', + guestPendingTitle: 'Oczekiwanie na gospodarza', + guestPendingHint: 'Zaproponowano — pojawi się w kolejce, gdy gospodarz go zaakceptuje.', + approvalTitle: 'Oczekujące zatwierdzenia', + approvalFrom: 'Zaproponowano przez {{user}}', + approvalAccept: 'Akceptuj', + approvalDecline: 'Odrzuć', + guestUpNextMore: '+ {{count}} więcej w kolejce hosta', + guestSubmitter: 'od {{user}}', + queueAddedByHost: 'Dodane przez gospodarza', + queueAddedByYou: 'Dodane przez Ciebie', + queueAddedByUser: 'Dodane przez {{user}}', + guestEmpty: 'Brak propozycji. Otwórz menu kontekstowe utworu i wybierz "Dodaj do sesji Orbit".', + guestFooter: "Host steruje odtwarzaniem — nie możesz zmieniać listy.", + exitKickedTitle: 'Zostałeś zbanowany z tej sesji', + exitRemovedTitle: 'Zostałeś wyrzucony z tej sesji', + exitEndedTitle: 'Gospodarz zakończył sesję', + exitHostTimeoutTitle: 'Host przestał odpowiadać', + exitHostTimeoutBody: "{{host}} od dłuższego czasu nie wysłał aktualizacji, więc \"{{name}}\" zostało zamknięte po Twojej stronie. Możesz dołączyć ponownie w dowolnym momencie za pomocą linku z zaproszeniem.", + exitKickedBody: '{{host}} zbanował cię z "{{name}}". Nie możesz dołączyć ponownie.', + exitRemovedBody: '{{host}} wyrzucił cię z "{{name}}". Możesz dołączyć ponownie w dowolnym momencie za pomocą linku z zaproszeniem.', + exitEndedBody: '"{{name}}" dobiegła końca. Mamy nadzieję, że .', + exitOk: 'OK', +}; diff --git a/src/locales/pl/player.ts b/src/locales/pl/player.ts new file mode 100644 index 00000000..3ac7a5fb --- /dev/null +++ b/src/locales/pl/player.ts @@ -0,0 +1,69 @@ +export const player = { + regionLabel: 'Odtwarzacz muzyki', + openFullscreen: 'Otwórz odtwarzacz pełnoekranowy', + fullscreen: 'Odtwarzacz pełnoekranowy', + closeFullscreen: 'Zamknij tryb pełnoekranowy', + closeTooltip: 'Zamknij (Esc)', + noTitle: 'Bez tytułu', + stop: 'Zatrzymaj', + prev: 'Poprzedni utwór', + play: 'Odtwórz', + pause: 'Wstrzymaj', + autoDjMixing: 'AutoDJ — miksowanie', + autoDjPreparing: 'AutoDJ — przygotowywanie następnego utworu', + bufferingStream: 'Ładowanie utworu z serwera', + previewActive: 'Odtwarzanie podglądu utworu', + previewLabel: 'Podgląd utworu', + delayModalTitle: 'Timer', + delayPauseSection: 'Wstrzymaj po', + delayStartSection: 'Rozpocznij po', + delayPreviewPause: 'Wstrzymaj o', + delayPreviewStart: 'Rozpocznij o', + delaySchedulePause: 'Zaplanuj pauzę', + delayScheduleStart: 'Zaplanuj start', + delayCancelPause: 'Anuluj timer pauzy', + delayCancelStart: 'Anuluj timer startu', + delayInactivePause: 'Dostępne tylko wtedy, gdy coś jest odtwarzane.', + delayInactiveStart: 'Dostępne po wstrzymaniu z załadowanym utworem lub radiem.', + delayCustomMinutes: 'Własne opóźnienie (minuty)', + delayCustomPlaceholder: 'np. 2.5', + closeDelayModal: 'Zamknij', + delayIn: 'w', + delayFmtSec: '{{n}}s', + delayFmtMin: '{{n}} min', + delayFmtHr: '{{n}} h', + delayCancel: 'Anuluj', + delayApply: 'Zastosuj', + next: 'Następny utwór', + repeat: 'Powtarzaj', + repeatOff: 'Wyłącz', + repeatAll: 'Wszystko', + repeatOne: 'Jeden', + progress: 'Postęp utworu', + volume: 'Głośność', + mute: 'Wycisz', + unmute: 'Odcisz', + toggleQueue: 'Przełącz kolejkę', + collapseQueueResize: 'Zwiń kolejkę i zmień rozmiar', + moreOptions: 'Więcej opcji', + equalizer: 'Korektor', + playbackRate: 'Prędkość odtwarzania', + miniPlayer: 'Miniodtwarzacz', + lyrics: 'Tekst utworu', + fsNowPlaying: 'Teraz odtwarzane…', + fsTrackPosition: 'Utwór {{current}} / {{total}}', + fsNext: 'Następny', + fsUpNext: 'Następny w kolejnce', + fsQueueEmpty: 'Nie ma nic w kolejce.', + shuffle: 'Przetasuj', + fsLyricsToggle: 'Teksty utworów w trybie pełnoekranowym', + lyricsLoading: 'Ładowanie tekstu utworu…', + lyricsNotFound: 'Nie znaleziono tekstu dla tego utworu', + lyricsNoSources: 'Nie wybrano źródła tekstu — włącz jakieś w Ustawienia → Teksty utworów', + lyricsSourceServer: 'Źródło: Serwer', + lyricsSourceLrclib: 'Źródło: LRCLIB', + lyricsSourceNetease: 'Źródło: Netease', + lyricsSourceLyricsplus: 'Źródło: YouLyPlus', + showDuration: 'Pokaż czas trwania', + showRemainingTime: 'Pokaż pozostały czas', +}; diff --git a/src/locales/pl/playlists.ts b/src/locales/pl/playlists.ts new file mode 100644 index 00000000..e598006e --- /dev/null +++ b/src/locales/pl/playlists.ts @@ -0,0 +1,122 @@ +export const playlists = { + title: 'Playlisty', + newPlaylist: 'Nowa playlista', + unnamed: 'Nienazwana playlista', + createName: 'Nazwa playlisty…', + create: 'Stwórz', + cancel: 'Anuluj', + empty: 'Nie masz jeszcze żadnych playlist.', + emptyPlaylist: 'Ta playlista jest pusta.', + addFirstSong: 'Dodaj pierwszy utwór', + notFound: 'Playlista nie znaleziona.', + songs_one: '{{count}} utwór', + songs_other: '{{count}} songs', + playAll: 'Odtwórz wszystkie', + playTooltip: 'Odtwórz playlistę', + shuffle: 'Przetasuj', + addToQueue: 'Dodaj do kolejki', + back: 'Powrót do playlisty', + deletePlaylist: 'Usuń', + confirmDelete: 'Naciśnij ponownie by potwierdzić', + removeSong: 'Usuń z playlisty', + addSongs: 'Dodaj utwory', + addSongsTooltip: 'Przeszukaj bibliotekę by dodać utwory', + searchPlaceholder: 'Przeszukaj bibliotekę…', + noResults: 'Brak wyników.', + suggestions: 'Proponowane utwory', + noSuggestions: 'Brak dostępnych propozycji.', + titleBadge: 'Playlista', + refreshSuggestions: 'Nowe propozycje', + addSong: 'Dodaj do playlisty', + preview: 'Podejrzyj utwór (30s)', + previewStop: 'Zatrzymaj podglądanie', + playNextSuggestion: 'Odtwórz następne', + suggestionsHint: 'Naciśniej dwukrotnie na wiersz by dodać go do playlisty', + addSelected: 'Dodaj zaznaczone', + cacheOffline: 'Zapisz playlistę offline', + offlineCached: 'Playlista zapisana', + removeOffline: 'Usuń z pamięci offline', + offlineDownloading: 'Zapisywanie… ({{done}}/{{total}} albumów)', + publicLabel: 'Publiczna', + privateLabel: 'Prywatna', + editMeta: 'Edytuj playlistę', + editNamePlaceholder: 'Nazwa playlisty…', + editCommentPlaceholder: 'Dodaj opis…', + editPublic: 'Public playlist', + editSave: 'Zapisz', + editCancel: 'Anuluj', + changeCover: 'Zmień obrazek okładki', + changeCoverLabel: 'Zmień zdjęcie', + removeCover: 'Usuń zdjęcie', + coverUpdated: 'Obrazek okładki został zaktualizowany', + metaSaved: 'Playlista została zaktualizowana', + downloadZip: 'Pobierz (ZIP)', + // Toast notifications for multi-select + addSuccess: '{{count}} utwory zostały dodane do {{playlist}}', + addPartial: '{{added}} dodano, {{skipped}} pominięto (duplicates)', + addAllSkipped: 'Wszystkie pominięte ({{count}} duplikaty)', + addedAsDuplicates: '{{count}} utworów dodanych do {{playlist}} (jako duplikaty)', + duplicateConfirmTitle: 'Znajduje się już w playliście', + duplicateConfirmMessage: 'Wszystkie {{count}} utworów znajduje się już w "{{playlist}}". Dodać je ponownie jako duplikaty?', + duplicateConfirmAction: 'Dodaj mimo wszystko', + addError: 'Błąd podczas dodawania utworów', + createAndAddSuccess: 'Playlista "{{playlist}}" utworzona z {{count}} utworami', + createError: 'Błąd podczas tworzenia playlisty', + deleteSuccess: 'Usunięto {{count}} playlist', + deleteFailed: 'Błąd podczas usuwania {{name}}', + deleteSelected: 'Usuń zaznaczone', + deleteSelectedPartial: 'Tylko {{n}} z {{total}} zaznaczonych playlist można usunąć (inne należą do innego użytkownika).', + mergeSuccess: '{{count}} utworów scalono w {{playlist}}', + mergeNoNewSongs: 'Brak nowych utworów do dodania', + mergeError: 'Błąd podczas scalania playlist', + mergeInto: 'Scal w', + selectionCount: 'Wybrano {{count}}', + select: 'Wybierz', + startSelect: 'Włącz zaznaczanie', + cancelSelect: 'Anuluj', + loadingAlbums: 'Rozpoznawanie {{count}} albumów…', + loadingArtists: 'Rozpoznawanie {{count}} wykonawców…', + myPlaylists: 'Moje playlisty', + noOtherPlaylists: 'Brak innych dostępnych playlist', + addToPlaylistSuccess: '{{count}} utworów dodano do {{playlist}}', + addToPlaylistNoNew: 'Brak nowych utworów do dodania do {{playlist}}', + addToPlaylistError: 'Błąd podczas dodawania do playlisty', + removeSuccess: 'Utwór usunięty z playlisty', + removeError: 'Błąd podczas usuwania utworu z playlisty', + importCSV: 'Importuj CSV', + importCSVTooltip: 'Import z pliku CSV Spotify', + csvImportReport: 'Raport Importu CSV', + csvImportTotal: 'Łącznie', + csvImportAdded: 'Dodane', + csvImportDuplicates: 'Duplikaty', + csvImportNotFound: 'Nie znaleziono', + csvImportNetworkErrors: 'Błędy sieciowe', + csvImportDuplicatesTitle: 'Duplikaty utworów (już w playlistie):', + csvImportNotFoundTitle: 'Utwory nie znaleziono:', + csvImportNetworkErrorsTitle: 'Błędy sieci (może ponowić import):', + csvImportDownloadReport: 'Pobierz raport', + csvImportClose: 'Zamknij', + csvImportNoValidTracks: 'Nie znaleziono prawidłowych utworów w pliku CSV', + csvImportFailed: 'Nie udało się zaimportować pliku CSV', + csvImportToast: '{{added}} dodano, {{notFound}} nie znaleziono, {{duplicates}} duplikatów', + csvImportDownloadSuccess: 'Raport pomyślnie pobrany', + csvImportDownloadError: 'Nie udało się pobrać raportu', + // Playlist folders (local, per-server organisation layer) + folders: { + newFolder: 'Nowy folder', + namePlaceholder: 'Nazwa folderu…', + create: 'Utwórz', + rename: 'Zmień nazwę', + delete: 'Usuń folder', + ungrouped: 'Bez folderu', + moveToFolder: 'Przenieś do folderu', + removeFromFolder: 'Usuń z folderu', + expandFolder: 'Rozwiń folder', + collapseFolder: 'Zwiń folder', + groupByFolders: 'Grupuj po folderach', + count_one: '{{count}} playlista', + count_other: '{{count}} playlisty', + localOnlyNotice: + 'Foldery są zapisywane tylko w PsySonic na tym urządzeniu. Navidrome i API Subsonic nie obsługują natywnie folderów playlist, więc ta struktura nie jest przechowywana na serwerze ani synchronizowana z innymi urządzeniami i aplikacjami.', + }, +}; diff --git a/src/locales/pl/queue.ts b/src/locales/pl/queue.ts new file mode 100644 index 00000000..04a3d5ae --- /dev/null +++ b/src/locales/pl/queue.ts @@ -0,0 +1,64 @@ +export const queue = { + title: 'Kolejka', + modePlaylist: 'Playlista', + modeTimeline: 'Oś czasu', + upNext: 'Następne w kolejce', + history: 'Historia', + noUpcoming: 'Brak nadchodzących utworów.', + savePlaylist: 'Zapisz playlistę', + updatePlaylist: 'Aktualizuj playlistę', + filterPlaylists: 'Filtruj playlisty…', + playlistName: 'Nazwa playlisty', + cancel: 'Anuluj', + save: 'Zapisz', + loadPlaylist: 'Załaduj playlistę', + loading: 'Ładowanie…', + noPlaylists: 'Nie znaleziono żadnej playlisty.', + load: 'Zastąp kolejkę i odtwórz', + appendToQueue: 'Dodaj do kolejki', + delete: 'Usuń', + deleteConfirm: 'Usunąć playlistę "{{name}}"?', + clear: 'Wyczyść kolejkę', + shuffle: 'Przetasuj kolejkę', + gapless: 'Bez przerwy', + crossfade: 'Crossfade', + autoDj: 'AutoDJ', + infiniteQueue: 'Nieskończona kolejka', + playlist: 'Playlista', + autoAdded: '— Dodane automatycznie —', + radioAdded: '— Radio —', + hide: 'Ukryj', + hideNowPlaying: 'Ukryj informacje "Teraz odtwarzane"', + showNowPlaying: 'Pokaż informacje "Teraz odtwarzane"', + close: 'Zamknij', + nextTracks: 'Następne utwory', + shareQueue: 'Skopiuj link do udostępnienia kolejki', + shareQueueEmpty: 'Kolejka jest pusta — nie ma czego udostępnić.', + emptyQueue: 'Kolejka jest pusta.', + crossServerEnqueueBlocked: 'Nie można dodać do bieżącej kolejki utworów z innego serwera. Najpierw zakończ lub wyczyść kolejkę.', + trackSingular: 'utwór', + trackPlural: 'utwory', + showRemaining: 'Pokaż pozostały czas', + showTotal: 'Pokaż całkowity czas', + showEta: 'Pokaż szacowany czas zakończenia', + replayGain: 'ReplayGain', + rgTrack: 'T {{db}} dB', + rgAlbum: 'A {{db}} dB', + rgPeak: 'Szczyt {{pk}}', + sourceOffline: 'Odtwarzanie z biblioteki offline', + sourceHot: 'Odtwarzanie z pamięci podręcznej', + sourceStream: 'Odtwarzanie z strumienia sieciowego', + clearCachedLoudnessWaveform: 'Wyczyść pamięć podręczną głośności i fali, a następnie ponownie przeanalizuj ten utwór', + recalculatingLoudnessWaveform: 'Ponowne obliczanie głośności i fali dla tego utworu…', + bpm: '{{bpm}} BPM', + moods: { + happy: 'Radosny', + excited: 'Ekscytujący', + calm: 'Spokojny', + peaceful: 'Kojący', + angry: 'Zły', + tense: 'Tense', + sad: 'Smutny', + melancholic: 'Melancholijny', + }, +}; diff --git a/src/locales/pl/radio.ts b/src/locales/pl/radio.ts new file mode 100644 index 00000000..3ecaa35d --- /dev/null +++ b/src/locales/pl/radio.ts @@ -0,0 +1,37 @@ +export const radio = { + title: 'Radio internetowa', + empty: 'Nie skonifgurowano żadnych stacji internetowych.', + addStation: 'Dodaj stację', + editStation: 'Edytuj', + playStation: 'Odtwórz stację', + stopStation: 'Zatrzymaj stację', + deleteStation: 'Usuń stację', + confirmDelete: 'Naciśnij ponownie by potwierdzić', + stationName: 'Nazwa stacji…', + streamUrl: 'URL Strumienia…', + homepageUrl: 'URL strony głównej (opcjonalne)', + save: 'Zapisz', + cancel: 'Anuluj', + live: 'LIVE', + liveStream: 'Internet Radio', + openHomepage: 'Otwórz stronę główną', + changeCoverLabel: 'Zmień okładkę', + removeCover: 'Usuń okładkę', + browseDirectory: 'Przeszukaj katalog', + directoryPlaceholder: 'Wyszukaj stacje…', + noResults: 'Nie znaleziono stacji.', + stationAdded: 'Dodano stację', + filterAll: 'Wszystkie', + filterFavorites: 'Ulubione', + sortManual: 'Ręcznie', + sortAZ: 'A → Z', + sortZA: 'Z → A', + sortNewest: 'Najnowsze', + favorite: 'Dodaj do ulubionych', + unfavorite: 'Usuń z ulubionych', + noFavorites: 'Brak ulubionych stacji.', + listenerCount_one: '{{count}} słuchacz', + listenerCount_other: '{{count}} słuchaczy', + recentlyPlayed: 'Odtwarzane ostatnio', + upNext: 'Następne', +}; diff --git a/src/locales/pl/randomAlbums.ts b/src/locales/pl/randomAlbums.ts new file mode 100644 index 00000000..62c6766c --- /dev/null +++ b/src/locales/pl/randomAlbums.ts @@ -0,0 +1,4 @@ +export const randomAlbums = { + title: 'Losowe albumy', + refresh: 'Odśwież', +}; diff --git a/src/locales/pl/randomLanding.ts b/src/locales/pl/randomLanding.ts new file mode 100644 index 00000000..32c3c783 --- /dev/null +++ b/src/locales/pl/randomLanding.ts @@ -0,0 +1,9 @@ +export const randomLanding = { + title: 'Stwórz mix', + mixByTracks: 'Miksuj po utworach', + mixByTracksDesc: 'Losowy wybór utworów z całej biblioteki', + mixByAlbums: 'Miksuj po albumach', + mixByAlbumsDesc: 'Losowo wybrane albumy do kolejnego odkrywania', + mixByLucky: 'Szczęśliwy miks', + mixByLuckyDesc: 'Szybki inteligentny miks na podstawie Twoich najpopularniejszych wykonawców, albumów i ocen', +}; diff --git a/src/locales/pl/randomMix.ts b/src/locales/pl/randomMix.ts new file mode 100644 index 00000000..58291abc --- /dev/null +++ b/src/locales/pl/randomMix.ts @@ -0,0 +1,40 @@ +export const randomMix = { + title: 'Losowy miks', + remix: 'Remix', + remixTooltip: 'Załaduj nowe losowe utwory', + remixGenre: 'Remixuj {{genre}}', + remixTooltipGenre: 'Załaduj więcej utworów z gatunku {{genre}}', + playAll: 'Odtwórz wszystkie', + trackTitle: 'Tytuł', + trackArtist: 'Wykonawca', + trackAlbum: 'Album', + trackFavorite: 'Ulubione', + trackDuration: 'Czas trwania', + favoriteAdd: 'Dodaj do ulubionych', + favoriteRemove: 'Usuń z ulubionych', + play: 'Odtwórz', + trackGenre: 'Gatunek', + mixSettingsHeader: 'Ustawienia miksowania', + exclusionsHeader: 'Wykluczenia', + filterPanelInexactSizeNote: 'Rozmiar miksu jest celem — przy dużych żądaniach może zostać zwróconych mniej unikalnych utworów, jeśli losowa pula serwera się wyczerpie.', + mixSize: 'Rozmiar playlisty', + excludeAudiobooks: 'Wyklucz audiobooki i odtworzenia radia', + excludeAudiobooksDesc: 'Dopasowuje słowa kluczowe do gatunku, tytułu, albumu i wykonawcy — np. Hörbuch, Audiobook, Spoken Word, …', + genreBlocked: 'Słowo kluczowe wykluczone', + genreAddedToBlacklist: 'Dodano do listy filtrów', + genreAlreadyBlocked: 'Już wykluczone', + artistBlocked: 'Wykonawca wykluczony', + artistAddedToBlacklist: 'Wykonawcę dodano do listy filtrów', + artistClickHint: 'Kliknij, aby wykluczyć tego wykonawcę', + blacklistToggle: 'Filtr słów kluczowych', + genreMixTitle: 'Miks gatunków', + genreMixDesc: '20 najczęstszych gatunków według liczby utworów — kliknij, aby wczytać losowy miks', + genreMixAll: 'Wszystkie utwory', + genreMixLoadMore: 'Załaduj 10 więcej', + genreMixNoGenres: 'Nie znaleziono gatunków na serwerze.', + noSongsMatchFilters: 'Żadne utwory nie pasują do bieżących filtrów. Spróbuj usunąć wykluczone słowa kluczowe albo zmienić ustawienia miksu.', + shuffleGenres: 'Pokaż inne gatunki', + filterPanelTitle: 'Filtry', + filterPanelDesc: 'Kliknij tag gatunku albo nazwę wykonawcy na liście utworów poniżej, aby wykluczyć je z przyszłych miksów.', + genreClickHint: 'Kliknij tag gatunku, aby dodać go\njako słowo kluczowe filtra.\nDopasowuje gatunek, tytuł, album i wykonawcę.', +}; diff --git a/src/locales/pl/search.ts b/src/locales/pl/search.ts new file mode 100644 index 00000000..3dd95feb --- /dev/null +++ b/src/locales/pl/search.ts @@ -0,0 +1,87 @@ +export const search = { + placeholder: 'Szukaj wykonawcy, albumu lub utworu…', + noResults: 'Brak wyników dla "{{query}}"', + artists: 'Wykonawcy', + albums: 'Albumy', + songs: 'Utwory', + clearLabel: 'Wyczyść wyszukiwanie', + addedToQueueToast: 'Dodano "{{title}}" do kolejki', + title: 'Szukaj', + resultsFor: 'Wyniki dla "{{query}}"', + album: 'Album', + advanced: 'Wyszukiwanie zaawansowane', + localIndexBadge: 'Indeks lokalny', + localIndexBadgeTooltip: 'Wyniki z indeksu lokalnej biblioteki na tym urządzeniu', + networkSearchBadge: 'Wyszukiwanie na serwerze', + networkSearchBadgeTooltip: 'Wyniki z wyszukiwania na żywo na połączonym serwerze', + liveSearchFailed: 'Wyszukiwanie nie powiodło się — spróbuj ponownie', + advancedSearchTerm: 'Wyszukaj frazę', + advancedSearchPlaceholder: 'Tytuł, album, wykonawca…', + advancedGenre: 'Gatunek', + advancedAllGenres: 'Wszystkie gatunki', + advancedYear: 'Rok', + advancedYearFrom: 'od', + advancedYearTo: 'do', + advancedBpm: 'BPM', + advancedBpmClear: 'Wyczyść filtr BPM', + advancedLossless: 'Format', + advancedLosslessOnly: 'Tylko bezstratne', + bpmSourceTag: 'BPM z tagu pliku', + bpmSourceAnalysis: 'BPM z analizy audio', + advancedMoodGroup: 'Nastrój', + advancedAllMoods: 'Wszystkie nastroje', + advancedMoodLocalNote: 'Wymaga lokalnego indeksu biblioteki i analizy utworów', + scopeRowLabel: 'Szukaj w:', + scopeAllTooltip: 'Szukaj wszędzie', + scopeArtistsChipTooltip: 'Ogranicz wyniki do wykonawców', + scopeAlbumsChipTooltip: 'Ogranicz wyniki do albumów', + scopeSongsChipTooltip: 'Ogranicz wyniki do utworów', + advancedAll: 'Wszystko', + advancedSearch: 'Szukaj', + advancedEmpty: 'Wpisz szukaną frazę albo wybierz filtr, aby rozpocząć.', + advancedNoResults: 'Nie znaleziono wyników.', + advancedGenreNote: 'Utwory są wybierane losowo z tego gatunku.', + recentSearches: 'Ostatnie wyszukiwania', + browse: 'Przeglądaj', + emptyHint: 'Co chcesz usłyszeć?', + scopeArtistsPlaceholder: 'Szukaj wykonawcy…', + scopeArtistsBadgeTooltip: 'Kliknij, aby usunąć', + scopeArtistsGhostTooltip: 'Kliknij, aby wyszukać tylko na tej stronie', + scopeAlbumsPlaceholder: 'Szukaj albumu…', + scopeAlbumsBadgeTooltip: 'Kliknij, aby usunąć', + scopeAlbumsGhostTooltip: 'Kliknij, aby wyszukać tylko na tej stronie', + scopeNewReleasesPlaceholder: 'Szukaj nowych wydawnictw…', + scopeNewReleasesBadgeTooltip: 'Kliknij, aby usunąć', + scopeNewReleasesGhostTooltip: 'Kliknij, aby wyszukiwać tylko na tej stronie', + scopeTracksPlaceholder: 'Szukaj utworu po tytule, wykonawcy lub albumie…', + scopeTracksBadgeTooltip: 'Kliknij, aby usunąć', + scopeTracksGhostTooltip: 'Kliknij, aby wyszukać tylko na tej stronie', + scopeComposersPlaceholder: 'Szukaj kompozytora…', + scopeComposersBadgeTooltip: 'Kliknij, aby usunąć', + scopeComposersGhostTooltip: 'Kliknij, aby wyszukać tylko na tej stronie', + genres: 'Gatunki', + shareLink: 'Udostępnij link', + shareTrackTitle: 'Udostępniony utwór', + shareQueueTitle_one: 'Udostępniona kolejka ({{count}} utwór)', + shareQueueTitle_other: 'Udostępniona kolejka ({{count}} utworów)', + shareQueueAction: 'Dodaj do kolejki', + shareQueueing: 'Dodawanie do kolejki…', + shareQueued_one: 'Dodano {{count}} udostępniony utwór do kolejki', + shareQueued_other: 'Dodano {{count}} udostępnionych utworów do kolejki', + shareQueuedPartial: 'Dodano {{queued}} z {{total}} udostępnionych utworów do kolejki ({{skipped}} nie znaleziono).', + shareUnsupportedTitle: 'Tego linku udostępniania nie można tutaj użyć', + shareUnsupportedSub: 'Użyj linku udostępniania utworu, albumu, wykonawcy, kompozytora albo kolejki.', + shareFromServer: 'Z {{server}}', + shareQueuePreview: 'Podejrzyj utwory', + shareQueuePreviewLoading: 'Ładowanie utworów…', + shareQueuePreviewEmpty: 'Nie znaleziono na serwerze żadnych utworów z tego linku.', + shareQueuePreviewSkipped: 'Nie znaleziono {{skipped}} z {{total}} utworów na tym serwerze.', + moodGroups: { + joy: 'Radość', + sadness: 'Smutek', + dance: 'Taniec', + work: 'Praca', + romance: 'Romans', + anger: 'Gniew', + }, +}; diff --git a/src/locales/pl/settings.ts b/src/locales/pl/settings.ts new file mode 100644 index 00000000..cb745996 --- /dev/null +++ b/src/locales/pl/settings.ts @@ -0,0 +1,759 @@ +export const settings = { + title: 'Ustawienia', + language: 'Język', + languageEn: 'English', + languageDe: 'Deutsch', + languageEs: 'Español', + languageFr: 'Français', + languageNl: 'Nederlands', + languageNb: 'Norsk', + languageRu: 'Русский', + languageZh: '中文', + languageRo: 'Română', + languageJa: '日本語', + languageHu: 'Magyar', + languagePl: 'Polski', + font: 'Czcionka', + fontHintOpenDyslexic: 'Przyjazna dla dyslektyków · brak obsługi chińskiego', + theme: 'Motyw', + appearance: 'Wygląd', + servers: 'Serwery', + serverName: 'Nazwa Serwera', + serverUrl: 'URL Serwera', + serverUrlPlaceholder: '192.168.1.100:4533 lub https://music.example.com', + serverAlternateUrl: 'Drugi adres (opcjonalny)', + serverAlternateUrlPlaceholderPublic: 'https://music.example.com', + serverAlternateUrlPlaceholderLocal: '192.168.1.100:4533', + serverAlternateUrlHintAddPublic: 'Możesz dodać adres publiczny by uzyskać dostęp poza swoją siecią domową.', + serverAlternateUrlHintAddLocal: 'Możesz dodać adres lokalny by uzyskać szybszy dostęp w domu.', + serverBothLanError: 'Oba adresy są lokalne - zachowaj tylko jeden lub dodaj adres publiczny.', + dualAddressVerifying: 'Sprawdzanie czy oba adresy wskazują na ten sam serwer…', + dualAddressMismatch: 'Adresy wskazują na różne serwery. Popraw je i spróbuj ponownie.', + dualAddressInsufficient: 'Nie można było potwierdzić, że oba adresy wskazują na ten sam serwer. Usuń jeden adres by móc kontynuować.', + dualAddressUnreachable: 'Nie można połączyć się z {{host}}. Sprawdź adres i sieć, następnie spróbuj ponownie.', + urlRemigrationTitle: 'Przenieść dane biblioteki?', + urlRemigrationMessage: 'Zmiana adresu spowoduje przeniesienie całej biblioteki, analiz oraz danych pamięci podręcznej okładek i artystów z {{oldKey}} do {{newKey}}. Tej operacji nie można cofnąć.', + urlRemigrationConfirm: 'Przenieś dane', + urlRemigrationProgress: 'Trwa przenoszenie danych biblioteki…', + urlRemigrationFailureInspect: 'Niemożliwe było sprawdzenie co zostanie przeniesione. Spróbuj ponownie, lub otwórz dziennik debugowania.', + urlRemigrationFailureRun: 'Nie można było przenieść danych biblioteki. Twoje zapisane dane pozostały niezmienione — spróbuj ponownie.', + urlRemigrationFailureCoverRename: 'Dane biblioteki zostały przeniesione, ale nazwy plików okładek nie mogły zostać zmienione. Okładki zostaną zrekonsturowane podczas następnego dostępu.', + shareUsesLocalUrl: 'Korzystaj z adresu lokalnego przy łączach do udostępniania.', + shareUsesLocalUrlDesc: 'Dotyczy zaproszeń Orbit i udostępniania biblioteki. Domyślnie: adres publiczny.', + serverUsername: 'Nazwa użytkownika', + serverPassword: 'Hasło', + customHeadersTitle: 'Własne nagłówki HTTP', + customHeadersHelp: 'Dla bramek reverse proxy (Pangolin, Cloudflare Access). Wysyłane tylko do Twojego serwera — nie do usług zewnętrznych.', + customHeadersNamePlaceholder: 'Nazwa nagłówka', + customHeadersValuePlaceholder: 'Wartość nagłówka', + customHeadersAddRow: 'Dodaj nagłówek', + customHeadersRemoveRow: 'Usuń nagłówek', + customHeadersApplyTo: 'Zastosuj nagłówki do', + customHeadersApplyTo_public: 'Adres publiczny', + customHeadersApplyTo_local: 'Adres lokalny', + customHeadersApplyTo_both: 'Oba adresy', + customHeadersNotInShare: 'Własne nagłówki nie są dołączane do zaproszeń udostępniania — skonfiguruj je ponownie na każdym urządzeniu.', + 'customHeadersValidation.tooMany': 'Za dużo własnych nagłówków (maks. 16).', + 'customHeadersValidation.nameRequired': 'Nazwa nagłówka jest wymagana.', + 'customHeadersValidation.nameTooLong': 'Nazwa nagłówka jest za długa.', + 'customHeadersValidation.valueTooLong': 'Wartość nagłówka jest za długa.', + 'customHeadersValidation.crlf': 'Nazwy i wartości nagłówków nie mogą zawierać podziałów wiersza.', + 'customHeadersValidation.blocked': 'Ta nazwa nagłówka jest niedozwolona.', + 'customHeadersValidation.duplicate': 'Zduplikowana nazwa nagłówka.', + addServer: 'Dodaj serwer', + addServerTitle: 'Dodaj nowy serwer', + editServer: 'Edytuj', + editServerTitle: 'Edytuj serwer', + useServer: 'Użyj', + deleteServer: 'Usuń', + noServers: 'Żaden serwer nie został zapisany.', + serverActive: 'Aktywny', + serverVersionUnknown: 'Nieznana wersja serwera', + confirmDeleteServer: 'Usuń serwer "{{name}}"?', + confirmDeleteServerLibrary: 'Usuń również indeks lokalnej biblioteki tego serwera? Kliknij Anuluj, aby zachować kopię z pamięci podręcznej do użytku w trybie offline.', + serverConnecting: 'Łączenie…', + serverConnected: 'Połączono!', + serverFailed: 'Połączenie nieudane.', + testBtn: 'Sprawdź połączenie', + testingBtn: 'Sprawdzanie…', + serverCompatible: 'Stworzony dla Navidrome. Inne serwery komponatybilne z Subsonic (Gonic, Airsonic, …) mogę działać, ale z ograniczoną funkcjonalnością, gdyż Psysonic korzysta z wielu endpointów API charakterystycznych dla Navidrome.', + userMgmtTitle: 'Zarządzanie użytkownikiem', + userMgmtDesc: 'Zarządzaj użytkownikami na tym serwerze. Wymaga przywilejów administratora.', + userMgmtNoAdmin: 'Potrzebujesz przywilejów administratora by móc zarządzać użytkownikami na tym serwerze.', + userMgmtLoadError: 'Nie udało się załadować użytkowników.', + userMgmtLoadFriendly: 'Serwer nie odpowiedział - to zwykle jednorazowy przypadek', + userMgmtRetry: 'Spróbuj ponownie', + userMgmtEmpty: 'Nie znaleziono żadnych użytkowników.', + userMgmtYouBadge: 'Ty', + userMgmtAdminBadge: 'Administrator', + userMgmtAddUser: 'Dodaj użytkownika', + userMgmtAddUserTitle: 'Dodaj nowego użytkownika', + userMgmtEditUserTitle: 'Edytuj użytkownika', + userMgmtUsername: 'Nazwa użytkownika', + userMgmtName: 'Wyświetlana nazwa', + userMgmtEmail: 'Email', + userMgmtPassword: 'Hasło', + userMgmtPasswordEditHint: 'Wprowadź nowe hasło, by je zaktualizować.', + userMgmtRoleAdmin: 'Administrator', + userMgmtLibraries: 'Biblioteki', + userMgmtLibrariesAdminHint: 'Użytkownicy będący administratorami automatycznie mają dostęp do wszystkich bibliotek.', + userMgmtLibrariesEmpty: 'Nie znaleziono dostępnych bibliotek na tym serwerze.', + userMgmtLibrariesValidation: 'Wybierz przynajmniej jedną bibliotekę.', + userMgmtLibrariesUpdateError: 'Użytkownik został zapisany, ale nie udało się przypisać biblioteki', + userMgmtNoLibraries: 'Nie ma ani jednej przypisanej biblioteki.', + userMgmtNeverSeen: 'Nigdy', + userMgmtSave: 'Zapisz', + userMgmtCancel: 'Anuluj', + userMgmtDelete: 'Usuń', + userMgmtEdit: 'Edytuj', + userMgmtConfirmDelete: 'Usuń użytkownika "{{username}}"? Tej operacji nie można cofnąć.', + userMgmtCreateError: 'Nie udało się utworzyć użytkownika.', + userMgmtUpdateError: 'Nie udało się zaktualizować użytkownika.', + userMgmtDeleteError: 'Nie udało się usunąć użytkownika.', + userMgmtCreated: 'Użytkownik został utworzony.', + userMgmtUpdated: 'Użytkownik został zaktualizowany.', + userMgmtDeleted: 'Użytkownik został usunięty.', + userMgmtValidationMissing: 'Nazwa użytkownika, wyświetlana nazwa oraz hasło są wymagane.', + userMgmtValidationMissingIdentity: 'Nazwa użytkownika i wyświetlana nazwa są wymagane.', + userMgmtMagicStringGenerate: 'Wygeneruj magic string', + userMgmtSaveAndMagicString: 'Zapisz i skopiuj magic string do schowka', + userMgmtMagicStringPasswordNavHint: + 'Navidrome zapisze to hasło dla użytkownika. Jeżeli będzie się różnić od aktualnego, serwer zaktualizuje hasło logowania.', + userMgmtMagicStringPlaintextWarning: + 'Bądź ostrożny podczas udostępniania magic string: zawiera w sobie niezaszyfrowane hasło (zakodowanie to nie szyfracja). Każdy z pełnym magic string\'iem będzie mógł się zalogować jako ten użytkownik.', + userMgmtMagicStringCopied: 'Magic string skopiowany do schowka.', + userMgmtMagicStringCopyFailed: 'Nie można było skopiować do schowka.', + userMgmtMagicStringLoginFailed: 'Sprawdzenie hasła nie powiodło się — nie można zweryfikować danych uwierzytelniających.', + userMgmtMagicStringModalTitle: 'Generowanie magic string', + userMgmtMagicStringModalDesc: 'Wprowadź hasło Subsonic dla użytkownika "{{username}}". Jest zawarte w skopiowanym magic string.', + userMgmtMagicStringModalConfirm: 'Skopiuj string', + audiomuseTitle: 'AudioMuse-AI (Navidrome)', + audiomuseBadge: 'AudioMuse-AI', + audiomuseDesc: + 'Włącz jeżeli ten serwer posiada skonfigurowany AudioMuse-AI Navidrome plugin. Włącza funkcję Instant Mix z utworów i wykorzystuje podobnych artystów po stronie serwera zamiast Last.fm na stronach artystów.', + audiomuseStatusActive: 'Aktywny', + audiomuseStatusChecking: 'Sprawdzanie…', + audiomuseStatusNotDetected: 'Nie znaleziono', + audiomuseStatusProbeFailed: 'Sprawdzenie nie powiodło się', + audiomuseIssueHint: + 'Ostatnio zawiodła funkcja Instant Mix — sprawdź wtyczkę Navidrome i API AudioMuse. Pokazywanie podobnych artystów powróci do korzystania z Last.fm, gdy serwer zwróci wartość none.', + connected: 'Połączono', + failed: 'Nie powiodło się', + eqTitle: 'Equalizer', + eqEnabled: 'Włącz Equalizer', + eqPreset: 'Preset', + eqPresetCustom: 'Własny', + eqPresetBuiltin: 'Wbudowane presety', + eqPresetCustomGroup: 'Moje presety', + eqPresetAutoEqGroup: 'AutoEQ', // Propozycja: AutoEQ + eqSavePreset: 'Zapisz jako preset', + eqPresetName: 'Nazwa presetu…', + eqDeletePreset: 'Usuń preset', + eqResetBands: 'Wyzeruj pasma', + eqPreGain: 'Wzmocnienie wstępne', + eqResetPreGain: 'Resetuj wzmocnienie wstępne', + eqAutoEqTitle: 'Wyszukiwarka słuchawek AutoEQ', + eqAutoEqPlaceholder: 'Wyszukaj model słuchawek / IEM…', + eqAutoEqSearching: 'Wyszukiwanie…', + eqAutoEqNoResults: 'Nic nie znaleziono', + eqAutoEqError: 'Wyszukiwanie nie powiodło się', + eqAutoEqRateLimit: 'Osiągnięto limit zapytań API GitHuba — spróbuj ponownie za minutę', + eqAutoEqFetchError: 'Nie udało się pobrać profilu EQ', + behavior: 'Zachowanie aplikacji', + groupTray: 'Zasobnik systemowy', + groupLinuxRendering: 'Renderowanie w Linuksie', + groupClock: 'Zegar', + groupDisplay: 'Wyświetlanie', + groupWindow: 'Okno', + cacheTitle: 'Maksymalny rozmiar pamięci', + cacheDesc: 'Pamięć podręczna przeglądarki dla okładek i obrazów artystów (IndexedDB). Najstarsze wpisy są automatycznie usuwane, gdy brakuje miejsca..', + cacheUsedImages: 'Grafiki:', + cacheUsedOffline: 'Utwory offline:', + cacheUsedHot: 'Rozmiar na dysku:', + hotCacheTrackCount: 'Utwory w pamięci podręcznej:', + cacheMaxLabel: 'Rozmiar maksymalny', + imageCacheScopeLabel: 'Zakres', + imageCacheSubTitle: 'Podgląd w przeglądarce', + coverDiskCacheSubTitle: 'Pamięć podręczna okładki na dysku', + coverCacheStrategyTitle: 'Pamięć podręczna okładki', + coverCacheStrategyDesc: 'Możesz wybrać strategię dla każdego serwera: Leniwa — ładuje okładki tylko wtedy gdy są potrzebne; Agresywna — ładuje okładki gdy są potrzebne + wstępne ładowanie w tle.', + coverCacheStrategyLabel: 'Strategia', + coverCacheStrategyServerLabel: 'Serwer', + coverCacheStrategyProgressLabel: 'Pamięć podręczna', + coverCacheStrategyActionsLabel: 'Akcje', + coverCacheStrategyLazy: 'Leniwa', + coverCacheStrategyLazyDesc: 'Ładuje okładki tylko wtedy gdy są potrzebne.', + coverCacheStrategyAggressive: 'Agresywna', + coverCacheStrategyAggressiveDesc: 'Leniwa + dodatkowe wstępne ładowanie w tle.', + coverCacheStrategyDiskUsage: 'Na dysku: {{size}}', + coverCacheStrategyProgressValue: '{{percent}}% ({{done}}/{{total}}) · {{size}}', + coverCacheStrategyClearAction: 'Wyczyść pamięć podręczną okładek', + coverCacheStrategyClearTitle: 'Clear cover cache?', + coverCacheStrategyClearDesc: 'Usuń wszystkie zapisane w pamięci podręcznej obrazy okładek dla {{server}}. Zostaną ponownie pobrane gdy będą potrzebne.', + coverCacheStrategyClearConfirm: 'Wyczyść', + coverCacheStrategyClearCancel: 'Anuluj', + coverCacheStrategyClearSuccess: 'Pamięć podręczna okładek została wyczyszczona dla tego serwera.', + coverCacheStrategyClearError: 'Nie udało się wyczyścić pamięci podręcznej okładek.', + coverCacheStrategyServerRemoved: 'usunięto serwer', + cacheClearBtn: 'Wyczyść pamięć podręczną', + cacheClearWarning: 'Usuwa wszystkie zapisane w pamięci przeglądarki obrazy okładek i artystów. Zostaną ponownie pobrane gdy będą potrzebne.', + cacheClearConfirm: 'Wyczyść pamięć podręczną obrazów', + cacheClearCancel: 'Anuluj', + waveformCacheCleared: 'Wyczyszczono pamięć podręczną przebiegów ({{count}} wierszy).', + waveformCacheClearFailed: 'Nie udało się wyczyścić pamięci podręcznej przebiegu.', + storageTabTitle: 'Offline i pamięć podręczna', + mediaDirTitle: 'Folder multimediów', + mediaDirDesc: 'Główny folder do lokalnego odtwarzania. Biblioteka offline używa biblioteki/; kolejka prefetch używa pamięci podręcznej/\n.', + mediaDirDefault: 'Domyślny (App Data)', + mediaDirChange: 'Zmień folder', + mediaDirClear: 'Przywróć domyślny', + mediaDirHint: 'Nowa pobrane pliki będą korzystać z tej lokacji. Istniejące pliki pozostają w swoich oryginalnych ścieżkach, dopóki nie zostaną usunięte.', + offlineStorageTitle: 'Pamięć biblioteki offline', + offlineDirTitle: 'Biblioteka offline (W aplikacji)', + offlineDirDesc: 'Miejsce przechowywania utworów dostępnych offline w Psysonic.', + offlineDirDefault: 'Domyślny (App Data)', + offlineDirChange: 'Zmień folder', + offlineDirClear: 'Przywróć domyślny', + offlineDirHint: 'Nowa pobrane pliki będą korzystać z tej lokacji. Istniejące pliki pozostają w swoich oryginalnych ścieżkach, dopóki nie zostaną usunięte.', + hotCacheTitle: 'Pamięć podręczna szybkiego odtwarzania', + hotCacheDisclaimer: 'Wstępnie wczytuje nadchodzące utwory z kolejki i zachowuje poprzednie. Po włączeniu wykorzystuje miejsce na dysku i sieć.', + hotCacheDirDefault: 'Domyślny (App Data)', + hotCacheDirChange: 'Zmień folder', + hotCacheDirClear: 'Przywróć domyślny', + hotCacheDirHint: 'Zmiana folderu resetuje indeks w aplikacji; pliki już na dysku pozostają w swoich oryginalnych ścieżkach, dopóki nie zostaną usunięte.', + hotCacheEnabled: 'Włącz pamięć podręczną szybkiego odtwarzania', + hotCacheMaxMb: 'Maksymalny rozmiar pamięci podręcznej', + hotCacheDebounce: 'Opóźnienie przy zmianie w kolejce', + hotCacheDebounceImmediate: 'Natychmiastowe', + hotCacheDebounceSeconds: '{{n}} s', + hotCacheClearBtn: 'Wyczyść pamięć podręczną szybkiego odtwarzania', + audioOutputDevice: 'Urządzenie wyjściowe audio', + audioOutputDeviceDesc: 'Wybierz urządzenie audio, przez które odtwarzany jest Psysonic. Zmiany zaczną obowiązywać natychmiast, a bieżący utwór zostanie ponownie uruchomiony.', + audioOutputDeviceDefault: 'Domyślne systemowe', + audioOutputDeviceRefresh: 'Odśwież listę urządzeń', + audioOutputDeviceOsDefaultNow: 'obecne wyjście systemowe', + audioOutputDeviceListError: 'Nie można było załadować listy urządzeń audio.', + audioOutputDeviceNotInCurrentList: 'nie ma go na aktualnej liście', + audioOutputDeviceRememberEq: 'Zapamiętaj EQ dla każdego urządzenia', + audioOutputDeviceRememberEqDesc: 'Save the equalizer settings for each audio output device and restore them automatically when you switch devices. Profiles switch only when you pick a device here, and the system default uses a single shared profile.', // Propozycja: Zapisuj ustawienia korektora dla każdego urządzenia wyjściowego audio i automatycznie przywracaj je po przełączeniu urządzenia. Profile przełączają się tylko wtedy, gdy wybierzesz urządzenie tutaj, a domyślne urządzenie systemowe używa jednego wspólnego profilu. + hiResTitle: 'Natywne odtwarzanie w wysokiej rozdzielczości', + hiResEnabled: 'Włącz natywne odtwarzanie w wysokiej rozdzielczości', + hiResDesc: "Wymusza 44.1 kHz dla maksymalnej stabilności. Włącz tylko wtedy, gdy sprzęt i sieć niezawodnie obsługują wysokie częstotliwości próbkowania (88.2 kHz+).", + hiResCrossfadeResampleTitle: 'Częstotliwość mieszania dla Crossfade / AutoDJ / przejść bez przerw', + hiResCrossfadeResampleDesc: 'Gdy sąsiednie utwory mają różne częstotliwości próbkowania, obie strony są resamplowane do tej częstotliwości podczas crossfade, AutoDJ i przejść bez przerw.', + hiResCrossfadeResample44: '44.1 kHz', + hiResCrossfadeResample88: '88.2 kHz', + hiResCrossfadeResample96: '96 kHz', + hiResCrossfadeResampleWarning: 'Resampling zużywa więcej CPU i pamięci — wybierz ostrożnie na wolniejszych urządzeniach.', + showArtistImages: 'Pokaż zdjęcia artystów', + showArtistImagesDesc: 'Wczytaj i wyświetl zdjęcia artystów w przeglądzie artystów. Wyłączony domyślnie, aby zmniejszyć obciążenie dysku serwera I/O i obciążenie sieci w dużych bibliotekach.', + showOrbitTrigger: 'Pokaż "Orbit" w nagłówku', + showOrbitTriggerDesc: 'Przycisk na górnym pasku służący do rozpoczynania wspólnej sesji słuchania lub dołączania do niej. Ukryj go, jeśli nie korzystasz z Orbit — możesz go ponownie włączyć tutaj.\n', + showTrayIcon: 'Pokaż ikonę zasobnika systemowego', + showTrayIconDesc: 'Wyświetl ikonę Psysonic w obszarze powiadomień systemu/pasku menu.', + minimizeToTray: 'Minimalizuj do zasobnika systemowego', + minimizeToTrayDesc: 'Podczas zamykania okna, zamiast wyłączać Psysonic, pozostaw go uruchomionym w zasobniku systemowym.', + clockFormat: 'Format zegara', + clockFormatDesc: 'Wyświetlacz zegara ściennego używany przez kolejkę ETA i podgląd timera uśpienia.', + clockFormatAuto: 'Auto (ustawienia regionalne systemu)', + clockFormatTwentyFour: '24 godzinny', + clockFormatTwelve: '12 godzinny', + preloadMiniPlayer: 'Wstępnie załaduj mini odtwarzacz', + preloadMiniPlayerDesc: 'Wstępnie załaduj okno mini odtwarzacza w tle podczas uruchamiania aplikacji, aby zawartość została wyświetlona natychmiastowo po pierwszym otwarciu. Używa małej ilości dodatkowej pamięci.', + discordRichPresence: 'Discord Rich Presence', + discordRichPresenceDesc: 'Pokaż aktualnie odtwarzany utwór na Twoim profilu Discord. Wymaga uruchomienia Discorda.', + discordRichPresenceNotice: 'Uwaga: to wbudowana wtyczka Discord Rich Presence od Psysonic. Jeśli wolisz korzystać z oficjalnej wtyczki Discord Rich Presence od Navidrome, zostaw tę opcję wyłączoną i włącz opcję "Pokaż w Teraz odtwarzane" poniżej.', + useCustomTitlebar: 'Niestandardowy pasek tytułu', + useCustomTitlebarDesc: 'Zastąp systemowy pasek tytułu wbudowanym w aplikację, pasującym do motywu aplikacji. Wyłącz, aby używać natywnego paska tytułowego GNOME/GTK.', + windowButtonStyle: 'Przyciski okna', + windowButtonStyleDesc: 'Wybierz wygląd przycisków minimalizacji, maksymalizacji i zamknięcia.', + windowButtonsDots: 'Kropki', + windowButtonsDotsGlyph: 'Kropki + ikony', + windowButtonsFlat: 'Płaski', + windowButtonsPill: 'Kapsułka', + windowButtonsOutline: 'Zarys', + windowButtonsGlyph: 'Minimalny', + showMinimizeButton: 'Pokaż przycisk minimalizacji', + showMinimizeButtonDesc: 'Wyłączy by pokazać jedynie przycisk maksymalizacji i zamknięcia.', + linuxWebkitSmoothScroll: 'Płynne przewijanie kółkiem (Linux)', + linuxWebkitSmoothScrollDesc: 'Włączone: przewijanie bezwładnościowe. Wyłączone: linia po linii, w stylu GTK.', + linuxWebkitInputForceRepaint: 'Wymuś odświeżanie pól po ustawieniu fokusu (Linux)', + linuxWebkitInputForceRepaintDesc: 'Obejście problemu dla WebKitGTK 2.50.x, gdzie pola tekstowe zawieszają się po kliknięciu. Ikony wyszukiwania na krótko migają po włączeniu fokusa.', + linuxWaylandTextRender: 'Renderowanie tekstu Wayland (Linux)', + linuxWaylandTextRenderDesc: + 'Wygładzanie czcionek w interfejsie użytkownika aktualizuje się natychmiast. Sprzętowe przyspieszenie WebKit (predefiniowane ustawienia Sharp/GPU) jest zapisywane i stosowane przy następnym uruchomieniu aplikacji — zmiana tego ustawienia na żywo może zablokować WebKitGTK w niektórych konfiguracjach.', + linuxWaylandTextRenderBalanced: 'Zbalansowane', + linuxWaylandTextRenderSharp: 'Ostre (Przyjazny dla procesora)', + linuxWaylandTextRenderGpu: 'Z priorytetem GPU', + linuxWaylandTextRenderMinimal: 'Minimalne (domyślne wygładzanie CSS)', + discordCoverTitle: 'Źródło okładki', + discordCoverDesc: 'Skąd pochodzi okładka albumu wyświetlana na Twoim profilu Discord.', + discordCoverNone: 'Żadna (tylko ikona aplikacji)', + discordCoverServer: 'Serwer (przez info albumu)', + discordCoverApple: 'Apple Music', + discordOptions: 'Zaawansowane ustawienia Discord', + discordTemplates: 'Niestandardowe szablony tekstowe', + discordTemplatesDesc: 'Dostosuj, jakie informacje są wyświetlane na Twoim profilu Discord. Zmienne: {title}, {artist}, {album}', + discordTemplateDetails: 'Główny wiersz (details)', + discordTemplateState: 'Drugi wiersz (state)', + discordTemplateLargeText: 'Podpowiedź albumu (largeText)', + discordTemplateName: 'Wiersz listy użytkowników (name)', + nowPlayingEnabled: 'Pokaż w "Teraz odtwarzane"', + nowPlayingEnabledDesc: 'Transmituj aktualnie odtwarzany utwór do widoku słuchacza na żywo na serwerze. Wyłącz, aby zatrzymać wysyłanie danych o odtwarzaniu.', + nowPlayingPluginNote: 'Wymagane przy użyciu oficjalnego pluginu Discord Rich Presence dla Navidrome.', + externalArtwork: 'Zewnętrzny scraper grafik', + externalArtworkDesc: 'Pobieraj wysokiej rozdzielczości tła i banery wykonawców z fanart.tv dla odtwarzacza pełnoekranowego i stron wykonawców. Domyślnie wyłączone.', + externalArtworkNote: 'Po włączeniu wysyła nazwę wykonawcy (i bieżącego albumu) do musicbrainz.org, aby zidentyfikować wykonawcę, a następnie pobiera grafiki z fanart.tv — na żądanie i tylko do odczytu; tagi Twojej biblioteki nigdy nie są zmieniane. Grafiki dostarcza fanart.tv i jego współtwórcy.', + externalArtworkByokTitle: 'Osobisty klucz API (BYOK)', + externalArtworkByokDesc: 'Opcjonalne. Wpisz tutaj własny osobisty klucz API fanart.tv — będzie wysyłany razem z kluczem aplikacji.', + externalArtworkByokSaved: 'Zapisano — wysyłany z kluczem aplikacji, gdy scraper jest włączony.', + enableBandsintown: 'Daty koncertów z Bandsintown', + enableBandsintownDesc: 'Pokazuj nadchodzące koncerty bieżącego wykonawcy na karcie Informacje. Dane są pobierane z publicznego API Bandsintown.', + lyricsServerFirst: 'Preferuj teksty utworów z serwera', + lyricsServerFirstDesc: 'Spradzaj teksty utworów dostarczone przez serwer (osadzone tagi, pliki towarzyszące) przed wyszukiwaniem w LRCLIB. Wyłącz, aby najpierw używać LRCLIB.', + enableNeteaselyrics: 'Teksty utworów z NetEase Cloud Music', + enableNeteaselyricsDesc: 'Używaj NetEase Cloud Music jako awaryjnego źródła tekstów utworów, gdy serwer i LRCLIB nic nie zwrócą. Najlepsze pokrycie dla muzyki azjatyckiej i międzynarodowej.', + lyricsSourcesTitle: 'Źródła tekstów utworów', + lyricsSourcesDesc: 'Wybierz źródła, w których mają być wyszukiwane teksty utworów, oraz ich kolejność. Przeciągnij, aby zmienić kolejność. Wyłączone źródła są całkowicie pomijane.', + lyricsSourceServer: 'Serwer', + lyricsSourceLrclib: 'LRCLIB', + lyricsSourceNetease: 'Netease Cloud Music', + lyricsYouLyPlus: 'YouLyPlus (Karaoke)', + lyricsYouLyPlusDesc: 'Synchronizacja słowo po słowie z backendu społecznościowego (Apple Music, Spotify, Musixmatch, QQ). Sprawdzane jako pierwsze; włączone źródła poniżej działają jako awaryjne.', + lyricsSourcesFallbackHint: 'Używane jako opcja awaryjna gdy YouLyPlus nic nie znajdzie. Przeciągnij, aby zmienić kolejność.', + lyricsSourcesPrimaryHint: 'Sprawdzane w podanej kolejności. Przeciągnij, aby zmienić kolejność. Wszystkie wyłączone = teksty wyłączone.', + lyricsStaticOnly: 'Pokaż teksty utworów jako sam statyczny tekst', + lyricsStaticOnlyDesc: 'Wyświetla zsynchronizowane teksty utworów bez automatycznego przewijania i bez podświetlania słów.', + downloadsTitle: 'Eksportowanie i archiwizacja ZIP', + downloadsFolderDesc: 'Docelowy folder dla albumów które pobrałeś jako plik ZIP na swój komputer.', + downloadsDefault: 'Domyślny folder pobierania.', + pickFolder: 'Wybierz', + pickFolderTitle: 'Wybierz folder pobierania', + clearFolder: 'Wyczyść folder pobierania', + logout: 'Wyloguj', + aboutTitle: 'O Psysonic', + aboutDesc: 'Nowoczesny desktopowy odtwarzacz muzyki stworzony z myślą o Navidrome. Korzysta z API Subsonic oraz rozszerzeń specyficznych dla Navidrome. Zbudowany na Tauri v2, z natywnym silnikiem audio w Rust — lekki i szybki, a jednocześnie pełen funkcji: pasek przewijania z waveformem, zsynchronizowane teksty utworów, integracja z Last.fm, 10-pasmowy korektor, crossfade, odtwarzanie bez przerw, Replay Gain, przeglądanie według gatunków oraz duża biblioteka motywów.', + aboutLicense: 'Licencja', + aboutLicenseText: 'GNU GPL v3 — wolny w użytku, modyfikacji oraz dystrybucji pod tą samą licencją.', + aboutRepo: 'Kud źródłowy na GitHub\'ie', + aboutVersion: 'Wersja', + aboutBuiltWith: 'Stworzowy w: Tauri · React · TypeScript · Rust/rodio', + aboutMaintainersLabel: 'Opiekunowie projektu', + aboutReleaseNotesLabel: 'Informacje o wydaniu', + aboutReleaseNotesLink: "Otwórz nowości tej wersji", + aboutContributorsLabel: 'Współtwórcy', + showChangelogOnUpdate: "Pokazuj \"Co nowego\" po aktualizacji", + showChangelogOnUpdateDesc: "Pokazuj dyskretny baner z listą zmian nad sekcją \"Teraz odtwarzane\" po aktualizacji. Kliknięcie otwiera informacje o wydaniu, a X zamyka baner.", + libraryGridMaxColumnsTitle: 'Siatki kart biblioteki', + libraryGridMaxColumnsPerfHint: 'Wyższe wartości mieszczą więcej kafelków w jednym wierszu i mogą zwiększyć obciążenie układu oraz renderowania — będzie to zauważalne przy bardzo dużych bibliotekach lub wolniejszych urządzeniach.', + libraryGridMaxColumnsRangeLabel: 'Maksymalna liczba kolumn ({{min}}–{{max}})', + libraryGridMaxColumnsDesc: 'Dotyczy albumów, wykonawców, playlist, radia, trybu offline i innych widoków biblioteki opartych na kartach. Niższe wartości powodują użycie większych kafelków i zazwyczaj są mniej obciążające dla procesora.', + libraryIndexTitle: 'Indeks lokalnej biblioteki (podgląd)', + libraryIndexDesc: 'Przechowuj lokalną kopię bazy utworów każdego serwera, aby przeglądanie i wyszukiwanie były szybkie oraz działały offline. Początkowa synchronizacja jest uruchamiana dla każdego skonfigurowanego serwera; serwery offline są ponawiane automatycznie.', + libraryIndexDeltaHint: 'Synchronizacja zmian w tle sprawdza powiązane serwery co 30 sekund i uruchamia się, gdy nadejdzie jej kolej — zwykle co 5–45 minut, zależnie od rozmiaru biblioteki i obciążenia.', + libraryIndexEnable: 'Włącz indeks lokalnej biblioteki', + libraryIndexEnableAllDesc: 'Indeksuj i synchronizuj wszystkie skonfigurowane serwery w tle.', + libraryIndexNoServer: 'Dodaj najpierw serwer.', + libraryIndexServerListTitle: 'Zindeksowane serwery', + libraryIndexAllExcluded: 'Wszystkie serwery są wyłączone z synchronizacji. Włącz ponownie indeksowanie lub dodaj serwer.', + libraryIndexServerOffline: 'Serwer jest offline - synchronizacja odroczona', + libraryIndexServerSyncing: 'Synchronizowanie…', + libraryIndexFullResync: 'Pełna resynchronizacja', + libraryIndexDeltaSync: 'Synchronizacja zmian', + libraryIndexExcludeServer: 'Wyłącz z synchronizacji', + libraryIndexExcludingServer: 'Wyłączanie…', + libraryIndexExcludedTitle: 'Wyłączony z synchronizacji', + libraryIndexIncludeServer: 'Włącz ponownie', + libraryIndexIncludingServer: 'Włączanie…', + libraryIndexStatus: 'Status', + libraryIndexStatusIdle: 'Bezczynny', + libraryIndexStatusProbing: 'Sprawdzanie serwera…', + libraryIndexStatusInitial: 'Synchronizacja początkowa…', + libraryIndexStatusReady: 'Gotowe ({{count}} utworów)', + libraryIndexStatusError: 'Błąd - zobacz dziennik zdarzeń', + libraryIndexProgressIngest: 'Indeksowanie {{count}} utworów…', + libraryIndexProgressVerify: 'Zweryfikowano {{checked}} ({{deleted}} usunięto)', + libraryIndexSyncNow: 'Synchronizuj teraz', + libraryIndexVerify: 'Sprawdź integralność biblioteki', + libraryIndexCancel: 'Anuluj', + libraryIndexAutoReconcile: 'Automatycznie aktualizuj indeks przy spadku liczby utworów', + libraryIndexAutoReconcileDesc: 'Automatycznie sprawdzaj usunięte utwory, gdy serwer zgłasza mniej utworów niż oczekiwano.', + libraryIndexSyncError: 'Synchronizacja biblioteki nie powiodła się: {{error}}', + libraryIndexBindError: 'Nie udało się włączyć indeksu biblioteki: {{error}}', + analyticsStrategyTitle: 'Strategie analityczne', + analyticsStrategyDesc: 'Wybierz strategię analizy dla biblioteki.', + analyticsStrategyLabel: 'Strategia', + analyticsStrategyLazy: 'Leniwa', + analyticsStrategyLazyDesc: 'Analizuj tylko wtedy, gdy utwory są odtwarzane lub trafiają do pamięci podręcznej kolejki/offline — minimalne użycie procesora i sieci.', + analyticsStrategyAdvanced: 'Agresywna', + analyticsStrategyAdvancedDesc: 'Bardziej agresywne skanowanie w tle. Po zakończeniu otrzymujesz BPM dla każdego utworu plus natychmiastową głośność + obciążenie przebiegu.', + analyticsStrategyPriorityTitle: 'Priorytet analizy (zawsze wymuszany)', + analyticsStrategyPriorityHigh: '1 — Aktualnie odtwarzane: najpierw pobierz i przeanalizuj (dane odtwarzania, uzupełnianie głośności lub HTTP, gdy jest potrzebne).', + analyticsStrategyPriorityMiddle: '2 — Następne w kolejce: kolejne ~5 utworów z kolejki oraz sąsiednie elementy pamięci podręcznej kolejki — analizuj z danych z pamięci podręcznej/pobranych, gdy to możliwe; uzupełnianie przez HTTP tylko w razie braku danych.', + analyticsStrategyPriorityLow: '3 — Wsadowa analiza biblioteki (tylko tryb agresywny): automatyczna kolejka w tle na końcu priorytetu; uzupełniana według progu (~3× liczba wątków roboczych), bez czekania na opróżnienie kolejki.', + analyticsStrategyServerLabel: 'Serwer', + analyticsStrategyProgressLabel: 'Progres analizy:', + analyticsStrategyProgressValue: '{{percent}}% ({{done}}/{{total}})', + analyticsStrategyActionsLabel: 'Akcje', + analyticsStrategyParallelismLabel: 'Równoległe wątki robocze', + analyticsStrategyParallelismValue: '{{n}} wątków', + analyticsStrategyParallelismDesc: 'Liczba utworów pobieranych i analizowanych jednocześnie (HTTP + CPU). Wyższe wartości przyspieszają nadrabianie biblioteki, ale zużywają więcej sieci i CPU.', + analyticsStrategyAdvancedWarning: 'Tryb agresywny zużywa więcej CPU i przepustowości sieci gdy zbiorcza analiza biblioteki działa w tle.', + analyticsStrategyServerRemoved: 'Usunięto serwer', + analyticsStrategyClearAction: 'Wyczyść analizę', + analyticsStrategyClearTitle: 'Wyczyścić analizę?', + analyticsStrategyClearDesc: 'Wyczyszczenie analizy dla {{server}} usunie zapisane w pamięci podręcznej przebiegi fali i dane głośności. Ponowne dodanie tego serwera później może wymagać długiego ponownego indeksowania.', + analyticsStrategyClearCancel: 'Anuluj', + analyticsStrategyClearConfirm: 'Wyczyść analizę', + analyticsStrategyClearSuccess: 'Analiza dla usuniętego serwera została wyczyszczona.', + analyticsStrategyClearError: 'Nie udało się wyczyścić analizy dla usuniętego serwera.', + analyticsStrategyProgressEmptyAfterFailed: '100% (0/0, zablokowane przez uszkodzony utwór)', + analyticsFailedTracksOpenTitle: 'Uszkodzone utwory: {{count}}', + analyticsFailedTracksTitle: 'Utwory z nieudaną analizą — {{server}}', + analyticsFailedTracksDesc: 'Analiza lub wzbogacanie danych tych utworów wielokrotnie kończyły się niepowodzeniem, dlatego zostały wykluczone z automatycznej analizy w tle.', + analyticsFailedTracksLoading: 'Ładowanie listy uszkodzonych utworów…', + analyticsFailedTracksEmpty: 'Nie znaleziono żadnych uszkodzonych utworów dla tego serwera.', + analyticsFailedTracksClose: 'Zamknij', + analyticsFailedTracksExport: 'Eksportuj listę', + analyticsFailedTracksExportSuccess: 'Eksportowanie listy uszkodzonych utworów ({{count}}).', + analyticsFailedTracksExportError: 'Nie udało się wyeksportować listy uszkodzonych utworów.', + analyticsFailedTracksRescan: 'Przeskanuj ponownie uszkodzone utwory', + analyticsFailedTracksRescanSuccess: 'Ponowny skan zaplanowany dla {{count}} uszkodzonych utworów.', + analyticsFailedTracksRescanError: 'Nie udało się przeskanować uszkodzonych utworów.', + analyticsFailedTracksLoadError: 'Nie udało się załadować uszkodzonych utworów.', + randomMixTitle: 'Blacklista mixu losowych utworów', + luckyMixMenuTitle: 'Pokaż Lucky Mix w menu', + luckyMixMenuDesc: 'Włącza Lucky Mix w sekcji "Utwórz miks" oraz jako osobną pozycję menu, gdy włączona jest nawigacja dzielona. Widoczne tylko wtedy, gdy AudioMuse jest włączone na aktywnym serwerze.', + randomMixBlacklistTitle: 'Własne słowa kluczowe filtrów', + randomMixBlacklistDesc: 'Utwory są wykluczane, gdy dowolne słowo kluczowe pasuje do ich gatunku, tytułu, albumu lub wykonawcy (działa, gdy powyższe pole wyboru jest zaznaczone).', + randomMixBlacklistPlaceholder: 'Dodaj słowo klucz…', + randomMixBlacklistAdd: 'Dodaj', + randomMixBlacklistEmpty: 'Nie dodano jeszcze żadnych słów kluczy.', + randomMixHardcodedTitle: 'Wbudowane słowa klucze (aktywne gdy pole wyboru jest zaznaczony)', + tabAudio: 'Audio', + tabStorage: 'Offline i pamięć podręczna', + tabAppearance: 'Wygląd', + tabThemes: 'Motywy', + themesYourThemesTitle: 'Twoje motywy', + themesCvdTooltip: 'Bezpieczny dla osób z zaburzeniami widzenia barw — deuteranopia, protanopia, tritanopia', + themeAnimationWarning: 'Ten motyw używa animacji, które w Twojej konfiguracji mogą zwiększać użycie procesora (Nvidia/Linux lub wyłączone kompozycjonowanie).', + themeStoreTitle: 'Sklep z motywami', + themeStoreSubmitText: 'Stworzyłeś swój własny motyw? Podziel się nim z społecznością — więcej informacji w repozytorium motywów.', + themeStoreSubmitLink: 'Otwórz repozytorium motywów', + themeStoreNetworkNotice: 'Sklep motywów wczytuje katalog i podglądy z GitHuba. Żadne dane osobowe nie są wysyłane.', + themeStoreStatsNotice: 'Daty ostatnich zmian są odświeżane raz dziennie (około 04:17 UTC, czyli 05:17/06:17 czasu polskiego).', + themeStoreSearchPlaceholder: 'Szukaj motywów…', + themeStoreFilterMode: 'Filtruj po trybie', + themeStoreModeAll: 'Wszystkie', + themeStoreModeDark: 'Ciemne', + themeStoreModeLight: 'Jasne', + themeStoreRefresh: 'Odśwież', + themeStoreLoading: 'Ładowanie motywów…', + themeStoreError: 'Nie udało się załadować sklepu motywów. Sprawdź swoje połączenie.', + themeStoreRetry: 'Spróbuj ponownie', + themeStoreOfflineTitle: 'Sklep motywów jest offline', + themeStoreEmpty: 'Żaden motyw nie pasuje do twoich filtrów.', + themeStoreActive: 'Aktywny', + themeStoreEnlarge: 'Powiększ podgląð', + themeStoreSortNewest: 'Najnowsze', + themeStoreSortName: 'Alfabetycznie', + themeStoreAnimAll: 'Wszystkie', + themeStoreAnimAnimated: 'Animowany', + themeStoreAnimStatic: 'Statyczny', + themeStoreByAuthor: 'autorstwa {{author}}', + themeStoreLastChanged: 'Ostatnio zmieniony', + themeMigrationNoticeTitle: 'Motyw przeniesiony do sklepu', + themeMigrationNoticeBody: 'Motyw {{themes}} nie jest już dołączany do aplikacji. Możesz zainstalować go ponownie ze Sklepu motywów (Ustawienia → Motywy) albo wybrać inny motyw.', + themeMigrationNoticeOpen: 'Otwórz sklep motywów', + themeStoreOffline: 'Pokazywany jest ostatni zapisany katalog — wygląda na to, że jesteś offline.', + themeStoreInstall: 'Zainstaluj', + themeStoreInstalling: 'Instalowanie…', + themeStoreApply: 'Zastosuj', + themeStoreUpdate: 'Aktualizuj', + themeStoreUpdating: 'Aktualizowanie…', + themeStoreUninstall: 'Odinstaluj', + themeStoreInstallFailed: 'Instalacja nie powiodła się', + themeStorePagePrev: 'Poprzednia strona', + themeStorePageNext: 'Następna strona', + themeStorePageStatus: 'Strona {{page}} o {{total}}', + themeImportTitle: 'Importowanie motywu', + themeImportButton: 'Zaimportuj motyw…', + themeImporting: 'Importowanie…', + themeImportHint: 'Załaduj motyw zapakowany jako .zip (manifest.json + theme.css).', + themeImportSuccess: 'Zaimportowano "{{name}}".', + themeImportErrorTitle: 'Ten motyw nie mógł być zaimportowany', + themeImportErrorBody: 'Nie pasuje do formatu motywów PsySonic. Mógł zostać utworzony dla innej wersji albo plik jest niekompletny — sprawdź, czy wybrano właściwy plik .zip, albo zapytaj autora motywu.', + themeImportErrorDetails: 'Szczegóły techniczne', + themeImportConfirmTitle: 'Zainstalować motyw?', + themeImportConfirmBody: 'Zainstalować "{{name}}" autorstwa {{author}}?', + themeImportConfirmRisk: "Importowane motywy nie są sprawdzane — instaluj tylko motywy, którym ufasz.", + tabLibrary: 'Biblioteka', + tabServers: 'Serwery', + tabLyrics: 'Teksty utworów', + tabPersonalisation: 'Personalizacja', + tabIntegrations: 'Integracje', + inputKeybindingsTitle: 'Skróty klawiszowe', + aboutContributorsCount_one: '{{count}} kontrybucji', + aboutContributorsCount_other: '{{count}} kontrybucji', + searchPlaceholder: 'Wyszukaj ustawienia…', + searchNoResults: 'Żadne ustawienia nie pasują do wyszukiwania.', + integrationsPrivacyTitle: 'Informacja o prywatności', + integrationsPrivacyBody: 'Wszystkie integracje na tej karcie są opcjonalne i po włączeniu wysyłają dane do usług zewnętrznych albo do Twojego serwera Navidrome. Last.fm otrzymuje historię słuchania, Discord pokazuje aktualnie odtwarzany utwór w Twoim profilu, Bandsintown jest odpytywany dla każdego wykonawcy w celu pobrania dat koncertów, a udostępnianie "Teraz odtwarzane" publikuje bieżący utwór innym użytkownikom Twojego serwera Navidrome. Jeśli tego nie chcesz, po prostu zostaw odpowiednią sekcję wyłączoną.', + homeCustomizerTitle: 'Scena główna', + queueSettingsTitle: 'Ustawienia kolejki', + queueModeTitle: 'Tryb wyświetlania kolejki', + queueModeQueueSub: 'Pokaż tylko nadchodzące utwory. Bierzący utwór pozostaje w nagłówku i znika z listy po odtworzeniu.', + queueModePlaylistSub: 'Zachowuj całą kolejkę na liście, z bieżącym utworem wyróżnionym u góry; odtworzone utwory pozostają na liście.', + queueModeTimelineSub: 'Wyśrodkuj bieżący utwór, z historią odtworzeń powyżej i nadchodzącymi utworami poniżej (w kolejności losowej).', + queueToolbarTitle: 'Pasek narzędzi kolejki', + queueToolbarReset: 'Przywróć domyślne', + queueToolbarSeparator: 'Separator', + sidebarTitle: 'Pasek boczny', + sidebarReset: 'Przywróć domyślne', + artistLayoutTitle: 'Układ strony wykonawcy', + artistLayoutDesc: 'Przeciągnij, aby zmienić kolejność, albo przełącz, aby ukryć poszczególne sekcje strony wykonawcy. Sekcje bez danych są automatycznie pomijane.', + artistLayoutReset: 'Przywróć domyślne', + artistLayoutBio: 'Biografia wykonawcy', + artistLayoutTopTracks: 'Najpopularniejsze utwory', + artistLayoutSimilar: 'Podobni wykonawcy', + artistLayoutAlbums: 'Albumy', + artistLayoutFeatured: 'Występuje także na', + playlistLayoutTitle: 'Układ strony playlisty', + playlistLayoutDesc: 'Pokaż lub ukryj poszczególne elementy na stronie playlisty.', + playlistLayoutReset: 'Przywróć domyślne', + playerBarTitle: 'Pasek odtwarzacza', + playerBarReset: 'Przywróć domyślne', + playerBarStarRating: 'Ocena gwiazdkowa', + playerBarFavorite: 'Ulubione (heart)', + playerBarLastfmLove: 'Przycisk polubienia', + playerBarPlaybackRate: 'Prędkość odtwarzania', + playerBarEqualizer: 'Equalizer', + playerBarMiniPlayer: 'Miniodtwarzacz', + playbackRateTitle: 'Prędkość odtwarzania', + playbackRateEnabled: 'Włącz zmianę prędkości odtwarzania', + playbackRateEnabledDesc: 'Zmienia prędkość globalnie, dla wszystkich utworów. Nie dotyczy radia ani podglądu utworów.', + playbackRateStrategy: 'Strategia', + playbackRateStrategySpeed: 'Prędkość', + playbackRateStrategyVarispeed: 'Varispeed', + playbackRateStrategyVarispeedSemitones: 'Półtony', + playbackRateStrategyPreserve: 'Zmiana wysokości dźwięku', + playbackRateStrategySpeedTip: 'Zmienia tempo; wysokość dźwięku jest korygowana automatycznie.', + playbackRateStrategyVarispeedTip: 'Prędkość i wysokość dźwięku zmieniają się razem, jak na taśmie. Wysokość zależy od prędkości: 12 × log2(prędkość).', + playbackRateStrategyVarispeedSemitonesTip: 'Varispeed ustawiony bezpośrednio w półtonach. Prędkość = 2^(st/12).', + playbackRateStrategyPreserveTip: 'Regulowane tempo oraz ręczne przesunięcie wysokości dźwięku (±12 st).', + playbackRateSpeed: 'Prędkość', + playbackRatePitch: 'Wysokość dźwięku', + playbackRateDerivedPitch: 'Zmiana wysokości dźwięku z prędkością: {{value}}', + playbackRateDerivedSpeed: 'Prędkość wynikająca z półtonów: {{value}}', + playbackRateFineStep: 'Precyzyjna regulacja', + playbackRateFineStepDesc: 'Mniejsze kroki suwaka: 0,01× dla prędkości i 0,01 st dla wysokości dźwięku.', + playbackRateAutoPitch: 'Wysokość dźwięku jest korygowana automatycznie.', + playbackRateHint: 'Prędkość zachowuje naturalną wysokość dźwięku. Varispeed zmienia wysokość dźwięku razem z prędkością. Varispeed (półtony) ustawia tę zmianę bezpośrednio w półtonach. Zmiana wysokości dźwięku dodaje ręczne przesunięcie. Zużywa więcej procesora niż varispeed. Nie działa dla radia, odsłuchów ani Orbit.', + playbackRateNeutral: 'Przy 1,0× i bez przesunięcia wysokości dźwięku, odtwarzanie jest normalne.', + playbackRateOrbitPaused: 'Nie dotyczy sesji Orbit — odtwarzanie pozostaje na 1.0× dla synchronizacji.', + playbackRateOrbitPausedShort: 'Orbit: 1.0× dla synchronizacji.', + advancedMode: 'Zaawansowane', + advancedModeTooltip: 'Pokazuj opcje zaawansowane we wszystkich kartach ustawień. Są to funkcje dodane przez społeczność, które niekoniecznie odzwierciedlają filozofię projektową opiekunów PsySonic.', + advancedBadge: 'Zaawansowane', + sidebarDrag: 'Przeciągnij, by zmienić kolejność', + sidebarFixed: 'Zawsze widoczne', + nowPlayingTopTitle: '"Teraz odtwarzane" na górze', + nowPlayingTopDesc: 'Przypnij pozycję "Teraz odtwarzane" do górnej zamiast dolnej części paska bocznego.', + randomNavSplitTitle: 'Oddzielna nawigacja miksów', + randomNavSplitDesc: 'Pokazuj "Losowy miks", "Losowe albumy" i "Lucky Mix" jako osobne pozycje na pasku bocznym zamiast centrum "Utwórz miks".', + tabInput: 'Wejście', + tabUsers: 'Użytkownicy', + tabSystem: 'System', + loggingTitle: 'Loogowanie', + loggingModeDesc: 'Kontroluje szczegółowość logów backendu w terminalu.', + loggingModeOff: 'Wyłączony', + loggingModeNormal: 'Normalny', + loggingModeDebug: 'Debugowanie', + loggingExport: 'Eksportuj dzienniki', + loggingExportSuccess: 'Dzienniki zostały wyeksportowane ({{count}} linii).', + loggingExportError: 'Nie można wyeksportować dzienników.', + ratingsSectionTitle: 'Oceny', + ratingsSkipStarTitle: 'Pomiń dla 1 gwiazdki', + ratingsSkipStarDesc: + 'Po kilku pominięciach z rzędu ustaw ocenę utworu na 1★. Tylko dla utworów, które nie zostały jeszcze ocenione.', + ratingsSkipStarThresholdLabel: 'Pominięcia', + ratingsMixFilterTitle: 'Filtruj według oceny', + ratingsMixFilterDesc: + 'Filtruj nisko ocenione elementy w {{mix}} i {{albums}}. Kliknij ponownie wybraną gwiazdkę, aby wyłączyć próg.', + ratingsMixMinSong: 'Utwory', + ratingsMixMinAlbum: 'Albumy', + ratingsMixMinArtist: 'Wykonawcy', + ratingsMixMinThresholdAria: 'Minimalna ilość gwiazdek: {{label}}', + backupTitle: 'Kopia zapasowa i przywracanie', + backupExport: 'Eksportuj ustawienia', + backupExportDesc: 'Saves all settings, server profiles, Last.fm config, theme, EQ and keybindings to a .psybkp file. Passwords are stored in plaintext — keep the file secure.', + backupImport: 'Importuj ustawienia', + backupImportDesc: 'Restores settings from a .psybkp file. The app will reload after import.', + backupImportConfirm: 'To nadpisza wszystkie bierzące ustawienia. Kontynuować?', + backupImportAny: 'Importuj kopię zapasową', + backupImportAnyConfirm: 'Zaimportować wybrany plik kopii zapasowej i zastosować jego zawartość (ustawienia, bazy danych biblioteki lub pełna kopia)? Kontynuować?', + backupSuccess: 'Zapisano kopię zapasową', + backupImportSuccess: 'Ustawienia zostały przywrócone — przeładowywanie…', + backupImportError: 'Nieprawidłowa lub uszkodzona kopia zapasowa.', + backupModeFull: 'Pełna', + backupModeLibrary: 'Bazy danych biblioteki', + backupModeConfig: 'Konfiguracja', + backupFullDesc: 'Archiwizuje ustawienia i bazy danych biblioteki do jednego pliku kopii zapasowej.', + backupFullExport: 'Eksportuj pełną kopię zapasową', + backupFullImport: 'Importuj pełną kopię zapasową', + backupFullImportConfirm: 'To nadpisze pliki, podmieni obecne bazy danych biblioteki i przeniesie je do .bak. Kontynuować?', + backupFullExportSuccess: 'Pełna kopia zapasowa została wyeksportowana.', + backupFullImportSuccess: 'Pełna kopia zapasowa została zaimportowana — przeładowywanie…', + backupFullImportError: 'Nie udało się zaimportować pełnej kopii zapasowej.', + backupLibraryExport: 'Eksportuj bazy danych', + backupLibraryExportDesc: 'Tworzy skompresowane archiwum z czystymi snapshotami SQLite baz danych biblioteki.', + backupLibraryImport: 'Zaimportuj bazy danych', + backupLibraryImportDesc: 'Przywraca bazy danych biblioteki z pliku archiwum. Bieżące bazy danych są przenoszone do .bak przed przełączeniem.', + backupLibraryImportConfirm: 'Spowoduje zastąpienie bieżących baz danych biblioteki i przeniesienie ich do .bak. Kontynuować?', + backupLibraryExportSuccess: 'Kopia zapasowa baz danych wyeksportowana.', + backupLibraryImportSuccess: 'Kopia zapasowa baz danych zaimportowania.', + backupLibraryImportError: 'Nie udało się zaimportować kopii zapasowej baz danych.', + backupOverlayExportTitle: 'Tworzenie kopii zapasowej…', + backupOverlayImportTitle: 'Przywracanie kopii zapasowej…', + backupOverlayHint: 'Możesz zostawić okno otwarte podczas przetwarzania plików. Wprowadzanie danych jest tymczasowo zablokowane.', + shortcutsReset: 'Przywróć domyślne', + shortcutListening: 'Naciśnij klawisz…', + shortcutUnbound: '—', + globalShortcutsTitle: 'Globalne skróty', + globalShortcutsNote: 'Działaj w czałym systemie nawet jak PsySonic jest w tle. Wymaga Ctrl, Alt, lub Super jako klawisza modyfikującego.', + shortcutClear: 'Wyczyść', + shortcutPlayPause: 'Odtwórz / Pauza', + shortcutNext: 'Następny utwór', + shortcutPrev: 'Poprzedni utwór', + shortcutVolumeUp: 'Głośniej', + shortcutVolumeDown: 'Ciszej', + shortcutSeekForward: 'Przewiń do przodu 10s', + shortcutSeekBackward: 'Przewiń do tyłu 10s', + shortcutToggleQueue: 'Przełącz kolejkę', + shortcutOpenFolderBrowser: 'Otwórz {{folderBrowser}}', + shortcutFullscreenPlayer: 'Odtwarzacz pełnoekranowy', + shortcutNativeFullscreen: 'Natywny pełny ekran', + shortcutOpenMiniPlayer: 'Otwórz miniodtwarzacz', + shortcutStartSearch: 'Rozpocznij wyszukiwanie', + shortcutStartAdvancedSearch: 'Rozpocznij wyszukiwanie zaawansowane', + shortcutToggleSidebar: 'Przełącz pasek boczny', + shortcutMuteSound: 'Wycisz dźwięk', + shortcutToggleEqualizer: 'Otwórz / przełącz Equalizer', + shortcutToggleRepeat: 'Przełącz powtarzanie', + shortcutOpenNowPlaying: 'Otwórz "Teraz odtwarzane"', + shortcutShowLyrics: 'Pokaż tekst utworu', + shortcutFavoriteCurrentTrack: 'Dodaj bierzący utwór do ulubionych', + shortcutOpenHelp: 'Pomoc', + playbackTitle: 'Odtwarzanie', + replayGain: 'Replay Gain', + replayGainDesc: 'Normalizuj głośność utworu korzystając z metadanych Replay Gain', + replayGainMode: 'Tryb', + replayGainAuto: 'Automatycznie', + replayGainAutoDesc: 'Wybiera wzmocenienie albumu gdy sąsiednie utwory w kolejce są z tego samego albumu. W przeciwnym wypadku korzysta z wzmocnienia z utworu.', + replayGainTrack: 'Utwór', + replayGainAlbum: 'Album', + replayGainPreGain: 'Wzmocnienie wstępne (pliki z tagami)', + replayGainPreGainDesc: 'Uniwersalne wzmocnienie dodawane do każdego obliczenia ReplayGain. Użyj, jeżeli cała bibliotego wydaje się zbyt cicha.', + replayGainFallback: 'Wartość zastępcza (bez tagów / radio)', + replayGainFallbackDesc: 'Stosowana do utworów i strumieni radiowych, które nie mają żadnych tagów ReplayGain, aby treści bez tagów nie grały głośniej od reszty.', + normalization: 'Normalizacja', + normalizationDesc: 'Wyrównuj odczuwalną głośność między utworami, albumami i radiem.', + normalizationOff: 'Wyłączona', + normalizationReplayGain: 'ReplayGain', + normalizationLufs: 'LUFS', + loudnessTargetLufs: 'Docelowe LUFS', + loudnessTargetLufsDesc: 'Referencyjna głośność, do której dopasowywane są wszystkie utwory. Niższe wartości = głośniejsze wyjście. Serwisy streamingowe zwykle celują w okolice -14 LUFS..', + loudnessPreAnalysisAttenuation: 'Tłumienie przez analizę', + loudnessPreAnalysisAttenuationDesc: + 'Dodatkowe ściszenie do czasu zapisania pomiaru głośności tego utworu. Podczas strumieniowania używane są wtedy przybliżone wartości, a nie pełny pomiar. 0 dB = wyłączone; niżej = ciszej. Liczba po prawej to efektywna wartość dB dla bieżącego celu.', + loudnessPreAnalysisAttenuationRef: 'Efektywne {{eff}} dB przy celu {{tgt}} LUFS.', + loudnessPreAnalysisAttenuationReset: 'Przywróć domyślne', + loudnessFirstPlayNote: + 'Pierwsze odtworzenie zupełnie nowego utworu może przez chwilę zmieniać głośność w trakcie pomiaru. Przy kolejnym odtworzeniu używany jest zapisany pomiar, więc głośność pozostaje stabilna. Nadchodzące utwory z kolejki są zwykle analizowane wstępnie podczas poprzedniego utworu, więc w praktyce zdarza się to rzadko.', + crossfade: 'Crossfade', + crossfadeSecs: '{{n}} s', + autoDj: 'AutoDJ', + autoDjDesc: 'Bez stałego czasu trwania — AutoDJ podąża za rzeczywistym dźwiękiem, łącząc prawdziwe wyciszenia i intra zamiast ustalonej liczby sekund. Dla niezawodnych wyników włącz pamięć podręczną szybkiego odtwarzania.', + autodjSmoothSkip: ' Płynne pomijanie', + autodjSmoothSkipDesc: 'Gdy podczas odtwarzania przeskoczysz do następnego lub poprzedniego utworu, przejdź do niego z użyciem tych samych reguł AutoDJ (długość nakładania, przycięcie intra) od bieżącej pozycji zamiast nagłego cięcia. Działa najlepiej, gdy następny utwór jest już zbuforowany.', // Propozycja: Gdy podczas odtwarzania przeskoczysz do następnego lub poprzedniego utworu, przejdź do niego z użyciem tych samych reguł AutoDJ (długość nakładania, przycięcie intra) od bieżącej pozycji zamiast nagłego cięcia. Działa najlepiej, gdy następny utwór jest już zbuforowany. + autodjOverlapCapTitle: 'Limit nakładania', + autodjOverlapCapDesc: 'Ogranicza, jak długo AutoDJ może nakładać utwory. Auto podąża za analizą treści (do 12 s). Limit ustawia własną maksymalną wartość.', + autodjOverlapCapAuto: 'Auto', + autodjOverlapCapLimit: 'Limit', + autodjOverlapCapSecs: '{{n}} s', + gapless: 'Odtwarzanie bez przerw', + transitionsTitle: 'Przejścia między utworami', + transitionsDesc: 'Sposób łączenia kolejnych utworów. Aktywny może być tylko jeden tryb naraz.', + transitionOff: 'Wyłączone', + transitionsHostControlled: 'Kontrolowane przez gospodarza Orbit podczas sesji', + queueBehaviourTitle: 'Zachowanie kolejki', + preservePlayNextOrder: 'Zachowaj kolejność "Odtwórz następne"', + preservePlayNextOrderDesc: 'Nowo dodane elementy "Odtwórz następne" są kolejkowane za wcześniej dodanymi zamiast wskakiwać na sam początek.', + trackPreviewsTitle: 'Podglądy utworów', + trackPreviewsToggle: 'Włącz podgląd utworów', + trackPreviewsDesc: 'Pokazuj przyciski Odtwórz i Podejrzyj bezpośrednio na listach utworów, aby szybko posłuchać fragmentu ze środka utworu.', + trackPreviewStart: 'Pozycja początkowa', + trackPreviewStartDesc: 'Jak daleko od początku utworu ma zaczynać się podgląd utworu (% długości utworu).', + trackPreviewDuration: 'Czas trwania', + trackPreviewDurationDesc: 'Jak długo odtwarzany jest każdy podgląd utworu przed zatrzymaniem.', + trackPreviewDurationSecs: '{{n}} s', + trackPreviewLocationsTitle: 'Gdzie pojawiają się podglądy', + trackPreviewLocationsDesc: 'Wybierz, które listy pokazują przyciski podglądu w wierszach.', + trackPreviewLocation_suggestions: 'W sugestach playlist', + trackPreviewLocation_albums: 'W listach utworów albumów', + trackPreviewLocation_playlists: 'W playlistach', + trackPreviewLocation_favorites: 'W ulubionych', + trackPreviewLocation_artist: 'W najpopularniejszych utworach wykonawcy', + trackPreviewLocation_randomMix: 'W losowym miksie', + nextTrackBufferingTitle: 'Bufferowanie', + infiniteQueue: 'Nieskończona kolejka', + infiniteQueueDesc: 'Automatycznie dodawaj losowe utwory, gdy kolejka się skończy', + experimental: 'Experimental', + sidebarLyricsStyle: 'Styl przewijania tekstu utworu', + sidebarLyricsStyleClassic: 'Klasyczny', + sidebarLyricsStyleClassicDesc: 'Przewijaj aktywny wiersz do środka.', + sidebarLyricsStyleApple: 'Jak w Apple Music', + sidebarLyricsStyleAppleDesc: 'Aktywny wiersz pozostaje blisko góry, z płynnymi przejściami sprężynowymi.', + seekbarStyle: 'Styl paska postępu utworu', + seekbarStyleDesc: 'Wybierz wygląd paska postępu utworu', + buttonSizeTitle: 'Kompaktowe przyciski', + buttonSizeLabel: 'Rozmiar przycisków', + buttonSizeDesc: 'Zmniejsz przyciski akcji i paska narzędzi do ikon na stronach szczegółów i w widokach przeglądania.', + buttonSize_large: 'Duże', + buttonSize_small: 'Małe', + seekbarTruewave: 'Fala utworu', + seekbarPseudowave: 'Pseudo-fala', + seekbarLinedot: 'Linia z punktem', + seekbarBar: 'Pasek', + seekbarThick: 'Gruby pasek', + seekbarSegmented: 'Segmenty', + seekbarNeon: 'Neon', + seekbarPulsewave: 'Pulsująca fala', + seekbarParticletrail: 'Ślad cząstek', + seekbarLiquidfill: 'Wypełnienie cieczą', + seekbarRetrotape: 'Taśma retro', + themeSchedulerTitle: 'Automatyczne przełączanie motywów', + themeSchedulerEnable: 'Włącz harmonogram motywów', + themeSchedulerEnableSub: 'Automatyczne przełączanie pomiędzy dwoma motywami w oparciu o porę dnia', + themeSchedulerDayTheme: 'Motyw dzienny', + themeSchedulerDayStart: 'Dzień zaczyna się o', + themeSchedulerNightTheme: 'Motyw nocny', + themeSchedulerNightStart: 'Noc zaczyna się o', + themeSchedulerActiveHint: 'Harmonogram motywów jest aktywny — zmiany motywu są zarządzane automatycznie.', + themeSchedulerModeLabel: 'Przełączaj na podstawie', + themeSchedulerModeTime: 'Pory dnia', + themeSchedulerModeSystem: 'Motywu systemowego', + themeSchedulerLightTheme: 'Motyw jasny', + themeSchedulerDarkTheme: 'Motyw ciemny', + themeSchedulerSystemRestartHint: 'Zmiana truby jasny/ciemny w systemie będzie mieć wpływ dopiero po ponownym uruchomieniu aplikacji.', + visualOptionsTitle: 'Opcje wizualne', + coverArtBackground: 'Tło okładki', + coverArtBackgroundSub: 'Pokazuj rozmytą okładkę jako tło w nagłówkach albumów i playlist', + playlistCoverPhoto: 'Okładka playlisty', + playlistCoverPhotoSub: 'Pokazuj siatkę okładek w widoku szczegółów playlisty', + showBitrate: 'Pokazuj Bitrate', + showBitrateSub: 'Wyświetlaj bitrate audio na listach utworów', + floatingPlayerBar: 'Pasek odtwarzacza jako nakładka', + floatingPlayerBarSub: 'Wyświetlaj pasek odtwarzacza jako nakładkę nad zawartością', + uiScaleTitle: 'Skala interfejsu', + uiScaleLabel: 'Przybliżenie',}; diff --git a/src/locales/pl/sharePaste.ts b/src/locales/pl/sharePaste.ts new file mode 100644 index 00000000..69c0edc8 --- /dev/null +++ b/src/locales/pl/sharePaste.ts @@ -0,0 +1,20 @@ +export const sharePaste = { + notLoggedIn: 'Zaloguj się i dodaj serwer, zanim wkleisz link udostępniania.', + noMatchingServer: 'Żaden zapisany serwer nie pasuje do tego linku. Dodać serwer o tym adresie: {{url}}?', + trackUnavailable: 'Nie znaleziono tego utworu na serwerze.', + albumUnavailable: 'Nie znaleziono tego albumu na serwerze.', + artistUnavailable: 'Nie znaleziono tego wykonawcy na serwerze.', + composerUnavailable: 'Nie znaleziono tego kompozytora na serwerze.', + openedTrack: 'Odtwarzanie udostępnionego utworu.', + openedAlbum: 'Otwieranie udostępnionego albumu.', + openedArtist: 'Otwieranie udostępnionego wykonawcy.', + openedComposer: 'Otwieranie udostępnionego kompozytora.', + openedQueue_one: 'Odtwarzanie {{count}} utworu z linku udostępniania.', + openedQueue_other: 'Odtwarzanie {{count}} utworów z linku udostępniania.', + openedQueuePartial: + 'Odtwarzanie {{played}} z {{total}} utworów z linku ({{skipped}} nie znaleziono na serwerze).', + queueAllUnavailable: 'Żaden z utworów z linku nie został znaleziony na serwerze.', + playQueue: 'Odtwórz kolejki', + playQueueing: 'Rozpoczynanie odtwarzania…', + genericError: 'Nie można otworzyć linku udostępniania.', +}; diff --git a/src/locales/pl/sidebar.ts b/src/locales/pl/sidebar.ts new file mode 100644 index 00000000..2feb6173 --- /dev/null +++ b/src/locales/pl/sidebar.ts @@ -0,0 +1,45 @@ +export const sidebar = { + library: 'Biblioteka', + mainstage: 'Scena główna', + newReleases: 'Nowe wydania', + allAlbums: 'Wszystkie albumy', + randomAlbums: 'Losowe albumy', + randomPicker: 'Stwórz miks', + artists: 'Wykonawcy', + composers: 'Kompozytorzy', + randomMix: 'Losowy miks', + favorites: 'Ulubione', + nowPlaying: 'Teraz odtwarzane', + system: 'System', + statistics: 'Statistyki', + settings: 'Ustawienia', + help: 'Pomoc', + expand: 'Rozwiń pasek boczny', + collapse: 'Zwiń pasek boczny', + + downloadingTracks: 'Zapisywanie offline {{n}} utworów…', + offlinePinActive: 'Zapisywanie «{{name}}»…', + offlinePinActiveQueued: 'Zapisywanie «{{name}}» offline · +{{queued}} w kolejce', + syncingTracks: 'Synchronizowanie {{done}}/{{total}}…', + cancelDownload: 'Anuluj pobieranie', + offlineLibrary: 'Biblioteka offline', + genres: 'Gatunki', + tracks: 'Utwory', + playlists: 'Playlisty', + smartPlaylists: 'Playlisty inteligentne', + mostPlayed: 'Najczęściej odtwarzane', + losslessAlbums: 'Bezstratne', + radio: 'Radio internetowe', + folderBrowser: 'Przeglądarka folderów', + deviceSync: 'Synchronizacja urządzeń', + libraryScope: 'Zakres biblioteki', + allLibraries: 'Wszystkie biblioteki', + expandPlaylists: 'Rozwiń playlisty', + collapsePlaylists: 'Zwiń playlisty', + more: 'Więcej', + feelingLucky: 'Lucky Mix', + + themeUpdatesTitle: 'Aktualizacje motywu', + themeUpdatesTooltip: 'Dostępne aktualizacje motywu', + themeUpdatesDismiss: 'Odrzuć', +}; diff --git a/src/locales/pl/smartPlaylists.ts b/src/locales/pl/smartPlaylists.ts new file mode 100644 index 00000000..62a665bc --- /dev/null +++ b/src/locales/pl/smartPlaylists.ts @@ -0,0 +1,41 @@ +export const smartPlaylists = { + sectionBasic: '1. Podstawowe', + sectionGenres: '2. Gatunki', + sectionYearsAndFilters: '3. Lata i filtry', + genreMode: 'Tryb gatunków', + genreModeInclude: 'Uwzględnij gatunki', + genreModeExclude: 'Wyklucz gatunki', + genreSearchPlaceholder: 'Filtruj gatunki...', + availableGenres: 'Dostępne', + selectedGenres: 'Wybrane', + yearMode: 'Tryb lat', + yearModeInclude: 'Uwzględnij zakres', + yearModeExclude: 'Wyklucz zakres', + name: 'Nazwa (bez prefiksu)', + limit: 'Limit', + limitHint: 'Liczba utworów do uwzględnienia w playliście (1-{{max}}, zwykle 50).', + artistContains: 'Wykonawca zawiera…', + albumContains: 'Album zawiera…', + titleContains: 'Tytuł zawiera…', + minRating: 'Minimalna ocena', + minRatingAria: 'Minimalna ocena dla playlisty inteligentnej', + minRatingHint: '0 wyłącza minimalny próg; 1-5 zachowuje utwory o ocenie powyżej wybranego wartości.', + fromYear: 'Od roku', + toYear: 'Do roku', + excludeUnrated: 'Wyklucz nieocenione utwory', + compilationOnly: 'Tylko kompilacje', + create: 'Nowa playlista inteligentna', + save: 'Zapisz playlistę inteligentną', + created: 'Utworzono {{name}}', + updated: 'Zaktualizowano {{name}}', + createFailed: 'Nie udało się utworzyć playlisty inteligentnej.', + updateFailed: 'Nie udało się zaktualizować playlisty inteligentnej.', + navidromeOnly: 'Playlisty inteligentne można tworzyć tylko na serwerach Navidrome.', + loadFailed: 'Nie udało się wczytać playlist inteligentnych z Navidrome.', + sortRandom: 'Sortowanie: losowo', + sortTitleAsc: 'Sortowanie: tytuł A-Z', + sortTitleDesc: 'Sortowanie: tytuł Z-A', + sortYearDesc: 'Sortowanie: rok malejąco', + sortYearAsc: 'Sortowanie: rok rosnąco', + sortPlayCountDesc: 'Sortowanie: liczba odtworzeń malejąco', +}; diff --git a/src/locales/pl/songInfo.ts b/src/locales/pl/songInfo.ts new file mode 100644 index 00000000..9487c1d0 --- /dev/null +++ b/src/locales/pl/songInfo.ts @@ -0,0 +1,27 @@ +export const songInfo = { + title: 'Informacje o utworze', + songTitle: 'Tytuł', + artist: 'Wykonawca', + album: 'Album', + albumArtist: 'Wykonawca albumu', + year: 'Rok', + genre: 'Gatunek', + duration: 'Czas trwania', + track: 'Utwór', + bpm: 'BPM', + mood: 'Nastruj', + playCount: 'Liczba odtwarzeń', + lastPlayed: 'Ostatnio odtworzony', + format: 'Format', + bitrate: 'Bitrate', + sampleRate: 'Częstotliwość próbkowania', + bitDepth: 'Głębia bitowa', + channels: 'Kanały', + fileSize: 'Rozmiar pliku', + path: 'Ścieżka', + replayGainTrack: 'ReplayGain utworu', + replayGainAlbum: 'ReplayGain albumu', + replayGainPeak: 'Szczyt ReplayGain utworu', + mono: 'Mono', + stereo: 'Stereo', +}; diff --git a/src/locales/pl/statistics.ts b/src/locales/pl/statistics.ts new file mode 100644 index 00000000..2469083a --- /dev/null +++ b/src/locales/pl/statistics.ts @@ -0,0 +1,93 @@ +export const statistics = { + title: 'Statistics', + recentlyPlayed: 'Ostatnio odtwarzane', + mostPlayed: 'Najczęściej odtwarzane albumy', + highestRated: 'Najwyżej oceniane albumy', + genreDistribution: 'Dystrybucja gatunków (Top 20)', + loadMore: 'Załaduj więcej', + statArtists: 'Wykonawcy', + statArtistsTooltip: 'Tylko wykonawcy albumów — wykonawcy występujący wyłącznie na poziomie utworu (featured, gościnnie itp.) bez własnego albumu nie są uwzględniani.', + statAlbums: 'Albumy', + statSongs: 'Utwory', + statGenres: 'Gatunki', + statPlaytime: 'Całkowity czas odtwarzania', + genreInsights: 'Wgląd w gatunek', + formatDistribution: 'Dystrybucja formatów', + formatSample: 'Próbka z {{n}} utworów', + computing: 'Obliczanie…', + genreSongs: '{{count}} utworów', + genreAlbums: '{{count}} albumów', + recentlyAdded: 'Niedawno dodane', + decadeDistribution: 'Albumy według dekady', + decadeAlbums_one: '{{count}} album', + decadeAlbums_other: '{{count}} albumów', + decadeUnknown: 'Nieznany', + lfmTitle: 'Statystyki {{provider}}', + lfmTopArtists: 'Najpopularniejsi wykonawcy', + lfmTopAlbums: 'Najpopularniejsze albumy', + lfmTopTracks: 'Najpopularniejsze utwory', + lfmPlays: '{{count}} odtworzeń', + lfmPeriodOverall: 'Cały okreś', + lfmPeriod7day: '7 dni', + lfmPeriod1month: '1 miesiąc', + lfmPeriod3month: '3 miesięcy', + lfmPeriod6month: '6 miesięcy', + lfmPeriod12month: '12 miesięcy', + lfmRecentTracks: 'Ostatnie scrobble', + lfmNowPlaying: 'Teraz odtwarzane', + lfmJustNow: 'przed chwilą', + lfmMinutesAgo: '{{n}} min. temu', + lfmHoursAgo: '{{n}} godz. temu', + lfmDaysAgo: '{{n}} dni temu', + topRatedSongs: 'Najwyżej oceniane utwory', + topRatedArtists: 'Najwyżej oceniani wykonawcy', + noRatedSongs: 'Nie oceniono jeszcze żadnych utworów. Ocena utworów w widoku albumu lub playlisty.', + noRatedArtists: 'Nie oceniono jeszcze żadnych wykonawców.', + exportShare: 'Udostępnij', + exportTitle: 'Udostępnij najpopularniejsze albumy', + exportSubtitle: 'Wygeneruj obraz do udostępnienia z najczęściej odtwarzanymi albumami.', + exportFormat: 'Format', + exportFormatStory: 'Story', + exportFormatSquare: 'Kwadrat', + exportFormatTwitter: 'Twitter Card', + exportGrid: 'Siatka', + exportGridLabel: '{{n}}×{{n}}', + exportPreview: 'Podgląd', + exportGenerate: 'Generuj', + exportSave: 'Zapisz obraz…', + exportCancel: 'Anuluj', + exportFooterLabel: 'Najpopularniejsze albumy', + exportNotEnough: 'Potrzebujesz co najmniej {{count}} albumów w bibliotece dla siatki {{n}}×{{n}}.', + exportSaving: 'Zapisywanie…', + exportSaved: 'Zapisano.', + exportSaveFailed: 'Nie udało się zapisać obrazu.', + tabServer: 'Statystyki serwera', + tabPlayer: 'Statystyki odtwarzacza', + playerEmpty: 'Zacznij słuchać — Twoja lokalna historia odtwarzania pojawi się tutaj.', + playerSummaryTime: 'Czas słuchania', + playerListeningDayShort: '{{count}} dni', + playerListeningHourShort: '{{count}} godz.', + playerListeningMinuteShort: '{{count}} min.', + playerSummarySessions: 'Sesje', + playerSummaryTracks: 'Odtworzenia utworów', + playerSummaryUniqueTracks: 'Unikalne utwory', + playerSummaryDays: 'Dni', + playerIndexRequired: 'Statystyki odtwarzacza wymagają co najmniej jednego skonfigurowanego serwera.', + playerPartialIndexSettings: 'Ustawienia serwera', + playerSummaryCompletion: 'Pełne / częściowe', + playerYearPrev: 'Poprzedni rok', + playerYearNext: 'Następny rok', + playerHeatmapLegend: 'Ciemniejsze komórki = więcej odtworzonych utworów w danym dniu.', + playerHeatmapLess: 'Mniej', + playerHeatmapMore: 'Więcej', + playerDaySessions: '{{count}} sesji', + playerDayTrackPlays: '{{count}} utworów', + playerDayFullPartial: '{{full}} pełne · {{partial}} częściowe', + playerRecentDaysTitle: 'Ostatnie dni', + playerDayToday: 'Dziś', + playerDayYesterday: 'Wczoraj', + playerListenedSecShort: '{{seconds}} s', + playerListenedMinDecimal: '{{minutes}} min', + completionFull: 'Pełne odsłuchanie', + completionPartial: 'Częściowe', +}; diff --git a/src/locales/pl/tracks.ts b/src/locales/pl/tracks.ts new file mode 100644 index 00000000..fd4b7a93 --- /dev/null +++ b/src/locales/pl/tracks.ts @@ -0,0 +1,16 @@ +export const tracks = { + title: 'Utwory', + subtitle: 'Przeglądaj. Szukaj. Odkrywaj.', + heroEyebrow: 'Utwór chwili', + heroReroll: 'Wybierz inny', + playSong: 'Odtwórz', + enqueueSong: 'Dodaj do kolejki', + toAlbum: 'Do albumu', + railRandom: 'Losowy wybór', + railHighlyRated: 'Wysoko oceniane', + browseTitle: 'Przeglądaj wszystkie utwory', + browseUnsupported: "Ten serwer nie udostępnia całej biblioteki naraz. Użyj wyszukiwania powyżej, aby znaleźć konkretne utwory.", + searchPlaceholder: 'Znajdź utwór po tytule, wykonawcy lub albumie…', + count_one: '{{count}} utwór', + count_other: '{{count}} utwory', +}; diff --git a/src/locales/pl/tray.ts b/src/locales/pl/tray.ts new file mode 100644 index 00000000..690a4325 --- /dev/null +++ b/src/locales/pl/tray.ts @@ -0,0 +1,8 @@ +export const tray = { + playPause: 'Odtwórz / Wstrzymaj', + nextTrack: 'Następny utwór', + previousTrack: 'Poprzedni utwór', + showHide: 'Pokaż / Ukryj', + exitPsysonic: 'Wyjdź z Psysonic', + nothingPlaying: 'Nic nie jest odtwarzane', +}; diff --git a/src/locales/pl/whatsNew.ts b/src/locales/pl/whatsNew.ts new file mode 100644 index 00000000..d1b97b5f --- /dev/null +++ b/src/locales/pl/whatsNew.ts @@ -0,0 +1,12 @@ +export const whatsNew = { + title: "Co nowego", + changelogTitle: 'Dziennik zmian', + viewTabsLabel: 'Widok informacji o wydaniu', + viewHighlights: 'Najważniejsze', + viewChangelog: 'Dziennik zmian', + empty: 'Brak wpisu w dzienniku zmian dla tej wersji.', + bannerTitle: 'Dziennik zmian', + bannerCollapsed: "Co nowego w wersji {{version}}", + dismiss: 'Odrzuć', + close: 'Zamknij', +}; diff --git a/src/locales/ro/settings.ts b/src/locales/ro/settings.ts index 4a12532f..1eaee761 100644 --- a/src/locales/ro/settings.ts +++ b/src/locales/ro/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Font', fontHintOpenDyslexic: 'Prietenos cu dislexia · Chineza nu este suportată', theme: 'Temă', diff --git a/src/locales/ru/settings.ts b/src/locales/ru/settings.ts index 87d7204c..6706ef94 100644 --- a/src/locales/ru/settings.ts +++ b/src/locales/ru/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: 'Шрифт', fontHintOpenDyslexic: 'Подходит для дислексии · без поддержки китайского', theme: 'Тема', diff --git a/src/locales/zh/settings.ts b/src/locales/zh/settings.ts index a8dc3602..59efec4f 100644 --- a/src/locales/zh/settings.ts +++ b/src/locales/zh/settings.ts @@ -12,6 +12,7 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', font: '字体', fontHintOpenDyslexic: '阅读障碍友好 · 不支持中文', theme: '主题', diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 489a6a7a..ec174196 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -310,6 +310,7 @@ export default function Login() { { value: 'ro', label: t('settings.languageRo') }, { value: 'ja', label: t('settings.languageJa') }, { value: 'hu', label: t('settings.languageHu') }, + { value: 'pl', label: t('settings.languagePl') }, ]} />