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: "Настройки загрузки", // Settings Categories basicSettings: "Основные настройки", interfaceDisplay: "Интерфейс и отображение", securityAccess: "Безопасность и доступ", videoPlayback: "Воспроизведение видео", downloadStorage: "Загрузка и хранение", contentManagement: "Управление контентом", dataManagement: "Управление данными", advanced: "Дополнительно", language: "Язык", websiteName: "Название веб-сайта", websiteNameHelper: "{current}/{max} символов (По умолчанию: {default})", infiniteScroll: "Бесконечная прокрутка", infiniteScrollDisabled: "Отключено, когда включена бесконечная прокрутка", maxVideoColumns: "Максимальное количество колонок видео (Главная страница)", videoColumns: "Колонки видео (Главная страница)", columnsCount: "{count} колонок", enableLogin: "Включить защиту входа", allowPasswordLogin: "Разрешить вход по паролю", allowPasswordLoginHelper: "При отключении вход по паролю недоступен. Для отключения входа по паролю необходимо иметь хотя бы один ключ доступа.", allowResetPassword: "Разрешить сброс пароля", allowResetPasswordHelper: "При отключении кнопка сброса пароля не будет отображаться на странице входа, а API сброса пароля будет заблокирована.", password: "Пароль", enterPassword: "Введите пароль", togglePasswordVisibility: "Показать/скрыть пароль", passwordHelper: "Оставьте пустым, чтобы сохранить текущий пароль, или введите новый для изменения", passwordSetHelper: "Установите пароль для доступа к приложению", autoPlay: "Автовоспроизведение видео", autoLoop: "Автоповтор видео", maxConcurrent: "Макс. одновременных загрузок", saveSettings: "Сохранить настройки", saving: "Сохранение...", backToManage: "Назад к управлению", settingsSaved: "Настройки успешно сохранены", settingsFailed: "Не удалось сохранить настройки", debugMode: "Режим отладки", debugModeDescription: "Показать или скрыть сообщения консоли (требуется обновление)", pauseOnFocusLoss: "Пауза при потере фокуса", 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: "Форматировать старые имена файлов", formatLegacyFilenamesDescription: "Пакетное переименование всех видеофайлов, миниатюр и субтитров в новый стандартный формат: Название-Автор-ГГГГ. Эта операция изменит имена файлов на диске и обновит логику базы данных.", 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: "Очистить локальный кэш миниатюр", clearing: "Очистка...", clearThumbnailCacheSuccess: "Кэш миниатюр успешно очищен. Миниатюры будут сгенерированы заново при следующем доступе.", clearThumbnailCacheError: "Не удалось очистить кэш миниатюр", clearThumbnailCacheConfirmMessage: "Это удалит все локально кэшированные миниатюры для облачных видео. Миниатюры будут сгенерированы заново из облачного хранилища при следующем доступе. Продолжить?", // 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: "Пароль был сброшен. Проверьте логи бэкенда для нового пароля.", resetPasswordDisabledInfo: "Сброс пароля отключен. Чтобы сбросить пароль, выполните следующую команду в директории бэкенда:\n\nnpm run reset-password\n\nИли:\n\nts-node scripts/reset-password.ts\n\nЭто сгенерирует новый случайный пароль и включит вход по паролю.", resetPasswordScriptGuide: "Чтобы вручную сбросить пароль, выполните следующую команду в директории бэкенда:\n\nnpm run reset-password\n\nИли:\n\nts-node scripts/reset-password.ts\n\nЕсли пароль не указан, будет сгенерирован случайный 8-символьный пароль.", waitTimeMessage: "Пожалуйста, подождите {time} перед повторной попыткой.", tooManyAttempts: "Слишком много неудачных попыток.", // Passkeys createPasskey: "Создать ключ доступа", creatingPasskey: "Создание...", passkeyCreated: "Ключ доступа успешно создан", passkeyCreationFailed: "Не удалось создать ключ доступа. Пожалуйста, попробуйте снова.", removePasskeys: "Удалить все ключи доступа", removePasskeysTitle: "Удалить все ключи доступа", removePasskeysMessage: "Вы уверены, что хотите удалить все ключи доступа? Это действие нельзя отменить.", passkeysRemoved: "Все ключи доступа удалены", passkeysRemoveFailed: "Не удалось удалить ключи доступа. Пожалуйста, попробуйте снова.", loginWithPasskey: "Войти с помощью ключа доступа", authenticating: "Аутентификация...", passkeyLoginFailed: "Ошибка аутентификации с помощью ключа доступа. Пожалуйста, попробуйте снова.", passkeyErrorPermissionDenied: "Запрос не разрешен пользовательским агентом или платформой в текущем контексте, возможно, потому что пользователь отклонил разрешение.", passkeyErrorAlreadyRegistered: "Аутентификатор был ранее зарегистрирован.", linkCopied: "Ссылка скопирована в буфер обмена", copyFailed: "Не удалось скопировать ссылку", passkeyRequiresHttps: "WebAuthn требует HTTPS или localhost. Пожалуйста, войдите в приложение через HTTPS или используйте localhost вместо IP-адреса.", passkeyWebAuthnNotSupported: "WebAuthn не поддерживается в этом браузере. Пожалуйста, используйте современный браузер с поддержкой WebAuthn.", // 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: "Коллекция", justNow: "Только что", hoursAgo: "{hours} часов назад", today: "Сегодня", thisWeek: "На этой неделе", weeksAgo: "{weeks} недель назад", // 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: "Включить Cloudflare Tunnel", cloudflaredToken: "Токен туннеля (Необязательно)", cloudflaredTokenHelper: "Вставьте сюда токен туннеля или оставьте пустым, чтобы использовать случайный быстрый туннель.", waitingForUrl: "Ожидание URL быстрого туннеля...", running: "Запущен", stopped: "Остановлен", tunnelId: "ID туннеля", accountTag: "Тег учетной записи", copied: "Скопировано!", clickToCopy: "Нажмите, чтобы скопировать", quickTunnelWarning: "URL быстрых туннелей меняются при каждом перезапуске туннеля.", managedInDashboard: "Публичное имя хоста управляется в панели управления Cloudflare Zero Trust.", failedToDownloadVideo: "Не удалось скачать видео. Пожалуйста, попробуйте снова.", failedToDownload: "Не удалось скачать. Пожалуйста, попробуйте снова.", playlistDownloadStarted: "Скачивание плейлиста началось", fromYouTube: "С YouTube", copyUrl: "Копировать URL", new: "НОВЫЙ", // Task Hooks taskHooks: "Хуки Задач", taskHooksDescription: "Выполняйте пользовательские shell-команды в определенные моменты жизненного цикла задачи. Доступные переменные окружения: MYTUBE_TASK_ID, MYTUBE_TASK_TITLE, MYTUBE_SOURCE_URL, MYTUBE_VIDEO_PATH.", taskHooksWarning: "Предупреждение: Команды выполняются с правами сервера. Используйте с осторожностью.", enterPasswordToUploadHook: "Пожалуйста, введите пароль для загрузки этого Hook-скрипта.", riskCommandDetected: "Обнаружена опасная команда: {command}. Загрузка отклонена.", hookTaskBeforeStart: "Перед Началом Задачи", hookTaskBeforeStartHelper: "Выполняется перед началом загрузки.", hookTaskSuccess: "Успех Задачи", hookTaskSuccessHelper: "Выполняется после успешной загрузки, перед облачной загрузкой/удалением (ожидает завершения).", hookTaskFail: "Сбой Задачи", hookTaskFailHelper: "Выполняется при сбое задачи.", hookTaskCancel: "Задача Отменена", hookTaskCancelHelper: "Выполняется при ручной отмене задачи.", found: "Найдено", notFound: "Не Задано", deleteHook: "Удалить Скрипт Хука", confirmDeleteHook: "Вы уверены, что хотите удалить этот скрипт хука?", uploadHook: "Загрузить .sh", disclaimerTitle: "Отказ от ответственности", disclaimerText: "1. Цель и Ограничения\nЭто программное обеспечение (включая код и документацию) предназначено исключительно для личного обучения, исследований и технического обмена. Строго запрещено использовать это программное обеспечение в коммерческих целях или для любой незаконной деятельности, нарушающей местные законы и правила.\n\n2. Ответственность\nРазработчик не знает и не контролирует, как пользователи используют это программное обеспечение. Любая юридическая ответственность, споры или ущерб, возникающие в результате незаконного или ненадлежащего использования этого программного обеспечения (включая, помимо прочего, нарушение авторских прав), возлагаются исключительно на пользователя. Разработчик не несет никакой прямой, косвенной или солидарной ответственности.\n\n3. Модификации и Распространение\nЭтот проект с открытым исходным кодом. Любое физическое лицо или организация, изменяющая или создающая форк этого кода, должна соблюдать лицензию с открытым исходным кодом. Важно: Если третья сторона изменяет код для обхода или удаления оригинальных механизмов аутентификации/безопасности пользователей и распространяет такие версии, модификатор/распространитель несет полную ответственность за любые последствия. Мы настоятельно не рекомендуем обходить или вмешиваться в любые механизмы проверки безопасности.\n\n4. Некоммерческое Заявление\nЭто полностью бесплатный проект с открытым исходным кодом. Разработчик не принимает пожертвования и никогда не публиковал страницы для пожертвований. Сама программа не предусматривает взимания платы и не предлагает платных услуг. Пожалуйста, будьте бдительны и остерегайтесь мошенничества или вводящей в заблуждение информации, утверждающей о сборе средств от имени этого проекта.", };