From 9183c3d657576d964c6ea4ffb1efb00fc24ad688 Mon Sep 17 00:00:00 2001 From: Alexander Kirichev Date: Fri, 3 Jul 2026 14:59:31 +0300 Subject: [PATCH] Added Bulgarian translation (#1228) --- CHANGELOG.md | 6 + WHATS_NEW.md | 4 + src/config/settingsCredits.ts | 7 + src/features/auth/pages/Login.tsx | 1 + .../settings/components/SystemTab.tsx | 1 + src/lib/i18n.ts | 2 + src/locales/bg/albumDetail.ts | 58 ++ src/locales/bg/albums.ts | 41 + src/locales/bg/artistDetail.ts | 52 ++ src/locales/bg/artists.ts | 19 + src/locales/bg/changelog.ts | 5 + src/locales/bg/common.ts | 71 ++ src/locales/bg/composerDetail.ts | 11 + src/locales/bg/composers.ts | 10 + src/locales/bg/connection.ts | 46 ++ src/locales/bg/contextMenu.ts | 33 + src/locales/bg/deviceSync.ts | 80 ++ src/locales/bg/entityRating.ts | 9 + src/locales/bg/favorites.ts | 26 + src/locales/bg/folderBrowser.ts | 4 + src/locales/bg/genres.ts | 15 + src/locales/bg/help.ts | 115 +++ src/locales/bg/hero.ts | 9 + src/locales/bg/home.ts | 21 + src/locales/bg/index.ts | 95 +++ src/locales/bg/licenses.ts | 13 + src/locales/bg/login.ts | 22 + src/locales/bg/losslessAlbums.ts | 7 + src/locales/bg/luckyMix.ts | 6 + src/locales/bg/migration.ts | 15 + src/locales/bg/miniPlayer.ts | 9 + src/locales/bg/mostPlayed.ts | 13 + src/locales/bg/musicNetwork.ts | 55 ++ src/locales/bg/nowPlaying.ts | 48 ++ src/locales/bg/nowPlayingInfo.ts | 24 + src/locales/bg/orbit.ts | 201 +++++ src/locales/bg/player.ts | 69 ++ src/locales/bg/playlists.ts | 125 +++ src/locales/bg/queue.ts | 64 ++ src/locales/bg/radio.ts | 37 + src/locales/bg/randomAlbums.ts | 4 + src/locales/bg/randomLanding.ts | 9 + src/locales/bg/randomMix.ts | 40 + src/locales/bg/search.ts | 87 ++ src/locales/bg/settings.ts | 773 ++++++++++++++++++ src/locales/bg/sharePaste.ts | 20 + src/locales/bg/sidebar.ts | 45 + src/locales/bg/smartPlaylists.ts | 41 + src/locales/bg/songInfo.ts | 27 + src/locales/bg/statistics.ts | 93 +++ src/locales/bg/tracks.ts | 16 + src/locales/bg/tray.ts | 8 + src/locales/bg/whatsNew.ts | 12 + 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/hu/settings.ts | 2 + src/locales/ja/settings.ts | 2 + src/locales/nb/settings.ts | 1 + src/locales/nl/settings.ts | 1 + src/locales/pl/settings.ts | 1 + src/locales/ro/settings.ts | 1 + src/locales/ru/settings.ts | 1 + src/locales/zh/settings.ts | 1 + 65 files changed, 2638 insertions(+) create mode 100644 src/locales/bg/albumDetail.ts create mode 100644 src/locales/bg/albums.ts create mode 100644 src/locales/bg/artistDetail.ts create mode 100644 src/locales/bg/artists.ts create mode 100644 src/locales/bg/changelog.ts create mode 100644 src/locales/bg/common.ts create mode 100644 src/locales/bg/composerDetail.ts create mode 100644 src/locales/bg/composers.ts create mode 100644 src/locales/bg/connection.ts create mode 100644 src/locales/bg/contextMenu.ts create mode 100644 src/locales/bg/deviceSync.ts create mode 100644 src/locales/bg/entityRating.ts create mode 100644 src/locales/bg/favorites.ts create mode 100644 src/locales/bg/folderBrowser.ts create mode 100644 src/locales/bg/genres.ts create mode 100644 src/locales/bg/help.ts create mode 100644 src/locales/bg/hero.ts create mode 100644 src/locales/bg/home.ts create mode 100644 src/locales/bg/index.ts create mode 100644 src/locales/bg/licenses.ts create mode 100644 src/locales/bg/login.ts create mode 100644 src/locales/bg/losslessAlbums.ts create mode 100644 src/locales/bg/luckyMix.ts create mode 100644 src/locales/bg/migration.ts create mode 100644 src/locales/bg/miniPlayer.ts create mode 100644 src/locales/bg/mostPlayed.ts create mode 100644 src/locales/bg/musicNetwork.ts create mode 100644 src/locales/bg/nowPlaying.ts create mode 100644 src/locales/bg/nowPlayingInfo.ts create mode 100644 src/locales/bg/orbit.ts create mode 100644 src/locales/bg/player.ts create mode 100644 src/locales/bg/playlists.ts create mode 100644 src/locales/bg/queue.ts create mode 100644 src/locales/bg/radio.ts create mode 100644 src/locales/bg/randomAlbums.ts create mode 100644 src/locales/bg/randomLanding.ts create mode 100644 src/locales/bg/randomMix.ts create mode 100644 src/locales/bg/search.ts create mode 100644 src/locales/bg/settings.ts create mode 100644 src/locales/bg/sharePaste.ts create mode 100644 src/locales/bg/sidebar.ts create mode 100644 src/locales/bg/smartPlaylists.ts create mode 100644 src/locales/bg/songInfo.ts create mode 100644 src/locales/bg/statistics.ts create mode 100644 src/locales/bg/tracks.ts create mode 100644 src/locales/bg/tray.ts create mode 100644 src/locales/bg/whatsNew.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c20e04a..577a9bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * New **Square Corners** toggle under **Settings → Appearance → Visual Options → Display** overrides the active theme to render cards and cover art with square, non-rounded corners. Covers album, playlist, artist and song cards, detail-page cover art, the Now Playing / Radio and fullscreen views, the cover lightbox, the queue cover, and the mini player. Off by default; buttons, inputs and dialogs keep the theme's corners. +### Bulgarian translation + +**By [@akirichev](https://github.com/akirichev), PR [#1228](https://github.com/Psychotoxical/psysonic/pull/1228)** + +* Full Bulgarian (Български) UI translation — selectable from the language picker on the Settings and Login screens. + ## Changed diff --git a/WHATS_NEW.md b/WHATS_NEW.md index 1d28ed1f..142082f3 100644 --- a/WHATS_NEW.md +++ b/WHATS_NEW.md @@ -12,6 +12,10 @@ Within each section, order by **user impact** (most noticeable first) — not PR ## Highlights +### Bulgarian — now in your language + +- Psysonic is now available in **Bulgarian (Български)** — pick it from the language menu on the **Settings** and **Login** screens. + ### Square corners — a sharper, boxier look - New **Square Corners** toggle under **Settings → Appearance → Visual Options** strips the rounded corners off cards and cover art across the app — handy when a theme's rounding doesn't suit your album covers. Off by default; everything else stays the way your theme defines it. diff --git a/src/config/settingsCredits.ts b/src/config/settingsCredits.ts index d7d9d1a4..0754ebb3 100644 --- a/src/config/settingsCredits.ts +++ b/src/config/settingsCredits.ts @@ -426,6 +426,13 @@ const CONTRIBUTOR_ENTRIES = [ 'Polish (pl) full UI translation (PR #1185)', ], }, + { + github: 'akirichev', + since: '1.50.0', + contributions: [ + 'Bulgarian (bg) full UI translation (PR #1228)', + ], + }, ] as const; // PR number of a contributor's first listed contribution, used as the diff --git a/src/features/auth/pages/Login.tsx b/src/features/auth/pages/Login.tsx index ef89403e..a66ff3ee 100644 --- a/src/features/auth/pages/Login.tsx +++ b/src/features/auth/pages/Login.tsx @@ -311,6 +311,7 @@ export default function Login() { { value: 'ja', label: t('settings.languageJa') }, { value: 'hu', label: t('settings.languageHu') }, { value: 'pl', label: t('settings.languagePl') }, + { value: 'bg', label: t('settings.languageBg') }, ]} /> diff --git a/src/features/settings/components/SystemTab.tsx b/src/features/settings/components/SystemTab.tsx index c60c4cb1..5a5515f8 100644 --- a/src/features/settings/components/SystemTab.tsx +++ b/src/features/settings/components/SystemTab.tsx @@ -77,6 +77,7 @@ export function SystemTab() { { value: 'ja', label: t('settings.languageJa') }, { value: 'hu', label: t('settings.languageHu') }, { value: 'pl', label: t('settings.languagePl') }, + { value: 'bg', label: t('settings.languageBg') }, ]} /> diff --git a/src/lib/i18n.ts b/src/lib/i18n.ts index 93ca03bf..478ab6ff 100644 --- a/src/lib/i18n.ts +++ b/src/lib/i18n.ts @@ -12,6 +12,7 @@ import { roTranslation } from '@/locales/ro'; import { jaTranslation } from '@/locales/ja'; import { huTranslation } from '@/locales/hu'; import { plTranslation } from '@/locales/pl'; +import { bgTranslation } from '@/locales/bg'; const savedLanguage = localStorage.getItem('psysonic_language') || 'en'; @@ -31,6 +32,7 @@ i18n ja: { translation: jaTranslation }, hu: { translation: huTranslation }, pl: { translation: plTranslation }, + bg: { translation: bgTranslation }, }, lng: savedLanguage, fallbackLng: 'en', diff --git a/src/locales/bg/albumDetail.ts b/src/locales/bg/albumDetail.ts new file mode 100644 index 00000000..4dcdfbd8 --- /dev/null +++ b/src/locales/bg/albumDetail.ts @@ -0,0 +1,58 @@ +export const albumDetail = { + back: 'Назад', + orbitDoubleClickHint: 'Кликнете два пъти, за да добавите тази песен към опашката на Orbit', + playAll: 'Пусни всички', + shareAlbum: 'Сподели албума', + enqueue: 'Добави в опашката', + enqueueTooltip: 'Добави целия албум в опашката', + artistBio: 'Биография на изпълнителя', + download: 'Изтегляне (ZIP)', + playTooltip: 'Пусни този албум', + artistBioTooltip: 'Прочети биографията на изпълнителя', + downloadTooltip: 'Изтегли този албум като ZIP', + downloading: 'Зареждане…', + cacheOffline: 'Направи достъпен офлайн', + offlineCached: 'Достъпен офлайн', + offlineQueued: 'В опашката', + offlineDownloading: 'Кеширане… ({{n}}/{{total}})', + removeOffline: 'Премахни офлайн кеша', + removeFromOfflineQueue: 'Премахни от офлайн опашката', + offlineStorageFull: 'Офлайн хранилището е пълно (лимит: {{mb}} MB). Освободете място, като изтриете албум от Офлайн библиотеката, или увеличете лимита в Настройките.', + offlineStorageGoToLibrary: 'Офлайн библиотека', + offlineStorageGoToSettings: 'Настройки', + favoriteAdd: 'Добави в любими', + favoriteRemove: 'Премахни от любими', + favorite: 'Любим', + noBio: 'Няма налична биография.', + moreByArtist: 'Още от {{artist}}', + tracksCount: '{{n}} песни', + goToArtist: 'Отиди при {{artist}}', + moreLabelAlbums: 'Още албуми от {{label}}', + moreGenreAlbums: 'Още албуми в {{genre}}', + genresModalTitle: 'Жанрове', + showAllGenres: 'Покажи всички жанрове', + trackTitle: 'Заглавие', + trackAlbum: 'Албум', + trackArtist: 'Изпълнител', + trackGenre: 'Жанр', + trackPlayCount: 'Изпълнения', + trackLastPlayed: 'Последно пуснато', + trackBpm: 'BPM', + trackFormat: 'Формат', + trackFavorite: 'Любима', + trackRating: 'Оценка', + trackDuration: 'Времетраене', + trackTotal: 'Общо', + columns: 'Колони', + resetColumns: 'Възстанови по подразбиране', + notFound: 'Албумът не е намерен.', + bioModal: 'Биография на изпълнителя', + bioClose: 'Затвори', + ratingLabel: 'Оценка', + enlargeCover: 'Увеличи', + filterSongs: 'Филтрирай песни…', + sortNatural: 'Естествено', + sortByTitle: 'А–Я (Заглавие)', + sortByArtist: 'А–Я (Изпълнител)', + sortByAlbum: 'А–Я (Албум)', +}; diff --git a/src/locales/bg/albums.ts b/src/locales/bg/albums.ts new file mode 100644 index 00000000..cabcc2b3 --- /dev/null +++ b/src/locales/bg/albums.ts @@ -0,0 +1,41 @@ +export const albums = { + title: 'Всички албуми', + sortByName: 'А–Я (Албум)', + sortByArtist: 'А–Я (Изпълнител)', + sortByArtistYear: 'Изпълнител → Година', + sortNewest: 'Най-нови първо', + sortRandom: 'Разбъркано', + yearFrom: 'От', + yearTo: 'До', + yearFilterClear: 'Изчисти филтъра за година', + yearFilterLabel: 'Година', + sortTooltip: 'Промени реда на сортиране', + yearFilterTooltip: 'Филтрирай по година на издаване', + compilationLabel: 'Компилации', + compilationOnly: 'Само компилации', + compilationHide: 'Скрий компилациите', + compilationTooltipAll: 'Всички албуми · клик: само компилации', + compilationTooltipOnly: 'Само компилации · клик: скрий компилациите', + compilationTooltipHide: 'Компилациите са скрити · клик: покажи всички', + losslessLabel: 'Lossless', + losslessTooltipOn: 'Само lossless албуми · клик, за да покажеш всички', + losslessTooltipOff: 'Покажи само lossless албуми', + select: 'Множествен избор', + startSelect: 'Активирай множествен избор', + cancelSelect: 'Отказ', + selectionCount: 'Избрани: {{count}}', + downloadZips: 'Изтегли ZIP файлове', + addOffline: 'Добави офлайн', + enqueueSelected_one: 'Добави в опашката ({{count}})', + enqueueSelected_other: 'Добави в опашката ({{count}})', + enqueueQueued_one: 'Добавен {{count}} албум в опашката', + enqueueQueued_other: 'Добавени {{count}} албума в опашката', + downloadingZip: 'Изтегляне {{current}}/{{total}}: {{name}}', + downloadZipDone: '{{count}} ZIP файл(а) изтеглени', + downloadZipFailed: 'Неуспешно изтегляне на {{name}}', + offlineQueuing: 'Поставяне на {{count}} албум(а) в опашка за офлайн…', + offlineFailed: 'Неуспешно добавяне на {{name}} офлайн', + noFavorites: 'Няма любими албуми, съответстващи на текущите филтри.', + noCompilations: 'Няма компилации, съответстващи на текущите филтри.', + noMatchingFilters: 'Няма албуми, съответстващи на текущите филтри.', +}; diff --git a/src/locales/bg/artistDetail.ts b/src/locales/bg/artistDetail.ts new file mode 100644 index 00000000..a4418208 --- /dev/null +++ b/src/locales/bg/artistDetail.ts @@ -0,0 +1,52 @@ +export const artistDetail = { + back: 'Назад', + albums: 'Албуми', + album: 'Албум', + playAll: 'Пусни всички', + shareArtist: 'Сподели изпълнителя', + shuffle: 'Разбъркай', + radio: 'Радио', + lastfmTooltip: 'Отвори този изпълнител в Last.fm', + wikipediaTooltip: 'Отвори този изпълнител в Wikipedia', + playAllTooltip: 'Пусни цялата дискография', + shuffleTooltip: 'Разбъркай цялата дискография', + radioTooltip: 'Стартирай радио на базата на този изпълнител', + loading: 'Зареждане…', + noRadio: 'Няма намерени подобни песни за този изпълнител.', + notFound: 'Изпълнителят не е намерен.', + albumsBy: 'Албуми от {{name}}', + albumsByLossless: 'Lossless албуми от {{name}}', + sortYearToggleAria: 'Превключи сортирането по година в рамките на всеки тип издание', + sortYearDesc: 'Година, най-новите първо', + sortYearAsc: 'Година, най-старите първо', + topTracks: 'Топ песни', + topTracksLossless: 'Lossless песни', + noAlbums: 'Няма намерени албуми.', + trackTitle: 'Заглавие', + trackAlbum: 'Албум', + trackDuration: 'Времетраене', + favoriteAdd: 'Добави в любими', + favoriteRemove: 'Премахни от любими', + favorite: 'Любим', + albumCount_one: '{{count}} албум', + albumCount_other: '{{count}} албума', + openedInBrowser: 'Отворено в браузъра', + featuredOn: 'Също участва в', + similarArtists: 'Подобни изпълнители', + cacheOffline: 'Запази дискографията офлайн', + offlineCached: 'Дискографията е кеширана', + offlineQueued: 'В опашката', + offlineDownloading: 'Кеширане… ({{done}}/{{total}} албума)', + uploadImage: 'Качи снимка на изпълнителя', + uploadImageError: 'Неуспешно качване на снимка', + releaseTypes: { + album: 'Албум', + ep: 'EP', + single: 'Сингъл', + compilation: 'Компилация', + live: 'На живо', + soundtrack: 'Саундтрак', + remix: 'Ремикс', + other: 'Друго', + }, +}; diff --git a/src/locales/bg/artists.ts b/src/locales/bg/artists.ts new file mode 100644 index 00000000..be8c72db --- /dev/null +++ b/src/locales/bg/artists.ts @@ -0,0 +1,19 @@ +export const artists = { + title: 'Изпълнители', + search: 'Търсене…', + all: 'Всички', + other: 'Други', + gridView: 'Изглед в решетка', + listView: 'Изглед в списък', + imagesOn: 'Снимки на изпълнители — включени. Може да увеличи мрежовото и системното натоварване', + imagesOff: 'Снимки на изпълнители — изключени. Показват се само инициали', + loadMore: 'Зареди още', + notFound: 'Няма намерени изпълнители.', + albumCount_one: '{{count}} албум', + albumCount_other: '{{count}} албума', + selectionCount: 'Избрани: {{count}}', + select: 'Множествен избор', + startSelect: 'Активирай множествен избор', + cancelSelect: 'Отказ', + addToPlaylist: 'Добави в плейлист', +}; diff --git a/src/locales/bg/changelog.ts b/src/locales/bg/changelog.ts new file mode 100644 index 00000000..b7d2b7b2 --- /dev/null +++ b/src/locales/bg/changelog.ts @@ -0,0 +1,5 @@ +export const changelog = { + modalTitle: 'Какво ново', + dontShowAgain: 'Не показвай отново', + close: 'Разбрах', +}; diff --git a/src/locales/bg/common.ts b/src/locales/bg/common.ts new file mode 100644 index 00000000..6a5c0e78 --- /dev/null +++ b/src/locales/bg/common.ts @@ -0,0 +1,71 @@ +export const common = { + albums: 'Албуми', + album: 'Албум', + loading: 'Зареждане…', + loadingMore: 'Зареждане…', + loadingPlaylists: 'Зареждане на плейлисти…', + noAlbums: 'Няма намерени албуми.', + downloading: 'Изтегляне…', + downloadZip: 'Изтегляне (ZIP)', + back: 'Назад', + backToTop: 'Обратно най-горе', + cancel: 'Отказ', + close: 'Затвори', + save: 'Запази', + delete: 'Изтрий', + use: 'Използвай', + add: 'Добави', + new: 'Нов', + active: 'Активен', + download: 'Изтегляне', + chooseDownloadFolder: 'Избери папка за изтегляне', + noFolderSelected: 'Не е избрана папка', + rememberDownloadFolder: 'Запомни тази папка', + filterGenre: 'Филтър по жанр', + filterGenreTooltip: 'Филтрирай по жанр', + filterSearchGenres: 'Търсене на жанрове…', + filterNoGenres: 'Няма съвпадащи жанрове', + filterClear: 'Изчисти', + favorites: 'Любими', + favoritesTooltipOff: 'Покажи само любимите', + favoritesTooltipOn: 'Покажи всички', + play: 'Пусни', + addToQueue: 'Добави в опашката', + bulkSelected: 'Избрани: {{count}}', + clearSelection: 'Изчисти избора', + bulkAddToPlaylist: 'Добави в плейлист', + bulkRemoveFromPlaylist: 'Премахни от плейлиста', + bulkClear: 'Изчисти избора', + updaterAvailable: 'Налична е актуализация', + updaterVersion: 'v{{version}} е налична', + updaterWebsite: 'Уебсайт', + updaterModalTitle: 'Налична е нова версия', + updaterChangelog: 'Какво ново', + updaterDownloadBtn: 'Изтегли сега', + updaterSkipBtn: 'Пропусни тази версия', + updaterRemindBtn: 'Напомни ми по-късно', + updaterDone: 'Изтеглянето завърши', + updaterShowFolder: 'Покажи в папката', + updaterInstallHint: 'Затворете Psysonic и стартирайте инсталатора ръчно.', + updaterAurHint: 'Инсталирайте актуализацията чрез AUR:', + updaterWingetHint: 'Или актуализирайте чрез WinGet:', + updaterErrorMsg: 'Изтеглянето се провали', + updaterRetryBtn: 'Опитай отново', + updaterInstallNow: 'Инсталирай сега', + updaterMacReadyTitle: 'Готово за инсталиране', + updaterMacReady: 'Актуализацията се изтегля, проверява и прилага на място — не е нужен DMG. Приложението се рестартира автоматично след завършване.', + updaterTrustNotarized: 'Нотариално заверено от Apple', + updaterTrustSignature: 'Подписът е проверен', + updaterMacDoneTitle: 'Актуализацията е инсталирана', + updaterRestartingIn: 'Рестартиране след {{n}}с…', + updaterRestarting: 'Рестартиране…', + updaterRestartNow: 'Рестартирай сега', + durationHoursMinutes: '{{hours}}ч {{minutes}}м', + durationMinutesOnly: '{{minutes}}м', + updaterOpenGitHub: 'Отвори в GitHub', + filters: 'Филтри', + more: 'още', + yearRange: 'Диапазон на години', + clearAll: 'Изчисти всички', + libraryEmpty: 'Вашата библиотека е празна.', +}; diff --git a/src/locales/bg/composerDetail.ts b/src/locales/bg/composerDetail.ts new file mode 100644 index 00000000..3373cedd --- /dev/null +++ b/src/locales/bg/composerDetail.ts @@ -0,0 +1,11 @@ +export const composerDetail = { + back: 'Назад', + notFound: 'Композиторът не е намерен.', + about: 'За този композитор', + works: 'Произведения', + noWorks: 'Не са намерени произведения.', + workCount_one: '{{count}} произведение', + workCount_other: '{{count}} произведения', + shareComposer: 'Сподели композитор', + unknownComposer: 'Композитор', +}; diff --git a/src/locales/bg/composers.ts b/src/locales/bg/composers.ts new file mode 100644 index 00000000..907461ca --- /dev/null +++ b/src/locales/bg/composers.ts @@ -0,0 +1,10 @@ +export const composers = { + title: 'Композитори', + search: 'Търсене…', + notFound: 'Не са намерени композитори.', + unsupported: 'Разглеждането по композитори изисква Navidrome 0.55 или по-нова версия.', + loadFailed: 'Композиторите не могат да бъдат заредени.', + retry: 'Опитай отново', + involvedIn_one: 'Участва в {{count}} албум', + involvedIn_other: 'Участва в {{count}} албума', +}; diff --git a/src/locales/bg/connection.ts b/src/locales/bg/connection.ts new file mode 100644 index 00000000..7616d3b7 --- /dev/null +++ b/src/locales/bg/connection.ts @@ -0,0 +1,46 @@ +export const connection = { + connected: 'Свързан', + connectedTo: 'Свързан към {{server}}', + disconnected: 'Прекъсната връзка', + disconnectedFrom: 'Не може да се достигне {{server}} — кликнете, за да проверите настройките', + checking: 'Свързване…', + extern: 'Външен', + offlineTitle: 'Няма връзка със сървъра', + offlineSubtitle: 'Не може да се достигне {{server}}. Проверете мрежата или сървъра.', + offlineModeBanner: 'Офлайн режим — възпроизвеждане от локалния кеш', + offlineNoCacheBanner: 'Няма връзка със сървъра — не може да се достигне {{server}}', + offlineLibraryTitle: 'Офлайн библиотека', + offlineLibraryDiskLabel: 'На диска', + offlineLibraryDiskUsage: 'На диска: {{size}}', + offlineLibraryDiskUsageLoading: 'На диска: …', + offlineLibraryDiskTierLibrary: 'Офлайн библиотека (media/library): {{size}}', + offlineLibraryDiskTierFavorites: 'Любими (media/favorites): {{size}}', + offlineLibraryEmpty: 'Все още няма кеширани албуми. Свържете се онлайн, отворете албум и кликнете „Направи достъпен офлайн“.', + offlinePlaybackUnavailable: 'Локалните файлове за този албум липсват или не са индексирани.', + offlineCachedOnServer: 'На {{server}}', + offlineAlbumCount: '{{n}} албум', + offlineAlbumCount_plural: '{{n}} албума', + offlineFilterAll: 'Всички', + offlineFilterAlbums: 'Албуми', + offlineFilterPlaylists: 'Плейлисти', + offlineFilterArtists: 'Дискографии', + offlineCacheQueueTitle: 'Кеш на опашката', + offlineCacheQueueSubtitle: '{{n}} песни в media/cache — разбъркай и пусни', + offlineCacheQueuePlayAria: 'Разбъркай и пусни всички кеширани песни', + offlineFavoritesQueueTitle: 'Любими', + offlineFavoritesQueuePlayAria: 'Разбъркай и пусни всички любими, запазени офлайн', + retry: 'Опитай отново', + serverSettings: 'Настройки на сървъра', + switchServerTitle: 'Смени сървъра', + switchServerHint: 'Кликнете, за да изберете друг запазен сървър.', + manageServers: 'Управление на сървъри…', + switchFailed: 'Не може да се смени — сървърът е недостъпен.', + queueSynced: 'Опашката е синхронизирана със сървъра', + queuePullHint: 'Кликнете, за да изтеглите опашката от {{server}}', + queueLocalEditHint: 'Опашката е променена локално — автоматичната синхронизация е поставена на пауза. Кликнете, за да изтеглите от сървъра.', + queuePulling: 'Изтегляне на опашката…', + queuePullSuccess: 'Опашката е обновена от сървъра', + queuePullEmpty: 'Опашката на сървъра е празна', + queuePullFailed: 'Не може да се изтегли опашката от сървъра', + queuePullAria: 'Синхронизирай опашката от сървъра', +}; diff --git a/src/locales/bg/contextMenu.ts b/src/locales/bg/contextMenu.ts new file mode 100644 index 00000000..eed3c339 --- /dev/null +++ b/src/locales/bg/contextMenu.ts @@ -0,0 +1,33 @@ +export const contextMenu = { + playNow: 'Пусни сега', + playNext: 'Пусни следващо', + addToQueue: 'Добави в опашката', + enqueueAlbum: 'Добави албума в опашката', + enqueueAlbums_one: 'Добави {{count}} албум в опашката', + enqueueAlbums_other: 'Добави {{count}} албума в опашката', + startRadio: 'Стартирай радио', + instantMix: 'Мигновен микс', + instantMixFailed: 'Не може да се създаде мигновен микс — грешка в сървъра или плъгина.', + cliMixNeedsTrack: 'Нищо не се пуска — стартирайте възпроизвеждане, след което изпълнете командата за микс отново.', + networkLove: 'Хареса в {{provider}}', + networkUnlove: 'Отхаресай в {{provider}}', + favorite: 'Добави в любими', + favoriteArtist: 'Любим изпълнител', + favoriteAlbum: 'Любим албум', + unfavorite: 'Премахни от любими', + unfavoriteArtist: 'Премахни изпълнителя от любими', + unfavoriteAlbum: 'Премахни албума от любими', + removeFromQueue: 'Премахни от опашката', + removeFromPlaylist: 'Премахни от плейлиста', + openAlbum: 'Отвори албума', + goToArtist: 'Отиди при изпълнителя', + download: 'Изтегляне (ZIP)', + addToPlaylist: 'Добави в плейлист', + selectedPlaylists: 'Избрани {{count}} плейлиста', + selectedAlbums: 'Избрани {{count}} албума', + selectedArtists: 'Избрани {{count}} изпълнители', + songInfo: 'Информация за песента', + shareLink: 'Копирай връзка за споделяне', + shareCopied: 'Връзката за споделяне е копирана в клипборда.', + shareCopyFailed: 'Не може да се копира в клипборда.', +}; diff --git a/src/locales/bg/deviceSync.ts b/src/locales/bg/deviceSync.ts new file mode 100644 index 00000000..e31c836b --- /dev/null +++ b/src/locales/bg/deviceSync.ts @@ -0,0 +1,80 @@ +export const deviceSync = { + title: 'Синхронизация на устройство', + targetFolder: 'Целева папка', + noFolderChosen: 'Не е избрана папка', + selectDrive: 'Изберете устройство…', + refreshDrives: 'Обнови устройствата', + noDrivesDetected: 'Не са открити разкачаеми устройства', + browseManual: 'Разгледай ръчно…', + free: 'свободни', + notMountedVolume: 'Целта не е на монтиран том. Устройството може да е било изключено.', + chooseFolder: 'Избери…', + targetDevice: 'Целево устройство', + schemaLabel: 'Схема на именуване', + schemaHint: 'Фиксирана схема за надеждна синхронизация между операционни системи. Плейлистите се записват като .m3u8, които препращат към песните на албума — без дубликати на устройството.', + migrateButton: 'Реорганизирай съществуващи файлове…', + migrateTooltip: 'Преименувай съществуващите файлове на устройството по новата схема (от стария шаблон за имена).', + migrateTitle: 'Реорганизирай съществуващи файлове', + migrateLoading: 'Анализ на съществуващите файлове…', + migrateNothingToDo: 'Всички съществуващи файлове вече съответстват на новата схема — няма какво да се направи.', + migrateNoTemplate: 'Не е намерен стар шаблон за имена на файлове на устройството. Миграцията се прилага само когато стикът е бил синхронизиран с версия на Psysonic, поддържаща персонализирани шаблони.', + migrateFilesToRename: 'файлове ще бъдат преименувани', + migrateUnchanged: '{{n}} файла вече са на правилното място', + migrateCollisions: '{{n}} файла не могат да бъдат преименувани автоматично (няколко песни водят до един и същ целеви файл). Те ще бъдат оставени непокътнати — при следващата синхронизация ще бъдат изтеглени отново на правилното място.', + migratePreviewNote: 'Стар шаблон: {{tpl}}', + migrateExecuting: 'Преименуване на файлове…', + migrateSuccess: '{{n}} файла преименувани успешно', + migrateFailed: '{{n}} преименувания се провалиха', + migrateShowErrors: 'Покажи грешките', + migrateStart: 'Стартирай преименуването', + onDevice: 'Мениджър на устройството', + addSources: 'Добави…', + colName: 'Име', + colType: 'Тип', + colStatus: 'Състояние', + syncResult: '{{done}} прехвърлени, {{skipped}} вече актуални (общо {{total}})', + deleteFromDevice: 'Маркирай за изтриване ({{count}})', + confirmDelete: 'Да се изтрият ли {{count}} елемент(а) от устройството: {{names}}?', + deleteComplete: '{{count}} елемент(а) премахнати от устройството.', + manifestImported: 'Импортирани {{count}} източник(а) от манифеста на устройството.', + selectedSources: 'Избрани източници', + noSourcesSelected: 'Няма избрани източници. Кликнете елементи в браузъра, за да ги добавите.', + clearAll: 'Изчисти всички', + tabPlaylists: 'Плейлисти', + tabAlbums: 'Албуми', + tabArtists: 'Изпълнители', + searchPlaceholder: 'Търсене…', + syncButton: 'Синхронизирай към устройството', + actionTransfer: 'Прехвърли към устройството', + actionDelete: 'Изтрий от устройството', + actionApplyAll: 'Приложи всички промени', + cancel: 'Отказ', + noTargetDir: 'Моля, първо изберете целева папка.', + noSources: 'Моля, изберете поне един източник.', + noTracks: 'Няма намерени песни в избраните източници.', + fetchError: 'Неуспешно извличане на песни от сървъра.', + syncComplete: 'Синхронизацията завърши.', + dismiss: 'Отхвърли', + cancelSync: 'Отказ', + syncCancelled: 'Синхронизацията е отменена ({{done}} / {{total}} прехвърлени).', + statusSynced: 'Синхронизиран', + statusPending: 'Изчаква', + statusDeletion: 'За изтриване', + markForDeletion: 'Маркирай за изтриване', + undoDeletion: 'Отмени изтриването', + removeSource: 'Премахни', + syncInBackground: 'Синхронизацията стартира във фонов режим — можете да преминете към друго.', + syncInProgress: '{{done}} / {{total}} песни…', + scanningDevice: 'Сканиране на устройството…', + syncSummary: 'Обобщение на синхронизацията', + calculating: 'Изчисляване на необходимия обем…', + filesToAdd: 'Файлове за добавяне:', + filesToDelete: 'Файлове за изтриване:', + netChange: 'Нетна промяна:', + availableSpace: 'Налично дисково пространство:', + spaceWarning: 'Внимание: Целевото устройство няма достатъчно докладвано пространство.', + proceed: 'Продължи със синхронизацията', + notEnoughSpace: 'Недостатъчно дисково пространство!', + liveSearch: 'На живо', + randomAlbumsLabel: 'Случайни албуми', +}; diff --git a/src/locales/bg/entityRating.ts b/src/locales/bg/entityRating.ts new file mode 100644 index 00000000..d840e9ff --- /dev/null +++ b/src/locales/bg/entityRating.ts @@ -0,0 +1,9 @@ +export const entityRating = { + albumShort: 'Оценка на албум', + artistShort: 'Оценка на изпълнител', + albumAriaLabel: 'Оценка на албум', + artistAriaLabel: 'Оценка на изпълнител', + selectedArtistsRatingAriaLabel: 'Звездна оценка за {{count}} избрани изпълнители', + selectedAlbumsRatingAriaLabel: 'Звездна оценка за {{count}} избрани албуми', + saveFailed: 'Оценката не може да бъде запазена.', +}; diff --git a/src/locales/bg/favorites.ts b/src/locales/bg/favorites.ts new file mode 100644 index 00000000..1a329380 --- /dev/null +++ b/src/locales/bg/favorites.ts @@ -0,0 +1,26 @@ +export const favorites = { + title: 'Любими', + empty: 'Все още нямате запазени любими.', + artists: 'Изпълнители', + albums: 'Албуми', + songs: 'Песни', + enqueueAll: 'Добави всички в опашката', + enqueueSelected: 'Добави избраните в опашката', + playAll: 'Пусни всички', + playSelected: 'Пусни избраните', + removeSong: 'Премахни от любими', + stations: 'Радиостанции', + showingFiltered: 'Показани {{filtered}} от {{total}} ({{artist}})', + showingCount: 'Показани {{filtered}} от {{total}}', + clearArtistFilter: 'Изчисти филтъра по изпълнител', + noFilterResults: 'Няма резултати с избраните филтри.', + allArtists: 'Всички изпълнители', + topArtists: 'Топ изпълнители по любими', + topArtistsSongCount_one: '{{count}} песен', + topArtistsSongCount_other: '{{count}} песни', + offlineTooltip: 'Запазете любимите си за офлайн слушане', + offlineJobName: 'Любими', + offlineSemaphoreSyncing: 'Синхронизиране на любими… {{saved}} от {{total}}', + offlineSemaphoreSynced: 'Всички любими са запазени за офлайн слушане', + offlineSemaphoreError: 'Грешка при синхронизиране — някои песни не могат да бъдат запазени', +}; diff --git a/src/locales/bg/folderBrowser.ts b/src/locales/bg/folderBrowser.ts new file mode 100644 index 00000000..190b5bbb --- /dev/null +++ b/src/locales/bg/folderBrowser.ts @@ -0,0 +1,4 @@ +export const folderBrowser = { + empty: 'Празна папка', + error: 'Неуспешно зареждане', +}; diff --git a/src/locales/bg/genres.ts b/src/locales/bg/genres.ts new file mode 100644 index 00000000..d8eb33cd --- /dev/null +++ b/src/locales/bg/genres.ts @@ -0,0 +1,15 @@ +export const genres = { + title: 'Жанрове', + genreCount: 'Жанрове', + albumCount_one: '{{count}} албум', + albumCount_other: '{{count}} албума', + loading: 'Зареждане на жанрове…', + empty: 'Не са намерени жанрове.', + albumsLoading: 'Зареждане на албуми…', + albumsEmpty: 'Не са намерени албуми за този жанр.', + loadMore: 'Зареди още', + back: 'Назад', + playTooltip: 'Пусни (задръж за разбъркване)', + shuffle: 'Разбъркай', + addToQueue: 'Добави в опашката', +}; diff --git a/src/locales/bg/help.ts b/src/locales/bg/help.ts new file mode 100644 index 00000000..74b1e84a --- /dev/null +++ b/src/locales/bg/help.ts @@ -0,0 +1,115 @@ +export const help = { + title: 'Помощ', + searchPlaceholder: 'Търси в помощта…', + noResults: 'Няма съвпадащи теми. Опитайте с друга дума за търсене.', + // ── Section 1: Getting Started ───────────────────────────────────────── + s1: 'Първи стъпки', + q1: 'Кои сървъри са съвместими?', + a1: 'Psysonic е създаден преди всичко за Navidrome и е напълно съвместим със Subsonic — Gonic, Airsonic, LMS и други сървъри със Subsonic API също работят. Някои разширени функции (оценки, интелигентни плейлисти, споделяне с магически низове, управление на потребители) изискват Navidrome.', + q2: 'Как да добавя сървър?', + a2: 'Настройки → Сървъри → Добави сървър. Въведете URL адреса (напр. http://192.168.1.100:4533), потребителско име и парола. Psysonic тества връзката преди запис — нищо не се съхранява, ако не успее. Можете да добавите колкото искате сървъри и да превключвате между тях в горната лента по всяко време; активен е само един по едно и също време.', + q3: 'Кратка обиколка на интерфейса?', + a3: 'Странична лента (вляво) за навигация, Mainstage / страници в средата, лента на плейъра долу и панел на опашката вдясно (превключва се от заглавната лента горе вдясно до индикатора „В момента пуска“). Лентата за търсене отгоре търси в цялата ви библиотека; „В момента пуска“ показва какво слушат в момента други потребители на същия Navidrome сървър.', + // ── Section 2: Playback & Queue ──────────────────────────────────────── + s2: 'Възпроизвеждане и опашка', + q4: 'Как се използва опашката?', + a4: 'Отворете панела на опашката от заглавната лента горе вдясно. Влачете редове, за да ги пренаредите, пуснете ги извън панела, за да ги премахнете, или използвайте лентата с инструменти, за да разбъркате, да запазите опашката като плейлист или да прескочите до песен. Влачете редове извън панела, за да ги пуснете другаде като прехвърляне.', + q5: 'Gapless срещу Crossfade — каква е разликата?', + a5: 'Gapless предварително буферира следващата песен, така че между песните няма тишина (най-добре за концертни албуми и DJ миксове). Crossfade заглушава текущата песен, докато следващата се появява в продължение на 1–10 сек (най-добре за разбъркани миксове). Взаимно се изключват — включването на едното изключва другото. Настройте и двете в Настройки → Аудио.', + q6: 'Какво е Infinite Queue?', + a6: 'Когато опашката свърши и повторението е изключено, Psysonic тихо добавя подобни / произволни песни от библиотеката ви, така че възпроизвеждането никога не спира. Автоматично добавените песни се появяват под разделител „— Добавено автоматично —“. Превключвайте го с иконата за безкрайност в заглавието на опашката; ограничете автоматичните добавяния до жанр в Настройки → Опашка.', + q7: 'Множествен избор и избор на диапазон с Shift+клик?', + a7: 'Активирайте „Избор“ в Албуми / Нови издания / Произволни албуми / Плейлисти. Кликнете елемент, за да го превключите, след което задръжте Shift и кликнете друг елемент, за да изберете всичко между тях във видимия ред. Shift+клик разширява от последно кликнатата опорна точка. Лентата с инструменти над решетката предлага групови действия (опашка, изтегляне, изтриване и т.н.).', + q8: 'Клавишни комбинации и глобални клавиши?', + a8: 'Клавиши по подразбиране в приложението: Space = Пусни / Пауза, Esc = затвори цял екран / модални прозорци, F1 = кратък списък с клавиши. Настройки → Вход ви позволява да преназначите всяко действие в приложението (също и като комбинации като Ctrl+Shift+P) и да зададете системни глобални клавиши, които работят дори когато Psysonic е във фонов режим или минимизиран. Медийните клавиши (Пусни/Пауза, Следваща, Предишна) работят на всички платформи.', + // ── Section 3: Audio Tools ───────────────────────────────────────────── + s3: 'Аудио инструменти', + q9: 'Режими на Replay Gain?', + a9: 'Настройки → Аудио → Replay Gain. Режим Track нормализира всяка песен до целево ниво. Режим Album запазва кривата на силата в рамките на албум. Режим Auto избира Track или Album в зависимост от това дали опашката е от един албум. Песните без Replay Gain тагове се връщат към настройваем предусилвател.', + q10: 'Какво е Smart Loudness Normalization (LUFS)?', + a10: 'Модерна алтернатива на Replay Gain в Настройки → Аудио. Psysonic анализира всяка песен до LUFS / EBU R128 и съхранява резултата, така че силата на звука е постоянна в цялата ви библиотека — включително за песни без Replay Gain тагове. Първоначалният анализ работи във фонов режим и използва 35–40 % от процесора за около 1 минута, след което спада до 0. Задайте целевата си сила (по подразбиране −10 LUFS) веднъж.', + q11: 'Еквалайзер и AutoEQ?', + a11: '10-лентов параметричен еквалайзер се намира в Настройки → Аудио → Еквалайзер с ръчни ленти и предварителни настройки. AutoEQ до него издърпва измерен корекционен профил за модела на слушалките ви от базата данни на AutoEQ и го прилага автоматично към лентите — изберете слушалките си и еквалайзерът се настройва към правилната крива.', + q12: 'Как да превключа аудио изходното устройство?', + a12: 'Настройки → Аудио → Изходно устройство. Psysonic изброява всяко налично изходно устройство и превключва мигновено, когато изберете. Бутонът за опресняване повторно сканира устройства, свързани след стартиране. Имена като „sysdefault“ на Linux ALSA се почистват автоматично за четимост.', + q13: 'Какво е Hot Cache?', + a13: 'Hot Cache предварително зарежда текущата песен плюс следващите няколко в RAM и на диск, така че възпроизвеждането започва без буфериране — особено полезно на бавни / отдалечени сървъри. Освобождаването на място започва, когато лимитът за размер бъде достигнат. Настройте размера и забавянето (така че бързите прескачания да не свалят прекалено много) в Настройки → Аудио.', + // ── Section 4: Library & Discovery ───────────────────────────────────── + s4: 'Библиотека и откриване', + q14: 'Как работят оценките и Skip-to-1★?', + a14: 'Psysonic поддържа оценки от 1–5 звезди чрез OpenSubsonic (Navidrome ≥ 0.53). Оценявайте песни в списъци с песни, в контекстното меню с десен клик или в лентата на плейъра под името на изпълнителя; албуми на страницата на албума; изпълнители на страницата на изпълнителя. Skip-to-1★ (Настройки → Библиотека → Оценки) автоматично задава 1 звезда след настройваем брой последователни прескачания. Същият панел ви позволява да зададете минимален филтър за оценка за Random Mix и други генерирани миксове.', + q15: 'Как да разглеждам — Папки, Жанрове, Песни?', + a15: 'Folder Browser (странична лента) обхожда музикалната директория на вашия сървър в Miller-колонен изглед — кликнете папка, за да навлезете, кликнете песен или иконата за пускане на папка, за да пуснете / добавите в опашката. Genres използва изглед „облак от тагове“, мащабиран според броя на песните; кликнете жанр, за да го отворите. Tracks е плосък хъб на библиотеката с виртуален списък със сортируеми колони и живо търсене.', + q16: 'Търсене и Разширено търсене?', + a16: 'Лентата за търсене в заглавието изпълнява бързо живо търсене сред изпълнители, албуми и песни, докато пишете. Отворете Разширено търсене (странична лента) за по-богат изглед: филтрирайте по година, жанр, оценка, формат, канали, честота на дискретизация, BPM, настроение и комбинирайте критерии. Десен клик върху всеки резултат за същото контекстно меню, използвано другаде в приложението.', + q17: 'Какво представляват миксовете (Random / Genre / Super Genre / Lucky)?', + a17: 'Random Mix изгражда плейлист от произволни песни от библиотеката ви; филтърът за ключови думи изключва аудиокниги, комедия и т.н. чрез поднизове в жанр / заглавие / албум. Super Genre Mix групира библиотеката ви в широки стилове (Rock, Metal, Electronic, Jazz, Classical…) и изгражда фокусиран микс от един. Lucky Mix използва историята ви на слушане, оценките и подобни песни от AudioMuse-AI, за да сглоби мигновен плейлист с един клик.', + q18: 'Страница със статистика?', + a18: 'Statistics (странична лента) показва топ изпълнители, топ албуми, топ песни, разбивка по жанрове, време на слушане с течение на времето и обхват по библиотека, когато имате конфигурирани повече от една музикална папка. Няколко изгледа могат да бъдат експортирани като изображение за споделяне.', + q19: 'Как да изтегля албум като ZIP?', + a19: 'Страница на албума → „Изтегли (ZIP)“. Сървърът първо компресира албума — за големи или загубени албуми (FLAC / WAV) прогрес лентата се появява едва след като компресирането приключи и прехвърлянето започне. Това е нормално.', + // ── Section 5: Lyrics ────────────────────────────────────────────────── + s5: 'Текстове на песни', + q20: 'Откъде идват текстовете?', + a20: 'Три източника, конфигурируеми в Настройки → Текстове: вашият Navidrome сървър (вградени / OpenSubsonic текстове), LRCLIB (синхронизирани текстове от общността) и NetEase Cloud Music (голям азиатски + международен каталог). Всеки източник може да бъде включен / изключен и пренареден чрез влачене.', + q21: 'Как да гледам текстовете по време на възпроизвеждане?', + a21: 'Кликнете иконата на микрофон в лентата на плейъра, за да отворите раздела Lyrics в панела на опашката. Синхронизираните текстове се превъртат автоматично и поддържат клик-за-прескачане; обикновените текстове се превъртат като статичен блок. Превключете плейъра на цял екран от корицата в лентата на плейъра за поглъщащ изглед на текстовете с мрежов размит фон.', + // ── Section 6: Sharing & Social ──────────────────────────────────────── + s6: 'Споделяне и социални функции', + q22: 'Какво са Magic Strings?', + a22: 'Magic Strings са кратки токени за копиране и поставяне, които споделят неща между потребители на Psysonic без каквито и да е сървъри на трети страни. Server-Invite низовете позволяват на приятел да се качи на вашия Navidrome с едно поставяне; Album / Artist / Queue Magic Strings отварят същия албум / изпълнител / опашка на инсталирания Psysonic на получателя. Генерирайте ги от менюто за споделяне, поставете ги в лентата за търсене, за да ги употребите.', + q23: 'Какво е Orbit?', + a23: 'Orbit е синхронизирано слушане заедно: домакин пуска песен, всеки гост я чува синхронно и гостите могат да предлагат песни, които домакинът може да приеме в опашката. Стартирайте сесия от бутона Orbit в заглавието, споделете линка за покана и други могат да се присъединят от всяка инсталация на Psysonic. Домакинът притежава възпроизвеждането (прескачане, прематаване, опашка) — гостите получават изглед в реално време и кутия за предложения. Сесиите са временни и приключват, когато домакинът ги затвори.', + q24: 'Какво е падащото меню Now Playing?', + a24: 'Иконата за излъчване в заглавната лента горе вдясно показва какво слушат в момента други потребители на вашия Navidrome сървър, обновявана на всеки 10 секунди. Собственият ви запис изчезва в момента, в който поставите пауза. Работи по сървър, така че потребители на различен активен сървър не се показват.', + // ── Section 7: Personalization ───────────────────────────────────────── + s7: 'Персонализация', + q25: 'Теми и планировчик на теми?', + a25: 'Настройки → Външен вид → Тема избира от 60+ теми в 8 групи (Psysonic, Mediaplayer, Операционни системи, Игри, Филми, Сериали, Социални медии, Open Source класики — Catppuccin / Nord / Gruvbox / Nightfox / Dracula). Auto-Switch Theme ви позволява да зададете дневна тема + нощна тема с начални часове, така че Psysonic да превключва автоматично.', + q26: 'Мога ли да персонализирам страничната лента, началната страница и страниците на изпълнителите?', + a26: 'Да — Настройки → Персонализация. Персонализаторът на страничната лента ви позволява да влачите навигационните елементи в желания ред и да скриете тези, които не използвате. Персонализаторът на началната страница превключва всеки Mainstage релс (Hero, Recent, Discover, Recently Played, Starred…). Персонализаторът на страницата на изпълнителя пренарежда секциите (Top Songs, Albums, Singles, Compilations, Similar Artists и т.н.) и ви позволява да скриете тези, които никога не гледате.', + q27: 'Какво е Mini Player?', + a27: 'Малък плаващ прозорец с корица, контроли за възпроизвеждане и компактна опашка. Отворете го от иконата за мини плейър в лентата на плейъра или с клавишната му комбинация. Прозорецът запомня позицията и размера си между сесиите. На Windows мини изгледът се създава предварително при стартиране, така че отварянето е мигновено; Linux / macOS се включват чрез Настройки → Външен вид → Предварително зареждане на мини плейър.', + q28: 'Какво е Floating Player Bar?', + a28: 'Незадължителен стил на лентата на плейъра (Настройки → Външен вид), който се откъсва от долния ръб с тематичен фон, акцентна рамка, заоблена корица на албума и центрирана секция за силата на звука. Полезен на високи монитори или компактни теми.', + q29: 'Преглед на песен при задържане на курсора?', + a29: 'Задръжте курсора върху ред с песен, кликнете малкия бутон за преглед върху корицата или задействайте преглед от контекстното меню с десен клик — Psysonic стриймва първите ~15 сек през същия Rust аудио двигател, така че се прилага нормализирането на силата на звука. Полезно за прелистване на албум, който не сте чували преди.', + q30: 'Таймер за сън?', + a30: 'Кликнете иконата на луна в лентата на плейъра, за да отворите таймера за сън. Изберете продължителност (или „край на текущата песен“) и Psysonic заглушава и поставя пауза в края. Бутонът показва кръгъл пръстен и обратно броене в бутона, докато таймерът работи.', + q31: 'Мащаб на интерфейса, шрифт, стил на прогрес лентата?', + a31: 'Настройки → Външен вид — Мащаб на интерфейса (80–125 %, без да засяга системния размер на шрифта), Шрифт (10 UI шрифта, включително IBM Plex Mono, Fira Code, Geist, Golos Text…), Стил на прогрес лентата (анализирана вълна / детерминистична псевдо-вълна / линия и точка / лента / дебела лента / сегментирана / неонов блясък / пулсираща вълна / следа от частици / течно запълване / ретро лента).', + // ── Section 8: Power User ────────────────────────────────────────────── + s8: 'Опитен потребител', + q32: 'CLI контроли на плейъра?', + a32: 'Psysonic бинарният файл действа и като дистанционно управление. Примери: psysonic --player play / pause / next / prev, --player volume 75, --player seek 15, --player shuffle, --player repeat off|all|one, --player rating 1-5. Превключвайте сървъри, аудио устройства, библиотеки; задействайте Instant Mix; търсете изпълнители / албуми / песни. Изпълнете psysonic --player --help за пълния списък. Shell попълвания за bash и zsh чрез psysonic completions.', + q33: 'Smart Playlists (Navidrome)?', + a33: 'Smart Playlists са динамични плейлисти на страната на Navidrome, дефинирани от правила (жанр = Rock И година > 2020 и т.н.). Страницата Playlists в Psysonic ви позволява да ги създавате, редактирате и изтривате с визуален редактор на правила — Psysonic говори с нативния API на Navidrome за това. Държат се като нормални плейлисти в останалата част от приложението и се актуализират автоматично при промяна на библиотеката ви.', + q34: 'Резервно копие и възстановяване на настройки?', + a34: 'Настройки → Съхранение → Резервно копие и възстановяване експортира профилите на сървъри, темите, клавишните комбинации и други настройки в един JSON файл. Импортирайте файла на друга машина или след повторна инсталация, за да възстановите всичко наведнъж. Паролите на сървърите се включват — пазете файла личен.', + q35: 'Къде виждам всички лицензи с отворен код?', + a35: 'Настройки → Система → Лицензи с отворен код. Пълният списък със зависимости (cargo сандъци и npm пакети) се доставя в компилацията с включени лицензни текстове. Кликнете запис за пълния текст; куриран блок с акценти отгоре откроява разпознаваемите от потребителя библиотеки (Tauri, React, rodio, symphonia и т.н.).', + // ── Section 9: Offline & Sync ────────────────────────────────────────── + s9: 'Офлайн и синхронизация', + q36: 'Офлайн режим — кеширане на албуми и плейлисти?', + a36: 'Отворете който и да е албум или плейлист и кликнете иконата за изтегляне в заглавието — Psysonic кешира всяка песен локално, така че се пуска от диска без мрежово повикване. Страницата Offline Library (странична лента) изброява всичко кеширано, показва напредъка в движение и ви позволява да премахвате записи с иконата за кошче (която се появява, след като изтеглянето приключи).', + q37: 'Лимит за офлайн съхранение?', + a37: 'Настройки → Библиотека → Офлайн ви позволява да зададете максимален размер на кеша. Когато лимитът бъде достигнат, бутонът за изтегляне на страницата на албума показва предупредителен банер. Освободете място, като премахнете албуми или плейлисти от страницата Offline Library.', + q38: 'Device Sync — копиране на музика на USB / SD?', + a38: 'Device Sync (странична лента) копира албуми, плейлисти или цели изпълнители на външно устройство за офлайн слушане на други устройства. Изберете целева папка, изберете източници от разделите на браузъра, кликнете „Прехвърли към устройство“. Psysonic пише манифест (psysonic-sync.json), така че знае кои файлове вече са там, дори ако отворите Device Sync на различна ОС с различен шаблон за име на файл. Шаблоните поддържат {artist} / {album} / {title} / {track_number} / {disc_number} / {year} токени с / за разделител на папки.', + // ── Section 10: Integrations & Troubleshooting ───────────────────────── + s10: 'Интеграции и отстраняване на проблеми', + q39: 'Scrobbling — Last.fm, ListenBrainz, Maloja…?', + a39: 'Настройки → Интеграции → Музикална мрежа. Свържете една или повече scrobble услуги (Last.fm, Libre.fm, Rocksky, ListenBrainz, Maloja или всеки GNU FM-съвместим сървър) — без нужда от конфигурация на Navidrome. Всяка свързана услуга с активиран scrobbling получава пускането; главният превключвател „Активирай scrobbling“ включва или изключва цялото разпръскване. Scrobble се изпраща, след като сте чули 50 % от песента; пингове „в момента се изпълнява“ излизат в началото за услугите, които го поддържат. Една услуга е основната ви — харесаните ви песни, подобни изпълнители и статистика на слушане се четат от нея. Съвет: ако вашият Navidrome сървър вече прави scrobble към услуга (напр. Maloja), не свързвайте същата услуга и тук, иначе ще получите дублирани scrobbles.', + q40: 'Discord Rich Presence?', + a40: 'Настройки → Интеграции → Discord показва текущата ви песен в профила ви в Discord. Изберете между иконата на приложението, корицата на албума от вашия сървър (чрез getAlbumInfo2 — изисква публично достъпен сървър) или корици от Apple Music. Персонализирайте показваните низове (детайли, състояние, tooltip) с токен шаблони.', + q41: 'Дати на турнета в Bandsintown?', + a41: 'Включете от Настройки → Интеграции → Информация „В момента пуска“. Разделът Now Playing на страницата Now Playing тогава показва предстоящите дати на турнета за пусканата изпълнителка чрез widget API на Bandsintown. Изключено по подразбиране — не се правят заявки, докато не го активирате.', + q42: 'Internet Radio — пускане на живи потоци?', + a42: 'Internet Radio (странична лента) пуска всеки жив поток, съхранен на вашия Navidrome сървър (добавете станции чрез администраторския UI на Navidrome). Възпроизвеждането върви през HTML5 audio двигателя на браузъра — повечето EQ / Replay Gain / Loudness настройки не се прилагат за радио, но ICY метаданните (име на текущата песен) се показват. Поддържа MP3, AAC, OGG Vorbis и повечето HLS потоци; поддръжката на кодеци зависи от платформата.', + q43: 'Тестът на връзката се проваля — какво сега?', + a43: 'Проверете още веднъж URL адреса, включително порта (напр. http://192.168.1.100:4533). В локална мрежа http:// често работи там, където https:// не работи (без сертификат). Уверете се, че никаква защитна стена не блокира порта и че потребителското име и паролата са правилни. Ако сървърът ви е зад обратно прокси, опитайте първо директния URL, за да изолирате причината.', + q44: 'Корици на албуми и изображения на изпълнители се зареждат бавно.', + a44: 'Изображенията се извличат от сървъра ви при първо гледане и след това се кешират локално за 30 дни. Ако съхранението на сървъра ви е бавно, първото посещение на страница може да отнеме момент; последващите посещения са мигновени. Hot Cache също помага за песните, но кешът на изображения е независим.', + q45: 'Проблеми с Linux — черен екран или без звук?', + a45: 'Черен екран на Linux обикновено е проблем с графиката или дисплея на WebView. Опитайте X11 сесия или задайте GDK_BACKEND=x11 и EGL_PLATFORM=x11 преди стартиране, ако използвате Wayland. За звук се уверете, че PipeWire или PulseAudio работи. Ако звукът спре след сън или събуждане, затворете напълно Psysonic и го отворете отново.', +}; diff --git a/src/locales/bg/hero.ts b/src/locales/bg/hero.ts new file mode 100644 index 00000000..658abac3 --- /dev/null +++ b/src/locales/bg/hero.ts @@ -0,0 +1,9 @@ +export const hero = { + eyebrow: 'Препоръчан албум', + playAlbum: 'Пусни албум', + playAlbumTooltip: 'Пусни албум (задръж за разбъркване)', + enqueue: 'В опашката', + enqueueTooltip: 'Добави целия албум в опашката', + previousAlbum: 'Предишен албум', + nextAlbum: 'Следващ албум', +}; diff --git a/src/locales/bg/home.ts b/src/locales/bg/home.ts new file mode 100644 index 00000000..7967244b --- /dev/null +++ b/src/locales/bg/home.ts @@ -0,0 +1,21 @@ +export const home = { + hero: 'Препоръчано', + starred: 'Лични любими', + mostPlayed: 'Най-слушани', + recentlyPlayed: 'Наскоро пуснати', + losslessAlbums: 'Lossless албуми', + discover: 'Открий', + discoverSongs: 'Открий песни', + loadMore: 'Зареди още', + discoverMore: 'Открий още', + discoverArtists: 'Открий изпълнители', + discoverArtistsMore: 'Всички изпълнители', + becauseYouLike: 'Защото слушахте…', + becauseYouLikeFor: 'Защото слушахте {{artist}}', + similarTo: 'Подобно на {{artist}}', + becauseYouLikeTracks_one: '{{count}} песен', + becauseYouLikeTracks_other: '{{count}} песни', + mainstageEmptyTitle: 'Вашата главна сцена е празна', + mainstageEmptyBody: 'Всички секции са изключени. Включете секции обратно или скрийте главната сцена от страничната лента.', + mainstageEmptyCta: 'Отвори настройките за персонализация' +}; diff --git a/src/locales/bg/index.ts b/src/locales/bg/index.ts new file mode 100644 index 00000000..91b78076 --- /dev/null +++ b/src/locales/bg/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 bgTranslation = { + 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/bg/licenses.ts b/src/locales/bg/licenses.ts new file mode 100644 index 00000000..3f5403db --- /dev/null +++ b/src/locales/bg/licenses.ts @@ -0,0 +1,13 @@ +export const licenses = { + title: 'Лицензи за отворен код', + intro: 'Psysonic е изграден върху софтуер с отворен код. Списъкът по-долу показва всяка зависимост, включена в приложението, с нейната версия, лиценз и пълен текст на лиценза.', + highlights: 'Ключови зависимости', + searchPlaceholder: 'Търсене по име, версия или лиценз…', + noResults: 'Няма съвпадения.', + loading: 'Зареждане на лицензи…', + loadError: 'Данните за лицензи не могат да бъдат заредени.', + noLicenseText: 'Няма приложен текст на лиценз за тази зависимост.', + viewSource: 'Виж източника', + totalLine: '{{total}} зависимости — {{cargo}} cargo, {{npm}} npm', + generatedAt: 'Последно генериран {{date}}', +}; diff --git a/src/locales/bg/login.ts b/src/locales/bg/login.ts new file mode 100644 index 00000000..8cae9f3f --- /dev/null +++ b/src/locales/bg/login.ts @@ -0,0 +1,22 @@ +export const login = { + subtitle: 'Вашият Navidrome настолен плеър', + serverName: 'Име на сървър (по избор)', + serverNamePlaceholder: 'Моят Navidrome', + serverUrl: 'URL на сървъра', + serverUrlPlaceholder: '192.168.1.100:4533 или https://music.example.com', + username: 'Потребителско име', + usernamePlaceholder: 'admin', + password: 'Парола', + showPassword: 'Покажи парола', + hidePassword: 'Скрий парола', + connect: 'Свържи се', + connecting: 'Свързване…', + connected: 'Свързан!', + error: 'Неуспешно свързване – моля, проверете данните си.', + urlRequired: 'Моля, въведете URL на сървъра.', + savedServers: 'Запазени сървъри', + addNew: 'Или добави нов сървър', + orMagicString: 'Или магически код', + magicStringPlaceholder: 'Поставете код за споделяне (psysonic1-…)', + magicStringInvalid: 'Невалиден или нечетлив магически код.', +}; diff --git a/src/locales/bg/losslessAlbums.ts b/src/locales/bg/losslessAlbums.ts new file mode 100644 index 00000000..0b5fdc21 --- /dev/null +++ b/src/locales/bg/losslessAlbums.ts @@ -0,0 +1,7 @@ +export const losslessAlbums = { + empty: 'Все още няма lossless албуми в тази библиотека.', + unsupported: 'Този сървър не предоставя метаданните, необходими за намиране на lossless албуми.', + slowFetchHint: 'Зарежда се по-бавно от други страници с албуми — Psysonic обхожда пълния каталог с песни по качество.', + modeBanner: 'Lossless режим — показват се само FLAC, WAV и други lossless формати.', + modeBannerExit: 'Покажи всички формати', +}; diff --git a/src/locales/bg/luckyMix.ts b/src/locales/bg/luckyMix.ts new file mode 100644 index 00000000..c7b469b3 --- /dev/null +++ b/src/locales/bg/luckyMix.ts @@ -0,0 +1,6 @@ +export const luckyMix = { + done: 'Lucky Mix е готов: {{count}} песни', + failed: 'Lucky Mix не може да бъде създаден. Опитайте отново.', + unavailable: 'Lucky Mix не е наличен за този сървър.', + cancelTooltip: 'Отмени създаването на Lucky Mix', +}; diff --git a/src/locales/bg/migration.ts b/src/locales/bg/migration.ts new file mode 100644 index 00000000..e28ed903 --- /dev/null +++ b/src/locales/bg/migration.ts @@ -0,0 +1,15 @@ +export const migration = { + preparing: 'Подготовка на актуализация на данни…', + preparingBody: 'Проверка на вашата библиотека и кеш за анализ…', + migrating: 'Мигриране на данни', + working: 'работи…', + skippedRows: 'Редове за премахнати сървъри бяха пропуснати и старата резервна база данни ще бъде премахната след успешно превключване.', + failed: 'Миграцията се провали', + retry: 'Опитай отново', + copyDetails: 'Копирай детайли', + complete: 'Актуализацията е завършена', + completeRows: '{{count}} реда мигрирани', + genreTagsTitle: 'Актуализиране на индекса на жанровете…', + genreTagsBody: 'Индексиране на жанрове за преглед и филтри. Това се изпълнява веднъж след надграждане.', + genreTagsFailed: 'Актуализацията на индекса на жанровете се провали', +}; diff --git a/src/locales/bg/miniPlayer.ts b/src/locales/bg/miniPlayer.ts new file mode 100644 index 00000000..7f27046e --- /dev/null +++ b/src/locales/bg/miniPlayer.ts @@ -0,0 +1,9 @@ +export const miniPlayer = { + showQueue: 'Покажи опашката', + hideQueue: 'Скрий опашката', + pinOnTop: 'Закачи отгоре', + pinOff: 'Откачи', + openMainWindow: 'Отвори основния прозорец', + close: 'Затвори', + emptyQueue: 'Опашката е празна', +}; diff --git a/src/locales/bg/mostPlayed.ts b/src/locales/bg/mostPlayed.ts new file mode 100644 index 00000000..b748250b --- /dev/null +++ b/src/locales/bg/mostPlayed.ts @@ -0,0 +1,13 @@ +export const mostPlayed = { + title: 'Най-слушани', + topArtists: 'Топ изпълнители', + topAlbums: 'Топ албуми', + plays: '{{n}} пускания', + sortMost: 'Най-много пускания първо', + sortLeast: 'Най-малко пускания първо', + loadMore: 'Зареди още албуми', + noData: 'Все още няма данни за пускания. Започнете да слушате!', + noArtists: 'Всички изпълнители са филтрирани.', + filterCompilations: 'Скрий изпълнители на компилации (Various Artists, Soundtracks и др.)', + filterCompilationsShort: 'Скрий компилации', +}; diff --git a/src/locales/bg/musicNetwork.ts b/src/locales/bg/musicNetwork.ts new file mode 100644 index 00000000..0af72c11 --- /dev/null +++ b/src/locales/bg/musicNetwork.ts @@ -0,0 +1,55 @@ +export const musicNetwork = { + title: 'Музикална мрежа', + desc: 'Скроблвай изпълненията си към една или повече услуги. Харесванията, подобните изпълнители и статистиките за слушане идват от избраната основна услуга.', + masterToggle: 'Активирай скроблването', + masterToggleDesc: 'Главен превключвател за изпращане на изпълнения към всяка свързана услуга.', + addService: 'Добави услуга', + connect: 'Свържи', + connecting: 'Свързване…', + disconnect: 'Прекъсни', + scrobbleHere: 'Скроблвай тук', + primaryLabel: 'Основна услуга', + primaryDesc: 'Харесаните песни (❤), подобните изпълнители и статистиките за слушане идват от тук — скроблването обаче отива към всички активирани услуги.', + primaryNone: 'Няма', + statusConnected: 'Свързан', + statusError: 'Необходимо е повторно свързване', + scrobbles: '{{n}} скробъла', + memberSince: 'Член от {{year}}', + connectFailed: 'Не може да се свърже — моля, опитайте отново.', + connectProbeFailed: '{{provider}} е свързан, но не може да бъде проверен: {{message}}', + fieldRequired: '{{field}} е задължително.', + malojaProxyWarning: 'Вашият Maloja сървър може да препраща скробъли към Last.fm. Изключете скроблването от едната страна, за да избегнете дубликати.', + presets: { + lastfm: { desc: 'Оригиналната услуга за скроблване с харесвания, подобни изпълнители и статистики.' }, + librefm: { desc: 'Скроблване с отворен код на Last.fm-съвместимия Libre.fm.' }, + rocksky: { desc: 'Дестинация само за скроблване на AT Protocol.' }, + listenbrainz: { desc: 'Отворена история на слушане от MetaBrainz. Дестинация за скроблване.' }, + malojaNative: { desc: 'Самостоятелно хостван сървър за скробъли (нативно API).' }, + malojaCompat: { desc: 'Самостоятелно хостван Maloja чрез Audioscrobbler (GNU FM) API.' }, + malojaListenbrainz: { desc: 'Самостоятелно хостван Maloja чрез ListenBrainz-съвместимо API.' }, + koito: { desc: 'Самостоятелно хостван тракер за слушане чрез ListenBrainz-съвместимо API.' }, + customGnufm: { desc: 'Всеки самостоятелно хостван GNU FM / Last.fm-съвместим сървър.' }, + }, + fields: { + lbToken: 'Потребителски токен', + malojaUrl: 'URL на сървъра', + malojaKey: 'API ключ', + koitoUrl: 'URL на сървъра', + koitoToken: 'API ключ', + koitoTokenHelp: 'Генерирайте API ключ в Koito от Settings → API Keys, след което го поставете тук.', + rockskySessionKey: 'Сесиен ключ', + rockskySessionKeyHelp: 'Rocksky издава този ключ само чрез CLI:\n1. npx -y @rocksky/cli@latest login your-handle\n2. cat ~/.rocksky/token.json\n3. Поставете стойността на „token“ тук.', + gnufmUrl: 'URL на сървъра', + apiKey: 'API ключ', + apiSecret: 'Споделена тайна', + }, + errors: { + AUTH_SESSION_INVALID: 'Сесията е изтекла — свържете се отново в Настройките.', + AUTH_TIMEOUT: 'Времето за оторизация изтече — моля, опитайте отново.', + PROBE_FAILED: 'Тази функция не е налична за тази услуга.', + CAPABILITY_UNSUPPORTED: 'Тази услуга не поддържа тази функция.', + NETWORK: 'Мрежова грешка — проверете връзката или URL адреса.', + MALOJA_BAD_KEY: 'Невалиден Maloja API ключ.', + CUSTOM_URL_INVALID: 'URL адресът на сървъра е недостъпен.', + }, +}; diff --git a/src/locales/bg/nowPlaying.ts b/src/locales/bg/nowPlaying.ts new file mode 100644 index 00000000..ff9d3fdf --- /dev/null +++ b/src/locales/bg/nowPlaying.ts @@ -0,0 +1,48 @@ +export const nowPlaying = { + tooltip: 'Кой слуша?', + title: 'Кой слуша?', + loading: 'Зареждане…', + nobody: 'Никой не слуша в момента.', + presence: { + playing: 'Пуска', + paused: 'На пауза', + idle: 'Неактивен', + }, + nothingPlaying: 'Все още нищо не се възпроизвежда. Пуснете песен!', + aboutArtist: 'За изпълнителя', + fromAlbum: 'От този албум', + viewAlbum: 'Виж албум', + goToArtist: 'Към изпълнителя', + readMore: 'Прочети повече', + showLess: 'Покажи по-малко', + genreInfo: 'Жанр', + trackInfo: 'Инфо за песента', + topSongs: 'Най-слушани от този изпълнител', + topSongsCredit: 'Топ песни от {{name}}', + trackPosition: 'Песен {{pos}}', + playsCount_one: '{{count}} пускане', + playsCount_other: '{{count}} пускания', + releasedYearsAgo_one: 'преди {{count}} година', + releasedYearsAgo_other: 'преди {{count}} години', + discography: 'Дискография', + thisTrack: 'Тази песен', + thisArtist: 'Този изпълнител', + listeners: 'слушатели', + scrobbles: 'скроблове', + yourScrobbles: 'от вас', + listenersN: '{{n}} слушатели', + scrobblesN: '{{n}} скроблове', + playsByYouN: 'пуснато {{n}}× от вас', + rgTrackTooltip: 'ReplayGain (песен)', + rgAlbumTooltip: 'ReplayGain (албум)', + rgAutoTooltip: 'ReplayGain (авто)', + showMoreTracks: 'Покажи още {{count}}', + showLessTracks: 'Покажи по-малко', + hideCard: 'Скрий картата', + layoutMenu: 'Оформление', + visibleCards: 'Видими карти', + hiddenCards: 'Скрити карти', + noHiddenCards: 'Няма скрити карти', + resetLayout: 'Възстанови оформлението', + emptyColumn: 'Пуснете картите тук', +}; diff --git a/src/locales/bg/nowPlayingInfo.ts b/src/locales/bg/nowPlayingInfo.ts new file mode 100644 index 00000000..f5348ae2 --- /dev/null +++ b/src/locales/bg/nowPlayingInfo.ts @@ -0,0 +1,24 @@ +export const nowPlayingInfo = { + tab: 'Инфо', + empty: 'Пуснете нещо, за да видите информация', + artist: 'Изпълнител', + songInfo: 'Инфо за песента', + onTour: 'На турне', + noTourEvents: 'Няма предстоящи концерти', + tourLoading: 'Зареждане…', + poweredByBandsintown: 'Данни за турнета от Bandsintown', + bioReadMore: 'Прочети повече', + bioReadLess: 'Покажи по-малко', + showMoreTours_one: 'Покажи още {{count}}', + showMoreTours_other: 'Покажи още {{count}}', + showLessTours: 'Покажи по-малко', + enableBandsintownPrompt: 'Да видите предстоящи дати от турнета?', + enableBandsintownPromptDesc: 'По избор. Зарежда концерти за текущия изпълнител чрез публичното Bandsintown API.', + enableBandsintownPrivacy: 'Когато е активирано, името на текущо пуснатия изпълнител се изпраща към Bandsintown API за извличане на дати от турнета. Никакви акаунти или лични данни не напускат вашето устройство.', + enableBandsintownAction: 'Активирай', + role: { + artist: 'Изпълнител', + albumArtist: 'Изпълнител на албум', + composer: 'Композитор', + }, +}; diff --git a/src/locales/bg/orbit.ts b/src/locales/bg/orbit.ts new file mode 100644 index 00000000..4035fb2c --- /dev/null +++ b/src/locales/bg/orbit.ts @@ -0,0 +1,201 @@ +export const orbit = { + triggerLabel: 'Orbit', + triggerTooltip: 'Стартирайте или се присъединете към споделена сесия за слушане', + launchCreate: 'Създай сесия', + launchJoin: 'Присъедини се към сесия', + launchHelp: 'Как работи това?', + launchHelpSoon: 'Очаквайте скоро', + joinModalTitle: 'Присъединяване към Orbit сесия', + joinModalSub: 'Поставете поканата, която домакинът ви е изпратил.', + joinModalLinkLabel: 'Линк за покана', + joinModalLinkPlaceholder: 'psysonic2-…', + joinModalLinkHelper: 'Работи с всеки валиден Orbit линк. Трябва да сочи към сървъра, в който сте влезли в момента.', + joinModalPasteTooltip: 'Постави от клипборда', + joinModalSubmit: 'Присъедини се', + joinModalBusy: 'Присъединяване…', + joinErrEmpty: 'Моля, поставете линк за покана.', + joinErrInvalid: 'Това не изглежда като линк за покана в Orbit.', + closeAria: 'Затвори', + heroTitlePrefix: 'Слушайте заедно с', + heroTitleBrand: 'Orbit', + heroSub: 'Започнете сесия — другите потребители на {{server}} ще слушат заедно и могат да предлагат песни.', + fallbackServer: 'този сървър', + tipLan: 'В момента сте свързани чрез адрес в домашната мрежа. Гости извън мрежата ви не могат да се присъединят — превключете към публичен адрес на сървъра в настройките преди да започнете.', + tipRemote: 'За да могат гости извън домашната ви мрежа да се присъединят, адресът на сървъра ви трябва да е публично достъпен. Ако сървърът ви е само вътрешен, превключете преди да започнете.', + labelName: 'Име на сесията', + namePlaceholder: 'Кадифена Orbit', + reshuffleTooltip: 'Ново предложение', + reshuffleAria: 'Предложи ново име', + helperName: 'Как сесията се показва пред гостите ви — запазете го или напишете свое.', + labelMax: 'Максимум гости', + helperMax: 'Вие не се броите — това ограничава само входящите гости.', + labelLink: 'Линк за покана', + tooltipCopied: 'Копирано', + tooltipCopy: 'Копирай', + ariaCopyLink: 'Копирай линк за покана', + helperLink: 'Изпратете този линк на гостите си. Могат да го поставят навсякъде в Psysonic с Ctrl+V.', + labelClearQueue: 'Първо изчисти опашката ми', + helperClearQueue: 'Започнете сесията с прясна, празна опашка. Изкл.: песните, които вече са в опашката ви, остават и се споделят с гостите.', + btnCancel: 'Отказ', + btnStarting: 'Стартиране…', + btnStart: 'Стартирай Orbit', + btnCopyAndStart: 'Копирай линка и стартирай', + errNameRequired: 'Моля, дайте име на сесията си.', + errStartFailed: 'Стартирането не успя.', + hostLabel: 'Домакин: {{name}}', + participantsTooltip: 'Участници', + settingsTooltip: 'Настройки на сесията', + shareTooltip: 'Сподели линк за покана', + shuffleLabel: 'Опашката се разбърква след', + catchUpLabel: 'настигни', + catchUpTooltip: 'Прескочи до текущата позиция на домакина', + hostAway: 'Домакинът е офлайн', + hostOnline: 'Домакинът е онлайн', + endTooltip: 'Приключи сесията', + leaveTooltip: 'Напусни сесията', + helpTooltip: 'Как работи Orbit', + diag: { + openTooltip: 'Диагностика — копируем дневник на събитията', + title: 'Диагностика на Orbit', + role: 'Роля', + hostTrack: 'ID на песента на домакина', + hostPos: 'Позиция на домакина', + guestTrack: 'ID на моята песен', + guestPos: 'Моята позиция', + drift: 'Отклонение', + stateAge: 'Възраст на състоянието', + eventLog: 'Дневник на събитията ({{count}})', + copyLabel: 'Копирай', + copyTooltip: 'Копирай дневника в клипборда', + clearLabel: 'Изчисти', + clearTooltip: 'Изтрий буфера', + empty: 'Все още няма събития — събитията се появяват докато Orbit синхронизира.', + hint: 'Отворете това преди да възпроизведете проблем, след което кликнете Копирай и поставете в доклада за грешка.', + copied: 'Копирани {{count}} реда със събития', + copyFailed: 'Копирането в клипборда не успя', + cleared: 'Буферът е изчистен', + }, + helpTitle: 'Как работи Orbit', + helpIntro: 'Orbit превръща Psysonic в споделена стая за слушане. Домакинът избира музиката; гостите слушат синхронно и могат да предлагат песни.', + helpHostOnly: '(домакин)', + helpSec1Title: 'Какво е Orbit?', + helpSec1Body: 'Режим „слушайте заедно“ — домакинът управлява възпроизвеждането, гостите се включват. Всичко върви през плейлисти на собствения ви Navidrome сървър; без външна инфраструктура.', + helpSec2Title: 'Домакин и гости', + helpSec2Body: 'Домакинът контролира възпроизвеждането (пусни / пауза / прескочи / прематай) и решава кога сесията да приключи. Гостите следват възпроизвеждането на домакина, могат да предлагат песни и да напускат или да се присъединяват отново по всяко време. Само домакинът може да изгони или трайно да блокира участник.', + helpSec2WarnHead: 'Важно: отделни акаунти.', + helpSec2WarnBody: 'Всеки участник има нужда от собствен Navidrome акаунт. Ако домакинът и гостът влязат с един и същ потребител, предложенията им се сблъскват и домакинът никога не вижда предложенията на госта.', + helpSec3Title: 'Стартиране и покана', + helpSec3Body: 'Кликнете бутона „Orbit“ → Създай сесия → началният диалог показва готов за копиране линк за покана и ви позволява по избор да изчистите текущата си опашка. Споделете този линк както искате. Докато сесията върви, бутонът за споделяне в лентата на сесията отгоре копира линка отново по всяко време.', + helpSec4Title: 'Присъединяване', + helpSec4Body: 'Поставете линка за покана навсякъде в Psysonic с Ctrl+V / Cmd+V — подканата за присъединяване се появява автоматично. Алтернативно: „Orbit“ → Присъедини се към сесия → поставете в полето. Ако линкът сочи към сървър, на който имате акаунт, Psysonic превключва вместо вас. Когато имате повече от един акаунт на този сървър, малък избирач ви пита кой да използвате.', + helpSec5Title: 'Предлагане на песни', + helpSec5Body: 'Във всеки списък с песни: двоен клик върху ред, или десен клик → „Добави в Orbit сесията“. Единичен клик показва подсказка вместо да изсипва целия албум в споделената опашка — това е нарочно. Изричните групови действия като „Пусни всички“ или „Пусни албума“ първо искат потвърждение и след това добавят (никога не заместват).', + helpSec6Title: 'Споделената опашка', + helpSec6Body: 'Опашката показва предстоящите песни на домакина — видима за всички. Входящите групови добавяния винаги се добавят в края, така че предложенията на гостите не се губят. Автоматичното разбъркване периодично пренарежда опашката (конфигурируемо: 1 / 5 / 10 / 15 / 30 мин). Ако възпроизвеждането ви се отклони от домакина, бутонът „Настигни“ в лентата на сесията ви връща до текущата позиция на домакина.', + helpSec7Title: 'Одобрения', + helpSec7Body: 'По подразбиране предложенията на гостите изискват ръчно одобрение — появяват се в лента „Одобрения“ в горната част на панела на опашката с бутони за приемане / отхвърляне. Автоматичното одобрение може да бъде включено в настройките на сесията, така че всичко да се приема веднага.', + helpSec8Title: 'Участници и настройки', + helpSec8Body: 'Отворете иконата за настройки в лентата на сесията за честота на разбъркването, автоматично одобрение и бърз бутон „Разбъркай сега“. Кликнете броя участници, за да видите кой е свързан — изгонване (може да се присъедини отново чрез линка) или блокиране (заключен за сесията). Гостите също виждат списъка с участници, но само за четене.', + helpSec9Title: 'Приключване на сесията', + helpSec9Body: 'Домакин X → диалог за потвърждение → сесията се затваря за всички и плейлистите на сървъра се почистват автоматично. Гост X → гостът напуска, сесията продължава. Ако домакинът замълчи за 5 минути, гостът автоматично напуска с известие; кратките повторни свързвания в този прозорец са невидими.', + participantsInviteLabel: 'Линк за покана', + participantsCountLabel: '{{count}} в сесията', + participantsHost: 'домакин', + participantsEmpty: 'Все още няма гости', + participantsKickTooltip: 'Премахни от сесията', + participantsKickAria: 'Премахни {{user}}', + participantsRemoveTooltip: 'Премахни от сесията', + participantsRemoveAria: 'Премахни {{user}} от тази сесия', + participantsBanTooltip: 'Блокирай завинаги', + participantsBanAria: 'Блокирай {{user}} завинаги', + participantsMuteTooltip: 'Заглуши предложенията', + participantsUnmuteTooltip: 'Разреши предложенията', + participantsMuteAria: 'Заглуши предложенията от {{user}}', + participantsUnmuteAria: 'Разреши предложенията от {{user}}', + confirmRemoveTitle: 'Премахване от сесията?', + confirmRemoveBody: '{{user}} ще бъде премахнат от сесията, но може да се присъедини отново чрез линка за покана.', + confirmRemoveConfirm: 'Премахни', + confirmBanTitle: 'Постоянно блокиране?', + confirmBanBody: '{{user}} ще бъде премахнат и блокиран за повторно присъединяване към тази сесия. Това не може да бъде отменено за времетраенето на сесията.', + confirmBanConfirm: 'Блокирай', + confirmCancel: 'Отказ', + confirmJoinTitle: 'Присъединяване към Orbit сесия?', + confirmJoinBody: '{{host}} ви покани в „{{name}}“. Присъединяване към сесията?', + confirmJoinConfirm: 'Присъедини се', + confirmLeaveTitle: 'Напускане на сесията?', + confirmLeaveBody: 'Да напуснете „{{name}}“? Можете да се присъедините отново чрез линка за покана на {{host}} по всяко време.', + confirmLeaveConfirm: 'Напусни', + confirmEndTitle: 'Приключване на сесията за всички?', + confirmEndBody: '„{{name}}“ ще се затвори за всички участници. Плейлистите на сесията се почистват автоматично.', + confirmEndConfirm: 'Приключи сесията', + invalidLinkTitle: 'Линкът за покана вече не е валиден', + invalidLinkBody: 'Тази Orbit сесия вече не съществува или вече е приключила. Помолете домакина за нов линк за покана.', + settingsTitle: 'Настройки на сесията', + settingAutoApprove: 'Автоматично одобряване на предложения', + settingAutoApproveHint: 'Предложенията на гостите постъпват в опашката ви незабавно. Изкл.: остават в списъка на сесията за преглед по-късно.', + settingAutoShuffle: 'Автоматично разбъркване', + settingAutoShuffleHint: 'Периодично разбърква предстоящата опашка. Изкл.: редът се променя само когато го подредите ръчно.', + settingShuffleInterval: 'Разбърквай на всеки', + settingShuffleIntervalHint: 'Колко често се разбърква предстоящата опашка, докато сесията върви.', + suggestBlockedMuted: 'Домакинът ви заглуши за тази сесия — предложенията са изключени.', + settingShuffleIntervalValue_one: '{{count}} мин', + settingShuffleIntervalValue_other: '{{count}} мин', + settingShuffleNow: 'Разбъркай сега', + toastSuggested: '{{user}} предложи „{{title}}“', + toastSuggestedMany: '{{count}} нови предложения в опашката', + toastSuggestLost: 'Вашето предложение може да не е достигнало до домакина', + toastShuffled: 'Опашката е разбъркана', + toastJoined: 'Присъединихте се към сесията', + toastLoginFirst: 'Влезте преди да се присъедините към сесия', + toastSwitchServer: 'Първо превключете към {{url}}, след което поставете отново', + toastNoAccountForServer: 'Нямате достъп до {{url}}. Помолете домакина за покана.', + toastSwitchFailed: 'Превключването към {{url}} не успя', + accountPickerTitle: 'Кой акаунт?', + accountPickerSub: 'Имате повече от един акаунт за {{url}}. Изберете с кой да се присъедините към сесията.', + toastJoinFail: 'Присъединяването към сесията не успя', + joinErrNotFound: 'Сесията не е намерена', + joinErrEnded: 'Сесията е приключила', + joinErrFull: 'Сесията е пълна', + joinErrKicked: 'Не можете да се присъедините отново към тази сесия', + joinErrNoUser: 'Няма активен сървър', + joinErrServerError: 'Присъединяването не успя', + ctxAddToSession: 'Добави в Orbit сесията', + ctxSuggestedToast: 'Предложено в сесията', + ctxSuggestFailed: 'Предлагането не успя — не сте се присъединили', + ctxAddToSessionHost: 'Добави в Orbit сесията', + ctxAddedHostToast: 'Добавено в сесията', + ctxAddHostFailed: 'Добавянето в сесията не успя', + bulkConfirmTitle: 'Да добавим всичко това в Orbit опашката?', + bulkConfirmBody: 'Това ще пусне {{count}} песни в споделената опашка наведнъж. Това е много за гостите ви да забележат. Да продължим ли?', + bulkConfirmYes: 'Добави всички', + bulkConfirmNo: 'Отказ', + guestLive: 'На живо', + guestPlaying: 'Пуска в момента', + guestPaused: 'На пауза', + guestLoading: 'Зареждане…', + guestSuggestions: 'Предложения', + guestUpNext: 'Следва', + guestUpNextEmpty: 'Нищо в опашката. Отворете контекстното меню на песен и изберете „Добави в Orbit сесията“, за да предложите.', + guestPendingTitle: 'Изчакване на домакина', + guestPendingHint: 'Предложено — ще се появи в опашката, когато домакинът го приеме.', + approvalTitle: 'Чакащи одобрения', + approvalFrom: 'Предложено от {{user}}', + approvalAccept: 'Приеми', + approvalDecline: 'Отхвърли', + guestUpNextMore: '+ още {{count}} в опашката на домакина', + guestSubmitter: 'от {{user}}', + queueAddedByHost: 'Добавено от домакина', + queueAddedByYou: 'Добавено от вас', + queueAddedByUser: 'Добавено от {{user}}', + guestEmpty: 'Все още няма предложения. Отворете контекстното меню на песен и изберете „Добави в Orbit сесията“.', + guestFooter: 'Домакинът контролира възпроизвеждането — не можете да променяте списъка.', + exitKickedTitle: 'Бяхте блокирани от сесията', + exitRemovedTitle: 'Бяхте премахнати от сесията', + exitEndedTitle: 'Домакинът приключи сесията', + exitHostTimeoutTitle: 'Домакинът замълча', + exitHostTimeoutBody: '{{host}} не е изпращал актуализация от известно време, така че „{{name}}“ беше затворена от ваша страна. Можете да се присъедините отново по всяко време с линка за покана.', + exitKickedBody: '{{host}} ви блокира от „{{name}}“. Не можете да се присъедините отново.', + exitRemovedBody: '{{host}} ви премахна от „{{name}}“. Можете да се присъедините отново по всяко време чрез линка за покана.', + exitEndedBody: '„{{name}}“ приключи. Надяваме се да сте се забавлявали.', + exitOk: 'ОК', +}; diff --git a/src/locales/bg/player.ts b/src/locales/bg/player.ts new file mode 100644 index 00000000..ff3df2a9 --- /dev/null +++ b/src/locales/bg/player.ts @@ -0,0 +1,69 @@ +export const player = { + regionLabel: 'Музикален плейър', + openFullscreen: 'Отвори плейъра на цял екран', + fullscreen: 'Плейър на цял екран', + closeFullscreen: 'Затвори целия екран', + closeTooltip: 'Затвори (Esc)', + noTitle: 'Без заглавие', + stop: 'Спри', + prev: 'Предишна песен', + play: 'Пусни', + pause: 'Пауза', + autoDjMixing: 'AutoDJ — миксиране', + autoDjPreparing: 'AutoDJ — подготвя следващата песен', + bufferingStream: 'Зареждане на песен от сървъра', + previewActive: 'Възпроизвежда се преглед', + previewLabel: 'Преглед', + delayModalTitle: 'Таймер', + delayPauseSection: 'Пауза след', + delayStartSection: 'Стартирай след', + delayPreviewPause: 'Пауза в', + delayPreviewStart: 'Стартира в', + delaySchedulePause: 'Планирай пауза', + delayScheduleStart: 'Планирай стартиране', + delayCancelPause: 'Отмени таймера за пауза', + delayCancelStart: 'Отмени таймера за стартиране', + delayInactivePause: 'Достъпно само докато нещо се възпроизвежда.', + delayInactiveStart: 'Достъпно, когато има заредена песен или радио на пауза.', + delayCustomMinutes: 'Персонализирано забавяне (минути)', + delayCustomPlaceholder: 'напр. 2.5', + closeDelayModal: 'Затвори', + delayIn: 'след', + delayFmtSec: '{{n}}с', + delayFmtMin: '{{n}} мин', + delayFmtHr: '{{n}} ч', + delayCancel: 'Отказ', + delayApply: 'Приложи', + next: 'Следваща песен', + repeat: 'Повторение', + repeatOff: 'Изключено', + repeatAll: 'Всички', + repeatOne: 'Една', + progress: 'Прогрес на песента', + volume: 'Сила на звука', + mute: 'Заглуши', + unmute: 'Отзаглуши', + toggleQueue: 'Превключи опашката', + collapseQueueResize: 'Свий опашката, преоразмери', + moreOptions: 'Още опции', + equalizer: 'Еквалайзер', + playbackRate: 'Скорост на възпроизвеждане', + miniPlayer: 'Мини плейър', + lyrics: 'Текст', + fsNowPlaying: 'Сега свири…', + fsTrackPosition: 'Песен {{current}} / {{total}}', + fsNext: 'Следваща', + fsUpNext: 'Следва', + fsQueueEmpty: 'Нищо не е в опашката.', + shuffle: 'Разбъркай', + fsLyricsToggle: 'Текст на песента на цял екран', + lyricsLoading: 'Зареждане на текст…', + lyricsNotFound: 'Не е намерен текст за тази песен', + lyricsNoSources: 'Не са избрани източници за текст — активирайте някои в Настройки → Текстове', + lyricsSourceServer: 'Източник: сървър', + lyricsSourceLrclib: 'Източник: LRCLIB', + lyricsSourceNetease: 'Източник: Netease', + lyricsSourceLyricsplus: 'Източник: YouLyPlus', + showDuration: 'Покажи времетраенето', + showRemainingTime: 'Покажи оставащото време', +}; diff --git a/src/locales/bg/playlists.ts b/src/locales/bg/playlists.ts new file mode 100644 index 00000000..06e2c284 --- /dev/null +++ b/src/locales/bg/playlists.ts @@ -0,0 +1,125 @@ +export const playlists = { + sortTooltip: 'Сортиране на песни', + sortDateAddedNewest: 'Дата на добавяне (най-нови)', + sortDateAddedOldest: 'Дата на добавяне (най-стари)', + title: 'Плейлисти', + newPlaylist: 'Нов плейлист', + unnamed: 'Плейлист без име', + createName: 'Име на плейлист…', + create: 'Създай', + cancel: 'Отказ', + empty: 'Все още няма плейлисти.', + emptyPlaylist: 'Този плейлист е празен.', + addFirstSong: 'Добавете първата си песен', + notFound: 'Плейлистът не е намерен.', + songs_one: '{{count}} песен', + songs_other: '{{count}} песни', + playAll: 'Пусни всички', + playTooltip: 'Пусни плейлист', + shuffle: 'Разбъркай', + addToQueue: 'Добави в опашката', + back: 'Обратно към плейлистите', + deletePlaylist: 'Изтрий', + confirmDelete: 'Кликнете отново за потвърждение', + removeSong: 'Премахни от плейлиста', + addSongs: 'Добави песни', + addSongsTooltip: 'Търсете в библиотеката си, за да добавите песни', + searchPlaceholder: 'Търсете в библиотеката си…', + noResults: 'Няма резултати.', + suggestions: 'Предложени песни', + noSuggestions: 'Няма налични предложения.', + titleBadge: 'Плейлист', + refreshSuggestions: 'Нови предложения', + addSong: 'Добави в плейлиста', + preview: 'Преглед (30 сек)', + previewStop: 'Спри прегледа', + playNextSuggestion: 'Пусни следваща', + suggestionsHint: 'Двоен клик върху ред, за да го добавите в плейлиста', + addSelected: 'Добави избраните', + cacheOffline: 'Кеширай плейлиста офлайн', + offlineCached: 'Плейлистът е кеширан', + removeOffline: 'Премахни от офлайн кеша', + offlineDownloading: 'Кеширане… ({{done}}/{{total}} албума)', + publicLabel: 'Публичен', + privateLabel: 'Личен', + editMeta: 'Редактирай плейлист', + editNamePlaceholder: 'Име на плейлист…', + editCommentPlaceholder: 'Добавете описание…', + editPublic: 'Публичен плейлист', + editSave: 'Запази', + editCancel: 'Отказ', + changeCover: 'Смени изображението на корицата', + changeCoverLabel: 'Смени снимка', + removeCover: 'Премахни снимка', + coverUpdated: 'Корицата е обновена', + metaSaved: 'Плейлистът е обновен', + downloadZip: 'Изтегли (ZIP)', + // Toast notifications for multi-select + addSuccess: '{{count}} песни добавени в {{playlist}}', + addPartial: '{{added}} добавени, {{skipped}} пропуснати (дубликати)', + addAllSkipped: 'Всички пропуснати ({{count}} дубликата)', + addedAsDuplicates: '{{count}} песни добавени в {{playlist}} (като дубликати)', + duplicateConfirmTitle: 'Вече в плейлиста', + duplicateConfirmMessage: 'Всички {{count}} песни вече са в „{{playlist}}“. Да ги добавим ли отново като дубликати?', + duplicateConfirmAction: 'Добави въпреки това', + addError: 'Грешка при добавяне на песни', + createAndAddSuccess: 'Плейлистът „{{playlist}}“ е създаден с {{count}} песни', + createError: 'Грешка при създаване на плейлист', + deleteSuccess: '{{count}} плейлиста изтрити', + deleteFailed: 'Грешка при изтриване на {{name}}', + deleteSelected: 'Изтрий избраните', + deleteSelectedPartial: 'Само {{n}} от {{total}} избрани плейлиста могат да бъдат изтрити (другите са на някой друг).', + mergeSuccess: '{{count}} песни обединени в {{playlist}}', + mergeNoNewSongs: 'Няма нови песни за добавяне', + mergeError: 'Грешка при обединяване на плейлисти', + mergeInto: 'Обедини в', + selectionCount: '{{count}} избрани', + select: 'Избери', + startSelect: 'Активирай избор', + cancelSelect: 'Отказ', + loadingAlbums: 'Разрешаване на {{count}} албума…', + loadingArtists: 'Разрешаване на {{count}} изпълнителя…', + myPlaylists: 'Моите плейлисти', + noOtherPlaylists: 'Няма налични други плейлисти', + addToPlaylistSuccess: '{{count}} песни добавени в {{playlist}}', + addToPlaylistNoNew: 'Няма нови песни за добавяне в {{playlist}}', + addToPlaylistError: 'Грешка при добавяне в плейлиста', + removeSuccess: 'Песента е премахната от плейлиста', + removeError: 'Грешка при премахване на песен от плейлиста', + importCSV: 'Импортирай CSV', + importCSVTooltip: 'Импортирай от Spotify CSV', + csvImportReport: 'Доклад за импорт от CSV', + csvImportTotal: 'Общо', + csvImportAdded: 'Добавени', + csvImportDuplicates: 'Дубликати', + csvImportNotFound: 'Ненамерени', + csvImportNetworkErrors: 'Мрежови грешки', + csvImportDuplicatesTitle: 'Дублирани песни (вече в плейлиста):', + csvImportNotFoundTitle: 'Ненамерени песни:', + csvImportNetworkErrorsTitle: 'Мрежови грешки (може да опитате импорта отново):', + csvImportDownloadReport: 'Изтегли доклад', + csvImportClose: 'Затвори', + csvImportNoValidTracks: 'Не са намерени валидни песни в CSV файла', + csvImportFailed: 'Импортирането на CSV файл не успя', + csvImportToast: '{{added}} добавени, {{notFound}} ненамерени, {{duplicates}} дубликати', + csvImportDownloadSuccess: 'Докладът е изтеглен успешно', + csvImportDownloadError: 'Изтеглянето на доклада не успя', + // Playlist folders (local, per-server organisation layer) + folders: { + newFolder: 'Нова папка', + namePlaceholder: 'Име на папка…', + create: 'Създай', + rename: 'Преименувай', + delete: 'Изтрий папка', + ungrouped: 'Негрупирани', + moveToFolder: 'Премести в папка', + removeFromFolder: 'Премахни от папка', + expandFolder: 'Разгъни папка', + collapseFolder: 'Свий папка', + groupByFolders: 'Групирай по папки', + count_one: '{{count}} плейлист', + count_other: '{{count}} плейлиста', + localOnlyNotice: + 'Папките се запазват само в Psysonic на това устройство. Navidrome и Subsonic API нямат вградена поддръжка на папки за плейлисти, така че структурата не се съхранява на вашия сървър и не се синхронизира с другите ви устройства и приложения.', + }, +}; diff --git a/src/locales/bg/queue.ts b/src/locales/bg/queue.ts new file mode 100644 index 00000000..a8567f77 --- /dev/null +++ b/src/locales/bg/queue.ts @@ -0,0 +1,64 @@ +export const queue = { + title: 'Опашка', + modePlaylist: 'Плейлист', + modeTimeline: 'Времева линия', + upNext: 'Следва', + history: 'История', + noUpcoming: 'Няма предстоящи песни.', + savePlaylist: 'Запази плейлиста', + updatePlaylist: 'Обнови плейлиста', + filterPlaylists: 'Филтрирай плейлисти…', + playlistName: 'Име на плейлиста', + cancel: 'Отказ', + save: 'Запази', + loadPlaylist: 'Зареди плейлист', + loading: 'Зареждане…', + noPlaylists: 'Няма намерени плейлисти.', + load: 'Замени опашката и пусни', + appendToQueue: 'Добави към опашката', + delete: 'Изтрий', + deleteConfirm: 'Да се изтрие ли плейлистът „{{name}}“?', + clear: 'Изчисти опашката', + shuffle: 'Разбъркай опашката', + gapless: 'Без паузи', + crossfade: 'Преливане на песни', + autoDj: 'AutoDJ', + infiniteQueue: 'Безкрайна опашка', + playlist: 'Плейлист', + autoAdded: '— Добавено автоматично —', + radioAdded: '— Радио —', + hide: 'Скрий', + hideNowPlaying: 'Скрий информацията за текущата песен', + showNowPlaying: 'Покажи информацията за текущата песен', + close: 'Затвори', + nextTracks: 'Следващи песни', + shareQueue: 'Копирай връзка за споделяне на опашката', + shareQueueEmpty: 'Опашката е празна — няма какво да се сподели.', + emptyQueue: 'Опашката е празна.', + crossServerEnqueueBlocked: 'Песни от друг сървър не могат да се добавят към текущата опашка. Първо завършете или изчистете опашката.', + trackSingular: 'песен', + trackPlural: 'песни', + showRemaining: 'Покажи оставащото време', + showTotal: 'Покажи общото време', + showEta: 'Покажи очаквано време на край', + replayGain: 'ReplayGain', + rgTrack: 'T {{db}} dB', + rgAlbum: 'A {{db}} dB', + rgPeak: 'Пик {{pk}}', + sourceOffline: 'Възпроизвеждане от офлайн библиотека', + sourceHot: 'Възпроизвеждане от кеша', + sourceStream: 'Възпроизвеждане от мрежов поток', + clearCachedLoudnessWaveform: 'Изчисти кешираната сила на звука и вълновата форма, след което анализирай отново тази песен', + recalculatingLoudnessWaveform: 'Преизчисляване на силата на звука и вълновата форма за тази песен…', + bpm: '{{bpm}} BPM', + moods: { + happy: 'Щастливо', + excited: 'Развълнувано', + calm: 'Спокойно', + peaceful: 'Мирно', + angry: 'Гневно', + tense: 'Напрегнато', + sad: 'Тъжно', + melancholic: 'Меланхолично', + }, +}; diff --git a/src/locales/bg/radio.ts b/src/locales/bg/radio.ts new file mode 100644 index 00000000..b017f4d2 --- /dev/null +++ b/src/locales/bg/radio.ts @@ -0,0 +1,37 @@ +export const radio = { + title: 'Интернет радио', + empty: 'Няма конфигурирани радиостанции.', + addStation: 'Добави станция', + editStation: 'Редактирай', + playStation: 'Пусни станция', + stopStation: 'Спри станция', + deleteStation: 'Изтрий станция', + confirmDelete: 'Кликнете отново за потвърждение', + stationName: 'Име на станцията…', + streamUrl: 'URL на потока…', + homepageUrl: 'URL на началната страница (по избор)', + save: 'Запази', + cancel: 'Отказ', + live: 'НА ЖИВО', + liveStream: 'Интернет радио', + openHomepage: 'Отвори начална страница', + changeCoverLabel: 'Смени корицата', + removeCover: 'Премахни корицата', + browseDirectory: 'Разгледай директория', + directoryPlaceholder: 'Търси станции…', + noResults: 'Не са намерени станции.', + stationAdded: 'Станцията е добавена', + filterAll: 'Всички', + filterFavorites: 'Любими', + sortManual: 'Ръчно', + sortAZ: 'А → Я', + sortZA: 'Я → А', + sortNewest: 'Най-нови', + favorite: 'Добави към любими', + unfavorite: 'Премахни от любими', + noFavorites: 'Няма любими станции.', + listenerCount_one: '{{count}} слушател', + listenerCount_other: '{{count}} слушатели', + recentlyPlayed: 'Наскоро пуснати', + upNext: 'Следва', +}; diff --git a/src/locales/bg/randomAlbums.ts b/src/locales/bg/randomAlbums.ts new file mode 100644 index 00000000..91e75b7d --- /dev/null +++ b/src/locales/bg/randomAlbums.ts @@ -0,0 +1,4 @@ +export const randomAlbums = { + title: 'Случайни албуми', + refresh: 'Обнови', +}; diff --git a/src/locales/bg/randomLanding.ts b/src/locales/bg/randomLanding.ts new file mode 100644 index 00000000..3adba476 --- /dev/null +++ b/src/locales/bg/randomLanding.ts @@ -0,0 +1,9 @@ +export const randomLanding = { + title: 'Създай микс', + mixByTracks: 'Микс по песни', + mixByTracksDesc: 'Случаен избор на песни от цялата ви библиотека', + mixByAlbums: 'Микс по албуми', + mixByAlbumsDesc: 'Случайни албуми за следващото ви откритие', + mixByLucky: 'Lucky Mix', + mixByLuckyDesc: 'Умен мигновен микс от вашите топ изпълнители, албуми и оценки', +}; diff --git a/src/locales/bg/randomMix.ts b/src/locales/bg/randomMix.ts new file mode 100644 index 00000000..6f8f472c --- /dev/null +++ b/src/locales/bg/randomMix.ts @@ -0,0 +1,40 @@ +export const randomMix = { + title: 'Случаен микс', + remix: 'Ремикс', + remixTooltip: 'Зареди нови случайни песни', + remixGenre: 'Ремикс {{genre}}', + remixTooltipGenre: 'Зареди нови {{genre}} песни', + playAll: 'Пусни всички', + trackTitle: 'Заглавие', + trackArtist: 'Изпълнител', + trackAlbum: 'Албум', + trackFavorite: 'Любима', + trackDuration: 'Продължителност', + favoriteAdd: 'Добави към любими', + favoriteRemove: 'Премахни от любими', + play: 'Пусни', + trackGenre: 'Жанр', + mixSettingsHeader: 'Настройки на микса', + exclusionsHeader: 'Изключения', + filterPanelInexactSizeNote: 'Размерът на микса е целеви — при големи заявки може да върне по-малко уникални песни, ако случайният басейн на сървъра е недостатъчен.', + mixSize: 'Размер на плейлиста', + excludeAudiobooks: 'Изключи аудиокниги и радиопиеси', + excludeAudiobooksDesc: 'Съпоставя ключови думи с жанр, заглавие, албум и изпълнител — напр. Hörbuch, Audiobook, Spoken Word, …', + genreBlocked: 'Ключовата дума е блокирана', + genreAddedToBlacklist: 'Добавен в списъка с филтри', + genreAlreadyBlocked: 'Вече е блокиран', + artistBlocked: 'Изпълнителят е блокиран', + artistAddedToBlacklist: 'Изпълнителят е добавен в списъка с филтри', + artistClickHint: 'Кликнете, за да блокирате този изпълнител', + blacklistToggle: 'Филтър по ключови думи', + genreMixTitle: 'Микс по жанр', + genreMixDesc: 'Топ 20 жанра по брой песни — кликнете, за да заредите случаен микс', + genreMixAll: 'Всички песни', + genreMixLoadMore: 'Зареди още 10', + genreMixNoGenres: 'Не са намерени жанрове на сървъра.', + noSongsMatchFilters: 'Няма песни, отговарящи на текущите филтри. Опитайте да премахнете блокираните ключови думи или да промените настройките на микса.', + shuffleGenres: 'Покажи различни жанрове', + filterPanelTitle: 'Филтри', + filterPanelDesc: 'Кликнете върху етикет на жанр или име на изпълнител в списъка с песни по-долу, за да го блокирате от бъдещи миксове.', + genreClickHint: 'Кликнете върху етикет на жанр, за да го добавите\nкато ключова дума за филтър.\nСъпоставя жанр, заглавие, албум и изпълнител.', +}; diff --git a/src/locales/bg/search.ts b/src/locales/bg/search.ts new file mode 100644 index 00000000..eddda038 --- /dev/null +++ b/src/locales/bg/search.ts @@ -0,0 +1,87 @@ +export const search = { + placeholder: 'Търси изпълнител, албум или песен…', + noResults: 'Няма резултати за „{{query}}“', + artists: 'Изпълнители', + albums: 'Албуми', + songs: 'Песни', + clearLabel: 'Изчисти търсенето', + addedToQueueToast: 'Добавена „{{title}}“ в опашката', + title: 'Търсене', + resultsFor: 'Резултати за „{{query}}“', + album: 'Албум', + advanced: 'Разширено търсене', + localIndexBadge: 'Локален индекс', + localIndexBadgeTooltip: 'Резултати от локалния индекс на библиотеката на това устройство', + networkSearchBadge: 'Търсене в сървъра', + networkSearchBadgeTooltip: 'Резултати от търсене на живо в свързания сървър', + liveSearchFailed: 'Търсенето се провали — опитайте отново', + advancedSearchTerm: 'Дума за търсене', + advancedSearchPlaceholder: 'Заглавие, албум, изпълнител…', + advancedGenre: 'Жанр', + advancedAllGenres: 'Всички жанрове', + advancedYear: 'Година', + advancedYearFrom: 'от', + advancedYearTo: 'до', + advancedBpm: 'BPM', + advancedBpmClear: 'Изчисти BPM филтъра', + advancedLossless: 'Формат', + advancedLosslessOnly: 'Само lossless', + bpmSourceTag: 'BPM от таг на файла', + bpmSourceAnalysis: 'BPM от аудио анализ', + advancedMoodGroup: 'Настроение', + advancedAllMoods: 'Всички настроения', + advancedMoodLocalNote: 'Изисква локален индекс на библиотеката и анализ на песните', + scopeRowLabel: 'Търси в:', + scopeAllTooltip: 'Търси навсякъде', + scopeArtistsChipTooltip: 'Ограничи резултатите до изпълнители', + scopeAlbumsChipTooltip: 'Ограничи резултатите до албуми', + scopeSongsChipTooltip: 'Ограничи резултатите до песни', + advancedAll: 'Всички', + advancedSearch: 'Търси', + advancedEmpty: 'Въведете дума за търсене или изберете филтър, за да започнете.', + advancedNoResults: 'Няма намерени резултати.', + advancedGenreNote: 'Песните са избрани на случаен принцип от този жанр.', + recentSearches: 'Скорошни търсения', + browse: 'Разгледай', + emptyHint: 'Какво искате да чуете?', + scopeArtistsPlaceholder: 'Търси изпълнител…', + scopeArtistsBadgeTooltip: 'Кликнете, за да премахнете', + scopeArtistsGhostTooltip: 'Кликнете, за да търсите само на тази страница', + scopeAlbumsPlaceholder: 'Търси албум…', + scopeAlbumsBadgeTooltip: 'Кликнете, за да премахнете', + scopeAlbumsGhostTooltip: 'Кликнете, за да търсите само на тази страница', + scopeNewReleasesPlaceholder: 'Търси нови издания…', + scopeNewReleasesBadgeTooltip: 'Кликнете, за да премахнете', + scopeNewReleasesGhostTooltip: 'Кликнете, за да търсите само на тази страница', + scopeTracksPlaceholder: 'Намери песен по заглавие, изпълнител или албум…', + scopeTracksBadgeTooltip: 'Кликнете, за да премахнете', + scopeTracksGhostTooltip: 'Кликнете, за да търсите само на тази страница', + scopeComposersPlaceholder: 'Търси композитор…', + scopeComposersBadgeTooltip: 'Кликнете, за да премахнете', + scopeComposersGhostTooltip: 'Кликнете, за да търсите само на тази страница', + genres: 'Жанрове', + shareLink: 'Връзка за споделяне', + shareTrackTitle: 'Споделена песен', + shareQueueTitle_one: 'Споделена опашка ({{count}} песен)', + shareQueueTitle_other: 'Споделена опашка ({{count}} песни)', + shareQueueAction: 'Добави в опашката', + shareQueueing: 'Добавяне в опашката…', + shareQueued_one: 'Добавена {{count}} споделена песен в опашката', + shareQueued_other: 'Добавени {{count}} споделени песни в опашката', + shareQueuedPartial: 'Добавени {{queued}} от {{total}} споделени песни в опашката ({{skipped}} не са намерени).', + shareUnsupportedTitle: 'Тази връзка за споделяне не може да се използва тук', + shareUnsupportedSub: 'Използвайте връзка за споделяне на песен, албум, изпълнител, композитор или опашка.', + shareFromServer: 'От {{server}}', + shareQueuePreview: 'Прегледай песните', + shareQueuePreviewLoading: 'Зареждане на песни…', + shareQueuePreviewEmpty: 'От тази връзка не са намерени песни на сървъра.', + shareQueuePreviewSkipped: '{{skipped}} от {{total}} песни не са намерени на този сървър.', + moodGroups: { + joy: 'Радост', + sadness: 'Тъга', + dance: 'Танц', + work: 'Работа', + romance: 'Романтика', + anger: 'Гняв', + }, +}; diff --git a/src/locales/bg/settings.ts b/src/locales/bg/settings.ts new file mode 100644 index 00000000..68811801 --- /dev/null +++ b/src/locales/bg/settings.ts @@ -0,0 +1,773 @@ +export const settings = { + title: 'Настройки', + language: 'Език', + languageEn: 'English', + languageDe: 'Deutsch', + languageEs: 'Español', + languageFr: 'Français', + languageNl: 'Nederlands', + languageNb: 'Norsk', + languageRu: 'Русский', + languageZh: '中文', + languageRo: 'Română', + languageJa: '日本語', + languageHu: 'Magyar', + languagePl: 'Polski', + languageBg: 'Български', + font: 'Шрифт', + fontHintOpenDyslexic: 'Подходящ за дислексия · без поддръжка на китайски', + theme: 'Тема', + appearance: 'Външен вид', + servers: 'Сървъри', + serverName: 'Име на сървъра', + serverUrl: 'Адрес на сървъра', + serverUrlPlaceholder: '192.168.1.100:4533 или https://music.example.com', + serverAlternateUrl: 'Втори адрес (по избор)', + serverAlternateUrlPlaceholderPublic: 'https://music.example.com', + serverAlternateUrlPlaceholderLocal: '192.168.1.100:4533', + serverAlternateUrlHintAddPublic: 'Можеш да добавиш публичен адрес за достъп извън домашната мрежа.', + serverAlternateUrlHintAddLocal: 'Можеш да добавиш локален адрес за по-бърза връзка вкъщи.', + serverBothLanError: 'И двата адреса са локални — запази само единия или добави публичен адрес.', + dualAddressVerifying: 'Проверка дали двата адреса сочат към един и същ сървър…', + dualAddressMismatch: 'Двата адреса сочат към различни сървъри. Провери правописа и опитай отново.', + dualAddressInsufficient: 'Не успяхме да потвърдим, че двата адреса са един и същ сървър. Премахни единия, за да продължиш.', + dualAddressUnreachable: 'Не успяхме да се свържем с {{host}}. Провери адреса и мрежата си, след което опитай отново.', + urlRemigrationTitle: 'Да преместим ли данните на библиотеката?', + urlRemigrationMessage: 'Смяната на адреса ще премести всички данни за библиотеката, анализите и кеша на корици от {{oldKey}} към {{newKey}}. Това не може да бъде отменено.', + urlRemigrationConfirm: 'Премести данните', + urlRemigrationProgress: 'Преместване на данните на библиотеката…', + urlRemigrationFailureInspect: 'Не успяхме да проверим какво ще бъде преместено. Опитай отново или отвори дневника за отстраняване на грешки.', + urlRemigrationFailureRun: 'Преместването на данните на библиотеката се провали. Запазените ти данни не са променени — опитай отново.', + urlRemigrationFailureCoverRename: 'Данните на библиотеката бяха преместени, но файловете с корици не можаха да бъдат преименувани. Корицита ще се възстановят при следващия достъп.', + shareUsesLocalUrl: 'Използвай локален адрес в споделените връзки', + shareUsesLocalUrlDesc: 'Засяга поканите за Orbit и споделянията на библиотеката. По подразбиране: публичен адрес.', + serverUsername: 'Потребителско име', + serverPassword: 'Парола', + customHeadersTitle: 'Персонализирани HTTP заглавия', + customHeadersHelp: 'За портали на обратен прокси (Pangolin, Cloudflare Access). Изпращат се само към твоя сървър — не към услуги на трети страни.', + customHeadersNamePlaceholder: 'Име на заглавието', + customHeadersValuePlaceholder: 'Стойност на заглавието', + customHeadersAddRow: 'Добави заглавие', + customHeadersRemoveRow: 'Премахни заглавие', + customHeadersApplyTo: 'Приложи заглавията към', + customHeadersApplyTo_public: 'Публичен адрес', + customHeadersApplyTo_local: 'Локален адрес', + customHeadersApplyTo_both: 'И двата адреса', + customHeadersNotInShare: 'Персонализираните заглавия не се включват в поканите за споделяне — настрой ги отново на всяко устройство.', + 'customHeadersValidation.tooMany': 'Твърде много персонализирани заглавия (максимум 16).', + 'customHeadersValidation.nameRequired': 'Името на заглавието е задължително.', + 'customHeadersValidation.nameTooLong': 'Името на заглавието е твърде дълго.', + 'customHeadersValidation.valueTooLong': 'Стойността на заглавието е твърде дълга.', + 'customHeadersValidation.crlf': 'Имената и стойностите на заглавията не могат да съдържат нови редове.', + 'customHeadersValidation.blocked': 'Това име на заглавие не е позволено.', + 'customHeadersValidation.duplicate': 'Повтарящо се име на заглавие.', + addServer: 'Добави сървър', + addServerTitle: 'Добавяне на нов сървър', + editServer: 'Редактирай', + editServerTitle: 'Редактиране на сървър', + useServer: 'Използвай', + deleteServer: 'Изтрий', + noServers: 'Няма запазени сървъри.', + serverActive: 'Активен', + serverVersionUnknown: 'Версията на сървъра е неизвестна', + confirmDeleteServer: 'Да изтрием ли сървъра „{{name}}“?', + confirmDeleteServerLibrary: 'Да изтрием ли и локалния индекс на библиотеката на този сървър? Натисни „Отказ“, за да запазиш кешираното копие за офлайн използване.', + serverConnecting: 'Свързване…', + serverConnected: 'Връзката е установена!', + serverFailed: 'Връзката се провали.', + testBtn: 'Тествай връзката', + testingBtn: 'Тестване…', + serverCompatible: 'Създаден за Navidrome. Други съвместими със Subsonic сървъри (Gonic, Airsonic и др.) може да работят с ограничена функционалност, тъй като Psysonic използва много специфични за Navidrome API крайни точки.', + userMgmtTitle: 'Управление на потребители', + userMgmtDesc: 'Управлявай потребителите на този сървър. Изисква администраторски права.', + userMgmtNoAdmin: 'Нужни са ти администраторски права, за да управляваш потребители на този сървър.', + userMgmtLoadError: 'Зареждането на потребителите се провали.', + userMgmtLoadFriendly: 'Сървърът не отговори — обикновено това е еднократен проблем.', + userMgmtRetry: 'Опитай отново', + userMgmtEmpty: 'Няма намерени потребители.', + userMgmtYouBadge: 'Ти', + userMgmtAdminBadge: 'Администратор', + userMgmtAddUser: 'Добави потребител', + userMgmtAddUserTitle: 'Добавяне на нов потребител', + userMgmtEditUserTitle: 'Редактиране на потребител', + userMgmtUsername: 'Потребителско име', + userMgmtName: 'Показвано име', + userMgmtEmail: 'Имейл', + userMgmtPassword: 'Парола', + userMgmtPasswordEditHint: 'Въведи нова парола, за да я обновиш.', + userMgmtRoleAdmin: 'Администратор', + userMgmtLibraries: 'Библиотеки', + userMgmtLibrariesAdminHint: 'Администраторите автоматично имат достъп до всички библиотеки.', + userMgmtLibrariesEmpty: 'На този сървър няма налични библиотеки.', + userMgmtLibrariesValidation: 'Избери поне една библиотека.', + userMgmtLibrariesUpdateError: 'Потребителят е запазен, но присвояването на библиотеки се провали', + userMgmtNoLibraries: 'Няма присвоени библиотеки', + userMgmtNeverSeen: 'Никога', + userMgmtSave: 'Запази', + userMgmtCancel: 'Отказ', + userMgmtDelete: 'Изтрий', + userMgmtEdit: 'Редактирай', + userMgmtConfirmDelete: 'Да изтрием ли потребителя „{{username}}“? Това не може да бъде отменено.', + userMgmtCreateError: 'Създаването на потребител се провали.', + userMgmtUpdateError: 'Обновяването на потребителя се провали.', + userMgmtDeleteError: 'Изтриването на потребителя се провали.', + userMgmtCreated: 'Потребителят е създаден.', + userMgmtUpdated: 'Потребителят е обновен.', + userMgmtDeleted: 'Потребителят е изтрит.', + userMgmtValidationMissing: 'Потребителско име, показвано име и парола са задължителни.', + userMgmtValidationMissingIdentity: 'Потребителско име и показвано име са задължителни.', + userMgmtMagicStringGenerate: 'Генерирай магически код', + userMgmtSaveAndMagicString: 'Запази и вземи магически код', + userMgmtMagicStringPasswordNavHint: + 'Navidrome ще запази тази парола за потребителя. Ако се различава от текущата, сървърът ще обнови паролата за вход.', + userMgmtMagicStringPlaintextWarning: + 'Споделяй магическия код внимателно: той съдържа некриптирана парола (кодирането не е криптиране). Всеки, който притежава пълния код, може да влезе като този потребител.', + userMgmtMagicStringCopied: 'Магическият код е копиран в клипборда.', + userMgmtMagicStringCopyFailed: 'Копирането в клипборда се провали.', + userMgmtMagicStringLoginFailed: 'Проверката на паролата се провали — данните за вход не можаха да бъдат потвърдени.', + userMgmtMagicStringModalTitle: 'Генериране на магически код', + userMgmtMagicStringModalDesc: 'Въведи Subsonic паролата за „{{username}}“. Тя се включва в копирания магически код.', + userMgmtMagicStringModalConfirm: 'Копирай кода', + audiomuseTitle: 'AudioMuse-AI (Navidrome)', + audiomuseBadge: 'AudioMuse-AI', + audiomuseDesc: + 'Включи, ако този сървър има настроен плъгин AudioMuse-AI за Navidrome. Активира „Мигновен микс“ от песни и използва подобни изпълнители от страна на сървъра вместо Last.fm на страниците на изпълнителите.', + audiomuseStatusActive: 'Активен', + audiomuseStatusChecking: 'Проверка…', + audiomuseStatusNotDetected: 'Не е открит', + audiomuseStatusProbeFailed: 'Проверката се провали', + audiomuseIssueHint: + 'Наскоро „Мигновен микс“ се провали — провери плъгина за Navidrome и AudioMuse API. Подобните изпълнители се връщат към Last.fm, когато сървърът не върне резултати.', + connected: 'Свързан', + failed: 'Неуспешно', + eqTitle: 'Еквалайзер', + eqEnabled: 'Включи еквалайзера', + eqPreset: 'Пресет', + eqPresetCustom: 'Персонализиран', + eqPresetBuiltin: 'Вградени пресети', + eqPresetCustomGroup: 'Моите пресети', + eqPresetAutoEqGroup: 'AutoEQ', + eqSavePreset: 'Запази като пресет', + eqPresetName: 'Име на пресета…', + eqDeletePreset: 'Изтрий пресета', + eqResetBands: 'Върни към плоска настройка', + eqPreGain: 'Предварително усилване', + eqResetPreGain: 'Нулирай предварителното усилване', + eqAutoEqTitle: 'Търсене на слушалки в AutoEQ', + eqAutoEqPlaceholder: 'Търси модел слушалки / IEM…', + eqAutoEqSearching: 'Търсене…', + eqAutoEqNoResults: 'Няма намерени резултати', + eqAutoEqError: 'Търсенето се провали', + eqAutoEqRateLimit: 'Достигнат е лимитът на GitHub — опитай отново след минута', + eqAutoEqFetchError: 'Изтеглянето на EQ профил се провали', + behavior: 'Поведение на приложението', + groupTray: 'Системна лента', + groupLinuxRendering: 'Рендиране в Linux', + groupClock: 'Часовник', + groupDisplay: 'Дисплей', + groupWindow: 'Прозорец', + cacheTitle: 'Макс. размер на съхранение', + cacheDesc: 'Кеш в браузъра за корици и изображения на изпълнители (IndexedDB). Най-старите записи се премахват автоматично при недостиг на място.', + cacheUsedImages: 'Изображения:', + cacheUsedOffline: 'Офлайн песни:', + cacheUsedHot: 'Размер на диска:', + hotCacheTrackCount: 'Песни в кеша:', + cacheMaxLabel: 'Макс. размер', + imageCacheScopeLabel: 'Обхват', + imageCacheSubTitle: 'Прегледи в браузъра', + coverDiskCacheSubTitle: 'Кеш на корици на диска', + coverCacheStrategyTitle: 'Кеш на корици', + coverCacheStrategyDesc: 'Можеш да избереш стратегия за всеки сървър: Пестелива — зарежда корици при нужда; Агресивна — зарежда при нужда плюс допълнително предварително зареждане във фонов режим.', + coverCacheStrategyLabel: 'Стратегия', + coverCacheStrategyServerLabel: 'Сървър', + coverCacheStrategyProgressLabel: 'Кеш', + coverCacheStrategyActionsLabel: 'Действия', + coverCacheStrategyLazy: 'Пестелива', + coverCacheStrategyLazyDesc: 'Зарежда корици само когато са нужни.', + coverCacheStrategyAggressive: 'Агресивна', + coverCacheStrategyAggressiveDesc: 'Пестеливо поведение плюс допълнително предварително зареждане във фонов режим.', + coverCacheStrategyDiskUsage: 'На диска: {{size}}', + coverCacheStrategyProgressValue: '{{percent}}% ({{done}}/{{total}}) · {{size}}', + coverCacheStrategyClearAction: 'Изчисти кеша на корици', + coverCacheStrategyClearTitle: 'Да изчистим ли кеша на корици?', + coverCacheStrategyClearDesc: 'Премахва всички кеширани изображения на корици за {{server}}. Ще бъдат изтеглени отново при нужда.', + coverCacheStrategyClearConfirm: 'Изчисти', + coverCacheStrategyClearCancel: 'Отказ', + coverCacheStrategyClearSuccess: 'Кешът на корици за този сървър е изчистен.', + coverCacheStrategyClearError: 'Изчистването на кеша на корици се провали.', + coverCacheStrategyServerRemoved: 'премахнат сървър', + cacheClearBtn: 'Изчисти кеша', + cacheClearWarning: 'Изчиства всички кеширани корици и изображения на изпълнители от съхранението в браузъра. Ще бъдат изтеглени отново при нужда.', + cacheClearConfirm: 'Изчисти кеша на изображения', + cacheClearCancel: 'Отказ', + waveformCacheCleared: 'Кешът на аудио вълните е изчистен ({{count}} реда).', + waveformCacheClearFailed: 'Изчистването на кеша на аудио вълните се провали.', + storageTabTitle: 'Офлайн и кеш', + mediaDirTitle: 'Папка с медия', + mediaDirDesc: 'Основна папка за локално възпроизвеждане. Офлайн библиотеката използва library/; предварителното зареждане на опашката използва cache/.', + mediaDirDefault: 'По подразбиране (данни на приложението)', + mediaDirChange: 'Смени папката', + mediaDirClear: 'Върни към стойността по подразбиране', + mediaDirHint: 'Новите изтегляния ще използват това местоположение. Съществуващите файлове остават на първоначалните си пътища, докато не бъдат премахнати.', + offlineStorageTitle: 'Съхранение на офлайн библиотека', + offlineDirTitle: 'Офлайн библиотека (в приложението)', + offlineDirDesc: 'Място за съхранение на песни, които правиш достъпни офлайн в Psysonic.', + offlineDirDefault: 'По подразбиране (данни на приложението)', + offlineDirChange: 'Смени директорията', + offlineDirClear: 'Върни към стойността по подразбиране', + offlineDirHint: 'Новите изтегляния ще използват това местоположение. Съществуващите изтегляния остават на първоначалния си път.', + hotCacheTitle: 'Кеш за бързо възпроизвеждане', + hotCacheDisclaimer: 'Предварително зарежда предстоящите песни от опашката и запазва предишните. Когато е включен, използва дисково пространство и мрежа.', + hotCacheDirDefault: 'По подразбиране (данни на приложението)', + hotCacheDirChange: 'Смени папката', + hotCacheDirClear: 'Върни към стойността по подразбиране', + hotCacheDirHint: 'Смяната на папката нулира вътрешния индекс на приложението; файловете, вече записани на диска, остават на мястото си, докато не ги премахнеш.', + hotCacheEnabled: 'Включи кеша за бързо възпроизвеждане', + hotCacheMaxMb: 'Максимален размер на кеша', + hotCacheDebounce: 'Забавяне при промяна на опашката', + hotCacheDebounceImmediate: 'Незабавно', + hotCacheDebounceSeconds: '{{n}} сек', + hotCacheClearBtn: 'Изчисти бързия кеш', + audioOutputDevice: 'Аудио изходно устройство', + audioOutputDeviceDesc: 'Избери през кое аудио устройство да възпроизвежда Psysonic. Промените влизат в сила незабавно и рестартират текущата песен.', + audioOutputDeviceDefault: 'По подразбиране на системата', + audioOutputDeviceRefresh: 'Обнови списъка с устройства', + audioOutputDeviceOsDefaultNow: 'текущ системен изход', + audioOutputDeviceListError: 'Зареждането на списъка с аудио устройства се провали.', + audioOutputDeviceNotInCurrentList: 'не е в текущия списък', + audioOutputDeviceRememberEq: 'Запомни еквалайзера за устройство', + audioOutputDeviceRememberEqDesc: 'Запазва настройките на еквалайзера за всяко аудио изходно устройство и ги възстановява автоматично при смяна на устройства. Профилите се сменят само когато избереш устройство тук, а системата по подразбиране използва един общ профил.', + hiResTitle: 'Родно Hi-Res възпроизвеждане', + hiResEnabled: 'Включи родно hi-res възпроизвеждане', + hiResDesc: 'Възпроизвежда всяка песен с оригиналната честота на дискретизация, вместо да преобразува всичко до 44.1 kHz, като превключва аудио устройството да съответства на файла (88.2 kHz и нагоре). Включвай само ако хардуерът и мрежата ти надеждно поддържат високи честоти на дискретизация.', + hiResCrossfadeResampleTitle: 'Честота при преливане / AutoDJ / плавен преход', + hiResCrossfadeResampleDesc: 'Когато съседните песни имат различни честоти на дискретизация, и двете страни се преобразуват до тази честота по време на преливане, AutoDJ и плавни преходи.', + hiResCrossfadeResample44: '44.1 kHz', + hiResCrossfadeResample88: '88.2 kHz', + hiResCrossfadeResample96: '96 kHz', + hiResCrossfadeResampleWarning: 'Преобразуването на честотата използва допълнително процесорно време и памет — избирай внимателно на по-бавни устройства.', + showArtistImages: 'Показвай изображения на изпълнители', + showArtistImagesDesc: 'Зарежда и показва изображения на изпълнители в прегледа на изпълнителите. Изключено по подразбиране, за да намали дисковото и мрежовото натоварване на сървъра при големи библиотеки.', + showOrbitTrigger: 'Показвай „Orbit“ в заглавната лента', + showOrbitTriggerDesc: 'Бутонът в горната лента за започване или присъединяване към споделена слушателска сесия. Скрий го, ако не използваш Orbit — можеш да го включиш отново тук.', + showTrayIcon: 'Показвай икона в системната лента', + showTrayIconDesc: 'Показва иконата на Psysonic в областта за системни известия / менюто.', + minimizeToTray: 'Минимизирай в системната лента', + minimizeToTrayDesc: 'При затваряне на прозореца, запази Psysonic да работи в системната лента, вместо да излиза.', + clockFormat: 'Формат на часовника', + clockFormatDesc: 'Показване на часа, използвано от прогнозното време на опашката и предварителния преглед на таймера за заспиване.', + clockFormatAuto: 'Автоматично (системен регион)', + clockFormatTwentyFour: '24-часов', + clockFormatTwelve: '12-часов (AM/PM)', + preloadMiniPlayer: 'Предварително зареждай мини плейъра', + preloadMiniPlayerDesc: 'Изгражда прозореца на мини плейъра във фонов режим при стартиране на приложението, за да покаже съдържание веднага при първо отваряне. Използва малко допълнителна памет.', + discordRichPresence: 'Discord Rich Presence', + discordRichPresenceDesc: 'Показва текущо изпълняваната песен в профила ти в Discord. Изисква Discord да работи.', + discordRichPresenceNotice: 'Забележка: това е вграденият Discord Rich Presence на Psysonic. Ако предпочиташ да използваш официалния плъгин Discord Rich Presence за Navidrome, остави това изключено и включи „Показвай в „В момента се изпълнява““ по-надолу на страницата.', + useCustomTitlebar: 'Персонализирана заглавна лента', + useCustomTitlebarDesc: 'Заменя системната заглавна лента с вградена, която съответства на темата на приложението. Изключи, за да използваш родната заглавна лента на GNOME/GTK.', + windowButtonStyle: 'Бутони на прозореца', + windowButtonStyleDesc: 'Избери вида на бутоните за минимизиране, максимизиране и затваряне.', + windowButtonsDots: 'Точки', + windowButtonsDotsGlyph: 'Точки + икони', + windowButtonsFlat: 'Плоски', + windowButtonsPill: 'Овални', + windowButtonsOutline: 'С контур', + windowButtonsGlyph: 'Минимални', + showMinimizeButton: 'Показвай бутон за минимизиране', + showMinimizeButtonDesc: 'Изключи, за да показваш само бутоните за максимизиране и затваряне.', + linuxWebkitSmoothScroll: 'Плавно превъртане (Linux)', + linuxWebkitSmoothScrollDesc: 'Включено: инерционно превъртане. Изключено: ред по ред, в стил GTK.', + linuxWebkitInputForceRepaint: 'Прерисувай полетата при фокус (Linux)', + linuxWebkitInputForceRepaintDesc: 'Поправя текстови полета, които замръзват при клик. Иконите за търсене може за кратко да премигнат при фокус.', + linuxWaylandTextRender: 'Рендиране на текст в Wayland (Linux)', + linuxWaylandTextRenderDesc: + 'Изглаждането на шрифта се обновява веднага. Пресетът за ускорение (Sharp / GPU) влиза в сила след рестартиране на приложението.', + linuxWaylandTextRenderBalanced: 'Балансирано', + linuxWaylandTextRenderSharp: 'Рязко (щадящо процесора)', + linuxWaylandTextRenderGpu: 'Приоритет на GPU', + linuxWaylandTextRenderMinimal: 'Минимално (изглаждане по подразбиране от CSS)', + discordCoverTitle: 'Източник на корица', + discordCoverDesc: 'Откъде идва обложката на албума в профила ти в Discord.', + discordCoverNone: 'Няма (само икона на приложението)', + discordCoverServer: 'Сървър (чрез информация за албума)', + discordCoverApple: 'Apple Music', + discordOptions: 'Разширени настройки за Discord', + discordTemplates: 'Персонализирани текстови шаблони', + discordTemplatesDesc: 'Персонализирай каква информация се показва в профила ти в Discord. Променливи: {title}, {artist}, {album}', + discordTemplateDetails: 'Основен ред (детайли)', + discordTemplateState: 'Втори ред (състояние)', + discordTemplateLargeText: 'Подсказка за албума (largeText)', + discordTemplateName: 'Ред в списъка с потребители (име)', + nowPlayingEnabled: 'Показвай във „В момента звучи“', + nowPlayingEnabledDesc: 'Излъчва текущо изпълняваната песен към прегледа на слушателите в реално време на сървъра. Изключи, за да спреш изпращането на данни за възпроизвеждане.', + nowPlayingPluginNote: 'Задължително при използване на официалния плъгин Discord Rich Presence за Navidrome.', + externalArtwork: 'Външно извличане на изображения', + externalArtworkDesc: 'Изтегля фонове и банери на изпълнители с висока резолюция от fanart.tv за основната секция, страниците на изпълнители и плейъра на цял екран. Изключено по подразбиране.', + externalArtworkNote: 'Когато е включено, изпраща името на изпълнителя (и текущия албум) към musicbrainz.org, за да идентифицира изпълнителя, след което изтегля изображения от fanart.tv — при нужда и само за четене; етикетите на библиотеката ти никога не се променят. Изображенията се предоставят от fanart.tv и техните сътрудници.', + externalArtworkByokTitle: 'Личен API ключ (BYOK)', + externalArtworkByokDesc: 'По избор. Въведи тук личния си API ключ за fanart.tv — изпраща се в допълнение към ключа на приложението.', + externalArtworkByokSaved: 'Запазен — изпраща се заедно с ключа на приложението, докато извличачът е включен.', + enableBandsintown: 'Дати на турнета от Bandsintown', + enableBandsintownDesc: 'Показва предстоящи концерти на текущия изпълнител в раздела „Информация“. Данните се изтеглят от публичното API на Bandsintown.', + lyricsServerFirst: 'Предпочитай текстовете от сървъра', + lyricsServerFirstDesc: 'Провери текстовете, предоставени от сървъра (вградени етикети, съпътстващи файлове), преди да заявиш LRCLIB. Изключи, за да използваш първо LRCLIB.', + enableNeteaselyrics: 'Текстове от Netease Cloud Music', + enableNeteaselyricsDesc: 'Използвай Netease Cloud Music като последен източник на текстове, когато сървърът и LRCLIB не върнат нищо. Най-добро покритие за азиатска и международна музика.', + lyricsSourcesTitle: 'Източници на текстове', + lyricsSourcesDesc: 'Избери кои източници да се заявяват за текстове и в какъв ред. Плъзни, за да пренаредиш. Изключените източници се пропускат изцяло.', + lyricsSourceServer: 'Сървър', + lyricsSourceLrclib: 'LRCLIB', + lyricsSourceNetease: 'Netease Cloud Music', + lyricsYouLyPlus: 'YouLyPlus (Караоке)', + lyricsYouLyPlusDesc: 'Синхронизация дума по дума от общностен бекенд (Apple Music, Spotify, Musixmatch, QQ). Пробва се първи; включените по-долу източници служат като резервен вариант.', + lyricsSourcesFallbackHint: 'Използва се като резервен вариант, когато YouLyPlus не намери нищо. Плъзни, за да пренаредиш.', + lyricsSourcesPrimaryHint: 'Пробват се по ред. Плъзни, за да пренаредиш. Всички изключени = текстовете са деактивирани.', + lyricsStaticOnly: 'Показвай текстовете само като статичен текст', + lyricsStaticOnlyDesc: 'Показва синхронизираните текстове без автоматично превъртане и без открояване на думи.', + downloadsTitle: 'ZIP износ и архивиране', + downloadsFolderDesc: 'Целева папка за албуми, които изтегляш като ZIP файл на компютъра си.', + downloadsDefault: 'Папка за изтегляния по подразбиране', + pickFolder: 'Избери', + pickFolderTitle: 'Избор на папка за изтегляне', + clearFolder: 'Изчисти папката за изтегляне', + logout: 'Изход', + aboutTitle: 'За Psysonic', + aboutDesc: 'Модерен настолен музикален плейър, създаден за Navidrome. Използва Subsonic API плюс разширения, специфични за Navidrome. Изграден на Tauri v2 с родния Rust аудио механизъм — лек и бърз, но пълен с функции: лента за превъртане с аудио вълна, синхронизирани текстове, интеграция с Last.fm, 10-лентов еквалайзер, преливане, безпаузно възпроизвеждане, Replay Gain, преглед по жанрове и голяма библиотека от теми.', + aboutLicense: 'Лиценз', + aboutLicenseText: 'GNU GPL v3 — свободен за използване, промяна и разпространение при същия лиценз.', + aboutRepo: 'Изходен код в GitHub', + aboutVersion: 'Версия', + aboutBuiltWith: 'Изграден с Tauri · React · TypeScript · Rust/rodio', + aboutMaintainersLabel: 'Поддръжници', + aboutReleaseNotesLabel: 'Бележки по изданието', + aboutReleaseNotesLink: 'Отвори новостите в тази версия', + aboutContributorsLabel: 'Сътрудници', + showChangelogOnUpdate: 'Показвай „Новости“ при обновяване', + showChangelogOnUpdateDesc: 'Показва дискретен банер с промените над „В момента се изпълнява“ след обновяване. Кликването отваря бележките по изданието; X го затваря.', + libraryGridMaxColumnsTitle: 'Мрежи с карти на библиотеката', + libraryGridMaxColumnsPerfHint: 'По-високите стойности побират повече плочки на ред и могат да увеличат натоварването при подредба и рисуване — забележимо при много големи библиотеки или по-бавни устройства.', + libraryGridMaxColumnsRangeLabel: 'Максимален брой колони ({{min}}–{{max}})', + libraryGridMaxColumnsDesc: 'Прилага се за изгледите с карти на албуми, изпълнители, плейлисти, радио, офлайн и други. По-ниските стойности използват по-големи плочки и обикновено са по-леки за процесора.', + libraryIndexTitle: 'Локален индекс на библиотеката (предварителна версия)', + libraryIndexDesc: 'Пази локално копие на базата данни с песни на всеки сървър, за да останат прегледът и търсенето бързи и да работят офлайн. Първоначалната синхронизация се изпълнява за всеки настроен сървър; офлайн сървърите се повтарят автоматично.', + libraryIndexDeltaHint: 'Фоновата делта синхронизация проверява свързаните сървъри на всеки 30 секунди и се изпълнява при нужда — обикновено на всеки 5–45 минути, в зависимост от размера и натоварването на библиотеката.', + libraryIndexEnable: 'Включи локален индекс на библиотеката', + libraryIndexEnableAllDesc: 'Индексира и синхронизира всички настроени сървъри във фонов режим.', + libraryIndexNoServer: 'Първо добави сървър.', + libraryIndexServerListTitle: 'Индексирани сървъри', + libraryIndexAllExcluded: 'Всички сървъри са изключени от синхронизация. Активирай отново индекса или добави сървър.', + libraryIndexServerOffline: 'Сървърът е офлайн — синхронизацията е отложена', + libraryIndexServerSyncing: 'Синхронизиране…', + libraryIndexFullResync: 'Пълна повторна синхронизация', + libraryIndexDeltaSync: 'Делта синхронизация', + libraryIndexExcludeServer: 'Изключи от синхронизация', + libraryIndexExcludingServer: 'Изключване…', + libraryIndexExcludedTitle: 'Изключен от синхронизация', + libraryIndexIncludeServer: 'Включи отново', + libraryIndexIncludingServer: 'Включване…', + libraryIndexStatus: 'Състояние', + libraryIndexStatusIdle: 'В покой', + libraryIndexStatusProbing: 'Проверка на сървъра…', + libraryIndexStatusInitial: 'Първоначална синхронизация…', + libraryIndexStatusReady: 'Готово ({{count}} песни)', + libraryIndexStatusError: 'Грешка — виж дневниците', + libraryIndexProgressIngest: 'Индексирани {{count}} песни…', + libraryIndexProgressVerify: 'Проверени {{checked}} ({{deleted}} премахнати)', + libraryIndexSyncNow: 'Синхронизирай сега', + libraryIndexVerify: 'Провери целостта на библиотеката', + libraryIndexCancel: 'Отказ', + libraryIndexAutoReconcile: 'Автоматично изравняване при спад в броя', + libraryIndexAutoReconcileDesc: 'Автоматично проверява за премахнати песни, когато сървърът съобщи по-малко от очакваното.', + libraryIndexSyncError: 'Синхронизацията на библиотеката се провали: {{error}}', + libraryIndexBindError: 'Индексът не можа да бъде включен: {{error}}', + analyticsStrategyTitle: 'Стратегии за анализ', + analyticsStrategyDesc: 'Избери стила на анализ за библиотеката.', + analyticsStrategyLabel: 'Стратегия', + analyticsStrategyLazy: 'Пестелива', + analyticsStrategyLazyDesc: 'Анализирай само при изпълнение на песни или влизане в бързия/офлайн кеша — минимална употреба на процесор и мрежа.', + analyticsStrategyAdvanced: 'Агресивна', + analyticsStrategyAdvancedDesc: 'По-агресивно фоново сканиране. След приключване получаваш BPM за всяка песен, плюс мигновено зареждане на сила на звука и аудио вълна.', + analyticsStrategyPriorityTitle: 'Приоритет на анализа (винаги се прилага)', + analyticsStrategyPriorityHigh: '1 — Текущо изпълнявана: изтегли + анализирай първа (байтове от възпроизвеждането, допълване на силата на звука или HTTP при нужда).', + analyticsStrategyPriorityMiddle: '2 — Следваща в опашката: следващите ~5 песни от опашката и съседите в бързия кеш — анализирай от кеширани/изтеглени байтове, когато е възможно; HTTP допълване само при пропуск.', + analyticsStrategyPriorityLow: '3 — Пакетна обработка на библиотеката (само при Агресивна): автоматична фонова опашка в края; допълва се по воден знак (~3× работници) без изчакване на празна опашка.', + analyticsStrategyServerLabel: 'Сървър', + analyticsStrategyProgressLabel: 'Напредък на анализа:', + analyticsStrategyProgressValue: '{{percent}}% ({{done}}/{{total}})', + analyticsStrategyActionsLabel: 'Действия', + analyticsStrategyParallelismLabel: 'Паралелни работници', + analyticsStrategyParallelismValue: '{{n}} нишки', + analyticsStrategyParallelismDesc: 'Колко песни да се изтеглят и анализират едновременно (HTTP + процесор). По-високите стойности ускоряват наваксването на библиотеката, но използват повече мрежа и процесор.', + analyticsStrategyAdvancedWarning: 'Агресивната стратегия използва повече процесор и мрежов трафик, докато пакетната обработка на библиотеката работи във фонов режим.', + analyticsStrategyServerRemoved: 'Премахнат сървър', + analyticsStrategyClearAction: 'Изчисти анализа', + analyticsStrategyClearTitle: 'Да изчистим ли анализа?', + analyticsStrategyClearDesc: 'Изчистването на анализа за {{server}} премахва кешираните аудио вълни и силата на звука. Повторното добавяне на този сървър по-късно може да изисква дълго преиндексиране.', + analyticsStrategyClearCancel: 'Отказ', + analyticsStrategyClearConfirm: 'Изчисти анализа', + analyticsStrategyClearSuccess: 'Анализът за премахнатия сървър е изчистен.', + analyticsStrategyClearError: 'Изчистването на анализа за премахнатия сървър се провали.', + analyticsStrategyProgressEmptyAfterFailed: '100% (0/0, блокирано от неуспешни песни)', + analyticsFailedTracksOpenTitle: 'Неуспешни песни: {{count}}', + analyticsFailedTracksTitle: 'Песни с неуспешен анализ — {{server}}', + analyticsFailedTracksDesc: 'Тези песни многократно се провалят при декодиране/обогатяване и са изключени от автоматичния фонов анализ.', + analyticsFailedTracksLoading: 'Зареждане на списъка с неуспешни песни…', + analyticsFailedTracksEmpty: 'Няма неуспешни песни за този сървър.', + analyticsFailedTracksClose: 'Затвори', + analyticsFailedTracksExport: 'Изнеси списъка', + analyticsFailedTracksExportSuccess: 'Списъкът с неуспешни песни е изнесен ({{count}}).', + analyticsFailedTracksExportError: 'Изнасянето на списъка с неуспешни песни се провали.', + analyticsFailedTracksRescan: 'Пресканирай неуспешните песни', + analyticsFailedTracksRescanSuccess: 'Пресканиране е насрочено за {{count}} неуспешни песни.', + analyticsFailedTracksRescanError: 'Пресканирането на неуспешните песни се провали.', + analyticsFailedTracksLoadError: 'Зареждането на неуспешните песни се провали.', + randomMixTitle: 'Черен списък за случаен микс', + luckyMixMenuTitle: 'Показвай „Късметлийски микс“ в менюто', + luckyMixMenuDesc: 'Активира „Късметлийски микс“ в „Направи микс“ и като отделен елемент в менюто, когато разделената навигация е включена. Видимо е само когато AudioMuse е включен на активния сървър.', + randomMixBlacklistTitle: 'Персонализирани ключови думи за филтриране', + randomMixBlacklistDesc: 'Песните се изключват, когато някоя ключова дума съвпада с жанра, заглавието, албума или изпълнителя (активно, когато полето по-горе е отметнато).', + randomMixBlacklistPlaceholder: 'Добави ключова дума…', + randomMixBlacklistAdd: 'Добави', + randomMixBlacklistEmpty: 'Все още не са добавени персонализирани ключови думи.', + randomMixHardcodedTitle: 'Вградени ключови думи (активни, когато полето е отметнато)', + tabAudio: 'Аудио', + tabStorage: 'Офлайн и кеш', + tabAppearance: 'Външен вид', + tabThemes: 'Теми', + themesYourThemesTitle: 'Твоите теми', + themesCvdTooltip: 'Безопасна за далтонизъм — дейтеранопия, протанопия, тританопия', + themeAnimationWarning: 'Тази тема използва анимации, които може да увеличат натоварването на процесора при твоята конфигурация (Nvidia/Linux или изключен композитинг).', + themeStoreTitle: 'Магазин за теми', + themeStoreSubmitText: 'Направи ли своя тема? Сподели я с общността — повече информация в хранилището с теми.', + themeStoreSubmitLink: 'Отвори хранилището с теми', + themeStoreNetworkNotice: 'Магазинът за теми зарежда каталога и преглед от GitHub. Не се изпращат лични данни.', + themeStoreStatsNotice: 'Датите на последна промяна се обновяват веднъж дневно (около 04:17 UTC).', + themeStoreSearchPlaceholder: 'Търси теми…', + themeStoreFilterMode: 'Филтрирай по режим', + themeStoreModeAll: 'Всички', + themeStoreModeDark: 'Тъмна', + themeStoreModeLight: 'Светла', + themeStoreRefresh: 'Обнови', + themeStoreLoading: 'Зареждане на теми…', + themeStoreError: 'Зареждането на магазина за теми се провали. Провери връзката си.', + themeStoreRetry: 'Опитай отново', + themeStoreOfflineTitle: 'Магазинът за теми е офлайн', + themeStoreEmpty: 'Няма теми, отговарящи на филтрите ти.', + themeStoreActive: 'Активна', + themeStoreEnlarge: 'Увеличи предварителния преглед', + themeStoreSortNewest: 'Най-нови', + themeStoreSortName: 'По азбучен ред', + themeStoreAnimAll: 'Всички', + themeStoreAnimAnimated: 'Анимирани', + themeStoreAnimStatic: 'Статични', + themeStoreByAuthor: 'от {{author}}', + themeStoreLastChanged: 'Последна промяна', + themeMigrationNoticeTitle: 'Темата беше преместена в Магазина', + themeMigrationNoticeBody: '{{themes}} вече не се доставя вградено с приложението. Можеш да я преинсталираш от Магазина за теми (Настройки → Теми) или да избереш друга тема.', + themeMigrationNoticeOpen: 'Отвори Магазина за теми', + themeStoreOffline: 'Показва се последният кеширан каталог — изглежда си офлайн.', + themeStoreInstall: 'Инсталирай', + themeStoreInstalling: 'Инсталиране…', + themeStoreApply: 'Приложи', + themeStoreUpdate: 'Обнови', + themeStoreUpdating: 'Обновяване…', + themeStoreUninstall: 'Деинсталирай', + themeStoreInstallFailed: 'Инсталирането се провали', + themeStorePagePrev: 'Предишна страница', + themeStorePageNext: 'Следваща страница', + themeStorePageStatus: 'Страница {{page}} от {{total}}', + themeImportTitle: 'Импортирай тема', + themeImportButton: 'Импортирай тема…', + themeImporting: 'Импортиране…', + themeImportHint: 'Зареди тема, пакетирана като .zip (manifest.json + theme.css).', + themeImportSuccess: '„{{name}}“ е импортирана.', + themeImportErrorTitle: 'Тази тема не можа да бъде импортирана', + themeImportErrorBody: 'Не съответства на формата на темите на Psysonic. Може да е направена за друга версия, или файлът е непълен — провери дали си избрал правилния .zip, или се свържи с автора на темата.', + themeImportErrorDetails: 'Технически подробности', + themeImportConfirmTitle: 'Да инсталираме ли темата?', + themeImportConfirmBody: 'Да инсталираме ли „{{name}}“ от {{author}}?', + themeImportConfirmRisk: 'Импортираните теми не се преглеждат — инсталирай само теми, на които имаш доверие.', + tabLibrary: 'Библиотека', + tabServers: 'Сървъри', + tabLyrics: 'Текстове', + tabPersonalisation: 'Персонализация', + tabIntegrations: 'Интеграции', + inputKeybindingsTitle: 'Клавишни комбинации', + aboutContributorsCount_one: '{{count}} принос', + aboutContributorsCount_other: '{{count}} приноса', + searchPlaceholder: 'Търси в настройките…', + searchNoResults: 'Няма настройки, отговарящи на търсенето ти.', + integrationsPrivacyTitle: 'Известие за поверителност', + integrationsPrivacyBody: 'Всички интеграции в този раздел са по избор и изпращат данни към външни услуги или към твоя сървър на Navidrome, когато са включени. Last.fm получава историята ти на слушане, Discord показва текущо изпълняваната песен в профила ти, Bandsintown се заявява за всеки изпълнител, за да изтегли дати на турнета, а споделянето на „В момента се изпълнява“ публикува текущата ти песен пред останалите потребители на сървъра ти в Navidrome. Ако не искаш нищо от това, просто остави съответния раздел изключен.', + homeCustomizerTitle: 'Начална сцена', + queueSettingsTitle: 'Настройки на опашката', + queueModeTitle: 'Режим на показване на опашката', + queueModeQueueSub: 'Показвай само предстоящите песни. Текущата песен остава в заглавната част и напуска списъка, след като приключи.', + queueModePlaylistSub: 'Запази цялата опашка в списъка, като текущата песен е откроена най-отгоре; изпълнените песни остават.', + queueModeTimelineSub: 'Запази текущата песен най-отгоре в списъка, с прегледима история отгоре и предстоящи песни (в разбъркан ред) отдолу.', + queueToolbarTitle: 'Лента с инструменти на опашката', + queueToolbarReset: 'Върни към стойността по подразбиране', + queueToolbarSeparator: 'Разделител', + sidebarTitle: 'Странична лента', + sidebarReset: 'Върни към стойността по подразбиране', + artistLayoutTitle: 'Раздели на страницата на изпълнителя', + artistLayoutDesc: 'Плъзни, за да пренаредиш, превключи, за да скриеш отделни раздели от страницата на изпълнителя. Разделите без данни се пропускат автоматично.', + artistLayoutReset: 'Върни към стойността по подразбиране', + artistLayoutBio: 'Биография на изпълнителя', + artistLayoutTopTracks: 'Най-слушани песни', + artistLayoutSimilar: 'Подобни изпълнители', + artistLayoutAlbums: 'Албуми', + artistLayoutFeatured: 'Участва и в', + playlistLayoutTitle: 'Оформление на страницата на плейлистата', + playlistLayoutDesc: 'Показвай или скривай отделни елементи на страницата на плейлистата.', + playlistLayoutReset: 'Върни към стойността по подразбиране', + playerBarTitle: 'Лента на плейъра', + playerBarReset: 'Върни към стойността по подразбиране', + playerBarStarRating: 'Оценка със звезди', + playerBarFavorite: 'Любими (сърце)', + playerBarLastfmLove: 'Бутон „Харесва ми“', + playerBarPlaybackRate: 'Скорост на възпроизвеждане', + playerBarEqualizer: 'Еквалайзер', + playerBarMiniPlayer: 'Мини плейър', + playbackRateTitle: 'Скорост на възпроизвеждане', + playbackRateEnabled: 'Включи скоростта на възпроизвеждане', + playbackRateEnabledDesc: 'Променя скоростта глобално за всички песни. Не се прилага за радио или предварителни прослушвания.', + playbackRateStrategy: 'Стратегия', + playbackRateStrategySpeed: 'Скорост', + playbackRateStrategyVarispeed: 'Варископ', + playbackRateStrategyVarispeedSemitones: 'Полутонове', + playbackRateStrategyPreserve: 'Промяна на височината', + playbackRateStrategySpeedTip: 'Променя темпото; височината се коригира автоматично.', + playbackRateStrategyVarispeedTip: 'Скоростта и височината се променят заедно, като лента. Височината следва скоростта: 12 × log2(скорост).', + playbackRateStrategyVarispeedSemitonesTip: 'Варископ, настроен директно в полутонове. Скорост = 2^(полутон/12).', + playbackRateStrategyPreserveTip: 'Регулируемо темпо плюс ръчно отместване на височината (±12 полутона).', + playbackRateSpeed: 'Скорост', + playbackRatePitch: 'Височина', + playbackRateDerivedPitch: 'Промяна на височината от скоростта: {{value}}', + playbackRateDerivedSpeed: 'Скорост от полутонове: {{value}}', + playbackRateFineStep: 'Прецизна настройка', + playbackRateFineStepDesc: 'По-малки стъпки на плъзгача: 0.01× за скорост и 0.01 полутон за височина.', + playbackRateAutoPitch: 'Височината се коригира автоматично.', + playbackRateHint: 'Скоростта запазва естествената височина. Варископът променя височината заедно със скоростта. Варископ (полутонове) задава тази промяна на височината директно в полутонове. Промяната на височината добавя ръчно отместване. Използва повече процесор от варископа. Не се прилага за радио, предварителни прослушвания или Orbit.', + playbackRateNeutral: 'При 1.0× без отместване на височината, възпроизвеждането е нормално.', + playbackRateOrbitPaused: 'Не се прилага по време на сесии на Orbit — възпроизвеждането остава на 1.0× за синхронизация.', + playbackRateOrbitPausedShort: 'Orbit: 1.0× за синхронизация.', + advancedMode: 'Разширено', + advancedModeTooltip: 'Показвай разширени настройки във всички раздели с Настройки. Приноси на общността, които не отразяват задължително философията на дизайна на екипа, поддържащ Psysonic.', + advancedBadge: 'Разширено', + sidebarDrag: 'Плъзни, за да пренаредиш', + sidebarFixed: 'Винаги видимо', + nowPlayingTopTitle: '„В момента звучи“ най-отгоре', + nowPlayingTopDesc: 'Закачи елемента „В момента звучи“ най-отгоре на страничната лента вместо най-отдолу.', + randomNavSplitTitle: 'Разделена навигация за микс', + randomNavSplitDesc: 'Показвай „Случаен микс“, „Случайни албуми“ и „Късметлийски микс“ като отделни елементи в страничната лента вместо централизирания хъб „Направи микс“.', + tabInput: 'Въвеждане', + tabUsers: 'Потребители', + tabSystem: 'Система', + loggingTitle: 'Регистриране', + loggingModeDesc: 'Управлява подробността на дневника на бекенда в терминала.', + loggingModeOff: 'Изключено', + loggingModeNormal: 'Нормално', + loggingModeDebug: 'Отстраняване на грешки', + loggingExport: 'Изнеси дневниците', + loggingExportSuccess: 'Дневниците са изнесени ({{count}} реда).', + loggingExportError: 'Изнасянето на дневниците се провали.', + ratingsSectionTitle: 'Оценки', + ratingsSkipStarTitle: 'Пропускане при 1 звезда', + ratingsSkipStarDesc: + 'След няколко последователни пропускания, задай на песента 1★. Само за песни, които все още не са оценени.', + ratingsSkipStarThresholdLabel: 'Пропускания', + ratingsMixFilterTitle: 'Филтрирай по оценка', + ratingsMixFilterDesc: + 'Филтрирай нискооценени елементи в {{mix}} и {{albums}}. Кликни отново на избраната звезда, за да изключиш прага.', + ratingsMixMinSong: 'Песни', + ratingsMixMinAlbum: 'Албуми', + ratingsMixMinArtist: 'Изпълнители', + ratingsMixMinThresholdAria: 'Минимален брой звезди: {{label}}', + backupTitle: 'Резервно копие и възстановяване', + backupExport: 'Изнеси настройките', + backupExportDesc: 'Запазва всички настройки, профили на сървъри, конфигурация на Last.fm, тема, еквалайзер и клавишни комбинации във файл .psybkp. Паролите се съхраняват в четим текст — пази файла на сигурно място.', + backupImport: 'Импортирай настройките', + backupImportDesc: 'Възстановява настройките от файл .psybkp. Приложението ще се презареди след импортирането.', + backupImportConfirm: 'Това ще презапише всички текущи настройки. Продължи ли?', + backupImportAny: 'Импортирай резервно копие', + backupImportAnyConfirm: 'Импортирай избрания файл с резервно копие и приложи съдържанието му (настройки, бази данни на библиотеката или всичко). Продължи ли?', + backupSuccess: 'Резервното копие е запазено', + backupImportSuccess: 'Настройките са възстановени — презареждане…', + backupImportError: 'Невалиден или повреден файл с резервно копие.', + backupModeFull: 'Пълно', + backupModeLibrary: 'Бази данни на библиотеката', + backupModeConfig: 'Конфигурация', + backupFullDesc: 'Архивира настройките и базите данни на библиотеката в един файл с резервно копие.', + backupFullExport: 'Изнеси пълно резервно копие', + backupFullImport: 'Импортирай пълно резервно копие', + backupFullImportConfirm: 'Това ще презапише настройките, ще замени текущите бази данни на библиотеката и ще ги премести в .bak. Продължи ли?', + backupFullExportSuccess: 'Пълното резервно копие е изнесено.', + backupFullImportSuccess: 'Пълното резервно копие е импортирано — презареждане…', + backupFullImportError: 'Импортирането на пълното резервно копие се провали.', + backupLibraryExport: 'Изнеси базите данни', + backupLibraryExportDesc: 'Създава компресиран архив с чисти SQLite снимки на базите данни на библиотеката.', + backupLibraryImport: 'Импортирай базите данни', + backupLibraryImportDesc: 'Възстановява базите данни на библиотеката от архивен файл. Текущите бази данни се преместват в .bak преди смяната.', + backupLibraryImportConfirm: 'Това ще замени текущите бази данни на библиотеката и ще ги премести в .bak. Продължи ли?', + backupLibraryExportSuccess: 'Резервното копие на базите данни е изнесено.', + backupLibraryImportSuccess: 'Резервното копие на базите данни е импортирано.', + backupLibraryImportError: 'Импортирането на резервното копие на базите данни се провали.', + backupOverlayExportTitle: 'Създаване на резервно копие…', + backupOverlayImportTitle: 'Възстановяване на резервно копие…', + backupOverlayHint: 'Можеш да оставиш прозореца отворен, докато обработваме файловете. Въвеждането временно е заключено.', + shortcutsReset: 'Върни към стойностите по подразбиране', + shortcutListening: 'Натисни клавиш…', + shortcutUnbound: '—', + globalShortcutsTitle: 'Глобални клавишни комбинации', + globalShortcutsNote: 'Работят в цялата система, дори когато Psysonic е във фонов режим. Изискват Ctrl, Alt или Super като модификатор.', + shortcutClear: 'Изчисти', + shortcutPlayPause: 'Възпроизвеждане / Пауза', + shortcutNext: 'Следваща песен', + shortcutPrev: 'Предишна песен', + shortcutVolumeUp: 'Увеличи звука', + shortcutVolumeDown: 'Намали звука', + shortcutSeekForward: 'Превърти напред 10 сек', + shortcutSeekBackward: 'Превърти назад 10 сек', + shortcutToggleQueue: 'Превключи опашката', + shortcutOpenFolderBrowser: 'Отвори {{folderBrowser}}', + shortcutFullscreenPlayer: 'Плейър на цял екран', + shortcutNativeFullscreen: 'Роден цял екран', + shortcutOpenMiniPlayer: 'Отвори мини плейъра', + shortcutStartSearch: 'Започни търсене', + shortcutStartAdvancedSearch: 'Започни разширено търсене', + shortcutToggleSidebar: 'Превключи страничната лента', + shortcutMuteSound: 'Заглуши звука', + shortcutToggleEqualizer: 'Отвори / Превключи еквалайзера', + shortcutToggleRepeat: 'Превключи повторението', + shortcutOpenNowPlaying: 'Отвори „В момента звучи“', + shortcutShowLyrics: 'Покажи текста', + shortcutFavoriteCurrentTrack: 'Добави текущата песен в любими', + shortcutOpenHelp: 'Помощ', + playbackTitle: 'Възпроизвеждане', + replayGain: 'Replay Gain', + replayGainDesc: 'Изравнява силата на звука на песните с помощта на метаданните на ReplayGain', + replayGainMode: 'Режим', + replayGainAuto: 'Автоматично', + replayGainAutoDesc: 'Избира усилване на албума, когато съседните песни в опашката са от същия албум, в противен случай — усилване на песента.', + replayGainTrack: 'Песен', + replayGainAlbum: 'Албум', + replayGainPreGain: 'Предварително усилване (маркирани файлове)', + replayGainPreGainDesc: 'Общо усилване, добавено върху всяко изчисление на ReplayGain. Използвай, за да компенсираш, ако библиотеката ти звучи твърде тихо като цяло.', + replayGainFallback: 'Резервно (немаркирани / радио)', + replayGainFallbackDesc: 'Прилага се към песни (и радио потоци), които изобщо нямат етикети за ReplayGain, така че немаркираното съдържание да не звучи по-силно от останалото.', + normalization: 'Изравняване', + normalizationDesc: 'Изравнява възприеманата сила на звука между песни, албуми и радио.', + normalizationOff: 'Изключено', + normalizationReplayGain: 'ReplayGain', + normalizationLufs: 'LUFS', + loudnessTargetLufs: 'Целево ниво LUFS', + loudnessTargetLufsDesc: 'Референтна сила на звука, към която се изравняват всички песни. По-ниски числа = по-силен изход. Стрийминг услугите обикновено се движат около -14 LUFS.', + loudnessPreAnalysisAttenuation: 'Затихване преди анализ', + loudnessPreAnalysisAttenuationDesc: + 'Допълнително заглушаване, докато силата на звука за тази песен бъде запазена. Дотогава възпроизвеждането използва приблизителни оценки, не пълно измерване. 0 dB = изключено; по-ниско = по-тихо. Числото вдясно е ефективното dB за текущата ти цел.', + loudnessPreAnalysisAttenuationRef: 'Ефективно {{eff}} dB при цел {{tgt}} LUFS.', + loudnessPreAnalysisAttenuationReset: 'Върни към стойността по подразбиране', + loudnessFirstPlayNote: + 'Първото изпълнение на съвсем нова песен може за кратко да варира по сила на звука, докато се измерва. Следващото изпълнение използва кешираното измерване и е напълно стабилно. Предстоящите песни в опашката обикновено се анализират предварително по време на предишната песен, така че това рядко се случва на практика.', + crossfade: 'Преливане', + crossfadeSecs: '{{n}} сек', + autoDj: 'AutoDJ', + autoDjDesc: 'Без фиксирана продължителност — AutoDJ следва действителния звук, като смесва реални затихвания и въведения, вместо зададен брой секунди. За надеждни резултати, включи кеша за бързо възпроизвеждане.', + autodjSmoothSkip: 'Плавно прескачане', + autodjSmoothSkipDesc: 'Когато прескачаш към следваща или предишна песен по време на изпълнение, преминава плавно към нея по същите правила на AutoDJ (дължина на застъпване, изрязване на въведението) от текущата позиция, вместо рязко прекъсване. Работи най-добре, когато следващата песен вече е буферирана.', + autodjOverlapCapTitle: 'Лимит на застъпването', + autodjOverlapCapDesc: 'Ограничава колко дълго AutoDJ може да застъпва песни. Автоматично следва анализа на съдържанието (до 12 сек). Лимитът задава собствен максимум.', + autodjOverlapCapAuto: 'Автоматично', + autodjOverlapCapLimit: 'Лимит', + autodjOverlapCapSecs: '{{n}} сек', + gapless: 'Безпаузно възпроизвеждане', + transitionsTitle: 'Преходи между песни', + transitionsDesc: 'Как се сливат последователните песни. Само един режим може да е активен в даден момент.', + transitionOff: 'Изключено', + transitionsHostControlled: 'Управлява се от домакина на Orbit по време на сесията', + queueBehaviourTitle: 'Поведение на опашката', + preservePlayNextOrder: 'Запази реда на „Изпълни следваща“', + preservePlayNextOrderDesc: 'Новодобавените елементи чрез „Изпълни следваща“ се нареждат зад по-ранните, вместо да изскачат отпред.', + trackPreviewsTitle: 'Предварителни прослушвания', + trackPreviewsToggle: 'Включи предварителните прослушвания', + trackPreviewsDesc: 'Показвай вградени бутони за възпроизвеждане и прослушване в списъците с песни за бърз пример по средата на песента.', + trackPreviewStart: 'Начална позиция', + trackPreviewStartDesc: 'Колко навътре в песента започва прослушването (% от дължината на песента).', + trackPreviewDuration: 'Продължителност', + trackPreviewDurationDesc: 'Колко дълго продължава всяко прослушване, преди да спре.', + trackPreviewDurationSecs: '{{n}} сек', + trackPreviewLocationsTitle: 'Къде се появяват прослушванията', + trackPreviewLocationsDesc: 'Избери кои списъци да показват вградени бутони за прослушване.', + trackPreviewLocation_suggestions: 'В предложенията за плейлисти', + trackPreviewLocation_albums: 'В списъците с песни на албуми', + trackPreviewLocation_playlists: 'В плейлистите', + trackPreviewLocation_favorites: 'В любимите', + trackPreviewLocation_artist: 'В най-слушаните песни на изпълнителя', + trackPreviewLocation_randomMix: 'В случайния микс', + nextTrackBufferingTitle: 'Буфериране', + infiniteQueue: 'Безкрайна опашка', + infiniteQueueDesc: 'Автоматично добавя случайни песни, когато опашката свърши', + experimental: 'Експериментално', + sidebarLyricsStyle: 'Стил на превъртане на текстовете', + sidebarLyricsStyleClassic: 'Класически', + sidebarLyricsStyleClassicDesc: 'Превърта активния ред до центъра.', + sidebarLyricsStyleApple: 'Като Apple Music', + sidebarLyricsStyleAppleDesc: 'Активният ред се закача близо до върха с плавни пружинни преходи.', + seekbarStyle: 'Стил на лентата за превъртане', + seekbarStyleDesc: 'Избери вида на лентата за превъртане на плейъра', + buttonSizeTitle: 'Компактни бутони', + buttonSizeLabel: 'Размер на бутоните', + buttonSizeDesc: 'Свива бутоните за действия и лентата с инструменти до икони на страниците с детайли и прегледите.', + buttonSize_large: 'Голям', + buttonSize_small: 'Малък', + seekbarTruewave: 'Истинска вълна', + seekbarPseudowave: 'Псевдо вълна', + seekbarLinedot: 'Линия и точка', + seekbarBar: 'Лента', + seekbarThick: 'Дебела лента', + seekbarSegmented: 'Сегментирана', + seekbarNeon: 'Неоново сияние', + seekbarPulsewave: 'Пулсираща вълна', + seekbarParticletrail: 'Следа от частици', + seekbarLiquidfill: 'Течно запълване', + seekbarRetrotape: 'Ретро лента', + themeSchedulerTitle: 'Автоматична смяна на темата', + themeSchedulerEnable: 'Включи планировчика на теми', + themeSchedulerEnableSub: 'Автоматично превключва между две теми според часа на деня или системната тема', + themeSchedulerDayTheme: 'Дневна тема', + themeSchedulerDayStart: 'Денят започва в', + themeSchedulerNightTheme: 'Нощна тема', + themeSchedulerNightStart: 'Нощта започва в', + themeSchedulerActiveHint: 'Планировчикът на теми е активен — сменянето на темата се управлява автоматично.', + themeSchedulerModeLabel: 'Превключвай въз основа на', + themeSchedulerModeTime: 'Часа на деня', + themeSchedulerModeSystem: 'Системната тема', + themeSchedulerLightTheme: 'Светла тема', + themeSchedulerDarkTheme: 'Тъмна тема', + themeSchedulerSystemRestartHint: 'Промяната на системната настройка светла/тъмна влиза в сила след рестартиране на приложението.', + visualOptionsTitle: 'Визуални настройки', + coverArtBackground: 'Фон от корица', + coverArtBackgroundSub: 'Показвай размазана корица като фон в заглавията на албуми/плейлисти', + backdropSourcesTitle: 'Фонове', + backdropSourcesSub: 'Избери кое изображение да използва всяка повърхност като фон и в какъв ред да се пробват. Плъзни, за да пренаредиш, или изключи източник, за да го пропуснеш.', + backdropSurfaceMainstage: 'Начална сцена', + backdropSurfaceArtistDetail: 'Заглавие на страницата на изпълнителя', + backdropSurfaceFullscreen: 'Плейър на цял екран', + backdropSourceBanner: 'Банер', + backdropSourceFanart: 'Изображение на изпълнител от Fanart', + backdropSourceNavidrome: 'Изображение от Navidrome', + backdropMoveUp: 'Премести нагоре', + backdropMoveDown: 'Премести надолу', + playlistCoverPhoto: 'Снимка на корицата на плейлистата', + playlistCoverPhotoSub: 'Показвай мрежа от корици в изгледа с детайли на плейлистата', + showBitrate: 'Показвай битрейт', + showBitrateSub: 'Показвай аудио битрейта в списъците с песни', + floatingPlayerBar: 'Плаваща лента на плейъра', + floatingPlayerBarSub: 'Пази лентата на плейъра плаваща над съдържанието', + squareCorners: 'Прави ъгли', + squareCornersSub: 'Премахва заоблените ъгли на картите за остър, квадратен вид', + uiScaleTitle: 'Мащаб на интерфейса', + uiScaleLabel: 'Мащабиране', +}; \ No newline at end of file diff --git a/src/locales/bg/sharePaste.ts b/src/locales/bg/sharePaste.ts new file mode 100644 index 00000000..9e0cc57d --- /dev/null +++ b/src/locales/bg/sharePaste.ts @@ -0,0 +1,20 @@ +export const sharePaste = { + notLoggedIn: 'Влезте и добавете сървъра, преди да поставите линк за споделяне.', + noMatchingServer: 'Нито един запазен сървър не съвпада с този линк. Добавете сървър с този адрес: {{url}}', + trackUnavailable: 'Тази песен не е намерена на сървъра.', + albumUnavailable: 'Този албум не е намерен на сървъра.', + artistUnavailable: 'Този изпълнител не е намерен на сървъра.', + composerUnavailable: 'Този композитор не е намерен на сървъра.', + openedTrack: 'Пуска се споделена песен.', + openedAlbum: 'Отваряне на споделен албум.', + openedArtist: 'Отваряне на споделен изпълнител.', + openedComposer: 'Отваряне на споделен композитор.', + openedQueue_one: 'Пуска се {{count}} песен от линка за споделяне.', + openedQueue_other: 'Пускат се {{count}} песни от линка за споделяне.', + openedQueuePartial: + 'Пускат се {{played}} от {{total}} песни от линка ({{skipped}} не са намерени на този сървър).', + queueAllUnavailable: 'Нито една от песните от този линк не е намерена на сървъра.', + playQueue: 'Пусни опашка', + playQueueing: 'Стартиране на възпроизвеждане…', + genericError: 'Линкът за споделяне не може да бъде отворен.', +}; diff --git a/src/locales/bg/sidebar.ts b/src/locales/bg/sidebar.ts new file mode 100644 index 00000000..a9a81d97 --- /dev/null +++ b/src/locales/bg/sidebar.ts @@ -0,0 +1,45 @@ +export const sidebar = { + library: 'Библиотека', + mainstage: 'Главна сцена', + newReleases: 'Нови издания', + allAlbums: 'Всички албуми', + randomAlbums: 'Случайни албуми', + randomPicker: 'Създай микс', + artists: 'Изпълнители', + composers: 'Композитори', + randomMix: 'Случаен микс', + favorites: 'Любими', + nowPlaying: 'В момента звучи', + system: 'Система', + statistics: 'Статистика', + settings: 'Настройки', + help: 'Помощ', + expand: 'Разшири страничната лента', + collapse: 'Свий страничната лента', + + downloadingTracks: 'Кеширане на {{n}} песни…', + offlinePinActive: 'Кеширане на «{{name}}»…', + offlinePinActiveQueued: 'Кеширане на «{{name}}» · +{{queued}} на опашка', + syncingTracks: 'Синхронизиране {{done}}/{{total}}…', + cancelDownload: 'Отмени изтеглянето', + offlineLibrary: 'Офлайн библиотека', + genres: 'Жанрове', + tracks: 'Песни', + playlists: 'Плейлисти', + smartPlaylists: 'Умни плейлисти', + mostPlayed: 'Най-слушани', + losslessAlbums: 'Lossless', + radio: 'Интернет радио', + folderBrowser: 'Преглед на папки', + deviceSync: 'Синхронизация с устройство', + libraryScope: 'Обхват на библиотеката', + allLibraries: 'Всички библиотеки', + expandPlaylists: 'Разшири плейлисти', + collapsePlaylists: 'Свий плейлисти', + more: 'Още', + feelingLucky: 'Lucky Mix', + + themeUpdatesTitle: 'Актуализации на темата', + themeUpdatesTooltip: 'Налични актуализации на темата', + themeUpdatesDismiss: 'Отхвърли', +}; diff --git a/src/locales/bg/smartPlaylists.ts b/src/locales/bg/smartPlaylists.ts new file mode 100644 index 00000000..13a8d83f --- /dev/null +++ b/src/locales/bg/smartPlaylists.ts @@ -0,0 +1,41 @@ +export const smartPlaylists = { + sectionBasic: '1. Основни', + sectionGenres: '2. Жанрове', + sectionYearsAndFilters: '3. Години и филтри', + genreMode: 'Режим на жанр', + genreModeInclude: 'Включи жанрове', + genreModeExclude: 'Изключи жанрове', + genreSearchPlaceholder: 'Филтрирай жанрове...', + availableGenres: 'Налични', + selectedGenres: 'Избрани', + yearMode: 'Режим на година', + yearModeInclude: 'Включи период', + yearModeExclude: 'Изключи период', + name: 'Име (без префикс)', + limit: 'Лимит', + limitHint: 'Колко песни да се включат в плейлиста (1-{{max}}, обикновено 50).', + artistContains: 'Изпълнителят съдържа…', + albumContains: 'Албумът съдържа…', + titleContains: 'Заглавието съдържа…', + minRating: 'Минимална оценка', + minRatingAria: 'Минимална оценка за умен плейлист', + minRatingHint: '0 деактивира минималния праг; 1-5 запазва песни с оценка над избраната стойност.', + fromYear: 'От година', + toYear: 'До година', + excludeUnrated: 'Изключи неоценени песни', + compilationOnly: 'Само компилации', + create: 'Нов умен плейлист', + save: 'Запази умен плейлист', + created: '{{name}} е създаден', + updated: '{{name}} е актуализиран', + createFailed: 'Умният плейлист не може да бъде създаден.', + updateFailed: 'Умният плейлист не може да бъде актуализиран.', + navidromeOnly: 'Умни плейлисти могат да се създават само на Navidrome сървъри.', + loadFailed: 'Умните плейлисти не могат да бъдат заредени от Navidrome.', + sortRandom: 'Сортиране: случайно', + sortTitleAsc: 'Сортиране: заглавие А-Я', + sortTitleDesc: 'Сортиране: заглавие Я-А', + sortYearDesc: 'Сортиране: година низходящо', + sortYearAsc: 'Сортиране: година възходящо', + sortPlayCountDesc: 'Сортиране: брой пускания низходящо', +}; diff --git a/src/locales/bg/songInfo.ts b/src/locales/bg/songInfo.ts new file mode 100644 index 00000000..ad9ccb1d --- /dev/null +++ b/src/locales/bg/songInfo.ts @@ -0,0 +1,27 @@ +export const songInfo = { + title: 'Инфо за песента', + songTitle: 'Заглавие', + artist: 'Изпълнител', + album: 'Албум', + albumArtist: 'Изпълнител на албума', + year: 'Година', + genre: 'Жанр', + duration: 'Продължителност', + track: 'Песен', + bpm: 'BPM', + mood: 'Настроение', + playCount: 'Брой пускания', + lastPlayed: 'Последно пусната', + format: 'Формат', + bitrate: 'Битрейт', + sampleRate: 'Честота на дискретизация', + bitDepth: 'Битова дълбочина', + channels: 'Канали', + fileSize: 'Размер на файла', + path: 'Път', + replayGainTrack: 'RG усилване на песен', + replayGainAlbum: 'RG усилване на албум', + replayGainPeak: 'RG пиково на песен', + mono: 'Моно', + stereo: 'Стерео', +}; diff --git a/src/locales/bg/statistics.ts b/src/locales/bg/statistics.ts new file mode 100644 index 00000000..f95f784c --- /dev/null +++ b/src/locales/bg/statistics.ts @@ -0,0 +1,93 @@ +export const statistics = { + title: 'Статистика', + recentlyPlayed: 'Наскоро пуснати', + mostPlayed: 'Най-често пускани албуми', + highestRated: 'Албуми с най-висок рейтинг', + genreDistribution: 'Разпределение по жанрове (Топ 20)', + loadMore: 'Зареди още', + statArtists: 'Изпълнители', + statArtistsTooltip: 'Само албумни изпълнители — изпълнители, които се появяват само като изпълнители на ниво песен (гост, поддържащ и т.н.) без собствен албум, не се включват.', + statAlbums: 'Албуми', + statSongs: 'Песни', + statGenres: 'Жанрове', + statPlaytime: 'Общо време на слушане', + genreInsights: 'Прозрения за жанрове', + formatDistribution: 'Разпределение по формат', + formatSample: 'Извадка от {{n}} песни', + computing: 'Изчисляване…', + genreSongs: '{{count}} песни', + genreAlbums: '{{count}} албуми', + recentlyAdded: 'Наскоро добавени', + decadeDistribution: 'Албуми по десетилетия', + decadeAlbums_one: '{{count}} албум', + decadeAlbums_other: '{{count}} албуми', + decadeUnknown: 'Неизвестно', + lfmTitle: 'Статистика от {{provider}}', + lfmTopArtists: 'Топ изпълнители', + lfmTopAlbums: 'Топ албуми', + lfmTopTracks: 'Топ песни', + lfmPlays: '{{count}} пускания', + lfmPeriodOverall: 'За цялото време', + lfmPeriod7day: '7 дни', + lfmPeriod1month: '1 месец', + lfmPeriod3month: '3 месеца', + lfmPeriod6month: '6 месеца', + lfmPeriod12month: '12 месеца', + lfmRecentTracks: 'Скорошни скроблинги', + lfmNowPlaying: 'В момента звучи', + lfmJustNow: 'току-що', + lfmMinutesAgo: 'преди {{n}} мин', + lfmHoursAgo: 'преди {{n}} ч', + lfmDaysAgo: 'преди {{n}} д', + topRatedSongs: 'Песни с най-висок рейтинг', + topRatedArtists: 'Изпълнители с най-висок рейтинг', + noRatedSongs: 'Все още няма оценени песни. Оценявайте песни в изгледа на албум или плейлист.', + noRatedArtists: 'Все още няма оценени изпълнители.', + exportShare: 'Сподели', + exportTitle: 'Сподели топ албуми', + exportSubtitle: 'Генерирайте изображение за споделяне с най-често пусканите ви албуми.', + exportFormat: 'Формат', + exportFormatStory: 'История', + exportFormatSquare: 'Квадрат', + exportFormatTwitter: 'Twitter карта', + exportGrid: 'Решетка', + exportGridLabel: '{{n}}×{{n}}', + exportPreview: 'Преглед', + exportGenerate: 'Генерирай', + exportSave: 'Запази изображение…', + exportCancel: 'Отказ', + exportFooterLabel: 'Топ албуми', + exportNotEnough: 'Нужни са поне {{count}} албума в библиотеката ви за решетка {{n}}×{{n}}.', + exportSaving: 'Запазване…', + exportSaved: 'Запазено.', + exportSaveFailed: 'Изображението не можа да бъде запазено.', + tabServer: 'Статистика на сървъра', + tabPlayer: 'Статистика на плейъра', + playerEmpty: 'Започнете да слушате — локалната ви история на пускания ще се появи тук.', + playerSummaryTime: 'Време на слушане', + playerListeningDayShort: '{{count}}д', + playerListeningHourShort: '{{count}}ч', + playerListeningMinuteShort: '{{count}}мин', + playerSummarySessions: 'Сесии', + playerSummaryTracks: 'Пускания на песни', + playerSummaryUniqueTracks: 'Уникални песни', + playerSummaryDays: 'Дни', + playerIndexRequired: 'Статистиката на плейъра изисква поне един конфигуриран сървър.', + playerPartialIndexSettings: 'Настройки на сървъра', + playerSummaryCompletion: 'Пълни / частични', + playerYearPrev: 'Предишна година', + playerYearNext: 'Следваща година', + playerHeatmapLegend: 'По-тъмни клетки = повече песни, пуснати през този ден.', + playerHeatmapLess: 'По-малко', + playerHeatmapMore: 'Повече', + playerDaySessions: '{{count}} сесии', + playerDayTrackPlays: '{{count}} песни', + playerDayFullPartial: '{{full}} пълни · {{partial}} частични', + playerRecentDaysTitle: 'Последни дни', + playerDayToday: 'Днес', + playerDayYesterday: 'Вчера', + playerListenedSecShort: '{{seconds}}с', + playerListenedMinDecimal: '{{minutes}} мин', + completionFull: 'Пълно слушане', + completionPartial: 'Частично', +}; diff --git a/src/locales/bg/tracks.ts b/src/locales/bg/tracks.ts new file mode 100644 index 00000000..c11b58d0 --- /dev/null +++ b/src/locales/bg/tracks.ts @@ -0,0 +1,16 @@ +export const tracks = { + title: 'Песни', + subtitle: 'Разглеждай. Търси. Откривай.', + heroEyebrow: 'Песен на момента', + heroReroll: 'Избери друга', + playSong: 'Пусни', + enqueueSong: 'Добави в опашката', + toAlbum: 'Към албум', + railRandom: 'Случаен избор', + railHighlyRated: 'Високо оценени', + browseTitle: 'Разгледай всички песни', + browseUnsupported: 'Този сървър не изброява цялата библиотека наведнъж. Използвайте търсенето по-горе, за да намерите конкретни песни.', + searchPlaceholder: 'Намерете песен по заглавие, изпълнител или албум…', + count_one: '{{count}} песен', + count_other: '{{count}} песни', +}; diff --git a/src/locales/bg/tray.ts b/src/locales/bg/tray.ts new file mode 100644 index 00000000..e91c2457 --- /dev/null +++ b/src/locales/bg/tray.ts @@ -0,0 +1,8 @@ +export const tray = { + playPause: 'Пусни / Пауза', + nextTrack: 'Следваща песен', + previousTrack: 'Предишна песен', + showHide: 'Покажи / Скрий', + exitPsysonic: 'Изход от Psysonic', + nothingPlaying: 'Нищо не се пуска', +}; diff --git a/src/locales/bg/whatsNew.ts b/src/locales/bg/whatsNew.ts new file mode 100644 index 00000000..bcb8b23c --- /dev/null +++ b/src/locales/bg/whatsNew.ts @@ -0,0 +1,12 @@ +export const whatsNew = { + title: 'Какво ново', + changelogTitle: 'История на промените', + viewTabsLabel: 'Изглед на бележки за издания', + viewHighlights: 'Акценти', + viewChangelog: 'История на промените', + empty: 'Все още няма запис в историята за тази версия.', + bannerTitle: 'История на промените', + bannerCollapsed: 'Какво ново във v{{version}}', + dismiss: 'Отхвърли', + close: 'Затвори', +}; diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts index 0c883c1d..4aaf3c98 100644 --- a/src/locales/de/settings.ts +++ b/src/locales/de/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', 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 e5374e86..ffbcaab7 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', 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 f03f67ae..fad8da1e 100644 --- a/src/locales/es/settings.ts +++ b/src/locales/es/settings.ts @@ -11,6 +11,7 @@ export const settings = { languageZh: '中文', languageRo: 'Română', languagePl: 'Polski', + languageBg: 'Български', languageJa: '日本語', languageHu: 'Magyar', font: 'Fuente', diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts index 5bc32b94..985b6159 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', font: 'Police', fontHintOpenDyslexic: 'Adapté à la dyslexie · sans prise en charge du chinois', theme: 'Thème', diff --git a/src/locales/hu/settings.ts b/src/locales/hu/settings.ts index 746aa700..f5b8ecec 100644 --- a/src/locales/hu/settings.ts +++ b/src/locales/hu/settings.ts @@ -12,6 +12,8 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', + languageBg: 'Български', font: 'Betűtípus', fontHintOpenDyslexic: 'Diszlexiabarát · nincs kínai támogatás', theme: 'Téma', diff --git a/src/locales/ja/settings.ts b/src/locales/ja/settings.ts index 0c914735..34db52c0 100644 --- a/src/locales/ja/settings.ts +++ b/src/locales/ja/settings.ts @@ -12,6 +12,8 @@ export const settings = { languageRo: 'Română', languageJa: '日本語', languageHu: 'Magyar', + languagePl: 'Polski', + languageBg: 'Български', font: 'フォント', fontHintOpenDyslexic: 'ディスレクシアに配慮 · 中国語非対応', theme: 'テーマ', diff --git a/src/locales/nb/settings.ts b/src/locales/nb/settings.ts index bc39afdf..cb8d641b 100644 --- a/src/locales/nb/settings.ts +++ b/src/locales/nb/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', 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 f5173cf7..7d1c4010 100644 --- a/src/locales/nl/settings.ts +++ b/src/locales/nl/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', font: 'Lettertype', fontHintOpenDyslexic: 'Dyslexie-vriendelijk · geen Chinese ondersteuning', theme: 'Thema', diff --git a/src/locales/pl/settings.ts b/src/locales/pl/settings.ts index 816d2fd0..3b4ab66b 100644 --- a/src/locales/pl/settings.ts +++ b/src/locales/pl/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', font: 'Czcionka', fontHintOpenDyslexic: 'Przyjazna dla dyslektyków · brak obsługi chińskiego', theme: 'Motyw', diff --git a/src/locales/ro/settings.ts b/src/locales/ro/settings.ts index 538ff4bc..6c560184 100644 --- a/src/locales/ro/settings.ts +++ b/src/locales/ro/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Bulgară', 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 88c11aee..4476e112 100644 --- a/src/locales/ru/settings.ts +++ b/src/locales/ru/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', font: 'Шрифт', fontHintOpenDyslexic: 'Подходит для дислексии · без поддержки китайского', theme: 'Тема', diff --git a/src/locales/zh/settings.ts b/src/locales/zh/settings.ts index 8c34aba0..1ada528c 100644 --- a/src/locales/zh/settings.ts +++ b/src/locales/zh/settings.ts @@ -13,6 +13,7 @@ export const settings = { languageJa: '日本語', languageHu: 'Magyar', languagePl: 'Polski', + languageBg: 'Български', font: '字体', fontHintOpenDyslexic: '阅读障碍友好 · 不支持中文', theme: '主题',