diff --git a/src/locales/ru.ts b/src/locales/ru.ts index 29115e97..ba30aee9 100644 --- a/src/locales/ru.ts +++ b/src/locales/ru.ts @@ -1,8 +1,8 @@ /** Russian UI strings — natural phrasing for a music desktop app */ export const ruTranslation = { sidebar: { - library: 'Медиатека', - mainstage: 'Для вас', + library: 'Библиотека', + mainstage: 'Главная', newReleases: 'Новинки', allAlbums: 'Все альбомы', randomAlbums: 'Случайные альбомы', @@ -26,8 +26,8 @@ export const ruTranslation = { radio: 'Онлайн-радио', }, home: { - hero: 'Подборка', - starred: 'Личное избранное', + hero: 'Рекомендации', + starred: 'Избранное', recent: 'Недавно добавлено', mostPlayed: 'Чаще всего', recentlyPlayed: 'Недавно проиграно', @@ -38,14 +38,14 @@ export const ruTranslation = { discoverArtistsMore: 'Все исполнители', }, hero: { - eyebrow: 'Альбом дня', + eyebrow: 'Рекомендуемый альбом', playAlbum: 'Воспроизвести альбом', enqueue: 'В очередь', enqueueTooltip: 'Добавить весь альбом в очередь', }, search: { placeholder: 'Исполнитель, альбом или трек…', - noResults: 'Ничего не найдено по запросу «{{query}}»', + noResults: 'Нет результатов для «{{query}}»', artists: 'Исполнители', albums: 'Альбомы', songs: 'Треки', @@ -93,11 +93,11 @@ export const ruTranslation = { addToQueue: 'В конец очереди', enqueueAlbum: 'Альбом в очередь', startRadio: 'Радио по похожим', - lfmLove: 'Любимое на Last.fm', - lfmUnlove: 'Убрать с Last.fm', + lfmLove: 'Нравится на Last.fm', + lfmUnlove: 'Убрать лайк с Last.fm', favorite: 'В избранное', - favoriteArtist: 'Исполнитель в избранное', - favoriteAlbum: 'Альбом в избранное', + favoriteArtist: 'Добавить исполнителя в избранное', + favoriteAlbum: 'Добавить альбом в избранное', unfavorite: 'Убрать из избранного', unfavoriteArtist: 'Убрать исполнителя из избранного', unfavoriteAlbum: 'Убрать альбом из избранного', @@ -121,7 +121,7 @@ export const ruTranslation = { offlineDownloading: 'Кэширование… ({{n}} из {{total}})', removeOffline: 'Удалить офлайн-копию', offlineStorageFull: - 'Место для офлайн закончилось (лимит {{mb}} МБ). Освободите место в офлайн-библиотеке или увеличьте лимит в настройках.', + 'Место для офлайн-кэша закончилось (лимит {{mb}} МБ). Освободите место или увеличьте лимит в настройках.', offlineStorageGoToLibrary: 'Офлайн-библиотека', offlineStorageGoToSettings: 'Настройки', favoriteAdd: 'В избранное', @@ -129,7 +129,7 @@ export const ruTranslation = { favorite: 'Избранное', noBio: 'Биография недоступна.', moreByArtist: 'Ещё от {{artist}}', - tracksCount: 'Композиций: {{n}}', + tracksCount: '{{n}} треков', goToArtist: 'Перейти к {{artist}}', moreLabelAlbums: 'Другие альбомы на {{label}}', trackTitle: 'Название', @@ -140,7 +140,7 @@ export const ruTranslation = { trackRating: 'Оценка', trackDuration: 'Длительность', trackTotal: 'Итого', - columns: 'Колонки', + columns: 'Столбцы', notFound: 'Альбом не найден.', bioModal: 'Биография исполнителя', bioClose: 'Закрыть', @@ -174,18 +174,18 @@ export const ruTranslation = { featuredOn: 'Также участвует в', similarArtists: 'Похожие исполнители', cacheOffline: 'Сохранить дискографию офлайн', - offlineCached: 'Дискография сохранена', + offlineCached: 'Дискография сохранена в кэш', offlineDownloading: 'Кэширование… ({{done}} из {{total}} альбомов)', uploadImage: 'Загрузить фото исполнителя', uploadImageError: 'Не удалось загрузить изображение', }, favorites: { title: 'Избранное', - empty: 'Пока ничего не отмечено звёздочкой.', + empty: 'Здесь пока пусто... \nПора добавить что-нибудь в избранное.', artists: 'Исполнители', albums: 'Альбомы', songs: 'Треки', - enqueueAll: 'Всё в очередь', + enqueueAll: 'Добавить всё в очередь', playAll: 'Воспроизвести всё', removeSong: 'Убрать из избранного', stations: 'Радиостанции', @@ -204,7 +204,7 @@ export const ruTranslation = { loading: 'Загрузка жанров…', empty: 'Жанры не найдены.', albumsLoading: 'Загрузка альбомов…', - albumsEmpty: 'В этом жанре альбомов нет.', + albumsEmpty: 'Альбомы в этом жанре не найдены.', loadMore: 'Ещё', back: 'Назад', }, @@ -220,7 +220,7 @@ export const ruTranslation = { trackDuration: 'Длительность', favoriteAdd: 'В избранное', favoriteRemove: 'Убрать из избранного', - play: 'Играть', + play: 'Воспроизвести', trackGenre: 'Жанр', excludeAudiobooks: 'Исключать аудиокниги и радиоспектакли', excludeAudiobooksDesc: @@ -275,18 +275,18 @@ export const ruTranslation = { serverNamePlaceholder: 'Мой Navidrome', serverUrl: 'Адрес сервера', serverUrlPlaceholder: '192.168.1.100:4533 или music.example.com', - username: 'Логин', + username: 'Имя пользователя', usernamePlaceholder: 'admin', password: 'Пароль', showPassword: 'Показать пароль', hidePassword: 'Скрыть пароль', connect: 'Подключиться', connecting: 'Подключение…', - connected: 'Готово!', + connected: 'Подключено!', error: 'Не удалось подключиться — проверьте данные.', urlRequired: 'Укажите адрес сервера.', savedServers: 'Сохранённые серверы', - addNew: 'Или добавить новый сервер', + addNew: 'Или добавьте новый сервер', }, connection: { connected: 'Подключено', @@ -297,7 +297,7 @@ export const ruTranslation = { extern: 'Внешний', offlineTitle: 'Нет связи с сервером', offlineSubtitle: 'Сервер {{server}} недоступен. Проверьте сеть и адрес.', - offlineModeBanner: 'Офлайн — воспроизведение из локального кэша', + offlineModeBanner: 'Воспроизведение из локального кэша', offlineLibraryTitle: 'Офлайн-библиотека', offlineLibraryEmpty: 'Пока ничего не сохранено. Подключитесь к сети, откройте альбом и нажмите «Сохранить офлайн».', @@ -342,7 +342,7 @@ export const ruTranslation = { bulkRemoveFromPlaylist: 'Убрать из плейлиста', bulkClear: 'Снять выделение', updaterAvailable: 'Доступно обновление', - updaterVersion: 'Версия {{version}} готова', + updaterVersion: 'Версия {{version}} готова к установке', updaterInstall: 'Установить и перезапустить', updaterDownloading: 'Скачивание…', updaterInstalling: 'Установка…', @@ -359,7 +359,6 @@ export const ruTranslation = { languageZh: 'Китайский', languageNb: 'Норвежский', languageRu: 'Русский', - languageRu2: 'Русский 2', font: 'Шрифт', theme: 'Тема', appearance: 'Оформление', @@ -380,14 +379,14 @@ export const ruTranslation = { serverFailed: 'Ошибка подключения.', testBtn: 'Проверить', testingBtn: 'Проверка…', - serverCompatible: 'Совместимость: Navidrome · Gonic · Airsonic · Subsonic', + serverCompatible: 'Совместимо с: Navidrome · Gonic · Airsonic · Subsonic', connected: 'Подключено', failed: 'Ошибка', eqTitle: 'Эквалайзер', eqEnabled: 'Включить эквалайзер', eqPreset: 'Пресет', eqPresetCustom: 'Свой', - eqPresetBuiltin: 'Встроенные', + eqPresetBuiltin: 'Встроенные пресеты', eqPresetCustomGroup: 'Мои пресеты', eqSavePreset: 'Сохранить как пресет', eqPresetName: 'Название пресета…', @@ -409,21 +408,21 @@ export const ruTranslation = { lfmConnected: 'Аккаунт', lfmDisconnect: 'Отключить', lfmConnectDesc: - 'Привяжите Last.fm для скробблинга и статуса «Сейчас слушаю» прямо из Psysonic — настраивать Navidrome не нужно.', + 'Подключите аккаунт Last.fm для включения скробблинга и обновления "Сейчас играет" напрямую из Psysonic — без необходимости настройки Navidrome.', lfmOpenBrowser: 'Откроется браузер. Разрешите доступ на Last.fm, затем нажмите кнопку ниже.', - lfmScrobbles: 'Скробблов: {{n}}', - lfmMemberSince: 'С {{year}} года', + lfmScrobbles: '{{n}} скробблов', + lfmMemberSince: 'Участник с {{year}} года', scrobbleEnabled: 'Скробблинг включён', - scrobbleDesc: 'Отправлять прослушивания на Last.fm после 50% трека', + scrobbleDesc: 'Отправлять прослушивания на Last.fm после 50% воспроизведения', behavior: 'Поведение', cacheTitle: 'Макс. размер кэша', cacheDesc: - 'Обложки и фото исполнителей. При переполнении старые записи удаляются. Офлайн-альбомы не трогаются автоматически, но сотрутся при полной очистке кэша.', + 'Обложки и фото исполнителей. При переполнении старые записи удаляются. Сохраненные альбомы не трогаются автоматически, но сотрутся при полной очистке кэша.', cacheUsedImages: 'Изображения:', - cacheUsedOffline: 'Офлайн-треки:', + cacheUsedOffline: 'Сохраненные треки:', cacheMaxLabel: 'Лимит', cacheClearBtn: 'Очистить кэш', - cacheClearWarning: 'Будут удалены и все офлайн-альбомы.', + cacheClearWarning: 'Будут удалены и все сохраненные альбомы.', cacheClearConfirm: 'Очистить всё', cacheClearCancel: 'Отмена', offlineDirTitle: 'Офлайн-библиотека (в приложении)', @@ -439,13 +438,15 @@ export const ruTranslation = { showTrayIconDesc: 'Показывать Psysonic в области уведомлений / строке меню.', minimizeToTray: 'Сворачивать в трей', minimizeToTrayDesc: 'При закрытии окна не выходить из приложения, а оставаться в трее.', - discordRichPresence: 'Статус в Discord', + discordRichPresence: 'Статус в Discord (Rich Presence)', discordRichPresenceDesc: - 'Показывать текущий трек в профиле и статусе Discord. Нужен запущенный клиент Discord.', + 'Показывать текущий трек в профиле и статусе Discord (Rich Presence). Нужен запущенный клиент Discord.', nowPlayingEnabled: 'Показывать в «Сейчас играет»', nowPlayingEnabledDesc: 'Отправлять на сервер, что вы сейчас слушаете. Отключите, чтобы не делиться этим.', - downloadsTitle: 'Экспорт ZIP и архивы', + lyricsServerFirst: 'Приоритет серверного текста', + lyricsServerFirstDesc: 'Сначала запрашивать текст с сервера (теги, sidecar-файлы), затем LRCLIB. Отключите, чтобы использовать LRCLIB первым.', + downloadsTitle: 'Экспорт в ZIP и архивирование', downloadsFolderDesc: 'Куда сохранять альбомы в виде ZIP на диск.', downloadsDefault: 'Папка «Загрузки» по умолчанию', pickFolder: 'Выбрать', @@ -454,9 +455,9 @@ export const ruTranslation = { logout: 'Выйти', aboutTitle: 'О Psysonic', aboutDesc: - 'Современный десктопный плеер для серверов с протоколом Subsonic (Navidrome, Gonic и др.). На Tauri v2 и нативном аудиодвижке на Rust — лёгкий и быстрый: волновая шкала, синхронные тексты, Last.fm, 10-полосный EQ, кроссфейд, воспроизведение без пауз, Replay Gain, жанры и много тем оформления.', + 'Современный десктопный плеер для серверов с протоколом Subsonic (Navidrome, Gonic и др.). Построен на Tauri v2 и нативном аудиодвижке на Rust — лёгкий и быстрый: волновая шкала, синхронные тексты, Last.fm, 10-полосный EQ, кроссфейд, воспроизведение без пауз, Replay Gain (выравнивание громкости), жанры и много тем оформления.', aboutFeatures: - 'Несколько серверов · Last.fm · полноэкранный режим · волна · тексты · 10 полос EQ · кроссфейд и воспроизведение без пауз · Replay Gain · жанры · десятки тем · несколько языков', + 'Несколько серверов · Last.fm · полноэкранный режим · волна · тексты · 10 полос EQ · кроссфейд и воспроизведение без пауз · Replay Gain (выравнивание громкости) · жанры · десятки тем · несколько языков', aboutLicense: 'Лицензия', aboutLicenseText: 'GNU GPL v3 — свободное использование и изменение на тех же условиях.', aboutRepo: 'Исходный код на GitHub', @@ -533,7 +534,7 @@ export const ruTranslation = { preloadBalanced: 'Умеренно (за 30 с до конца)', preloadEarly: 'Рано (через 5 с после старта)', preloadCustom: 'Свой интервал', - preloadCustomSeconds: 'Секунд до конца: {{n}}', + preloadCustomSeconds: '{{n}} секунд до конца', infiniteQueue: 'Бесконечная очередь', infiniteQueueDesc: 'Подмешивать случайные треки, когда очередь закончится', experimental: 'Экспериментально', @@ -589,7 +590,7 @@ export const ruTranslation = { s5: 'Скробблинг', q16: 'Как устроен скробблинг?', a16: - 'Psysonic шлёт прослушивания напрямую на Last.fm — в Navidrome ничего настраивать не нужно. Подключите аккаунт в настройках.', + 'Psysonic отправляет прослушивания напрямую на Last.fm — в Navidrome ничего настраивать не нужно. Подключите аккаунт в настройках.', q17: 'Когда уходит скроббл?', a17: 'После прослушивания примерно половины трека.', q22: 'Что за волна внизу?', @@ -612,13 +613,13 @@ export const ruTranslation = { s6: 'Если что-то не так', q18: 'Медленно грузятся обложки.', a18: - 'Первый раз картинки тянутся с сервера и кэшируются на ~30 дней. Медленный диск на сервере даёт задержку только при первом заходе.', + 'Первый раз картинки загружаются с сервера и кэшируются на ~30 дней. Медленный диск на сервере даёт задержку только при первом заходе.', q19: 'Тест соединения не проходит.', a19: - 'Проверьте адрес с портом (http://192.168.1.100:4533), файрвол, для локалки иногда нужен http вместо https. Логин и пароль должны совпадать с сервером.', + 'Проверьте адрес с портом (http://192.168.1.100:4533), файрвол, для локальной сети иногда нужен http вместо https. Логин и пароль должны совпадать с сервером.', q20: 'Нет звука в Linux.', a20: - 'Есть пакеты .deb, .rpm и AUR. Убедитесь, что запущены PipeWire или PulseAudio.', + 'Убедитесь, что запущены PipeWire или PulseAudio.', q21: 'Чёрный экран в Linux.', a21: 'Часто драйвер GPU / WebKitGTK. Запуск с GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1. В официальных пакетах это часто уже задано.', @@ -639,7 +640,7 @@ export const ruTranslation = { q35: 'Как сохранить альбом офлайн?', a35: 'Страница альбома → иконка загрузки в шапке. Прогресс на кнопке, после загрузки — индикатор готовности. Список — в офлайн-библиотеке.', - q36: 'Сколько места занимает офлайн?', + q36: 'Сколько места занимает кэш?', a36: 'Лимит задаётся в настройках. При переполнении на странице альбома появится предупреждение; удалить можно из офлайн-библиотеки.', }, @@ -747,15 +748,18 @@ export const ruTranslation = { volume: 'Громкость', toggleQueue: 'Очередь', lyrics: 'Текст', + fsLyricsToggle: 'Текст в полноэкранном режиме', lyricsLoading: 'Загрузка текста…', lyricsNotFound: 'Текст не найден', + lyricsSourceServer: 'Источник: сервер', + lyricsSourceLrclib: 'Источник: LRCLIB', }, songInfo: { title: 'О треке', songTitle: 'Название', artist: 'Исполнитель', album: 'Альбом', - albumArtist: 'Альбомный исполнитель', + albumArtist: 'Исполнитель альбома', year: 'Год', genre: 'Жанр', duration: 'Длительность', @@ -799,7 +803,7 @@ export const ruTranslation = { noSuggestions: 'Пока нет рекомендаций.', titleBadge: 'Плейлист', refreshSuggestions: 'Обновить подборку', - addSong: 'В плейлист', + addSong: 'Добавить в плейлист', cacheOffline: 'Сохранить плейлист офлайн', offlineCached: 'Плейлист сохранён', offlineDownloading: 'Кэширование… ({{done}} из {{total}} альбомов)',