From a840ad4594dd3c7884bca7f6b31932089b5a7f00 Mon Sep 17 00:00:00 2001 From: Ih0rd <42423221+Ih0rd@users.noreply.github.com> Date: Fri, 6 Mar 2026 06:17:30 +0300 Subject: [PATCH] basic Russian localization --- frontend/src/i18n/locales/ru.json | 2243 +++++++++++++++++++++++++++++ 1 file changed, 2243 insertions(+) create mode 100644 frontend/src/i18n/locales/ru.json diff --git a/frontend/src/i18n/locales/ru.json b/frontend/src/i18n/locales/ru.json new file mode 100644 index 00000000..ca0d067d --- /dev/null +++ b/frontend/src/i18n/locales/ru.json @@ -0,0 +1,2243 @@ +{ + "userManagement": { + "title": "Управление пользователями", + "subtitle": "Управление администраторами и приглашениями", + "loading": "Загрузка пользователей...", + "loadError": "Не удалось загрузить пользователей. Попробуйте снова.", + "inviteUser": "Пригласить пользователя", + "createInvitation": "Создать приглашение", + "email": "Адрес электронной почты", + "emailPlaceholder": "user@example.com", + "role": "Роль", + "selectRole": "Выберите роль", + "sendInvitation": "Отправить приглашение", + "editUser": "Редактировать пользователя", + "editingUser": "Редактирование пользователя", + "saveChanges": "Сохранить изменения", + "deactivateUser": "Деактивировать пользователя", + "cancelInvitation": "Отменить приглашение", + "invitationSent": "Приглашение успешно отправлено", + "invitationError": "Не удалось отправить приглашение", + "invitationCancelled": "Приглашение отменено", + "cancelInvitationError": "Не удалось отменить приглашение", + "userUpdated": "Пользователь успешно обновлён", + "updateUserError": "Не удалось обновить пользователя", + "userDeactivated": "Пользователь успешно деактивирован", + "deactivateUserError": "Не удалось деактивировать пользователя", + "noRole": "Без роли", + "neverLoggedIn": "Ещё не входил", + "expired": "Истёкший", + "deactivate": "Деактивировать", + "cancel": "Отмена", + "tabs": { + "users": "Пользователи", + "invitations": "Приглашения" + }, + "stats": { + "totalUsers": "Всего пользователей", + "activeUsers": "Активных пользователей", + "pendingInvitations": "Ожидающих приглашений", + "inactiveUsers": "Неактивных пользователей" + }, + "status": { + "active": "Активный", + "inactive": "Неактивный" + }, + "table": { + "user": "Пользователь", + "email": "Email", + "role": "Роль", + "status": "Статус", + "lastLogin": "Последний вход", + "actions": "Действия", + "invitedBy": "Пригласил", + "expires": "Истекает" + }, + "validation": { + "emailRequired": "Email обязателен", + "emailInvalid": "Неверный формат email", + "roleRequired": "Роль обязательна" + }, + "searchUsersPlaceholder": "Поиск пользователей...", + "searchInvitationsPlaceholder": "Поиск приглашений...", + "noUsers": "Пользователи не найдены", + "noUsersFound": "Нет пользователей, соответствующих запросу", + "noInvitations": "Нет ожидающих приглашений", + "noInvitationsFound": "Нет приглашений, соответствующих запросу", + "confirmDeactivate": { + "title": "Деактивировать пользователя", + "message": "Вы уверены, что хотите деактивировать {{name}}? Они больше не смогут войти в систему." + }, + "confirmCancelInvitation": { + "title": "Отменить приглашение", + "message": "Вы уверены, что хотите отменить приглашение для {{email}}?" + } + }, + "common": { + "loading": "Загрузка...", + "error": "Ошибка", + "save": "Сохранить", + "cancel": "Отмена", + "delete": "Удалить", + "edit": "Редактировать", + "add": "Добавить", + "search": "Поиск", + "filter": "Фильтр", + "sortBy": "Сортировать по", + "yes": "Да", + "no": "Нет", + "back": "Назад", + "next": "Далее", + "previous": "Назад", + "close": "Закрыть", + "logout": "Выйти", + "menu": "Меню", + "change": "Изменить", + "remove": "Удалить", + "download": "Скачать", + "downloadAll": "Скачать все", + "uploading": "Загрузка...", + "uploaded": "Загружено", + "photo": "фото", + "photos": "фото", + "video": "видео", + "videos": "видео", + "media": "медиа", + "restore": "Восстановить", + "actions": "Действия", + "refresh": "Обновить", + "preview": "Предпросмотр", + "processing": "Обработка", + "upload": "Загрузить", + "days": "дней", + "customize": "Настроить", + "hide": "Скрыть", + "unknown": "Неизвестно", + "notSet": "Не задано", + "of": "из", + "up": "Вверх", + "select": "Выбрать", + "selected": "Выбрано", + "chunk": "Пакет", + "optional": "необязательно" + }, + "upload": { + "photoCategory": "Категория фото", + "noCategory": "Без категории", + "eventSpecific": "(Для конкретного события)", + "clickToUpload": "Нажмите для загрузки или перетащите файлы", + "fileRequirements": "JPEG, PNG или WebP (макс. 50 МБ на файл, {{limit}} файлов за загрузку)", + "fileRequirementsMedia": "Изображения JPEG, PNG или WebP, а также видео MP4/MOV/WEBM (макс. 50 МБ на файл, {{limit}} файлов за загрузку)", + "unsupportedFiles": "Некоторые файлы пропущены, так как формат не поддерживается (используйте JPEG/PNG/WebP/MP4/MOV/WEBM).", + "selectedFiles": "Выбранные файлы", + "uploading": "Загрузка...", + "uploadComplete": "Загрузка завершена!", + "uploadFailed": "Ошибка загрузки", + "someFilesFailed": "Не удалось загрузить некоторые файлы", + "uploadPhotos": "Загрузить фото", + "uploadMedia": "Загрузить фото и видео", + "importExternal": "Импортировать из внешней папки", + "externalImportInfo": "Все изображения из выбранной папки будут импортированы.", + "selectExternalFolder": "Выберите внешнюю папку в /external-media", + "importFromSelectedFolder": "Импортировать из выбранной папки", + "maxFilesReached": "Максимальное количество файлов: {{limit}}", + "someFilesSkipped": "Можно добавить ещё только {{allowed}} файла(ов) (лимит {{limit}})", + "tooManyFiles": "За один раз можно загрузить не более {{limit}} файлов", + "limitInfo": "{{selected}} из {{limit}} файлов выбрано (осталось {{remaining}})", + "limitReached": "Достигнут лимит загрузки ({{limit}} файлов за раз)", + "uploadingChunks": "Загрузка {{count}} файлов в {{total}} пакетах...", + "mediaCategory": "Категория медиа", + "uploadAction": "Загрузить {{count}} файлов" + }, + "navigation": { + "dashboard": "Панель управления", + "events": "События", + "archives": "Архивы", + "settings": "Настройки", + "eventTypes": "Типы событий", + "branding": "Брендинг", + "analytics": "Аналитика", + "emailSettings": "Настройки email", + "backup": "Резервное копирование", + "cmsPages": "Страницы CMS", + "users": "Пользователи" + }, + "archives": { + "title": "Архивы", + "subtitle": "Управление архивными фотогалереями", + "loadingArchives": "Загрузка архивов...", + "totalArchives": "Всего архивов", + "storageUsed": "Занято места", + "totalPhotos": "Всего фото", + "avgArchiveSize": "Средний размер архива", + "searchPlaceholder": "Поиск архивов...", + "allTypes": "Все типы", + "wedding": "Свадьба", + "birthday": "День рождения", + "corporate": "Корпоратив", + "other": "Прочее", + "sortByDate": "Сортировать по дате", + "sortByName": "Сортировать по имени", + "sortBySize": "Сортировать по размеру", + "tableHeaders": { + "event": "Событие", + "type": "Тип", + "archivedDate": "Дата архивации", + "size": "Размер", + "photos": "Фото", + "actions": "Действия" + }, + "noArchivesFound": "Архивы не найдены", + "eventDateNA": "Дата события: Н/Д", + "processing": "Обработка...", + "download": "Скачать", + "restore": "Восстановить", + "delete": "Удалить", + "showing": "Показано {{from}}–{{to}} из {{total}} архивов", + "page": "Страница {{current}} из {{total}}", + "storageManagement": "Управление хранилищем", + "storageInfo": "Архивы хранятся постоянно, если не удалены вручную. Рассмотрите внедрение политики хранения для управления расходами.", + "confirmRestore": "Вы уверены, что хотите восстановить этот архив? Событие снова станет активным.", + "confirmDelete": "Вы уверены, что хотите безвозвратно удалить этот архив? Это действие нельзя отменить.", + "restoreSuccess": "Архив успешно восстановлен", + "deleteSuccess": "Архив безвозвратно удалён" + }, + "auth": { + "login": "Войти", + "password": "Пароль", + "enterPassword": "Введите пароль галереи", + "passwordPlaceholder": "Введите пароль галереи", + "invalidPassword": "Неверный пароль", + "wrongPassword": "Неверный пароль. Проверьте пароль и попробуйте снова.", + "tooManyAttempts": "Слишком много неудачных попыток входа. Попробуйте позже.", + "sessionExpired": "Сессия истекла", + "pleaseEnterPassword": "Пожалуйста, введите пароль", + "passwordHint": "Пароль предоставлен организатором события. Свяжитесь с ним, если у вас его нет." + }, + "gallery": { + "title": "Фотогалерея", + "welcomeMessage": "Приветственное сообщение", + "expiresOn": "Истекает", + "expires": "Истекает", + "expired": "Истекла", + "daysRemaining": "Осталось {{days}} дней", + "dayRemaining": "Остался 1 день", + "hoursRemaining": "Осталось {{hours}} часов", + "expiredMessage": "Эта галерея истекла {{date}}", + "contactOrganizer": "Свяжитесь с организатором события, если вам нужен доступ к этим фотографиям", + "searchPhotos": "Поиск фото по имени файла...", + "sortByDate": "Сортировать по дате", + "sortByName": "Сортировать по имени", + "sortBySize": "Сортировать по размеру", + "allPhotos": "Все фото", + "filter": "Фильтр", + "feedbackFilter": "Фильтр по отзывам", + "all": "Все", + "liked": "Понравившиеся", + "favorited": "Избранные", + "favorites": "Избранное", + "downloadSelected": "Скачать выбранные ({{count}})", + "shareGallery": "Поделиться галереей", + "needHelp": "Нужна помощь? Напишите нам:", + "noPhotosFound": "Фотографии не найдены", + "failedToLoad": "Не удалось загрузить фото", + "tryAgain": "Попробовать снова", + "loading": "Загрузка галереи...", + "expiredOn": "Эта галерея истекла {{date}}.", + "expiresIn": "Галерея истекает через {{count}} день", + "expiresIn_plural": "Галерея истекает через {{count}} дней", + "downloadBefore": "Скачайте ваши фото, пока они ещё доступны.", + "publicGalleryTitle": "Эта галерея доступна публично", + "publicGallerySubtitle": "Загрузка фотографий...", + "viewGallery": "Просмотреть галерею", + "downloadAll": "Скачать все", + "downloading": "Скачивание {{count}} фото...", + "downloading_plural": "Скачивание {{count}} фото...", + "downloadedPhotos": "Скачано {{count}} фото!", + "downloadedPhotos_plural": "Скачано {{count}} фото!", + "downloadError": "Не удалось скачать некоторые фото", + "selectPhotos": "Выбрать фото", + "cancelSelection": "Отменить выбор", + "photosSelected": "{{count}} выбрано", + "selectAll": "Выбрать все", + "deselectAll": "Снять выбор", + "deleteSelected": "Удалить выбранные", + "photosCount": "{{count}} фото", + "photosCount_plural": "{{count}} фото", + "searchByFilename": "Поиск по имени файла...", + "uncategorized": "Без категории", + "sortAscending": "По возрастанию", + "sortDescending": "По убыванию", + "remaining": "осталось", + "selectPhotosHint": "Совет: используйте Ctrl+Click (Cmd+Click на Mac) для быстрого выбора нескольких фото", + "filters": "Фильтры", + "openFilters": "Открыть фильтры", + "toggleSidebar": "Переключить боковую панель", + "toggleMenu": "Переключить меню", + "allCategories": "Все категории", + "categories": "Категории", + "mediaType": "Медиа", + "allMedia": "Все медиа", + "photosOnly": "Фото", + "videosOnly": "Видео", + "download": "Скачать", + "noMedia": "Медиафайлы ещё не загружены", + "searchPlaceholder": "Поиск фото...", + "sortBy": "Сортировать", + "sortByCaptureDate": "Сортировать по дате съёмки", + "sortByRating": "Сортировать по рейтингу", + "photoGallery": "Фотогалерея", + "photos": "Фотографии", + "allRightsReserved": "Все права защищены", + "searchMemories": "Поиск воспоминаний...", + "thankYou": "Спасибо", + "thankYouMessage": "За то, что были частью нашей истории и сделали этот особый день незабываемым.", + "feedback": { + "title": "Отзыв", + "shareThoughts": "Поделитесь мнением о «{{name}}»", + "rateThisMoment": "Оцените этот момент", + "comments": "Комментарии", + "noComments": "Комментариев пока нет. Будьте первым!", + "yourName": "Ваше имя", + "yourEmail": "Ваш email", + "writeLovelyNote": "Напишите тёплые слова...", + "postComment": "Оставить комментарий", + "anonymous": "Аноним" + } + }, + "categories": { + "title": "Категории фото", + "global": "Глобальные категории", + "eventSpecific": "Категории конкретного события", + "addCategory": "Добавить категорию", + "organizationInfo": "Организуйте фотографии по категориям. Категории помогают гостям ориентироваться и находить нужные снимки.", + "eventSpecificCategories": "Категории конкретного события", + "noEventSpecificCategories": "Нет категорий для этого события. По умолчанию доступны глобальные категории.", + "globalCategoriesAlwaysAvailable": "Глобальные категории (всегда доступны):", + "deleteCategoryTitle": "Удалить категорию", + "categoryCreatedSuccess": "Категория успешно создана", + "categoryDeletedSuccess": "Категория успешно удалена", + "failedToCreateCategory": "Не удалось создать категорию", + "failedToDeleteCategory": "Не удалось удалить категорию", + "categoryName": "Название категории", + "noCategory": "Без категории", + "noCategoriesYet": "Категорий пока нет. Создайте первую категорию для организации фото.", + "deleteConfirm": "Вы уверены, что хотите удалить «{{name}}»?", + "cannotDelete": "Нельзя удалить категорию с фотографиями. Сначала переназначьте фото.", + "setCoverPhoto": "Установить обложку", + "removeCoverPhoto": "Убрать обложку", + "coverPhotoSet": "Обложка успешно установлена", + "coverPhotoRemoved": "Обложка удалена", + "failedToSetCoverPhoto": "Не удалось установить обложку", + "categoryHeroHint": "Если обложка для категории не задана, будет использоваться стандартное главное фото." + }, + "events": { + "title": "События", + "create": "Создать", + "createEvent": "Создать событие", + "totalViews": "Всего просмотров", + "totalDownloads": "Всего скачиваний", + "uniqueVisitors": "Уникальных посетителей", + "createNewEvent": "Создать новое событие", + "setupNewGallery": "Настройте новую фотогалерею для вашего события", + "createNewEventSubtitle": "Настройте новую фотогалерею для вашего события", + "eventNamePlaceholder": "например, Свадьба Ивана и Марии", + "welcomeMessageOptional": "Приветственное сообщение (необязательно)", + "welcomeMessagePlaceholder": "Добро пожаловать на наш особый день! Скачивайте и делитесь этими воспоминаниями...", + "hostEmailPlaceholder": "client@example.com", + "adminEmailPlaceholder": "admin@example.com", + "securityAndAccess": "Безопасность и доступ", + "accessAndSecurity": "Доступ и безопасность", + "enterPassword": "Введите пароль", + "passwordPlaceholder": "Введите надёжный пароль", + "confirmPasswordPlaceholder": "Подтвердите пароль", + "galleryExpiresOn": "Галерея истекает {{date}}", + "guestsWillReceiveWarning": "Гости получат предупреждение по email за 7 дней до истечения.", + "types": { + "wedding": "Свадьба", + "birthday": "День рождения", + "corporate": "Корпоратив", + "other": "Прочее" + }, + "themes": { + "default": "По умолчанию", + "oceanBlue": "Океанский синий", + "royalPurple": "Королевский фиолетовый", + "roseGold": "Розовое золото", + "sunsetAmber": "Закатный янтарь" + }, + "eventDetails": "Детали события", + "eventName": "Название события", + "eventType": "Тип события", + "eventDate": "Дата события", + "hostEmail": "Email клиента", + "hostName": "Имя клиента", + "hostNamePlaceholder": "Иван Иванов", + "adminEmail": "Email администратора", + "adminNotificationEmail": "Email для уведомлений администратора", + "expirationDate": "Дата истечения", + "active": "Активный", + "archived": "В архиве", + "photoCount": "{{count}} фото", + "totalSize": "Общий размер", + "shareLink": "Ссылка для доступа", + "copyLink": "Копировать ссылку", + "linkCopied": "Ссылка скопирована!", + "viewGallery": "Просмотреть галерею", + "uploadPhotos": "Загрузить фото", + "archiveEvent": "Архивировать событие", + "archiveConfirm": "Вы уверены, что хотите архивировать это событие? Это действие нельзя отменить.", + "extendExpiration": "Продлить на {{days}} дней", + "backToEvents": "Назад к событиям", + "loadingEventDetails": "Загрузка деталей события...", + "saveChanges": "Сохранить изменения", + "eventExpired": "Это событие истекло", + "eventExpiresIn": "Это событие истекает через {{days}} дней", + "guestsNoAccess": "Гости больше не могут получить доступ к галерее. Рассмотрите архивирование события.", + "warningEmailsSent": "Предупреждающие письма отправлены клиенту.", + "overview": "Обзор", + "photos": "Фотографии", + "categories": "Категории", + "eventInformation": "Информация о событии", + "sourceMode": "Режим источника", + "sourceModeManaged": "Управляемый (загрузка в PicPeak)", + "sourceModeReference": "Ссылка на внешнюю папку", + "sourceModeHelp": "Используйте управляемый режим для прямой загрузки или укажите примонтированную папку /external-media при использовании локального хранилища.", + "externalFolder": "Внешняя папка", + "externalFolderHint": "Эти папки считываются из монтирования /external-media внутри контейнера или на хосте.", + "externalFolderRequired": "Выберите внешнюю папку перед сохранением.", + "welcomeMessage": "Приветственное сообщение", + "noWelcomeMessage": "Приветственное сообщение не задано", + "created": "Создано", + "expires": "Истекает", + "shareWithGuests": "Поделитесь этой ссылкой с гостями. Им понадобится пароль для доступа к галерее.", + "shareWithGuestsPublic": "Поделитесь этой ссылкой с гостями. Пароль для этой галереи не требуется.", + "resetGalleryPassword": "Сбросить пароль галереи", + "resendCreationEmail": "Отправить письмо о создании повторно", + "creationEmailResent": "Письмо о создании поставлено в очередь отправки", + "failedToResendEmail": "Не удалось повторно отправить письмо о создании", + "photoStatistics": "Статистика фото", + "totalPhotos": "Всего фото", + "managePhotos": "Управление фото", + "actions": "Действия", + "archivingInfo": "При архивировании будет создан ZIP-файл всех фотографий, и галерея станет недоступна публично.", + "statistics": "Статистика", + "views": "Просмотры", + "downloads": "Скачивания", + "noStatistics": "Статистика пока недоступна", + "archiveStatus": "Статус архива", + "archivedOn": "Архивировано", + "downloadArchive": "Скачать архив", + "loadingPhotos": "Загрузка фото...", + "photoCategories": "Категории фото", + "organizeCategoriesInfo": "Организуйте фотографии по категориям. Категории помогают гостям ориентироваться и находить нужные снимки.", + "categoriesTip": "Совет: категории привязаны к событию. Создавайте пользовательские категории, например «Церемония», «Банкет», «Портреты».", + "contactInformation": "Контактная информация", + "hostEmailHelp": "Клиент будет получать уведомления о создании и истечении галереи", + "adminEmailHelp": "Будет получать системные уведомления и подтверждения архивирования", + "securityAccess": "Безопасность и доступ", + "galleryPassword": "Пароль галереи", + "requirePasswordToggle": "Требовать пароль для этой галереи", + "requirePasswordToggleHelp": "Отключите, если хотите открыть галерею без пароля. Любой, у кого есть ссылка, сможет просматривать фото.", + "publicGalleryWarning": "Публичные галереи доступны всем, у кого есть ссылка. Рассмотрите включение водяных знаков и мониторинга активности.", + "passwordHelperText": "Можно использовать даты, например «04.07.2025», или любой текст из 6+ символов", + "confirmPassword": "Подтвердить пароль", + "showPasswords": "Показать пароли", + "newPasswordLabel": "Новый пароль галереи", + "gallerySettings": "Настройки галереи", + "themeAndStyle": "Тема и стиль", + "colorTheme": "Цветовая тема", + "galleryExpiration": "Срок действия галереи", + "galleryExpiresIn": "Галерея истекает через", + "daysAfterEvent": "дней после даты события", + "expiresOn": "Истекает", + "galleryWillExpireOn": "Галерея истечёт {{date}}", + "expirationWarning": "Гости получат предупреждение по email за 7 дней до истечения.", + "noExpiration": "Без срока действия", + "noExpirationHelp": "Эта галерея будет активна до ручного архивирования.", + "userUploads": "Настройки загрузки пользователями", + "allowUserUploads": "Разрешить гостям загружать фото", + "allowUserUploadsHelp": "Разрешить гостям загружать собственные фотографии в эту галерею", + "allowUserUploadsDescription": "Разрешить гостям загружать собственные фотографии в эту галерею", + "uploadCategory": "Категория загрузки", + "selectCategory": "Выберите категорию для загрузок пользователей", + "uploadCategoryHelp": "Все загружаемые гостями фото будут добавлены в эту категорию", + "userUploadWarning": "Загрузки пользователей проверяются и могут быть удалены администраторами в любое время.", + "allowDownloads": "Разрешить скачивание фото", + "allowDownloadsHelp": "Разрешить гостям скачивать фотографии из этой галереи", + "downloadPermissions": "Разрешения на скачивание", + "downloadsEnabled": "Скачивание разрешено", + "downloadsDisabled": "Скачивание запрещено", + "downloadProtection": "Защита от скачивания", + "disableRightClick": "Заблокировать контекстное меню", + "watermarkDownloads": "Добавлять водяной знак при скачивании", + "enableDevtoolsProtection": "Обнаруживать инструменты разработчика", + "useCanvasRendering": "Рендеринг через Canvas (расширенная защита)", + "protectionInfo": "Средства защиты помогают предотвратить несанкционированное скачивание, но не могут заблокировать все методы.", + "protectionLevelBasic": "Базовый — только блокировка правой кнопки", + "protectionLevelStandard": "Стандартный — блокировка горячих клавиш", + "protectionLevelEnhanced": "Улучшенный — обнаружение PrintScreen", + "protectionLevelMaximum": "Максимальный — обнаружение DevTools и рендеринг Canvas", + "heroLogoSettings": "Настройки логотипа на главном баннере", + "heroLogoVisible": "Показывать логотип в баннере", + "heroLogoSize": "Размер логотипа", + "heroLogoSizeSmall": "Маленький", + "heroLogoSizeMedium": "Средний", + "heroLogoSizeLarge": "Большой", + "heroLogoSizeXLarge": "Очень большой", + "heroLogoPosition": "Положение логотипа", + "heroLogoPositionTop": "Сверху (над заголовком)", + "heroLogoPositionCenter": "По центру (между заголовком и датами)", + "heroLogoPositionBottom": "Снизу (под датами)", + "heroLogoInfo": "Эти настройки применяются, когда галерея использует макет «Баннер». Можно скрыть логотип или настроить его размер и положение.", + "eventCustomLogo": "Пользовательский логотип события", + "eventCustomLogoDescription": "Загрузите пользовательский логотип для этого события. Он заменит глобальный логотип брендинга только для этой галереи.", + "uploadEventLogo": "Загрузить логотип", + "replaceLogo": "Заменить", + "removeLogo": "Удалить", + "eventLogoUploaded": "Логотип события успешно загружен", + "eventLogoUploadFailed": "Не удалось загрузить логотип события", + "eventLogoRemoved": "Логотип события успешно удалён", + "eventLogoRemoveFailed": "Не удалось удалить логотип события", + "heroLogoVisibleLabel": "Логотип виден", + "heroLogoSizeLabel": "Размер", + "heroLogoPositionLabel": "Положение", + "heroLogoHidden": "Логотип скрыт", + "heroPhoto": "Главное фото", + "heroPhotoHelp": "Выберите главное фото галереи по умолчанию. Можно переопределить для каждой категории.", + "selectHeroPhoto": "Выбрать главное фото", + "noHeroPhotoSelected": "Главное фото не выбрано", + "heroPhotoSelected": "Главное фото выбрано", + "heroImageAnchor": "Позиция обрезки главного фото", + "heroImageAnchorDescription": "Нажмите на изображение, чтобы задать точку фокуса для обрезки.", + "heroImageAnchorTop": "Сверху", + "heroImageAnchorCenter": "По центру", + "heroImageAnchorBottom": "Снизу", + "heroPreview": "Предпросмотр баннера", + "noPhotosAvailable": "Фотографии недоступны", + "processingRequest": "Обработка запроса...", + "eventTypeWedding": "Свадьба", + "eventTypeBirthday": "День рождения", + "eventTypeCorporate": "Корпоратив", + "eventTypeOther": "Прочее", + "days30": "30 дней", + "days60": "60 дней", + "days90": "90 дней", + "days365": "1 год", + "inactive": "Неактивный", + "expired": "Истёк", + "daysLeft": "(осталось {{count}} день)", + "daysLeft_plural": "(осталось {{count}} дней)", + "subtitle": "Управляйте своими фотогалереями и событиями", + "loadingEvents": "Загрузка событий...", + "failedToLoadEvents": "Не удалось загрузить события", + "tryAgain": "Попробовать снова", + "bulkArchiveSuccess": "Успешно архивировано {{count}} событий", + "bulkArchivePartial": "Архивировано {{success}} событий, {{failed}} не удалось", + "searchEventsPlaceholder": "Поиск событий...", + "all": "Все", + "expiring": "Истекающие", + "eventsSelected": "{{count}} событие выбрано", + "eventsSelected_plural": "{{count}} событий выбрано", + "clear": "Очистить", + "archiveSelected": "Архивировать выбранные", + "publicAccess": "Открытый доступ", + "passwordProtected": "Защищено паролем", + "newPasswordRequired": "Установите пароль перед включением защиты.", + "event": "Событие", + "type": "Тип", + "date": "Дата", + "status": "Статус", + "noEventsFound": "События не найдены", + "stats": { + "totalEvents": "Всего событий", + "activeEvents": "Активных событий", + "totalPhotos": "Всего фото", + "expiringEvents": "Скоро истекают" + }, + "viewDetails": "Подробнее", + "archiveEventAction": "Архивировать событие", + "downloadArchiveAction": "Скачать архив", + "deleteEvent": "Удалить событие", + "deleteEventConfirm": "Вы уверены, что хотите удалить это событие?", + "downloadArchiveSoon": "Скачивание архива скоро появится", + "eventExpiredMessage": "Это событие истекло", + "guestsCannotAccessGallery": "Гости больше не могут получить доступ к галерее. Рассмотрите архивирование события.", + "warningEmailsHaveBeenSent": "Предупреждающие письма отправлены клиенту.", + "extendSevenDays": "Продлить на 7 дней", + "welcomeMessageLabel": "Приветственное сообщение", + "noWelcomeMessageSet": "Приветственное сообщение не задано", + "createdOn": "Создано", + "copy": "Копировать", + "copied": "Скопировано!", + "organizingPhotosInfo": "Организуйте фотографии по категориям. Это помогает гостям ориентироваться.", + "archiveStatusTitle": "Статус архива", + "downloadingArchive": "Скачивание архива {{name}}...", + "downloadStarted": "Скачивание началось", + "failedToDownloadArchive": "Не удалось скачать архив", + "statisticsNotAvailable": "Статистика пока недоступна", + "photoFilters": "Фильтры фото", + "noStatisticsAvailableYet": "Статистика пока недоступна", + "addPlus": "Добавить+", + "galleryTheme": "Тема галереи", + "customizeTheme": "Настроить тему", + "noThemeSet": "Тема не настроена", + "customizingTheme": "Настройка темы галереи", + "customizingThemeFor": "Настройка темы для {{event}}", + "customCssTemplate": "Пользовательский CSS-шаблон", + "customCssTemplateDesc": "Примените пользовательский CSS-шаблон для уникального оформления галереи.", + "noTemplate": "Без шаблона", + "useThemeOnly": "Только пресет темы", + "customTemplate": "Пользовательский шаблон", + "rename": { + "button": "Переименовать", + "title": "Переименовать событие", + "validating": "Проверка нового имени...", + "renamingFiles": "Переименование файлов...", + "complete": "Готово!", + "failed": "Ошибка переименования", + "filesRenamed": "Обновлено {{count}} файлов", + "confirm": "Переименовать событие" + } + }, + "settings": { + "title": "Системные настройки", + "subtitle": "Настройка общесистемных параметров и предпочтений", + "loadingSettings": "Загрузка настроек...", + "general": { + "title": "Основные", + "siteConfiguration": "Конфигурация сайта", + "siteUrl": "URL сайта", + "siteUrlHelp": "Используется для генерации ссылок галереи в письмах", + "defaultExpiration": "Срок действия по умолчанию (дней)", + "defaultExpirationHelp": "Как долго галереи остаются активными по умолчанию", + "maxFileSize": "Макс. размер файла (МБ)", + "maxFileSizeHelp": "Максимальный размер загружаемого фото", + "maxFilesPerUpload": "Макс. файлов за загрузку", + "maxFilesPerUploadHelp": "Максимальное количество фото за одну загрузку (1–{{max}}).", + "allowedFileTypes": "Допустимые типы файлов", + "allowedFileTypesHelp": "Расширения файлов через запятую", + "featureToggles": "Функциональные переключатели", + "enableAnalytics": "Включить отслеживание аналитики", + "enableRegistration": "Разрешить самостоятельную регистрацию администраторов", + "enableShortGalleryUrls": "Использовать короткие URL галереи", + "enableShortGalleryUrlsHelp": "Убирает slug события из новых ссылок, сохраняя работоспособность существующих.", + "maintenanceMode": "Включить режим обслуживания", + "language": "Язык", + "defaultLanguage": "Язык по умолчанию", + "defaultLanguageHelp": "Язык, отображаемый гостям до входа", + "defaultWelcomeMessage": "Приветственное сообщение по умолчанию", + "welcomeMessage": "Приветственное сообщение", + "welcomeMessagePlaceholder": "Введите приветственное сообщение по умолчанию для писем о создании галереи", + "welcomeMessageHelp": "Это сообщение будет включено во все письма о создании галереи, если не переопределено при создании события", + "saveSettings": "Сохранить основные настройки", + "saveGeneralSettings": "Сохранить основные настройки", + "dateTimeFormat": "Формат даты и времени", + "dateFormat": "Формат даты", + "dateFormatHelp": "Как отображаются даты в письмах и интерфейсе", + "accountSection": "Аккаунт администратора", + "accountUsername": "Имя администратора", + "accountUsernameHelp": "Отображается в панели администратора и в журналах активности.", + "accountUsernameRequired": "Имя пользователя обязательно", + "accountUsernameLength": "Имя пользователя должно содержать не менее 3 символов", + "accountEmail": "Email администратора", + "accountEmailHelp": "Используется для входа и получения уведомлений безопасности.", + "accountEmailRequired": "Адрес электронной почты обязателен", + "accountEmailInvalid": "Введите корректный адрес электронной почты", + "accountSaveButton": "Сохранить данные аккаунта", + "accountSaveSuccess": "Данные аккаунта обновлены" + }, + "publicSite": { + "tabLabel": "Публичный сайт", + "badge": "Публичная страница", + "title": "Публичная страница", + "subtitle": "Опубликуйте настроенную страницу для гостей, посещающих ваш домен.", + "loading": "Загрузка настроек публичного сайта...", + "enabled": "Включено", + "disabled": "Отключено", + "htmlLabel": "HTML публичной страницы", + "htmlPlaceholder": "Введите HTML-разметку для баннера, секций и призывов к действию вашей страницы.", + "htmlHelp": "HTML очищается при сохранении. Небезопасные теги, инлайн-скрипты и запрещённые атрибуты удаляются автоматически. Токены вида {{company_name}}, {{company_tagline}} и {{support_email}} заменяются значениями из настроек брендинга.", + "cssLabel": "Пользовательский CSS", + "cssPlaceholder": "Необязательные CSS-переопределения для настройки макета, цветов или типографики.", + "cssHelp": "Импорты и JavaScript-URL удаляются. Используйте стандартные CSS-селекторы для переопределения стилей.", + "saveCta": "Сохранить публичный сайт", + "saving": "Сохранение...", + "saveSuccess": "Настройки публичного сайта сохранены.", + "saveError": "Не удалось сохранить настройки публичного сайта.", + "resetCta": "Сбросить до умолчания", + "resetting": "Сброс...", + "resetSuccess": "Шаблон публичного сайта сброшен до умолчания.", + "resetError": "Не удалось сбросить шаблон публичного сайта.", + "previewTitle": "Живой предпросмотр", + "previewSandboxed": "Изолированный предпросмотр", + "previewDisabled": "Включите публичный сайт для просмотра предпросмотра.", + "sanitizationNotice": "Скрипты, iframe и небезопасные атрибуты удаляются перед публикацией. Разрешены только безопасные HTML, ссылки и изображения.", + "htmlRequired": "Добавьте HTML-контент перед включением публичного сайта." + }, + "storage": { + "title": "Хранилище", + "overview": "Обзор хранилища", + "totalUsed": "Всего использовано", + "archiveStorage": "Хранилище архивов", + "storageLimit": "Лимит хранилища", + "storageLimitHelper": "Задайте лимит использования хранилища. Лимит информационный и подсветится при достижении.", + "softLimitInputLabel": "Лимит (ГБ)", + "softLimitHelper": "Введите желаемый максимум использования в гигабайтах.", + "recommendedSoftLimit": "Рекомендуемый лимит", + "diskCapacity": "Ёмкость диска", + "diskCapacityReported": "Ёмкость диска (отчётная)", + "diskAvailable": "Доступно", + "diskAvailableReported": "Доступно (отчётное)", + "diskFree": "Свободно", + "diskFreeReported": "Свободно (отчётное)", + "diskMetricsUnavailable": "Метрики диска недоступны в Docker Desktop или виртуализированных средах.", + "applyRecommended": "Использовать рекомендуемое", + "applyAvailable": "Совпасть с доступным", + "invalidSoftLimit": "Введите корректное число для лимита.", + "saveSoftLimit": "Сохранить лимит", + "limitNotEnforced": "Этот лимит является лишь информационным и не применяется автоматически.", + "overrideTitle": "Ручное переопределение ёмкости", + "diskOverrideEnvNote": "Ёмкость диска управляется переменными среды и не может быть изменена здесь.", + "diskOverrideSettingsHelp": "Задайте пользовательские значения ёмкости, если Docker сообщает нереалистичные данные.", + "overrideCapacityLabel": "Общая ёмкость (ГБ)", + "overrideCapacityHelper": "Оставьте пустым для автоматического определения.", + "overrideAvailableLabel": "Доступное место (ГБ)", + "overrideAvailableHelper": "Необязательно. Оставьте пустым для вычисления из общей ёмкости минус занятое место.", + "saveOverride": "Сохранить переопределение ёмкости", + "capacityRequiredForAvailable": "Введите общую ёмкость перед указанием доступного места.", + "availableExceedsCapacity": "Доступное место не может превышать общую ёмкость.", + "storageUsage": "Использование хранилища", + "storageByEvent": "Хранилище по событиям", + "storageManagement": "Управление хранилищем", + "storageManagementHelp": "Рассмотрите архивирование или удаление старых событий для освобождения места. Архивированные события сжаты и занимают меньше места.", + "noEventsUsingStorage": "События, использующие хранилище, не найдены", + "unlimited": "Без ограничений" + }, + "security": { + "title": "Безопасность", + "passwordSettings": "Настройки пароля", + "minPasswordLength": "Минимальная длина пароля", + "minPasswordLengthHelp": "Минимальное количество символов для паролей галерей", + "passwordComplexity": "Сложность пароля", + "passwordComplexityHelp": "Требуемый уровень безопасности паролей галерей", + "complexitySimple": "Простой (6+ символов, любой текст)", + "complexityModerate": "Умеренный (8+ символов, смешанный регистр/цифры)", + "complexityStrong": "Сильный (12+ символов, верхний/нижний регистр/цифры)", + "complexityVeryStrong": "Очень сильный (12+ символов, все типы символов)", + "sessionAuth": "Сессия и аутентификация", + "sessionTimeout": "Таймаут сессии (минут)", + "sessionTimeoutHelp": "Таймаут сессии администратора в минутах", + "maxLoginAttempts": "Макс. попыток входа", + "maxLoginAttemptsHelp": "Максимальное количество неудачных попыток входа с одного IP перед блокировкой", + "attemptWindowMinutes": "Окно попыток (минут)", + "attemptWindowMinutesHelp": "Период для подсчёта неудачных попыток входа", + "lockoutDurationMinutes": "Длительность блокировки (минут)", + "lockoutDurationMinutesHelp": "Как долго галерея или аккаунт остаётся заблокированным после слишком многих неудач", + "enable2FA": "Включить двухфакторную аутентификацию для администраторов", + "recaptchaSettings": "Настройки reCAPTCHA", + "enableRecaptcha": "Включить reCAPTCHA для форм входа", + "siteKey": "Ключ сайта", + "siteKeyHelp": "Ваш публичный ключ reCAPTCHA v2", + "secretKey": "Секретный ключ", + "secretKeyHelp": "Ваш секретный ключ reCAPTCHA v2 (храните в тайне)", + "recaptchaHelp": "Получите ключи reCAPTCHA на", + "saveSettings": "Сохранить настройки безопасности", + "saveSecuritySettings": "Сохранить настройки безопасности" + }, + "categories": { + "title": "Категории", + "about": "О категориях фото", + "aboutText": "Глобальные категории доступны для всех событий. Можно также создавать категории для конкретных событий при их редактировании. Категории помогают организовывать фото и фильтровать их в галерее." + }, + "systemStatus": { + "title": "Статус системы", + "storageOverview": "Обзор хранилища", + "systemInfo": "Системная информация", + "databaseInfo": "Информация о базе данных", + "platform": "Платформа", + "nodeVersion": "Версия Node", + "uptime": "Время работы", + "cpuCores": "Ядра CPU", + "memoryUsage": "Использование памяти", + "memoryUsed": "Использовано памяти", + "photos": "Фото", + "admins": "Администраторы", + "dbSize": "Размер БД", + "services": "Фоновые службы", + "fileWatcher": "Наблюдатель файлов", + "fileWatcherDesc": "Отслеживает новые фото", + "expirationChecker": "Проверка истечения", + "expirationCheckerDesc": "Архивирует истёкшие галереи", + "emailProcessor": "Обработчик email", + "emailProcessorDesc": "Отправляет письма из очереди", + "emailQueue": "Статус очереди email", + "pending": "В ожидании", + "sent": "Отправлено", + "failed": "Ошибка", + "lastUpdate": "Последнее обновление" + }, + "updateNotifications": { + "title": "Уведомления об обновлениях", + "description": "Получайте уведомления по email о новых версиях PicPeak.", + "enableEmails": "Включить email-уведомления", + "enableEmailsDesc": "Отправлять письма администраторам при появлении новой версии", + "recipients": "Получатели", + "recipientsPlaceholder": "admin@example.com, other@example.com", + "recipientsHelper": "Email-адреса через запятую. Оставьте пустым для отправки всем администраторам.", + "lastNotified": "Последнее уведомление отправлено для версии: {{version}}", + "checkNow": "Проверить и уведомить", + "sendTest": "Отправить тестовое письмо", + "saved": "Настройки сохранены", + "saveError": "Не удалось сохранить настройки", + "emailSent": "Уведомление отправлено {{count}} получателям", + "emailFailed": "Не удалось отправить уведомление", + "checkSuccess": "Уведомление отправлено о новой версии", + "checkNoAction": "Уведомление не нужно: {{reason}}", + "checkError": "Не удалось проверить обновления" + }, + "events": { + "title": "Создание событий", + "requiredFields": "Обязательные поля", + "requiredFieldsDescription": "Настройте, какие контактные поля обязательны при создании событий.", + "requireCustomerName": "Требовать имя клиента", + "requireCustomerNameHelp": "Имя клиента должно быть указано для новых событий", + "requireCustomerEmail": "Требовать email клиента", + "requireCustomerEmailHelp": "Email клиента должен быть указан для новых событий", + "customerEmailWarning": "Необходим для отправки приглашений в галерею", + "requireAdminEmail": "Требовать email администратора", + "requireAdminEmailHelp": "Email администратора должен быть указан для новых событий", + "adminEmailWarning": "Необходим для получения уведомлений о событиях", + "requireEventDate": "Требовать дату события", + "requireEventDateHelp": "Дата события должна быть указана при создании", + "eventDateWarning": "URL галерей будут использовать случайные идентификаторы вместо дат", + "requireExpiration": "Требовать дату истечения", + "requireExpirationHelp": "Галереи должны иметь дату истечения", + "expirationWarning": "Галереи без срока действия будут активны до ручного архивирования", + "saveSettings": "Сохранить настройки событий", + "noteTitle": "Примечание", + "noteText": "Эти настройки влияют только на создание новых событий. Существующие события не затрагиваются. По умолчанию все поля обязательны." + }, + "imageSecurity": { + "title": "Защита изображений", + "saveSuccess": "Настройки безопасности изображений сохранены", + "saveError": "Не удалось сохранить настройки", + "loadError": "Не удалось загрузить настройки безопасности изображений", + "defaultProtection": "Настройки защиты по умолчанию", + "defaultProtectionHelp": "Эти настройки применяются ко всем новым событиям. Отдельные события могут их переопределить.", + "protectionLevel": "Уровень защиты по умолчанию", + "imageQuality": "Качество изображений по умолчанию", + "fragmentationLevel": "Уровень фрагментации", + "enableDevtools": "Включить обнаружение DevTools по умолчанию", + "enableCanvas": "Включить рендеринг Canvas по умолчанию (расширенная защита)", + "rateLimiting": "Ограничение скорости", + "rateLimitingHelp": "Ограничьте количество запросов изображений для предотвращения парсинга.", + "requestsPerMinute": "Запросов в минуту", + "requestsPer5Minutes": "Запросов за 5 минут", + "requestsPerHour": "Запросов в час", + "securityMonitoring": "Мониторинг безопасности", + "suspiciousThreshold": "Порог подозрительной активности", + "autoBlockThreshold": "Порог автоблокировки", + "enableMonitoring": "Включить мониторинг безопасности", + "blockSuspiciousIps": "Автоматически блокировать подозрительные IP", + "logEvents": "Записывать события безопасности в базу данных", + "infoTitle": "О защите изображений", + "infoText": "Эти функции защиты помогают предотвратить случайное скачивание, но не могут заблокировать все методы. Целеустремлённые пользователи могут найти способы захвата изображений. Для комплексной защиты рассмотрите использование водяных знаков и юридических соглашений." + }, + "moderation": { + "title": "Модерация", + "wordFilters": "Фильтры слов", + "description": "Управление словами, которые должны быть отфильтрованы в комментариях", + "addFilter": "Добавить фильтр", + "enterWord": "Введите слово для фильтрации", + "searchFilters": "Поиск фильтров...", + "filterAdded": "Фильтр слова успешно добавлен", + "filterExists": "Этот фильтр слова уже существует", + "addError": "Не удалось добавить фильтр слова", + "filterUpdated": "Фильтр слова успешно обновлён", + "updateError": "Не удалось обновить фильтр слова", + "filterDeleted": "Фильтр слова успешно удалён", + "deleteError": "Не удалось удалить фильтр слова", + "wordRequired": "Введите слово для фильтрации", + "confirmDelete": "Вы уверены, что хотите удалить этот фильтр слова?", + "loading": "Загрузка фильтров слов...", + "noMatchingFilters": "Соответствующие фильтры не найдены", + "noFilters": "Фильтры слов ещё не настроены", + "severityLow": "Низкий", + "severityModerate": "Умеренный", + "severityHigh": "Высокий", + "severityBlock": "Блокировать", + "severityLevels": "Уровни серьёзности", + "lowDescription": "Слово помечается для проверки, но не блокируется автоматически", + "moderateDescription": "Комментарий требует ручного одобрения перед публикацией", + "highDescription": "Комментарий автоматически скрывается и требует проверки администратора", + "blockDescription": "Комментарий немедленно отклоняется и не может быть отправлен" + }, + "styling": { + "title": "Пользовательский CSS" + }, + "seo": { + "title": "SEO и роботы", + "indexingTitle": "Индексирование поисковыми системами", + "allowIndexing": "Разрешить индексирование поисковыми системами", + "allowIndexingHelp": "При отключении все боты блокируются через robots.txt. Рекомендуется отключить для закрытых фотоплатформ.", + "sitemapUrl": "URL карты сайта", + "sitemapUrlHelp": "Необязательно. Добавляется в robots.txt если указано.", + "aiBlockingTitle": "Блокировка ИИ и ботов", + "blockAiCrawlers": "Блокировать ИИ-краулеры", + "blockAiCrawlersHelp": "Запретить ботам для обучения ИИ доступ к вашему контенту.", + "blockedAgents": "Заблокированные ИИ-агенты", + "addAgentPlaceholder": "Введите имя агента...", + "blockSocialBots": "Блокировать ботов социальных сетей", + "blockSocialBotsHelp": "Запретить предпросмотр ссылок в Twitter, Facebook, LinkedIn и др.", + "metaTagsTitle": "Мета-теги и пользовательские правила", + "metaNoindex": "Добавить мета-тег noindex", + "metaNoindexHelp": "Запрещает поисковым системам индексировать страницы (уровень HTML, дополняет robots.txt).", + "metaNofollow": "Добавить мета-тег nofollow", + "metaNofollowHelp": "Запрещает поисковым системам переходить по ссылкам на страницах.", + "metaNoai": "Добавить мета-тег noai/noimageai", + "metaNoaiHelp": "Сигнализирует, что контент не должен использоваться для обучения ИИ.", + "customRules": "Пользовательские правила robots.txt", + "ruleAgentPlaceholder": "User-agent", + "rulePathPlaceholder": "Запрещённый путь", + "showPreview": "Показать предпросмотр robots.txt", + "hidePreview": "Скрыть предпросмотр robots.txt", + "saveSettings": "Сохранить настройки SEO" + }, + "analytics": { + "title": "Аналитика", + "umamiIntegration": "Интеграция с Umami Analytics", + "enableUmami": "Включить Umami Analytics", + "umamiUrl": "URL Umami", + "umamiUrlHelp": "URL вашего экземпляра Umami (например, https://analytics.yourdomain.com)", + "websiteId": "ID сайта", + "websiteIdHelp": "Ваш ID сайта в Umami (находится в панели Umami)", + "shareUrl": "URL для шаринга (необязательно)", + "shareUrlHelp": "Публичный URL для встраивания полной панели (создаётся в Umami)", + "umamiInfo": "О Umami Analytics", + "umamiInfoText": "Umami — это аналитическая платформа с акцентом на приватность, работающая без куки.", + "learnMore": "Узнать больше о Umami", + "saveAnalyticsSettings": "Сохранить настройки аналитики", + "backendAnalytics": "Серверная аналитика", + "backendAnalyticsText": "Система также отслеживает базовую аналитику на стороне сервера для мониторинга безопасности и производительности.", + "tracked": "Отслеживаемые метрики", + "galleryViews": "Просмотры галереи", + "photoDownloads": "Отдельные и массовые скачивания", + "uniqueVisitors": "Уникальные посетители по IP", + "deviceTypes": "Типы устройств из user agent", + "privacy": "Приватность", + "privacyText": "IP-адреса хешируются для конфиденциальности. Личные данные не хранятся. Данные аналитики хранятся 90 дней." + } + }, + "analytics": { + "title": "Панель аналитики", + "titleSimple": "Аналитика", + "subtitle": "Отслеживание производительности галерей и вовлечённости посетителей", + "detailedSubtitle": "Подробная аналитика на основе Umami", + "loadingAnalytics": "Загрузка аналитики...", + "showSummaryView": "Показать сводку", + "fullDashboard": "Полная панель", + "refresh": "Обновить", + "last7Days": "Последние 7 дней", + "last30Days": "Последние 30 дней", + "last90Days": "Последние 90 дней", + "pageViews": "Просмотры страниц", + "uniqueVisitors": "Уникальные посетители", + "totalDownloads": "Всего скачиваний", + "topGallery": "Топ галерея", + "topPages": "Популярные страницы", + "views": "просмотры", + "visitors": "уникальных посетителей", + "topDownloadsByGallery": "Топ скачиваний по галереям", + "deviceBreakdown": "Устройства", + "desktop": "Компьютер", + "mobile": "Мобильный", + "tablet": "Планшет", + "storageUsage": "Использование хранилища", + "used": "Использовано", + "of": "из", + "totalPhotos": "Всего фото", + "activeEvents": "Активных событий", + "notConfigured": "Umami Analytics не настроен", + "configureInstructions": "Для отображения данных аналитики настройте Umami в переменных среды и настройках панели администратора.", + "noData": "Данные недоступны", + "percentChange": "{{percent}}% по сравнению с прошлым периодом" + }, + "branding": { + "title": "Брендинг и темы", + "titleFull": "Брендинг и кастомизация", + "subtitle": "Настройка внешнего вида галерей", + "loadingBranding": "Загрузка настроек брендинга...", + "themeAndStyle": "Тема и стиль", + "companyInfo": "Информация о компании", + "companyName": "Название компании", + "companyNameHelp": "Отображается в заголовках галерей и письмах", + "companyTagline": "Слоган компании", + "companyTaglineHelp": "Краткое описание вашего бизнеса", + "supportEmail": "Email поддержки", + "supportEmailHelp": "Контактный email для поддержки гостей", + "footerText": "Текст подвала", + "footerTextHelp": "Отображается внизу галерей", + "logo": "Логотип", + "currentLogo": "Текущий логотип", + "uploadLogo": "Загрузить логотип", + "removeLogo": "Удалить логотип", + "logoHelp": "Рекомендуемый размер: 200x60px, PNG или JPEG", + "favicon": "Фавикон", + "currentFavicon": "Текущий фавикон", + "uploadFavicon": "Загрузить фавикон", + "removeFavicon": "Удалить фавикон", + "faviconHelp": "Формат PNG или ICO, рекомендуемый размер: 32x32px", + "watermark": "Водяной знак", + "watermarkSettings": "Настройки водяного знака", + "enableWatermarks": "Включить водяные знаки", + "watermarkHelp": "Добавить название компании как водяной знак на скачиваемых фото", + "watermarkLogo": "Логотип водяного знака", + "currentWatermark": "Текущий водяной знак", + "uploadWatermarkLogo": "Загрузить логотип водяного знака", + "watermarkPosition": "Положение водяного знака", + "topLeft": "Верхний левый", + "topRight": "Верхний правый", + "center": "По центру", + "bottomLeft": "Нижний левый", + "bottomRight": "Нижний правый", + "watermarkOpacity": "Прозрачность водяного знака", + "watermarkSize": "Размер водяного знака", + "theme": "Тема", + "galleryTheme": "Тема галереи", + "themeCustomization": "Настройка темы", + "selectPreset": "Выберите пресет темы", + "colors": "Цвета", + "primaryColor": "Основной цвет", + "secondaryColor": "Вторичный цвет", + "accentColor": "Акцентный цвет", + "backgroundColor": "Цвет фона", + "textColor": "Цвет текста", + "colorMode": "Цветовой режим", + "colorModeLight": "Светлый", + "colorModeDark": "Тёмный", + "colorModeAuto": "Авто", + "colorModeHelp": "Авто следует системным настройкам посетителя.", + "customCSS": "Пользовательский CSS", + "preview": "Предпросмотр", + "previewInNewTab": "Открыть в новой вкладке", + "reset": "Сбросить", + "saveChanges": "Сохранить изменения", + "applyLivePreview": "Применить изменения немедленно (живой предпросмотр)", + "eventSpecificThemes": "Темы конкретных событий", + "eventThemesInfo": "Эти глобальные настройки темы можно переопределить для отдельных событий при создании или редактировании.", + "themePresets": "Пресеты тем", + "galleryLayout": "Макет галереи", + "layoutDescriptions": { + "grid": "Классическая сетка с одинаковыми размерами фото", + "masonry": "Pinterest-стиль с переменной высотой", + "carousel": "Полноэкранное слайд-шоу с навигацией", + "timeline": "Фото, упорядоченные по дате", + "hero": "Главное изображение с сеткой ниже", + "mosaic": "Художественный макет со смешанными размерами", + "justified": "Строчный макет с сохранением пропорций", + "gallery-premium": "Элегантная светлая тема с баннером и masonry (Бета)", + "gallery-story": "Кинематографическая тёмная тема со сценами (Бета)" + }, + "layoutSettings": "Настройки макета", + "photoSpacing": "Отступы между фото", + "spacing": { + "tight": "Плотный", + "normal": "Обычный", + "relaxed": "Просторный" + }, + "photoAnimation": "Анимация фото", + "animation": { + "none": "Нет", + "fade": "Появление", + "scale": "Масштаб", + "slide": "Сдвиг" + }, + "columns": "Колонки", + "mobile": "Мобильный", + "tablet": "Планшет", + "desktop": "Компьютер", + "enableAutoplay": "Включить автовоспроизведение", + "autoplayInterval": "Интервал автовоспроизведения (секунд)", + "groupPhotosBy": "Группировать фото по", + "grouping": { + "day": "День", + "week": "Неделя", + "month": "Месяц" + }, + "masonryMode": "Режим макета", + "masonryModeOptions": { + "columns": "Колонки (Pinterest-стиль)", + "rows": "Строки (пользовательский justified)", + "flickr": "Flickr (проверенный justified)", + "justified": "Google Photos (алгоритм Knuth-Plass)" + }, + "masonryModeHint": { + "columns": "Pinterest-стиль с вертикальными колонками переменной высоты", + "rows": "Пользовательский строчный justified-макет", + "flickr": "Алгоритм justified-макета с открытым исходным кодом от Flickr", + "justified": "Строки в стиле Google Photos с использованием алгоритма Knuth-Plass для оптимальных переносов" + }, + "targetRowHeight": "Целевая высота строки", + "targetRowHeightHint": "Высота в пикселях (150–400). Фото будут масштабироваться для заполнения строк.", + "lastRowBehavior": "Выравнивание последней строки", + "lastRowOptions": { + "left": "По левому краю", + "center": "По центру", + "justify": "Justified (растянуть)" + }, + "showHeroSection": "Показывать секцию баннера", + "showHeroSectionHint": "Отображать главное фото баннера над justified-галереей", + "heroHeight": "Высота секции баннера", + "heroHeightOptions": { + "small": "Маленький (40–50%)", + "medium": "Средний (50–70%)", + "large": "Большой (60–80%)" + }, + "heroOverlayOpacity": "Прозрачность наложения баннера", + "heroOverlayHint": "Затемнить главное фото для улучшения читаемости текста", + "typographyAndStyle": "Типографика и стиль", + "bodyFont": "Шрифт текста", + "headingFont": "Шрифт заголовков", + "sameAsBody": "Как у текста", + "fontSize": "Размер шрифта", + "fontSizes": { + "small": "Маленький", + "normal": "Обычный", + "large": "Большой" + }, + "borderRadius": "Скругление углов", + "borderRadiusOptions": { + "none": "Нет", + "small": "Маленький", + "medium": "Средний", + "large": "Большой" + }, + "shadowStyle": "Стиль тени", + "shadowOptions": { + "none": "Нет", + "subtle": "Лёгкая", + "normal": "Обычная", + "dramatic": "Выраженная" + }, + "backgroundPattern": "Фон", + "backgroundOptions": { + "none": "Нет", + "dots": "Точки", + "grid": "Сетка", + "waves": "Волны" + }, + "customCSSHelp": "Дополнительно: добавьте пользовательский CSS для тонкой настройки внешнего вида", + "cssInstructions": { + "title": "Как использовать пользовательский CSS", + "variables": "CSS-переменные темы", + "variablesDesc": "Используйте эти CSS-переменные для согласования с пресетами темы:", + "layouts": "Пользовательские макеты галереи", + "layoutsDesc": "Выбирайте элементы галереи с помощью этих селекторов:", + "glassEffect": "Эффект стекла", + "glassEffectDesc": "Создавайте современные эффекты стекла:", + "tip": "Совет", + "tipText": "Используйте CSS-шаблоны из Настройки > CSS-шаблоны для готовых дизайнов, например Apple Liquid Glass." + }, + "resetToDefault": "Сбросить до умолчания", + "applyTheme": "Применить тему", + "customTheme": "Пользовательская тема", + "customizeTheme": "Настроить тему", + "saveTheme": "Сохранить тему", + "previewLayout": "Предпросмотр макета", + "livePreview": "Живой предпросмотр", + "heroPlaceholderText": "Здесь появится главное фото вашего события", + "whiteLabel": "Собственный брендинг", + "hidePoweredBy": "Скрыть «Powered by PicPeak»", + "hidePoweredByHelp": "Убрать упоминание PicPeak из подвалов галерей для полной персонализации брендинга (White Label)", + "logoCustomization": "Настройка логотипа", + "changeLogo": "Изменить логотип", + "logoSizeSmall": "Маленький (32px)", + "logoSizeMedium": "Средний (48px)", + "logoSizeLarge": "Большой (64px)", + "logoSizeXLarge": "Очень большой (96px)", + "logoSizeCustom": "Пользовательский", + "logoMaxHeight": "Максимальная высота (пикселей)", + "logoMaxHeightHelp": "Задайте пользовательскую максимальную высоту логотипа (20–200 пикселей)", + "logoPosition": "Положение логотипа в заголовке", + "positionLeft": "Слева", + "positionCenter": "По центру", + "positionRight": "Справа", + "logoDisplayMode": "Режим отображения", + "logoOnly": "Только логотип", + "textOnly": "Только название компании", + "logoAndText": "Логотип и название компании", + "showLogoInHeader": "Показывать логотип в заголовке галереи", + "showLogoInHeaderHelp": "Отображать логотип в главной панели заголовка", + "showLogoInHero": "Показывать логотип в секции баннера", + "showLogoInHeroHelp": "Отображать логотип в секциях баннера (для нестандартных макетов)", + "headerStyle": "Стиль заголовка", + "headerStyleDescription": "Выберите, как выглядит заголовок галереи. Стиль заголовка не зависит от макета фото.", + "headerStyleOptions": { + "hero": "Изображение-баннер", + "standard": "Стандартный баннер", + "minimal": "Минималистичный", + "none": "Без заголовка" + }, + "headerStyleDescriptions": { + "hero": "Полноэкранное изображение с информацией о событии поверх", + "standard": "Классический баннер с деталями события", + "minimal": "Компактный заголовок с основной информацией", + "none": "Полностью скрыть заголовок" + }, + "heroDividerStyle": "Стиль разделителя", + "heroDividerDescription": "Выберите, как выглядит переход между изображением баннера и контентом галереи.", + "dividerOptions": { + "wave": "Волна", + "straight": "Прямой", + "angle": "Угол", + "curve": "Кривая", + "none": "Нет" + }, + "controlsStyle": "Стиль элементов управления", + "controlsStyleDescription": "Выберите, как отображаются фильтры и элементы управления галереи.", + "controlsStyleOptions": { + "classic": "Классический", + "sidebar": "Боковая панель" + }, + "controlsStyleDescriptions": { + "classic": "Встроенная панель фильтров под заголовком", + "sidebar": "Кнопка меню открывает боковую панель с фильтрами" + }, + "controlsStyleHeroWarning": "Для заголовков-баннеров рекомендуется боковая панель, чтобы элементы управления не перекрывали изображение." + }, + "admin": { + "title": "Панель администратора", + "welcome": "Добро пожаловать, {{name}}", + "recentActivity": "Последняя активность", + "systemStatus": "Статус системы", + "totalEvents": "Всего событий", + "activeGalleries": "Активных галерей", + "storageUsed": "Занято места", + "totalPhotos": "Всего фото", + "storagePercent": "{{percent}}% от лимита {{limit}}", + "storageSoftLimitConfigured": "Установленный лимит: {{limit}}", + "storageSoftLimitRecommended": "Рекомендуемый лимит: {{limit}}", + "version": "Версия", + "archivedEvents": "Архивированных событий", + "systemHealth": "Состояние системы", + "health": { + "healthy": "Здорово", + "warning": "Предупреждение", + "error": "Ошибка", + "checking": "Проверка..." + }, + "updates": { + "available": "Доступно обновление", + "newVersion": "Доступна версия {{version}}", + "currentVersion": "Текущая: {{version}}", + "channel": "Канал: {{channel}}", + "channelStable": "Стабильный", + "channelBeta": "Бета", + "beta": "БЕТА", + "viewReleaseNotes": "Посмотреть примечания к выпуску", + "updateAvailableShort": "Доступна v{{version}}", + "checkForUpdates": "Проверить обновления", + "upToDate": "У вас актуальная версия", + "lastChecked": "Последняя проверка: {{time}}", + "updateNow": "Обновить сейчас", + "updateDialog": { + "title": "Обновление PicPeak", + "detectedEnv": "Обнаруженная среда", + "beforeUpdating": "Перед обновлением:", + "updateCommands": "Команды обновления:", + "afterUpdating": "После обновления:", + "copyAllCommands": "Скопировать все команды", + "completeChecklist": "Выполните контрольный список перед обновлением", + "error": "Не удалось загрузить инструкции по обновлению" + } + }, + "notifications": "Уведомления", + "viewAllNotifications": "Просмотреть все уведомления", + "noNotifications": "Нет новых уведомлений", + "markAllRead": "Отметить все как прочитанные", + "clearAll": "Очистить все", + "close": "Закрыть", + "noNotificationsMessage": "Уведомлений нет", + "notificationMessages": { + "eventCreated": "Создано новое событие «{{eventName}}»", + "eventArchived": "Событие «{{eventName}}» архивировано", + "eventUpdated": "Событие «{{eventName}}» обновлено", + "eventDeleted": "Событие «{{eventName}}» удалено", + "photosUploaded": "{{count}} фото загружено в «{{eventName}}»", + "photoDeleted": "Фото удалено из «{{eventName}}»", + "photosBulkDeleted": "{{count}} фото удалено из «{{eventName}}»", + "eventExpiring": "Событие «{{eventName}}» истекает через {{days}} дней", + "eventExpired": "Событие «{{eventName}}» истекло", + "passwordChanged": "Пароль изменён пользователем {{actorName}}", + "passwordReset": "Пароль сброшен для «{{eventName}}»", + "settingsUpdated": "Обновлены настройки {{type}}", + "emailTemplateUpdated": "Обновлён email-шаблон «{{template}}»", + "bulkDownload": "{{count}} фото скачано из «{{eventName}}»", + "storageWarning": "Использование хранилища: {{percentage}}%", + "adminLogout": "Администратор {{actorName}} вышел из системы", + "categoryCreated": "Создана категория «{{name}}» для «{{eventName}}»", + "categoryUpdated": "Обновлена категория «{{name}}» для «{{eventName}}»", + "categoryDeleted": "Удалена категория «{{name}}» из «{{eventName}}»", + "cmsPageUpdated": "Страница CMS «{{slug}}» обновлена", + "emailConfigUpdated": "Конфигурация email обновлена", + "faviconUploaded": "Фавикон загружен", + "brandingUpdated": "Настройки брендинга обновлены", + "generalSettingsUpdated": "Общие настройки обновлены", + "securitySettingsUpdated": "Настройки безопасности обновлены", + "themeUpdated": "Настройки темы обновлены", + "archiveDownloaded": "Скачан архив для «{{eventName}}»", + "archiveDeleted": "Архив удалён для «{{eventName}}»", + "archiveRestored": "Архив восстановлен для «{{eventName}}»", + "systemActivity": "Системная активность: {{type}}", + "adminProfileUpdated": "Профиль администратора обновлён пользователем {{actorName}}" + }, + "notificationToasts": { + "markedAllRead": "Все уведомления отмечены как прочитанные", + "clearedAll": "Удалено {{count}} уведомлений", + "profileUpdated": "Профиль администратора обновлён" + }, + "markAsRead": "Отметить как прочитанное", + "markAllAsRead": "Отметить все как прочитанные", + "notificationSettings": "Настройки уведомлений", + "changePassword": "Изменить пароль", + "darkMode": "Переключить на тёмную тему", + "lightMode": "Переключить на светлую тему", + "accountSettings": { + "title": "Аккаунт администратора", + "description": "Обновите учётные данные для входа в PicPeak.", + "username": "Имя пользователя", + "usernamePlaceholder": "Администратор", + "email": "Email", + "emailPlaceholder": "admin@example.com", + "updateButton": "Обновить профиль" + }, + "profileUpdateError": "Не удалось обновить профиль администратора. Попробуйте снова.", + "loadingDashboard": "Загрузка панели управления...", + "activeEvents": "Активных событий", + "expiringSoon": "Скоро истекают", + "next7Days": "Ближайшие 7 дней", + "totalViews": "Всего просмотров", + "downloads": "Скачивания", + "percentFromLastWeek": "{{percent}}% по сравнению с прошлой неделей", + "dashboardSubtitle": "Добро пожаловать! Вот что происходит с вашими галереями.", + "eventsExpiringSoon": "Скоро истекающие события", + "noEventsExpiring": "Нет событий, истекающих в ближайшие 7 дней", + "daysLeft": "Остался {{count}} день", + "daysLeft_plural": "Осталось {{count}} дней", + "viewAllExpiringEvents": "Просмотреть все {{count}} истекающих события", + "noRecentActivity": "Последней активности нет", + "viewAllActivity": "Просмотреть всю активность", + "quickActions": "Быстрые действия", + "viewArchives": "Просмотреть архивы", + "analytics": "Аналитика", + "activities": { + "event_created": "Создано новое событие: {{eventName}}", + "photos_uploaded": "{{count}} фото загружено в {{eventName}}", + "event_archived": "Событие архивировано: {{eventName}}", + "archive_restored": "Архив восстановлен: {{eventName}}", + "archive_deleted": "Архив удалён: {{eventName}}", + "archive_downloaded": "Архив скачан: {{eventName}}", + "email_config_updated": "Конфигурация email обновлена", + "email_template_updated": "Шаблон email обновлён: {{template}}", + "branding_updated": "Настройки брендинга обновлены", + "theme_updated": "Настройки темы обновлены", + "bulk_download": "{{count}} фото скачано из {{eventName}}", + "gallery_password_entry": "Введён пароль для {{eventName}}", + "expiration_warning_viewed": "Просмотрено предупреждение об истечении для {{eventName}}", + "feedback_settings_updated": "Настройки отзывов обновлены", + "feedback_moderated": "Отзыв отмодерирован", + "feedback_deleted": "Отзыв удалён", + "photo_like": "Фото отмечено «нравится» в {{eventName}}", + "photo_favorite": "Фото добавлено в избранное в {{eventName}}", + "photo_rating": "Фото оценено в {{eventName}}", + "photo_comment": "Комментарий к фото в {{eventName}}", + "guest_feedback_like": "Гость отметил фото «нравится» в {{eventName}}", + "guest_feedback_favorite": "Гость добавил фото в избранное в {{eventName}}", + "guest_feedback_rating": "Гость оценил фото в {{eventName}}", + "guest_feedback_comment": "Гость прокомментировал фото в {{eventName}}", + "word_filter_added": "Фильтр слова добавлен", + "external_import_completed": "Импорт внешних медиафайлов завершён ({{imported}} импортировано, {{skipped}} пропущено)", + "bulk_archive_completed": "Массовое архивирование завершено", + "event_activated": "Событие активировано: {{eventName}}", + "event_deactivated": "Событие деактивировано: {{eventName}}", + "photo_deleted": "Фото удалено из {{eventName}}", + "photos_bulk_deleted": "{{count}} фото удалено из {{eventName}}", + "settings_updated": "Настройки обновлены", + "event_updated": "Событие обновлено: {{eventName}}", + "event_renamed": "Событие переименовано: {{eventName}}", + "event_deleted": "Событие удалено: {{eventName}}", + "password_changed": "Пароль изменён", + "email_resent": "Письмо о создании отправлено повторно для: {{eventName}}", + "category_created": "Категория создана: {{categoryName}}", + "category_updated": "Категория обновлена: {{categoryName}}", + "category_deleted": "Категория удалена: {{categoryName}}", + "general_settings_updated": "Общие настройки обновлены", + "favicon_uploaded": "Фавикон загружен", + "analytics_settings_updated": "Настройки аналитики обновлены", + "cms_page_updated": "Страница CMS обновлена: {{page}}", + "security_settings_updated": "Настройки безопасности обновлены", + "password_reset": "Пароль сброшен для: {{eventName}}", + "admin_logout": "Администратор {{actorName}} вышел из системы", + "system_activity": "Системная активность: {{type}}", + "unknown": "Неизвестная активность" + }, + "userManagement": "Управление пользователями", + "inviteUser": "Пригласить пользователя", + "pendingInvitations": "Ожидающие приглашения", + "roles": { + "super_admin": "Супер-администратор", + "admin": "Администратор", + "editor": "Редактор", + "viewer": "Наблюдатель" + }, + "userStatus": { + "active": "Активный", + "inactive": "Неактивный" + }, + "inviteForm": { + "email": "Адрес электронной почты", + "role": "Роль", + "send": "Отправить приглашение" + }, + "acceptInvite": { + "title": "Принять приглашение администратора", + "username": "Выберите имя пользователя", + "password": "Создайте пароль", + "submit": "Создать аккаунт" + } + }, + "permissions": { + "insufficient": "У вас нет прав для выполнения этого действия", + "viewOnly": "Только просмотр" + }, + "acceptInvitation": { + "title": "Принять приглашение", + "subtitle": "Создайте аккаунт администратора", + "validating": "Проверка приглашения...", + "invalidToken": "Недействительное приглашение", + "invalidTokenMessage": "Ссылка-приглашение недействительна или устарела. Обратитесь к администратору за новым приглашением.", + "expiredToken": "Приглашение истекло", + "expiredTokenMessage": "Это приглашение истекло. Запросите новое у вашего администратора.", + "alreadyUsed": "Приглашение уже использовано", + "alreadyUsedMessage": "Это приглашение уже было использовано для создания аккаунта.", + "invitedAs": "Вы приглашены как", + "expiresAt": "Приглашение истекает", + "usernameLabel": "Имя пользователя", + "usernamePlaceholder": "Выберите имя пользователя", + "usernameHelp": "3–50 символов: буквы, цифры, подчёркивания и дефисы", + "passwordLabel": "Пароль", + "passwordPlaceholder": "Создайте надёжный пароль", + "confirmPasswordLabel": "Подтвердите пароль", + "confirmPasswordPlaceholder": "Подтвердите пароль", + "passwordStrength": "Надёжность пароля", + "requirements": { + "title": "Требования к паролю:", + "minLength": "Не менее 12 символов", + "uppercase": "Хотя бы одна заглавная буква", + "lowercase": "Хотя бы одна строчная буква", + "number": "Хотя бы одна цифра", + "special": "Хотя бы один специальный символ" + }, + "strength": { + "weak": "Слабый", + "fair": "Удовлетворительный", + "good": "Хороший", + "strong": "Надёжный" + }, + "createAccount": "Создать аккаунт", + "creating": "Создание аккаунта...", + "success": "Аккаунт создан!", + "successMessage": "Ваш аккаунт успешно создан. Теперь вы можете войти с вашими учётными данными.", + "redirecting": "Перенаправление на страницу входа через {{seconds}}...", + "goToLogin": "Перейти к входу", + "contactAdminMessage": "Обратитесь к администратору для получения нового приглашения.", + "passwordsMatch": "Пароли совпадают", + "alreadyHaveAccount": "Уже есть аккаунт?", + "signIn": "Войти", + "errors": { + "usernameRequired": "Имя пользователя обязательно", + "usernameTooShort": "Имя пользователя должно содержать не менее 3 символов", + "usernameTooLong": "Имя пользователя должно содержать не более 50 символов", + "usernameInvalid": "Имя пользователя может содержать только буквы, цифры, подчёркивания и дефисы", + "passwordRequired": "Пароль обязателен", + "passwordTooShort": "Пароль должен содержать не менее 12 символов", + "passwordsDoNotMatch": "Пароли не совпадают", + "confirmPasswordRequired": "Подтвердите пароль", + "usernameTaken": "Это имя пользователя уже занято", + "emailTaken": "Аккаунт с таким email уже существует", + "genericError": "Не удалось создать аккаунт. Попробуйте снова." + } + }, + "errors": { + "notFound": "Не найдено", + "galleryNotFound": "Галерея не найдена", + "galleryNotFoundMessage": "Эта галерея не существует или была удалена.", + "galleryArchived": "Галерея архивирована", + "galleryArchivedMessage": "Эта галерея была архивирована и больше недоступна. Свяжитесь с организатором события, если вам нужен доступ к фотографиям.", + "unauthorized": "Нет доступа", + "forbidden": "Запрещено", + "serverError": "Ошибка сервера", + "somethingWentWrong": "Что-то пошло не так", + "tryAgainLater": "Попробуйте позже", + "refreshPage": "Обновить страницу", + "oopsSomethingWentWrong": "Упс! Что-то пошло не так", + "unexpectedError": "Произошла непредвиденная ошибка. Не волнуйтесь, ваши данные в безопасности.", + "goToHomepage": "На главную", + "errorDetails": "Детали ошибки", + "requiredFields": "Заполните все обязательные поля", + "enterTestEmail": "Введите тестовый адрес электронной почты", + "failedToCreateEvent": "Не удалось создать событие", + "eventCreationFailed": "Не удалось создать событие", + "networkError": "Ошибка сети. Проверьте соединение и попробуйте снова.", + "sessionExpired": "Сессия истекла. Пожалуйста, войдите снова." + }, + "validation": { + "eventNameRequired": "Название события обязательно", + "hostEmailRequired": "Email клиента обязателен", + "hostNameRequired": "Имя клиента обязательно", + "adminEmailRequired": "Email администратора обязателен", + "invalidEmailFormat": "Неверный формат email", + "passwordRequired": "Пароль обязателен", + "passwordMinLength": "Пароль должен содержать не менее 6 символов", + "passwordsDoNotMatch": "Пароли не совпадают", + "passwordSecurityRequirements": "Пароль не соответствует требованиям безопасности", + "expirationRange": "Срок действия должен быть от 1 до 365 дней" + }, + "legal": { + "impressum": "Правовая информация", + "datenschutz": "Политика конфиденциальности", + "termsOfService": "Условия использования", + "cookiePolicy": "Политика использования cookie" + }, + "toast": { + "saveSuccess": "Изменения успешно сохранены", + "saveError": "Не удалось сохранить изменения", + "deleteSuccess": "Успешно удалено", + "deleteError": "Не удалось удалить", + "uploadSuccess": "Загрузка успешно завершена", + "uploadError": "Ошибка загрузки", + "loginSuccess": "Вход выполнен успешно", + "loginError": "Ошибка входа", + "passwordChanged": "Пароль успешно изменён", + "linkCopied": "Ссылка скопирована в буфер обмена", + "eventCreated": "Событие успешно создано", + "eventUpdated": "Событие успешно обновлено", + "eventArchived": "Событие успешно архивировано", + "settingsSaved": "Настройки успешно сохранены", + "themeUpdated": "Тема успешно обновлена", + "brandingUpdated": "Брендинг успешно обновлён", + "categoryAdded": "Категория успешно добавлена", + "categoryDeleted": "Категория успешно удалена", + "categoryUpdated": "Категория успешно обновлена", + "emailConfigSaved": "Конфигурация email успешно сохранена", + "testEmailSent": "Тестовое письмо успешно отправлено", + "pageUpdated": "Страница успешно обновлена", + "archiveRestored": "Архив успешно восстановлен", + "archiveDeleted": "Архив безвозвратно удалён" + }, + "email": { + "title": "Настройка email", + "subtitle": "Настройка параметров email для уведомлений", + "loadingSettings": "Загрузка настроек email...", + "smtpConfiguration": "Конфигурация SMTP", + "smtpHost": "SMTP-хост", + "smtpHostHelp": "Имя хоста вашего почтового сервера", + "smtpPort": "SMTP-порт", + "smtpPortHelp": "Обычно 587 для TLS, 465 для SSL, 25 для незашифрованного", + "smtpSecure": "Использовать SSL/TLS", + "smtpSecureHelp": "Включите для безопасной передачи email", + "smtpUsername": "Имя пользователя SMTP", + "smtpUsernameHelp": "Имя пользователя вашего email-аккаунта", + "smtpPassword": "Пароль SMTP", + "smtpPasswordHelp": "Пароль вашего email-аккаунта", + "fromDetails": "Данные отправителя", + "fromEmail": "Email отправителя", + "fromEmailHelp": "Адрес электронной почты, отображаемый как отправитель", + "fromName": "Имя отправителя", + "fromNameHelp": "Имя, отображаемое как отправитель", + "testConfiguration": "Тестирование конфигурации", + "testEmail": "Тестовый адрес", + "testEmailHelp": "Отправить тестовое письмо для проверки настроек", + "sendTestEmail": "Отправить тестовое письмо", + "saveConfiguration": "Сохранить конфигурацию", + "emailTemplates": "Шаблоны email", + "templateVariables": "Доступные переменные", + "previewTemplate": "Предпросмотр шаблона", + "smtpSettings": "Настройки SMTP", + "testEmailSuccess": "Тестовое письмо успешно отправлено", + "saveSmtpSettings": "Сохранить настройки SMTP", + "testEmailSection": "Тестовое письмо", + "beforeTesting": "Перед тестированием:", + "saveSmtpFirst": "Сначала сохраните настройки SMTP", + "ensureFirewall": "Убедитесь, что брандмауэр разрешает исходящий SMTP", + "gmailAppPassword": "Для Gmail используйте пароль приложения", + "testEmailAddressLabel": "Тестовый адрес электронной почты", + "sendTestEmailButton": "Отправить тестовое письмо", + "commonSmtpSettings": "Распространённые настройки SMTP:", + "editTemplate": "Редактировать шаблон", + "templateName": "Название шаблона", + "subjectLine": "Тема письма", + "emailBody": "Тело письма", + "preview": "Предпросмотр", + "saveChanges": "Сохранить изменения", + "templates": "Шаблоны", + "variableHelp": "Используйте эти переменные в шаблоне. Они будут заменены реальными значениями при отправке писем.", + "port": "Порт", + "security": "Безопасность", + "username": "Имя пользователя", + "password": "Пароль", + "enterPassword": "Введите пароль", + "required": "обязательно", + "ignoreSslErrors": "Игнорировать ошибки SSL/TLS-сертификата", + "ignoreSslWarning": "Предупреждение: Отключение проверки сертификата делает соединение уязвимым для атак «человек посередине». Включайте только если доверяете SMTP-серверу и понимаете риски." + }, + "cms": { + "title": "Страницы CMS", + "subtitle": "Управление правовыми и информационными страницами", + "loadingPages": "Загрузка страниц...", + "pages": "Страницы", + "previewLinks": "Ссылки предпросмотра", + "englishVersion": "Английская версия", + "germanVersion": "Немецкая версия", + "editPage": "Редактировать {{page}}", + "pageTitle": "Заголовок страницы", + "pageContent": "Содержимое страницы", + "pageTitlePlaceholder": "Введите заголовок страницы...", + "saveChanges": "Сохранить изменения", + "lastUpdated": "Последнее обновление:", + "impressum": "Правовая информация", + "datenschutz": "Политика конфиденциальности", + "pageUpdated": "Страница успешно обновлена" + }, + "eventTypes": { + "title": "Типы событий", + "subtitle": "Настройка типов событий и тем по умолчанию", + "loading": "Загрузка типов событий...", + "loadError": "Не удалось загрузить типы событий", + "createNew": "Новый тип события", + "edit": "Редактировать тип события", + "created": "Тип события успешно создан", + "updated": "Тип события успешно обновлён", + "deleted": "Тип события успешно удалён", + "createError": "Не удалось создать тип события", + "updateError": "Не удалось обновить тип события", + "deleteError": "Не удалось удалить тип события", + "searchPlaceholder": "Поиск типов событий...", + "showInactive": "Показывать неактивные", + "noResults": "Типы событий не найдены", + "empty": "Типов событий пока нет", + "system": "Системный", + "table": { + "type": "Тип", + "slugPrefix": "Префикс URL", + "theme": "Тема по умолчанию", + "status": "Статус", + "actions": "Действия" + }, + "form": { + "name": "Отображаемое название", + "namePlaceholder": "например, Семейная фотосессия", + "slugPrefix": "Префикс URL", + "slugPrefixPlaceholder": "например, family", + "slugPreview": "Пример URL:", + "emoji": "Иконка", + "themePreset": "Тема по умолчанию", + "isActive": "Активный (отображается при создании события)" + }, + "validation": { + "slugFormat": "Допустимы только буквы, цифры и дефисы" + }, + "slugInfo": { + "title": "О префиксе URL:", + "description": "Префикс URL используется для генерации ссылок галерей. Например, тип события с префиксом «family» создаст URL вида: family-smith-family-2025-01-22" + }, + "deleteConfirm": { + "title": "Удалить тип события", + "message": "Вы уверены, что хотите удалить", + "warning": "Это действие нельзя отменить. Убедитесь, что ни одно событие не использует этот тип." + } + }, + "backup": { + "external": { + "warning": { + "title": "Внешние медиафайлы исключены", + "body": "Эта установка ссылается на фото из /external-media. Оригиналы исключены из резервных копий. Миниатюры и база данных по-прежнему сохраняются." + } + }, + "title": "Управление резервными копиями", + "subtitle": "Управление резервными копиями системы, настройка автоматического резервирования и восстановление из предыдущих копий.", + "tabs": { + "dashboard": "Панель управления", + "configuration": "Конфигурация", + "history": "История копий", + "restore": "Восстановление" + }, + "status": { + "inProgress": "Резервное копирование выполняется...", + "lastBackup": "Последняя копия", + "noBackups": "Резервные копии не найдены", + "nextBackup": "Следующая копия", + "notScheduled": "Не запланировано", + "enabled": "Включено", + "disabled": "Отключено" + }, + "actions": { + "runBackupNow": "Создать копию сейчас", + "starting": "Запуск...", + "running": "Выполняется...", + "testConnection": "Проверить подключение", + "save": "Сохранить конфигурацию", + "delete": "Удалить", + "view": "Подробности", + "download": "Скачать", + "refresh": "Обновить" + }, + "dashboard": { + "backupHealth": "Состояние резервного копирования", + "healthStatus": { + "excellent": "Отличное", + "good": "Хорошее", + "warning": "Предупреждение", + "critical": "Критическое" + }, + "health": { + "title": "Состояние резервного копирования" + }, + "healthMessages": { + "noBackups": "Резервные копии не найдены", + "lastBackupFailed": "Последнее резервное копирование завершилось с ошибкой", + "upToDate": "Резервная копия актуальна", + "recent": "Резервная копия свежая", + "gettingOld": "Резервная копия устаревает", + "outdated": "Резервная копия устарела" + }, + "stats": { + "totalBackups": "Всего копий", + "backupSize": "Размер копии", + "lastDuration": "Последняя длительность", + "backupStatus": "Статус копии", + "last": "Последняя", + "files": "файлов", + "minutes": "{{count}} мин.", + "active": "Активный", + "inactive": "Неактивный", + "noBackupsYet": "Копий пока нет" + }, + "recentActivity": { + "title": "Последняя активность копирования" + }, + "notConfigured": { + "title": "Резервное копирование не настроено", + "message": "Настройте параметры резервного копирования на вкладке «Конфигурация» перед запуском." + }, + "actions": { + "runBackupNow": "Создать копию сейчас", + "running": "Выполняется..." + }, + "coverage": { + "title": "Охват резервного копирования", + "database": "База данных", + "photos": "Фото", + "archives": "Архивы", + "systemFiles": "Системные файлы", + "included": "Включено", + "excluded": "Исключено", + "optional": "Необязательно" + }, + "storageDestination": "Место хранения", + "nextScheduledBackup": "Следующее запланированное копирование", + "backupType": "Резервная копия {{type}}", + "noDestinationSet": "Место хранения не задано" + }, + "configuration": { + "enableBackup": "Включить автоматическое резервное копирование", + "enableBackupHelp": "Автоматически создавать копии по настроенному расписанию", + "destinationType": "Место хранения копий", + "destinationTypes": { + "local": { + "name": "Локальное хранилище", + "description": "Хранить копии на локальной файловой системе сервера" + }, + "rsync": { + "name": "Удалённый сервер (Rsync)", + "description": "Синхронизировать копии на удалённый сервер через SSH/Rsync" + }, + "s3": { + "name": "S3-совместимое хранилище", + "description": "Хранить копии в Amazon S3 или совместимом объектном хранилище" + } + }, + "fields": { + "destinationPath": "Путь назначения", + "destinationPathHelp": "Путь к локальной директории для хранения копий", + "destinationPathPlaceholder": "/path/to/backup/directory", + "rsyncHost": "Удалённый хост", + "rsyncHostHelp": "Имя хоста или IP-адрес SSH", + "rsyncHostPlaceholder": "backup.example.com", + "rsyncUser": "Пользователь SSH", + "rsyncUserHelp": "Имя пользователя для SSH-подключения", + "rsyncUserPlaceholder": "backup-user", + "rsyncPath": "Удалённый путь", + "rsyncPathHelp": "Путь к директории на удалённом сервере", + "rsyncPathPlaceholder": "/home/backup/photo-sharing", + "rsyncSshKey": "Приватный ключ SSH", + "rsyncSshKeyHelp": "Приватный ключ SSH для аутентификации (необязательно)", + "rsyncSshKeyPlaceholder": "-----BEGIN RSA PRIVATE KEY-----", + "s3Endpoint": "Эндпоинт S3", + "s3EndpointHelp": "Эндпоинт API S3 (например, s3.amazonaws.com)", + "s3EndpointPlaceholder": "https://s3.amazonaws.com", + "s3Bucket": "Имя корзины", + "s3BucketHelp": "Корзина S3 для хранения копий", + "s3BucketPlaceholder": "my-backup-bucket", + "s3AccessKey": "ID ключа доступа", + "s3AccessKeyHelp": "ID ключа доступа AWS/S3", + "s3AccessKeyPlaceholder": "AKIAIOSFODNN7EXAMPLE", + "s3SecretKey": "Секретный ключ доступа", + "s3SecretKeyHelp": "Секретный ключ доступа AWS/S3", + "s3SecretKeyPlaceholder": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "s3Region": "Регион", + "s3RegionHelp": "Регион S3 (например, us-east-1)", + "s3RegionPlaceholder": "us-east-1" + }, + "schedule": { + "title": "Расписание резервного копирования", + "scheduleType": "Тип расписания", + "scheduleOptions": { + "hourly": "Каждый час", + "daily": "Ежедневно", + "weekly": "Еженедельно", + "custom": "Пользовательское cron-выражение" + }, + "options": { + "hourly": "Каждый час", + "daily": "Ежедневно", + "weekly": "Еженедельно", + "custom": "Пользовательское cron-выражение" + }, + "customCron": "Cron-выражение", + "customCronHelp": "Введите корректное cron-выражение (например, 0 3 * * *)", + "retention": "Период хранения", + "retentionDays": "Хранить копии", + "retentionHelp": "дней (более старые копии будут автоматически удалены)" + }, + "whatToBackup": { + "title": "Что резервировать", + "database": "База данных", + "databaseHelp": "Все данные событий, настройки и конфигурации", + "photos": "Фото", + "photosHelp": "Все загруженные фото в активных галереях", + "archives": "Архивы", + "archivesHelp": "ZIP-файлы архивированных событий", + "thumbnails": "Миниатюры", + "thumbnailsHelp": "Сгенерированные миниатюры (можно пересоздать)", + "tempFiles": "Временные файлы", + "tempFilesHelp": "Временные файлы загрузки и обработки" + }, + "advancedOptions": { + "title": "Расширенные параметры", + "compression": "Включить сжатие", + "compressionHelp": "Сжимать файлы копий для экономии места", + "encryption": "Включить шифрование", + "encryptionHelp": "Шифровать копии для дополнительной безопасности", + "encryptionPassphrase": "Парольная фраза шифрования", + "encryptionPassphraseHelp": "Надёжная парольная фраза для шифрования копий", + "confirmPassphrase": "Подтвердить парольную фразу", + "passphrasesDontMatch": "Парольные фразы не совпадают" + }, + "validation": { + "requiredFields": "Заполните все обязательные поля", + "invalidCron": "Неверное cron-выражение", + "connectionTestFailed": "Тест подключения не пройден", + "connectionTestSuccess": "Тест подключения успешен!" + }, + "messages": { + "requiredFields": "Заполните все обязательные поля", + "connectionSuccess": "Тест подключения успешен!", + "connectionFailed": "Тест подключения не пройден" + }, + "testingConnection": "Проверка подключения...", + "saveSettings": "Сохранить конфигурацию", + "savingSettings": "Сохранение..." + }, + "history": { + "searchPlaceholder": "Поиск копий...", + "allStatus": "Все статусы", + "status": { + "completed": "Завершено", + "failed": "Ошибка", + "running": "Выполняется", + "partial": "Частично" + }, + "deleteConfirm": "Вы уверены, что хотите удалить резервную копию от {{date}}?", + "noBackups": "Резервные копии не найдены", + "tableHeaders": { + "date": "Дата", + "type": "Тип", + "status": "Статус", + "size": "Размер", + "duration": "Длительность", + "actions": "Действия" + }, + "columns": { + "status": "Статус", + "dateTime": "Дата и время", + "type": "Тип", + "size": "Размер", + "duration": "Длительность", + "actions": "Действия" + }, + "statistics": "Статистика", + "errors": "Ошибки", + "backupDetails": { + "backupId": "ID копии", + "startTime": "Время начала", + "endTime": "Время окончания", + "destination": "Назначение", + "filesProcessed": "Обработано файлов", + "totalSize": "Общий размер", + "compressionRatio": "Коэффициент сжатия", + "errorLog": "Журнал ошибок", + "noErrors": "Ошибок не возникло" + }, + "pagination": { + "showing": "Показано {{from}}–{{to}} из {{total}} копий", + "previous": "Назад", + "next": "Далее" + }, + "filter": { + "allStatus": "Все статусы", + "completed": "Завершено", + "failed": "Ошибка", + "running": "Выполняется", + "partial": "Частично" + }, + "noBackupsFound": "Резервные копии не найдены", + "backupsWillAppear": "Копии появятся здесь после создания", + "messages": { + "deleteSuccess": "Резервная копия успешно удалена" + }, + "details": { + "backupDetails": "Подробности резервной копии", + "destination": "Место назначения", + "started": "Запущено", + "completed": "Завершено", + "contentBackedUp": "Содержимое резервной копии", + "errorDetails": "Подробности ошибки", + "manifest": "Манифест" + } + }, + "restore": { + "steps": { + "selectSource": "Выбор источника", + "chooseBackup": "Выбор копии", + "restoreOptions": "Параметры восстановления", + "reviewConfirm": "Проверка и подтверждение", + "progress": "Ход восстановления" + }, + "source": { + "title": "Выберите источник резервной копии", + "subtitle": "Выберите, откуда восстанавливать копию", + "local": { + "name": "Локальная копия", + "description": "Восстановить из локальной файловой системы" + }, + "s3": { + "name": "S3-хранилище", + "description": "Восстановить из S3-корзины" + }, + "upload": { + "name": "Загрузить копию", + "description": "Загрузить файл резервной копии", + "comingSoon": "Функция загрузки скоро появится" + }, + "configuration": { + "s3": "Конфигурация S3", + "endpoint": "URL эндпоинта S3", + "bucket": "Имя корзины", + "accessKey": "ID ключа доступа", + "secretKey": "Секретный ключ доступа" + } + }, + "backup": { + "title": "Выберите копию для восстановления", + "subtitle": "Выберите из доступных копий", + "noBackupsFound": "Копии в выбранном источнике не найдены", + "encrypted": "Зашифрованная копия", + "encryptedMessage": "Для восстановления этой копии потребуется парольная фраза шифрования.", + "enterPassphrase": "Введите парольную фразу шифрования", + "at": "в" + }, + "restoreTypes": { + "full": { + "name": "Полное восстановление", + "description": "Восстановить всё: базу данных, фото и архивы", + "warning": "Это заменит все текущие данные" + }, + "database": { + "name": "Только база данных", + "description": "Восстановить только базу данных (настройки, события, пользователи)", + "warning": "Текущая база данных будет заменена" + }, + "files": { + "name": "Только файлы", + "description": "Восстановить только фото и архивы", + "warning": "Существующие файлы могут быть перезаписаны" + }, + "selective": { + "name": "Выборочное восстановление", + "description": "Выберите конкретные элементы для восстановления", + "warning": "Будут восстановлены только выбранные элементы" + } + }, + "options": { + "title": "Параметры восстановления", + "subtitle": "Выберите, что восстанавливать", + "additionalOptions": { + "title": "Дополнительные параметры", + "skipPreBackup": "Пропустить предварительное резервирование", + "skipPreBackupHelp": "По умолчанию перед восстановлением создаётся копия. Отметьте, чтобы пропустить.", + "force": "Принудительное восстановление", + "forceHelp": "Обойти проверки безопасности и предупреждения (используйте с осторожностью)" + } + }, + "confirmation": { + "title": "Проверка и подтверждение", + "subtitle": "Проверьте конфигурацию восстановления", + "validation": { + "passed": "Проверка пройдена", + "failed": "Проверка не пройдена", + "checking": "Проверка конфигурации восстановления..." + }, + "spaceCheck": { + "title": "Пространство хранилища", + "required": "Необходимо", + "available": "Доступно", + "insufficient": "Недостаточно места" + }, + "summary": { + "title": "Сводка восстановления", + "source": "Источник", + "backupDate": "Дата копии", + "restoreType": "Тип восстановления", + "preBackup": "Предварительная копия", + "enabled": "Включено", + "skipped": "Пропущено" + }, + "warning": { + "title": "Важное предупреждение", + "message": "Эта операция восстановления заменит существующие данные. Убедитесь, что у вас есть актуальная резервная копия перед продолжением. Это действие нельзя отменить." + } + }, + "progress": { + "title": "Ход восстановления", + "inProgress": "Восстановление выполняется...", + "completed": "Восстановление завершено", + "overallProgress": "Общий прогресс", + "current": "Текущий", + "statusDetails": "Детали статуса", + "restoreLogs": "Журналы восстановления", + "steps": { + "completed": "Завершено", + "running": "Выполняется", + "failed": "Ошибка", + "pending": "Ожидание" + }, + "success": { + "title": "Восстановление успешно завершено", + "message": "Ваши данные восстановлены. Пожалуйста, убедитесь, что всё работает корректно." + } + }, + "actions": { + "back": "Назад", + "next": "Далее", + "startRestore": "Начать восстановление", + "starting": "Запуск...", + "validating": "Проверка...", + "startNewRestore": "Начать новое восстановление" + }, + "messages": { + "restoreStarted": "Восстановление успешно запущено" + } + }, + "messages": { + "backupStarted": "Резервное копирование успешно запущено", + "backupFailed": "Не удалось запустить резервное копирование", + "configUpdated": "Конфигурация резервного копирования обновлена", + "configUpdateFailed": "Не удалось обновить конфигурацию", + "backupDeleted": "Резервная копия успешно удалена", + "deleteFailed": "Не удалось удалить резервную копию", + "testEmailSent": "Тест подключения успешен!", + "testEmailFailed": "Тест подключения не пройден" + } + }, + "cssTemplates": { + "title": "Пользовательские CSS-шаблоны", + "template": "Шаблон", + "templateName": "Название шаблона", + "enableTemplate": "Включить этот шаблон", + "enableHint": "Включённые шаблоны можно выбирать при создании событий", + "cssContent": "Содержимое CSS", + "cssHint": "Используйте .gallery-page для ограничения стилей галереей. Доступные переменные: --gallery-bg, --gallery-text, --gallery-accent", + "securityNotice": "Уведомление о безопасности", + "securityText": "CSS очищается для предотвращения вредоносного кода. Внешние URL, @import и JavaScript-выражения заблокированы.", + "resetToDefault": "Сбросить до умолчания", + "resetConfirm": "Сбросить этот шаблон до умолчания? Ваши изменения будут потеряны.", + "unsavedChanges": "Несохранённые изменения", + "saveTemplate": "Сохранить шаблон", + "lastUpdated": "Последнее обновление", + "saved": "Шаблон успешно сохранён", + "saveFailed": "Не удалось сохранить шаблон", + "sanitizationWarning": "Некоторые CSS-паттерны заблокированы по соображениям безопасности", + "reset": "Шаблон сброшен до умолчания", + "resetFailed": "Не удалось сбросить шаблон" + }, + "maintenance": { + "title": "Техническое обслуживание", + "message": "В данный момент проводится плановое техническое обслуживание для улучшения нашего сервиса. Мы скоро вернёмся.", + "expectedCompletion": "Ожидаемое время завершения:", + "checkBackLater": "Пожалуйста, зайдите позже", + "urgentMatters": "По срочным вопросам обращайтесь" + }, + "passwordChange": { + "title": "Изменить пароль", + "currentPassword": "Текущий пароль", + "newPassword": "Новый пароль", + "confirmPassword": "Подтвердите новый пароль", + "currentPasswordPlaceholder": "Введите текущий пароль", + "newPasswordPlaceholder": "Введите новый пароль", + "confirmPasswordPlaceholder": "Подтвердите новый пароль", + "requirements": "Требования к паролю:", + "minLength": "Не менее 6 символов", + "mustDiffer": "Должен отличаться от текущего пароля", + "success": "Пароль успешно изменён", + "failed": "Не удалось изменить пароль", + "currentRequired": "Текущий пароль обязателен", + "newRequired": "Новый пароль обязателен", + "minLengthError": "Пароль должен содержать не менее 6 символов", + "confirmRequired": "Подтвердите новый пароль", + "noMatch": "Пароли не совпадают", + "mustBeDifferent": "Новый пароль должен отличаться от текущего", + "cancel": "Отмена" + }, + "mandatoryPasswordChange": { + "title": "Требуется смена пароля", + "description": "В целях безопасности вы должны изменить пароль перед доступом к панели администратора.", + "success": "Пароль успешно изменён! Теперь вы можете войти в панель администратора.", + "minLength": "Не менее 12 символов", + "mustContainUpperLower": "Должен содержать буквы верхнего и нижнего регистра", + "mustContainNumbers": "Должен содержать цифры", + "mustContainSpecial": "Должен содержать специальные символы (!@#$%^&*)", + "minLengthError": "Пароль должен содержать не менее 12 символов", + "mustContainLowercase": "Пароль должен содержать строчные буквы", + "mustContainUppercase": "Пароль должен содержать заглавные буквы", + "mustContainNumbersError": "Пароль должен содержать цифры", + "mustContainSpecialError": "Пароль должен содержать специальные символы" + }, + "offline": { + "backOnline": "Снова в сети", + "noConnection": "Нет подключения к интернету" + }, + "download": { + "downloading": "Скачивание...", + "percentComplete": "% завершено" + }, + "passwordGenerator": { + "weak": "Слабый", + "fair": "Удовлетворительный", + "good": "Хороший", + "strong": "Надёжный", + "generating": "Генерация...", + "generatePassword": "Сгенерировать пароль", + "showSuggestions": "Показать варианты паролей", + "moreOptions": "Больше вариантов", + "suggestions": "Варианты паролей", + "characters": "символов", + "copyPassword": "Скопировать пароль", + "use": "Использовать", + "pattern": "Паттерн:", + "patternDescription": "Пароли генерируются на основе названия и даты события. Пример: «Место2024$Август» для лучшей запоминаемости и безопасности." + }, + "feedback": { + "comments": "Комментарии", + "addComment": "Добавить комментарий", + "yourName": "Ваше имя", + "yourEmail": "Ваш email", + "writeComment": "Написать комментарий...", + "submit": "Отправить", + "commentSubmitted": "Комментарий отправлен", + "commentError": "Не удалось отправить комментарий", + "rateLimited": "Подождите перед следующим комментарием", + "commentRequired": "Комментарий обязателен", + "nameRequired": "Имя обязательно", + "emailRequired": "Email обязателен", + "anonymous": "Аноним", + "pendingApproval": "Ожидает одобрения", + "noComments": "Комментариев пока нет. Будьте первым!", + "rating": "Рейтинг", + "ratePhoto": "Оценить это фото", + "yourRating": "Ваша оценка", + "averageRating": "Средняя оценка", + "totalRatings": "оценок", + "likes": "Нравится", + "favorites": "Избранное", + "likePhoto": "Отметить «нравится»", + "favoritePhoto": "Добавить в избранное", + "photoFeedback": "Отзыв о фото", + "hasFeedback": "Есть отзыв", + "hasComments": "Есть комментарии", + "hasRating": "Есть оценка", + "settings": { + "title": "Настройки отзывов гостей", + "enableFeedback": "Включить отзывы", + "feedbackTypes": "Типы отзывов", + "ratings": "Звёздные оценки", + "ratingsDesc": "Разрешить гостям оценивать фото (1–5 звёзд)", + "likes": "Нравится", + "likesDesc": "Простая функция лайка/дизлайка", + "comments": "Комментарии", + "commentsDesc": "Текстовые комментарии к фото", + "favorites": "Избранное", + "favoritesDesc": "Отмечать фото как избранные" + } + }, + "filter": { + "feedbackFilters": "Фильтры отзывов", + "clear": "Очистить", + "rating": "Рейтинг", + "allPhotos": "Все фото", + "anyRating": "Любой рейтинг", + "oneStarPlus": "1+ звезда", + "twoStarsPlus": "2+ звезды", + "threeStarsPlus": "3+ звезды", + "fourStarsPlus": "4+ звезды", + "fiveStarsOnly": "Только 5 звёзд", + "hasLikes": "Есть лайки", + "hasFavorites": "Есть в избранном", + "hasComments": "Есть комментарии" + }, + "adminLogin": { + "title": "Вход для администратора", + "subtitle": "Войдите для управления фотогалереями", + "sessionExpired": "Ваша сессия истекла. Пожалуйста, войдите снова.", + "emailLabel": "Адрес электронной почты", + "emailPlaceholder": "admin@example.com", + "emailRequired": "Email обязателен", + "invalidEmail": "Неверный формат email", + "passwordLabel": "Пароль", + "passwordPlaceholder": "Введите пароль", + "passwordRequired": "Пароль обязателен", + "passwordMinLength": "Пароль должен содержать не менее 6 символов", + "rememberMe": "Запомнить меня", + "forgotPassword": "Забыли пароль?", + "signIn": "Войти", + "loginSuccess": "Вход выполнен успешно!", + "networkError": "Ошибка сети. Проверьте подключение и попробуйте снова.", + "tooManyAttempts": "Слишком много попыток входа. Попробуйте позже.", + "invalidCredentials": "Неверный email или пароль", + "generalError": "Произошла ошибка. Попробуйте снова.", + "needHelp": "Нужна помощь? Свяжитесь", + "poweredBy": "Работает на PicPeak", + "devModeHint": "Режим разработки: используйте email: admin@example.com, пароль: admin123" + } +} \ No newline at end of file