Files
Psychotoxical-psysonic/src/locales/ru.ts
T
Frank Stellmacher bd56177e2c feat(home): Lossless Albums rail + dedicated page + sidebar nav (#506)
* wip(home): Lossless rail + dedicated /lossless-albums page

Rail under Home > mostPlayed and a dedicated infinite-scroll page that
list albums whose tracks are tagged in lossless containers. Walks
Navidrome's native /api/song?_sort=bit_depth&_order=DESC, dedupes by
albumId on the way down, stops when the song stream crosses into lossy
(bitDepth==0) or the server runs out of rows. _filters has no operators
on quality columns, so a sort + walk is the only path; equality on
sample_rate / bit_depth probes returned empty (verified).

The page paginates through the song-cursor with an in-flight ref so
overlapping IntersectionObserver fires don't double-add albums, plus a
cancelled flag so React StrictMode's double-mount doesn't apply two
parallel result sets in dev.

Suffix allowlist excludes ambiguous wrappers — m4a/m4b can be ALAC
*or* AAC and Navidrome's response carries an empty codec field, so we
can't tell them apart; same story for wma. Allowlist is flac, wav,
aiff/aif, dsf/dff, ape, wv, shn, tta — containers that are only
lossless. ALAC-in-m4a setups will miss out, acceptable trade-off
without a reliable codec field.

Status: WIP. Settings home-customizer label and en.ts strings landed,
no other locales yet, no quality badge on AlbumCards across the rest of
the app, no CHANGELOG. Branch was 'feat/home-hires-rail' during the
earlier hi-res-only iteration before the lossless broadening.

* wip(home): Lossless page header parity + streaming + sidebar nav

Page header now mirrors All Albums: selection mode with three action
buttons (Enqueue Selected, Add Offline, Download ZIPs) wired to the
same handlers Albums.tsx uses, selection-counter title swap, and the
perfFlags.disableMainstageStickyHeader respect path. Filters were
intentionally skipped — the rail is sorted by bit_depth, mixing client-
side filters with server-driven pagination would produce gaps.

Loading feels noticeably faster: ndListLosslessAlbumsPage takes an
optional onProgress callback that fires once per internal fetch with
the entries discovered in that fetch, so the page can stream new
albums into state instead of waiting on the whole loadMore. Page-side
budget dropped from 5×200 to 2×100 songs per loadMore (~1 MB worst
case vs 5 MB before), since the rail's catch-em-all pass is wrong for
infinite-scroll UX. Subtitle under the page title primes the user that
this is slower than other album pages because Psysonic walks the song
catalog by quality (Navidrome ignores _fields, so per-song responses
ship with lyrics + tags + participants whether we want them or not).

Sidebar nav entry registered under 'losslessAlbums' with a Gem icon,
defaults to visible:false (matches composers / folderBrowser /
deviceSync — niche browsing modes). Existing users get the entry
appended at the end of their persisted sidebar list automatically via
the onRehydrateStorage merge that sidebarStore already runs for new
DEFAULT_SIDEBAR_ITEMS.

i18n: full coverage across all 8 locales for sidebar.losslessAlbums,
home.losslessAlbums, losslessAlbums.empty, losslessAlbums.unsupported
and the new losslessAlbums.slowFetchHint subtitle. ru/zh are
machine-translation quality, flagged for a polish pass.

* feat(home): default Lossless sidebar entry to visible

Flips the DEFAULT_SIDEBAR_ITEMS entry for `losslessAlbums` from false
to true. Existing installs keep whatever the user has in persisted
storage; fresh installs see the entry in the sidebar from the start.

Earlier wip commit defaulted it off (matched composers / folderBrowser
/ deviceSync as a niche browse mode), but the rail + page do show
something useful for any library with at least one FLAC/WAV/etc. album,
so off-by-default just hid the feature.

* docs: changelog entry for PR #506

Logs the Lossless Albums rail + page + sidebar entry in v1.46.0
"## Added".

* docs(settings): contributor entry for PR #506

Adds the Lossless Albums rail/page bullet to Psychotoxical's
contributions list.
2026-05-07 20:44:27 +02:00

1861 lines
145 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/** Russian UI strings — natural phrasing for a music desktop app */
export const ruTranslation = {
sidebar: {
library: 'Медиатека',
mainstage: 'Для вас',
newReleases: 'Новинки',
allAlbums: 'Все альбомы',
randomAlbums: 'Случайные альбомы',
randomPicker: 'Собрать микс',
artists: 'Исполнители',
composers: 'Композиторы',
randomMix: 'Случайный микс',
favorites: 'Избранное',
nowPlaying: 'Сейчас играет',
system: 'Система',
statistics: 'Статистика',
settings: 'Настройки',
help: 'Справка',
expand: 'Развернуть боковую панель',
collapse: 'Свернуть боковую панель',
downloadingTracks: 'Кэширование {{n}} треков…',
syncingTracks: 'Синхронизация {{done}}/{{total}}…',
cancelDownload: 'Отменить загрузку',
offlineLibrary: 'Офлайн-библиотека',
genres: 'Жанры',
tracks: 'Треки',
playlists: 'Плейлисты',
smartPlaylists: 'Смарт-плейлисты',
mostPlayed: 'Популярное',
losslessAlbums: 'Lossless',
radio: 'Онлайн-радио',
folderBrowser: 'Браузер папок',
deviceSync: 'Синхронизация устройства',
libraryScope: 'Область медиатеки',
allLibraries: 'Все библиотеки',
expandPlaylists: 'Развернуть плейлисты',
collapsePlaylists: 'Свернуть плейлисты',
more: 'Ещё',
feelingLucky: 'Мне повезёт',
},
home: {
hero: 'Подборка',
starred: 'Личное избранное',
recent: 'Недавно добавлено',
mostPlayed: 'Популярное',
recentlyPlayed: 'Недавно проиграно',
losslessAlbums: 'Lossless-альбомы',
discover: 'Обзор',
discoverSongs: 'Открыть треки',
loadMore: 'Ещё',
discoverMore: 'Смотреть ещё',
discoverArtists: 'Исполнители',
discoverArtistsMore: 'Все исполнители',
becauseYouLike: 'Потому что вы слушали…',
becauseYouLikeFor: 'Потому что вы слушали {{artist}}',
similarTo: 'Похоже на {{artist}}',
becauseYouLikeTracks_one: '{{count}} трек',
becauseYouLikeTracks_few: '{{count}} трека',
becauseYouLikeTracks_many: '{{count}} треков',
becauseYouLikeTracks_other: '{{count}} треков',
},
hero: {
eyebrow: 'Альбом дня',
playAlbum: 'Воспроизвести альбом',
enqueue: 'В очередь',
enqueueTooltip: 'Добавить весь альбом в очередь',
},
search: {
placeholder: 'Исполнитель, альбом или трек…',
noResults: 'Ничего не найдено по запросу «{{query}}»',
artists: 'Исполнители',
albums: 'Альбомы',
songs: 'Треки',
clearLabel: 'Очистить поиск',
addedToQueueToast: '«{{title}}» добавлен в очередь',
title: 'Поиск',
resultsFor: 'Результаты по «{{query}}»',
album: 'Альбом',
advanced: 'Расширенный поиск',
advancedSearchTerm: 'Поисковый запрос',
advancedSearchPlaceholder: 'Название, альбом, исполнитель…',
advancedGenre: 'Жанр',
advancedAllGenres: 'Все жанры',
advancedYear: 'Год',
advancedYearFrom: 'от',
advancedYearTo: 'до',
advancedAll: 'Все',
advancedSearch: 'Найти',
advancedEmpty: 'Введите запрос или выберите фильтр.',
advancedNoResults: 'Ничего не найдено.',
advancedGenreNote: 'Треки выбираются случайно в рамках жанра.',
recentSearches: 'Недавние запросы',
browse: 'Обзор',
emptyHint: 'Что хочешь послушать?',
genres: 'Жанры',
},
nowPlaying: {
tooltip: 'Кто сейчас слушает?',
title: 'Кто сейчас слушает?',
loading: 'Загрузка…',
nobody: 'Сейчас никто не слушает.',
minutesAgo: '{{n}} мин назад',
nothingPlaying: 'Пока ничего не играет — включите трек.',
aboutArtist: 'Об исполнителе',
fromAlbum: 'Из этого альбома',
viewAlbum: 'Просмотр альбома',
goToArtist: 'Перейти к исполнителю',
readMore: 'Читать далее',
showLess: 'Свернуть',
genreInfo: 'Жанр',
trackInfo: 'О треке',
topSongs: 'Самое популярное у этого исполнителя',
topSongsCredit: 'Топ-треки исполнителя {{name}}',
trackPosition: 'Трек {{pos}}',
playsCount_one: '{{count}} прослушивание',
playsCount_few: '{{count}} прослушивания',
playsCount_many: '{{count}} прослушиваний',
playsCount_other: '{{count}} прослушиваний',
releasedYearsAgo_one: '{{count}} год назад',
releasedYearsAgo_few: '{{count}} года назад',
releasedYearsAgo_many: '{{count}} лет назад',
releasedYearsAgo_other: '{{count}} лет назад',
discography: 'Дискография',
lastfmStats: 'Статистика Last.fm',
thisTrack: 'Этот трек',
thisArtist: 'Этот исполнитель',
listeners: 'слушателей',
scrobbles: 'прослушиваний',
yourScrobbles: 'вами',
listenersN: '{{n}} слушателей',
scrobblesN: '{{n}} прослушиваний',
playsByYouN: 'прослушано вами {{n}}×',
openTrackOnLastfm: 'Трек на Last.fm',
openArtistOnLastfm: 'Исполнитель на Last.fm',
rgTrackTooltip: 'ReplayGain (трек)',
rgAlbumTooltip: 'ReplayGain (альбом)',
rgAutoTooltip: 'ReplayGain (авто)',
showMoreTracks: 'Показать ещё {{count}}',
showLessTracks: 'Свернуть',
hideCard: 'Скрыть карточку',
layoutMenu: 'Макет',
visibleCards: 'Видимые карточки',
hiddenCards: 'Скрытые карточки',
noHiddenCards: 'Нет скрытых карточек',
resetLayout: 'Сбросить макет',
emptyColumn: 'Перетащите карточки сюда',
},
contextMenu: {
playNow: 'Играть сейчас',
playNext: 'Играть следующим',
addToQueue: 'В конец очереди',
enqueueAlbum: 'Альбом в очередь',
enqueueAlbums_one: '{{count}} альбом в очередь',
enqueueAlbums_few: '{{count}} альбома в очередь',
enqueueAlbums_many: '{{count}} альбомов в очередь',
enqueueAlbums_other: '{{count}} альбомов в очередь',
startRadio: 'Радио по похожим',
instantMix: 'Instant Mix',
instantMixFailed: 'Не удалось собрать Instant Mix — ошибка сервера или плагина.',
cliMixNeedsTrack: 'Ничего не играет — сначала начните воспроизведение, затем снова выполните команду микса.',
lfmLove: 'Любимое на Last.fm',
lfmUnlove: 'Убрать с Last.fm',
favorite: 'В избранное',
favoriteArtist: 'Исполнитель в избранное',
favoriteAlbum: 'Альбом в избранное',
unfavorite: 'Убрать из избранного',
unfavoriteArtist: 'Убрать исполнителя из избранного',
unfavoriteAlbum: 'Убрать альбом из избранного',
removeFromQueue: 'Убрать из очереди',
removeFromPlaylist: 'Убрать из плейлиста',
openAlbum: 'Открыть альбом',
goToArtist: 'К исполнителю',
download: 'Скачать (ZIP)',
addToPlaylist: 'В плейлист',
selectedPlaylists: '{{count}} плейлистов выбрано',
selectedAlbums: '{{count}} альбомов выбрано',
selectedArtists: '{{count}} исполнителей выбрано',
songInfo: 'Сведения о треке',
shareLink: 'Копировать ссылку для обмена',
shareCopied: 'Ссылка для обмена скопирована в буфер.',
shareCopyFailed: 'Не удалось скопировать в буфер.',
},
sharePaste: {
notLoggedIn: 'Войдите и добавьте сервер, затем вставьте ссылку.',
noMatchingServer: 'Ни один сохранённый сервер не совпадает с адресом из ссылки. Добавьте сервер: {{url}}',
trackUnavailable: 'Трек на сервере не найден.',
albumUnavailable: 'Альбом на сервере не найден.',
artistUnavailable: 'Исполнитель на сервере не найден.',
composerUnavailable: 'Композитор на сервере не найден.',
openedTrack: 'Воспроизводится присланный трек.',
openedAlbum: 'Открывается присланный альбом.',
openedArtist: 'Открывается присланный исполнитель.',
openedComposer: 'Открывается присланный композитор.',
openedQueue_one: 'Воспроизводится присланная очередь: {{count}} трек.',
openedQueue_few: 'Воспроизводится присланная очередь: {{count}} трека.',
openedQueue_many: 'Воспроизводится присланная очередь: {{count}} треков.',
openedQueue_other: 'Воспроизводится присланная очередь: {{count}} треков.',
openedQueuePartial:
'Воспроизводится {{played}} из {{total}} треков по ссылке ({{skipped}} на этом сервере не найдены).',
queueAllUnavailable: 'Ни один из треков по ссылке не найден на сервере.',
genericError: 'Не удалось открыть ссылку для обмена.',
},
albumDetail: {
back: 'Назад',
orbitDoubleClickHint: 'Двойной клик, чтобы добавить этот трек в очередь Orbit',
playAll: 'Воспроизвести всё',
shareAlbum: 'Поделиться альбомом',
enqueue: 'В очередь',
enqueueTooltip: 'Добавить весь альбом в очередь',
artistBio: 'Биография',
download: 'Скачать (ZIP)',
downloading: 'Загрузка…',
cacheOffline: 'Сохранить офлайн',
offlineCached: 'Доступно офлайн',
offlineDownloading: 'Кэширование… ({{n}} из {{total}})',
removeOffline: 'Удалить офлайн-копию',
offlineStorageFull:
'Место для офлайн закончилось (лимит {{mb}} МБ). Освободите место в офлайн-библиотеке или увеличьте лимит в настройках.',
offlineStorageGoToLibrary: 'Офлайн-библиотека',
offlineStorageGoToSettings: 'Настройки',
favoriteAdd: 'В избранное',
favoriteRemove: 'Убрать из избранного',
favorite: 'Избранное',
noBio: 'Биография недоступна.',
moreByArtist: 'Ещё от {{artist}}',
tracksCount: 'Композиций: {{n}}',
goToArtist: 'Перейти к {{artist}}',
moreLabelAlbums: 'Другие альбомы на {{label}}',
trackTitle: 'Название',
trackAlbum: 'Альбом',
trackArtist: 'Исполнитель',
trackGenre: 'Жанр',
trackFormat: 'Формат',
trackFavorite: 'Избранное',
trackRating: 'Оценка',
trackDuration: 'Длительность',
trackTotal: 'Итого',
columns: 'Колонки',
resetColumns: 'Сбросить',
notFound: 'Альбом не найден.',
bioModal: 'Биография исполнителя',
bioClose: 'Закрыть',
ratingLabel: 'Оценка',
enlargeCover: 'Увеличить обложку',
filterSongs: 'Фильтр треков…',
sortNatural: 'По умолчанию',
sortByTitle: 'А–Я (название)',
sortByArtist: 'А–Я (исполнитель)',
sortByAlbum: 'А–Я (альбом)',
},
entityRating: {
albumShort: 'Оценка альбома',
artistShort: 'Оценка исполнителя',
albumAriaLabel: 'Оценка альбома',
artistAriaLabel: 'Оценка исполнителя',
selectedArtistsRatingAriaLabel: 'Звёздная оценка для выбранных исполнителей ({{count}})',
selectedAlbumsRatingAriaLabel: 'Звёздная оценка для выбранных альбомов ({{count}})',
saveFailed: 'Не удалось сохранить оценку.',
},
artistDetail: {
back: 'Назад',
albums: 'Альбомы',
album: 'Альбом',
playAll: 'Воспроизвести всё',
shareArtist: 'Поделиться исполнителем',
shuffle: 'Перемешать',
radio: 'Радио',
loading: 'Загрузка…',
noRadio: 'Похожие треки для этого исполнителя не найдены.',
notFound: 'Исполнитель не найден.',
albumsBy: 'Альбомы — {{name}}',
topTracks: 'Популярные треки',
noAlbums: 'Альбомов нет.',
trackTitle: 'Название',
trackAlbum: 'Альбом',
trackDuration: 'Длительность',
favoriteAdd: 'В избранное',
favoriteRemove: 'Убрать из избранного',
favorite: 'Избранное',
albumCount_one: '{{count}} альбом',
albumCount_few: '{{count}} альбома',
albumCount_many: '{{count}} альбомов',
albumCount_other: '{{count}} альбомов',
openedInBrowser: 'Открыто в браузере',
featuredOn: 'Также участвует в',
similarArtists: 'Похожие исполнители',
cacheOffline: 'Сохранить дискографию офлайн',
offlineCached: 'Дискография сохранена',
offlineDownloading: 'Кэширование… ({{done}} из {{total}} альбомов)',
uploadImage: 'Загрузить фото исполнителя',
uploadImageError: 'Не удалось загрузить изображение',
releaseTypes: {
album: 'Альбом',
ep: 'EP',
single: 'Сингл',
compilation: 'Сборник',
live: 'Концерт',
soundtrack: 'Саундтрек',
remix: 'Ремикс',
other: 'Другое',
},
},
favorites: {
title: 'Избранное',
empty: 'Пока ничего не отмечено звёздочкой.',
artists: 'Исполнители',
albums: 'Альбомы',
songs: 'Треки',
enqueueAll: 'Всё в очередь',
playAll: 'Воспроизвести всё',
removeSong: 'Убрать из избранного',
stations: 'Радиостанции',
showingFiltered: 'Показано {{filtered}} из {{total}} ({{artist}})',
showingCount: 'Показано {{filtered}} из {{total}}',
clearArtistFilter: 'Сбросить фильтр исполнителя',
noFilterResults: 'Нет результатов с выбранными фильтрами.',
allArtists: 'Все исполнители',
topArtists: 'Топ исполнителей по избранному',
topArtistsSongCount_one: '{{count}} трек',
topArtistsSongCount_few: '{{count}} трека',
topArtistsSongCount_many: '{{count}} треков',
topArtistsSongCount_other: '{{count}} трека',
},
randomLanding: {
title: 'Собрать микс',
mixByTracks: 'Микс по трекам',
mixByTracksDesc: 'Случайная подборка треков со всей медиатеки',
mixByAlbums: 'Микс по альбомам',
mixByAlbumsDesc: 'Случайная подборка альбомов для открытий',
mixByLucky: 'Мне повезёт',
mixByLuckyDesc: 'Умный Instant Mix из топ-артистов, альбомов и высоких оценок',
},
randomAlbums: {
title: 'Случайные альбомы',
refresh: 'Обновить',
},
genres: {
title: 'Жанры',
genreCount: 'Жанры',
albumCount_one: '{{count}} альбом',
albumCount_few: '{{count}} альбома',
albumCount_many: '{{count}} альбомов',
albumCount_other: '{{count}} альбомов',
loading: 'Загрузка жанров…',
empty: 'Жанры не найдены.',
albumsLoading: 'Загрузка альбомов…',
albumsEmpty: 'В этом жанре альбомов нет.',
loadMore: 'Ещё',
back: 'Назад',
},
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: 'На сервере нет данных о жанрах.',
shuffleGenres: 'Другие жанры',
filterPanelTitle: 'Фильтры',
filterPanelDesc:
'Нажмите на тег жанра или имя исполнителя в списке ниже, чтобы исключить их из будущих миксов.',
genreClickHint:
'Нажмите на тег жанра — слово попадёт в фильтр.\nУчитываются жанр, название, альбом и исполнитель.',
},
luckyMix: {
done: '«Мне повезёт» готово: {{count}} треков',
failed: 'Не удалось собрать микс «Мне повезёт». Попробуйте ещё раз.',
unavailable: '«Мне повезёт» недоступен на этом сервере.',
cancelTooltip: 'Отменить сборку микса «Мне повезёт»',
},
albums: {
title: 'Все альбомы',
sortByName: 'А–Я (альбом)',
sortByArtist: 'А–Я (исполнитель)',
sortNewest: 'Сначала новые',
sortRandom: 'Случайно',
yearFrom: 'С',
yearTo: 'По',
yearFilterClear: 'Сбросить год',
yearFilterLabel: 'Год',
compilationLabel: 'Сборники',
compilationOnly: 'Только сборники',
compilationHide: 'Скрыть сборники',
compilationTooltipAll: 'Все альбомы · клик: только сборники',
compilationTooltipOnly: 'Только сборники · клик: скрыть сборники',
compilationTooltipHide: 'Сборники скрыты · клик: показать всё',
select: 'Множественный выбор',
startSelect: 'Включить множественный выбор',
cancelSelect: 'Отмена',
selectionCount: '{{count}} выбрано',
downloadZips: 'Скачать ZIP-архивы',
addOffline: 'Добавить офлайн',
enqueueSelected_one: 'В очередь ({{count}})',
enqueueSelected_few: 'В очередь ({{count}})',
enqueueSelected_many: 'В очередь ({{count}})',
enqueueSelected_other: 'В очередь ({{count}})',
enqueueQueued_one: '{{count}} альбом добавлен в очередь',
enqueueQueued_few: '{{count}} альбома добавлены в очередь',
enqueueQueued_many: '{{count}} альбомов добавлены в очередь',
enqueueQueued_other: '{{count}} альбомов добавлены в очередь',
downloadingZip: 'Загрузка {{current}}/{{total}}: {{name}}',
downloadZipDone: '{{count}} ZIP-архив(ов) загружено',
downloadZipFailed: 'Не удалось скачать {{name}}',
offlineQueuing: 'Добавление {{count}} альбом(ов) в офлайн…',
offlineFailed: 'Не удалось добавить {{name}} офлайн',
},
tracks: {
title: 'Треки',
subtitle: 'Листать. Искать. Открывать.',
heroEyebrow: 'Трек момента',
heroReroll: 'Выбрать другой',
playSong: 'Воспроизвести',
enqueueSong: 'В очередь',
railRandom: 'Случайная подборка',
railHighlyRated: 'Высоко оценённые',
browseTitle: 'Просмотреть все треки',
browseUnsupported: 'Этот сервер не возвращает всю библиотеку сразу. Воспользуйтесь поиском выше, чтобы найти конкретные треки.',
searchPlaceholder: 'Найти трек по названию, исполнителю или альбому…',
count_one: '{{count}} трек',
count_few: '{{count}} трека',
count_many: '{{count}} треков',
count_other: '{{count}} треков',
},
artists: {
title: 'Исполнители',
search: 'Поиск…',
all: 'Все',
gridView: 'Сетка',
listView: 'Список',
imagesOn: 'Фото исполнителей — больше трафика и нагрузка на систему',
imagesOff: 'Только инициалы — экономнее по трафику',
loadMore: 'Ещё',
notFound: 'Исполнители не найдены.',
albumCount_one: '{{count}} альбом',
albumCount_few: '{{count}} альбома',
albumCount_many: '{{count}} альбомов',
albumCount_other: '{{count}} альбомов',
selectionCount: '{{count}} выбрано',
select: 'Множественный выбор',
startSelect: 'Включить множественный выбор',
cancelSelect: 'Отмена',
addToPlaylist: 'В плейлист',
},
composers: {
title: 'Композиторы',
search: 'Поиск…',
notFound: 'Композиторы не найдены.',
unsupported: 'Просмотр по композиторам требует Navidrome 0.55 или новее.',
loadFailed: 'Не удалось загрузить композиторов.',
retry: 'Повторить',
involvedIn_one: 'Участие в {{count}} альбоме',
involvedIn_other: 'Участие в {{count}} альбомах',
},
composerDetail: {
back: 'Назад',
notFound: 'Композитор не найден.',
about: 'Об этом композиторе',
works: 'Произведения',
noWorks: 'Произведения не найдены.',
workCount_one: '{{count}} произведение',
workCount_other: '{{count}} произведений',
shareComposer: 'Поделиться композитором',
unknownComposer: 'Композитор',
},
login: {
subtitle: 'Десктопный клиент для Navidrome',
serverName: 'Название сервера (необязательно)',
serverNamePlaceholder: 'Мой Navidrome',
serverUrl: 'Адрес сервера',
serverUrlPlaceholder: '192.168.1.100:4533 или https://music.example.com',
username: 'Логин',
usernamePlaceholder: 'admin',
password: 'Пароль',
showPassword: 'Показать пароль',
hidePassword: 'Скрыть пароль',
connect: 'Подключиться',
connecting: 'Подключение…',
connected: 'Готово!',
error: 'Не удалось подключиться — проверьте данные.',
urlRequired: 'Укажите адрес сервера.',
savedServers: 'Сохранённые серверы',
addNew: 'Или добавить новый сервер',
orMagicString: 'Или magic string',
magicStringPlaceholder: 'Вставьте строку приглашения (psysonic1-…)',
magicStringInvalid: 'Неверная или нечитаемая magic string.',
},
connection: {
connected: 'Подключено',
connectedTo: 'Сервер: {{server}}',
disconnected: 'Нет связи',
disconnectedFrom: 'Сервер {{server}} недоступен — нажмите для настроек',
checking: 'Подключение…',
extern: 'Внешний',
offlineTitle: 'Нет связи с сервером',
offlineSubtitle: 'Сервер {{server}} недоступен. Проверьте сеть и адрес.',
offlineModeBanner: 'Офлайн — воспроизведение из локального кэша',
offlineNoCacheBanner: 'Нет соединения с сервером — {{server}} недоступен',
offlineLibraryTitle: 'Офлайн-библиотека',
offlineLibraryEmpty:
'Пока ничего не сохранено. Подключитесь к сети, откройте альбом и нажмите «Сохранить офлайн».',
offlineAlbumCount_one: '{{n}} альбом',
offlineAlbumCount_few: '{{n}} альбома',
offlineAlbumCount_many: '{{n}} альбомов',
offlineAlbumCount_other: '{{n}} альбомов',
offlineFilterAll: 'Всё',
offlineFilterAlbums: 'Альбомы',
offlineFilterPlaylists: 'Плейлисты',
offlineFilterArtists: 'Дискографии',
retry: 'Повторить',
serverSettings: 'Настройки сервера',
switchServerTitle: 'Сменить сервер',
switchServerHint: 'Нажмите, чтобы выбрать другой сохранённый сервер.',
manageServers: 'Управление серверами…',
switchFailed: 'Не удалось переключиться — сервер недоступен.',
lastfmConnected: 'Last.fm: @{{user}}',
lastfmSessionInvalid: 'Сессия недействительна — подключите снова',
},
common: {
albums: 'Альбомы',
album: 'Альбом',
loading: 'Загрузка…',
loadingMore: 'Загрузка…',
loadingPlaylists: 'Загрузка плейлистов…',
noAlbums: 'Альбомов нет.',
downloading: 'Скачивание…',
downloadZip: 'Скачать (ZIP)',
back: 'Назад',
cancel: 'Отмена',
save: 'Сохранить',
delete: 'Удалить',
use: 'Использовать',
add: 'Добавить',
new: 'Новое',
active: 'Активен',
download: 'Скачать',
chooseDownloadFolder: 'Выбрать папку',
noFolderSelected: 'Папка не выбрана',
rememberDownloadFolder: 'Запомнить папку',
filterGenre: 'Фильтр по жанру',
filterSearchGenres: 'Поиск жанров…',
filterNoGenres: 'Нет совпадений',
filterClear: 'Сбросить',
favorites: 'Избранное',
favoritesTooltipOff: 'Показывать только избранное',
favoritesTooltipOn: 'Показать всё',
play: 'Воспроизвести',
bulkSelected: 'Выбрано: {{count}}',
clearSelection: 'Сбросить выбор',
bulkAddToPlaylist: 'В плейлист',
bulkRemoveFromPlaylist: 'Убрать из плейлиста',
bulkClear: 'Снять выделение',
updaterAvailable: 'Доступно обновление',
updaterVersion: 'Версия {{version}} доступна',
updaterWebsite: 'Сайт',
updaterModalTitle: 'Доступна новая версия',
updaterChangelog: 'Что нового',
updaterDownloadBtn: 'Скачать сейчас',
updaterSkipBtn: 'Пропустить эту версию',
updaterRemindBtn: 'Напомнить позже',
updaterDone: 'Загрузка завершена',
updaterShowFolder: 'Показать в папке',
updaterInstallHint: 'Закройте Psysonic и запустите установщик вручную.',
updaterAurHint: 'Установить обновление через AUR:',
updaterErrorMsg: 'Ошибка загрузки',
updaterRetryBtn: 'Повторить',
durationHoursMinutes: '{{hours}}ч {{minutes}}мин',
durationMinutesOnly: '{{minutes}}мин',
updaterOpenGitHub: 'Открыть на GitHub',
filters: 'Фильтры',
more: 'еще',
yearRange: 'Диапазон лет',
clearAll: 'Очистить всё',
},
settings: {
title: 'Настройки',
language: 'Язык',
languageEn: 'Английский',
languageDe: 'Немецкий',
languageFr: 'Французский',
languageNl: 'Нидерландский',
languageZh: 'Китайский',
languageNb: 'Норвежский',
languageRu: 'Русский',
languageRu2: 'Русский 2',
font: 'Шрифт',
theme: 'Тема',
appearance: 'Оформление',
servers: 'Серверы',
serverName: 'Название',
serverUrl: 'Адрес',
serverUrlPlaceholder: '192.168.1.100:4533 или https://music.example.com',
serverUsername: 'Логин',
serverPassword: 'Пароль',
addServer: 'Добавить сервер',
addServerTitle: 'Новый сервер',
useServer: 'Выбрать',
deleteServer: 'Удалить',
noServers: 'Нет сохранённых серверов.',
serverActive: 'Активен',
confirmDeleteServer: 'Удалить сервер «{{name}}»?',
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: 'E-mail',
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: 'Сгенерировать magic string',
userMgmtSaveAndMagicString: 'Сохранить и получить magic string',
userMgmtMagicStringPasswordNavHint:
'Navidrome сохранит этот пароль для пользователя. Если он не совпадает с текущим, на сервере будет установлен новый пароль входа.',
userMgmtMagicStringPlaintextWarning:
'Передавайте magic string осторожно: в ней пароль в открытом виде (кодирование — не шифрование). У кого есть полная строка, тот может войти под этим пользователем.',
userMgmtMagicStringCopied: 'Magic string скопирован в буфер обмена.',
userMgmtMagicStringCopyFailed: 'Не удалось скопировать в буфер обмена.',
userMgmtMagicStringLoginFailed: 'Пароль не подошёл — не удалось проверить учётные данные.',
userMgmtMagicStringModalTitle: 'Сгенерировать magic string',
userMgmtMagicStringModalDesc: 'Введите пароль Subsonic для «{{username}}» — он попадёт в копируемую magic string.',
userMgmtMagicStringModalConfirm: 'Скопировать строку',
audiomuseTitle: 'AudioMuse-AI (Navidrome)',
audiomuseDesc:
'Включите, если на этом сервере настроен <pluginLink>плагин AudioMuse-AI для Navidrome</pluginLink>. Появится Instant Mix для треков, а на странице исполнителя похожие будут браться с сервера вместо Last.fm.',
audiomuseIssueHint:
'Недавно не удалось собрать Instant Mix — проверьте плагин Navidrome и API AudioMuse. Похожие исполнители подтянутся с Last.fm, если сервер ничего не вернёт.',
connected: 'Подключено',
failed: 'Ошибка',
eqTitle: 'Эквалайзер',
eqEnabled: 'Включить эквалайзер',
eqPreset: 'Пресет',
eqPresetCustom: 'Свой',
eqPresetBuiltin: 'Встроенные',
eqPresetCustomGroup: 'Мои пресеты',
eqSavePreset: 'Сохранить как пресет',
eqPresetName: 'Название пресета…',
eqDeletePreset: 'Удалить пресет',
eqResetBands: 'Сбросить полосы',
eqPreGain: 'Предусиление',
eqResetPreGain: 'Сбросить предусиление',
eqAutoEqTitle: 'AutoEQ — поиск профиля наушников',
eqAutoEqPlaceholder: 'Модель наушников или IEM…',
eqAutoEqSearching: 'Поиск…',
eqAutoEqNoResults: 'Ничего не найдено',
eqAutoEqError: 'Ошибка поиска',
eqAutoEqRateLimit: 'Лимит GitHub — попробуйте через минуту',
eqAutoEqFetchError: 'Не удалось загрузить профиль EQ',
lfmTitle: 'Last.fm',
lfmConnect: 'Подключить Last.fm',
lfmConnecting: 'Ожидание авторизации…',
lfmConfirm: 'Я разрешил доступ',
lfmConnected: 'Аккаунт',
lfmDisconnect: 'Отключить',
lfmConnectDesc:
'Привяжите Last.fm для скробблинга и статуса «Сейчас слушаю» прямо из Psysonic — настраивать Navidrome не нужно.',
lfmOpenBrowser: 'Откроется браузер. Разрешите доступ на Last.fm, затем нажмите кнопку ниже.',
lfmScrobbles: 'Скробблов: {{n}}',
lfmMemberSince: 'С {{year}} года',
scrobbleEnabled: 'Скробблинг включён',
scrobbleDesc: 'Отправлять прослушивания на Last.fm после 50% трека',
behavior: 'Поведение',
cacheTitle: 'Макс. размер кэша',
cacheDesc:
'Обложки и фото исполнителей. При переполнении старые записи удаляются. Офлайн-альбомы не трогаются автоматически, но сотрутся при полной очистке кэша.',
cacheUsedImages: 'Изображения:',
cacheUsedOffline: 'Офлайн-треки:',
cacheUsedHot: 'На диске:',
hotCacheTrackCount: 'Треков в кэше:',
cacheMaxLabel: 'Лимит',
cacheClearBtn: 'Очистить кэш',
waveformCacheClearBtn: 'Очистить кэш waveform',
cacheClearWarning: 'Будут удалены и все офлайн-альбомы.',
cacheClearConfirm: 'Очистить всё',
cacheClearCancel: 'Отмена',
waveformCacheCleared: 'Кэш waveform очищен ({{count}} строк).',
waveformCacheClearFailed: 'Не удалось очистить кэш waveform.',
offlineDirTitle: 'Офлайн-библиотека (в приложении)',
offlineDirDesc: 'Папка для треков, сохранённых для офлайн-прослушивания.',
offlineDirDefault: 'По умолчанию (данные приложения)',
offlineDirChange: 'Сменить папку',
offlineDirClear: 'Сбросить по умолчанию',
offlineDirHint: 'Новые загрузки пойдут в выбранную папку. Старые останутся на прежнем месте.',
hotCacheTitle: 'Горячий кэш воспроизведения',
hotCacheDisclaimer: 'Заранее подгружает следующие треки из очереди и сохраняет предыдущие. При включении использует место на диске и сеть.',
hotCacheDirDefault: 'По умолчанию (данные приложения)',
hotCacheDirChange: 'Сменить папку',
hotCacheDirClear: 'Сбросить по умолчанию',
hotCacheDirHint: 'При смене папки сбрасывается список в приложении; уже скачанные файлы остаются на старом пути, пока вы их не удалите.',
hotCacheEnabled: 'Включить горячий кэш воспроизведения',
hotCacheMaxMb: 'Максимальный размер кэша',
hotCacheDebounce: 'Задержка после изменения очереди',
hotCacheDebounceImmediate: 'Сразу',
hotCacheDebounceSeconds: '{{n}} с',
hotCacheClearBtn: 'Очистить горячий кэш',
audioOutputDevice: 'Устройство вывода звука',
audioOutputDeviceDesc: 'Выберите аудиоустройство для воспроизведения. Изменения применяются немедленно и перезапускают текущий трек.',
audioOutputDeviceDefault: 'Системное по умолчанию',
audioOutputDeviceRefresh: 'Обновить список устройств',
audioOutputDeviceOsDefaultNow: 'текущий системный вывод',
audioOutputDeviceListError: 'Не удалось загрузить список аудиоустройств.',
audioOutputDeviceNotInCurrentList: 'нет в текущем списке',
audioOutputDeviceMacNotice: 'В macOS воспроизведение в настоящее время всегда следует за системным устройством вывода по техническим причинам. Измените цель через Системные настройки → Звук или значок динамика в строке меню. Причина: CoreAudio запрашивает разрешение на использование микрофона при открытии не-стандартного потока — мы избегаем этого, всегда используя системный вывод по умолчанию.',
hiResTitle: 'Нативное воспроизведение Hi-Res',
hiResEnabled: 'Включить нативное Hi-Res воспроизведение',
hiResDesc: "По умолчанию вывод ограничен до 44,1 кГц для максимальной стабильности. Включайте только если оборудование и сеть надёжно поддерживают высокие частоты (88,2 кГц+).",
showArtistImages: 'Фото исполнителей',
showArtistImagesDesc:
'Показывать обложки в разделе «Исполнители». По умолчанию выключено — меньше нагрузки на диск и сеть.',
showOrbitTrigger: 'Показывать «Orbit» в шапке',
showOrbitTriggerDesc: 'Кнопка в шапке для запуска или присоединения к совместной сессии. Скрой, если не используешь Orbit — здесь же можно включить обратно.',
showTrayIcon: 'Иконка в трее',
showTrayIconDesc: 'Показывать Psysonic в области уведомлений / строке меню.',
minimizeToTray: 'Сворачивать в трей',
minimizeToTrayDesc: 'При закрытии окна не выходить из приложения, а оставаться в трее.',
preloadMiniPlayer: 'Предзагрузка мини-плеера',
preloadMiniPlayerDesc: 'Создаёт окно мини-плеера в фоне при запуске приложения, чтобы при первом открытии содержимое отображалось мгновенно. Использует немного больше памяти.',
useCustomTitlebar: 'Своя строка заголовка',
useCustomTitlebarDesc:
'Заменить системную строку заголовка встроенной, в стиле темы приложения. Отключите, чтобы использовать родную строку GNOME/GTK и т.д.',
linuxWebkitSmoothScroll: 'Плавное колесо (Linux)',
linuxWebkitSmoothScrollDesc: 'Вкл — инерция. Выкл — по шагам, как в GTK.',
discordRichPresence: 'Статус в Discord',
discordRichPresenceDesc:
'Показывать текущий трек в профиле и статусе Discord. Нужен запущенный клиент Discord.',
discordCoverSource: 'Источник обложки',
discordCoverSourceDesc: 'Откуда загружать обложку альбома для профиля Discord.',
discordCoverNone: 'Нет (только иконка приложения)',
discordCoverServer: 'Сервер (через информацию об альбоме)',
discordCoverApple: 'Apple Music',
discordOptions: 'Расширенные параметры Discord',
discordTemplates: 'Пользовательские шаблоны текста',
discordTemplatesDesc: 'Настройте, какая информация отображается в профиле Discord. Переменные: {title}, {artist}, {album}',
discordTemplateDetails: 'Основная строка (details)',
discordTemplateState: 'Вторичная строка (state)',
discordTemplateLargeText: 'Подсказка альбома (largeText)',
nowPlayingEnabled: 'Показывать в «Сейчас играет»',
nowPlayingEnabledDesc:
'Отправлять на сервер, что вы сейчас слушаете. Отключите, чтобы не делиться этим.',
enableBandsintown: 'Даты туров Bandsintown',
enableBandsintownDesc: 'Показывает предстоящие концерты текущего исполнителя на вкладке «Инфо». Данные берутся из публичного API Bandsintown.',
lyricsServerFirst: 'Предпочитать тексты с сервера',
lyricsServerFirstDesc: 'Проверять тексты песен, предоставленные сервером (встроенные теги, sidecar-файлы) перед запросом LRCLIB. Отключите, чтобы сначала использовать LRCLIB.',
enableNeteaselyrics: 'Тексты из Netease Cloud Music',
enableNeteaselyricsDesc: 'Использовать Netease Cloud Music как последний источник текстов, когда остальные способы не находят ничего. Лучшее покрытие для азиатской и международной музыки.',
lyricsSourcesTitle: 'Источники текстов',
lyricsSourcesDesc: 'Выберите источники для поиска текстов и их порядок. Перетаскивайте для сортировки. Отключённые источники пропускаются.',
lyricsSourceServer: 'Сервер',
lyricsSourceLrclib: 'LRCLIB',
lyricsSourceNetease: 'Netease Cloud Music',
lyricsModeStandard: 'Стандарт',
lyricsModeStandardDesc: 'Три источника в свободно настраиваемом порядке: серверные теги, LRCLIB, Netease.',
lyricsModeLyricsplus: 'YouLyPlus (Караоке)',
lyricsModeLyricsplusDesc: 'Синхронизация слово-в-слово из Apple Music, Spotify, Musixmatch и QQ (общественный бэкенд). При отсутствии результата незаметно возвращается к стандартным источникам.',
lyricsStaticOnly: 'Показывать текст статично',
lyricsStaticOnlyDesc: 'Синхронизированный текст отображается без авто-прокрутки и подсветки слов.',
downloadsTitle: 'Экспорт ZIP и архивов',
downloadsFolderDesc: 'Куда сохранять альбомы в ZIP архиве на диск.',
downloadsDefault: 'Папка «Загрузки» по умолчанию',
pickFolder: 'Выбрать',
pickFolderTitle: 'Папка для загрузок',
clearFolder: 'Сбросить папку',
logout: 'Выйти',
aboutTitle: 'О Psysonic',
aboutDesc:
'Современный десктопный плеер, созданный для Navidrome. Использует API Subsonic плюс специфичные для Navidrome расширения. На Tauri v2 и нативном аудиодвижке на Rust — лёгкий и быстрый: волновая шкала, синхронные тексты, Last.fm, 10-полосный EQ, кроссфейд, воспроизведение без пауз, Replay Gain, жанры и много тем оформления.',
aboutLicense: 'Лицензия',
aboutLicenseText: 'GNU GPL v3 — свободное использование и изменение на тех же условиях.',
aboutRepo: 'Исходный код на GitHub',
aboutVersion: 'Версия',
aboutBuiltWith: 'Tauri · React · TypeScript · Rust/rodio',
aboutReleaseNotesLabel: 'Примечания к выпуску',
aboutReleaseNotesLink: 'Открыть «Что нового» этой версии',
aboutContributorsLabel: 'Участники',
showChangelogOnUpdate: 'Показывать «Что нового» после обновления',
showChangelogOnUpdateDesc: 'После обновления над «Сейчас играет» появится ненавязчивый баннер журнала изменений. Клик открывает заметки о выпуске, X скрывает.',
randomMixTitle: 'Чёрный список случайного микса',
luckyMixMenuTitle: 'Показывать «Мне повезёт» в меню',
luckyMixMenuDesc:
'Включает «Мне повезёт» в «Собрать микс», а при раздельной навигации — отдельным пунктом меню. Видно только при включённом AudioMuse на активном сервере.',
randomMixBlacklistTitle: 'Свои слова-фильтры',
randomMixBlacklistDesc:
'Треки скрываются, если слово встречается в жанре, названии, альбоме или исполнителе (когда включён фильтр выше).',
randomMixBlacklistPlaceholder: 'Добавить слово…',
randomMixBlacklistAdd: 'Добавить',
randomMixBlacklistEmpty: 'Пока пусто.',
randomMixHardcodedTitle: 'Встроенные слова (при включённом фильтре)',
tabAudio: 'Звук',
tabStorage: 'Офлайн и кэш',
tabAppearance: 'Внешний вид',
tabLibrary: 'Библиотека',
tabServers: 'Серверы',
tabLyrics: 'Тексты песен',
tabPersonalisation: 'Персонализация',
tabIntegrations: 'Интеграции',
inputKeybindingsTitle: 'Горячие клавиши',
aboutContributorsCount_one: '{{count}} вклад',
aboutContributorsCount_few: '{{count}} вклада',
aboutContributorsCount_many: '{{count}} вкладов',
aboutContributorsCount_other: '{{count}} вклада',
searchPlaceholder: 'Поиск в настройках…',
searchNoResults: 'Ничего не найдено по вашему запросу.',
aboutMaintainersLabel: 'Сопровождающие',
integrationsPrivacyTitle: 'Уведомление о конфиденциальности',
integrationsPrivacyBody: 'Все интеграции на этой вкладке включаются <strong>по желанию</strong> и при активации отправляют данные во внешние сервисы или на ваш сервер Navidrome. Last.fm получает вашу историю прослушивания, Discord показывает текущую композицию в вашем профиле, Bandsintown опрашивается по артисту для получения дат гастролей, а «Сейчас играет» делится текущей композицией с другими пользователями вашего сервера Navidrome. Если вы не хотите ничего из этого, просто оставьте соответствующий раздел отключённым.',
homeCustomizerTitle: 'Главная',
sidebarTitle: 'Боковая панель',
sidebarReset: 'Сбросить порядок',
artistLayoutTitle: 'Разделы страницы исполнителя',
artistLayoutDesc: 'Перетаскивайте, чтобы изменить порядок, переключайте, чтобы скрыть отдельные разделы страницы исполнителя. Разделы без данных пропускаются автоматически.',
artistLayoutReset: 'Сбросить',
artistLayoutBio: 'Биография исполнителя',
artistLayoutTopTracks: 'Топ-треки',
artistLayoutSimilar: 'Похожие исполнители',
artistLayoutAlbums: 'Альбомы',
artistLayoutFeatured: 'Также участвует в',
sidebarDrag: 'Перетащите для порядка',
sidebarFixed: 'Всегда показывать',
randomNavSplitTitle: 'Разделить навигацию микса',
randomNavSplitDesc:
'Показывать «Случайный микс», «Случайные альбомы» и «Мне повезёт» как отдельные пункты боковой панели вместо хаба «Собрать микс».',
tabInput: 'Ввод',
tabUsers: 'Пользователи',
tabSystem: 'Система',
loggingTitle: 'Логирование',
loggingModeDesc: 'Управляет подробностью логов backend в терминале.',
loggingModeOff: 'Выключено',
loggingModeNormal: 'Обычное',
loggingModeDebug: 'Дебаг',
loggingExport: 'Экспорт логов',
loggingExportSuccess: 'Логи экспортированы ({{count}} строк).',
loggingExportError: 'Не удалось экспортировать логи.',
ratingsSectionTitle: 'Рейтинги',
ratingsSkipStarTitle: 'Скипнуть для 1 звезды',
ratingsSkipStarDesc:
'При N скипов подряд ставить 1★ треку. Только для не оцененных ранее.',
ratingsSkipStarThresholdLabel: 'Скипов',
ratingsMixFilterTitle: 'Фильтрация по рейтингу',
ratingsMixFilterDesc:
'Фильтровать с низким рейтингом в «{{mix}}» и «{{albums}}». Повторный клик по выбранной звезде отключает порог.',
ratingsMixMinSong: 'Песни',
ratingsMixMinAlbum: 'Альбомы',
ratingsMixMinArtist: 'Исполнители',
ratingsMixMinThresholdAria: 'Минимум звёзд: {{label}}',
backupTitle: 'Резервная копия',
backupExport: 'Экспорт настроек',
backupExportDesc:
'Сохраняет настройки, серверы, Last.fm, тему, EQ и горячие клавиши в файл .psybkp. Пароли в открытом виде — храните файл в безопасности.',
backupImport: 'Импорт настроек',
backupImportDesc: 'Восстановить из .psybkp. Приложение перезапустится.',
backupImportConfirm: 'Текущие настройки будут заменены. Продолжить?',
backupSuccess: 'Копия сохранена',
backupImportSuccess: 'Настройки восстановлены — перезапуск…',
backupImportError: 'Файл повреждён или не подходит.',
shortcutsReset: 'Сбросить',
shortcutListening: 'Нажмите клавишу…',
shortcutUnbound: '—',
globalShortcutsTitle: 'Глобальные сочетания',
globalShortcutsNote:
'Работают, когда окно не в фокусе. Нужен модификатор: 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:
'Насколько приглушить звук, пока для трека нет сохранённого измерения громкости. При стриме дальше идут лишь грубые оценки, не полный LUFS. 0 dB — без дополнительного приглушения; ниже — тише. Справа показывается фактическая поправка для текущей цели.',
loudnessPreAnalysisAttenuationRef: 'Фактически {{eff}} dB при цели {{tgt}} LUFS.',
loudnessPreAnalysisAttenuationReset: 'По умолчанию',
loudnessFirstPlayNote:
'При первом прослушивании нового трека громкость может ненадолго колебаться, пока идёт измерение. Со второго раза применяется уже сохранённое значение и всё стабильно. Следующие треки в очереди обычно анализируются во время предыдущей композиции, поэтому на практике это случается редко.',
crossfade: 'Кроссфейд',
crossfadeDesc: 'Плавный переход между треками',
crossfadeSecs: '{{n}} с',
notWithGapless: 'Недоступно при включённом режиме без пауз',
notWithCrossfade: 'Недоступно при включённом кроссфейде',
gapless: 'Без пауз между треками',
gaplessDesc: 'Заранее подгружать следующий трек, чтобы не было тишины',
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: 'В Random Mix',
preloadMode: 'Предзагрузка следующего трека',
preloadModeDesc: 'Когда начинать буферизацию следующего в очереди',
nextTrackBufferingTitle: 'Буферизация',
preloadHotCacheMutualExclusive: 'Предзагрузка и Hot Cache выполняют одну функцию — одновременно может быть активна только одна. Включение одной автоматически отключает другую.',
preloadOff: 'Выкл.',
preloadBalanced: 'Умеренно (за 30 с до конца)',
preloadEarly: 'Рано (через 5 с после старта)',
preloadCustom: 'Свой интервал',
preloadCustomSeconds: 'Секунд до конца: {{n}}',
infiniteQueue: 'Бесконечная очередь',
infiniteQueueDesc: 'Подмешивать случайные треки, когда очередь закончится',
experimental: 'Экспериментально',
fsPlayerSection: 'Полноэкранный плеер',
fsShowArtistPortrait: 'Отображать фото артиста',
fsShowArtistPortraitDesc: 'Показывать фото артиста (или обложку альбома) в правой части полноэкранного плеера.',
fsPortraitDim: 'Затемнение фото',
fsLyricsStyle: 'Стиль отображения текста',
fsLyricsStyleRail: 'Рельс',
fsLyricsStyleRailDesc: 'Классическая рамка из 5 строк.',
fsLyricsStyleApple: 'Прокрутка',
fsLyricsStyleAppleDesc: 'Полноэкранный список с прокруткой.',
sidebarLyricsStyle: 'Стиль прокрутки текста',
sidebarLyricsStyleClassic: 'Классический',
sidebarLyricsStyleClassicDesc: 'Активная строка центрируется.',
sidebarLyricsStyleApple: 'Apple Music-like',
sidebarLyricsStyleAppleDesc: 'Активная строка фиксируется сверху с плавной анимацией.',
seekbarStyle: 'Стиль прогресс-бара',
seekbarStyleDesc: 'Выбор внешнего вида полосы воспроизведения',
seekbarTruewave: 'Реальная форма волны',
seekbarPseudowave: 'Псевдо форма волны',
seekbarLinedot: 'Линия и точка',
seekbarBar: 'Полоса',
seekbarThick: 'Толстая полоса',
seekbarSegmented: 'Сегменты',
seekbarNeon: 'Неон',
seekbarPulsewave: 'Пульс-волна',
seekbarParticletrail: 'Частицы',
seekbarLiquidfill: 'Жидкость',
seekbarRetrotape: 'Ретро-лента',
themeSchedulerTitle: 'Расписание тем',
themeSchedulerEnable: 'Включить расписание тем',
themeSchedulerEnableSub: 'Автоматически переключается между двумя темами в зависимости от времени суток',
themeSchedulerDayTheme: 'Дневная тема',
themeSchedulerDayStart: 'День начинается в',
themeSchedulerNightTheme: 'Ночная тема',
themeSchedulerNightStart: 'Ночь начинается в',
themeSchedulerActiveHint: 'Расписание тем активно - темы переключаются автоматически.',
visualOptionsTitle: 'Визуальные Настройки',
coverArtBackground: 'Фон Обложки',
coverArtBackgroundSub: 'Показывать размытую обложку как фон в заголовках альбомов и плейлистов',
playlistCoverPhoto: 'Обложка Плейлиста',
playlistCoverPhotoSub: 'Показывать сетку обложек в детальном виде плейлиста',
showBitrate: 'Показывать Битрейт',
showBitrateSub: 'Отображать битрейт аудио в списках треков',
floatingPlayerBar: 'Плавающая панель плеера',
floatingPlayerBarSub: 'Держать панель плеера плавающей над содержимым',
uiScaleTitle: 'Масштаб интерфейса',
uiScaleLabel: 'Масштаб',
},
changelog: {
modalTitle: 'Что нового',
dontShowAgain: 'Больше не показывать',
close: 'Понятно',
},
whatsNew: {
title: 'Что нового',
empty: 'Для этой версии пока нет записи в журнале изменений.',
bannerTitle: 'Журнал изменений',
bannerCollapsed: 'Что нового в v{{version}}',
dismiss: 'Скрыть',
close: 'Закрыть',
},
help: {
title: 'Справка',
searchPlaceholder: 'Поиск по справке…',
noResults: 'Ничего не найдено. Попробуйте другой запрос.',
s1: 'С чего начать',
q1: 'Какие серверы поддерживаются?',
a1: 'Psysonic в первую очередь сделан для Navidrome и полностью совместим с Subsonic — Gonic, Airsonic, LMS и другие серверы Subsonic-API тоже работают. Некоторые расширенные функции (рейтинги, умные плейлисты, обмен Magic String, управление пользователями) требуют Navidrome.',
q2: 'Как добавить сервер?',
a2: 'Настройки → Серверы → Добавить сервер. Введите URL (например, http://192.168.1.100:4533), имя пользователя и пароль. Psysonic проверяет соединение перед сохранением — при ошибке ничего не сохраняется. Можно добавить сколько угодно серверов и переключаться между ними в шапке; одновременно активен только один.',
q3: 'Краткий обзор интерфейса?',
a3: 'Боковая панель (слева) для навигации, Mainstage / страницы по центру, плеер внизу, панель Очереди справа (открывается через иконку справа вверху рядом с индикатором Now Playing). Поиск вверху работает по всей библиотеке; «Now Playing» показывает, что слушают другие пользователи на том же сервере Navidrome.',
s2: 'Воспроизведение и Очередь',
q4: 'Как пользоваться очередью?',
a4: 'Откройте панель Очереди справа вверху. Перетаскивайте строки, чтобы менять порядок, выносите их за пределы для удаления, или используйте панель инструментов для перемешивания, сохранения очереди как плейлиста или перехода к треку. Перетаскивайте строки из панели в другие места как способ переноса.',
q5: 'Gapless и Crossfade — в чём разница?',
a5: 'Gapless преднабуферизирует следующий трек, чтобы между песнями не было тишины (идеально для концертных альбомов и DJ-миксов). Crossfade плавно затухает текущий трек, пока следующий нарастает (1–10 с — для перемешанных миксов). Они взаимоисключающи — включение одного отключает другое. Настройте оба в Настройки → Аудио.',
q6: 'Что такое Бесконечная очередь?',
a6: 'Когда очередь заканчивается и Повтор выключен, Psysonic тихо добавляет похожие/случайные треки из вашей библиотеки, чтобы воспроизведение не останавливалось. Авто-добавленные треки появляются под разделителем «— Добавлено автоматически —». Включается иконкой бесконечности в шапке очереди; ограничьте автодобавление жанром в Настройки → Очередь.',
q7: 'Множественный выбор и Shift+клик диапазона?',
a7: 'Включите «Выбор» на Альбомах / Новинках / Random Albums / Плейлистах. Клик переключает элемент, затем удерживайте Shift и кликните другой элемент — всё между ними в видимом порядке выделится. Shift+клики расширяют от последнего кликнутого якоря. Панель инструментов сверху предлагает массовые действия (очередь, скачивание, удаление и т. д.).',
q8: 'Сочетания клавиш и глобальные хоткеи?',
a8: 'По умолчанию: Пробел = Воспроизведение / Пауза, Esc = выйти из полного экрана / закрыть модалки, F1 = памятка по сочетаниям. Настройки → Ввод позволяет переназначить любое внутри-приложенческое действие (включая аккорды вроде Ctrl+Shift+P) и задать системные глобальные сочетания, работающие даже когда Psysonic в фоне или свёрнут. Медиа-клавиши (Воспр./Пауза, Далее, Назад) работают на всех платформах.',
s3: 'Аудио-инструменты',
q9: 'Режимы Replay Gain?',
a9: 'Настройки → Аудио → Replay Gain. Режим Трек нормализует каждую песню к целевому уровню. Режим Альбом сохраняет кривую громкости внутри альбома. Режим Авто выбирает Трек или Альбом в зависимости от того, происходит ли очередь из одного альбома. Треки без тегов Replay Gain используют настраиваемый предусилитель.',
q10: 'Что такое Smart Loudness Normalization (LUFS)?',
a10: 'Современная альтернатива Replay Gain в Настройки → Аудио. Psysonic анализирует каждый трек по LUFS / EBU R128 и сохраняет результат, чтобы громкость была единой по всей библиотеке — включая треки без Replay Gain тегов. Холодный анализ работает в фоне и использует 35–40 % CPU около 1 минуты, потом 0. Установите целевую громкость (по умолчанию −10 LUFS) один раз.',
q11: 'EQ и AutoEQ?',
a11: '10-полосный параметрический EQ в Настройки → Аудио → Эквалайзер с ручными полосами и пресетами. AutoEQ рядом подгружает измеренный профиль коррекции для модели ваших наушников из базы AutoEQ и применяет его к полосам автоматически — выберите наушники, EQ настроится на правильную кривую.',
q12: 'Как переключить устройство вывода аудио?',
a12: 'Настройки → Аудио → Устройство вывода. Psysonic перечисляет все доступные выходы и переключается мгновенно при выборе. Кнопка обновления находит устройства, подключённые после запуска. На Linux ALSA-имена вроде «sysdefault» автоматически очищаются для удобства чтения.',
q13: 'Что такое Hot Cache?',
a13: 'Hot Cache предзагружает текущий трек и следующие в RAM и на диск, чтобы воспроизведение начиналось без задержек буферизации — особенно полезно на медленных / удалённых серверах. Вытеснение срабатывает при достижении лимита размера. Настройте размер и задержку дебаунса (чтобы быстрые скипы не приводили к лишним загрузкам) в Настройки → Аудио.',
s4: 'Библиотека и Открытие',
q14: 'Как работают рейтинги и Skip-to-1★?',
a14: 'Psysonic поддерживает рейтинг 1–5 звёзд через OpenSubsonic (Navidrome ≥ 0.53). Оценивайте треки в списках, в контекстном меню или в плеере под именем исполнителя; альбомы — на странице альбома; исполнителей — на странице исполнителя. Skip-to-1★ (Настройки → Библиотека → Рейтинги) автоматически ставит 1 звезду после настраиваемого числа последовательных скипов. Та же панель позволяет задать минимальный рейтинг как фильтр для генерируемых миксов.',
q15: 'Как просматривать — Папки, Жанры, Треки?',
a15: 'Просмотр папок (боковая панель) ходит по дереву музыкальной директории сервера в Miller-column раскладке — клик по папке для входа, клик по треку или иконке воспроизведения папки для проигрывания / добавления. Жанры используют tag-cloud вид с размером по числу треков; клик по жанру открывает его. Треки — это плоский хаб библиотеки с виртуальным списком, сортируемым по столбцам, и живым поиском.',
q16: 'Поиск и расширенный поиск?',
a16: 'Поиск в шапке выполняет живой поиск по исполнителям, альбомам и трекам по мере набора. Откройте Расширенный поиск (боковая панель) для более богатого вида: фильтры по году, жанру, рейтингу, формату, каналам, частоте дискретизации, BPM, настроению — комбинируемые. Правый клик по любому результату открывает то же контекстное меню, что и в других местах.',
q17: 'Что такое Миксы (Random / Genre / Super Genre / Lucky)?',
a17: 'Random Mix строит плейлист случайных треков из библиотеки; фильтр ключевых слов исключает аудиокниги, комедию и т. д. по подстрокам жанра / названия / альбома. Super Genre Mix группирует библиотеку в широкие стили (Рок, Метал, Электронная, Джаз, Классика…) и строит сфокусированный микс. Lucky Mix использует историю прослушивания, рейтинги и похожие треки AudioMuse-AI для составления мгновенного плейлиста по одному клику.',
q18: 'Страница статистики?',
a18: 'Статистика (боковая панель) показывает топ исполнителей, топ альбомов, топ треков, разбивку по жанрам, время прослушивания со временем и охват по библиотеке, если настроено несколько музыкальных папок. Несколько видов экспортируются как изображение-карточка для шаринга.',
q19: 'Как скачать альбом как ZIP?',
a19: 'Страница альбома → «Скачать (ZIP)». Сервер сначала упаковывает альбом — для больших или lossless альбомов (FLAC / WAV) индикатор прогресса появляется только после завершения упаковки и начала передачи. Это нормально.',
s5: 'Тексты',
q20: 'Откуда берутся тексты?',
a20: 'Три источника, настраиваемые в Настройки → Тексты: ваш сервер Navidrome (встроенные / OpenSubsonic тексты), LRCLIB (синхронизированные тексты от сообщества) и NetEase Cloud Music (большой азиатский + международный каталог). Каждый источник можно включить / выключить и переставить перетаскиванием.',
q21: 'Как смотреть тексты во время воспроизведения?',
a21: 'Кликните на иконку микрофона в плеере, чтобы открыть вкладку Тексты в панели очереди. Синхронизированные тексты автоматически прокручиваются и поддерживают клик-для-перехода; обычный текст прокручивается как статический блок. Включите Полноэкранный плеер через обложку плеера для иммерсивного вида текстов с mesh-blob фоном.',
s6: 'Шаринг и Социальные функции',
q22: 'Что такое Magic Strings?',
a22: 'Magic Strings — это короткие копи-паст токены для шаринга вещей между пользователями Psysonic без сторонних серверов. Server-Invite строки позволяют другу присоединиться к вашему Navidrome одной вставкой; Magic Strings альбомов / исполнителей / очередей открывают тот же альбом / исполнителя / очередь у получателя. Создавайте через меню «Поделиться», вставляйте в строку поиска для использования.',
q23: 'Что такое Orbit?',
a23: 'Orbit — это синхронное совместное прослушивание: хост проигрывает трек, каждый гость слышит его синхронно, и гости могут предлагать песни, которые хост может принять в очередь. Запустите сессию через кнопку Orbit в шапке, поделитесь ссылкой-приглашением, и другие могут присоединиться с любой установки Psysonic. Хост контролирует воспроизведение (скип, перемотка, очередь) — гости получают вид в реальном времени и поле для предложений. Сессии эфемерные и завершаются, когда хост их закрывает.',
q24: 'Что такое выпадающее меню Now Playing?',
a24: 'Иконка трансляции справа вверху показывает, что слушают другие пользователи на вашем сервере Navidrome прямо сейчас, обновляется каждые 10 секунд. Ваша запись исчезает в момент паузы. По серверам — пользователи на другом активном сервере не показываются.',
s7: 'Персонализация',
q25: 'Темы и планировщик тем?',
a25: 'Настройки → Внешний вид → Тема выбирает из 60+ тем в 8 группах (Psysonic, Mediaplayer, Операционные системы, Игры, Фильмы, Сериалы, Соцсети, Open Source Classics — Catppuccin / Nord / Gruvbox / Nightfox / Dracula). Auto-Switch Theme позволяет задать дневную и ночную тему со временем переключения, чтобы Psysonic переключался автоматически.',
q26: 'Можно настроить боковую панель, Главную и страницу исполнителя?',
a26: 'Да — Настройки → Персонализация. Кастомизатор боковой панели позволяет перетаскивать nav-элементы в нужном порядке и скрывать те, что не используются. Кастомизатор Главной включает/выключает каждый ряд Mainstage (Hero, Recent, Discover, Recently Played, Starred…). Кастомизатор страницы исполнителя меняет порядок секций (Top Songs, Альбомы, Синглы, Сборники, Похожие исполнители и т. д.) и позволяет скрывать те, на которые вы не смотрите.',
q27: 'Что такое Mini Player?',
a27: 'Маленькое плавающее окно с обложкой, элементами управления воспроизведением и компактной очередью. Открывается из иконки mini-player в плеере или сочетанием клавиш. Окно запоминает позицию и размер между сессиями. На Windows mini-webview предсоздаётся при запуске для мгновенного открытия; Linux / macOS включают это опционально через Настройки → Внешний вид → Предзагружать mini player.',
q28: 'Что такое Floating Player Bar?',
a28: 'Опциональный стиль плеера (Настройки → Внешний вид), который отделяется от нижней границы с тематическим фоном, акцентной рамкой, скруглённой обложкой и центрированной секцией громкости. Полезно на высоких мониторах или с компактными темами.',
q29: 'Превью трека по наведению?',
a29: 'Наведите мышь на строку трека, кликните маленькую кнопку превью на обложке или вызовите превью из контекстного меню — Psysonic стримит первые ~15 с через тот же Rust-аудио-движок, чтобы применилась нормализация громкости. Полезно для быстрого знакомства с альбомом, который вы ещё не слушали.',
q30: 'Таймер сна?',
a30: 'Кликните иконку луны в плеере, чтобы открыть таймер сна. Выберите длительность (или «конец текущего трека») и Psysonic плавно затухнет и поставит на паузу в конце. На кнопке отображается круговое кольцо и обратный отсчёт во время работы таймера.',
q31: 'Масштаб UI, шрифт, стиль seekbar?',
a31: 'Настройки → Внешний вид — Масштаб интерфейса (80–125 % без влияния на системный размер шрифта), Шрифт (10 UI шрифтов, включая IBM Plex Mono, Fira Code, Geist, Golos Text…), Стиль Seekbar (Волна анализированная / pseudowave детерминированная / Линия и Точка / Полоса / Толстая полоса / Сегментированный / Неон / Импульсная волна / Шлейф частиц / Жидкое заполнение / Ретро-плёнка).',
s8: 'Опытный пользователь',
q32: 'Управление плеером из командной строки?',
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: 'Умные плейлисты (Navidrome)?',
a33: 'Умные плейлисты — это динамические плейлисты на стороне Navidrome, определяемые правилами (жанр = Рок И год > 2020 и т. д.). Страница Плейлисты в Psysonic позволяет создавать, редактировать и удалять их с визуальным редактором правил — Psysonic общается с Navidrome native API для этого. Они ведут себя как обычные плейлисты в остальной части приложения и обновляются автоматически при изменении библиотеки.',
q34: 'Резервная копия и восстановление настроек?',
a34: 'Настройки → Хранилище → Резервное копирование экспортирует профили серверов, темы, сочетания клавиш и другие настройки в один JSON файл. Импортируйте файл на другой машине или после переустановки, чтобы восстановить всё сразу. Пароли серверов включены — храните файл в надёжном месте.',
q35: 'Где смотреть все open-source лицензии?',
a35: 'Настройки → Система → Open Source Licenses. Полный список зависимостей (cargo crates и npm пакеты) поставляется со встроенными текстами лицензий. Кликните на запись для полного текста; выделенный блок сверху подсвечивает узнаваемые библиотеки (Tauri, React, rodio, symphonia и т. д.).',
s9: 'Офлайн и Sync',
q36: 'Офлайн-режим — кэширование альбомов и плейлистов?',
a36: 'Откройте любой альбом или плейлист и кликните иконку загрузки в шапке — Psysonic кэширует каждый трек локально, чтобы он играл с диска без сетевого вызова. Страница Офлайн-библиотека (боковая панель) показывает всё кэшированное, прогресс текущих загрузок и позволяет удалять записи иконкой корзины (появляется после завершения загрузки).',
q37: 'Лимит офлайн-хранилища?',
a37: 'Настройки → Библиотека → Офлайн позволяет задать максимальный размер кэша. При достижении лимита кнопка загрузки на странице альбома показывает предупреждающий баннер. Освободите место, удалив альбомы или плейлисты со страницы Офлайн-библиотека.',
q38: 'Device Sync — копирование музыки на USB / SD?',
a38: 'Device Sync (боковая панель) копирует альбомы, плейлисты или целых исполнителей на внешний диск для офлайн-прослушивания на других устройствах. Выберите целевую папку, выберите источники из вкладок браузера, нажмите «Перенести на устройство». Psysonic пишет манифест (psysonic-sync.json), чтобы знать, какие файлы уже там, даже если переоткрыть Device Sync на другой ОС с другим шаблоном имени файла. Шаблоны поддерживают токены {artist} / {album} / {title} / {track_number} / {disc_number} / {year} с / как разделителем папок.',
s10: 'Интеграции и Устранение неполадок',
q39: 'Скробблинг Last.fm?',
a39: 'Настройки → Интеграции → Last.fm. Подключите аккаунт один раз, и Psysonic скробблит напрямую в Last.fm — настройка Navidrome не нужна. Скроббл отправляется после прослушивания 50 % трека. Now-playing пинги отправляются в начале.',
q40: 'Discord Rich Presence?',
a40: 'Настройки → Интеграции → Discord показывает текущий трек в вашем профиле Discord. Выберите между иконкой приложения, обложками с вашего сервера (через getAlbumInfo2 — нужен публично доступный сервер) или обложками Apple Music. Кастомизируйте отображаемые строки (детали, состояние, тултип) с помощью токен-шаблонов.',
q41: 'Даты туров Bandsintown?',
a41: 'Включается в Настройки → Интеграции → Now-Playing Info. Вкладка Now Playing на странице Now Playing затем показывает предстоящие даты туров для играющего исполнителя через Bandsintown widget API. По умолчанию выключено — никаких запросов до включения.',
q42: 'Internet Radio — воспроизведение живых стримов?',
a42: 'Internet Radio (боковая панель) проигрывает любой live-стрим, сохранённый на вашем сервере Navidrome (добавляйте станции через Navidrome admin UI). Воспроизведение работает через HTML5 audio движок браузера — большинство настроек EQ / Replay Gain / Loudness не применяются к радио, но ICY-метаданные (текущее имя песни) отображаются. Поддерживает MP3, AAC, OGG Vorbis и большинство HLS стримов; поддержка кодеков зависит от платформы.',
q43: 'Тест соединения не проходит — что делать?',
a43: 'Дважды проверьте URL включая порт (например, http://192.168.1.100:4533). В локальной сети http:// часто работает там, где https:// не работает (нет сертификата). Убедитесь, что firewall не блокирует порт и что имя пользователя и пароль правильные. Если сервер за reverse proxy, попробуйте сначала прямой URL для изоляции причины.',
q44: 'Обложки и изображения исполнителей загружаются медленно.',
a44: 'Изображения подгружаются с сервера при первом просмотре, затем кэшируются локально на 30 дней. Если хранилище сервера медленное, первый визит на страницу может занять момент; последующие визиты мгновенные. Hot Cache также помогает с треками, но кэш изображений независим.',
q45: 'Проблемы Linux — чёрный экран или нет звука?',
a45: 'Чёрный экран обычно проблема GPU / EGL драйвера в WebKitGTK — запускайте с GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1 (AUR / .deb / .rpm установщики устанавливают это автоматически). Для аудио убедитесь, что PipeWire или PulseAudio запущены. Пропадание звука после спящего режима / пробуждения теперь обрабатывается автоматически post-sleep recovery hook.',
},
queue: {
title: 'Очередь',
savePlaylist: 'Сохранить как плейлист',
updatePlaylist: 'Обновить плейлист',
filterPlaylists: 'Фильтр плейлистов…',
playlistName: 'Название плейлиста',
cancel: 'Отмена',
save: 'Сохранить',
loadPlaylist: 'Загрузить плейлист',
loading: 'Загрузка…',
noPlaylists: 'Плейлистов нет.',
load: 'Заменить очередь и играть',
appendToQueue: 'Добавить в очередь',
delete: 'Удалить',
deleteConfirm: 'Удалить плейлист «{{name}}»?',
clear: 'Очистить',
shuffle: 'Перемешать',
gapless: 'Без пауз',
crossfade: 'Кроссфейд',
infiniteQueue: 'Бесконечная очередь',
autoAdded: '— Добавлено автоматически —',
radioAdded: '— Радио —',
hide: 'Скрыть',
hideNowPlaying: 'Скрыть информацию о воспроизведении',
showNowPlaying: 'Показать информацию о воспроизведении',
close: 'Закрыть',
nextTracks: 'Дальше',
shareQueue: 'Копировать ссылку на очередь',
shareQueueEmpty: 'Очередь пуста — нечем поделиться.',
emptyQueue: 'Очередь пуста.',
trackSingular: 'трек',
trackPlural: 'треков',
showRemaining: 'Осталось',
showTotal: 'Всего',
showEta: 'Показать ориентировочное окончание',
replayGain: 'ReplayGain',
rgTrack: 'Т {{db}} дБ',
rgAlbum: 'А {{db}} дБ',
rgPeak: 'Пик {{pk}}',
sourceOffline: 'Играет из офлайн-библиотеки',
sourceHot: 'Играет из кэша',
sourceStream: 'Играет из сетевого потока',
},
miniPlayer: {
showQueue: 'Показать очередь',
hideQueue: 'Скрыть очередь',
pinOnTop: 'Поверх окон',
pinOff: 'Открепить',
openMainWindow: 'Открыть главное окно',
close: 'Закрыть',
emptyQueue: 'Очередь пуста',
},
statistics: {
title: 'Статистика',
recentlyPlayed: 'Недавно проиграно',
mostPlayed: 'Самые проигранные альбомы',
highestRated: 'С высоким рейтингом',
genreDistribution: 'Жанры (топ-20)',
loadMore: 'Ещё',
statArtists: 'Исполнители',
statArtistsTooltip: 'Только исполнители альбомов — артисты, присутствующие лишь в треках (фичеринг, гость и т. д.) без собственного альбома, не учитываются.',
statAlbums: 'Альбомы',
statSongs: 'Треки',
statGenres: 'Жанры',
statPlaytime: 'Время звучания',
genreInsights: 'По жанрам',
formatDistribution: 'Форматы',
formatSample: 'Выборка {{n}} треков',
computing: 'Считаем…',
genreSongs_one: '{{count}} композиция',
genreSongs_few: '{{count}} композиции',
genreSongs_many: '{{count}} композиций',
genreSongs_other: '{{count}} композиций',
genreAlbums_one: '{{count}} альбом',
genreAlbums_few: '{{count}} альбома',
genreAlbums_many: '{{count}} альбомов',
genreAlbums_other: '{{count}} альбомов',
recentlyAdded: 'Недавно добавлено',
decadeDistribution: 'Альбомы по десятилетиям',
decadeAlbums_one: '{{count}} альбом',
decadeAlbums_few: '{{count}} альбома',
decadeAlbums_many: '{{count}} альбомов',
decadeAlbums_other: '{{count}} альбомов',
decadeUnknown: 'Неизвестно',
lfmTitle: 'Статистика Last.fm',
lfmTopArtists: 'Топ исполнителей',
lfmTopAlbums: 'Топ альбомов',
lfmTopTracks: 'Топ треков',
lfmPlays_one: '{{count}} прослушивание',
lfmPlays_few: '{{count}} прослушивания',
lfmPlays_many: '{{count}} прослушиваний',
lfmPlays_other: '{{count}} прослушиваний',
lfmPeriodOverall: 'За всё время',
lfmPeriod7day: '7 дней',
lfmPeriod1month: 'Месяц',
lfmPeriod3month: '3 месяца',
lfmPeriod6month: '6 месяцев',
lfmPeriod12month: 'Год',
lfmNotConnected: 'Подключите Last.fm в настройках.',
lfmRecentTracks: 'Последние скробблы',
lfmNowPlaying: 'Сейчас играет',
lfmJustNow: 'только что',
lfmMinutesAgo: '{{n}} мин назад',
lfmHoursAgo: '{{n}} ч назад',
lfmDaysAgo: '{{n}} дн. назад',
topRatedSongs: 'Лучшие по рейтингу треки',
topRatedArtists: 'Лучшие по рейтингу исполнители',
noRatedSongs: 'Нет оценённых треков. Ставьте оценки в альбомах или плейлистах.',
noRatedArtists: 'Нет оценённых исполнителей.',
},
player: {
regionLabel: 'Плеер',
openFullscreen: 'Полноэкранный плеер',
fullscreen: 'Полноэкранный режим',
closeFullscreen: 'Выйти из полноэкранного',
closeTooltip: 'Закрыть (Esc)',
noTitle: 'Без названия',
stop: 'Стоп',
prev: 'Предыдущий трек',
play: 'Играть',
pause: 'Пауза',
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: 'Громкость',
toggleQueue: 'Очередь',
collapseQueueResize: 'Свернуть очередь, изменить ширину',
moreOptions: 'Дополнительно',
equalizer: 'Эквалайзер',
miniPlayer: 'Мини-плеер',
lyrics: 'Текст',
lyricsLoading: 'Загрузка текста…',
lyricsNotFound: 'Текст не найден',
lyricsSourceNetease: 'Источник: Netease',
lyricsSourceLyricsplus: 'Источник: YouLyPlus',
showDuration: 'Показать длительность',
showRemainingTime: 'Показать оставшееся время',
},
nowPlayingInfo: {
tab: 'Инфо',
empty: 'Включите воспроизведение, чтобы увидеть информацию',
artist: 'Исполнитель',
songInfo: 'О треке',
onTour: 'В туре',
noTourEvents: 'Нет предстоящих концертов',
tourLoading: 'Загрузка…',
poweredByBandsintown: 'Данные о туре через Bandsintown',
bioReadMore: 'Читать дальше',
bioReadLess: 'Свернуть',
showMoreTours_one: 'Показать ещё {{count}}',
showMoreTours_few: 'Показать ещё {{count}}',
showMoreTours_many: 'Показать ещё {{count}}',
showMoreTours_other: 'Показать ещё {{count}}',
showLessTours: 'Свернуть',
enableBandsintownPrompt: 'Показать предстоящие концерты?',
enableBandsintownPromptDesc: 'Опционально. Загружает концерты текущего исполнителя через публичный API Bandsintown.',
enableBandsintownPrivacy: 'При включении имя текущего исполнителя отправляется в API Bandsintown для получения дат концертов. Аккаунт и личные данные не передаются.',
enableBandsintownAction: 'Включить',
role: {
artist: 'Исполнитель',
albumArtist: 'Исполнитель альбома',
composer: 'Композитор',
},
},
songInfo: {
title: 'О треке',
songTitle: 'Название',
artist: 'Исполнитель',
album: 'Альбом',
albumArtist: 'Альбомный исполнитель',
year: 'Год',
genre: 'Жанр',
duration: 'Длительность',
track: 'Номер',
format: 'Формат',
bitrate: 'Битрейт',
sampleRate: 'Частота',
bitDepth: 'Разрядность',
channels: 'Каналы',
fileSize: 'Размер файла',
path: 'Путь',
replayGainTrack: 'RG по треку',
replayGainAlbum: 'RG по альбому',
replayGainPeak: 'Пик RG',
mono: 'Моно',
stereo: 'Стерео',
},
playlists: {
title: 'Плейлисты',
newPlaylist: 'Новый плейлист',
unnamed: 'Без названия',
createName: 'Название…',
create: 'Создать',
cancel: 'Отмена',
empty: 'Плейлистов пока нет.',
emptyPlaylist: 'Плейлист пуст.',
addFirstSong: 'Добавьте первый трек',
notFound: 'Плейлист не найден.',
songs: 'Треков: {{n}}',
playAll: 'Воспроизвести всё',
shuffle: 'Перемешать',
addToQueue: 'В очередь',
back: 'К списку плейлистов',
deletePlaylist: 'Удалить',
confirmDelete: 'Нажмите ещё раз для подтверждения',
removeSong: 'Убрать из плейлиста',
addSongs: 'Добавить треки',
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: 'Импорт из CSV Spotify',
csvImportReport: 'Отчёт об импорте CSV',
csvImportTotal: 'Всего',
csvImportAdded: 'Добавлено',
csvImportDuplicates: 'Дубликаты',
csvImportNotFound: 'Не найдено',
csvImportNetworkErrors: 'Ошибки сети',
csvImportDuplicatesTitle: 'Дубликаты (уже в плейлисте):',
csvImportNotFoundTitle: 'Не найденные треки:',
csvImportNetworkErrorsTitle: 'Ошибки сети (можно повторить импорт):',
csvImportDownloadReport: 'Скачать отчёт',
csvImportClose: 'Закрыть',
csvImportNoValidTracks: 'В CSV-файле не найдено действительных треков',
csvImportFailed: 'Не удалось импортировать CSV-файл',
csvImportToast: '{{added}} добавлено, {{notFound}} не найдено, {{duplicates}} дубликатов',
csvImportDownloadSuccess: 'Отчёт успешно скачан',
csvImportDownloadError: 'Не удалось скачать отчёт',
},
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: 'Сортировка: прослушивания по убыванию',
},
mostPlayed: {
title: 'Популярное',
topArtists: 'Топ исполнителей',
topAlbums: 'Топ альбомов',
plays: '{{n}} прослушиваний',
sortMost: 'Сначала популярные',
sortLeast: 'Сначала малоизвестные',
loadMore: 'Загрузить больше альбомов',
noData: 'Пока нет данных о прослушивании. Начните слушать!',
noArtists: 'Все исполнители отфильтрованы.',
filterCompilations: 'Скрыть исполнителей сборников (Various Artists, Soundtracks и др.)',
filterCompilationsShort: 'Скрыть сборники',
},
losslessAlbums: {
empty: 'В этой библиотеке пока нет lossless-альбомов.',
unsupported: 'Этот сервер не предоставляет метаданные, необходимые для поиска lossless-альбомов.',
slowFetchHint: 'Загружается медленнее других страниц альбомов — Psysonic проходит весь каталог песен по качеству.',
},
radio: {
title: 'Онлайн-радио',
empty: 'Радиостанции не настроены.',
addStation: 'Добавить станцию',
editStation: 'Изменить',
deleteStation: 'Удалить станцию',
confirmDelete: 'Нажмите ещё раз для подтверждения',
stationName: 'Название станции…',
streamUrl: 'URL потока…',
homepageUrl: 'Сайт станции (необязательно)',
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: 'Следующий',
},
folderBrowser: {
empty: 'Папка пуста',
error: 'Ошибка загрузки',
},
deviceSync: {
title: 'Синхронизация устройства',
targetFolder: 'Папка назначения',
noFolderChosen: 'Папка не выбрана',
selectDrive: 'Выберите диск…',
refreshDrives: 'Обновить диски',
noDrivesDetected: 'Съёмные диски не обнаружены',
browseManual: 'Обзор вручную…',
free: 'свободно',
notMountedVolume: 'Цель не находится на смонтированном томе. Диск мог быть отключён.',
chooseFolder: 'Выбрать…',
filenameTemplate: 'Шаблон имени файла',
targetDevice: 'Целевое устройство',
templateHint: 'Переменные: {artist}, {album}, {title}, {track_number}, {disc_number}, {year}',
cleanupButton: 'Удалить файлы вне выборки',
cleanupNothingToDelete: 'Нечего удалять — устройство уже синхронизировано.',
confirmCleanup: 'Удалить {{count}} файл(ов) с устройства, не входящих в текущую выборку. Продолжить?',
cleanupComplete: '{{count}} файл(ов) удалено с устройства.',
selectedSources: 'Выбранные источники',
noSourcesSelected: 'Источники не выбраны. Нажмите на элементы в браузере, чтобы добавить их.',
clearAll: 'Очистить всё',
tabPlaylists: 'Плейлисты',
tabAlbums: 'Альбомы',
tabArtists: 'Исполнители',
searchPlaceholder: 'Поиск…',
syncButton: 'Синхронизировать на устройство',
actionTransfer: 'Перенести на устройство',
actionDelete: 'Удалить с устройства',
actionApplyAll: 'Применить все изменения',
templatePreview: 'Предпросмотр',
templatePresetStandard: 'Стандарт',
templatePresetMultiDisc: 'Мульти-диск',
templatePresetAltFolder: 'Альт. папка',
tokenSlashHint: '/ = разделитель папок',
cancel: 'Отмена',
noTargetDir: 'Сначала выберите папку назначения.',
noSources: 'Выберите хотя бы один источник.',
noTracks: 'В выбранных источниках не найдено треков.',
fetchError: 'Ошибка загрузки треков с сервера.',
syncComplete: 'Синхронизация завершена.',
dismiss: 'Закрыть',
cancelSync: 'Отмена',
syncCancelled: 'Синхронизация отменена ({{done}} / {{total}} перенесено).',
colName: 'Название',
colType: 'Тип',
colStatus: 'Статус',
onDevice: 'Управление устройством',
addSources: 'Добавить…',
syncResult: '{{done}} перенесено, {{skipped}} уже актуально ({{total}} всего)',
deleteFromDevice: 'Пометить для удаления ({{count}})',
confirmDelete: 'Удалить {{count}} запись(ей) с устройства: {{names}}?',
deleteComplete: '{{count}} запись(ей) удалено с устройства.',
manifestImported: 'Импортировано {{count}} источник(ов) из манифеста устройства.',
statusSynced: 'Синхронизировано',
statusPending: 'Ожидает',
statusDeletion: 'Удаление',
markForDeletion: 'Пометить для удаления',
removeSource: 'Удалить',
undoDeletion: 'Отменить удаление',
syncInBackground: 'Синхронизация запущена в фоне — можно перейти в другой раздел.',
syncInProgress: '{{done}} / {{total}} треков…',
syncSummary: 'Сводка синхронизации',
calculating: 'Вычисление необходимых данных…',
filesToAdd: 'Файлы для добавления:',
filesToDelete: 'Файлы для удаления:',
netChange: 'Чистое изменение:',
availableSpace: 'Доступное место на диске:',
spaceWarning: 'Предупреждение: на целевом устройстве недостаточно сообщаемого места.',
proceed: 'Продолжить синхронизацию',
notEnoughSpace: 'Обнаружено недостаточно физического места на диске!',
liveSearch: 'Live',
randomAlbumsLabel: 'Случайные альбомы',
},
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: 'Velvet 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',
helpTitle: 'Как работает Orbit',
helpIntro: 'Orbit превращает Psysonic в общую комнату прослушивания. Хост выбирает музыку; гости слушают синхронно и могут предлагать треки.',
helpHostOnly: '(хост)',
helpSec1Title: 'Что такое Orbit?',
helpSec1Body: 'Режим «слушать вместе» — хост управляет воспроизведением, гости подключаются. Всё идёт через плейлисты на твоём собственном сервере Navidrome; никакой внешней инфраструктуры.',
helpSec2Title: 'Хост и гости',
helpSec2Body: 'Хост управляет воспроизведением (play / pause / skip / seek) и решает, когда завершить сессию. Гости следуют за воспроизведением хоста, могут предлагать треки и выходить или присоединяться в любое время. Только хост может исключать или навсегда банить участников.',
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 мин). Если твоё воспроизведение отклоняется от хоста, кнопка «Догнать» в панели сессии возвращает тебя к live-позиции хоста.',
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: 'Периодическое Fisher-Yates перемешивание предстоящей очереди. Выкл.: порядок меняется только при ручной перестановке.',
settingShuffleInterval: 'Перемешивать каждые',
settingShuffleIntervalHint: 'Как часто предстоящая очередь перемешивается во время сессии.',
suggestBlockedMuted: 'Хост отключил тебе предложение треков на этой сессии.',
settingShuffleIntervalValue_one: '{{count}} мин',
settingShuffleIntervalValue_few: '{{count}} мин',
settingShuffleIntervalValue_many: '{{count}} мин',
settingShuffleIntervalValue_other: '{{count}} мин',
settingShuffleNow: 'Перемешать сейчас',
toastSuggested: '{{user}} предложил «{{title}}»',
toastSuggestedMany: '{{count}} новых предложений в очереди',
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: 'Live',
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: 'ОК',
},
tray: {
playPause: 'Воспроизвести / Пауза',
nextTrack: 'Следующий трек',
previousTrack: 'Предыдущий трек',
showHide: 'Показать / Скрыть',
exitPsysonic: 'Закрыть Psysonic',
nothingPlaying: 'Ничего не воспроизводится',
},
licenses: {
title: 'Лицензии открытого кода',
intro: 'Psysonic построен на программном обеспечении с открытым исходным кодом. Список ниже показывает каждую зависимость, поставляемую с приложением, с версией, лицензией и полным текстом лицензии.',
highlights: 'Ключевые зависимости',
searchPlaceholder: 'Поиск по имени, версии или лицензии…',
noResults: 'Нет совпадений.',
loading: 'Загрузка лицензий…',
loadError: 'Не удалось загрузить данные о лицензиях.',
noLicenseText: 'Текст лицензии для этой зависимости не включён.',
viewSource: 'Открыть исходник',
totalLine: '{{total}} зависимостей — {{cargo}} cargo, {{npm}} npm',
generatedAt: 'Последняя генерация {{date}}',
},
};