feat: v1.34.1 — fullscreen lyrics overlay, FsArt crossfade, lyrics toggle, contributor updates

- FullscreenPlayer: synced lyrics overlay (5-line rail, mask fade, click-to-seek)
- FullscreenPlayer: FsArt crossfade component with onLoad pattern, 300px art, next-track pre-fetch
- FullscreenPlayer: MicVocal lyrics toggle button next to heart (persisted in authStore)
- FullscreenPlayer: idle system — only close button auto-hides, cluster+seekbar always visible
- LyricsPane: refactored to use shared useLyrics hook (no double-fetch with FS overlay)
- authStore: showFullscreenLyrics field (default true)
- i18n: fsLyricsToggle key added to all 7 locales; ru2.ts removed (merged into ru.ts)
- Settings: Contributors updated (nisrael, cucadmuh, kilyabin); logout moved to Server tab as btn-danger
- theme.css: btn-danger style added

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-06 23:00:33 +02:00
parent 390e6e788d
commit d73f348339
17 changed files with 687 additions and 942 deletions
+5 -1
View File
@@ -345,7 +345,6 @@ export const deTranslation = {
languageZh: 'Chinesisch',
languageNb: 'Norwegisch',
languageRu: 'Russisch',
languageRu2: 'Russisch 2',
font: 'Schriftart',
theme: 'Design',
appearance: 'Darstellung',
@@ -426,6 +425,8 @@ export const deTranslation = {
discordRichPresenceDesc: 'Zeigt den aktuell gespielten Titel im Discord-Profil an. Discord muss dafür geöffnet sein.',
nowPlayingEnabled: 'Im Livefenster anzeigen',
nowPlayingEnabledDesc: 'Überträgt den aktuell gespielten Titel an die Livehörer-Ansicht des Servers. Deaktivieren, um keine Wiedergabedaten zu senden.',
lyricsServerFirst: 'Server-Lyrics bevorzugen',
lyricsServerFirstDesc: 'Server-seitige Lyrics (eingebettete Tags, Sidecar-Dateien) vor LRCLIB abfragen. Deaktivieren, um LRCLIB zuerst zu verwenden.',
downloadsTitle: 'ZIP-Export & Archivierung',
downloadsFolderDesc: 'Zielverzeichnis für Alben, die du als ZIP-Datei auf deinen Computer herunterlädst.',
downloadsDefault: 'Standard-Downloads-Ordner',
@@ -689,8 +690,11 @@ export const deTranslation = {
volume: 'Lautstärke',
toggleQueue: 'Warteschlange umschalten',
lyrics: 'Lyrics',
fsLyricsToggle: 'Lyrics im Vollbild',
lyricsLoading: 'Lyrics werden geladen…',
lyricsNotFound: 'Keine Lyrics für diesen Titel gefunden',
lyricsSourceServer: 'Quelle: Server',
lyricsSourceLrclib: 'Quelle: LRCLIB',
},
songInfo: {
title: 'Song-Infos',
+5 -1
View File
@@ -345,7 +345,6 @@ export const enTranslation = {
languageZh: 'Chinese',
languageNb: 'Norwegian',
languageRu: 'Russian',
languageRu2: 'Russian 2',
font: 'Font',
theme: 'Theme',
appearance: 'Appearance',
@@ -426,6 +425,8 @@ export const enTranslation = {
discordRichPresenceDesc: 'Show the currently playing track on your Discord profile. Requires Discord to be running.',
nowPlayingEnabled: 'Show in Now Playing',
nowPlayingEnabledDesc: 'Broadcast your currently playing track to the server\'s live listener view. Disable to stop sending playback data.',
lyricsServerFirst: 'Prefer server lyrics',
lyricsServerFirstDesc: 'Check server-provided lyrics (embedded tags, sidecar files) before querying LRCLIB. Disable to use LRCLIB first.',
downloadsTitle: 'ZIP Export & Archiving',
downloadsFolderDesc: 'Destination folder for albums you download as a ZIP file to your computer.',
downloadsDefault: 'Default Downloads Folder',
@@ -689,8 +690,11 @@ export const enTranslation = {
volume: 'Volume',
toggleQueue: 'Toggle Queue',
lyrics: 'Lyrics',
fsLyricsToggle: 'Lyrics in fullscreen',
lyricsLoading: 'Loading lyrics…',
lyricsNotFound: 'No lyrics found for this track',
lyricsSourceServer: 'Source: Server',
lyricsSourceLrclib: 'Source: LRCLIB',
},
songInfo: {
title: 'Song Info',
+5 -1
View File
@@ -345,7 +345,6 @@ export const frTranslation = {
languageZh: 'Chinois',
languageNb: 'Norvégien',
languageRu: 'Russe',
languageRu2: 'Russe 2',
font: 'Police',
theme: 'Thème',
appearance: 'Apparence',
@@ -426,6 +425,8 @@ export const frTranslation = {
discordRichPresenceDesc: 'Affiche le titre en cours de lecture sur votre profil Discord. Discord doit être ouvert.',
nowPlayingEnabled: 'Afficher dans la fenêtre live',
nowPlayingEnabledDesc: 'Diffuse le titre en cours de lecture vers la vue des auditeurs en direct du serveur. Désactiver pour ne pas envoyer de données de lecture.',
lyricsServerFirst: 'Préférer les paroles du serveur',
lyricsServerFirstDesc: 'Consulter d\'abord les paroles fournies par le serveur (tags intégrés, fichiers sidecar) avant LRCLIB. Désactiver pour utiliser LRCLIB en priorité.',
downloadsTitle: 'Export ZIP & Archivage',
downloadsFolderDesc: 'Dossier de destination pour les albums téléchargés en tant que fichier ZIP sur votre ordinateur.',
downloadsDefault: 'Dossier de téléchargement par défaut',
@@ -689,8 +690,11 @@ export const frTranslation = {
volume: 'Volume',
toggleQueue: 'Afficher/masquer la file',
lyrics: 'Paroles',
fsLyricsToggle: 'Paroles en plein écran',
lyricsLoading: 'Chargement des paroles…',
lyricsNotFound: 'Aucune parole trouvée pour ce titre',
lyricsSourceServer: 'Source : Serveur',
lyricsSourceLrclib: 'Source : LRCLIB',
},
songInfo: {
title: 'Infos du morceau',
+5 -1
View File
@@ -345,7 +345,6 @@ export const nbTranslation = {
languageZh: 'Kinesisk',
languageNb: 'Norsk',
languageRu: 'Russisk',
languageRu2: 'Russisk 2',
font: 'Skrifttype',
theme: 'Tema',
appearance: 'Utseende',
@@ -425,6 +424,8 @@ export const nbTranslation = {
discordRichPresenceDesc: 'Vis sporet som spilles i din Discord-profil. Krever at Discord kjører.',
nowPlayingEnabled: 'Vis i "Nå spiller"',
nowPlayingEnabledDesc: 'Send sporet som spilles av til tjenerens live-lyttervisning. Deaktiver for å stoppe sending av avspillingsdata.',
lyricsServerFirst: 'Foretrekk server-sangtekst',
lyricsServerFirstDesc: 'Sjekk tjenerlevererte sangtekster (innebygde tagger, sidecar-filer) før LRCLIB. Deaktiver for å bruke LRCLIB først.',
downloadsTitle: 'ZIP Eksport & Arkivering',
downloadsFolderDesc: 'Målmappe for album du laster ned som en ZIP-fil til datamaskinen din.',
downloadsDefault: 'Standard nedlastingsmappe',
@@ -688,8 +689,11 @@ export const nbTranslation = {
volume: 'Volum',
toggleQueue: 'Veksle kø',
lyrics: 'Sangtekst',
fsLyricsToggle: 'Sangtekst i fullskjerm',
lyricsLoading: 'Laster sangtekst…',
lyricsNotFound: 'Ingen sangtekst funnet for dette sporet',
lyricsSourceServer: 'Kilde: Server',
lyricsSourceLrclib: 'Kilde: LRCLIB',
},
songInfo: {
title: 'Sanginfo',
+5 -1
View File
@@ -345,7 +345,6 @@ export const nlTranslation = {
languageZh: 'Chinees',
languageNb: 'Noors',
languageRu: 'Russisch',
languageRu2: 'Russisch 2',
font: 'Lettertype',
theme: 'Thema',
appearance: 'Weergave',
@@ -426,6 +425,8 @@ export const nlTranslation = {
discordRichPresenceDesc: 'Toont het huidige nummer op je Discord-profiel. Discord moet daarvoor geopend zijn.',
nowPlayingEnabled: 'Weergeven in live-venster',
nowPlayingEnabledDesc: 'Stuurt het huidige nummer naar de live-luisteraarsweergave van de server. Uitschakelen om geen afspeelgegevens te verzenden.',
lyricsServerFirst: 'Server-songtekst voorrang geven',
lyricsServerFirstDesc: 'Controleer eerst door de server geleverde songteksten (ingebedde tags, sidecar-bestanden) vóór LRCLIB. Uitschakelen om LRCLIB eerst te gebruiken.',
downloadsTitle: 'ZIP-export & Archivering',
downloadsFolderDesc: 'Doelmap voor albums die je als ZIP-bestand naar je computer downloadt.',
downloadsDefault: 'Standaard downloadmap',
@@ -689,8 +690,11 @@ export const nlTranslation = {
volume: 'Volume',
toggleQueue: 'Wachtrij in-/uitschakelen',
lyrics: 'Songtekst',
fsLyricsToggle: 'Songtekst in volledig scherm',
lyricsLoading: 'Songtekst laden…',
lyricsNotFound: 'Geen songtekst gevonden voor dit nummer',
lyricsSourceServer: 'Bron: Server',
lyricsSourceLrclib: 'Bron: LRCLIB',
},
songInfo: {
title: 'Nummerinfo',
-804
View File
@@ -1,804 +0,0 @@
/** Russian UI strings (alternative — kilyabin, PR #107) */
export const ru2Translation = {
sidebar: {
library: 'Библиотека',
mainstage: 'Главная',
newReleases: 'Новинки',
allAlbums: 'Все альбомы',
randomAlbums: 'Случайные альбомы',
artists: 'Исполнители',
randomMix: 'Случайный микс',
favorites: 'Избранное',
nowPlaying: 'Сейчас играет',
system: 'Система',
statistics: 'Статистика',
settings: 'Настройки',
help: 'Помощь',
expand: 'Развернуть боковую панель',
collapse: 'Свернуть боковую панель',
updateAvailable: 'Доступно обновление',
updateReady: '{{version}} готово',
updateLink: 'Перейти к релизу →',
downloadingTracks: 'Кэширование {{n}} треков…',
offlineLibrary: 'Офлайн библиотека',
genres: 'Жанры',
playlists: 'Плейлисты',
radio: 'Интернет радио',
},
home: {
hero: 'Рекомендации',
starred: 'Личные избранные',
recent: 'Недавно добавленные',
mostPlayed: 'Самые прослушиваемые',
recentlyPlayed: 'Недавно прослушанные',
discover: 'Открыть',
loadMore: 'Загрузить еще',
discoverMore: 'Открыть больше',
discoverArtists: 'Открыть исполнителей',
discoverArtistsMore: 'Все исполнители'
},
hero: {
eyebrow: 'Рекомендуемый альбом',
playAlbum: 'Воспроизвести альбом',
enqueue: 'В очередь',
enqueueTooltip: 'Добавить весь альбом в очередь',
},
search: {
placeholder: 'Поиск исполнителя, альбома или песни…',
noResults: 'Нет результатов для "{{query}}"',
artists: 'Исполнители',
albums: 'Альбомы',
songs: 'Песни',
clearLabel: 'Очистить поиск',
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: 'Информация о треке',
},
contextMenu: {
playNow: 'Воспроизвести сейчас',
playNext: 'Воспроизвести следующим',
addToQueue: 'Добавить в очередь',
enqueueAlbum: 'Добавить альбом в очередь',
startRadio: 'Запустить радио',
lfmLove: 'Нравится на Last.fm',
lfmUnlove: 'Убрать из любимых на Last.fm',
favorite: 'Избранное',
favoriteArtist: 'Добавить исполнителя в избранное',
favoriteAlbum: 'Добавить альбом в избранное',
unfavorite: 'Удалить из избранного',
unfavoriteArtist: 'Удалить исполнителя из избранного',
unfavoriteAlbum: 'Удалить альбом из избранного',
removeFromQueue: 'Удалить из очереди',
openAlbum: 'Открыть альбом',
goToArtist: 'Перейти к исполнителю',
download: 'Скачать (ZIP)',
addToPlaylist: 'Добавить в плейлист',
songInfo: 'Информация о песне',
},
albumDetail: {
back: 'Назад',
playAll: 'Воспроизвести все',
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: 'Название',
trackArtist: 'Исполнитель',
trackGenre: 'Жанр',
trackFormat: 'Формат',
trackFavorite: 'Избранное',
trackRating: 'Рейтинг',
trackDuration: 'Длительность',
trackTotal: 'Всего',
columns: 'Столбцы',
notFound: 'Альбом не найден.',
bioModal: 'Биография исполнителя',
bioClose: 'Закрыть',
ratingLabel: 'Рейтинг',
enlargeCover: 'Увеличить',
},
artistDetail: {
back: 'Назад',
albums: 'Альбомы',
album: 'Альбом',
playAll: 'Воспроизвести все',
shuffle: 'Перемешать',
radio: 'Радио',
loading: 'Загрузка…',
noRadio: 'Похожие треки для этого исполнителя не найдены.',
notFound: 'Исполнитель не найден.',
albumsBy: 'Альбомы {{name}}',
topTracks: 'Лучшие треки',
noAlbums: 'Альбомы не найдены.',
trackTitle: 'Название',
trackAlbum: 'Альбом',
trackDuration: 'Длительность',
favoriteAdd: 'Добавить в избранное',
favoriteRemove: 'Удалить из избранного',
favorite: 'Избранное',
albumCount_one: '{{count}} альбом',
albumCount_few: '{{count}} альбома',
albumCount_many: '{{count}} альбомов',
albumCount_other: '{{count}} альбомов',
openedInBrowser: 'Открыто в браузере',
featuredOn: 'Также представлен на',
similarArtists: 'Похожие исполнители',
cacheOffline: 'Сохранить дискографию офлайн',
offlineCached: 'Дискография кэширована',
offlineDownloading: 'Кэширование… ({{done}}/{{total}} альбомов)',
uploadImage: 'Загрузить изображение исполнителя',
uploadImageError: 'Не удалось загрузить изображение',
},
favorites: {
title: 'Избранное',
empty: 'Вы еще не добавили ничего в избранное.',
artists: 'Исполнители',
albums: 'Альбомы',
songs: 'Песни',
enqueueAll: 'Добавить все в очередь',
playAll: 'Воспроизвести все',
removeSong: 'Удалить из избранного',
stations: 'Радиостанции',
},
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: 'Загрузить новые случайные песни',
playAll: 'Воспроизвести все',
trackTitle: 'Название',
trackArtist: 'Исполнитель',
trackAlbum: 'Альбом',
trackFavorite: 'Избранное',
trackDuration: 'Длительность',
favoriteAdd: 'Добавить в избранное',
favoriteRemove: 'Удалить из избранного',
play: 'Воспроизвести',
trackGenre: 'Жанр',
excludeAudiobooks: 'Исключить аудиокниги и радиопостановки',
excludeAudiobooksDesc: 'Совпадения ключевых слов в жанре, названии, альбоме и исполнителе — например, Аудиокнига, Разговорный жанр, …',
genreBlocked: 'Ключевое слово заблокировано',
genreAddedToBlacklist: 'Добавлено в список фильтрации',
genreAlreadyBlocked: 'Уже заблокировано',
artistBlocked: 'Исполнитель заблокирован',
artistAddedToBlacklist: 'Исполнитель добавлен в список фильтрации',
artistClickHint: 'Нажмите, чтобы заблокировать исполнителя',
blacklistToggle: 'Фильтр ключевых слов',
genreMixTitle: 'Жанровый микс',
genreMixDesc: 'Топ-20 жанров по количеству песен — нажмите для загрузки случайного микса',
genreMixLoadMore: 'Загрузить еще 10',
genreMixNoGenres: 'Жанры на сервере не найдены.',
shuffleGenres: 'Показать другие жанры',
filterPanelTitle: 'Фильтры',
filterPanelDesc: 'Нажмите на жанровый тег или имя исполнителя в списке треков ниже, чтобы заблокировать их в будущих миксах.',
genreClickHint: 'Нажмите на жанровый тег, чтобы добавить его\nкак ключевое слово фильтра.\nСовпадает с жанром, названием, альбомом и исполнителем.',
},
albums: {
title: 'Все альбомы',
sortByName: 'А–Я (Альбом)',
sortByArtist: 'А–Я (Исполнитель)',
sortNewest: 'Сначала новые',
sortRandom: 'Случайные',
yearFrom: 'От',
yearTo: 'До',
yearFilterClear: 'Очистить фильтр по году',
yearFilterLabel: 'Год',
},
artists: {
title: 'Исполнители',
search: 'Поиск…',
all: 'Все',
gridView: 'Сетка',
listView: 'Список',
imagesOn: 'Изображения исполнителей включены — могут увеличить нагрузку на сеть и систему',
imagesOff: 'Изображения исполнителей отключены — показываются только инициалы',
loadMore: 'Загрузить еще',
notFound: 'Исполнители не найдены.',
albumCount_one: '{{count}} альбом',
albumCount_few: '{{count}} альбома',
albumCount_many: '{{count}} альбомов',
albumCount_other: '{{count}} альбомов',
},
login: {
subtitle: 'Ваш настольный проигрыватель Navidrome',
serverName: 'Имя сервера (необязательно)',
serverNamePlaceholder: 'Мой Navidrome',
serverUrl: 'URL сервера',
serverUrlPlaceholder: '192.168.1.100:4533 или music.example.com',
username: 'Имя пользователя',
usernamePlaceholder: 'admin',
password: 'Пароль',
showPassword: 'Показать пароль',
hidePassword: 'Скрыть пароль',
connect: 'Подключиться',
connecting: 'Подключение…',
connected: 'Подключено!',
error: 'Ошибка подключения — проверьте ваши данные.',
urlRequired: 'Введите URL сервера.',
savedServers: 'Сохраненные серверы',
addNew: 'Или добавьте новый сервер',
},
connection: {
connected: 'Подключено',
connectedTo: 'Подключено к {{server}}',
disconnected: 'Отключено',
disconnectedFrom: 'Не удается подключиться к {{server}} — нажмите для проверки настроек',
checking: 'Подключение…',
extern: 'Внешний',
offlineTitle: 'Нет подключения к серверу',
offlineSubtitle: 'Не удается подключиться к {{server}}. Проверьте вашу сеть или сервер.',
offlineModeBanner: 'Офлайн-режим — воспроизведение из локального кэша',
offlineLibraryTitle: 'Офлайн-библиотека',
offlineLibraryEmpty: 'Пока нет кэшированных альбомов. Подключитесь к сети, откройте альбом и нажмите "Сделать доступным офлайн".',
offlineAlbumCount: '{{n}} альбом',
offlineAlbumCount_few: '{{n}} альбома',
offlineAlbumCount_many: '{{n}} альбомов',
offlineAlbumCount_plural: '{{n}} альбомов',
offlineFilterAll: 'Все',
offlineFilterAlbums: 'Альбомы',
offlineFilterPlaylists: 'Плейлисты',
offlineFilterArtists: 'Дискографии',
retry: 'Повторить',
lastfmConnected: 'Last.fm подключен как @{{user}}',
lastfmSessionInvalid: 'Сессия недействительна — нажмите для переподключения',
},
common: {
albums: 'Альбомы',
album: 'Альбом',
loading: 'Загрузка…',
loadingMore: 'Загрузка…',
loadingPlaylists: 'Загрузка плейлистов…',
noAlbums: 'Альбомы не найдены.',
downloading: 'Загрузка…',
downloadZip: 'Скачать (ZIP)',
back: 'Назад',
cancel: 'Отмена',
save: 'Сохранить',
delete: 'Удалить',
use: 'Использовать',
add: 'Добавить',
active: 'Активно',
download: 'Скачать',
chooseDownloadFolder: 'Выберите папку загрузки',
noFolderSelected: 'Папка не выбрана',
rememberDownloadFolder: 'Запомнить эту папку',
filterGenre: 'Фильтр по жанру',
filterSearchGenres: 'Поиск жанров…',
filterNoGenres: 'Нет совпадений по жанрам',
filterClear: 'Очистить',
bulkSelected: 'Выбрано: {{count}}',
bulkAddToPlaylist: 'Добавить в плейлист',
bulkRemoveFromPlaylist: 'Удалить из плейлиста',
bulkClear: 'Очистить выбор',
updaterAvailable: 'Доступно обновление',
updaterVersion: 'v{{version}} готово',
updaterInstall: 'Установить и перезапустить',
updaterDownloading: 'Загрузка…',
updaterInstalling: 'Установка…',
updaterDownload: 'Скачать с GitHub',
updaterExperimentalHint: 'Автообновление все еще в разработке',
},
settings: {
title: 'Настройки',
language: 'Язык',
languageEn: 'Английский',
languageDe: 'Немецкий',
languageFr: 'Французский',
languageNl: 'Нидерландский',
languageZh: 'Китайский',
languageNb: 'Норвежский',
languageRu: 'Русский',
languageRu2: 'Русский 2',
font: 'Шрифт',
theme: 'Тема',
appearance: 'Внешний вид',
servers: 'Серверы',
serverName: 'Имя сервера',
serverUrl: 'URL сервера',
serverUsername: 'Имя пользователя',
serverPassword: 'Пароль',
addServer: 'Добавить сервер',
addServerTitle: 'Добавить новый сервер',
useServer: 'Использовать',
deleteServer: 'Удалить',
noServers: 'Серверы не сохранены.',
serverActive: 'Активный',
confirmDeleteServer: 'Удалить сервер "{{name}}"?',
serverConnecting: 'Подключение…',
serverConnected: 'Подключено!',
serverFailed: 'Ошибка подключения.',
testBtn: 'Проверить подключение',
testingBtn: 'Проверка…',
serverCompatible: 'Совместимо с: Navidrome · Gonic · Airsonic · Subsonic',
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: 'Откроется окно браузера. Авторизуйте Psysonic на Last.fm, затем нажмите кнопку ниже.',
lfmScrobbles: '{{n}} скробблов',
lfmMemberSince: 'Участник с {{year}}',
scrobbleEnabled: 'Скробблинг включен',
scrobbleDesc: 'Отправлять песни на Last.fm после 50% воспроизведения',
behavior: 'Поведение приложения',
cacheTitle: 'Макс. размер хранилища',
cacheDesc: 'Обложки и изображения исполнителей. При заполнении старые записи удаляются автоматически. Офлайн альбомы не удаляются автоматически, но будут удалены при ручной очистке кэша.',
cacheUsedImages: 'Изображения:',
cacheUsedOffline: 'Офлайн треки:',
cacheMaxLabel: 'Макс. размер',
cacheClearBtn: 'Очистить кэш',
cacheClearWarning: 'Это также удалит все офлайн альбомы из библиотеки.',
cacheClearConfirm: 'Очистить все',
cacheClearCancel: 'Отмена',
offlineDirTitle: 'Офлайн библиотека (в приложении)',
offlineDirDesc: 'Место хранения треков, которые вы делаете доступными офлайн в Psysonic.',
offlineDirDefault: 'По умолчанию (данные приложения)',
offlineDirChange: 'Изменить директорию',
offlineDirClear: 'Сбросить по умолчанию',
offlineDirHint: 'Новые загрузки будут использовать это место. Существующие загрузки останутся по своему исходному пути.',
showArtistImages: 'Показать изображения исполнителей',
showArtistImagesDesc: 'Загружать и отображать изображения исполнителей в обзоре исполнителей. Отключено по умолчанию для снижения дискового ввода-вывода сервера и сетевой нагрузки на больших библиотеках.',
showTrayIcon: 'Показать значок в трее',
showTrayIconDesc: 'Отображать значок Psysonic в области уведомлений системы / строке меню.',
minimizeToTray: 'Свернуть в трей',
minimizeToTrayDesc: 'При закрытии окна оставлять Psysonic работающим в системном трее вместо выхода.',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Показывать текущий воспроизводимый трек в вашем профиле Discord. Требуется запущенный Discord.',
nowPlayingEnabled: 'Показывать в "Сейчас играет"',
nowPlayingEnabledDesc: 'Транслировать текущий воспроизводимый трек на сервер в режим просмотра слушателей. Отключите, чтобы прекратить отправку данных воспроизведения.',
downloadsTitle: 'ZIP экспорт и архивирование',
downloadsFolderDesc: 'Папка назначения для альбомов, которые вы скачиваете в виде ZIP файла на компьютер.',
downloadsDefault: 'Папка загрузок по умолчанию',
pickFolder: 'Выбрать',
pickFolderTitle: 'Выберите папку загрузки',
clearFolder: 'Очистить папку загрузки',
logout: 'Выйти',
aboutTitle: 'О Psysonic',
aboutDesc: 'Современный настольный музыкальный проигрыватель для серверов, совместимых с Subsonic (Navidrome, Gonic и другие). Построен на Tauri v2 с нативным аудио движком на Rust — легкий и быстрый, но с богатым функционалом: волновая форма для перемотки, синхронизированные тексты песен, интеграция с Last.fm, 10-полосный эквалайзер, кроссфейд, воспроизведение без пауз, Replay Gain, просмотр жанров и большая библиотека тем.',
aboutFeatures: 'Многосерверность · Скробблинг и лайки Last.fm · Полноэкранный Ambient Stage · Перемотка по волновой форме · Синхронизированные тексты · 10-полосный эквалайзер · Кроссфейд и воспроизведение без пауз · Replay Gain · Жанры · 63 темы · 5 языков',
aboutLicense: 'Лицензия',
aboutLicenseText: 'GNU GPL v3 — бесплатное использование, модификация и распространение на тех же условиях.',
aboutRepo: 'Исходный код на GitHub',
aboutVersion: 'Версия',
aboutBuiltWith: 'Создано с Tauri · React · TypeScript · Rust/rodio',
aboutAiCredit: 'Разработано при поддержке Claude Code от Anthropic',
aboutContributorsLabel: 'Участники',
aboutSpecialThanksLabel: 'Особая благодарность',
changelog: 'Список изменений',
showChangelogOnUpdate: 'Показывать "Что нового" при обновлении',
showChangelogOnUpdateDesc: 'Автоматически показывать, что нового, при первом запуске новой версии.',
randomMixTitle: 'Случайный микс',
randomMixBlacklistTitle: 'Пользовательские ключевые слова фильтра',
randomMixBlacklistDesc: 'Песни исключаются, когда любое ключевое слово совпадает с их жанром, названием, альбомом или исполнителем (активно при включенном флажке выше).',
randomMixBlacklistPlaceholder: 'Добавить ключевое слово…',
randomMixBlacklistAdd: 'Добавить',
randomMixBlacklistEmpty: 'Пользовательские ключевые слова еще не добавлены.',
randomMixHardcodedTitle: 'Встроенные ключевые слова (активны при включенном флажке)',
tabAudio: 'Аудио',
tabStorage: 'Хранилище и загрузки',
tabAppearance: 'Внешний вид',
homeCustomizerTitle: 'Главная страница',
sidebarTitle: 'Боковая панель',
sidebarReset: 'Сбросить по умолчанию',
sidebarDrag: 'Перетащите для изменения порядка',
sidebarFixed: 'Всегда видна',
tabInput: 'Ввод',
tabServer: 'Сервер',
tabSystem: 'Система',
tabGeneral: 'Общие',
backupTitle: 'Резервное копирование и восстановление',
backupExport: 'Экспорт настроек',
backupExportDesc: 'Сохраняет все настройки, профили серверов, конфигурацию Last.fm, тему, эквалайзер и привязки клавиш в файл .psybkp. Пароли хранятся в открытом виде — храните файл в безопасности.',
backupImport: 'Импорт настроек',
backupImportDesc: 'Восстанавливает настройки из файла .psybkp. Приложение перезагрузится после импорта.',
backupImportConfirm: 'Это перезапишет все текущие настройки. Продолжить?',
backupSuccess: 'Резервная копия сохранена',
backupImportSuccess: 'Настройки восстановлены — перезагрузка…',
backupImportError: 'Недействительный или поврежденный файл резервной копии.',
shortcutsReset: 'Сбросить по умолчанию',
shortcutListening: 'Нажмите клавишу…',
shortcutUnbound: '—',
globalShortcutsTitle: 'Глобальные горячие клавиши',
globalShortcutsNote: 'Работают по всей системе, даже когда Psysonic работает в фоне. Требуют Ctrl, Alt или Super в качестве модификатора.',
shortcutClear: 'Очистить',
shortcutPlayPause: 'Воспроизведение / Пауза',
shortcutNext: 'Следующий трек',
shortcutPrev: 'Предыдущий трек',
shortcutVolumeUp: 'Увеличить громкость',
shortcutVolumeDown: 'Уменьшить громкость',
shortcutSeekForward: 'Перемотка вперед на 10 с',
shortcutSeekBackward: 'Перемотка назад на 10 с',
shortcutToggleQueue: 'Переключить очередь',
shortcutFullscreenPlayer: 'Полноэкранный плеер',
shortcutNativeFullscreen: 'Нативный полный экран',
playbackTitle: 'Воспроизведение',
replayGain: 'Replay Gain',
replayGainDesc: 'Нормализация громкости трека с использованием метаданных ReplayGain',
replayGainMode: 'Режим',
replayGainTrack: 'Трек',
replayGainAlbum: 'Альбом',
crossfade: 'Кроссфейд',
crossfadeDesc: 'Плавный переход между треками',
crossfadeSecs: '{{n}} с',
notWithGapless: 'Недоступно при активном воспроизведении без пауз',
notWithCrossfade: 'Недоступно при активном кроссфейде',
gapless: 'Воспроизведение без пауз',
gaplessDesc: 'Предварительная буферизация следующего трека для устранения пауз между песнями',
preloadMode: 'Предзагрузка следующего трека',
preloadModeDesc: 'Когда начинать буферизацию следующего трека в очереди',
preloadBalanced: 'Сбалансированный (за 30 с до конца)',
preloadEarly: 'Ранний (после 5 с воспроизведения)',
preloadCustom: 'Пользовательский',
preloadCustomSeconds: 'Секунд до конца: {{n}}',
infiniteQueue: 'Бесконечная очередь',
infiniteQueueDesc: 'Автоматически добавлять случайные треки при окончании очереди',
experimental: 'Экспериментальный',
},
changelog: {
modalTitle: 'Что нового',
dontShowAgain: 'Больше не показывать',
close: 'Понятно',
},
help: {
title: 'Помощь',
s1: 'Начало работы',
q1: 'Какие серверы совместимы?',
a1: 'Psysonic работает с любым сервером, совместимым с Subsonic: Navidrome, Gonic, Subsonic, Airsonic и другими. Navidrome — рекомендуемый выбор.',
q2: 'Как подключиться к серверу?',
a2: 'Откройте Настройки и нажмите "Добавить сервер". Введите URL сервера (например, 192.168.1.100:4533), имя пользователя и пароль. Psysonic проверяет подключение перед сохранением — ничего не сохраняется, если подключение не удалось.',
q3: 'Могу ли я использовать несколько серверов?',
a3: 'Да. Вы можете добавить сколько угодно серверов в Настройках и переключаться между ними в любое время. Только один сервер активен одновременно.',
s2: 'Воспроизведение',
q4: 'Как воспроизводить музыку?',
a4: 'Дважды щелкните любой трек для воспроизведения. На страницах альбомов и исполнителей используйте "Воспроизвести все" для запуска всего альбома. Вы также можете перетащить треки в панель очереди.',
q5: 'Какие горячие клавиши доступны?',
a5: 'Пробел = Воспроизведение / Пауза · Escape = Закрыть полноэкранный плеер. Медиа-клавиши (Воспроизведение/Пауза, Следующий, Предыдущий) работают на всех платформах. На Linux используйте кнопки панели проигрывателя для медиа-клавиш. Внутриприложенные горячие клавиши и системные глобальные горячие клавиши можно настроить в Настройках → Горячие клавиши / Глобальные горячие клавиши.',
q6: 'Что такое очередь?',
a6: 'Очередь показывает все предстоящие треки. Откройте ее с помощью значка панели в правом верхнем углу заголовка (рядом с индикатором "Сейчас играет"). Вы можете переупорядочивать треки перетаскиванием, перемешивать кнопкой перемешивания и сохранять очередь как плейлист.',
q7: 'Как открыть полноэкранный плеер?',
a7: 'Нажмите на миниатюру обложки в панели проигрывателя внизу или на значок расширения рядом с ней. Нажмите Escape для закрытия.',
q8: 'Как работает повтор?',
a8: 'Нажмите кнопку повтора в панели проигрывателя для цикла: Выкл → Повтор всех → Повтор одного.',
s3: 'Библиотека',
q9: 'Как скачать альбом?',
a9: 'Откройте страницу альбома и нажмите "Скачать (ZIP)". Сервер сначала сжимает альбом в ZIP файл — для больших альбомов или файлов без потерь (FLAC / WAV) это может занять некоторое время перед фактическим началом загрузки. Это нормально: прогресс-бар появляется после завершения упаковки сервером и начала передачи.',
q10: 'Как добавить треки и альбомы в избранное?',
a10: 'Нажмите на значок звезды на любой строке трека или в заголовке альбома. Отмеченные элементы появляются в разделе "Избранное" на боковой панели.',
q11: 'Что такое карусель на главной странице?',
a11: 'Баннер в верхней части главной страницы случайно выбирает альбомы из вашей библиотеки и вращает их каждые 10 секунд. Нажмите на точки для перехода к конкретному альбому или нажмите на баннер для открытия альбома.',
s4: 'Настройки',
q12: 'Как изменить тему?',
a12: 'Настройки → Тема. Выберите из большого количества тем в 8 группах: Темы Psysonic, Медиаплееры, Операционные системы, Игры, Фильмы, Сериалы, Социальные сети и Классика открытого исходного кода (Catppuccin, Nord, Gruvbox).',
q13: 'Как изменить язык?',
a13: 'Настройки → Язык. Поддерживаются английский, немецкий, французский, нидерландский, китайский, норвежский и русский.',
q15: 'Как установить папку загрузки?',
a15: 'Настройки → Поведение приложения → Папка загрузки. Выберите любую папку — загруженные альбомы сохраняются туда как ZIP файлы. Без пользовательской папки используется местоположение загрузок браузера по умолчанию.',
s5: 'Скробблинг',
q16: 'Как работает скробблинг?',
a16: 'Psysonic отправляет скробблы напрямую на Last.fm — настройка Navidrome не требуется. Подключите аккаунт Last.fm в Настройках → Last.fm и включите скробблинг там.',
q17: 'Когда отправляется скроббл?',
a17: 'Скроббл отправляется после прослушивания 50% трека.',
q22: 'Что такое волновая форма в панели проигрывателя?',
a22: 'Панель перемотки с волновой формой заменяет классический ползунок прогресса. Нажмите в любом месте для перехода к этой позиции или перетащите для перемотки. Воспроизведенная часть светится градиентом от синего к лиловому, буферизованный диапазон немного ярче, а невоспроизведенная часть затемнена.',
q24: 'Могу ли я перемешать очередь?',
a24: 'Да. Откройте панель очереди и нажмите значок перемешивания в заголовке очереди. Текущий воспроизводимый трек остается на позиции 1 — все остальные треки случайно переупорядочиваются.',
q25: 'Открываются ли ссылки Last.fm и Wikipedia на страницах исполнителей в браузере?',
a25: 'Да — они открываются в вашем системном браузере по умолчанию. Кнопка кратко показывает метку подтверждения при нажатии.',
s7: 'Случайный микс',
q26: 'Что такое Случайный микс?',
a26: 'Случайный микс создает плейлист из случайных треков из всей вашей библиотеки...',
q27: 'Что такое Фильтр ключевых слов?',
a27: 'Фильтр ключевых слов исключает треки, жанр, название или альбом которых содержат определенные слова. Аудиокниги фильтруются автоматически. Добавьте пользовательские ключевые слова в Настройках → Случайный микс или нажмите любой жанровый тег в списке треков для мгновенного добавления.',
q28: 'Что такое Супер жанровый микс?',
a28: 'Супер жанровый микс группирует вашу библиотеку в широкие категории (Рок, Метал, Электронная, Джаз, Классика и т.д.) и создает сфокусированный микс из этого стиля. Выберите категорию ниже списка треков. Результаты появляются прогрессивно по мере получения каждого поджанра.',
s6: 'Устранение неполадок',
q18: 'Обложки и изображения исполнителей загружаются медленно.',
a18: 'Изображения загружаются с диска вашего сервера при первом посещении и затем кэшируются локально на 30 дней. Если хранилище сервера медленное, первое посещение страницы может занять некоторое время. Последующие посещения будут мгновенными.',
q19: 'Тест подключения не удается.',
a19: 'Проверьте URL включая порт (например, http://192.168.1.100:4533). Убедитесь, что брандмауэр не блокирует подключение. Попробуйте http:// вместо https:// в локальной сети. Также проверьте правильность имени пользователя и пароля.',
q20: 'Нет звука на Linux.',
a20: 'Psysonic доступен как .deb (Ubuntu/Debian), .rpm (Fedora/RHEL) и через AUR на Arch/CachyOS (yay -S psysonic или yay -S psysonic-bin). Нет AppImage. Если звук отсутствует, убедитесь, что PipeWire или PulseAudio запущены.',
q21: 'Приложение показывает черный экран на Linux.',
a21: 'Обычно это проблема GPU/EGL драйвера в WebKitGTK. Запустите с GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1. Пакет AUR и официальные установщики .deb/.rpm устанавливают это автоматически.',
q29: 'Что такое Кроссфейд и Воспроизведение без пауз?',
a29: 'Оба являются экспериментальными аудио функциями в Настройках → Аудио. Воспроизведение без пауз предварительно буферизует следующий трек для устранения тишины между песнями. Кроссфейд затухает текущий трек при одновременном нарастании следующего — настройте длительность (1–10 с) по вкусу.',
q30: 'Показывает ли Psysonic тексты песен?',
a30: 'Да. Нажмите значок микрофона в панели проигрывателя для открытия вкладки "Текст" в панели очереди. Psysonic автоматически загружает тексты из LRCLIB. При наличии синхронизированных текстов активная строка выделяется и прокручивается в реальном времени по мере воспроизведения песни. При наличии только обычного текста он отображается статически.',
q31: 'Могу ли я настроить горячие клавиши?',
a31: 'Да. Настройки → Горячие клавиши позволяют переназначить действия приложения (Воспроизведение/Пауза, Следующий, Предыдущий, Громкость вверх/вниз, Полный экран и другие) на любую клавишу. Настройки → Глобальные горячие клавиши позволяют назначить системные горячие клавиши, которые срабатывают даже когда Psysonic работает в фоне.',
q32: 'Могу ли я изменить шрифт?',
a32: 'Да. Настройки → Шрифт позволяют выбрать из 10 шрифтов, включая IBM Plex Mono, Fira Code, JetBrains Mono, Courier Prime и другие. Выбранный шрифт применяется ко всему интерфейсу.',
s8: 'Офлайн режим',
q34: 'Что такое Офлайн режим?',
a34: 'Офлайн режим (бета) позволяет кэшировать альбомы на ваше устройство для прослушивания без активного подключения к серверу. Кэшированные треки хранятся локально и воспроизводятся напрямую с диска — во время воспроизведения сетевые запросы не выполняются.',
q35: 'Как кэшировать альбом для офлайн использования?',
a35: 'Откройте любой альбом и нажмите значок загрузки в заголовке альбома. Psysonic загружает все треки в фоне. Прогресс показывается на кнопке. После кэширования значок становится зеленым. Вы можете просмотреть и удалить кэшированные альбомы на странице Офлайн библиотеки (боковая панель).',
q36: 'Сколько хранилища может использовать офлайн кэширование?',
a36: 'Вы можете установить максимальный размер кэша в Настройках → Библиотека. При достижении лимита на странице альбома появляется предупреждающий баннер. Вы можете удалять отдельные альбомы из Офлайн библиотеки для освобождения места.',
},
queue: {
title: 'Очередь',
savePlaylist: 'Сохранить плейлист',
updatePlaylist: 'Обновить плейлист',
filterPlaylists: 'Фильтр плейлистов…',
playlistName: 'Название плейлиста',
cancel: 'Отмена',
save: 'Сохранить',
loadPlaylist: 'Загрузить плейлист',
loading: 'Загрузка…',
noPlaylists: 'Плейлисты не найдены.',
load: 'Заменить очередь и воспроизвести',
appendToQueue: 'Добавить в конец очереди',
delete: 'Удалить',
deleteConfirm: 'Удалить плейлист "{{name}}"?',
clear: 'Очистить',
shuffle: 'Перемешать очередь',
gapless: 'Без пауз',
crossfade: 'Кроссфейд',
infiniteQueue: 'Бесконечная очередь',
autoAdded: '— Добавлено автоматически —',
radioAdded: '— Радио —',
hide: 'Скрыть',
close: 'Закрыть',
nextTracks: 'Следующие треки',
emptyQueue: 'Очередь пуста.',
trackSingular: 'трек',
trackPlural: 'треков',
showRemaining: 'Показать оставшееся время',
showTotal: 'Показать общее время',
},
statistics: {
title: 'Статистика',
recentlyPlayed: 'Недавно прослушанные',
mostPlayed: 'Самые прослушиваемые альбомы',
highestRated: 'Альбомы с highest рейтингом',
genreDistribution: 'Распределение по жанрам (Топ-20)',
loadMore: 'Загрузить еще',
statArtists: 'Исполнители',
statAlbums: 'Альбомы',
statSongs: 'Песни',
statGenres: 'Жанры',
statPlaytime: 'Общее время воспроизведения',
genreInsights: 'Обзор по жанрам',
formatDistribution: 'Распределение по форматам',
formatSample: 'Выборка из {{n}} треков',
computing: 'Вычисление…',
genreSongs: '{{count}} песен',
genreAlbums: '{{count}} альбомов',
recentlyAdded: 'Недавно добавленные',
decadeDistribution: 'Альбомы по десятилетиям',
decadeAlbums_one: '{{count}} альбом',
decadeAlbums_few: '{{count}} альбома',
decadeAlbums_many: '{{count}} альбомов',
decadeAlbums_other: '{{count}} альбомов',
decadeUnknown: 'Неизвестно',
lfmTitle: 'Статистика Last.fm',
lfmTopArtists: 'Топ исполнителей',
lfmTopAlbums: 'Топ альбомов',
lfmTopTracks: 'Топ треков',
lfmPlays: '{{count}} воспроизведений',
lfmPeriodOverall: 'Все время',
lfmPeriod7day: '7 дней',
lfmPeriod1month: '1 месяц',
lfmPeriod3month: '3 месяца',
lfmPeriod6month: '6 месяцев',
lfmPeriod12month: '12 месяцев',
lfmNotConnected: 'Подключите Last.fm в Настройках для просмотра статистики.',
lfmRecentTracks: 'Недавние скробблы',
lfmNowPlaying: 'Сейчас играет',
lfmJustNow: 'только что',
lfmMinutesAgo: '{{n}} мин. назад',
lfmHoursAgo: '{{n}} ч. назад',
lfmDaysAgo: '{{n}} дн. назад',
},
player: {
regionLabel: 'Музыкальный проигрыватель',
openFullscreen: 'Открыть полноэкранный плеер',
fullscreen: 'Полноэкранный плеер',
closeFullscreen: 'Закрыть полный экран',
closeTooltip: 'Закрыть (Esc)',
noTitle: 'Без названия',
stop: 'Стоп',
prev: 'Предыдущий трек',
play: 'Воспроизвести',
pause: 'Пауза',
next: 'Следующий трек',
repeat: 'Повтор',
repeatOff: 'Выкл',
repeatAll: 'Все',
repeatOne: 'Один',
progress: 'Прогресс песни',
volume: 'Громкость',
toggleQueue: 'Переключить очередь',
lyrics: 'Текст',
lyricsLoading: 'Загрузка текста…',
lyricsNotFound: 'Текст для этого трека не найден',
},
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: 'Добавить в плейлист',
cacheOffline: 'Кэшировать плейлист офлайн',
offlineCached: 'Плейлист кэширован',
offlineDownloading: 'Кэширование… ({{done}}/{{total}} альбомов)',
publicLabel: 'Публичный',
privateLabel: 'Приватный',
editMeta: 'Редактировать плейлист',
editNamePlaceholder: 'Название плейлиста…',
editCommentPlaceholder: 'Добавьте описание…',
editPublic: 'Публичный плейлист',
editSave: 'Сохранить',
editCancel: 'Отмена',
changeCover: 'Изменить обложку',
changeCoverLabel: 'Изменить фото',
removeCover: 'Удалить фото',
coverUpdated: 'Обложка обновлена',
metaSaved: 'Плейлист обновлен',
},
radio: {
title: 'Интернет-радио',
empty: 'Радиостанции не настроены.',
addStation: 'Добавить станцию',
editStation: 'Редактировать',
deleteStation: 'Удалить станцию',
confirmDelete: 'Нажмите еще раз для подтверждения',
stationName: 'Название станции…',
streamUrl: 'URL потока…',
homepageUrl: 'URL главной страницы (необязательно)',
save: 'Сохранить',
cancel: 'Отмена',
live: 'ПРЯМОЙ ЭФИР',
liveStream: 'Интернет радио',
openHomepage: 'Открыть главную страницу',
changeCoverLabel: 'Изменить обложку',
removeCover: 'Удалить обложку',
browseDirectory: 'Поиск в каталоге',
directoryPlaceholder: 'Поиск станций…',
noResults: 'Станции не найдены.',
stationAdded: 'Станция добавлена',
filterAll: 'Все',
filterFavorites: 'Избранное',
sortManual: 'Вручную',
sortAZ: 'А → Я',
sortZA: 'Я → А',
sortNewest: 'Новые',
favorite: 'Добавить в избранное',
unfavorite: 'Удалить из избранного',
noFavorites: 'Избранных станций нет.',
}
}
+5 -1
View File
@@ -341,7 +341,6 @@ export const zhTranslation = {
languageZh: '中文',
languageNb: '挪威',
languageRu: '俄语',
languageRu2: '俄语 2',
font: '字体',
theme: '主题',
appearance: '外观',
@@ -422,6 +421,8 @@ export const zhTranslation = {
discordRichPresenceDesc: '在 Discord 个人资料上显示当前播放的曲目。需要 Discord 处于运行状态。',
nowPlayingEnabled: '在实时窗口中显示',
nowPlayingEnabledDesc: '将当前播放的曲目广播到服务器的实时听众视图。禁用以停止发送播放数据。',
lyricsServerFirst: '优先使用服务器歌词',
lyricsServerFirstDesc: '先查询服务器提供的歌词(内嵌标签、sidecar 文件),再查询 LRCLIB。禁用则优先使用 LRCLIB。',
downloadsTitle: 'ZIP 导出与归档',
downloadsFolderDesc: '将专辑以 ZIP 文件下载到电脑时的目标文件夹。',
downloadsDefault: '默认下载文件夹',
@@ -685,8 +686,11 @@ export const zhTranslation = {
volume: '音量',
toggleQueue: '切换队列',
lyrics: '歌词',
fsLyricsToggle: '全屏歌词',
lyricsLoading: '正在加载歌词…',
lyricsNotFound: '未找到此曲目的歌词',
lyricsSourceServer: '来源:服务器',
lyricsSourceLrclib: '来源:LRCLIB',
},
songInfo: {
title: '歌曲信息',