mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
ed76090a54
The waveform-loudness-cache merge replaced the existing deterministic per-track-ID waveform with a bins-based one driven by the analysis cache. The bins-based variant is the better default but the old deterministic look is still valuable when no analysis is available (brand-new track, cache-miss, etc.) and several users prefer it. Split into two explicit options in the seekbar style picker: - 'truewave' (default, replaces old 'waveform') — bins from the analysis cache, with morph-on-arrival animation and flat-line fallback while empty. - 'pseudowave' — pseudo-random heights derived deterministically from the track ID. No analysis dependency, no morph, instant render. Existing persisted seekbarStyle: 'waveform' is migrated to 'truewave' in onRehydrateStorage so users keep the visual they have today. The useEffect that builds heightsRef now lists seekbarStyle in its deps so switching between the two is live. i18n labels added in all 8 locales. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1766 lines
124 KiB
TypeScript
1766 lines
124 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: 'Добавить',
|
||
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: 'Предусиление (файлы с тегами)',
|
||
replayGainFallback: 'Резерв (без тегов / радио)',
|
||
normalization: 'Нормализация',
|
||
loudnessTargetLufs: 'Целевой LUFS',
|
||
loudnessPreAnalysisAttenuation: 'Ослабление до измерения (dB)',
|
||
loudnessPreAnalysisAttenuationDesc:
|
||
'Насколько приглушить звук, пока для трека нет сохранённого измерения громкости. При стриме дальше идут лишь грубые оценки, не полный LUFS. 0 dB — без дополнительного приглушения; ниже — тише.',
|
||
loudnessPreAnalysisAttenuationReset: 'По умолчанию',
|
||
crossfade: 'Кроссфейд',
|
||
crossfadeDesc: 'Плавный переход между треками',
|
||
crossfadeSecs: '{{n}} с',
|
||
notWithGapless: 'Недоступно при включённом режиме без пауз',
|
||
notWithCrossfade: 'Недоступно при включённом кроссфейде',
|
||
gapless: 'Без пауз между треками',
|
||
gaplessDesc: 'Заранее подгружать следующий трек, чтобы не было тишины',
|
||
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: 'Скрыть',
|
||
close: 'Закрыть',
|
||
nextTracks: 'Дальше',
|
||
shareQueue: 'Копировать ссылку на очередь',
|
||
shareQueueEmpty: 'Очередь пуста — нечем поделиться.',
|
||
emptyQueue: 'Очередь пуста.',
|
||
trackSingular: 'трек',
|
||
trackPlural: 'треков',
|
||
showRemaining: 'Осталось',
|
||
showTotal: 'Всего',
|
||
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: 'Пауза',
|
||
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: 'Очередь',
|
||
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: 'В плейлист',
|
||
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}} дубликатов)',
|
||
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: 'ОК',
|
||
},
|
||
};
|