613 lines
46 KiB
TypeScript
613 lines
46 KiB
TypeScript
export const ru = {
|
||
// Header
|
||
myTube: "MyTube",
|
||
manage: "Управление",
|
||
settings: "Настройки",
|
||
logout: "Выйти",
|
||
pleaseEnterUrlOrSearchTerm:
|
||
"Пожалуйста, введите URL видео или поисковый запрос",
|
||
unexpectedErrorOccurred:
|
||
"Произошла непредвиденная ошибка. Пожалуйста, попробуйте снова.",
|
||
uploadVideo: "Загрузить видео",
|
||
enterUrlOrSearchTerm: "Введите URL видео или поисковый запрос",
|
||
manageVideos: "Управление видео",
|
||
instruction: "Инструкция",
|
||
|
||
// Home
|
||
pasteUrl: "Вставьте URL видео или коллекции",
|
||
download: "Скачать",
|
||
search: "Поиск",
|
||
recentDownloads: "Недавние загрузки",
|
||
noDownloads: "Загрузок пока нет",
|
||
downloadStarted: "Загрузка началась",
|
||
downloadFailed: "Ошибка загрузки",
|
||
loadingVideos: "Загрузка видео...",
|
||
searchResultsFor: "Результаты поиска для",
|
||
fromYourLibrary: "Из вашей библиотеки",
|
||
noMatchingVideos: "В вашей библиотеке нет подходящих видео.",
|
||
proxyOnlyApplyToYoutube: "Прокси применяется только к Youtube",
|
||
moveSubtitlesToVideoFolder: "Расположение субтитров",
|
||
moveSubtitlesToVideoFolderOn: "Вместе с видео",
|
||
moveSubtitlesToVideoFolderOff: "В изолированной папке субтитров",
|
||
moveSubtitlesToVideoFolderDescription:
|
||
"Если включено, файлы субтитров будут перемещены в ту же папку, что и видеофайл. Если отключено, они будут перемещены в изолированную папку субтитров.",
|
||
moveThumbnailsToVideoFolder: "Расположение миниатюр",
|
||
moveThumbnailsToVideoFolderOn: "Вместе с видео",
|
||
moveThumbnailsToVideoFolderOff: "В отдельной папке изображений",
|
||
moveThumbnailsToVideoFolderDescription:
|
||
"Если включено, файлы миниатюр будут перемещены в ту же папку, что и видеофайл. Если выключено, они будут перемещены в отдельную папку изображений.",
|
||
loadingYouTubeResults: "Загрузка результатов YouTube...",
|
||
noYouTubeResults: "Результаты YouTube не найдены",
|
||
noVideosYet: "Видео пока нет. Отправьте URL видео, чтобы скачать первое!",
|
||
views: "просмотров",
|
||
|
||
// Settings
|
||
general: "Общие",
|
||
security: "Безопасность",
|
||
videoDefaults: "Настройки плеера по умолчанию",
|
||
downloadSettings: "Настройки загрузки",
|
||
language: "Язык",
|
||
websiteName: "Название веб-сайта",
|
||
websiteNameHelper: "{current}/{max} символов (По умолчанию: {default})",
|
||
infiniteScroll: "Бесконечная прокрутка",
|
||
infiniteScrollDisabled: "Отключено, когда включена бесконечная прокрутка",
|
||
maxVideoColumns: "Максимальное количество колонок видео (Главная страница)",
|
||
videoColumns: "Колонки видео (Главная страница)",
|
||
columnsCount: "{count} колонок",
|
||
enableLogin: "Включить защиту входа",
|
||
password: "Пароль",
|
||
enterPassword: "Введите пароль",
|
||
togglePasswordVisibility: "Показать/скрыть пароль",
|
||
passwordHelper:
|
||
"Оставьте пустым, чтобы сохранить текущий пароль, или введите новый для изменения",
|
||
passwordSetHelper: "Установите пароль для доступа к приложению",
|
||
autoPlay: "Автовоспроизведение видео",
|
||
autoLoop: "Автоповтор видео",
|
||
maxConcurrent: "Макс. одновременных загрузок",
|
||
saveSettings: "Сохранить настройки",
|
||
saving: "Сохранение...",
|
||
backToManage: "Назад к управлению",
|
||
settingsSaved: "Настройки успешно сохранены",
|
||
settingsFailed: "Не удалось сохранить настройки",
|
||
debugMode: "Режим отладки",
|
||
debugModeDescription:
|
||
"Показать или скрыть сообщения консоли (требуется обновление)",
|
||
tagsManagement: "Управление тегами",
|
||
newTag: "Новый тег",
|
||
tags: "Теги",
|
||
tagsManagementNote:
|
||
"Пожалуйста, не забудьте нажать «Сохранить настройки» после добавления или удаления тегов, чтобы применить изменения.",
|
||
|
||
// Database
|
||
database: "База данных",
|
||
migrateDataDescription:
|
||
"Перенос данных из устаревших файлов JSON в новую базу данных SQLite. Это действие безопасно запускать несколько раз (дубликаты будут пропущены).",
|
||
migrateDataButton: "Перенести данные из JSON",
|
||
scanFiles: "Сканировать файлы",
|
||
scanFilesSuccess: "Сканирование завершено. Добавлено {count} новых видео.",
|
||
scanFilesDeleted: " Удалено {count} отсутствующих файлов.",
|
||
scanFilesFailed: "Сканирование не удалось",
|
||
scanFilesConfirmMessage:
|
||
"Система просканирует корневую папку с видео. Новые файлы будут добавлены, а отсутствующие видеофайлы будут удалены из системы.",
|
||
scanning: "Сканирование...",
|
||
migrateConfirmation:
|
||
"Вы уверены, что хотите перенести данные? Это может занять некоторое время.",
|
||
migrationResults: "Результаты миграции",
|
||
migrationReport: "Отчет о миграции",
|
||
migrationSuccess: "Миграция завершена. Подробности см. в оповещении.",
|
||
migrationNoData: "Миграция завершена, но данные не найдены.",
|
||
migrationFailed: "Ошибка миграции",
|
||
migrationWarnings: "ПРЕДУПРЕЖДЕНИЯ",
|
||
migrationErrors: "ОШИБКИ",
|
||
itemsMigrated: "элементов перенесено",
|
||
fileNotFound: "Файл не найден в",
|
||
noDataFilesFound:
|
||
"Файлы данных для миграции не найдены. Пожалуйста, проверьте сопоставления томов.",
|
||
removeLegacyData: "Удалить устаревшие данные",
|
||
removeLegacyDataDescription:
|
||
"Удалите старые файлы JSON (videos.json, collections.json и т.д.), чтобы освободить место на диске. Делайте это только после проверки успешной миграции ваших данных.",
|
||
removeLegacyDataConfirmTitle: "Удалить устаревшие данные?",
|
||
removeLegacyDataConfirmMessage:
|
||
"Вы уверены, что хотите удалить устаревшие файлы данных JSON? Это действие нельзя отменить.",
|
||
legacyDataDeleted: "Устаревшие данные успешно удалены.",
|
||
formatLegacyFilenames: "Format Legacy Filenames",
|
||
formatLegacyFilenamesDescription:
|
||
"Batch rename all video files, thumbnails, and subtitles to the new standard format: Title-Author-YYYY. This operation will modify filenames on the disk and update the database logic.",
|
||
formatLegacyFilenamesButton: "Форматировать имена файлов",
|
||
formatFilenamesSuccess:
|
||
"Обработано: {processed}\nПереименовано: {renamed}\nОшибки: {errors}",
|
||
formatFilenamesDetails: "Подробности:",
|
||
formatFilenamesMore: "...и еще {count}",
|
||
formatFilenamesError: "Не удалось отформатировать имена файлов: {error}",
|
||
deleteLegacyDataButton: "Удалить устаревшие данные",
|
||
cleanupTempFiles: "Очистить временные файлы",
|
||
cleanupTempFilesDescription:
|
||
"Удалить все временные файлы загрузки (.ytdl, .part) из каталога загрузок. Это помогает освободить место на диске от незавершенных или отмененных загрузок.",
|
||
cleanupTempFilesConfirmTitle: "Очистить временные файлы?",
|
||
cleanupTempFilesConfirmMessage:
|
||
"Это навсегда удалит все файлы .ytdl и .part в каталоге загрузок. Убедитесь, что нет активных загрузок перед продолжением.",
|
||
cleanupTempFilesActiveDownloads:
|
||
"Невозможно очистить, пока активны загрузки. Пожалуйста, дождитесь завершения всех загрузок или сначала отмените их.",
|
||
itemsPerPage: "Элементов на странице",
|
||
itemsPerPageHelper: "Количество видео на странице (По умолчанию: 12)",
|
||
showYoutubeSearch: "Показать результаты поиска YouTube",
|
||
visitorMode: "Режим посетителя (Только чтение)",
|
||
visitorModeReadOnly: "Режим посетителя: Только чтение",
|
||
visitorModeDescription: "Режим только чтения. Скрытые видео не будут видны посетителям.",
|
||
visitorModePasswordPrompt: "Пожалуйста, введите пароль веб-сайта для изменения настроек режима посетителя.",
|
||
cleanupTempFilesSuccess: "Успешно удалено {count} временных файлов.",
|
||
cleanupTempFilesFailed: "Не удалось очистить временные файлы",
|
||
|
||
// Cookie Settings
|
||
cookieSettings: "Настройки Cookie",
|
||
cookieUploadDescription:
|
||
'Загрузите cookies.txt, чтобы пройти проверку ботов YouTube и включить скачивание субтитров Bilibili. Файл будет автоматически переименован в cookies.txt. (Пример: используйте расширение "Get cookies.txt LOCALLY" для экспорта cookie)',
|
||
uploadCookies: "Загрузить Cookie",
|
||
onlyTxtFilesAllowed: "Разрешены только файлы .txt",
|
||
cookiesUploadedSuccess: "Cookie успешно загружены",
|
||
cookiesUploadFailed: "Не удалось загрузить cookie",
|
||
cookiesFound: "cookies.txt найден",
|
||
cookiesNotFound: "cookies.txt не найден",
|
||
deleteCookies: "Удалить Cookie",
|
||
confirmDeleteCookies:
|
||
"Вы уверены, что хотите удалить файл cookie? Это повлияет на возможность скачивания видео с возрастными ограничениями или только для участников.",
|
||
cookiesDeletedSuccess: "Cookie успешно удалены",
|
||
cookiesDeleteFailed: "Не удалось удалить cookie",
|
||
|
||
// Cloud Drive
|
||
cloudDriveSettings: "Облачное хранилище (OpenList)",
|
||
cloudDriveDescription:
|
||
"Автоматически загружать видео в облачное хранилище (Alist) и сканировать новые файлы в облаке. Локальные файлы будут удалены после успешной загрузки.",
|
||
enableAutoSave: "Включить облачную синхронизацию",
|
||
apiUrl: "URL API",
|
||
apiUrlHelper: "напр. https://your-alist-instance.com/api/fs/put",
|
||
token: "Токен",
|
||
publicUrl: "Публичный URL",
|
||
publicUrlHelper: "Публичный домен для доступа к файлам (напр. https://your-cloudflare-tunnel-domain.com). Если установлен, будет использоваться вместо URL API для доступа к файлам.",
|
||
uploadPath: "Путь загрузки",
|
||
cloudDrivePathHelper: "Путь к каталогу в облаке, напр. /mytube-uploads",
|
||
scanPaths: "Пути сканирования",
|
||
scanPathsHelper: "Один путь в строке. Видео будут сканироваться из этих путей. Если пусто, будет использоваться путь загрузки. Пример:\n/a/Фильмы\n/b/Документальные",
|
||
cloudDriveNote:
|
||
"После включения этой функции недавно загруженные видео будут автоматически загружены в облачное хранилище, а локальные файлы будут удалены. Видео будут воспроизводиться из облачного хранилища через прокси.",
|
||
cloudScanAdded: "Добавлено из облака",
|
||
testing: "Тестирование...",
|
||
testConnection: "Тестировать соединение",
|
||
sync: "Синхронизировать",
|
||
syncToCloud: "Двусторонняя синхронизация",
|
||
syncWarning: "Эта операция загрузит локальные видео в облако и просканирует облачное хранилище на наличие новых файлов. Локальные файлы будут удалены после загрузки.",
|
||
syncing: "Синхронизация...",
|
||
syncCompleted: "Синхронизация завершена",
|
||
syncFailed: "Ошибка синхронизации",
|
||
syncReport: "Всего: {total} | Загружено: {uploaded} | Ошибок: {failed}",
|
||
syncErrors: "Ошибки:",
|
||
fillApiUrlToken: "Пожалуйста, сначала заполните URL API и токен",
|
||
connectionTestSuccess: "Тест соединения прошел успешно! Настройки верны.",
|
||
connectionFailedStatus: "Ошибка соединения: Сервер вернул статус {status}",
|
||
connectionFailedUrl: "Невозможно подключиться к серверу. Пожалуйста, проверьте URL API.",
|
||
authFailed: "Ошибка аутентификации. Пожалуйста, проверьте ваш токен.",
|
||
connectionTestFailed: "Тест соединения не удался: {error}",
|
||
syncFailedMessage: "Ошибка синхронизации. Пожалуйста, попробуйте снова.",
|
||
foundVideosToSync: "Найдено {count} видео с локальными файлами для синхронизации",
|
||
uploadingVideo: "Загрузка: {title}",
|
||
clearThumbnailCache: "Clear Thumbnail Local Cache",
|
||
clearing: "Clearing...",
|
||
clearThumbnailCacheSuccess: "Thumbnail cache cleared successfully. Thumbnails will be regenerated when accessed next time.",
|
||
clearThumbnailCacheError: "Failed to clear thumbnail cache",
|
||
clearThumbnailCacheConfirmMessage: "This will clear all locally cached thumbnails for cloud videos. Thumbnails will be regenerated from cloud storage when accessed next time. Continue?",
|
||
|
||
// Manage
|
||
manageContent: "Управление контентом",
|
||
videos: "Видео",
|
||
collections: "Коллекции",
|
||
allVideos: "Все видео",
|
||
delete: "Удалить",
|
||
backToHome: "Назад на главную",
|
||
confirmDelete: "Вы уверены, что хотите удалить это?",
|
||
deleteSuccess: "Успешно удалено",
|
||
previouslyDeletedVideo: "Ранее удаленное видео",
|
||
previouslyDeleted: "Ранее удалено",
|
||
videoWasDeleted: "Это видео было ранее загружено, но удалено.",
|
||
deleteFailed: "Не удалось удалить",
|
||
noVideos: "Видео не найдено",
|
||
noCollectionsFound: "Коллекции не найдены",
|
||
noCollections: "Коллекции не найдены",
|
||
searchVideos: "Поиск видео...",
|
||
thumbnail: "Миниатюра",
|
||
title: "Название",
|
||
author: "Автор",
|
||
authors: "Авторы",
|
||
created: "Создано",
|
||
name: "Имя",
|
||
size: "Размер",
|
||
actions: "Действия",
|
||
deleteCollection: "Удалить коллекцию",
|
||
deleteVideo: "Удалить видео",
|
||
noVideosFoundMatching: "Видео, соответствующие вашему поиску, не найдены.",
|
||
|
||
// Video Player
|
||
playing: "Воспроизведение",
|
||
paused: "Пауза",
|
||
next: "Следующее",
|
||
previous: "Предыдущее",
|
||
loop: "Повтор",
|
||
autoPlayOn: "Автовоспроизведение вкл.",
|
||
autoPlayOff: "Автовоспроизведение выкл.",
|
||
autoPlayNext: "Автовоспроизведение следующего",
|
||
videoNotFound: "Видео не найдено",
|
||
videoNotFoundOrLoaded: "Видео не найдено или не может быть загружено.",
|
||
deleting: "Удаление...",
|
||
addToCollection: "Добавить в коллекцию",
|
||
originalLink: "Оригинальная ссылка",
|
||
source: "Источник:",
|
||
addedDate: "Дата добавления:",
|
||
hideComments: "Скрыть комментарии",
|
||
showComments: "Показать комментарии",
|
||
latestComments: "Последние комментарии",
|
||
noComments: "Комментарии недоступны.",
|
||
upNext: "Далее",
|
||
noOtherVideos: "Других видео нет",
|
||
currentlyIn: "Сейчас в:",
|
||
collectionWarning: "Добавление в другую коллекцию удалит его из текущей.",
|
||
addToExistingCollection: "Добавить в существующую коллекцию:",
|
||
selectCollection: "Выберите коллекцию",
|
||
add: "Добавить",
|
||
createNewCollection: "Создать новую коллекцию:",
|
||
collectionName: "Название коллекции",
|
||
create: "Создать",
|
||
removeFromCollection: "Удалить из коллекции",
|
||
confirmRemoveFromCollection:
|
||
"Вы уверены, что хотите удалить это видео из коллекции?",
|
||
remove: "Удалить",
|
||
loadingVideo: "Загрузка видео...",
|
||
current: "(Текущее)",
|
||
rateThisVideo: "Оценить это видео",
|
||
enterFullscreen: "На весь экран",
|
||
exitFullscreen: "Выйти из полноэкранного режима",
|
||
share: "Поделиться",
|
||
editTitle: "Редактировать название",
|
||
hideVideo: "Скрыть видео для режима посетителя",
|
||
showVideo: "Сделать видео видимым для режима посетителя",
|
||
toggleVisibility: "Переключить видимость",
|
||
titleUpdated: "Название успешно обновлено",
|
||
titleUpdateFailed: "Не удалось обновить название",
|
||
refreshThumbnail: "Обновить миниатюру",
|
||
thumbnailRefreshed: "Миниатюра успешно обновлена",
|
||
thumbnailRefreshFailed: "Не удалось обновить миниатюру",
|
||
videoUpdated: "Видео успешно обновлено",
|
||
videoUpdateFailed: "Не удалось обновить видео",
|
||
failedToLoadVideos:
|
||
"Не удалось загрузить видео. Пожалуйста, попробуйте позже.",
|
||
videoRemovedSuccessfully: "Видео успешно удалено",
|
||
failedToDeleteVideo: "Не удалось удалить видео",
|
||
pleaseEnterSearchTerm: "Пожалуйста, введите поисковый запрос",
|
||
failedToSearch: "Поиск не удался. Пожалуйста, попробуйте снова.",
|
||
searchCancelled: "Поиск отменен",
|
||
openInExternalPlayer: "Открыть во внешнем плеере",
|
||
playWith: "Воспроизвести с помощью...",
|
||
deleteAllFilteredVideos: "Удалить все отфильтрованные видео",
|
||
confirmDeleteFilteredVideos: "Вы уверены, что хотите удалить {count} видео, отфильтрованных по выбранным тегам?",
|
||
deleteFilteredVideosSuccess: "Успешно удалено {count} видео.",
|
||
deletingVideos: "Удаление видео...",
|
||
|
||
// Login
|
||
signIn: "Войти",
|
||
verifying: "Проверка...",
|
||
incorrectPassword: "Неверный пароль",
|
||
loginFailed: "Ошибка проверки пароля",
|
||
defaultPasswordHint: "Пароль по умолчанию: 123",
|
||
checkingConnection: "Проверка соединения...",
|
||
connectionError: "Ошибка соединения",
|
||
backendConnectionFailed:
|
||
"Не удалось подключиться к серверу. Убедитесь, что сервер запущен и порт открыт, затем повторите попытку.",
|
||
retry: "Повторить",
|
||
resetPassword: "Сбросить пароль",
|
||
resetPasswordTitle: "Сбросить пароль",
|
||
resetPasswordMessage:
|
||
"Вы уверены, что хотите сбросить пароль? Текущий пароль будет сброшен на случайную 8-символьную строку и отображен в логе бэкенда.",
|
||
resetPasswordConfirm: "Сбросить",
|
||
resetPasswordSuccess:
|
||
"Пароль был сброшен. Проверьте логи бэкенда для нового пароля.",
|
||
waitTimeMessage: "Пожалуйста, подождите {time} перед повторной попыткой.",
|
||
tooManyAttempts: "Слишком много неудачных попыток.",
|
||
linkCopied: "Ссылка скопирована в буфер обмена",
|
||
copyFailed: "Не удалось скопировать ссылку",
|
||
|
||
// Collection Page
|
||
loadingCollection: "Загрузка коллекции...",
|
||
collectionNotFound: "Коллекция не найдена",
|
||
noVideosInCollection: "В этой коллекции нет видео.",
|
||
|
||
// Snackbar Messages
|
||
videoDownloading: "Видео скачивается",
|
||
downloadStartedSuccessfully: "Загрузка успешно началась",
|
||
collectionCreatedSuccessfully: "Коллекция успешно создана",
|
||
videoAddedToCollection: "Видео добавлено в коллекцию",
|
||
videoRemovedFromCollection: "Видео удалено из коллекции",
|
||
collectionDeletedSuccessfully: "Коллекция успешно удалена",
|
||
failedToDeleteCollection: "Не удалось удалить коллекцию",
|
||
back: "Назад",
|
||
|
||
// Author Videos
|
||
loadVideosError: "Не удалось загрузить видео. Пожалуйста, попробуйте позже.",
|
||
unknownAuthor: "Неизвестно",
|
||
noVideosForAuthor: "Видео этого автора не найдены.",
|
||
deleteAuthor: "Удалить автора",
|
||
deleteAuthorConfirmation: "Вы уверены, что хотите удалить автора {author}? Это удалит все видео, связанные с этим автором.",
|
||
authorDeletedSuccessfully: "Автор успешно удален",
|
||
failedToDeleteAuthor: "Не удалось удалить автора",
|
||
|
||
// Delete Collection Modal
|
||
deleteCollectionTitle: "Удалить коллекцию",
|
||
deleteCollectionConfirmation: "Вы уверены, что хотите удалить коллекцию",
|
||
collectionContains: "Эта коллекция содержит",
|
||
deleteCollectionOnly: "Удалить только коллекцию",
|
||
deleteCollectionAndVideos: "Удалить коллекцию и все видео",
|
||
|
||
// Common
|
||
loading: "Загрузка...",
|
||
error: "Ошибка",
|
||
success: "Успех",
|
||
cancel: "Отмена",
|
||
close: "Закрыть",
|
||
ok: "ОК",
|
||
confirm: "Подтвердить",
|
||
save: "Сохранить",
|
||
note: "Примечание",
|
||
on: "Вкл.",
|
||
off: "Выкл",
|
||
continue: "Продолжить",
|
||
expand: "Развернуть",
|
||
collapse: "Свернуть",
|
||
|
||
// Video Card
|
||
unknownDate: "Неизвестная дата",
|
||
part: "Часть",
|
||
collection: "Коллекция",
|
||
|
||
// Upload Modal
|
||
selectVideoFile: "Выберите видеофайл",
|
||
pleaseSelectVideo: "Пожалуйста, выберите видеофайл",
|
||
uploadFailed: "Ошибка загрузки",
|
||
failedToUpload: "Не удалось загрузить видео",
|
||
uploading: "Загрузка...",
|
||
upload: "Загрузить",
|
||
|
||
// Bilibili Modal
|
||
bilibiliCollectionDetected: "Обнаружена коллекция Bilibili",
|
||
bilibiliSeriesDetected: "Обнаружена серия Bilibili",
|
||
multiPartVideoDetected: "Обнаружено многочастное видео",
|
||
authorOrPlaylist: "Автор / Плейлист",
|
||
playlistDetected: "Обнаружен плейлист",
|
||
playlistHasVideos: "В этом плейлисте {count} видео.",
|
||
downloadPlaylistAndCreateCollection: "Скачать видео из плейлиста и создать для него коллекцию?",
|
||
collectionHasVideos: "В этой коллекции Bilibili {count} видео.",
|
||
seriesHasVideos: "В этой серии Bilibili {count} видео.",
|
||
videoHasParts: "В этом видео Bilibili {count} частей.",
|
||
downloadAllVideos: "Скачать все {count} видео",
|
||
downloadAllParts: "Скачать все {count} частей",
|
||
downloadThisVideoOnly: "Скачать только это видео",
|
||
downloadCurrentPartOnly: "Скачать только текущую часть",
|
||
processing: "Обработка...",
|
||
wouldYouLikeToDownloadAllParts: "Хотите скачать все части?",
|
||
wouldYouLikeToDownloadAllVideos: "Хотите скачать все видео?",
|
||
allPartsAddedToCollection: "Все части будут добавлены в эту коллекцию",
|
||
allVideosAddedToCollection: "Все видео будут добавлены в эту коллекцию",
|
||
queued: "В очереди",
|
||
waitingInQueue: "Ожидание в очереди",
|
||
// Downloads
|
||
downloads: "Загрузки",
|
||
activeDownloads: "Активные загрузки",
|
||
manageDownloads: "Управление загрузками",
|
||
queuedDownloads: "Загрузки в очереди",
|
||
downloadHistory: "История загрузок",
|
||
clearQueue: "Очистить очередь",
|
||
clearHistory: "Очистить историю",
|
||
noActiveDownloads: "Нет активных загрузок",
|
||
noQueuedDownloads: "Нет загрузок в очереди",
|
||
noDownloadHistory: "История загрузок пуста",
|
||
downloadCancelled: "Загрузка отменена",
|
||
queueCleared: "Очередь очищена",
|
||
historyCleared: "История очищена",
|
||
removedFromQueue: "Удалено из очереди",
|
||
removedFromHistory: "Удалено из истории",
|
||
status: "Статус",
|
||
progress: "Прогресс",
|
||
speed: "Скорость",
|
||
finishedAt: "Завершено в",
|
||
failed: "Ошибка",
|
||
|
||
// Batch Download
|
||
batchDownload: "Пакетная загрузка",
|
||
batchDownloadDescription: "Вставьте несколько URL ниже, по одному в строке.",
|
||
urls: "URL",
|
||
addToQueue: "Добавить в очередь",
|
||
batchTasksAdded: "Добавлено задач: {count}",
|
||
addBatchTasks: "Добавить пакетные задачи",
|
||
|
||
// Subscriptions
|
||
subscribeToAuthor: "Подписаться на автора",
|
||
subscribeConfirmationMessage: "Вы хотите подписаться на {author}?",
|
||
subscribeDescription:
|
||
"Система будет автоматически проверять новые видео от этого автора и скачивать их.",
|
||
checkIntervalMinutes: "Интервал проверки (минуты)",
|
||
subscribe: "Подписаться",
|
||
subscriptions: "Подписки",
|
||
interval: "Интервал",
|
||
lastCheck: "Последняя проверка",
|
||
platform: "Платформа",
|
||
unsubscribe: "Отписаться",
|
||
confirmUnsubscribe: "Вы уверены, что хотите отписаться от {author}?",
|
||
subscribedSuccessfully: "Успешно подписаны",
|
||
unsubscribedSuccessfully: "Успешно отписаны",
|
||
subscriptionAlreadyExists: "Вы уже подписаны на этого автора.",
|
||
minutes: "минут",
|
||
never: "Никогда",
|
||
downloadAllPreviousVideos: "Скачать все предыдущие видео этого автора",
|
||
downloadAllPreviousWarning:
|
||
"Предупреждение: Это скачает все предыдущие видео этого автора. Это может потребовать значительного объема хранилища и может вызвать механизмы обнаружения ботов, что может привести к временным или постоянным запретам на платформе. Используйте на свой риск.",
|
||
continuousDownloadTasks: "Задачи непрерывной загрузки",
|
||
taskStatusActive: "Активна",
|
||
taskStatusPaused: "Приостановлена",
|
||
taskStatusCompleted: "Завершена",
|
||
taskStatusCancelled: "Отменена",
|
||
downloaded: "Скачано",
|
||
cancelTask: "Отменить задачу",
|
||
confirmCancelTask: "Вы уверены, что хотите отменить задачу загрузки для {author}?",
|
||
taskCancelled: "Задача успешно отменена",
|
||
deleteTask: "Удалить задачу",
|
||
confirmDeleteTask: "Вы уверены, что хотите удалить запись задачи для {author}? Это действие нельзя отменить.",
|
||
taskDeleted: "Задача успешно удалена",
|
||
clearFinishedTasks: "Очистить завершенные задачи",
|
||
tasksCleared: "Завершенные задачи успешно очищены",
|
||
confirmClearFinishedTasks: "Вы уверены, что хотите очистить все завершенные задачи (завершенные, отмененные)? Это удалит их из списка, но не удалит загруженные файлы.",
|
||
clear: "Очистить",
|
||
// Instruction Page
|
||
instructionSection1Title: "1. Загрузка и управление задачами",
|
||
instructionSection1Desc:
|
||
"Этот модуль включает функции получения видео, пакетных задач и импорта файлов.",
|
||
instructionSection1Sub1: "Загрузка по ссылке:",
|
||
instructionSection1Item1Label: "Базовая загрузка:",
|
||
instructionSection1Item1Text:
|
||
"Вставьте ссылки с различных видеосайтов в поле ввода для прямой загрузки.",
|
||
instructionSection1Item2Label: "Разрешения:",
|
||
instructionSection1Item2Text:
|
||
"Для сайтов, требующих членства или входа в систему, пожалуйста, сначала войдите в соответствующую учетную запись на новой вкладке браузера, чтобы получить разрешения на загрузку.",
|
||
instructionSection1Sub2: "Умное распознавание:",
|
||
instructionSection1Item3Label: "Подписка на автора YouTube:",
|
||
instructionSection1Item3Text:
|
||
"Когда вставленная ссылка является каналом автора, система спросит, хотите ли вы подписаться. После подписки система может автоматически сканировать и загружать обновления автора через заданные интервалы.",
|
||
instructionSection1Item4Label: "Загрузка коллекции Bilibili:",
|
||
instructionSection1Item4Text:
|
||
"Когда вставленная ссылка является избранным/коллекцией Bilibili, система спросит, хотите ли вы загрузить все содержимое коллекции.",
|
||
instructionSection1Sub3:
|
||
"Расширенные инструменты (Страница управления загрузками):",
|
||
instructionSection1Item5Label: "Пакетное добавление задач:",
|
||
instructionSection1Item5Text:
|
||
"Поддерживает вставку нескольких ссылок для загрузки одновременно (по одной в строке) для пакетного добавления.",
|
||
instructionSection1Item6Label: "Сканировать файлы:",
|
||
instructionSection1Item6Text:
|
||
"Автоматически ищет все файлы в корневом каталоге хранения видео и папках первого уровня. Эта функция подходит для синхронизации файлов с системой после того, как администраторы вручную поместили их на сервер.",
|
||
instructionSection1Item7Label: "Загрузить видео:",
|
||
instructionSection1Item7Text:
|
||
"Поддерживает загрузку локальных видеофайлов непосредственно с клиента на сервер.",
|
||
|
||
instructionSection2Title: "2. Управление видеотекой",
|
||
instructionSection2Desc:
|
||
"Обслуживание и редактирование загруженных или импортированных видеоресурсов.",
|
||
instructionSection2Sub1: "Удаление коллекции/видео:",
|
||
instructionSection2Text1:
|
||
"При удалении коллекции на странице управления система предлагает два варианта: удалить только элемент списка коллекции (сохранить файлы) или полностью удалить физические файлы внутри коллекции.",
|
||
instructionSection2Sub2: "Восстановление миниатюры:",
|
||
instructionSection2Text2:
|
||
"Если у видео нет обложки после загрузки, нажмите кнопку обновления на миниатюре видео, и система повторно захватит первый кадр видео в качестве новой миниатюры.",
|
||
|
||
instructionSection3Title: "3. Настройки системы",
|
||
instructionSection3Desc:
|
||
"Настройка параметров системы, обслуживание данных и расширение функций.",
|
||
instructionSection3Sub1: "Настройки безопасности:",
|
||
instructionSection3Text1:
|
||
"Установите пароль для входа в систему (начальный пароль по умолчанию — 123, рекомендуется изменить после первого входа).",
|
||
instructionSection3Sub2: "Управление тегами:",
|
||
instructionSection3Text2:
|
||
"Поддерживает добавление или удаление тегов классификации видео. Примечание: Вы должны нажать кнопку «Сохранить» внизу страницы, чтобы изменения вступили в силу.",
|
||
instructionSection3Sub3: "Обслуживание системы:",
|
||
instructionSection3Item1Label: "Очистить временные файлы:",
|
||
instructionSection3Item1Text:
|
||
"Используется для очистки остаточных временных файлов загрузки, вызванных случайными сбоями бэкенда, для освобождения места.",
|
||
instructionSection3Item2Label: "Миграция базы данных:",
|
||
instructionSection3Item2Text:
|
||
"Предназначено для пользователей ранних версий. Используйте эту функцию для миграции данных из JSON в новую базу данных SQLite. После успешной миграции нажмите кнопку удаления, чтобы очистить старые исторические данные.",
|
||
instructionSection3Sub4: "Расширенные сервисы:",
|
||
instructionSection3Item3Label: "Облачный диск OpenList:",
|
||
instructionSection3Item3Text:
|
||
"(В разработке) Поддерживает подключение к развернутым пользователем сервисам OpenList. Добавьте конфигурацию здесь, чтобы включить интеграцию с облачным диском.",
|
||
history: "История",
|
||
downloading: "Скачивание...",
|
||
poweredBy: "Работает на MyTube",
|
||
existingVideoDetected: "Обнаружено существующее видео",
|
||
videoAlreadyDownloaded: "Это видео уже загружено.",
|
||
viewVideo: "Посмотреть видео",
|
||
downloadAgain: "Скачать снова",
|
||
downloadedOn: "Скачано",
|
||
deletedOn: "Удалено",
|
||
existingVideo: "Существующее видео",
|
||
skipped: "Пропущено",
|
||
videoSkippedExists: "Видео уже существует, загрузка пропущена",
|
||
videoSkippedDeleted: "Видео было ранее удалено, загрузка пропущена",
|
||
|
||
// Sorting
|
||
sort: "Сортировка",
|
||
sortBy: "Сортировать по",
|
||
dateDesc: "Дата добавления (Сначала новые)",
|
||
dateAsc: "Дата добавления (Сначала старые)",
|
||
viewsDesc: "Просмотры (По убыванию)",
|
||
viewsAsc: "Просмотры (По возрастанию)",
|
||
nameAsc: "Имя (А-Я)",
|
||
random: "Случайно",
|
||
|
||
// yt-dlp Configuration
|
||
ytDlpConfiguration: "Конфигурация yt-dlp",
|
||
ytDlpConfigurationDescription: "Настройте параметры загрузки yt-dlp. См.",
|
||
ytDlpConfigurationDocs: "документацию",
|
||
ytDlpConfigurationDescriptionEnd: "для получения дополнительной информации.",
|
||
customize: "Настроить",
|
||
hide: "Скрыть",
|
||
reset: "Сбросить",
|
||
more: "Ещё",
|
||
|
||
// Database Export/Import
|
||
exportImportDatabase: "Экспорт/Импорт Базы Данных",
|
||
exportImportDatabaseDescription:
|
||
"Экспортируйте базу данных как файл резервной копии или импортируйте ранее экспортированную резервную копию. Импорт перезапишет существующие данные данными из резервной копии.",
|
||
exportDatabase: "Экспортировать Базу Данных",
|
||
importDatabase: "Импортировать Базу Данных",
|
||
onlyDbFilesAllowed: "Разрешены только файлы .db",
|
||
importDatabaseWarning:
|
||
"Предупреждение: Импорт базы данных перезапишет все существующие данные. Убедитесь, что вы сначала экспортировали текущую базу данных в качестве резервной копии.",
|
||
selectDatabaseFile: "Выбрать Файл Базы Данных",
|
||
databaseExportedSuccess: "База данных успешно экспортирована",
|
||
databaseExportFailed: "Не удалось экспортировать базу данных",
|
||
databaseImportedSuccess:
|
||
"База данных успешно импортирована. Существующие данные были перезаписаны данными из резервной копии.",
|
||
databaseImportFailed: "Не удалось импортировать базу данных",
|
||
cleanupBackupDatabases: "Очистить Резервные Копии Базы Данных",
|
||
cleanupBackupDatabasesWarning:
|
||
"Предупреждение: Это навсегда удалит все файлы резервных копий базы данных (mytube-backup-*.db.backup), которые были созданы во время предыдущих импортов. Это действие нельзя отменить. Вы уверены, что хотите продолжить?",
|
||
backupDatabasesCleanedUp: "Резервные копии базы данных успешно очищены",
|
||
backupDatabasesCleanupFailed:
|
||
"Не удалось очистить резервные копии базы данных",
|
||
restoreFromLastBackup: "Восстановить из Последней Резервной Копии",
|
||
restoreFromLastBackupWarning:
|
||
"Предупреждение: Это восстановит базу данных из последнего файла автоматической резервной копии. Все текущие данные будут перезаписаны данными из резервной копии. Это действие нельзя отменить. Вы уверены, что хотите продолжить?",
|
||
restoreFromLastBackupSuccess:
|
||
"База данных успешно восстановлена из резервной копии",
|
||
restoreFromLastBackupFailed: "Не удалось восстановить из резервной копии",
|
||
lastBackupDate: "Дата последней резервной копии",
|
||
noBackupAvailable: "Резервная копия недоступна",
|
||
|
||
// Cloudflare Tunnel
|
||
cloudflaredTunnel: "Cloudflare Tunnel",
|
||
enableCloudflaredTunnel: "Enable Cloudflare Tunnel",
|
||
cloudflaredToken: "Tunnel Token (Optional)",
|
||
cloudflaredTokenHelper: "Paste your tunnel token here, or leave empty to use a random Quick Tunnel.",
|
||
waitingForUrl: "Waiting for Quick Tunnel URL...",
|
||
running: "Running",
|
||
stopped: "Stopped",
|
||
tunnelId: "Tunnel ID",
|
||
accountTag: "Account Tag",
|
||
copied: "Copied!",
|
||
clickToCopy: "Click to copy",
|
||
quickTunnelWarning: "Quick Tunnel URLs change every time the tunnel restarts.",
|
||
managedInDashboard: "Public hostname is managed in your Cloudflare Zero Trust Dashboard.",
|
||
failedToDownloadVideo: "Не удалось скачать видео. Пожалуйста, попробуйте снова.",
|
||
failedToDownload: "Не удалось скачать. Пожалуйста, попробуйте снова.",
|
||
playlistDownloadStarted: "Скачивание плейлиста началось",
|
||
fromYouTube: "С YouTube",
|
||
copyUrl: "Копировать URL",
|
||
new: "НОВЫЙ",
|
||
disclaimerTitle: "Отказ от ответственности",
|
||
disclaimerText: "1. Цель и Ограничения\nЭто программное обеспечение (включая код и документацию) предназначено исключительно для личного обучения, исследований и технического обмена. Строго запрещено использовать это программное обеспечение в коммерческих целях или для любой незаконной деятельности, нарушающей местные законы и правила.\n\n2. Ответственность\nРазработчик не знает и не контролирует, как пользователи используют это программное обеспечение. Любая юридическая ответственность, споры или ущерб, возникающие в результате незаконного или ненадлежащего использования этого программного обеспечения (включая, помимо прочего, нарушение авторских прав), возлагаются исключительно на пользователя. Разработчик не несет никакой прямой, косвенной или солидарной ответственности.\n\n3. Модификации и Распространение\nЭтот проект с открытым исходным кодом. Любое физическое лицо или организация, изменяющая или создающая форк этого кода, должна соблюдать лицензию с открытым исходным кодом. Важно: Если третья сторона изменяет код для обхода или удаления оригинальных механизмов аутентификации/безопасности пользователей и распространяет такие версии, модификатор/распространитель несет полную ответственность за любые последствия. Мы настоятельно не рекомендуем обходить или вмешиваться в любые механизмы проверки безопасности.\n\n4. Некоммерческое Заявление\nЭто полностью бесплатный проект с открытым исходным кодом. Разработчик не принимает пожертвования и никогда не публиковал страницы для пожертвований. Сама программа не предусматривает взимания платы и не предлагает платных услуг. Пожалуйста, будьте бдительны и остерегайтесь мошенничества или вводящей в заблуждение информации, утверждающей о сборе средств от имени этого проекта.",
|
||
|
||
};
|