navidrome/resources/i18n/ru.json
Deluan Quintão ab8a58157a
Some checks are pending
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Get version info (push) Waiting to run
Pipeline: Test, Lint, Build / Lint Go code (push) Waiting to run
Pipeline: Test, Lint, Build / Test Go code (push) Waiting to run
Pipeline: Test, Lint, Build / Test JS code (push) Waiting to run
Pipeline: Test, Lint, Build / Lint i18n files (push) Waiting to run
Pipeline: Test, Lint, Build / Check Docker configuration (push) Waiting to run
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-1 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-2 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-3 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-4 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-5 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-6 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-7 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-8 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-9 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-10 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Push to GHCR (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build Windows installers (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Package/Release (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Blocked by required conditions
POEditor export / push-translations (push) Has been skipped
feat: add artist image uploads and image-folder artwork source (#5198)
* feat: add shared ImageUploadService for entity image management

* feat: add UploadedImage field and methods to Artist model

* feat: add uploaded_image column to artist table

* feat: add ArtistImageFolder config option

* refactor: wire ImageUploadService and delegate playlist file ops to it

Wire ImageUploadService into the DI container and refactor the playlist
service to delegate image file operations (SetImage/RemoveImage) to the
shared ImageUploadService, removing duplicated file I/O logic. A local
ImageUploadService interface is defined in core/playlists to avoid an
import cycle between core and core/playlists.

* feat: artist artwork reader checks uploaded image first

* feat: add image-folder priority source for artist artwork

* feat: cache key invalidation for image-folder and uploaded images

* refactor: extract shared image upload HTTP helpers

* feat: add artist image upload/delete API endpoints

* refactor: playlist handlers use shared image upload helpers

* feat: add shared ImageUploadOverlay component

* feat: add i18n keys for artist image upload

* feat: add image upload overlay to artist detail pages

* refactor: playlist details uses shared ImageUploadOverlay component

* fix: add gosec nolint directive for ParseMultipartForm

* refactor: deduplicate image upload code and optimize dir scanning

- Remove dead ImageFilename methods from Artist and Playlist models
  (production code uses core.imageFilename exclusively)
- Extract shared uploadedImagePath helper in model/image.go
- Extract findImageInArtistFolder to deduplicate dir-scanning logic
  between fromArtistImageFolder and getArtistImageFolderModTime
- Fix fileInputRef in useCallback dependency array

* fix: include artist UpdatedAt in artwork cache key

Without this, uploading or deleting an artist image would not
invalidate the cached artwork because the cache key was only based
on album folder timestamps, not the artist's own UpdatedAt field.

* feat: add Portuguese translations for artist image upload

* refactor: use shared i18n keys for cover art upload messages

Move cover art upload/remove translations from per-entity sections
(artist, playlist) to a shared top-level "message" section, avoiding
duplication across entity types and translation files.

* refactor: move cover art i18n keys to shared message section for all languages

* refactor: simplify image upload code and eliminate redundancies

Extracted duplicate image loading/lightbox state logic from
DesktopArtistDetails and MobileArtistDetails into a shared
useArtistImageState hook. Moved entity type constants to the consts
package and replaced raw string literals throughout model, core, and
nativeapi packages. Exported model.UploadedImagePath and reused it in
core/image_upload.go to consolidate path construction. Cached the
ArtistImageFolder lookup result in artistReader to eliminate a redundant
os.ReadDir call on every artwork request.

Signed-off-by: Deluan <deluan@navidrome.org>

* style: fix prettier formatting in ImageUploadOverlay

* fix: address code review feedback on image upload error handling

- RemoveImage now returns errors instead of swallowing them
- Artist handlers distinguish not-found from other DB errors
- Defer multipart temp file cleanup after parsing

* fix: enforce hard request size limit with MaxBytesReader for image uploads

Signed-off-by: Deluan <deluan@navidrome.org>

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2026-03-15 22:19:55 -04:00

715 lines
37 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"languageName": "Pусский",
"resources": {
"song": {
"name": "Трек |||| Треки |||| Треков",
"fields": {
"albumArtist": "Исполнитель альбома",
"duration": "Длительность",
"trackNumber": "#",
"playCount": "Проигрывания",
"title": "Название трека",
"artist": "Исполнитель",
"album": "Альбом",
"path": "Путь",
"genre": "Жанр",
"compilation": "Сборник",
"year": "Год",
"size": "Размер",
"updatedAt": "Обновлен",
"bitRate": "Битрейт",
"discSubtitle": "Название диска",
"starred": "Избранные",
"comment": "Комментарий",
"rating": "Рейтинг",
"quality": "Качество",
"bpm": "BPM",
"playDate": "Последнее воспроизведение",
"channels": "Каналы",
"createdAt": "Дата добавления",
"grouping": "Группирование",
"mood": "Настроение",
"participants": "Дополнительные участники",
"tags": "Дополнительные теги",
"mappedTags": "Сопоставленные теги",
"rawTags": "Исходные теги",
"bitDepth": "Битовая глубина (Bit)",
"sampleRate": "Частота дискретизации (Hz)",
"missing": "Поле отсутствует",
"libraryName": "Библиотека",
"composer": "Композитор",
"disc": ""
},
"actions": {
"addToQueue": "В очередь",
"playNow": "Играть",
"addToPlaylist": "Добавить в плейлист",
"shuffleAll": "Перемешать",
"download": "Скачать",
"playNext": "Следующий",
"info": "Информация",
"showInPlaylist": "Показать в плейлисте",
"instantMix": "Быстрый микс"
}
},
"album": {
"name": "Альбом |||| Альбомы",
"fields": {
"albumArtist": "Исполнитель альбома",
"artist": "Исполнитель",
"duration": "Длительность",
"songCount": "Треков",
"playCount": "Проигрывания",
"name": "Название альбома",
"genre": "Жанр",
"compilation": "Сборник",
"year": "Год",
"updatedAt": "Обновлен",
"comment": "Комментарий",
"rating": "Рейтинг",
"createdAt": "Дата добавления",
"size": "Размер",
"originalDate": "Оригинал",
"releaseDate": "Релиз",
"releases": "Релиз |||| Релиза |||| Релизов",
"released": "Релиз",
"recordLabel": "Лейбл",
"catalogNum": "Номер каталога",
"releaseType": "Тип",
"grouping": "Группирование",
"media": "Медиа",
"mood": "Настроение",
"date": "Дата записи",
"missing": "Поле отсутствует",
"libraryName": "Библиотека"
},
"actions": {
"playAll": "Играть",
"playNext": "Следующий",
"addToQueue": "В очередь",
"shuffle": "Перемешать",
"addToPlaylist": "Добавить в плейлист",
"download": "Скачать",
"info": "Информация",
"share": "Поделиться"
},
"lists": {
"all": "Все",
"random": "Случайные",
"recentlyAdded": "Новые",
"recentlyPlayed": "Проигранные",
"mostPlayed": "Популярные",
"starred": "Избранные",
"topRated": "Лучшие"
}
},
"artist": {
"name": "Исполнитель |||| Исполнители",
"fields": {
"name": "Название исполнителя",
"albumCount": "Количество альбомов",
"songCount": "Количество треков",
"playCount": "Проигрывания",
"rating": "Рейтинг",
"genre": "Жанр",
"size": "Размер",
"role": "Роль",
"missing": "Поле отсутствует"
},
"roles": {
"albumartist": "Исполнитель альбома |||| Исполнители альбома",
"artist": "Исполнитель |||| Исполнители",
"composer": "Композитор |||| Композиторы",
"conductor": "Дирижёр |||| Дирижёры",
"lyricist": "Автор текста |||| Авторы текста",
"arranger": "Аранжировщик |||| Аранжировщики",
"producer": "Продюсер |||| Продюсеры",
"director": "Режиссёр |||| Режиссёры",
"engineer": "Инженер |||| Инженеры",
"mixer": "Звукоинженер |||| Звукоинженеры",
"remixer": "Ремиксер |||| Ремиксеры",
"djmixer": "DJ-миксер |||| DJ-миксеры",
"performer": "Исполнитель |||| Исполнители",
"maincredit": "Исполнитель альбома или Исполнитель |||| Исполнители альбома или Исполнители"
},
"actions": {
"shuffle": "Смешать",
"radio": "Радио",
"topSongs": "Топовые треки"
}
},
"user": {
"name": "Пользователь |||| Пользователи",
"fields": {
"userName": "Имя пользователя",
"isAdmin": "Администратор",
"lastLoginAt": "Последний вход",
"updatedAt": "Обновлено",
"name": "Имя",
"password": "Пароль",
"createdAt": "Аккаунт создан",
"changePassword": "Сменить пароль?",
"currentPassword": "Текущий пароль",
"newPassword": "Новый пароль",
"token": "Токен",
"lastAccessAt": "Последний доступ",
"libraries": "Библиотеки"
},
"helperTexts": {
"name": "Изменение вступит в силу после следующего входа в систему",
"libraries": "Выберите конкретные библиотеки для этого пользователя или оставьте поле пустым, чтобы использовать библиотеки по умолчанию"
},
"notifications": {
"created": "Пользователь создан",
"updated": "Пользователь обновлен",
"deleted": "Пользователь удален"
},
"message": {
"listenBrainzToken": "Введите свой токен пользователя ListenBrainz.",
"clickHereForToken": "Нажмите здесь, чтобы получить токен",
"selectAllLibraries": "Выбрать все библиотеки",
"adminAutoLibraries": "Пользователи-администраторы автоматически получают доступ ко всем библиотекам"
},
"validation": {
"librariesRequired": "Для пользователей, не являющихся администраторами, должна быть выбрана хотя бы одна библиотека"
}
},
"player": {
"name": "Плеер |||| Плееры",
"fields": {
"name": "Имя",
"transcodingId": "Транскодирование",
"maxBitRate": "Макс. битрейт",
"client": "Клиент",
"userName": "Пользователь",
"lastSeen": "Был на сайте",
"reportRealPath": "Показать реальный путь",
"scrobbleEnabled": "Отправлять скробблы во внешние службы"
}
},
"transcoding": {
"name": "Транскодирование |||| Транскодирование",
"fields": {
"name": "Название",
"targetFormat": "Целевой формат",
"defaultBitRate": "Битрейт по умолчанию",
"command": "Команда"
}
},
"playlist": {
"name": "Плейлист |||| Плейлисты",
"fields": {
"name": "Название трека",
"duration": "Длительность",
"ownerName": "Владелец",
"public": "Публичный",
"updatedAt": "Обновлен",
"createdAt": "Создан",
"songCount": "Треков",
"comment": "Комментарий",
"sync": "Автоимпорт",
"path": "Импортировать из"
},
"actions": {
"selectPlaylist": "Выберите плейлист:",
"addNewPlaylist": "Создать \"%{name}\"",
"export": "Экспорт",
"makePublic": "Опубликовать",
"makePrivate": "Сделать личным",
"saveQueue": "Сохранить очередь в плейлист",
"searchOrCreate": "Поиск плейлистов или введите текст для создания новых...",
"pressEnterToCreate": "Нажмите Enter, чтобы создать новый список воспроизведения",
"removeFromSelection": "Удалить из списка выделенных"
},
"message": {
"duplicate_song": "Повторяющиеся треки",
"song_exist": "Некоторые треки уже есть в плейлисте. Вы хотите добавить их или пропустить?",
"noPlaylistsFound": "Плейлисты не найдены",
"noPlaylists": "Нет доступных плейлистов"
}
},
"radio": {
"name": "Радио |||| Радио",
"fields": {
"name": "Имя",
"streamUrl": "Ссылка на поток",
"homePageUrl": "Домашняя страница",
"updatedAt": "Обновлено",
"createdAt": "Создано"
},
"actions": {
"playNow": "Играть сейчас"
}
},
"share": {
"name": "Общий доступ |||| Общий доступ",
"fields": {
"username": "Поделился",
"url": "Ссылка",
"description": "Описание",
"contents": "Содержание",
"expiresAt": "Ссылка истекает",
"lastVisitedAt": "Последнее посещение",
"visitCount": "Количество посещений",
"format": "Формат",
"maxBitRate": "Макс. битрейт",
"updatedAt": "Обновлено в",
"createdAt": "Создано",
"downloadable": "Разрешить загрузку?"
}
},
"missing": {
"name": "Файл отсутствует |||| Файлы отсутствуют",
"fields": {
"path": "Место расположения",
"size": "Размер",
"updatedAt": "Исчез",
"libraryName": "Библиотека"
},
"actions": {
"remove": "Удалить",
"remove_all": "Убрать все"
},
"notifications": {
"removed": "Отсутствующие файлы удалены"
},
"empty": "Нет отсутствующих файлов"
},
"library": {
"name": "Библиотека |||| Библиотеки",
"fields": {
"name": "Имя",
"path": "Путь",
"remotePath": "Удаленный путь",
"lastScanAt": "Последнее сканирование",
"songCount": "Треки",
"albumCount": "Альбомы",
"artistCount": "Исполнители",
"totalSongs": "Треки",
"totalAlbums": "Альбомы",
"totalArtists": "Исполнители",
"totalFolders": "Папки",
"totalFiles": "Файлов",
"totalMissingFiles": "Пропавших файлов",
"totalSize": "Общий размер",
"totalDuration": "Длительность",
"defaultNewUsers": "По умолчанию для новых пользователей",
"createdAt": "Создано",
"updatedAt": "Обновлено"
},
"sections": {
"basic": "Основная информация",
"statistics": "Статистика"
},
"actions": {
"scan": "Сканировать библиотеку",
"manageUsers": "Управление доступом пользователей",
"viewDetails": "Просмотреть подробности",
"quickScan": "Быстрое сканирование",
"fullScan": "Полное сканирование"
},
"notifications": {
"created": "Библиотека успешно создана",
"updated": "Библиотека успешно обновлена",
"deleted": "Библиотека успешно удалена",
"scanStarted": "Сканирование библиотеки начато",
"scanCompleted": "Сканирование библиотеки закончено",
"quickScanStarted": "Быстрое сканирование началось",
"fullScanStarted": "Началось полное сканирование",
"scanError": "Ошибка при запуске сканирования. Проверьте логи"
},
"validation": {
"nameRequired": "Имя библиотеки обязательно",
"pathRequired": "Путь к библиотеке обязателен",
"pathNotDirectory": "Путь к библиотеке должен быть директорией",
"pathNotFound": "Путь к библиотеке не найден",
"pathNotAccessible": "Путь к библиотеке недоступен",
"pathInvalid": "Неверный путь к библиотеке"
},
"messages": {
"deleteConfirm": "Вы уверены, что хотите удалить эту библиотеку? Это приведет к удалению всех связанных с ней данных и доступа пользователей.",
"scanInProgress": "Сканирование продолжается...",
"noLibrariesAssigned": "Нет библиотек, назначенных этому пользователю"
}
},
"plugin": {
"name": "Плагин |||| Плагины",
"fields": {
"id": "ID",
"name": "Имя",
"description": "Описание",
"version": "Версия",
"author": "Автор",
"website": "Вебсайт",
"permissions": "Разрешения",
"enabled": "Включено",
"status": "Статус",
"path": "Путь",
"lastError": "Ошибка",
"hasError": "Ошибка",
"updatedAt": "Обновлено",
"createdAt": "Установленный",
"configKey": "Ключ",
"configValue": "Значение",
"allUsers": "Разрешить всем пользователям",
"selectedUsers": "Выбранные пользователи",
"allLibraries": "Разрешить доступ ко всем библиотекам",
"selectedLibraries": "Избранные библиотеки",
"allowWriteAccess": ""
},
"sections": {
"status": "Статус",
"info": "Информация о плагине",
"configuration": "Конфигурация",
"manifest": "Манифест",
"usersPermission": "Разрешение пользователей",
"libraryPermission": "Разрешение на использование библиотеки"
},
"status": {
"enabled": "Включено",
"disabled": "Отключить"
},
"actions": {
"enable": "Включить",
"disable": "Отключить",
"disabledDueToError": "Исправьте ошибку перед включением",
"disabledUsersRequired": "Выберите пользователей перед включением",
"disabledLibrariesRequired": "Выберите библиотеки перед включением",
"addConfig": "Добавить конфигурацию",
"rescan": "Повторное сканирование"
},
"notifications": {
"enabled": "Плагин включен",
"disabled": "Плагин отключен",
"updated": "Плагин обновлен",
"error": "Ошибка обновления плагина"
},
"validation": {
"invalidJson": "Конфигурация должна быть в формате JSON, допустимом для всех пользователей"
},
"messages": {
"configHelp": "Настройте плагин, используя пары ключ-значение. Оставьте поле пустым, если плагин не требует настройки.",
"clickPermissions": "Нажмите на разрешение для получения подробной информации",
"noConfig": "Конфигурация не задана",
"allUsersHelp": "При включении плагин получит доступ ко всем пользователям, включая тех, кто будет создан в будущем.",
"noUsers": "Не выбрано ни одного пользователя",
"permissionReason": "Причина",
"usersRequired": "Этому плагину требуется доступ к пользовательской информации. Выберите, к каким пользователям плагин может получить доступ, или включите \"Разрешить всем пользователям\".",
"allLibrariesHelp": "После включения плагин будет иметь доступ ко всем библиотекам, включая те, которые будут созданы в будущем.",
"noLibraries": "Библиотеки не выбраны",
"librariesRequired": "Этому плагину требуется доступ к библиотечной информации. Выберите, к каким библиотекам плагин может получить доступ, или включите \"Разрешить все библиотеки\".",
"requiredHosts": "Необходимые хосты",
"configValidationError": "Проверка конфигурации завершилась неудачей:",
"schemaRenderError": "Не удалось отобразить форму конфигурации. Возможно, схема плагина недействительна.",
"allowWriteAccessHelp": ""
},
"placeholders": {
"configKey": "ключ",
"configValue": "значение"
}
}
},
"ra": {
"auth": {
"welcome1": "Спасибо за установку Navidrome!",
"welcome2": "Для начала, создайте аккаунт Администратора",
"confirmPassword": "Подтвердить Пароль",
"buttonCreateAdmin": "Создать аккаунт Администратора",
"auth_check_error": "Пожалуйста, авторизуйтесь для продолжения работы",
"user_menu": "Профиль",
"username": "Имя пользователя",
"password": "Пароль",
"sign_in": "Войти",
"sign_in_error": "Ошибка аутентификации, попробуйте снова",
"logout": "Выйти",
"insightsCollectionNote": "Navidrome анонимно собирает данные об использовании, \nчтобы сделать проект лучше. \nУзнать больше и отключить сбор данных можно [здесь]"
},
"validation": {
"invalidChars": "Пожалуйста, используйте только буквы и цифры",
"passwordDoesNotMatch": "Пароли не совпадают",
"required": "Обязательно для заполнения",
"minLength": "Минимальное кол-во символов %{min}",
"maxLength": "Максимальное кол-во символов %{max}",
"minValue": "Минимальное значение %{min}",
"maxValue": "Значение может быть %{max} или меньше",
"number": "Должно быть цифрой",
"email": "Некорректный Email",
"oneOf": "Должно быть одним из: %{options}",
"regex": "Должно быть в формате (regexp): %{pattern}",
"unique": "Должно быть уникальным",
"url": "Должен быть действительный URL"
},
"action": {
"add_filter": "Фильтр",
"add": "Добавить",
"back": "Назад",
"bulk_actions": "1 выбран |||| %{smart_count} выбрано |||| %{smart_count} выбрано",
"cancel": "Отмена",
"clear_input_value": "Очистить",
"clone": "Дублировать",
"confirm": "Подтвердить",
"create": "Создать",
"delete": "Удалить",
"edit": "Редактировать",
"export": "Экспорт",
"list": "Список",
"refresh": "Обновить",
"remove_filter": "Убрать этот фильтр",
"remove": "Удалить",
"save": "Сохранить",
"search": "Поиск",
"show": "Просмотр",
"sort": "Сортировать",
"undo": "Отменить",
"expand": "Расширить",
"close": "Закрыть",
"open_menu": "Открыть меню",
"close_menu": "Закрыть меню",
"unselect": "Отменить выделение",
"skip": "Пропустить",
"bulk_actions_mobile": "1 |||| %{smart_count}",
"share": "Поделиться",
"download": "Скачать"
},
"boolean": {
"true": "Да",
"false": "Нет"
},
"page": {
"create": "Создать %{name}",
"dashboard": "Главная",
"edit": "%{name} #%{id}",
"error": "Что-то пошло не так",
"list": "%{name}",
"loading": "Загрузка",
"not_found": "Не найдено",
"show": "%{name} #%{id}",
"empty": "Нет %{name}.",
"invite": "Хотите создать?"
},
"input": {
"file": {
"upload_several": "Перетащите файлы для загрузки или щёлкните для выбора.",
"upload_single": "Перетащите файл для загрузки или щёлкните для выбора."
},
"image": {
"upload_several": "Перетащите картинки для загрузки или щёлкните для выбора.",
"upload_single": "Перетащите картинку для загрузки или щёлкните для выбора."
},
"references": {
"all_missing": "Связанных данных не найдено.",
"many_missing": "Некоторые из связанных данных не доступны",
"single_missing": "Связанный объект не доступен"
},
"password": {
"toggle_visible": "Скрыть пароль",
"toggle_hidden": "Показать пароль"
}
},
"message": {
"about": "Справка",
"are_you_sure": "Вы уверены?",
"bulk_delete_content": "Вы уверены, что хотите удалить %{name}? |||| Вы уверены, что хотите удалить объекты, кол-вом %{smart_count} ? |||| Вы уверены, что хотите удалить объекты, кол-вом %{smart_count} ?",
"bulk_delete_title": "Удалить %{name} |||| Удалить %{smart_count} %{name} |||| Удалить %{smart_count} %{name}",
"delete_content": "Вы уверены что хотите удалить этот объект",
"delete_title": "Удалить %{name} #%{id}",
"details": "Описание",
"error": "При выполнении запроса возникла ошибка, и он не может быть завершен",
"invalid_form": "Форма заполнена неверно, проверьте, пожалуйста, ошибки",
"loading": "Идет загрузка, пожалуйста, немного подождите",
"no": "Нет",
"not_found": "Либо вы ввели неправильный URL, либо перешли по некорректной ссылке.",
"yes": "Да",
"unsaved_changes": "Некоторые из ваших изменений не сохранены. Продолжить без сохранения?"
},
"navigation": {
"no_results": "Результатов не найдено",
"no_more_results": "Страница %{page} выходит за пределы нумерации, попробуйте предыдущую",
"page_out_of_boundaries": "Страница %{page} выходит за пределы нумерации",
"page_out_from_end": "Невозможно переместиться дальше последней страницы",
"page_out_from_begin": "Номер страницы не может быть меньше 1",
"page_range_info": "%{offsetBegin}-%{offsetEnd} из %{total}",
"page_rows_per_page": "Строк на странице:",
"next": "Следующая",
"prev": "Предыдущая",
"skip_nav": "Перейти к содержанию"
},
"notification": {
"updated": "Элемент обновлен |||| %{smart_count} обновлено |||| %{smart_count} обновлено",
"created": "Элемент создан",
"deleted": "Элемент удален |||| %{smart_count} удалено |||| %{smart_count} удалено",
"bad_item": "Неправильный элемент",
"item_doesnt_exist": "Элемент не существует",
"http_error": "Ошибка сервера",
"data_provider_error": "Ошибка dataProvider, проверьте консоль",
"i18n_error": "Не удалось загрузить перевод для указанного языка",
"canceled": "Операция отменена",
"logged_out": "Ваша сессия завершена, попробуйте переподключиться/войти снова",
"new_version": "Доступна новая версия! Пожалуйста, обновите это окно."
},
"toggleFieldsMenu": {
"columnsToDisplay": "Отображение столбцов",
"layout": "Макет",
"grid": "Сетка",
"table": "Таблица"
}
},
"message": {
"note": "ПРИМЕЧАНИЕ",
"transcodingDisabled": "Изменение настроек транскодирования через веб интерфейс, отключено по соображениям безопасности. Если вы хотите изменить или добавить опции транскодирования, перезапустите сервер с опцией конфигурации %{config}.",
"transcodingEnabled": "Navidrome работает с настройками %{config}, позволяющими запускать команды с настройками транскодирования через веб интерфейс. В целях безопасности, мы рекомендуем отключить эту возможность.",
"songsAddedToPlaylist": "Один трек добавлен в плейлист |||| %{smart_count} треков добавлено в плейлист",
"noPlaylistsAvailable": "Недоступно",
"delete_user_title": "Удалить пользователя '%{name}'",
"delete_user_content": "Вы уверены, что вы хотите удалить пользователя и все его данные (включая плейлисты и настройки)?",
"notifications_blocked": "Вы заблокировали уведомления для этой страницы в настройках вашего браузера",
"notifications_not_available": "Ваш браузер не поддерживает всплывающие уведомления",
"lastfmLinkSuccess": "Соединение с Last.fm установлено, скробблинг включен",
"lastfmLinkFailure": "Last.fm не может быть подключен",
"lastfmUnlinkSuccess": "Соединение с Last.fm удалено, скробблинг отключен",
"lastfmUnlinkFailure": "Соединение с Last.fm не может быть удалено",
"openIn": {
"lastfm": "Показать на Last.fm",
"musicbrainz": "Показать на MusicBrainz"
},
"lastfmLink": "Подробнее...",
"listenBrainzLinkSuccess": "ListenBrainz скробблинг успешно подключен для пользователя: %{user}",
"listenBrainzLinkFailure": "ListenBrainz не может быть связан:",
"listenBrainzUnlinkSuccess": "ListenBrainz скробблинг отключен",
"listenBrainzUnlinkFailure": "ListenBrainz не удалось отключить",
"downloadOriginalFormat": "Скачать в оригинальном формате",
"shareOriginalFormat": "Поделиться в оригинальном формате",
"shareDialogTitle": "Поделиться %{resource} '%{name}'",
"shareBatchDialogTitle": "Поделиться 1 %{resource} |||| Поделиться %{smart_count} %{resource}",
"shareSuccess": "URL скопирован в буфер обмена: %{url}",
"shareFailure": "Ошибка копирования URL-адреса %{url} в буфер обмена",
"downloadDialogTitle": "Скачать %{resource} '%{name}' (%{size})",
"shareCopyToClipboard": "Копировать в буфер обмена: Ctrl+C, Enter",
"remove_missing_title": "Удалить отсутствующие файлы?",
"remove_missing_content": "Вы уверены, что хотите удалить выбранные отсутствующие файлы из базы данных? Это навсегда удалит все ссылки на них, включая данные о прослушиваниях и рейтингах.",
"remove_all_missing_title": "Удалите все отсутствующие файлы",
"remove_all_missing_content": "Вы уверены, что хотите удалить все отсутствующие файлы из базы данных? Это навсегда удалит все упоминания о них, включая количество игр и рейтинг.",
"noSimilarSongsFound": "Похожих треков не найдено",
"noTopSongsFound": "Лучших треков не найдено",
"startingInstantMix": "Загрузка быстрого микса"
},
"menu": {
"library": "Библиотека",
"settings": "Настройки",
"version": "Версия",
"theme": "Тема",
"personal": {
"name": "Личные",
"options": {
"theme": "Тема",
"language": "Язык",
"defaultView": "Вид по умолчанию",
"desktop_notifications": "Уведомления на рабочем столе",
"lastfmScrobbling": "Скробблинг Last.fm",
"listenBrainzScrobbling": "Скробблинг ListenBrainz",
"replaygain": "ReplayGain режим",
"preAmp": "ReplayGain предусилитель (dB)",
"gain": {
"none": "Отключить",
"album": "Использовать усиление альбома",
"track": "Использовать усиление трека"
},
"lastfmNotConfigured": "API-ключ Last.fm не настроен"
}
},
"albumList": "Альбомы",
"about": "О программе",
"playlists": "Плейлисты",
"sharedPlaylists": "Поделиться плейлистом",
"librarySelector": {
"allLibraries": "Все библиотеки (%{count})",
"multipleLibraries": "%{selected} из %{total} Библиотеки",
"selectLibraries": "Выбор библиотек",
"none": "Отсутствует"
}
},
"player": {
"playListsText": "Очередь Воспроизведения",
"openText": "Открыть",
"closeText": "Закрыть",
"notContentText": "Нет музыки",
"clickToPlayText": "Играть",
"clickToPauseText": "Пауза",
"nextTrackText": "Следующий трек",
"previousTrackText": "Предыдущий трек",
"reloadText": "Перезагрузить",
"volumeText": "Громкость",
"toggleLyricText": "Посмотреть текст",
"toggleMiniModeText": "Свернуть",
"destroyText": "Выключить",
"downloadText": "Скачать",
"removeAudioListsText": "Удалить список воспроизведения",
"clickToDeleteText": "Нажмите для удаления %{name}",
"emptyLyricText": "Без текста",
"playModeText": {
"order": "По порядку",
"orderLoop": "Повторять",
"singleLoop": "Повторить один раз",
"shufflePlay": "Перемешать"
}
},
"about": {
"links": {
"homepage": "Главная",
"source": "Исходный код",
"featureRequests": "Предложения",
"lastInsightsCollection": "Последний сбор данных",
"insights": {
"disabled": "Выключено",
"waiting": "Ожидание"
}
},
"tabs": {
"about": "О нас",
"config": "Конфигурация"
},
"config": {
"configName": "Имя конфигурации",
"environmentVariable": "Переменная среды",
"currentValue": "Текущее значение",
"configurationFile": "Файл конфигурации",
"exportToml": "Экспорт конфигурации (TOML)",
"exportSuccess": "Конфигурация экспортирована в буфер обмена в формате TOML",
"exportFailed": "Не удалось скопировать конфигурацию",
"devFlagsHeader": "Флаги разработки (могут быть изменены/удалены)",
"devFlagsComment": "Это экспериментальные настройки, которые могут быть удалены в будущих версиях.",
"downloadToml": "Скачать конфигурацию (TOML)"
}
},
"activity": {
"title": "Действия",
"totalScanned": "Всего просканировано папок",
"quickScan": "Быстрое сканирование",
"fullScan": "Полное сканирование",
"serverUptime": "Время работы сервера",
"serverDown": "Оффлайн",
"scanType": "Тип",
"status": "Ошибка сканирования",
"elapsedTime": "Прошедшее время",
"selectiveScan": "Избирательный"
},
"help": {
"title": "Горячие клавиши Navidrome",
"hotkeys": {
"show_help": "Показать справку",
"toggle_menu": "Показать / скрыть боковое меню",
"toggle_play": "Играть / Пауза",
"prev_song": "Предыдущий трек",
"next_song": "Следующий трек",
"vol_up": "Увеличить громкость",
"vol_down": "Уменьшить громкость",
"toggle_love": "Добавить / удалить песню из избранного",
"current_song": "Перейти к текущему треку"
}
},
"nowPlaying": {
"title": "Сейчас играет",
"empty": "Ничего не играет",
"minutesAgo": "%{smart_count} минут назад |||| %{smart_count} минут назад"
}
}