mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
18b4a982ef
* feat(queue): add ETA display, equalizer indicator and collapsible now playing
* deleted endsAt and showDuration strings, changed eta update to 30s
* feat(queue): ETA tooltip, persistent Now Playing collapse, EQ bar pause, remove redundant Play icon
* feat(queue): fold ETA into existing total/remaining toggle as third mode
The standalone ETA span next to the track counter is removed; instead the
clickable duration label in the queue header now rotates through three
modes per click: total → remaining → eta → total. Counter (N/M) stays
where it was.
ETA mode keeps the live-feel treatment from the original PR (accent
colour while playing, muted at 50% opacity when paused). The other two
modes use plain accent.
i18n: queue.etaTooltip removed (no longer a separate descriptive label),
queue.showEta added as the action tooltip ('Show estimated end time')
in all 8 locales — matches the showRemaining / showTotal pattern.
* docs(changelog): add #419 queue UX improvements entry
Adds the [1.45.0] / Added entry for this PR's queue panel refinements
(position counter, tri-state duration toggle including ETA, collapsible
Now Playing section, animated EQ indicator).
---------
Co-authored-by: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com>
1818 lines
128 KiB
TypeScript
1818 lines
128 KiB
TypeScript
/** Russian UI strings — natural phrasing for a music desktop app */
|
||
export const ruTranslation = {
|
||
sidebar: {
|
||
library: 'Медиатека',
|
||
mainstage: 'Для вас',
|
||
newReleases: 'Новинки',
|
||
allAlbums: 'Все альбомы',
|
||
randomAlbums: 'Случайные альбомы',
|
||
randomPicker: 'Собрать микс',
|
||
artists: 'Исполнители',
|
||
randomMix: 'Случайный микс',
|
||
favorites: 'Избранное',
|
||
nowPlaying: 'Сейчас играет',
|
||
system: 'Система',
|
||
statistics: 'Статистика',
|
||
settings: 'Настройки',
|
||
help: 'Справка',
|
||
expand: 'Развернуть боковую панель',
|
||
collapse: 'Свернуть боковую панель',
|
||
downloadingTracks: 'Кэширование {{n}} треков…',
|
||
syncingTracks: 'Синхронизация {{done}}/{{total}}…',
|
||
cancelDownload: 'Отменить загрузку',
|
||
offlineLibrary: 'Офлайн-библиотека',
|
||
genres: 'Жанры',
|
||
tracks: 'Треки',
|
||
playlists: 'Плейлисты',
|
||
smartPlaylists: 'Смарт-плейлисты',
|
||
mostPlayed: 'Популярное',
|
||
radio: 'Онлайн-радио',
|
||
folderBrowser: 'Браузер папок',
|
||
deviceSync: 'Синхронизация устройства',
|
||
libraryScope: 'Область медиатеки',
|
||
allLibraries: 'Все библиотеки',
|
||
expandPlaylists: 'Развернуть плейлисты',
|
||
collapsePlaylists: 'Свернуть плейлисты',
|
||
more: 'Ещё',
|
||
feelingLucky: 'Мне повезёт',
|
||
},
|
||
home: {
|
||
hero: 'Подборка',
|
||
starred: 'Личное избранное',
|
||
recent: 'Недавно добавлено',
|
||
mostPlayed: 'Популярное',
|
||
recentlyPlayed: 'Недавно проиграно',
|
||
discover: 'Обзор',
|
||
discoverSongs: 'Открыть треки',
|
||
loadMore: 'Ещё',
|
||
discoverMore: 'Смотреть ещё',
|
||
discoverArtists: 'Исполнители',
|
||
discoverArtistsMore: 'Все исполнители',
|
||
},
|
||
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: 'Исполнитель на сервере не найден.',
|
||
openedTrack: 'Воспроизводится присланный трек.',
|
||
openedAlbum: 'Открывается присланный альбом.',
|
||
openedArtist: 'Открывается присланный исполнитель.',
|
||
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: 'Оценка исполнителя',
|
||
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: 'Не удалось загрузить изображение',
|
||
},
|
||
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: 'Жанр',
|
||
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: 'Случайная подборка',
|
||
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: 'В плейлист',
|
||
},
|
||
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: 'Сбросить',
|
||
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.',
|
||
discordAppleCovers: 'Загружать обложки через Apple Music для Discord',
|
||
discordAppleCoversDesc: 'Отправляет имя исполнителя и альбома в Apple Music API для поиска обложки для профиля Discord. По умолчанию отключено из соображений конфиденциальности.',
|
||
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: 'Открыть мини-плеер',
|
||
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: 'Заранее подгружать следующий трек, чтобы не было тишины',
|
||
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: 'Справка',
|
||
s1: 'С чего начать',
|
||
q1: 'Какие серверы подходят?',
|
||
a1:
|
||
'Любой с API Subsonic: Navidrome, Gonic, Subsonic, Airsonic и др. Для новых проектов чаще всего рекомендуют Navidrome.',
|
||
q2: 'Как подключиться?',
|
||
a2:
|
||
'Настройки → «Добавить сервер»: адрес (например 192.168.1.100:4533), логин и пароль. Соединение проверяется до сохранения — при ошибке профиль не записывается.',
|
||
q3: 'Можно несколько серверов?',
|
||
a3: 'Да. Добавляйте сколько нужно и переключайтесь. Активен всегда один.',
|
||
s2: 'Воспроизведение',
|
||
q4: 'Как включить музыку?',
|
||
a4:
|
||
'Двойной щелчок по треку. На странице альбома или исполнителя — «Воспроизвести всё». Треки можно перетащить в панель очереди.',
|
||
q5: 'Какие есть горячие клавиши?',
|
||
a5:
|
||
'Пробел — пауза/воспроизведение, Esc — закрыть полноэкранный плеер. Медиаклавиши работают на всех платформах; на Linux иногда удобнее кнопки в панели плеера. Свои сочетания — в Настройках.',
|
||
q6: 'Что такое очередь?',
|
||
a6:
|
||
'Список следующих треков. Открывается иконкой справа вверху. Можно перетаскивать порядок, перемешивать и сохранять как плейлист.',
|
||
q7: 'Как открыть полноэкранный плеер?',
|
||
a7: 'Миниатюра обложки внизу или кнопка разворота рядом. Esc — выход.',
|
||
q8: 'Как работает повтор?',
|
||
a8: 'Кнопка повтора в панели: выкл. → все → один трек.',
|
||
s3: 'Медиатека',
|
||
q9: 'Как скачать альбом?',
|
||
a9:
|
||
'Страница альбома → «Скачать (ZIP)». Сервер сначала собирает архив — для больших альбомов или FLAC это может занять время; прогресс появится, когда начнётся передача файла.',
|
||
q10: 'Как добавить в избранное?',
|
||
a10: 'Звёздочка у трека или в шапке альбома. Всё избранное — в разделе слева.',
|
||
q11: 'Что за карусель на главной?',
|
||
a11:
|
||
'Случайные альбомы из библиотеки, смена примерно каждые 10 с. Точки — перейти к слайду, клик по баннеру — открыть альбом.',
|
||
s4: 'Настройки',
|
||
q12: 'Как сменить тему?',
|
||
a12: 'Настройки → Тема. Много готовых наборов в нескольких категориях.',
|
||
q13: 'Как сменить язык?',
|
||
a13:
|
||
'Настройки → Язык: английский, немецкий, французский, нидерландский, китайский, норвежский, русский и русский (альтернативный, Русский 2).',
|
||
q15: 'Куда сохраняются ZIP?',
|
||
a15:
|
||
'Настройки → Поведение → папка загрузок. Без выбора используется стандартная папка загрузок браузера/системы.',
|
||
s5: 'Скробблинг',
|
||
q16: 'Как устроен скробблинг?',
|
||
a16:
|
||
'Psysonic шлёт прослушивания напрямую на Last.fm — в Navidrome ничего настраивать не нужно. Подключите аккаунт в настройках.',
|
||
q17: 'Когда уходит скроббл?',
|
||
a17: 'После прослушивания примерно половины трека.',
|
||
q22: 'Что за волна внизу?',
|
||
a22:
|
||
'Волновая шкала вместо ползунка: клик — переход, перетаскивание — перемотка. Пройденный фрагмент подсвечен, дальше — буфер и остаток.',
|
||
q24: 'Можно перемешать очередь?',
|
||
a24: 'Да. В панели очереди — кнопка перемешивания. Текущий трек остаётся первым.',
|
||
q25: 'Ссылки Last.fm и Wikipedia открываются в браузере?',
|
||
a25: 'Да, в системном браузере по умолчанию. Кратко показывается подтверждение.',
|
||
s7: 'Случайный микс',
|
||
q26: 'Что такое случайный микс?',
|
||
a26:
|
||
'Случайный набор треков из всей библиотеки. Раздел в боковой панели → «Новый микс». Число треков можно задать заранее.',
|
||
q27: 'Что за фильтр по словам?',
|
||
a27:
|
||
'Исключает треки, где в жанре, названии или альбоме есть заданные слова. Аудиокниги отсекаются автоматически. Свои слова — в настройках микса или кликом по тегу жанра в списке.',
|
||
q28: 'Что за «супер-микс» по жанру?',
|
||
a28:
|
||
'Грубая группировка стилей (рок, метал, электроника и т. д.) и микс внутри выбранной группы. Результаты подгружаются по мере запросов.',
|
||
s6: 'Если что-то не так',
|
||
q18: 'Медленно грузятся обложки.',
|
||
a18:
|
||
'Первый раз картинки тянутся с сервера и кэшируются на ~30 дней. Медленный диск на сервере даёт задержку только при первом заходе.',
|
||
q19: 'Тест соединения не проходит.',
|
||
a19:
|
||
'Проверьте адрес с портом (http://192.168.1.100:4533), файрвол, для локалки иногда нужен http вместо https. Логин и пароль должны совпадать с сервером.',
|
||
q20: 'Нет звука в Linux.',
|
||
a20:
|
||
'Есть пакеты .deb, .rpm и AUR. Убедитесь, что запущены PipeWire или PulseAudio.',
|
||
q21: 'Чёрный экран в Linux.',
|
||
a21:
|
||
'Часто драйвер GPU / WebKitGTK. Запуск с GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1. В официальных пакетах это часто уже задано.',
|
||
q29: 'Кроссфейд и воспроизведение без пауз?',
|
||
a29:
|
||
'Экспериментальные опции в Настройках → Звук. Режим без пауз заранее подгружает следующий трек. Кроссфейд плавно накладывает треки, длина 1–10 с.',
|
||
q30: 'Есть тексты песен?',
|
||
a30:
|
||
'Да. Иконка микрофона в панели плеера — вкладка текстов в очереди. Источник LRCLIB; синхронные строки подсвечиваются по ходу трека.',
|
||
q31: 'Можно переназначить клавиши?',
|
||
a31: 'Да: Настройки → сочетания в приложении и глобальные (работают в фоне).',
|
||
q32: 'Можно сменить шрифт?',
|
||
a32: 'Да, в настройках шрифта — набор гарнитур на весь интерфейс.',
|
||
s8: 'Офлайн',
|
||
q34: 'Что такое офлайн-режим?',
|
||
a34:
|
||
'Кэш альбомов на устройстве для прослушивания без сервера. Воспроизведение идёт с диска.',
|
||
q35: 'Как сохранить альбом офлайн?',
|
||
a35:
|
||
'Страница альбома → иконка загрузки в шапке. Прогресс на кнопке, после загрузки — индикатор готовности. Список — в офлайн-библиотеке.',
|
||
q36: 'Сколько места занимает офлайн?',
|
||
a36:
|
||
'Лимит задаётся в настройках. При переполнении на странице альбома появится предупреждение; удалить можно из офлайн-библиотеки.',
|
||
q37: 'Как ставить оценки трекам, альбомам и исполнителям?',
|
||
a37: 'Psysonic поддерживает оценки от 1 до 5 звёзд через OpenSubsonic API (требует Navidrome ≥ 0.53). Треки оцениваются в списке треков альбома или плейлиста, в контекстном меню или прямо в панели плеера. Альбомы — на странице альбома, исполнители — на странице исполнителя.',
|
||
q38: 'Можно ли удалить или изменить оценку?',
|
||
a38: 'Да. Повторный клик по активной звезде полностью удаляет оценку — второй клик по той же звезде её стирает. Для изменения оценки просто нажмите другую звезду.',
|
||
q39: 'Что такое Skip-to-1★ и фильтр по рейтингу?',
|
||
a39: 'Skip-to-1★ автоматически присваивает оценку 1 звезда после заданного числа последовательных пропусков. Включается в Настройки → Рейтинги. Там же задаётся минимальный рейтинг для случайных миксов.',
|
||
q40: 'Что такое браузер папок?',
|
||
a40: 'Браузер папок (боковая панель) позволяет навигировать по музыкальному каталогу сервера в колонках Миллера. Клик по папке открывает содержимое; иконка воспроизведения запускает или добавляет в очередь.',
|
||
q41: 'Что такое планировщик тем?',
|
||
a41: 'Настройки → Внешний вид → Авто-смена темы: задайте дневную и ночную тему со временем начала. Psysonic переключается автоматически в указанное время.',
|
||
q42: 'Можно ли масштабировать интерфейс?',
|
||
a42: 'Да. Настройки → Внешний вид → Масштаб интерфейса позволяет масштабировать весь UI от 80 % до 125 %.',
|
||
q43: 'Можно ли изменить стиль seekbar?',
|
||
a43: 'Да. Настройки → Внешний вид → Стиль seekbar предлагает 10 стилей: Осциллограмма, Линия и точка, Полоса, Толстая полоса, Сегментированная, Неоновое свечение, Пульсовая волна, Частицы, Жидкое заполнение и Ретро кассета.',
|
||
q44: 'Что такое AutoEQ?',
|
||
a44: '10-полосный эквалайзер в Настройки → Аудио включает поиск AutoEQ. Введите модель наушников — Psysonic автоматически загрузит и применит профиль коррекции.',
|
||
q45: 'Что такое Replay Gain?',
|
||
a45: 'Replay Gain нормализует громкость, чтобы громкие и тихие альбомы воспроизводились на одинаковом уровне. Включается в Настройки → Аудио → Replay Gain; режим трека или альбома.',
|
||
q46: 'Что такое горячий кэш?',
|
||
a46: 'Горячий кэш (Alpha, Настройки → Библиотека) предзагружает следующие треки очереди на диск для мгновенного воспроизведения. Psysonic хранит текущий трек и следующие 5, вытесняя старые записи при достижении лимита.',
|
||
q47: 'Можно ли кэшировать плейлист для офлайн?',
|
||
a47: 'Да. Откройте детали плейлиста и нажмите иконку загрузки. После полного кэширования иконка сменяется на красную корзину; нажмите её, чтобы удалить плейлист из офлайн-кэша.',
|
||
q48: 'Что такое бесконечная очередь?',
|
||
a48: 'Когда очередь заканчивается и повтор отключён, Psysonic автоматически добавляет случайные треки, чтобы воспроизведение не прерывалось. Автодобавленные треки отображаются под разделителем «— Добавлено автоматически —».',
|
||
q49: 'Можно ли управлять Psysonic через командную строку?',
|
||
a49: 'Да. Примеры: psysonic --player play / pause / next / prev, --player volume 75, --player seek 15, --player mute, --player shuffle, --player repeat off|all|one. Также: переключение сервера, аудиоустройства, фильтрация библиотеки и поиск. Полная справка: psysonic --player --help.',
|
||
q50: 'Как управлять плейлистами?',
|
||
a50: 'Через «Плейлисты» на боковой панели. Создайте новый плейлист кнопкой «Новый плейлист». В детальном представлении перетаскивайте треки для сортировки, удаляйте кнопкой ×, добавляйте через поиск и используйте «Предложения» для умных рекомендаций.',
|
||
q51: 'Можно ли создать резервную копию настроек?',
|
||
a51: 'Да. Настройки → Резервная копия и восстановление экспортирует все настройки, профили серверов, темы и горячие клавиши в JSON-файл.',
|
||
q52: 'Как изменить устройство вывода звука?',
|
||
a52: 'Настройки → Аудио → Устройство вывода. Psysonic показывает все доступные выходы. Выбор вступает в силу немедленно.',
|
||
q53: 'Что такое синхронизация с устройством?',
|
||
a53: 'Device Sync копирует альбомы, плейлисты или исполнителей на USB-накопитель или SD-карту. Откройте через «Device Sync» на боковой панели, выберите папку назначения, источники и нажмите «Передать на устройство».',
|
||
q54: 'Что такое шаблон имени файла в Device Sync?',
|
||
a54: 'Шаблон определяет, как треки будут называться и организованы. Используйте предустановки или создайте свой шаблон из токенов: {artist}, {album}, {title}, {track_number}, {disc_number}, {year} и / как разделитель папок.',
|
||
q55: 'Работает ли Device Sync между разными платформами?',
|
||
a55: 'Да. Манифест на устройстве содержит использованный шаблон. На другой ОС Psysonic корректно распознаёт уже существующие файлы.',
|
||
s9: 'Device Sync',
|
||
q56: 'Что такое интернет-радио?',
|
||
a56: 'Страница интернет-радио позволяет воспроизводить прямые трансляции в Psysonic. Станции берутся с сервера Navidrome. Воспроизведение использует HTML5-аудио.',
|
||
q57: 'Какие форматы потоков поддерживает интернет-радио?',
|
||
a57: 'MP3, AAC, OGG Vorbis и большинство HLS-потоков. MP3 и AAC работают на всех платформах.',
|
||
s10: 'Интернет-радио',
|
||
q58: 'Откуда Psysonic берёт тексты песен?',
|
||
a58: 'Три настраиваемых источника в Настройках → Тексты: сервер Navidrome, LRCLIB и NetEase Cloud Music. Каждый источник можно включить/отключить и приоритизировать перетаскиванием.',
|
||
q59: 'Есть ли просмотр того, что слушают другие пользователи?',
|
||
a59: 'Да. Нажмите на иконку трансляции в правом верхнем углу, чтобы увидеть, что слушают другие пользователи на вашем сервере Navidrome, с обновлением каждые 10 секунд.',
|
||
},
|
||
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: 'Скрыть сборники',
|
||
},
|
||
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: 'Ничего не воспроизводится',
|
||
},
|
||
};
|