/** Russian UI strings — natural phrasing for a music desktop app */
export const ruTranslation = {
  sidebar: {
    library: 'Медиатека',
    mainstage: 'Для вас',
    newReleases: 'Новинки',
    allAlbums: 'Все альбомы',
    randomAlbums: 'Случайные альбомы',
    randomPicker: 'Собрать микс',
    artists: 'Исполнители',
    composers: 'Композиторы',
    randomMix: 'Случайный микс',
    favorites: 'Избранное',
    nowPlaying: 'Сейчас играет',
    system: 'Система',
    statistics: 'Статистика',
    settings: 'Настройки',
    help: 'Справка',
    expand: 'Развернуть боковую панель',
    collapse: 'Свернуть боковую панель',
    downloadingTracks: 'Кэширование {{n}} треков…',
    syncingTracks: 'Синхронизация {{done}}/{{total}}…',
    cancelDownload: 'Отменить загрузку',
    offlineLibrary: 'Офлайн-библиотека',
    genres: 'Жанры',
    tracks: 'Треки',
    playlists: 'Плейлисты',
    smartPlaylists: 'Смарт-плейлисты',
    mostPlayed: 'Популярное',
    losslessAlbums: 'Lossless',
    radio: 'Онлайн-радио',
    folderBrowser: 'Браузер папок',
    deviceSync: 'Синхронизация устройства',
    libraryScope: 'Область медиатеки',
    allLibraries: 'Все библиотеки',
    expandPlaylists: 'Развернуть плейлисты',
    collapsePlaylists: 'Свернуть плейлисты',
    more: 'Ещё',
    feelingLucky: 'Мне повезёт',
  },
  home: {
    hero: 'Подборка',
    starred: 'Личное избранное',
    recent: 'Недавно добавлено',
    mostPlayed: 'Популярное',
    recentlyPlayed: 'Недавно проиграно',
    losslessAlbums: 'Lossless-альбомы',
    discover: 'Обзор',
    discoverSongs: 'Открыть треки',
    loadMore: 'Ещё',
    discoverMore: 'Смотреть ещё',
    discoverArtists: 'Исполнители',
    discoverArtistsMore: 'Все исполнители',
    becauseYouLike: 'Потому что вы слушали…',
    becauseYouLikeFor: 'Потому что вы слушали {{artist}}',
    similarTo: 'Похоже на {{artist}}',
    becauseYouLikeTracks_one: '{{count}} трек',
    becauseYouLikeTracks_few: '{{count}} трека',
    becauseYouLikeTracks_many: '{{count}} треков',
    becauseYouLikeTracks_other: '{{count}} треков',
  },
  hero: {
    eyebrow: 'Альбом дня',
    playAlbum: 'Воспроизвести альбом',
    enqueue: 'В очередь',
    enqueueTooltip: 'Добавить весь альбом в очередь',
  },
  search: {
    placeholder: 'Исполнитель, альбом или трек…',
    noResults: 'Ничего не найдено по запросу «{{query}}»',
    artists: 'Исполнители',
    albums: 'Альбомы',
    songs: 'Треки',
    clearLabel: 'Очистить поиск',
    addedToQueueToast: '«{{title}}» добавлен в очередь',
    title: 'Поиск',
    resultsFor: 'Результаты по «{{query}}»',
    album: 'Альбом',
    advanced: 'Расширенный поиск',
    advancedSearchTerm: 'Поисковый запрос',
    advancedSearchPlaceholder: 'Название, альбом, исполнитель…',
    advancedGenre: 'Жанр',
    advancedAllGenres: 'Все жанры',
    advancedYear: 'Год',
    advancedYearFrom: 'от',
    advancedYearTo: 'до',
    advancedAll: 'Все',
    advancedSearch: 'Найти',
    advancedEmpty: 'Введите запрос или выберите фильтр.',
    advancedNoResults: 'Ничего не найдено.',
    advancedGenreNote: 'Треки выбираются случайно в рамках жанра.',
    recentSearches: 'Недавние запросы',
    browse: 'Обзор',
    emptyHint: 'Что хочешь послушать?',
    genres: 'Жанры',
  },
  nowPlaying: {
    tooltip: 'Кто сейчас слушает?',
    title: 'Кто сейчас слушает?',
    loading: 'Загрузка…',
    nobody: 'Сейчас никто не слушает.',
    minutesAgo: '{{n}} мин назад',
    nothingPlaying: 'Пока ничего не играет — включите трек.',
    aboutArtist: 'Об исполнителе',
    fromAlbum: 'Из этого альбома',
    viewAlbum: 'Просмотр альбома',
    goToArtist: 'Перейти к исполнителю',
    readMore: 'Читать далее',
    showLess: 'Свернуть',
    genreInfo: 'Жанр',
    trackInfo: 'О треке',
    topSongs: 'Самое популярное у этого исполнителя',
    topSongsCredit: 'Топ-треки исполнителя {{name}}',
    trackPosition: 'Трек {{pos}}',
    playsCount_one: '{{count}} прослушивание',
    playsCount_few: '{{count}} прослушивания',
    playsCount_many: '{{count}} прослушиваний',
    playsCount_other: '{{count}} прослушиваний',
    releasedYearsAgo_one: '{{count}} год назад',
    releasedYearsAgo_few: '{{count}} года назад',
    releasedYearsAgo_many: '{{count}} лет назад',
    releasedYearsAgo_other: '{{count}} лет назад',
    discography: 'Дискография',
    lastfmStats: 'Статистика Last.fm',
    thisTrack: 'Этот трек',
    thisArtist: 'Этот исполнитель',
    listeners: 'слушателей',
    scrobbles: 'прослушиваний',
    yourScrobbles: 'вами',
    listenersN: '{{n}} слушателей',
    scrobblesN: '{{n}} прослушиваний',
    playsByYouN: 'прослушано вами {{n}}×',
    openTrackOnLastfm: 'Трек на Last.fm',
    openArtistOnLastfm: 'Исполнитель на Last.fm',
    rgTrackTooltip: 'ReplayGain (трек)',
    rgAlbumTooltip: 'ReplayGain (альбом)',
    rgAutoTooltip: 'ReplayGain (авто)',
    showMoreTracks: 'Показать ещё {{count}}',
    showLessTracks: 'Свернуть',
    hideCard: 'Скрыть карточку',
    layoutMenu: 'Макет',
    visibleCards: 'Видимые карточки',
    hiddenCards: 'Скрытые карточки',
    noHiddenCards: 'Нет скрытых карточек',
    resetLayout: 'Сбросить макет',
    emptyColumn: 'Перетащите карточки сюда',
  },
  contextMenu: {
    playNow: 'Играть сейчас',
    playNext: 'Играть следующим',
    addToQueue: 'В конец очереди',
    enqueueAlbum: 'Альбом в очередь',
    enqueueAlbums_one: '{{count}} альбом в очередь',
    enqueueAlbums_few: '{{count}} альбома в очередь',
    enqueueAlbums_many: '{{count}} альбомов в очередь',
    enqueueAlbums_other: '{{count}} альбомов в очередь',
    startRadio: 'Радио по похожим',
    instantMix: 'Instant Mix',
    instantMixFailed: 'Не удалось собрать Instant Mix — ошибка сервера или плагина.',
    cliMixNeedsTrack: 'Ничего не играет — сначала начните воспроизведение, затем снова выполните команду микса.',
    lfmLove: 'Любимое на Last.fm',
    lfmUnlove: 'Убрать с Last.fm',
    favorite: 'В избранное',
    favoriteArtist: 'Исполнитель в избранное',
    favoriteAlbum: 'Альбом в избранное',
    unfavorite: 'Убрать из избранного',
    unfavoriteArtist: 'Убрать исполнителя из избранного',
    unfavoriteAlbum: 'Убрать альбом из избранного',
    removeFromQueue: 'Убрать из очереди',
    removeFromPlaylist: 'Убрать из плейлиста',
    openAlbum: 'Открыть альбом',
    goToArtist: 'К исполнителю',
    download: 'Скачать (ZIP)',
    addToPlaylist: 'В плейлист',
    selectedPlaylists: '{{count}} плейлистов выбрано',
    selectedAlbums: '{{count}} альбомов выбрано',
    selectedArtists: '{{count}} исполнителей выбрано',
    songInfo: 'Сведения о треке',
    shareLink: 'Копировать ссылку для обмена',
    shareCopied: 'Ссылка для обмена скопирована в буфер.',
    shareCopyFailed: 'Не удалось скопировать в буфер.',
  },
  sharePaste: {
    notLoggedIn: 'Войдите и добавьте сервер, затем вставьте ссылку.',
    noMatchingServer: 'Ни один сохранённый сервер не совпадает с адресом из ссылки. Добавьте сервер: {{url}}',
    trackUnavailable: 'Трек на сервере не найден.',
    albumUnavailable: 'Альбом на сервере не найден.',
    artistUnavailable: 'Исполнитель на сервере не найден.',
    composerUnavailable: 'Композитор на сервере не найден.',
    openedTrack: 'Воспроизводится присланный трек.',
    openedAlbum: 'Открывается присланный альбом.',
    openedArtist: 'Открывается присланный исполнитель.',
    openedComposer: 'Открывается присланный композитор.',
    openedQueue_one: 'Воспроизводится присланная очередь: {{count}} трек.',
    openedQueue_few: 'Воспроизводится присланная очередь: {{count}} трека.',
    openedQueue_many: 'Воспроизводится присланная очередь: {{count}} треков.',
    openedQueue_other: 'Воспроизводится присланная очередь: {{count}} треков.',
    openedQueuePartial:
      'Воспроизводится {{played}} из {{total}} треков по ссылке ({{skipped}} на этом сервере не найдены).',
    queueAllUnavailable: 'Ни один из треков по ссылке не найден на сервере.',
    genericError: 'Не удалось открыть ссылку для обмена.',
  },
  albumDetail: {
    back: 'Назад',
    orbitDoubleClickHint: 'Двойной клик, чтобы добавить этот трек в очередь Orbit',
    playAll: 'Воспроизвести всё',
    shareAlbum: 'Поделиться альбомом',
    enqueue: 'В очередь',
    enqueueTooltip: 'Добавить весь альбом в очередь',
    artistBio: 'Биография',
    download: 'Скачать (ZIP)',
    downloading: 'Загрузка…',
    cacheOffline: 'Сохранить офлайн',
    offlineCached: 'Доступно офлайн',
    offlineDownloading: 'Кэширование… ({{n}} из {{total}})',
    removeOffline: 'Удалить офлайн-копию',
    offlineStorageFull:
      'Место для офлайн закончилось (лимит {{mb}} МБ). Освободите место в офлайн-библиотеке или увеличьте лимит в настройках.',
    offlineStorageGoToLibrary: 'Офлайн-библиотека',
    offlineStorageGoToSettings: 'Настройки',
    favoriteAdd: 'В избранное',
    favoriteRemove: 'Убрать из избранного',
    favorite: 'Избранное',
    noBio: 'Биография недоступна.',
    moreByArtist: 'Ещё от {{artist}}',
    tracksCount: 'Композиций: {{n}}',
    goToArtist: 'Перейти к {{artist}}',
    moreLabelAlbums: 'Другие альбомы на {{label}}',
    trackTitle: 'Название',
    trackAlbum: 'Альбом',
    trackArtist: 'Исполнитель',
    trackGenre: 'Жанр',
    trackFormat: 'Формат',
    trackFavorite: 'Избранное',
    trackRating: 'Оценка',
    trackDuration: 'Длительность',
    trackTotal: 'Итого',
    columns: 'Колонки',
    resetColumns: 'Сбросить',
    notFound: 'Альбом не найден.',
    bioModal: 'Биография исполнителя',
    bioClose: 'Закрыть',
    ratingLabel: 'Оценка',
    enlargeCover: 'Увеличить обложку',
    filterSongs: 'Фильтр треков…',
    sortNatural: 'По умолчанию',
    sortByTitle: 'А–Я (название)',
    sortByArtist: 'А–Я (исполнитель)',
    sortByAlbum: 'А–Я (альбом)',
  },
  entityRating: {
    albumShort: 'Оценка альбома',
    artistShort: 'Оценка исполнителя',
    albumAriaLabel: 'Оценка альбома',
    artistAriaLabel: 'Оценка исполнителя',
    selectedArtistsRatingAriaLabel: 'Звёздная оценка для выбранных исполнителей ({{count}})',
    selectedAlbumsRatingAriaLabel: 'Звёздная оценка для выбранных альбомов ({{count}})',
    saveFailed: 'Не удалось сохранить оценку.',
  },
  artistDetail: {
    back: 'Назад',
    albums: 'Альбомы',
    album: 'Альбом',
    playAll: 'Воспроизвести всё',
    shareArtist: 'Поделиться исполнителем',
    shuffle: 'Перемешать',
    radio: 'Радио',
    loading: 'Загрузка…',
    noRadio: 'Похожие треки для этого исполнителя не найдены.',
    notFound: 'Исполнитель не найден.',
    albumsBy: 'Альбомы — {{name}}',
    topTracks: 'Популярные треки',
    noAlbums: 'Альбомов нет.',
    trackTitle: 'Название',
    trackAlbum: 'Альбом',
    trackDuration: 'Длительность',
    favoriteAdd: 'В избранное',
    favoriteRemove: 'Убрать из избранного',
    favorite: 'Избранное',
    albumCount_one: '{{count}} альбом',
    albumCount_few: '{{count}} альбома',
    albumCount_many: '{{count}} альбомов',
    albumCount_other: '{{count}} альбомов',
    openedInBrowser: 'Открыто в браузере',
    featuredOn: 'Также участвует в',
    similarArtists: 'Похожие исполнители',
    cacheOffline: 'Сохранить дискографию офлайн',
    offlineCached: 'Дискография сохранена',
    offlineDownloading: 'Кэширование… ({{done}} из {{total}} альбомов)',
    uploadImage: 'Загрузить фото исполнителя',
    uploadImageError: 'Не удалось загрузить изображение',
    releaseTypes: {
      album: 'Альбом',
      ep: 'EP',
      single: 'Сингл',
      compilation: 'Сборник',
      live: 'Концерт',
      soundtrack: 'Саундтрек',
      remix: 'Ремикс',
      other: 'Другое',
    },
  },
  favorites: {
    title: 'Избранное',
    empty: 'Пока ничего не отмечено звёздочкой.',
    artists: 'Исполнители',
    albums: 'Альбомы',
    songs: 'Треки',
    enqueueAll: 'Всё в очередь',
    playAll: 'Воспроизвести всё',
    removeSong: 'Убрать из избранного',
    stations: 'Радиостанции',
    showingFiltered: 'Показано {{filtered}} из {{total}} ({{artist}})',
    showingCount: 'Показано {{filtered}} из {{total}}',
    clearArtistFilter: 'Сбросить фильтр исполнителя',
    noFilterResults: 'Нет результатов с выбранными фильтрами.',
    allArtists: 'Все исполнители',
    topArtists: 'Топ исполнителей по избранному',
    topArtistsSongCount_one: '{{count}} трек',
    topArtistsSongCount_few: '{{count}} трека',
    topArtistsSongCount_many: '{{count}} треков',
    topArtistsSongCount_other: '{{count}} трека',
  },
  randomLanding: {
    title: 'Собрать микс',
    mixByTracks: 'Микс по трекам',
    mixByTracksDesc: 'Случайная подборка треков со всей медиатеки',
    mixByAlbums: 'Микс по альбомам',
    mixByAlbumsDesc: 'Случайная подборка альбомов для открытий',
    mixByLucky: 'Мне повезёт',
    mixByLuckyDesc: 'Умный Instant Mix из топ-артистов, альбомов и высоких оценок',
  },
  randomAlbums: {
    title: 'Случайные альбомы',
    refresh: 'Обновить',
  },
  genres: {
    title: 'Жанры',
    genreCount: 'Жанры',
    albumCount_one: '{{count}} альбом',
    albumCount_few: '{{count}} альбома',
    albumCount_many: '{{count}} альбомов',
    albumCount_other: '{{count}} альбомов',
    loading: 'Загрузка жанров…',
    empty: 'Жанры не найдены.',
    albumsLoading: 'Загрузка альбомов…',
    albumsEmpty: 'В этом жанре альбомов нет.',
    loadMore: 'Ещё',
    back: 'Назад',
  },
  randomMix: {
    title: 'Случайный микс',
    remix: 'Новый микс',
    remixTooltip: 'Подобрать другие случайные треки',
    remixGenre: 'Новый микс: {{genre}}',
    remixTooltipGenre: 'Подобрать другие треки жанра {{genre}}',
    playAll: 'Воспроизвести всё',
    trackTitle: 'Название',
    trackArtist: 'Исполнитель',
    trackAlbum: 'Альбом',
    trackFavorite: 'Избранное',
    trackDuration: 'Длительность',
    favoriteAdd: 'В избранное',
    favoriteRemove: 'Убрать из избранного',
    play: 'Играть',
    trackGenre: 'Жанр',
    mixSettingsHeader: 'Настройки микса',
    exclusionsHeader: 'Исключения',
    filterPanelInexactSizeNote: 'Размер микса — это цель. При больших запросах сервер может вернуть меньше уникальных треков, если его случайный пул иссякает.',
    mixSize: 'Размер списка',
    excludeAudiobooks: 'Исключать аудиокниги и радиоспектакли',
    excludeAudiobooksDesc:
      'По ключевым словам в жанре, названии, альбоме и исполнителе — например Hörbuch, Audiobook, Spoken Word и т. п.',
    genreBlocked: 'Слово отфильтровано',
    genreAddedToBlacklist: 'Добавлено в список фильтра',
    genreAlreadyBlocked: 'Уже в списке',
    artistBlocked: 'Исполнитель отфильтрован',
    artistAddedToBlacklist: 'Исполнитель добавлен в фильтр',
    artistClickHint: 'Нажмите, чтобы скрыть этого исполнителя',
    blacklistToggle: 'Фильтр по словам',
    genreMixTitle: 'Микс по жанру',
    genreMixDesc: 'Топ-20 жанров по числу треков — нажмите, чтобы собрать микс',
    genreMixAll: 'Все треки',
    genreMixLoadMore: 'Ещё 10 жанров',
    genreMixNoGenres: 'На сервере нет данных о жанрах.',
    shuffleGenres: 'Другие жанры',
    filterPanelTitle: 'Фильтры',
    filterPanelDesc:
      'Нажмите на тег жанра или имя исполнителя в списке ниже, чтобы исключить их из будущих миксов.',
    genreClickHint:
      'Нажмите на тег жанра — слово попадёт в фильтр.\nУчитываются жанр, название, альбом и исполнитель.',
  },
  luckyMix: {
    done: '«Мне повезёт» готово: {{count}} треков',
    failed: 'Не удалось собрать микс «Мне повезёт». Попробуйте ещё раз.',
    unavailable: '«Мне повезёт» недоступен на этом сервере.',
    cancelTooltip: 'Отменить сборку микса «Мне повезёт»',
  },
  albums: {
    title: 'Все альбомы',
    sortByName: 'А–Я (альбом)',
    sortByArtist: 'А–Я (исполнитель)',
    sortNewest: 'Сначала новые',
    sortRandom: 'Случайно',
    yearFrom: 'С',
    yearTo: 'По',
    yearFilterClear: 'Сбросить год',
    yearFilterLabel: 'Год',
    compilationLabel: 'Сборники',
    compilationOnly: 'Только сборники',
    compilationHide: 'Скрыть сборники',
    compilationTooltipAll: 'Все альбомы · клик: только сборники',
    compilationTooltipOnly: 'Только сборники · клик: скрыть сборники',
    compilationTooltipHide: 'Сборники скрыты · клик: показать всё',
    select: 'Множественный выбор',
    startSelect: 'Включить множественный выбор',
    cancelSelect: 'Отмена',
    selectionCount: '{{count}} выбрано',
    downloadZips: 'Скачать ZIP-архивы',
    addOffline: 'Добавить офлайн',
    enqueueSelected_one: 'В очередь ({{count}})',
    enqueueSelected_few: 'В очередь ({{count}})',
    enqueueSelected_many: 'В очередь ({{count}})',
    enqueueSelected_other: 'В очередь ({{count}})',
    enqueueQueued_one: '{{count}} альбом добавлен в очередь',
    enqueueQueued_few: '{{count}} альбома добавлены в очередь',
    enqueueQueued_many: '{{count}} альбомов добавлены в очередь',
    enqueueQueued_other: '{{count}} альбомов добавлены в очередь',
    downloadingZip: 'Загрузка {{current}}/{{total}}: {{name}}',
    downloadZipDone: '{{count}} ZIP-архив(ов) загружено',
    downloadZipFailed: 'Не удалось скачать {{name}}',
    offlineQueuing: 'Добавление {{count}} альбом(ов) в офлайн…',
    offlineFailed: 'Не удалось добавить {{name}} офлайн',
  },
  tracks: {
    title: 'Треки',
    subtitle: 'Листать. Искать. Открывать.',
    heroEyebrow: 'Трек момента',
    heroReroll: 'Выбрать другой',
    playSong: 'Воспроизвести',
    enqueueSong: 'В очередь',
    railRandom: 'Случайная подборка',
    railHighlyRated: 'Высоко оценённые',
    browseTitle: 'Просмотреть все треки',
    browseUnsupported: 'Этот сервер не возвращает всю библиотеку сразу. Воспользуйтесь поиском выше, чтобы найти конкретные треки.',
    searchPlaceholder: 'Найти трек по названию, исполнителю или альбому…',
    count_one: '{{count}} трек',
    count_few: '{{count}} трека',
    count_many: '{{count}} треков',
    count_other: '{{count}} треков',
  },
  artists: {
    title: 'Исполнители',
    search: 'Поиск…',
    all: 'Все',
    gridView: 'Сетка',
    listView: 'Список',
    imagesOn: 'Фото исполнителей — больше трафика и нагрузка на систему',
    imagesOff: 'Только инициалы — экономнее по трафику',
    loadMore: 'Ещё',
    notFound: 'Исполнители не найдены.',
    albumCount_one: '{{count}} альбом',
    albumCount_few: '{{count}} альбома',
    albumCount_many: '{{count}} альбомов',
    albumCount_other: '{{count}} альбомов',
    selectionCount: '{{count}} выбрано',
    select: 'Множественный выбор',
    startSelect: 'Включить множественный выбор',
    cancelSelect: 'Отмена',
    addToPlaylist: 'В плейлист',
  },
  composers: {
    title: 'Композиторы',
    search: 'Поиск…',
    notFound: 'Композиторы не найдены.',
    unsupported: 'Просмотр по композиторам требует Navidrome 0.55 или новее.',
    loadFailed: 'Не удалось загрузить композиторов.',
    retry: 'Повторить',
    involvedIn_one: 'Участие в {{count}} альбоме',
    involvedIn_other: 'Участие в {{count}} альбомах',
  },
  composerDetail: {
    back: 'Назад',
    notFound: 'Композитор не найден.',
    about: 'Об этом композиторе',
    works: 'Произведения',
    noWorks: 'Произведения не найдены.',
    workCount_one: '{{count}} произведение',
    workCount_other: '{{count}} произведений',
    shareComposer: 'Поделиться композитором',
    unknownComposer: 'Композитор',
  },
  login: {
    subtitle: 'Десктопный клиент для Navidrome',
    serverName: 'Название сервера (необязательно)',
    serverNamePlaceholder: 'Мой Navidrome',
    serverUrl: 'Адрес сервера',
    serverUrlPlaceholder: '192.168.1.100:4533 или https://music.example.com',
    username: 'Логин',
    usernamePlaceholder: 'admin',
    password: 'Пароль',
    showPassword: 'Показать пароль',
    hidePassword: 'Скрыть пароль',
    connect: 'Подключиться',
    connecting: 'Подключение…',
    connected: 'Готово!',
    error: 'Не удалось подключиться — проверьте данные.',
    urlRequired: 'Укажите адрес сервера.',
    savedServers: 'Сохранённые серверы',
    addNew: 'Или добавить новый сервер',
    orMagicString: 'Или magic string',
    magicStringPlaceholder: 'Вставьте строку приглашения (psysonic1-…)',
    magicStringInvalid: 'Неверная или нечитаемая magic string.',
  },
  connection: {
    connected: 'Подключено',
    connectedTo: 'Сервер: {{server}}',
    disconnected: 'Нет связи',
    disconnectedFrom: 'Сервер {{server}} недоступен — нажмите для настроек',
    checking: 'Подключение…',
    extern: 'Внешний',
    offlineTitle: 'Нет связи с сервером',
    offlineSubtitle: 'Сервер {{server}} недоступен. Проверьте сеть и адрес.',
    offlineModeBanner: 'Офлайн — воспроизведение из локального кэша',
    offlineNoCacheBanner: 'Нет соединения с сервером — {{server}} недоступен',
    offlineLibraryTitle: 'Офлайн-библиотека',
    offlineLibraryEmpty:
      'Пока ничего не сохранено. Подключитесь к сети, откройте альбом и нажмите «Сохранить офлайн».',
    offlineAlbumCount_one: '{{n}} альбом',
    offlineAlbumCount_few: '{{n}} альбома',
    offlineAlbumCount_many: '{{n}} альбомов',
    offlineAlbumCount_other: '{{n}} альбомов',
    offlineFilterAll: 'Всё',
    offlineFilterAlbums: 'Альбомы',
    offlineFilterPlaylists: 'Плейлисты',
    offlineFilterArtists: 'Дискографии',
    retry: 'Повторить',
    serverSettings: 'Настройки сервера',
    switchServerTitle: 'Сменить сервер',
    switchServerHint: 'Нажмите, чтобы выбрать другой сохранённый сервер.',
    manageServers: 'Управление серверами…',
    switchFailed: 'Не удалось переключиться — сервер недоступен.',
    lastfmConnected: 'Last.fm: @{{user}}',
    lastfmSessionInvalid: 'Сессия недействительна — подключите снова',
  },
  common: {
    albums: 'Альбомы',
    album: 'Альбом',
    loading: 'Загрузка…',
    loadingMore: 'Загрузка…',
    loadingPlaylists: 'Загрузка плейлистов…',
    noAlbums: 'Альбомов нет.',
    downloading: 'Скачивание…',
    downloadZip: 'Скачать (ZIP)',
    back: 'Назад',
    cancel: 'Отмена',
    save: 'Сохранить',
    delete: 'Удалить',
    use: 'Использовать',
    add: 'Добавить',
    new: 'Новое',
    active: 'Активен',
    download: 'Скачать',
    chooseDownloadFolder: 'Выбрать папку',
    noFolderSelected: 'Папка не выбрана',
    rememberDownloadFolder: 'Запомнить папку',
    filterGenre: 'Фильтр по жанру',
    filterSearchGenres: 'Поиск жанров…',
    filterNoGenres: 'Нет совпадений',
    filterClear: 'Сбросить',
    favorites: 'Избранное',
    favoritesTooltipOff: 'Показывать только избранное',
    favoritesTooltipOn: 'Показать всё',
    play: 'Воспроизвести',
    bulkSelected: 'Выбрано: {{count}}',
    clearSelection: 'Сбросить выбор',
    bulkAddToPlaylist: 'В плейлист',
    bulkRemoveFromPlaylist: 'Убрать из плейлиста',
    bulkClear: 'Снять выделение',
    updaterAvailable: 'Доступно обновление',
    updaterVersion: 'Версия {{version}} доступна',
    updaterWebsite: 'Сайт',
    updaterModalTitle: 'Доступна новая версия',
    updaterChangelog: 'Что нового',
    updaterDownloadBtn: 'Скачать сейчас',
    updaterSkipBtn: 'Пропустить эту версию',
    updaterRemindBtn: 'Напомнить позже',
    updaterDone: 'Загрузка завершена',
    updaterShowFolder: 'Показать в папке',
    updaterInstallHint: 'Закройте Psysonic и запустите установщик вручную.',
    updaterAurHint: 'Установить обновление через AUR:',
    updaterErrorMsg: 'Ошибка загрузки',
    updaterRetryBtn: 'Повторить',
    durationHoursMinutes: '{{hours}}ч {{minutes}}мин',
    durationMinutesOnly: '{{minutes}}мин',
    updaterOpenGitHub: 'Открыть на GitHub',
    filters: 'Фильтры',
    more: 'еще',
    yearRange: 'Диапазон лет',
    clearAll: 'Очистить всё',
  },
  settings: {
    title: 'Настройки',
    language: 'Язык',
    languageEn: 'English',
    languageDe: 'Deutsch',
    languageEs: 'Español',
    languageFr: 'Français',
    languageNl: 'Nederlands',
    languageNb: 'Norsk',
    languageRu: 'Русский',
    languageZh: '中文',
    font: 'Шрифт',
    fontHintOpenDyslexic: 'Подходит для дислексии · без поддержки китайского',
    theme: 'Тема',
    appearance: 'Оформление',
    servers: 'Серверы',
    serverName: 'Название',
    serverUrl: 'Адрес',
    serverUrlPlaceholder: '192.168.1.100:4533 или https://music.example.com',
    serverUsername: 'Логин',
    serverPassword: 'Пароль',
    addServer: 'Добавить сервер',
    addServerTitle: 'Новый сервер',
    useServer: 'Выбрать',
    deleteServer: 'Удалить',
    noServers: 'Нет сохранённых серверов.',
    serverActive: 'Активен',
    confirmDeleteServer: 'Удалить сервер «{{name}}»?',
    serverConnecting: 'Подключение…',
    serverConnected: 'Подключено!',
    serverFailed: 'Ошибка подключения.',
    testBtn: 'Проверить',
    testingBtn: 'Проверка…',
    serverCompatible: 'Разработано для Navidrome. Другие Subsonic-совместимые серверы (Gonic, Airsonic, …) могут работать с ограничениями, так как Psysonic использует много специфичных для Navidrome API-эндпоинтов.',
    userMgmtTitle: 'Управление пользователями',
    userMgmtDesc: 'Управляйте пользователями этого сервера. Требуются права администратора.',
    userMgmtNoAdmin: 'Для управления пользователями на этом сервере нужны права администратора.',
    userMgmtLoadError: 'Не удалось загрузить пользователей.',
    userMgmtLoadFriendly: 'Сервер не ответил — обычно разовая ошибка.',
    userMgmtRetry: 'Повторить',
    userMgmtEmpty: 'Пользователи не найдены.',
    userMgmtYouBadge: 'Вы',
    userMgmtAdminBadge: 'Админ',
    userMgmtAddUser: 'Добавить пользователя',
    userMgmtAddUserTitle: 'Новый пользователь',
    userMgmtEditUserTitle: 'Изменить пользователя',
    userMgmtUsername: 'Имя пользователя',
    userMgmtName: 'Отображаемое имя',
    userMgmtEmail: 'E-mail',
    userMgmtPassword: 'Пароль',
    userMgmtPasswordEditHint: 'Введите новый пароль, чтобы изменить его.',
    userMgmtRoleAdmin: 'Админ',
    userMgmtLibraries: 'Библиотеки',
    userMgmtLibrariesAdminHint: 'Администраторы автоматически имеют доступ ко всем библиотекам.',
    userMgmtLibrariesEmpty: 'На этом сервере нет доступных библиотек.',
    userMgmtLibrariesValidation: 'Выберите хотя бы одну библиотеку.',
    userMgmtLibrariesUpdateError: 'Пользователь сохранён, но не удалось назначить библиотеки',
    userMgmtNoLibraries: 'Библиотеки не назначены',
    userMgmtNeverSeen: 'Никогда',
    userMgmtSave: 'Сохранить',
    userMgmtCancel: 'Отмена',
    userMgmtDelete: 'Удалить',
    userMgmtEdit: 'Изменить',
    userMgmtConfirmDelete: 'Удалить пользователя «{{username}}»? Действие нельзя отменить.',
    userMgmtCreateError: 'Не удалось создать пользователя.',
    userMgmtUpdateError: 'Не удалось обновить пользователя.',
    userMgmtDeleteError: 'Не удалось удалить пользователя.',
    userMgmtCreated: 'Пользователь создан.',
    userMgmtUpdated: 'Пользователь обновлён.',
    userMgmtDeleted: 'Пользователь удалён.',
    userMgmtValidationMissing: 'Требуются имя пользователя, отображаемое имя и пароль.',
    userMgmtValidationMissingIdentity: 'Укажите имя пользователя и отображаемое имя.',
    userMgmtMagicStringGenerate: 'Сгенерировать magic string',
    userMgmtSaveAndMagicString: 'Сохранить и получить magic string',
    userMgmtMagicStringPasswordNavHint:
      'Navidrome сохранит этот пароль для пользователя. Если он не совпадает с текущим, на сервере будет установлен новый пароль входа.',
    userMgmtMagicStringPlaintextWarning:
      'Передавайте magic string осторожно: в ней пароль в открытом виде (кодирование — не шифрование). У кого есть полная строка, тот может войти под этим пользователем.',
    userMgmtMagicStringCopied: 'Magic string скопирован в буфер обмена.',
    userMgmtMagicStringCopyFailed: 'Не удалось скопировать в буфер обмена.',
    userMgmtMagicStringLoginFailed: 'Пароль не подошёл — не удалось проверить учётные данные.',
    userMgmtMagicStringModalTitle: 'Сгенерировать magic string',
    userMgmtMagicStringModalDesc: 'Введите пароль Subsonic для «{{username}}» — он попадёт в копируемую magic string.',
    userMgmtMagicStringModalConfirm: 'Скопировать строку',
    audiomuseTitle: 'AudioMuse-AI (Navidrome)',
    audiomuseDesc:
      'Включите, если на этом сервере настроен <pluginLink>плагин AudioMuse-AI для Navidrome</pluginLink>. Появится Instant Mix для треков, а на странице исполнителя похожие будут браться с сервера вместо Last.fm.',
    audiomuseIssueHint:
      'Недавно не удалось собрать Instant Mix — проверьте плагин Navidrome и API AudioMuse. Похожие исполнители подтянутся с Last.fm, если сервер ничего не вернёт.',
    connected: 'Подключено',
    failed: 'Ошибка',
    eqTitle: 'Эквалайзер',
    eqEnabled: 'Включить эквалайзер',
    eqPreset: 'Пресет',
    eqPresetCustom: 'Свой',
    eqPresetBuiltin: 'Встроенные',
    eqPresetCustomGroup: 'Мои пресеты',
    eqSavePreset: 'Сохранить как пресет',
    eqPresetName: 'Название пресета…',
    eqDeletePreset: 'Удалить пресет',
    eqResetBands: 'Сбросить полосы',
    eqPreGain: 'Предусиление',
    eqResetPreGain: 'Сбросить предусиление',
    eqAutoEqTitle: 'AutoEQ — поиск профиля наушников',
    eqAutoEqPlaceholder: 'Модель наушников или IEM…',
    eqAutoEqSearching: 'Поиск…',
    eqAutoEqNoResults: 'Ничего не найдено',
    eqAutoEqError: 'Ошибка поиска',
    eqAutoEqRateLimit: 'Лимит GitHub — попробуйте через минуту',
    eqAutoEqFetchError: 'Не удалось загрузить профиль EQ',
    lfmTitle: 'Last.fm',
    lfmConnect: 'Подключить Last.fm',
    lfmConnecting: 'Ожидание авторизации…',
    lfmConfirm: 'Я разрешил доступ',
    lfmConnected: 'Аккаунт',
    lfmDisconnect: 'Отключить',
    lfmConnectDesc:
      'Привяжите Last.fm для скробблинга и статуса «Сейчас слушаю» прямо из Psysonic — настраивать Navidrome не нужно.',
    lfmOpenBrowser: 'Откроется браузер. Разрешите доступ на Last.fm, затем нажмите кнопку ниже.',
    lfmScrobbles: 'Скробблов: {{n}}',
    lfmMemberSince: 'С {{year}} года',
    scrobbleEnabled: 'Скробблинг включён',
    scrobbleDesc: 'Отправлять прослушивания на Last.fm после 50% трека',
    behavior: 'Поведение',
    cacheTitle: 'Макс. размер кэша',
    cacheDesc:
      'Обложки и фото исполнителей. При переполнении старые записи удаляются. Офлайн-альбомы не трогаются автоматически, но сотрутся при полной очистке кэша.',
    cacheUsedImages: 'Изображения:',
    cacheUsedOffline: 'Офлайн-треки:',
    cacheUsedHot: 'На диске:',
    hotCacheTrackCount: 'Треков в кэше:',
    cacheMaxLabel: 'Лимит',
    cacheClearBtn: 'Очистить кэш',
    waveformCacheClearBtn: 'Очистить кэш waveform',
    cacheClearWarning: 'Будут удалены и все офлайн-альбомы.',
    cacheClearConfirm: 'Очистить всё',
    cacheClearCancel: 'Отмена',
    waveformCacheCleared: 'Кэш waveform очищен ({{count}} строк).',
    waveformCacheClearFailed: 'Не удалось очистить кэш waveform.',
    offlineDirTitle: 'Офлайн-библиотека (в приложении)',
    offlineDirDesc: 'Папка для треков, сохранённых для офлайн-прослушивания.',
    offlineDirDefault: 'По умолчанию (данные приложения)',
    offlineDirChange: 'Сменить папку',
    offlineDirClear: 'Сбросить по умолчанию',
    offlineDirHint: 'Новые загрузки пойдут в выбранную папку. Старые останутся на прежнем месте.',
    hotCacheTitle: 'Горячий кэш воспроизведения',
    hotCacheDisclaimer: 'Заранее подгружает следующие треки из очереди и сохраняет предыдущие. При включении использует место на диске и сеть.',
    hotCacheDirDefault: 'По умолчанию (данные приложения)',
    hotCacheDirChange: 'Сменить папку',
    hotCacheDirClear: 'Сбросить по умолчанию',
    hotCacheDirHint: 'При смене папки сбрасывается список в приложении; уже скачанные файлы остаются на старом пути, пока вы их не удалите.',
    hotCacheEnabled: 'Включить горячий кэш воспроизведения',
    hotCacheMaxMb: 'Максимальный размер кэша',
    hotCacheDebounce: 'Задержка после изменения очереди',
    hotCacheDebounceImmediate: 'Сразу',
    hotCacheDebounceSeconds: '{{n}} с',
    hotCacheClearBtn: 'Очистить горячий кэш',
    audioOutputDevice: 'Устройство вывода звука',
    audioOutputDeviceDesc: 'Выберите аудиоустройство для воспроизведения. Изменения применяются немедленно и перезапускают текущий трек.',
    audioOutputDeviceDefault: 'Системное по умолчанию',
    audioOutputDeviceRefresh: 'Обновить список устройств',
    audioOutputDeviceOsDefaultNow: 'текущий системный вывод',
    audioOutputDeviceListError: 'Не удалось загрузить список аудиоустройств.',
    audioOutputDeviceNotInCurrentList: 'нет в текущем списке',
    audioOutputDeviceMacNotice: 'В macOS воспроизведение в настоящее время всегда следует за системным устройством вывода по техническим причинам. Измените цель через Системные настройки → Звук или значок динамика в строке меню. Причина: CoreAudio запрашивает разрешение на использование микрофона при открытии не-стандартного потока — мы избегаем этого, всегда используя системный вывод по умолчанию.',
    hiResTitle: 'Нативное воспроизведение Hi-Res',
    hiResEnabled: 'Включить нативное Hi-Res воспроизведение',
    hiResDesc: "По умолчанию вывод ограничен до 44,1 кГц для максимальной стабильности. Включайте только если оборудование и сеть надёжно поддерживают высокие частоты (88,2 кГц+).",
    showArtistImages: 'Фото исполнителей',
    showArtistImagesDesc:
      'Показывать обложки в разделе «Исполнители». По умолчанию выключено — меньше нагрузки на диск и сеть.',
    showOrbitTrigger: 'Показывать «Orbit» в шапке',
    showOrbitTriggerDesc: 'Кнопка в шапке для запуска или присоединения к совместной сессии. Скрой, если не используешь Orbit — здесь же можно включить обратно.',
    showTrayIcon: 'Иконка в трее',
    showTrayIconDesc: 'Показывать Psysonic в области уведомлений / строке меню.',
    minimizeToTray: 'Сворачивать в трей',
    minimizeToTrayDesc: 'При закрытии окна не выходить из приложения, а оставаться в трее.',
    preloadMiniPlayer: 'Предзагрузка мини-плеера',
    preloadMiniPlayerDesc: 'Создаёт окно мини-плеера в фоне при запуске приложения, чтобы при первом открытии содержимое отображалось мгновенно. Использует немного больше памяти.',
    useCustomTitlebar: 'Своя строка заголовка',
    useCustomTitlebarDesc:
      'Заменить системную строку заголовка встроенной, в стиле темы приложения. Отключите, чтобы использовать родную строку GNOME/GTK и т.д.',
    linuxWebkitSmoothScroll: 'Плавное колесо (Linux)',
    linuxWebkitSmoothScrollDesc: 'Вкл — инерция. Выкл — по шагам, как в GTK.',
    discordRichPresence: 'Статус в Discord',
    discordRichPresenceDesc:
      'Показывать текущий трек в профиле и статусе Discord. Нужен запущенный клиент Discord.',
    discordCoverSource: 'Источник обложки',
    discordCoverSourceDesc: 'Откуда загружать обложку альбома для профиля Discord.',
    discordCoverNone: 'Нет (только иконка приложения)',
    discordCoverServer: 'Сервер (через информацию об альбоме)',
    discordCoverApple: 'Apple Music',
    discordOptions: 'Расширенные параметры Discord',
    discordTemplates: 'Пользовательские шаблоны текста',
    discordTemplatesDesc: 'Настройте, какая информация отображается в профиле Discord. Переменные: {title}, {artist}, {album}',
    discordTemplateDetails: 'Основная строка (details)',
    discordTemplateState: 'Вторичная строка (state)',
    discordTemplateLargeText: 'Подсказка альбома (largeText)',
    nowPlayingEnabled: 'Показывать в «Сейчас играет»',
    nowPlayingEnabledDesc:
      'Отправлять на сервер, что вы сейчас слушаете. Отключите, чтобы не делиться этим.',
    enableBandsintown: 'Даты туров Bandsintown',
    enableBandsintownDesc: 'Показывает предстоящие концерты текущего исполнителя на вкладке «Инфо». Данные берутся из публичного API Bandsintown.',
    lyricsServerFirst: 'Предпочитать тексты с сервера',
    lyricsServerFirstDesc: 'Проверять тексты песен, предоставленные сервером (встроенные теги, sidecar-файлы) перед запросом LRCLIB. Отключите, чтобы сначала использовать LRCLIB.',
    enableNeteaselyrics: 'Тексты из Netease Cloud Music',
    enableNeteaselyricsDesc: 'Использовать Netease Cloud Music как последний источник текстов, когда остальные способы не находят ничего. Лучшее покрытие для азиатской и международной музыки.',
    lyricsSourcesTitle: 'Источники текстов',
    lyricsSourcesDesc: 'Выберите источники для поиска текстов и их порядок. Перетаскивайте для сортировки. Отключённые источники пропускаются.',
    lyricsSourceServer: 'Сервер',
    lyricsSourceLrclib: 'LRCLIB',
    lyricsSourceNetease: 'Netease Cloud Music',
    lyricsModeStandard: 'Стандарт',
    lyricsModeStandardDesc: 'Три источника в свободно настраиваемом порядке: серверные теги, LRCLIB, Netease.',
    lyricsModeLyricsplus: 'YouLyPlus (Караоке)',
    lyricsModeLyricsplusDesc: 'Синхронизация слово-в-слово из Apple Music, Spotify, Musixmatch и QQ (общественный бэкенд). При отсутствии результата незаметно возвращается к стандартным источникам.',
    lyricsStaticOnly: 'Показывать текст статично',
    lyricsStaticOnlyDesc: 'Синхронизированный текст отображается без авто-прокрутки и подсветки слов.',
    downloadsTitle: 'Экспорт ZIP и архивов',
    downloadsFolderDesc: 'Куда сохранять альбомы в ZIP архиве на диск.',
    downloadsDefault: 'Папка «Загрузки» по умолчанию',
    pickFolder: 'Выбрать',
    pickFolderTitle: 'Папка для загрузок',
    clearFolder: 'Сбросить папку',
    logout: 'Выйти',
    aboutTitle: 'О Psysonic',
    aboutDesc:
      'Современный десктопный плеер, созданный для Navidrome. Использует API Subsonic плюс специфичные для Navidrome расширения. На Tauri v2 и нативном аудиодвижке на Rust — лёгкий и быстрый: волновая шкала, синхронные тексты, Last.fm, 10-полосный EQ, кроссфейд, воспроизведение без пауз, Replay Gain, жанры и много тем оформления.',
    aboutLicense: 'Лицензия',
    aboutLicenseText: 'GNU GPL v3 — свободное использование и изменение на тех же условиях.',
    aboutRepo: 'Исходный код на GitHub',
    aboutVersion: 'Версия',
    aboutBuiltWith: 'Tauri · React · TypeScript · Rust/rodio',
    aboutReleaseNotesLabel: 'Примечания к выпуску',
    aboutReleaseNotesLink: 'Открыть «Что нового» этой версии',
    aboutContributorsLabel: 'Участники',
    showChangelogOnUpdate: 'Показывать «Что нового» после обновления',
    showChangelogOnUpdateDesc: 'После обновления над «Сейчас играет» появится ненавязчивый баннер журнала изменений. Клик открывает заметки о выпуске, X скрывает.',
    randomMixTitle: 'Чёрный список случайного микса',
    luckyMixMenuTitle: 'Показывать «Мне повезёт» в меню',
    luckyMixMenuDesc:
      'Включает «Мне повезёт» в «Собрать микс», а при раздельной навигации — отдельным пунктом меню. Видно только при включённом AudioMuse на активном сервере.',
    randomMixBlacklistTitle: 'Свои слова-фильтры',
    randomMixBlacklistDesc:
      'Треки скрываются, если слово встречается в жанре, названии, альбоме или исполнителе (когда включён фильтр выше).',
    randomMixBlacklistPlaceholder: 'Добавить слово…',
    randomMixBlacklistAdd: 'Добавить',
    randomMixBlacklistEmpty: 'Пока пусто.',
    randomMixHardcodedTitle: 'Встроенные слова (при включённом фильтре)',
    tabAudio: 'Звук',
    tabStorage: 'Офлайн и кэш',
    tabAppearance: 'Внешний вид',
    tabLibrary: 'Библиотека',
    tabServers: 'Серверы',
    tabLyrics: 'Тексты песен',
    tabPersonalisation: 'Персонализация',
    tabIntegrations: 'Интеграции',
    inputKeybindingsTitle: 'Горячие клавиши',
    aboutContributorsCount_one: '{{count}} вклад',
    aboutContributorsCount_few: '{{count}} вклада',
    aboutContributorsCount_many: '{{count}} вкладов',
    aboutContributorsCount_other: '{{count}} вклада',
    searchPlaceholder: 'Поиск в настройках…',
    searchNoResults: 'Ничего не найдено по вашему запросу.',
    aboutMaintainersLabel: 'Сопровождающие',
    integrationsPrivacyTitle: 'Уведомление о конфиденциальности',
    integrationsPrivacyBody: 'Все интеграции на этой вкладке включаются <strong>по желанию</strong> и при активации отправляют данные во внешние сервисы или на ваш сервер Navidrome. Last.fm получает вашу историю прослушивания, Discord показывает текущую композицию в вашем профиле, Bandsintown опрашивается по артисту для получения дат гастролей, а «Сейчас играет» делится текущей композицией с другими пользователями вашего сервера Navidrome. Если вы не хотите ничего из этого, просто оставьте соответствующий раздел отключённым.',
    homeCustomizerTitle: 'Главная',
    queueToolbarTitle: 'Панель инструментов очереди',
    queueToolbarReset: 'Сбросить',
    queueToolbarSeparator: 'Разделитель',
    sidebarTitle: 'Боковая панель',
    sidebarReset: 'Сбросить порядок',
    artistLayoutTitle: 'Разделы страницы исполнителя',
    artistLayoutDesc: 'Перетаскивайте, чтобы изменить порядок, переключайте, чтобы скрыть отдельные разделы страницы исполнителя. Разделы без данных пропускаются автоматически.',
    artistLayoutReset: 'Сбросить',
    artistLayoutBio: 'Биография исполнителя',
    artistLayoutTopTracks: 'Топ-треки',
    artistLayoutSimilar: 'Похожие исполнители',
    artistLayoutAlbums: 'Альбомы',
    artistLayoutFeatured: 'Также участвует в',
    sidebarDrag: 'Перетащите для порядка',
    sidebarFixed: 'Всегда показывать',
    randomNavSplitTitle: 'Разделить навигацию микса',
    randomNavSplitDesc:
      'Показывать «Случайный микс», «Случайные альбомы» и «Мне повезёт» как отдельные пункты боковой панели вместо хаба «Собрать микс».',
    tabInput: 'Ввод',
    tabUsers: 'Пользователи',
    tabSystem: 'Система',
    loggingTitle: 'Логирование',
    loggingModeDesc: 'Управляет подробностью логов backend в терминале.',
    loggingModeOff: 'Выключено',
    loggingModeNormal: 'Обычное',
    loggingModeDebug: 'Дебаг',
    loggingExport: 'Экспорт логов',
    loggingExportSuccess: 'Логи экспортированы ({{count}} строк).',
    loggingExportError: 'Не удалось экспортировать логи.',
    ratingsSectionTitle: 'Рейтинги',
    ratingsSkipStarTitle: 'Скипнуть для 1 звезды',
    ratingsSkipStarDesc:
      'При N скипов подряд ставить 1★ треку. Только для не оцененных ранее.',
    ratingsSkipStarThresholdLabel: 'Скипов',
    ratingsMixFilterTitle: 'Фильтрация по рейтингу',
    ratingsMixFilterDesc:
      'Фильтровать с низким рейтингом в «{{mix}}» и «{{albums}}». Повторный клик по выбранной звезде отключает порог.',
    ratingsMixMinSong: 'Песни',
    ratingsMixMinAlbum: 'Альбомы',
    ratingsMixMinArtist: 'Исполнители',
    ratingsMixMinThresholdAria: 'Минимум звёзд: {{label}}',
    backupTitle: 'Резервная копия',
    backupExport: 'Экспорт настроек',
    backupExportDesc:
      'Сохраняет настройки, серверы, Last.fm, тему, EQ и горячие клавиши в файл .psybkp. Пароли в открытом виде — храните файл в безопасности.',
    backupImport: 'Импорт настроек',
    backupImportDesc: 'Восстановить из .psybkp. Приложение перезапустится.',
    backupImportConfirm: 'Текущие настройки будут заменены. Продолжить?',
    backupSuccess: 'Копия сохранена',
    backupImportSuccess: 'Настройки восстановлены — перезапуск…',
    backupImportError: 'Файл повреждён или не подходит.',
    shortcutsReset: 'Сбросить',
    shortcutListening: 'Нажмите клавишу…',
    shortcutUnbound: '—',
    globalShortcutsTitle: 'Глобальные сочетания',
    globalShortcutsNote:
      'Работают, когда окно не в фокусе. Нужен модификатор: Ctrl, Alt или Super.',
    shortcutClear: 'Сбросить',
    shortcutPlayPause: 'Пауза / воспроизведение',
    shortcutNext: 'Следующий трек',
    shortcutPrev: 'Предыдущий трек',
    shortcutVolumeUp: 'Громче',
    shortcutVolumeDown: 'Тише',
    shortcutSeekForward: 'Вперёд на 10 с',
    shortcutSeekBackward: 'Назад на 10 с',
    shortcutToggleQueue: 'Показать / скрыть очередь',
    shortcutOpenFolderBrowser: 'Открыть {{folderBrowser}}',
    shortcutFullscreenPlayer: 'Полноэкранный плеер',
    shortcutNativeFullscreen: 'Системный полный экран',
    shortcutOpenMiniPlayer: 'Открыть мини-плеер',
    shortcutStartSearch: 'Начать поиск',
    shortcutStartAdvancedSearch: 'Начать расширенный поиск',
    shortcutToggleSidebar: 'Переключить боковую панель',
    shortcutMuteSound: 'Без звука',
    shortcutToggleEqualizer: 'Открыть / переключить эквалайзер',
    shortcutToggleRepeat: 'Переключить повтор',
    shortcutOpenNowPlaying: 'Открыть «Сейчас играет»',
    shortcutShowLyrics: 'Показать текст песни',
    shortcutFavoriteCurrentTrack: 'Добавить текущий трек в избранное',
    shortcutOpenHelp: 'Справка',
    playbackTitle: 'Воспроизведение',
    replayGain: 'Replay Gain',
    replayGainDesc: 'Выравнивание громкости по метаданным ReplayGain',
    replayGainMode: 'Режим',
    replayGainAuto: 'Авто',
    replayGainAutoDesc: 'Использует громкость альбома, когда соседние треки в очереди из того же альбома, иначе громкость трека.',
    replayGainTrack: 'По треку',
    replayGainAlbum: 'По альбому',
    replayGainPreGain: 'Предусиление (файлы с тегами)',
    replayGainPreGainDesc: 'Общая прибавка, добавляемая к каждому расчёту ReplayGain. Удобно, если библиотека в целом кажется тихой.',
    replayGainFallback: 'Резерв (без тегов / радио)',
    replayGainFallbackDesc: 'Применяется к трекам (и радиопотокам) без тегов ReplayGain, чтобы непомеченный контент не звучал громче остального.',
    normalization: 'Нормализация',
    normalizationDesc: 'Выровнять воспринимаемую громкость между треками, альбомами и радио.',
    normalizationOff: 'Выкл.',
    normalizationReplayGain: 'ReplayGain',
    normalizationLufs: 'LUFS',
    loudnessTargetLufs: 'Целевой LUFS',
    loudnessTargetLufsDesc: 'Опорная громкость, к которой подгоняются все треки. Меньше число = громче на выходе. Стриминг-сервисы обычно держат около -14 LUFS.',
    loudnessPreAnalysisAttenuation: 'Ослабление до измерения',
    loudnessPreAnalysisAttenuationDesc:
      'Насколько приглушить звук, пока для трека нет сохранённого измерения громкости. При стриме дальше идут лишь грубые оценки, не полный LUFS. 0 dB — без дополнительного приглушения; ниже — тише. Справа показывается фактическая поправка для текущей цели.',
    loudnessPreAnalysisAttenuationRef: 'Фактически {{eff}} dB при цели {{tgt}} LUFS.',
    loudnessPreAnalysisAttenuationReset: 'По умолчанию',
    loudnessFirstPlayNote:
      'При первом прослушивании нового трека громкость может ненадолго колебаться, пока идёт измерение. Со второго раза применяется уже сохранённое значение и всё стабильно. Следующие треки в очереди обычно анализируются во время предыдущей композиции, поэтому на практике это случается редко.',
    crossfade: 'Кроссфейд',
    crossfadeDesc: 'Плавный переход между треками',
    crossfadeSecs: '{{n}} с',
    notWithGapless: 'Недоступно при включённом режиме без пауз',
    notWithCrossfade: 'Недоступно при включённом кроссфейде',
    gapless: 'Без пауз между треками',
    gaplessDesc: 'Заранее подгружать следующий трек, чтобы не было тишины',
    preservePlayNextOrder: 'Сохранять порядок «Играть следующим»',
    preservePlayNextOrderDesc: 'Новые элементы «Играть следующим» становятся в конец очереди, а не лезут вперёд.',
    trackPreviewsTitle: 'Превью треков',
    trackPreviewsToggle: 'Включить превью треков',
    trackPreviewsDesc: 'Показывать встроенные кнопки воспроизведения и превью в списках треков для быстрого прослушивания фрагмента.',
    trackPreviewStart: 'Начальная позиция',
    trackPreviewStartDesc: 'С какого момента трека начинается превью (% от длительности).',
    trackPreviewDuration: 'Длительность',
    trackPreviewDurationDesc: 'Сколько играет каждое превью до автоматической остановки.',
    trackPreviewDurationSecs: '{{n}} с',
    trackPreviewLocationsTitle: 'Где показывать превью',
    trackPreviewLocationsDesc: 'Выберите, в каких списках показывать кнопки превью.',
    trackPreviewLocation_suggestions: 'В предложениях плейлиста',
    trackPreviewLocation_albums: 'В списках треков альбома',
    trackPreviewLocation_playlists: 'В плейлистах',
    trackPreviewLocation_favorites: 'В избранном',
    trackPreviewLocation_artist: 'В топ-треках исполнителя',
    trackPreviewLocation_randomMix: 'В Random Mix',
    preloadMode: 'Предзагрузка следующего трека',
    preloadModeDesc: 'Когда начинать буферизацию следующего в очереди',
    nextTrackBufferingTitle: 'Буферизация',
    preloadHotCacheMutualExclusive: 'Предзагрузка и Hot Cache выполняют одну функцию — одновременно может быть активна только одна. Включение одной автоматически отключает другую.',
    preloadOff: 'Выкл.',
    preloadBalanced: 'Умеренно (за 30 с до конца)',
    preloadEarly: 'Рано (через 5 с после старта)',
    preloadCustom: 'Свой интервал',
    preloadCustomSeconds: 'Секунд до конца: {{n}}',
    infiniteQueue: 'Бесконечная очередь',
    infiniteQueueDesc: 'Подмешивать случайные треки, когда очередь закончится',
    experimental: 'Экспериментально',
    fsPlayerSection: 'Полноэкранный плеер',
    fsShowArtistPortrait: 'Отображать фото артиста',
    fsShowArtistPortraitDesc: 'Показывать фото артиста (или обложку альбома) в правой части полноэкранного плеера.',
    fsPortraitDim: 'Затемнение фото',
    fsLyricsStyle: 'Стиль отображения текста',
    fsLyricsStyleRail: 'Рельс',
    fsLyricsStyleRailDesc: 'Классическая рамка из 5 строк.',
    fsLyricsStyleApple: 'Прокрутка',
    fsLyricsStyleAppleDesc: 'Полноэкранный список с прокруткой.',
    sidebarLyricsStyle: 'Стиль прокрутки текста',
    sidebarLyricsStyleClassic: 'Классический',
    sidebarLyricsStyleClassicDesc: 'Активная строка центрируется.',
    sidebarLyricsStyleApple: 'Apple Music-like',
    sidebarLyricsStyleAppleDesc: 'Активная строка фиксируется сверху с плавной анимацией.',
    seekbarStyle: 'Стиль прогресс-бара',
    seekbarStyleDesc: 'Выбор внешнего вида полосы воспроизведения',
    seekbarTruewave: 'Реальная форма волны',
    seekbarPseudowave: 'Псевдо форма волны',
    seekbarLinedot: 'Линия и точка',
    seekbarBar: 'Полоса',
    seekbarThick: 'Толстая полоса',
    seekbarSegmented: 'Сегменты',
    seekbarNeon: 'Неон',
    seekbarPulsewave: 'Пульс-волна',
    seekbarParticletrail: 'Частицы',
    seekbarLiquidfill: 'Жидкость',
    seekbarRetrotape: 'Ретро-лента',
    themeSchedulerTitle: 'Расписание тем',
    themeSchedulerEnable: 'Включить расписание тем',
    themeSchedulerEnableSub: 'Автоматически переключается между двумя темами в зависимости от времени суток',
    themeSchedulerDayTheme: 'Дневная тема',
    themeSchedulerDayStart: 'День начинается в',
    themeSchedulerNightTheme: 'Ночная тема',
    themeSchedulerNightStart: 'Ночь начинается в',
    themeSchedulerActiveHint: 'Расписание тем активно - темы переключаются автоматически.',
    visualOptionsTitle: 'Визуальные Настройки',
    coverArtBackground: 'Фон Обложки',
    coverArtBackgroundSub: 'Показывать размытую обложку как фон в заголовках альбомов и плейлистов',
    playlistCoverPhoto: 'Обложка Плейлиста',
    playlistCoverPhotoSub: 'Показывать сетку обложек в детальном виде плейлиста',
    showBitrate: 'Показывать Битрейт',
    showBitrateSub: 'Отображать битрейт аудио в списках треков',
    floatingPlayerBar: 'Плавающая панель плеера',
    floatingPlayerBarSub: 'Держать панель плеера плавающей над содержимым',
    uiScaleTitle: 'Масштаб интерфейса',
    uiScaleLabel: 'Масштаб',
  },
  changelog: {
    modalTitle: 'Что нового',
    dontShowAgain: 'Больше не показывать',
    close: 'Понятно',
  },
  whatsNew: {
    title: 'Что нового',
    empty: 'Для этой версии пока нет записи в журнале изменений.',
    bannerTitle: 'Журнал изменений',
    bannerCollapsed: 'Что нового в v{{version}}',
    dismiss: 'Скрыть',
    close: 'Закрыть',
  },
  help: {
    title: 'Справка',
    searchPlaceholder: 'Поиск по справке…',
    noResults: 'Ничего не найдено. Попробуйте другой запрос.',
    s1: 'С чего начать',
    q1: 'Какие серверы поддерживаются?',
    a1: 'Psysonic в первую очередь сделан для Navidrome и полностью совместим с Subsonic — Gonic, Airsonic, LMS и другие серверы Subsonic-API тоже работают. Некоторые расширенные функции (рейтинги, умные плейлисты, обмен Magic String, управление пользователями) требуют Navidrome.',
    q2: 'Как добавить сервер?',
    a2: 'Настройки → Серверы → Добавить сервер. Введите URL (например, http://192.168.1.100:4533), имя пользователя и пароль. Psysonic проверяет соединение перед сохранением — при ошибке ничего не сохраняется. Можно добавить сколько угодно серверов и переключаться между ними в шапке; одновременно активен только один.',
    q3: 'Краткий обзор интерфейса?',
    a3: 'Боковая панель (слева) для навигации, Mainstage / страницы по центру, плеер внизу, панель Очереди справа (открывается через иконку справа вверху рядом с индикатором Now Playing). Поиск вверху работает по всей библиотеке; «Now Playing» показывает, что слушают другие пользователи на том же сервере Navidrome.',
    s2: 'Воспроизведение и Очередь',
    q4: 'Как пользоваться очередью?',
    a4: 'Откройте панель Очереди справа вверху. Перетаскивайте строки, чтобы менять порядок, выносите их за пределы для удаления, или используйте панель инструментов для перемешивания, сохранения очереди как плейлиста или перехода к треку. Перетаскивайте строки из панели в другие места как способ переноса.',
    q5: 'Gapless и Crossfade — в чём разница?',
    a5: 'Gapless преднабуферизирует следующий трек, чтобы между песнями не было тишины (идеально для концертных альбомов и DJ-миксов). Crossfade плавно затухает текущий трек, пока следующий нарастает (1–10 с — для перемешанных миксов). Они взаимоисключающи — включение одного отключает другое. Настройте оба в Настройки → Аудио.',
    q6: 'Что такое Бесконечная очередь?',
    a6: 'Когда очередь заканчивается и Повтор выключен, Psysonic тихо добавляет похожие/случайные треки из вашей библиотеки, чтобы воспроизведение не останавливалось. Авто-добавленные треки появляются под разделителем «— Добавлено автоматически —». Включается иконкой бесконечности в шапке очереди; ограничьте автодобавление жанром в Настройки → Очередь.',
    q7: 'Множественный выбор и Shift+клик диапазона?',
    a7: 'Включите «Выбор» на Альбомах / Новинках / Random Albums / Плейлистах. Клик переключает элемент, затем удерживайте Shift и кликните другой элемент — всё между ними в видимом порядке выделится. Shift+клики расширяют от последнего кликнутого якоря. Панель инструментов сверху предлагает массовые действия (очередь, скачивание, удаление и т. д.).',
    q8: 'Сочетания клавиш и глобальные хоткеи?',
    a8: 'По умолчанию: Пробел = Воспроизведение / Пауза, Esc = выйти из полного экрана / закрыть модалки, F1 = памятка по сочетаниям. Настройки → Ввод позволяет переназначить любое внутри-приложенческое действие (включая аккорды вроде Ctrl+Shift+P) и задать системные глобальные сочетания, работающие даже когда Psysonic в фоне или свёрнут. Медиа-клавиши (Воспр./Пауза, Далее, Назад) работают на всех платформах.',
    s3: 'Аудио-инструменты',
    q9: 'Режимы Replay Gain?',
    a9: 'Настройки → Аудио → Replay Gain. Режим Трек нормализует каждую песню к целевому уровню. Режим Альбом сохраняет кривую громкости внутри альбома. Режим Авто выбирает Трек или Альбом в зависимости от того, происходит ли очередь из одного альбома. Треки без тегов Replay Gain используют настраиваемый предусилитель.',
    q10: 'Что такое Smart Loudness Normalization (LUFS)?',
    a10: 'Современная альтернатива Replay Gain в Настройки → Аудио. Psysonic анализирует каждый трек по LUFS / EBU R128 и сохраняет результат, чтобы громкость была единой по всей библиотеке — включая треки без Replay Gain тегов. Холодный анализ работает в фоне и использует 35–40 % CPU около 1 минуты, потом 0. Установите целевую громкость (по умолчанию −10 LUFS) один раз.',
    q11: 'EQ и AutoEQ?',
    a11: '10-полосный параметрический EQ в Настройки → Аудио → Эквалайзер с ручными полосами и пресетами. AutoEQ рядом подгружает измеренный профиль коррекции для модели ваших наушников из базы AutoEQ и применяет его к полосам автоматически — выберите наушники, EQ настроится на правильную кривую.',
    q12: 'Как переключить устройство вывода аудио?',
    a12: 'Настройки → Аудио → Устройство вывода. Psysonic перечисляет все доступные выходы и переключается мгновенно при выборе. Кнопка обновления находит устройства, подключённые после запуска. На Linux ALSA-имена вроде «sysdefault» автоматически очищаются для удобства чтения.',
    q13: 'Что такое Hot Cache?',
    a13: 'Hot Cache предзагружает текущий трек и следующие в RAM и на диск, чтобы воспроизведение начиналось без задержек буферизации — особенно полезно на медленных / удалённых серверах. Вытеснение срабатывает при достижении лимита размера. Настройте размер и задержку дебаунса (чтобы быстрые скипы не приводили к лишним загрузкам) в Настройки → Аудио.',
    s4: 'Библиотека и Открытие',
    q14: 'Как работают рейтинги и Skip-to-1★?',
    a14: 'Psysonic поддерживает рейтинг 1–5 звёзд через OpenSubsonic (Navidrome ≥ 0.53). Оценивайте треки в списках, в контекстном меню или в плеере под именем исполнителя; альбомы — на странице альбома; исполнителей — на странице исполнителя. Skip-to-1★ (Настройки → Библиотека → Рейтинги) автоматически ставит 1 звезду после настраиваемого числа последовательных скипов. Та же панель позволяет задать минимальный рейтинг как фильтр для генерируемых миксов.',
    q15: 'Как просматривать — Папки, Жанры, Треки?',
    a15: 'Просмотр папок (боковая панель) ходит по дереву музыкальной директории сервера в Miller-column раскладке — клик по папке для входа, клик по треку или иконке воспроизведения папки для проигрывания / добавления. Жанры используют tag-cloud вид с размером по числу треков; клик по жанру открывает его. Треки — это плоский хаб библиотеки с виртуальным списком, сортируемым по столбцам, и живым поиском.',
    q16: 'Поиск и расширенный поиск?',
    a16: 'Поиск в шапке выполняет живой поиск по исполнителям, альбомам и трекам по мере набора. Откройте Расширенный поиск (боковая панель) для более богатого вида: фильтры по году, жанру, рейтингу, формату, каналам, частоте дискретизации, BPM, настроению — комбинируемые. Правый клик по любому результату открывает то же контекстное меню, что и в других местах.',
    q17: 'Что такое Миксы (Random / Genre / Super Genre / Lucky)?',
    a17: 'Random Mix строит плейлист случайных треков из библиотеки; фильтр ключевых слов исключает аудиокниги, комедию и т. д. по подстрокам жанра / названия / альбома. Super Genre Mix группирует библиотеку в широкие стили (Рок, Метал, Электронная, Джаз, Классика…) и строит сфокусированный микс. Lucky Mix использует историю прослушивания, рейтинги и похожие треки AudioMuse-AI для составления мгновенного плейлиста по одному клику.',
    q18: 'Страница статистики?',
    a18: 'Статистика (боковая панель) показывает топ исполнителей, топ альбомов, топ треков, разбивку по жанрам, время прослушивания со временем и охват по библиотеке, если настроено несколько музыкальных папок. Несколько видов экспортируются как изображение-карточка для шаринга.',
    q19: 'Как скачать альбом как ZIP?',
    a19: 'Страница альбома → «Скачать (ZIP)». Сервер сначала упаковывает альбом — для больших или lossless альбомов (FLAC / WAV) индикатор прогресса появляется только после завершения упаковки и начала передачи. Это нормально.',
    s5: 'Тексты',
    q20: 'Откуда берутся тексты?',
    a20: 'Три источника, настраиваемые в Настройки → Тексты: ваш сервер Navidrome (встроенные / OpenSubsonic тексты), LRCLIB (синхронизированные тексты от сообщества) и NetEase Cloud Music (большой азиатский + международный каталог). Каждый источник можно включить / выключить и переставить перетаскиванием.',
    q21: 'Как смотреть тексты во время воспроизведения?',
    a21: 'Кликните на иконку микрофона в плеере, чтобы открыть вкладку Тексты в панели очереди. Синхронизированные тексты автоматически прокручиваются и поддерживают клик-для-перехода; обычный текст прокручивается как статический блок. Включите Полноэкранный плеер через обложку плеера для иммерсивного вида текстов с mesh-blob фоном.',
    s6: 'Шаринг и Социальные функции',
    q22: 'Что такое Magic Strings?',
    a22: 'Magic Strings — это короткие копи-паст токены для шаринга вещей между пользователями Psysonic без сторонних серверов. Server-Invite строки позволяют другу присоединиться к вашему Navidrome одной вставкой; Magic Strings альбомов / исполнителей / очередей открывают тот же альбом / исполнителя / очередь у получателя. Создавайте через меню «Поделиться», вставляйте в строку поиска для использования.',
    q23: 'Что такое Orbit?',
    a23: 'Orbit — это синхронное совместное прослушивание: хост проигрывает трек, каждый гость слышит его синхронно, и гости могут предлагать песни, которые хост может принять в очередь. Запустите сессию через кнопку Orbit в шапке, поделитесь ссылкой-приглашением, и другие могут присоединиться с любой установки Psysonic. Хост контролирует воспроизведение (скип, перемотка, очередь) — гости получают вид в реальном времени и поле для предложений. Сессии эфемерные и завершаются, когда хост их закрывает.',
    q24: 'Что такое выпадающее меню Now Playing?',
    a24: 'Иконка трансляции справа вверху показывает, что слушают другие пользователи на вашем сервере Navidrome прямо сейчас, обновляется каждые 10 секунд. Ваша запись исчезает в момент паузы. По серверам — пользователи на другом активном сервере не показываются.',
    s7: 'Персонализация',
    q25: 'Темы и планировщик тем?',
    a25: 'Настройки → Внешний вид → Тема выбирает из 60+ тем в 8 группах (Psysonic, Mediaplayer, Операционные системы, Игры, Фильмы, Сериалы, Соцсети, Open Source Classics — Catppuccin / Nord / Gruvbox / Nightfox / Dracula). Auto-Switch Theme позволяет задать дневную и ночную тему со временем переключения, чтобы Psysonic переключался автоматически.',
    q26: 'Можно настроить боковую панель, Главную и страницу исполнителя?',
    a26: 'Да — Настройки → Персонализация. Кастомизатор боковой панели позволяет перетаскивать nav-элементы в нужном порядке и скрывать те, что не используются. Кастомизатор Главной включает/выключает каждый ряд Mainstage (Hero, Recent, Discover, Recently Played, Starred…). Кастомизатор страницы исполнителя меняет порядок секций (Top Songs, Альбомы, Синглы, Сборники, Похожие исполнители и т. д.) и позволяет скрывать те, на которые вы не смотрите.',
    q27: 'Что такое Mini Player?',
    a27: 'Маленькое плавающее окно с обложкой, элементами управления воспроизведением и компактной очередью. Открывается из иконки mini-player в плеере или сочетанием клавиш. Окно запоминает позицию и размер между сессиями. На Windows mini-webview предсоздаётся при запуске для мгновенного открытия; Linux / macOS включают это опционально через Настройки → Внешний вид → Предзагружать mini player.',
    q28: 'Что такое Floating Player Bar?',
    a28: 'Опциональный стиль плеера (Настройки → Внешний вид), который отделяется от нижней границы с тематическим фоном, акцентной рамкой, скруглённой обложкой и центрированной секцией громкости. Полезно на высоких мониторах или с компактными темами.',
    q29: 'Превью трека по наведению?',
    a29: 'Наведите мышь на строку трека, кликните маленькую кнопку превью на обложке или вызовите превью из контекстного меню — Psysonic стримит первые ~15 с через тот же Rust-аудио-движок, чтобы применилась нормализация громкости. Полезно для быстрого знакомства с альбомом, который вы ещё не слушали.',
    q30: 'Таймер сна?',
    a30: 'Кликните иконку луны в плеере, чтобы открыть таймер сна. Выберите длительность (или «конец текущего трека») и Psysonic плавно затухнет и поставит на паузу в конце. На кнопке отображается круговое кольцо и обратный отсчёт во время работы таймера.',
    q31: 'Масштаб UI, шрифт, стиль seekbar?',
    a31: 'Настройки → Внешний вид — Масштаб интерфейса (80–125 % без влияния на системный размер шрифта), Шрифт (10 UI шрифтов, включая IBM Plex Mono, Fira Code, Geist, Golos Text…), Стиль Seekbar (Волна анализированная / pseudowave детерминированная / Линия и Точка / Полоса / Толстая полоса / Сегментированный / Неон / Импульсная волна / Шлейф частиц / Жидкое заполнение / Ретро-плёнка).',
    s8: 'Опытный пользователь',
    q32: 'Управление плеером из командной строки?',
    a32: 'Бинарь Psysonic также служит пультом дистанционного управления. Примеры: psysonic --player play / pause / next / prev, --player volume 75, --player seek 15, --player shuffle, --player repeat off|all|one, --player rating 1-5. Переключайте серверы, аудиоустройства, библиотеки; запускайте Instant Mix; ищите исполнителей / альбомы / треки. Полный список через psysonic --player --help. Shell-автодополнение для bash и zsh через psysonic completions.',
    q33: 'Умные плейлисты (Navidrome)?',
    a33: 'Умные плейлисты — это динамические плейлисты на стороне Navidrome, определяемые правилами (жанр = Рок И год > 2020 и т. д.). Страница Плейлисты в Psysonic позволяет создавать, редактировать и удалять их с визуальным редактором правил — Psysonic общается с Navidrome native API для этого. Они ведут себя как обычные плейлисты в остальной части приложения и обновляются автоматически при изменении библиотеки.',
    q34: 'Резервная копия и восстановление настроек?',
    a34: 'Настройки → Хранилище → Резервное копирование экспортирует профили серверов, темы, сочетания клавиш и другие настройки в один JSON файл. Импортируйте файл на другой машине или после переустановки, чтобы восстановить всё сразу. Пароли серверов включены — храните файл в надёжном месте.',
    q35: 'Где смотреть все open-source лицензии?',
    a35: 'Настройки → Система → Open Source Licenses. Полный список зависимостей (cargo crates и npm пакеты) поставляется со встроенными текстами лицензий. Кликните на запись для полного текста; выделенный блок сверху подсвечивает узнаваемые библиотеки (Tauri, React, rodio, symphonia и т. д.).',
    s9: 'Офлайн и Sync',
    q36: 'Офлайн-режим — кэширование альбомов и плейлистов?',
    a36: 'Откройте любой альбом или плейлист и кликните иконку загрузки в шапке — Psysonic кэширует каждый трек локально, чтобы он играл с диска без сетевого вызова. Страница Офлайн-библиотека (боковая панель) показывает всё кэшированное, прогресс текущих загрузок и позволяет удалять записи иконкой корзины (появляется после завершения загрузки).',
    q37: 'Лимит офлайн-хранилища?',
    a37: 'Настройки → Библиотека → Офлайн позволяет задать максимальный размер кэша. При достижении лимита кнопка загрузки на странице альбома показывает предупреждающий баннер. Освободите место, удалив альбомы или плейлисты со страницы Офлайн-библиотека.',
    q38: 'Device Sync — копирование музыки на USB / SD?',
    a38: 'Device Sync (боковая панель) копирует альбомы, плейлисты или целых исполнителей на внешний диск для офлайн-прослушивания на других устройствах. Выберите целевую папку, выберите источники из вкладок браузера, нажмите «Перенести на устройство». Psysonic пишет манифест (psysonic-sync.json), чтобы знать, какие файлы уже там, даже если переоткрыть Device Sync на другой ОС с другим шаблоном имени файла. Шаблоны поддерживают токены {artist} / {album} / {title} / {track_number} / {disc_number} / {year} с / как разделителем папок.',
    s10: 'Интеграции и Устранение неполадок',
    q39: 'Скробблинг Last.fm?',
    a39: 'Настройки → Интеграции → Last.fm. Подключите аккаунт один раз, и Psysonic скробблит напрямую в Last.fm — настройка Navidrome не нужна. Скроббл отправляется после прослушивания 50 % трека. Now-playing пинги отправляются в начале.',
    q40: 'Discord Rich Presence?',
    a40: 'Настройки → Интеграции → Discord показывает текущий трек в вашем профиле Discord. Выберите между иконкой приложения, обложками с вашего сервера (через getAlbumInfo2 — нужен публично доступный сервер) или обложками Apple Music. Кастомизируйте отображаемые строки (детали, состояние, тултип) с помощью токен-шаблонов.',
    q41: 'Даты туров Bandsintown?',
    a41: 'Включается в Настройки → Интеграции → Now-Playing Info. Вкладка Now Playing на странице Now Playing затем показывает предстоящие даты туров для играющего исполнителя через Bandsintown widget API. По умолчанию выключено — никаких запросов до включения.',
    q42: 'Internet Radio — воспроизведение живых стримов?',
    a42: 'Internet Radio (боковая панель) проигрывает любой live-стрим, сохранённый на вашем сервере Navidrome (добавляйте станции через Navidrome admin UI). Воспроизведение работает через HTML5 audio движок браузера — большинство настроек EQ / Replay Gain / Loudness не применяются к радио, но ICY-метаданные (текущее имя песни) отображаются. Поддерживает MP3, AAC, OGG Vorbis и большинство HLS стримов; поддержка кодеков зависит от платформы.',
    q43: 'Тест соединения не проходит — что делать?',
    a43: 'Дважды проверьте URL включая порт (например, http://192.168.1.100:4533). В локальной сети http:// часто работает там, где https:// не работает (нет сертификата). Убедитесь, что firewall не блокирует порт и что имя пользователя и пароль правильные. Если сервер за reverse proxy, попробуйте сначала прямой URL для изоляции причины.',
    q44: 'Обложки и изображения исполнителей загружаются медленно.',
    a44: 'Изображения подгружаются с сервера при первом просмотре, затем кэшируются локально на 30 дней. Если хранилище сервера медленное, первый визит на страницу может занять момент; последующие визиты мгновенные. Hot Cache также помогает с треками, но кэш изображений независим.',
    q45: 'Проблемы Linux — чёрный экран или нет звука?',
    a45: 'Чёрный экран обычно проблема GPU / EGL драйвера в WebKitGTK — запускайте с GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1 (AUR / .deb / .rpm установщики устанавливают это автоматически). Для аудио убедитесь, что PipeWire или PulseAudio запущены. Пропадание звука после спящего режима / пробуждения теперь обрабатывается автоматически post-sleep recovery hook.',
  },
  queue: {
    title: 'Очередь',
    savePlaylist: 'Сохранить как плейлист',
    updatePlaylist: 'Обновить плейлист',
    filterPlaylists: 'Фильтр плейлистов…',
    playlistName: 'Название плейлиста',
    cancel: 'Отмена',
    save: 'Сохранить',
    loadPlaylist: 'Загрузить плейлист',
    loading: 'Загрузка…',
    noPlaylists: 'Плейлистов нет.',
    load: 'Заменить очередь и играть',
    appendToQueue: 'Добавить в очередь',
    delete: 'Удалить',
    deleteConfirm: 'Удалить плейлист «{{name}}»?',
    clear: 'Очистить',
    shuffle: 'Перемешать',
    gapless: 'Без пауз',
    crossfade: 'Кроссфейд',
    infiniteQueue: 'Бесконечная очередь',
    autoAdded: '— Добавлено автоматически —',
    radioAdded: '— Радио —',
    hide: 'Скрыть',
    hideNowPlaying: 'Скрыть информацию о воспроизведении',
    showNowPlaying: 'Показать информацию о воспроизведении',
    close: 'Закрыть',
    nextTracks: 'Дальше',
    shareQueue: 'Копировать ссылку на очередь',
    shareQueueEmpty: 'Очередь пуста — нечем поделиться.',
    emptyQueue: 'Очередь пуста.',
    trackSingular: 'трек',
    trackPlural: 'треков',
    showRemaining: 'Осталось',
    showTotal: 'Всего',
    showEta: 'Показать ориентировочное окончание',
    replayGain: 'ReplayGain',
    rgTrack: 'Т {{db}} дБ',
    rgAlbum: 'А {{db}} дБ',
    rgPeak: 'Пик {{pk}}',
    sourceOffline: 'Играет из офлайн-библиотеки',
    sourceHot: 'Играет из кэша',
    sourceStream: 'Играет из сетевого потока',
    clearCachedLoudnessWaveform: 'Сбросить кэш громкости (LUFS) и формы волны и заново проанализировать трек',
    recalculatingLoudnessWaveform: 'Пересчёт громкости и формы волны для этого трека…',
  },
  miniPlayer: {
    showQueue: 'Показать очередь',
    hideQueue: 'Скрыть очередь',
    pinOnTop: 'Поверх окон',
    pinOff: 'Открепить',
    openMainWindow: 'Открыть главное окно',
    close: 'Закрыть',
    emptyQueue: 'Очередь пуста',
  },
  statistics: {
    title: 'Статистика',
    recentlyPlayed: 'Недавно проиграно',
    mostPlayed: 'Самые проигранные альбомы',
    highestRated: 'С высоким рейтингом',
    genreDistribution: 'Жанры (топ-20)',
    loadMore: 'Ещё',
    statArtists: 'Исполнители',
    statArtistsTooltip: 'Только исполнители альбомов — артисты, присутствующие лишь в треках (фичеринг, гость и т. д.) без собственного альбома, не учитываются.',
    statAlbums: 'Альбомы',
    statSongs: 'Треки',
    statGenres: 'Жанры',
    statPlaytime: 'Время звучания',
    genreInsights: 'По жанрам',
    formatDistribution: 'Форматы',
    formatSample: 'Выборка {{n}} треков',
    computing: 'Считаем…',
    genreSongs_one: '{{count}} композиция',
    genreSongs_few: '{{count}} композиции',
    genreSongs_many: '{{count}} композиций',
    genreSongs_other: '{{count}} композиций',
    genreAlbums_one: '{{count}} альбом',
    genreAlbums_few: '{{count}} альбома',
    genreAlbums_many: '{{count}} альбомов',
    genreAlbums_other: '{{count}} альбомов',
    recentlyAdded: 'Недавно добавлено',
    decadeDistribution: 'Альбомы по десятилетиям',
    decadeAlbums_one: '{{count}} альбом',
    decadeAlbums_few: '{{count}} альбома',
    decadeAlbums_many: '{{count}} альбомов',
    decadeAlbums_other: '{{count}} альбомов',
    decadeUnknown: 'Неизвестно',
    lfmTitle: 'Статистика Last.fm',
    lfmTopArtists: 'Топ исполнителей',
    lfmTopAlbums: 'Топ альбомов',
    lfmTopTracks: 'Топ треков',
    lfmPlays_one: '{{count}} прослушивание',
    lfmPlays_few: '{{count}} прослушивания',
    lfmPlays_many: '{{count}} прослушиваний',
    lfmPlays_other: '{{count}} прослушиваний',
    lfmPeriodOverall: 'За всё время',
    lfmPeriod7day: '7 дней',
    lfmPeriod1month: 'Месяц',
    lfmPeriod3month: '3 месяца',
    lfmPeriod6month: '6 месяцев',
    lfmPeriod12month: 'Год',
    lfmNotConnected: 'Подключите Last.fm в настройках.',
    lfmRecentTracks: 'Последние скробблы',
    lfmNowPlaying: 'Сейчас играет',
    lfmJustNow: 'только что',
    lfmMinutesAgo: '{{n}} мин назад',
    lfmHoursAgo: '{{n}} ч назад',
    lfmDaysAgo: '{{n}} дн. назад',
    topRatedSongs: 'Лучшие по рейтингу треки',
    topRatedArtists: 'Лучшие по рейтингу исполнители',
    noRatedSongs: 'Нет оценённых треков. Ставьте оценки в альбомах или плейлистах.',
    noRatedArtists: 'Нет оценённых исполнителей.',
  },
  player: {
    regionLabel: 'Плеер',
    openFullscreen: 'Полноэкранный плеер',
    fullscreen: 'Полноэкранный режим',
    closeFullscreen: 'Выйти из полноэкранного',
    closeTooltip: 'Закрыть (Esc)',
    noTitle: 'Без названия',
    stop: 'Стоп',
    prev: 'Предыдущий трек',
    play: 'Играть',
    pause: 'Пауза',
    previewActive: 'Превью воспроизводится',
    previewLabel: 'Превью',
    delayModalTitle: 'Таймер',
    delayPauseSection: 'Пауза через',
    delayStartSection: 'Старт через',
    delayPreviewPause: 'Пауза в',
    delayPreviewStart: 'Старт в',
    delaySchedulePause: 'Запланировать паузу',
    delayScheduleStart: 'Запланировать старт',
    delayCancelPause: 'Отменить таймер паузы',
    delayCancelStart: 'Отменить таймер старта',
    delayInactivePause: 'Доступно только во время воспроизведения.',
    delayInactiveStart: 'Доступно на паузе при загруженном треке или радио.',
    delayCustomMinutes: 'Своя задержка (минуты)',
    delayCustomPlaceholder: 'напр. 2.5',
    closeDelayModal: 'Закрыть',
    delayIn: 'через',
    delayFmtSec: '{{n}} с',
    delayFmtMin: '{{n}} мин',
    delayFmtHr: '{{n}} ч',
    delayCancel: 'Отмена',
    delayApply: 'Применить',
    next: 'Следующий трек',
    repeat: 'Повтор',
    repeatOff: 'Выкл.',
    repeatAll: 'Все',
    repeatOne: 'Один',
    progress: 'Прогресс',
    volume: 'Громкость',
    toggleQueue: 'Очередь',
    collapseQueueResize: 'Свернуть очередь, изменить ширину',
    moreOptions: 'Дополнительно',
    equalizer: 'Эквалайзер',
    miniPlayer: 'Мини-плеер',
    lyrics: 'Текст',
    lyricsLoading: 'Загрузка текста…',
    lyricsNotFound: 'Текст не найден',
    lyricsSourceNetease: 'Источник: Netease',
    lyricsSourceLyricsplus: 'Источник: YouLyPlus',
    showDuration: 'Показать длительность',
    showRemainingTime: 'Показать оставшееся время',
  },
  nowPlayingInfo: {
    tab: 'Инфо',
    empty: 'Включите воспроизведение, чтобы увидеть информацию',
    artist: 'Исполнитель',
    songInfo: 'О треке',
    onTour: 'В туре',
    noTourEvents: 'Нет предстоящих концертов',
    tourLoading: 'Загрузка…',
    poweredByBandsintown: 'Данные о туре через Bandsintown',
    bioReadMore: 'Читать дальше',
    bioReadLess: 'Свернуть',
    showMoreTours_one: 'Показать ещё {{count}}',
    showMoreTours_few: 'Показать ещё {{count}}',
    showMoreTours_many: 'Показать ещё {{count}}',
    showMoreTours_other: 'Показать ещё {{count}}',
    showLessTours: 'Свернуть',
    enableBandsintownPrompt: 'Показать предстоящие концерты?',
    enableBandsintownPromptDesc: 'Опционально. Загружает концерты текущего исполнителя через публичный API Bandsintown.',
    enableBandsintownPrivacy: 'При включении имя текущего исполнителя отправляется в API Bandsintown для получения дат концертов. Аккаунт и личные данные не передаются.',
    enableBandsintownAction: 'Включить',
    role: {
      artist: 'Исполнитель',
      albumArtist: 'Исполнитель альбома',
      composer: 'Композитор',
    },
  },
  songInfo: {
    title: 'О треке',
    songTitle: 'Название',
    artist: 'Исполнитель',
    album: 'Альбом',
    albumArtist: 'Альбомный исполнитель',
    year: 'Год',
    genre: 'Жанр',
    duration: 'Длительность',
    track: 'Номер',
    format: 'Формат',
    bitrate: 'Битрейт',
    sampleRate: 'Частота',
    bitDepth: 'Разрядность',
    channels: 'Каналы',
    fileSize: 'Размер файла',
    path: 'Путь',
    replayGainTrack: 'RG по треку',
    replayGainAlbum: 'RG по альбому',
    replayGainPeak: 'Пик RG',
    mono: 'Моно',
    stereo: 'Стерео',
  },
  playlists: {
    title: 'Плейлисты',
    newPlaylist: 'Новый плейлист',
    unnamed: 'Без названия',
    createName: 'Название…',
    create: 'Создать',
    cancel: 'Отмена',
    empty: 'Плейлистов пока нет.',
    emptyPlaylist: 'Плейлист пуст.',
    addFirstSong: 'Добавьте первый трек',
    notFound: 'Плейлист не найден.',
    songs: 'Треков: {{n}}',
    playAll: 'Воспроизвести всё',
    shuffle: 'Перемешать',
    addToQueue: 'В очередь',
    back: 'К списку плейлистов',
    deletePlaylist: 'Удалить',
    confirmDelete: 'Нажмите ещё раз для подтверждения',
    removeSong: 'Убрать из плейлиста',
    addSongs: 'Добавить треки',
    searchPlaceholder: 'Поиск по библиотеке…',
    noResults: 'Ничего не найдено.',
    suggestions: 'Рекомендации',
    noSuggestions: 'Пока нет рекомендаций.',
    titleBadge: 'Плейлист',
    refreshSuggestions: 'Обновить подборку',
    addSong: 'В плейлист',
    preview: 'Превью (30 с)',
    previewStop: 'Остановить превью',
    playNextSuggestion: 'Играть следующим',
    suggestionsHint: 'Двойной клик по строке — добавить в плейлист',
    addSelected: 'Добавить выбранные',
    cacheOffline: 'Сохранить плейлист офлайн',
    offlineCached: 'Плейлист сохранён',
    removeOffline: 'Удалить из офлайн-кэша',
    offlineDownloading: 'Кэширование… ({{done}} из {{total}} альбомов)',
    publicLabel: 'Публичный',
    privateLabel: 'Личный',
    editMeta: 'Изменить плейлист',
    editNamePlaceholder: 'Название…',
    editCommentPlaceholder: 'Описание…',
    editPublic: 'Публичный плейлист',
    editSave: 'Сохранить',
    editCancel: 'Отмена',
    changeCover: 'Сменить обложку',
    changeCoverLabel: 'Сменить фото',
    removeCover: 'Убрать фото',
    coverUpdated: 'Обложка обновлена',
    metaSaved: 'Плейлист сохранён',
    downloadZip: 'Скачать (ZIP)',
    // Toast notifications for multi-select
    addSuccess: '{{count}} треков добавлено в {{playlist}}',
    addPartial: '{{added}} добавлено, {{skipped}} пропущено (дубликаты)',
    addAllSkipped: 'Все пропущены ({{count}} дубликатов)',
    addedAsDuplicates: '{{count}} треков добавлено в {{playlist}} (как дубликаты)',
    duplicateConfirmTitle: 'Уже в плейлисте',
    duplicateConfirmMessage: 'Все {{count}} треков уже есть в «{{playlist}}». Всё равно добавить их как дубликаты?',
    duplicateConfirmAction: 'Всё равно добавить',
    addError: 'Ошибка при добавлении треков',
    createAndAddSuccess: 'Плейлист "{{playlist}}" создан с {{count}} треками',
    createError: 'Ошибка при создании плейлиста',
    deleteSuccess: '{{count}} плейлистов удалено',
    deleteFailed: 'Ошибка при удалении {{name}}',
    deleteSelected: 'Удалить выбранные',
    deleteSelectedPartial: 'Можно удалить только {{n}} из {{total}} выбранных плейлистов (остальные принадлежат другим пользователям).',
    mergeSuccess: '{{count}} треков объединено в {{playlist}}',
    mergeNoNewSongs: 'Нет новых треков для добавления',
    mergeError: 'Ошибка при объединении плейлистов',
    mergeInto: 'Объединить в',
    selectionCount: '{{count}} выбрано',
    select: 'Выбрать',
    startSelect: 'Включить выбор',
    cancelSelect: 'Отмена',
    loadingAlbums: 'Загрузка {{count}} альбомов…',
    loadingArtists: 'Загрузка {{count}} исполнителей…',
    myPlaylists: 'Мои плейлисты',
    noOtherPlaylists: 'Нет других доступных плейлистов',
    addToPlaylistSuccess: '{{count}} треков добавлено в {{playlist}}',
    addToPlaylistNoNew: 'Нет новых треков для {{playlist}}',
    addToPlaylistError: 'Ошибка при добавлении в плейлист',
    removeSuccess: 'Трек убран из плейлиста',
    removeError: 'Ошибка при удалении из плейлиста',
    importCSV: 'Импорт CSV',
    importCSVTooltip: 'Импорт из CSV Spotify',
    csvImportReport: 'Отчёт об импорте CSV',
    csvImportTotal: 'Всего',
    csvImportAdded: 'Добавлено',
    csvImportDuplicates: 'Дубликаты',
    csvImportNotFound: 'Не найдено',
    csvImportNetworkErrors: 'Ошибки сети',
    csvImportDuplicatesTitle: 'Дубликаты (уже в плейлисте):',
    csvImportNotFoundTitle: 'Не найденные треки:',
    csvImportNetworkErrorsTitle: 'Ошибки сети (можно повторить импорт):',
    csvImportDownloadReport: 'Скачать отчёт',
    csvImportClose: 'Закрыть',
    csvImportNoValidTracks: 'В CSV-файле не найдено действительных треков',
    csvImportFailed: 'Не удалось импортировать CSV-файл',
    csvImportToast: '{{added}} добавлено, {{notFound}} не найдено, {{duplicates}} дубликатов',
    csvImportDownloadSuccess: 'Отчёт успешно скачан',
    csvImportDownloadError: 'Не удалось скачать отчёт',
  },
  smartPlaylists: {
    sectionBasic: '1. База',
    sectionGenres: '2. Жанры',
    sectionYearsAndFilters: '3. Годы и фильтры',
    genreMode: 'Режим жанров',
    genreModeInclude: 'Включить жанры',
    genreModeExclude: 'Исключить жанры',
    genreSearchPlaceholder: 'Фильтр жанров...',
    availableGenres: 'Доступные',
    selectedGenres: 'Выбранные',
    yearMode: 'Режим годов',
    yearModeInclude: 'Включить диапазон',
    yearModeExclude: 'Исключить диапазон',
    name: 'Название (без префикса)',
    limit: 'Лимит',
    limitHint: 'Сколько треков включать в плейлист (1-{{max}}, обычно 50).',
    artistContains: 'Исполнитель содержит…',
    albumContains: 'Альбом содержит…',
    titleContains: 'Название содержит…',
    minRating: 'Мин. рейтинг',
    minRatingAria: 'Минимальный рейтинг для смарт-плейлиста',
    minRatingHint: '0 — без минимального порога; 1-5 — оставить треки с рейтингом выше выбранного.',
    fromYear: 'Год от',
    toYear: 'Год до',
    excludeUnrated: 'Исключить треки без рейтинга',
    compilationOnly: 'Только сборники',
    create: 'Создать смарт-плейлист',
    save: 'Сохранить смарт-плейлист',
    created: 'Создан {{name}}',
    updated: 'Обновлён {{name}}',
    createFailed: 'Не удалось создать смарт-плейлист.',
    updateFailed: 'Не удалось обновить смарт-плейлист.',
    navidromeOnly: 'Смарт-плейлисты можно создавать только на серверах Navidrome.',
    loadFailed: 'Не удалось загрузить смарт-плейлисты из Navidrome.',
    sortRandom: 'Сортировка: случайно',
    sortTitleAsc: 'Сортировка: название А-Я',
    sortTitleDesc: 'Сортировка: название Я-А',
    sortYearDesc: 'Сортировка: год по убыванию',
    sortYearAsc: 'Сортировка: год по возрастанию',
    sortPlayCountDesc: 'Сортировка: прослушивания по убыванию',
  },
  mostPlayed: {
    title: 'Популярное',
    topArtists: 'Топ исполнителей',
    topAlbums: 'Топ альбомов',
    plays: '{{n}} прослушиваний',
    sortMost: 'Сначала популярные',
    sortLeast: 'Сначала малоизвестные',
    loadMore: 'Загрузить больше альбомов',
    noData: 'Пока нет данных о прослушивании. Начните слушать!',
    noArtists: 'Все исполнители отфильтрованы.',
    filterCompilations: 'Скрыть исполнителей сборников (Various Artists, Soundtracks и др.)',
    filterCompilationsShort: 'Скрыть сборники',
  },
  losslessAlbums: {
    empty: 'В этой библиотеке пока нет lossless-альбомов.',
    unsupported: 'Этот сервер не предоставляет метаданные, необходимые для поиска lossless-альбомов.',
    slowFetchHint: 'Загружается медленнее других страниц альбомов — Psysonic проходит весь каталог песен по качеству.',
  },
  radio: {
    title: 'Онлайн-радио',
    empty: 'Радиостанции не настроены.',
    addStation: 'Добавить станцию',
    editStation: 'Изменить',
    deleteStation: 'Удалить станцию',
    confirmDelete: 'Нажмите ещё раз для подтверждения',
    stationName: 'Название станции…',
    streamUrl: 'URL потока…',
    homepageUrl: 'Сайт станции (необязательно)',
    save: 'Сохранить',
    cancel: 'Отмена',
    live: 'ЭФИР',
    liveStream: 'Онлайн-радио',
    openHomepage: 'Открыть сайт',
    changeCoverLabel: 'Сменить обложку',
    removeCover: 'Убрать обложку',
    browseDirectory: 'Каталог станций',
    directoryPlaceholder: 'Поиск станций…',
    noResults: 'Станции не найдены.',
    stationAdded: 'Станция добавлена',
    filterAll: 'Все',
    filterFavorites: 'Избранное',
    sortManual: 'Вручную',
    sortAZ: 'А → Я',
    sortZA: 'Я → А',
    sortNewest: 'Сначала новые',
    favorite: 'В избранное',
    unfavorite: 'Убрать из избранного',
    noFavorites: 'Избранных станций нет.',
    listenerCount_one: '{{count}} слушатель',
    listenerCount_other: '{{count}} слушателей',
    recentlyPlayed: 'Недавно сыгранное',
    upNext: 'Следующий',
  },
  folderBrowser: {
    empty: 'Папка пуста',
    error: 'Ошибка загрузки',
  },
  deviceSync: {
    title: 'Синхронизация устройства',
    targetFolder: 'Папка назначения',
    noFolderChosen: 'Папка не выбрана',
    selectDrive: 'Выберите диск…',
    refreshDrives: 'Обновить диски',
    noDrivesDetected: 'Съёмные диски не обнаружены',
    browseManual: 'Обзор вручную…',
    free: 'свободно',
    notMountedVolume: 'Цель не находится на смонтированном томе. Диск мог быть отключён.',
    chooseFolder: 'Выбрать…',
    filenameTemplate: 'Шаблон имени файла',
    targetDevice: 'Целевое устройство',
    templateHint: 'Переменные: {artist}, {album}, {title}, {track_number}, {disc_number}, {year}',
    cleanupButton: 'Удалить файлы вне выборки',
    cleanupNothingToDelete: 'Нечего удалять — устройство уже синхронизировано.',
    confirmCleanup: 'Удалить {{count}} файл(ов) с устройства, не входящих в текущую выборку. Продолжить?',
    cleanupComplete: '{{count}} файл(ов) удалено с устройства.',
    selectedSources: 'Выбранные источники',
    noSourcesSelected: 'Источники не выбраны. Нажмите на элементы в браузере, чтобы добавить их.',
    clearAll: 'Очистить всё',
    tabPlaylists: 'Плейлисты',
    tabAlbums: 'Альбомы',
    tabArtists: 'Исполнители',
    searchPlaceholder: 'Поиск…',
    syncButton: 'Синхронизировать на устройство',
    actionTransfer: 'Перенести на устройство',
    actionDelete: 'Удалить с устройства',
    actionApplyAll: 'Применить все изменения',
    templatePreview: 'Предпросмотр',
    templatePresetStandard: 'Стандарт',
    templatePresetMultiDisc: 'Мульти-диск',
    templatePresetAltFolder: 'Альт. папка',
    tokenSlashHint: '/ = разделитель папок',
    cancel: 'Отмена',
    noTargetDir: 'Сначала выберите папку назначения.',
    noSources: 'Выберите хотя бы один источник.',
    noTracks: 'В выбранных источниках не найдено треков.',
    fetchError: 'Ошибка загрузки треков с сервера.',
    syncComplete: 'Синхронизация завершена.',
    dismiss: 'Закрыть',
    cancelSync: 'Отмена',
    syncCancelled: 'Синхронизация отменена ({{done}} / {{total}} перенесено).',
    colName: 'Название',
    colType: 'Тип',
    colStatus: 'Статус',
    onDevice: 'Управление устройством',
    addSources: 'Добавить…',
    syncResult: '{{done}} перенесено, {{skipped}} уже актуально ({{total}} всего)',
    deleteFromDevice: 'Пометить для удаления ({{count}})',
    confirmDelete: 'Удалить {{count}} запись(ей) с устройства: {{names}}?',
    deleteComplete: '{{count}} запись(ей) удалено с устройства.',
    manifestImported: 'Импортировано {{count}} источник(ов) из манифеста устройства.',
    statusSynced: 'Синхронизировано',
    statusPending: 'Ожидает',
    statusDeletion: 'Удаление',
    markForDeletion: 'Пометить для удаления',
    removeSource: 'Удалить',
    undoDeletion: 'Отменить удаление',
    syncInBackground: 'Синхронизация запущена в фоне — можно перейти в другой раздел.',
    syncInProgress: '{{done}} / {{total}} треков…',
    syncSummary: 'Сводка синхронизации',
    calculating: 'Вычисление необходимых данных…',
    filesToAdd: 'Файлы для добавления:',
    filesToDelete: 'Файлы для удаления:',
    netChange: 'Чистое изменение:',
    availableSpace: 'Доступное место на диске:',
    spaceWarning: 'Предупреждение: на целевом устройстве недостаточно сообщаемого места.',
    proceed: 'Продолжить синхронизацию',
    notEnoughSpace: 'Обнаружено недостаточно физического места на диске!',
    liveSearch: 'Live',
    randomAlbumsLabel: 'Случайные альбомы',
  },
  orbit: {
    triggerLabel: 'Orbit',
    triggerTooltip: 'Начать или присоединиться к совместной сессии прослушивания',
    launchCreate: 'Создать сессию',
    launchJoin: 'Присоединиться к сессии',
    launchHelp: 'Как это работает?',
    launchHelpSoon: 'Скоро будет',
    joinModalTitle: 'Присоединиться к сессии Orbit',
    joinModalSub: 'Вставь ссылку-приглашение от хоста.',
    joinModalLinkLabel: 'Ссылка-приглашение',
    joinModalLinkPlaceholder: 'psysonic2-…',
    joinModalLinkHelper: 'Работает с любой действительной ссылкой Orbit. Должна указывать на сервер, на котором ты сейчас авторизован.',
    joinModalPasteTooltip: 'Вставить из буфера обмена',
    joinModalSubmit: 'Присоединиться',
    joinModalBusy: 'Подключение…',
    joinErrEmpty: 'Вставь ссылку-приглашение.',
    joinErrInvalid: 'Это не похоже на ссылку-приглашение Orbit.',
    closeAria: 'Закрыть',
    heroTitlePrefix: 'Слушай вместе с',
    heroTitleBrand: 'Orbit',
    heroSub: 'Начни сессию — другие пользователи на {{server}} будут слушать вместе и смогут предлагать треки.',
    fallbackServer: 'этот сервер',
    tipLan: 'Ты сейчас подключён через адрес домашней сети. Гости вне твоей сети не смогут присоединиться — переключись на публичный адрес сервера в настройках перед стартом.',
    tipRemote: 'Чтобы гости вне домашней сети могли присоединиться, адрес сервера должен быть публично доступен. Если сервер только внутренний, переключись перед стартом.',
    labelName: 'Название сессии',
    namePlaceholder: 'Velvet Orbit',
    reshuffleTooltip: 'Новое предложение',
    reshuffleAria: 'Предложить новое название',
    helperName: 'Как сессия будет отображаться у гостей — оставь или введи своё.',
    labelMax: 'Макс. гостей',
    helperMax: 'Ты не считаешься — это только ограничивает входящих гостей.',
    labelLink: 'Ссылка-приглашение',
    tooltipCopied: 'Скопировано',
    tooltipCopy: 'Копировать',
    ariaCopyLink: 'Копировать ссылку-приглашение',
    helperLink: 'Отправь эту ссылку гостям. Они могут вставить её в Psysonic в любом месте с помощью Ctrl+V.',
    labelClearQueue: 'Сначала очистить мою очередь',
    helperClearQueue: 'Начать сессию с пустой очередью. Выкл.: уже поставленные треки остаются и делятся с гостями.',
    btnCancel: 'Отмена',
    btnStarting: 'Запуск…',
    btnStart: 'Запустить Orbit',
    btnCopyAndStart: 'Копировать ссылку и запустить',
    errNameRequired: 'Пожалуйста, дай сессии название.',
    errStartFailed: 'Не удалось запустить.',
    hostLabel: 'Хост: {{name}}',
    participantsTooltip: 'Участники',
    settingsTooltip: 'Настройки сессии',
    shareTooltip: 'Поделиться ссылкой-приглашением',
    shuffleLabel: 'Следующее перемешивание через',
    catchUpLabel: 'догнать',
    catchUpTooltip: 'Перейти к текущей позиции хоста',
    hostAway: 'Хост оффлайн',
    hostOnline: 'Хост онлайн',
    endTooltip: 'Завершить сессию',
    leaveTooltip: 'Покинуть сессию',
    helpTooltip: 'Как работает Orbit',
    diag: {
      openTooltip: 'Диагностика — копируемый журнал событий',
      title: 'Диагностика Orbit',
      role: 'Роль',
      hostTrack: 'ID трека хоста',
      hostPos: 'Позиция хоста',
      guestTrack: 'Мой ID трека',
      guestPos: 'Моя позиция',
      drift: 'Расхождение',
      stateAge: 'Возраст состояния',
      eventLog: 'Журнал событий ({{count}})',
      copyLabel: 'Копировать',
      copyTooltip: 'Скопировать журнал в буфер обмена',
      clearLabel: 'Очистить',
      clearTooltip: 'Очистить буфер',
      empty: 'Пока нет событий — они появятся когда Orbit начнёт синхронизацию.',
      hint: 'Открой это перед воспроизведением проблемы, затем нажми Копировать и вставь в баг-репорт.',
      copied: 'Скопировано строк: {{count}}',
      copyFailed: 'Не удалось скопировать в буфер обмена',
      cleared: 'Буфер очищен',
    },
    helpTitle: 'Как работает Orbit',
    helpIntro: 'Orbit превращает Psysonic в общую комнату прослушивания. Хост выбирает музыку; гости слушают синхронно и могут предлагать треки.',
    helpHostOnly: '(хост)',
    helpSec1Title: 'Что такое Orbit?',
    helpSec1Body: 'Режим «слушать вместе» — хост управляет воспроизведением, гости подключаются. Всё идёт через плейлисты на твоём собственном сервере Navidrome; никакой внешней инфраструктуры.',
    helpSec2Title: 'Хост и гости',
    helpSec2Body: 'Хост управляет воспроизведением (play / pause / skip / seek) и решает, когда завершить сессию. Гости следуют за воспроизведением хоста, могут предлагать треки и выходить или присоединяться в любое время. Только хост может исключать или навсегда банить участников.',
    helpSec2WarnHead: 'Важно: отдельные аккаунты.',
    helpSec2WarnBody: 'У каждого участника должен быть свой аккаунт Navidrome. Если хост и гость входят под одним и тем же пользователем, их отправки конфликтуют, и хост никогда не увидит предложения гостя.',
    helpSec3Title: 'Запуск и приглашение',
    helpSec3Body: 'Нажми кнопку «Orbit» → Создать сессию → стартовое окно покажет готовую ссылку для копирования и опционально позволит очистить текущую очередь. Делись ссылкой как угодно. Пока сессия активна, кнопка «Поделиться» в верхней панели сессии копирует ссылку в любой момент.',
    helpSec4Title: 'Присоединение',
    helpSec4Body: 'Вставь ссылку-приглашение в любом месте Psysonic с помощью Ctrl+V / Cmd+V — запрос на присоединение появится автоматически. Альтернатива: «Orbit» → Присоединиться к сессии → вставь в поле. Если ссылка указывает на сервер, где у тебя есть аккаунт, Psysonic переключит тебя автоматически. Если у тебя несколько аккаунтов на этом сервере, небольшой выбор спросит, какой использовать.',
    helpSec5Title: 'Предложение треков',
    helpSec5Body: 'В любом списке треков: двойной клик по строке или правый клик → «Добавить в сессию Orbit». Одиночный клик показывает подсказку вместо того, чтобы забрасывать весь альбом в общую очередь — это намеренно. Явные массовые действия вроде «Воспроизвести всё» или «Воспроизвести альбом» сначала запрашивают подтверждение, потом добавляют (никогда не заменяют).',
    helpSec6Title: 'Общая очередь',
    helpSec6Body: 'Очередь показывает предстоящие треки хоста — видно всем. Входящие массовые добавления всегда идут в конец, чтобы не потерять предложения гостей. Автоперемешивание периодически переупорядочивает очередь (настраивается: 1 / 5 / 10 / 15 / 30 мин). Если твоё воспроизведение отклоняется от хоста, кнопка «Догнать» в панели сессии возвращает тебя к live-позиции хоста.',
    helpSec7Title: 'Подтверждения',
    helpSec7Body: 'По умолчанию предложения гостей требуют ручного подтверждения — они появляются в полосе «Подтверждения» вверху панели очереди с кнопками принять / отклонить. В настройках сессии можно включить автоматическое подтверждение, и всё будет попадать сразу.',
    helpSec8Title: 'Участники и настройки',
    helpSec8Body: 'Открой иконку настроек в панели сессии для частоты перемешивания, автоподтверждения и быстрого «Перемешать сейчас». Нажми на количество участников, чтобы увидеть, кто подключён — исключить (может присоединиться снова по ссылке) или забанить (заблокирован для этой сессии). Гости тоже видят список участников, но только для чтения.',
    helpSec9Title: 'Завершение сессии',
    helpSec9Body: 'X хоста → диалог подтверждения → сессия закрывается для всех, серверные плейлисты очищаются автоматически. X гостя → гость выходит, сессия продолжается. Если хост молчит 5 минут, гость автоматически выходит с уведомлением; короткие переподключения в этом окне невидимы.',
    participantsInviteLabel: 'Ссылка-приглашение',
    participantsCountLabel: '{{count}} в сессии',
    participantsHost: 'хост',
    participantsEmpty: 'Пока нет гостей',
    participantsKickTooltip: 'Удалить из сессии',
    participantsKickAria: 'Удалить {{user}}',
    participantsRemoveTooltip: 'Удалить из сессии',
    participantsRemoveAria: 'Удалить {{user}} из этой сессии',
    participantsBanTooltip: 'Забанить навсегда',
    participantsBanAria: 'Забанить {{user}} навсегда',
    participantsMuteTooltip: 'Запретить предлагать треки',
    participantsUnmuteTooltip: 'Разрешить предлагать треки',
    participantsMuteAria: 'Запретить {{user}} предлагать треки',
    participantsUnmuteAria: 'Снова разрешить {{user}} предлагать треки',
    confirmRemoveTitle: 'Удалить из сессии?',
    confirmRemoveBody: '{{user}} будет удалён из сессии, но может присоединиться снова по твоей ссылке-приглашению.',
    confirmRemoveConfirm: 'Удалить',
    confirmBanTitle: 'Забанить навсегда?',
    confirmBanBody: '{{user}} будет удалён и заблокирован от повторного присоединения к этой сессии. Отменить нельзя на время сессии.',
    confirmBanConfirm: 'Забанить',
    confirmCancel: 'Отмена',
    confirmJoinTitle: 'Присоединиться к сессии Orbit?',
    confirmJoinBody: '{{host}} пригласил тебя в «{{name}}». Присоединиться к сессии?',
    confirmJoinConfirm: 'Присоединиться',
    confirmLeaveTitle: 'Покинуть сессию?',
    confirmLeaveBody: 'Покинуть «{{name}}»? Ты можешь присоединиться снова в любое время по ссылке-приглашению от {{host}}.',
    confirmLeaveConfirm: 'Покинуть',
    confirmEndTitle: 'Завершить сессию для всех?',
    confirmEndBody: '«{{name}}» закроется для всех участников. Плейлисты сессии очищаются автоматически.',
    confirmEndConfirm: 'Завершить сессию',
    invalidLinkTitle: 'Ссылка-приглашение больше недействительна',
    invalidLinkBody: 'Эта сессия Orbit больше не существует или уже завершена. Попроси хоста прислать новую ссылку.',
    settingsTitle: 'Настройки сессии',
    settingAutoApprove: 'Автоматически принимать предложения',
    settingAutoApproveHint: 'Предложения гостей сразу попадают в твою очередь. Выкл.: они остаются в списке сессии для последующего просмотра.',
    settingAutoShuffle: 'Автоперемешивание',
    settingAutoShuffleHint: 'Периодическое Fisher-Yates перемешивание предстоящей очереди. Выкл.: порядок меняется только при ручной перестановке.',
    settingShuffleInterval: 'Перемешивать каждые',
    settingShuffleIntervalHint: 'Как часто предстоящая очередь перемешивается во время сессии.',
    suggestBlockedMuted: 'Хост отключил тебе предложение треков на этой сессии.',
    settingShuffleIntervalValue_one: '{{count}} мин',
    settingShuffleIntervalValue_few: '{{count}} мин',
    settingShuffleIntervalValue_many: '{{count}} мин',
    settingShuffleIntervalValue_other: '{{count}} мин',
    settingShuffleNow: 'Перемешать сейчас',
    toastSuggested: '{{user}} предложил «{{title}}»',
    toastSuggestedMany: '{{count}} новых предложений в очереди',
    toastShuffled: 'Очередь перемешана',
    toastJoined: 'Присоединился к сессии',
    toastLoginFirst: 'Войди, прежде чем присоединяться к сессии',
    toastSwitchServer: 'Сначала переключись на {{url}}, потом вставь снова',
    toastNoAccountForServer: 'У тебя нет доступа к {{url}}. Попроси хоста прислать приглашение.',
    toastSwitchFailed: 'Не удалось переключиться на {{url}}',
    accountPickerTitle: 'Какой аккаунт?',
    accountPickerSub: 'У тебя несколько аккаунтов для {{url}}. Выбери тот, под которым хочешь присоединиться.',
    toastJoinFail: 'Не удалось присоединиться к сессии',
    joinErrNotFound: 'Сессия не найдена',
    joinErrEnded: 'Сессия завершена',
    joinErrFull: 'Сессия заполнена',
    joinErrKicked: 'Ты не можешь присоединиться к этой сессии',
    joinErrNoUser: 'Нет активного сервера',
    joinErrServerError: 'Не удалось присоединиться',
    ctxAddToSession: 'Добавить в сессию Orbit',
    ctxSuggestedToast: 'Предложено в сессию',
    ctxSuggestFailed: 'Не удалось предложить — не присоединён',
    ctxAddToSessionHost: 'Добавить в сессию Orbit',
    ctxAddedHostToast: 'Добавлено в сессию',
    ctxAddHostFailed: 'Не удалось добавить в сессию',
    bulkConfirmTitle: 'Добавить всё в очередь Orbit?',
    bulkConfirmBody: 'Это сбросит {{count}} треков в общую очередь за раз. Это много для твоих гостей. Продолжить?',
    bulkConfirmYes: 'Добавить всё',
    bulkConfirmNo: 'Отмена',
    guestLive: 'Live',
    guestPlaying: 'Сейчас играет',
    guestPaused: 'Пауза',
    guestLoading: 'Загрузка…',
    guestSuggestions: 'Предложения',
    guestUpNext: 'Далее',
    guestUpNextEmpty: 'В очереди пусто. Открой контекстное меню трека и выбери «Добавить в сессию Orbit», чтобы предложить что-то.',
    guestPendingTitle: 'Ожидание хоста',
    guestPendingHint: 'Предложено — появится в очереди, когда хост примет.',
    approvalTitle: 'Ожидают подтверждения',
    approvalFrom: 'Предложено {{user}}',
    approvalAccept: 'Принять',
    approvalDecline: 'Отклонить',
    guestUpNextMore: '+ ещё {{count}} в очереди хоста',
    guestSubmitter: 'от {{user}}',
    queueAddedByHost: 'Добавил хост',
    queueAddedByYou: 'Добавил(а) ты',
    queueAddedByUser: 'Добавил {{user}}',
    guestEmpty: 'Предложений пока нет. Открой контекстное меню трека и выбери «Добавить в сессию Orbit».',
    guestFooter: 'Хост управляет воспроизведением — ты не можешь изменять список.',
    exitKickedTitle: 'Тебя забанили в сессии',
    exitRemovedTitle: 'Тебя удалили из сессии',
    exitEndedTitle: 'Хост завершил сессию',
    exitHostTimeoutTitle: 'Хост недоступен',
    exitHostTimeoutBody: '{{host}} давно не присылал обновления, поэтому «{{name}}» закрыта на твоей стороне. Ты можешь присоединиться снова в любое время по ссылке.',
    exitKickedBody: '{{host}} забанил тебя в «{{name}}». Ты не можешь присоединиться снова.',
    exitRemovedBody: '{{host}} удалил тебя из «{{name}}». Ты можешь присоединиться снова в любое время по ссылке.',
    exitEndedBody: '«{{name}}» завершена. Надеюсь, тебе понравилось.',
    exitOk: 'ОК',
  },
  tray: {
    playPause: 'Воспроизвести / Пауза',
    nextTrack: 'Следующий трек',
    previousTrack: 'Предыдущий трек',
    showHide: 'Показать / Скрыть',
    exitPsysonic: 'Закрыть Psysonic',
    nothingPlaying: 'Ничего не воспроизводится',
  },
  licenses: {
    title: 'Лицензии открытого кода',
    intro: 'Psysonic построен на программном обеспечении с открытым исходным кодом. Список ниже показывает каждую зависимость, поставляемую с приложением, с версией, лицензией и полным текстом лицензии.',
    highlights: 'Ключевые зависимости',
    searchPlaceholder: 'Поиск по имени, версии или лицензии…',
    noResults: 'Нет совпадений.',
    loading: 'Загрузка лицензий…',
    loadError: 'Не удалось загрузить данные о лицензиях.',
    noLicenseText: 'Текст лицензии для этой зависимости не включён.',
    viewSource: 'Открыть исходник',
    totalLine: '{{total}} зависимостей — {{cargo}} cargo, {{npm}} npm',
    generatedAt: 'Последняя генерация {{date}}',
  },
};
