Files
TREK/client/src/i18n/translations/ru.ts
T
Maurice d7a71c0572 feat(notifications): reminders for todos with upcoming due dates
Todos already support a due_date field but nothing notifies the user
when a deadline is approaching — you'd only remember if you happened
to look at the Lists tab. This wires a reminder into the existing
notification pipeline so due-date todos behave like trip-start
reminders.

Details:
- New `todo_due` event type alongside trip_reminder; all four channels
  (in-app, email, webhook, ntfy) supported and toggleable per user in
  Settings > Notifications.
- New daily scheduler task (9 AM local TZ) queries unchecked todos
  whose due_date is within the next 3 days. Each todo gets at most
  one reminder per 24 hours, tracked via a new todo_items.reminded_at
  column (migration 116).
- If the todo has an assigned user, only that user is reminded; if
  not, every member of the trip gets the notification.
- Strings added in all 15 UI languages and for all notification
  carriers.
- Gated by app_settings.notify_todo_due (default on) so admins can
  disable it globally.
2026-04-20 17:31:25 +02:00

2351 lines
169 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const ru: Record<string, string> = {
// Common
'common.save': 'Сохранить',
'common.showMore': 'Показать больше',
'common.showLess': 'Показать меньше',
'common.cancel': 'Отмена',
'common.clear': 'Очистить',
'common.delete': 'Удалить',
'common.edit': 'Редактировать',
'common.add': 'Добавить',
'common.loading': 'Загрузка...',
'common.import': 'Импорт',
'common.select': 'Выбрать',
'common.selectAll': 'Выбрать всё',
'common.deselectAll': 'Снять выделение со всех',
'common.error': 'Ошибка',
'common.unknownError': 'Неизвестная ошибка',
'common.tooManyAttempts': 'Слишком много попыток. Попробуйте позже.',
'common.back': 'Назад',
'common.all': 'Все',
'common.close': 'Закрыть',
'common.open': 'Открыть',
'common.upload': 'Загрузить',
'common.search': 'Поиск',
'common.confirm': 'Подтвердить',
'common.ok': 'ОК',
'common.yes': 'Да',
'common.no': 'Нет',
'common.or': 'или',
'common.none': 'Нет',
'common.date': 'Дата',
'common.rename': 'Переименовать',
'common.name': 'Имя',
'common.email': 'Эл. почта',
'common.password': 'Пароль',
'common.saving': 'Сохранение...',
'common.saved': 'Сохранено',
'common.expand': 'Развернуть',
'common.collapse': 'Свернуть',
'trips.memberRemoved': '{username} удалён',
'trips.memberRemoveError': 'Не удалось удалить',
'trips.memberAdded': '{username} добавлен',
'trips.memberAddError': 'Не удалось добавить',
'trips.reminder': 'Напоминание',
'trips.reminderNone': 'Нет',
'trips.reminderDay': 'день',
'trips.reminderDays': 'дней',
'trips.reminderCustom': 'Другое',
'trips.reminderDaysBefore': 'дней до отъезда',
'trips.reminderDisabledHint': 'Напоминания о поездках отключены. Включите их в Админ > Настройки > Уведомления.',
'common.update': 'Обновить',
'common.change': 'Изменить',
'common.uploading': 'Загрузка…',
'common.backToPlanning': 'Вернуться к планированию',
'common.reset': 'Сбросить',
// Navbar
'nav.trip': 'Поездка',
'nav.share': 'Поделиться',
'nav.settings': 'Настройки',
'nav.admin': 'Админ',
'nav.logout': 'Выйти',
'nav.lightMode': 'Светлая тема',
'nav.darkMode': 'Тёмная тема',
'nav.autoMode': 'Авто',
'nav.administrator': 'Администратор',
// Dashboard
'dashboard.title': 'Мои поездки',
'dashboard.subtitle.loading': 'Загрузка поездок...',
'dashboard.subtitle.trips': '{count} поездок ({archived} в архиве)',
'dashboard.subtitle.empty': 'Начните свою первую поездку',
'dashboard.subtitle.activeOne': '{count} активная поездка',
'dashboard.subtitle.activeMany': '{count} активных поездок',
'dashboard.subtitle.archivedSuffix': ' · {count} в архиве',
'dashboard.newTrip': 'Новая поездка',
'dashboard.gridView': 'Плитка',
'dashboard.listView': 'Список',
'dashboard.currency': 'Валюта',
'dashboard.timezone': 'Часовые пояса',
'dashboard.localTime': 'Местное',
'dashboard.timezoneCustomTitle': 'Свой часовой пояс',
'dashboard.timezoneCustomLabelPlaceholder': 'Название (необязательно)',
'dashboard.timezoneCustomTzPlaceholder': 'напр. America/New_York',
'dashboard.timezoneCustomAdd': 'Добавить',
'dashboard.timezoneCustomErrorEmpty': 'Введите идентификатор часового пояса',
'dashboard.timezoneCustomErrorInvalid': 'Неверный часовой пояс. Используйте формат Europe/Berlin',
'dashboard.timezoneCustomErrorDuplicate': 'Уже добавлен',
'dashboard.emptyTitle': 'Нет поездок',
'dashboard.emptyText': 'Создайте свою первую поездку и начните планировать!',
'dashboard.emptyButton': 'Создать первую поездку',
'dashboard.nextTrip': 'Следующая поездка',
'dashboard.shared': 'Общая',
'dashboard.sharedBy': 'Поделился {name}',
'dashboard.days': 'Дни',
'dashboard.places': 'Места',
'dashboard.members': 'Попутчики',
'dashboard.archive': 'Архивировать',
'dashboard.copyTrip': 'Копировать',
'dashboard.copySuffix': 'копия',
'dashboard.restore': 'Восстановить',
'dashboard.archived': 'В архиве',
'dashboard.status.ongoing': 'В процессе',
'dashboard.status.today': 'Сегодня',
'dashboard.status.tomorrow': 'Завтра',
'dashboard.status.past': 'Прошло',
'dashboard.status.daysLeft': 'осталось {count} дн.',
'dashboard.toast.loadError': 'Не удалось загрузить поездки',
'dashboard.toast.created': 'Поездка создана!',
'dashboard.toast.createError': 'Не удалось создать поездку',
'dashboard.toast.updated': 'Поездка обновлена!',
'dashboard.toast.updateError': 'Не удалось обновить поездку',
'dashboard.toast.deleted': 'Поездка удалена',
'dashboard.toast.deleteError': 'Не удалось удалить поездку',
'dashboard.toast.archived': 'Поездка архивирована',
'dashboard.toast.archiveError': 'Не удалось архивировать поездку',
'dashboard.toast.restored': 'Поездка восстановлена',
'dashboard.toast.restoreError': 'Не удалось восстановить поездку',
'dashboard.toast.copied': 'Поездка скопирована!',
'dashboard.toast.copyError': 'Не удалось скопировать поездку',
'dashboard.confirm.delete': 'Удалить поездку «{title}»? Все места и планы будут безвозвратно удалены.',
'dashboard.editTrip': 'Редактировать поездку',
'dashboard.createTrip': 'Создать новую поездку',
'dashboard.tripTitle': 'Название',
'dashboard.tripTitlePlaceholder': 'напр. Лето в Японии',
'dashboard.tripDescription': 'Описание',
'dashboard.tripDescriptionPlaceholder': 'О чём эта поездка?',
'dashboard.startDate': 'Дата начала',
'dashboard.endDate': 'Дата окончания',
'dashboard.dayCount': 'Количество дней',
'dashboard.dayCountHint': 'Сколько дней планировать, если даты поездки не указаны.',
'dashboard.noDateHint': 'Дата не указана — будет создано 7 дней по умолчанию. Вы можете изменить это в любое время.',
'dashboard.coverImage': 'Обложка',
'dashboard.addCoverImage': 'Добавить обложку',
'dashboard.addMembers': 'Попутчики',
'dashboard.addMember': 'Добавить участника',
'dashboard.coverSaved': 'Обложка сохранена',
'dashboard.coverUploadError': 'Ошибка загрузки',
'dashboard.coverRemoveError': 'Ошибка удаления',
'dashboard.titleRequired': 'Название обязательно',
'dashboard.endDateError': 'Дата окончания должна быть позже даты начала',
// Settings
'settings.title': 'Настройки',
'settings.subtitle': 'Настройте свои персональные параметры',
'settings.tabs.display': 'Дисплей',
'settings.tabs.map': 'Карта',
'settings.tabs.notifications': 'Уведомления',
'settings.tabs.integrations': 'Интеграции',
'settings.tabs.account': 'Аккаунт',
'settings.tabs.offline': 'Offline',
'settings.tabs.about': 'О приложении',
'settings.map': 'Карта',
'settings.mapTemplate': 'Шаблон карты',
'settings.mapTemplatePlaceholder.select': 'Выберите шаблон...',
'settings.mapDefaultHint': 'Оставьте пустым для OpenStreetMap (по умолчанию)',
'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
'settings.mapHint': 'URL-шаблон для тайлов карты',
'settings.mapProvider': 'Провайдер карты',
'settings.mapProviderHint': 'Применяется к Trip Planner и Journey. Atlas всегда использует Leaflet.',
'settings.mapLeafletSubtitle': 'Классические 2D, любые растровые тайлы',
'settings.mapMapboxSubtitle': 'Векторные тайлы, 3D-здания и рельеф',
'settings.mapExperimental': 'Экспериментально',
'settings.mapMapboxToken': 'Токен доступа Mapbox',
'settings.mapMapboxTokenHint': 'Публичный токен (pk.*) с',
'settings.mapMapboxTokenLink': 'mapbox.com → Токены доступа',
'settings.mapStyle': 'Стиль карты',
'settings.mapStylePlaceholder': 'Выберите стиль Mapbox',
'settings.mapStyleHint': 'Preset или собственный URL mapbox://styles/USER/ID',
'settings.map3dBuildings': '3D-здания и рельеф',
'settings.map3dHint': 'Наклон + настоящие 3D-здания — работает со всеми стилями, включая спутник.',
'settings.mapHighQuality': 'Режим высокого качества',
'settings.mapHighQualityHint': 'Сглаживание + проекция глобуса для более чётких краёв и реалистичного вида мира.',
'settings.mapHighQualityWarning': 'Может повлиять на производительность на слабых устройствах.',
'settings.mapTipLabel': 'Совет:',
'settings.mapTip': 'Зажмите правую кнопку мыши и перетащите, чтобы повернуть/наклонить карту. Клик средней кнопкой — добавить место (правая кнопка зарезервирована для вращения).',
'settings.latitude': 'Широта',
'settings.longitude': 'Долгота',
'settings.saveMap': 'Сохранить карту',
'settings.apiKeys': 'API-ключи',
'settings.mapsKey': 'API-ключ Google Maps',
'settings.mapsKeyHint': 'Для поиска мест. Требуется Places API (New). Получите на console.cloud.google.com',
'settings.weatherKey': 'API-ключ OpenWeatherMap',
'settings.weatherKeyHint': 'Для данных о погоде. Бесплатно на openweathermap.org/api',
'settings.keyPlaceholder': 'Введите ключ...',
'settings.configured': 'Настроено',
'settings.saveKeys': 'Сохранить ключи',
'settings.display': 'Отображение',
'settings.colorMode': 'Цветовая схема',
'settings.light': 'Светлая',
'settings.dark': 'Тёмная',
'settings.auto': 'Авто',
'settings.language': 'Язык',
'settings.temperature': 'Единица температуры',
'settings.timeFormat': 'Формат времени',
'settings.routeCalculation': 'Расчёт маршрута',
'settings.blurBookingCodes': 'Скрыть коды бронирования',
'settings.notifications': 'Уведомления',
'settings.notifyTripInvite': 'Приглашения в поездку',
'settings.notifyBookingChange': 'Изменения бронирований',
'settings.notifyTripReminder': 'Напоминания о поездке',
'settings.notifyTodoDue': 'Задача к сроку',
'settings.notifyVacayInvite': 'Приглашения слияния Vacay',
'settings.notifyPhotosShared': 'Общие фото (Immich)',
'settings.notifyCollabMessage': 'Сообщения чата (Collab)',
'settings.notifyPackingTagged': 'Список вещей: назначения',
'settings.notifyWebhook': 'Webhook-уведомления',
'settings.notificationsDisabled': 'Уведомления не настроены. Попросите администратора включить уведомления по электронной почте или webhook.',
'settings.notificationsActive': 'Активный канал',
'settings.notificationsManagedByAdmin': 'События уведомлений настраиваются администратором.',
'admin.notifications.title': 'Уведомления',
'admin.notifications.hint': 'Выберите канал уведомлений. Одновременно может быть активен только один.',
'admin.notifications.none': 'Отключено',
'admin.notifications.email': 'Эл. почта (SMTP)',
'admin.notifications.webhook': 'Webhook',
'admin.notifications.save': 'Сохранить настройки уведомлений',
'admin.notifications.saved': 'Настройки уведомлений сохранены',
'admin.notifications.testWebhook': 'Отправить тестовый вебхук',
'admin.notifications.testWebhookSuccess': 'Тестовый вебхук успешно отправлен',
'admin.notifications.testWebhookFailed': 'Ошибка отправки тестового вебхука',
'admin.smtp.title': 'Почта и уведомления',
'admin.smtp.hint': 'Конфигурация SMTP для отправки уведомлений по электронной почте.',
'admin.smtp.testButton': 'Отправить тестовое письмо',
'admin.webhook.hint': 'Отправлять уведомления через внешний webhook (Discord, Slack и т.д.).',
'admin.smtp.testSuccess': 'Тестовое письмо успешно отправлено',
'admin.smtp.testFailed': 'Ошибка отправки тестового письма',
'dayplan.icsTooltip': 'Экспорт календаря (ICS)',
'share.linkTitle': 'Публичная ссылка',
'share.linkHint': 'Создайте ссылку, по которой любой сможет просмотреть эту поездку без входа в систему. Только чтение — редактирование невозможно.',
'share.createLink': 'Создать ссылку',
'share.deleteLink': 'Удалить ссылку',
'share.createError': 'Не удалось создать ссылку',
'common.copy': 'Копировать',
'common.copied': 'Скопировано',
'share.permMap': 'Карта и план',
'share.permBookings': 'Бронирования',
'share.permPacking': 'Вещи',
'shared.expired': 'Ссылка устарела или недействительна',
'shared.expiredHint': 'Эта ссылка на поездку больше не активна.',
'shared.readOnly': 'Режим только для чтения',
'shared.tabPlan': 'План',
'shared.tabBookings': 'Бронирования',
'shared.tabPacking': 'Багаж',
'shared.tabBudget': 'Бюджет',
'shared.tabChat': 'Чат',
'shared.days': 'дней',
'shared.places': 'мест',
'shared.other': 'Прочее',
'shared.totalBudget': 'Общий бюджет',
'shared.messages': 'сообщений',
'shared.sharedVia': 'Поделено через',
'shared.confirmed': 'Подтверждено',
'shared.pending': 'Ожидает',
'share.permBudget': 'Бюджет',
'share.permCollab': 'Чат',
'settings.on': 'Вкл.',
'settings.off': 'Выкл.',
'settings.mcp.title': 'Настройка MCP',
'settings.mcp.endpoint': 'MCP-эндпоинт',
'settings.mcp.clientConfig': 'Конфигурация клиента',
'settings.mcp.clientConfigHint': 'Замените <your_token> на API-токен из списка ниже. Путь к npx может потребовать настройки для вашей системы (например, C:\\PROGRA~1\\nodejs\\npx.cmd в Windows).',
'settings.mcp.clientConfigHintOAuth': 'Замените <your_client_id> и <your_client_secret> на учётные данные из созданного выше клиента OAuth 2.1. При первом подключении mcp-remote откроет браузер для завершения авторизации. Путь к npx может потребовать настройки для вашей системы (например, C:\\PROGRA~1\\nodejs\\npx.cmd в Windows).',
'settings.mcp.copy': 'Копировать',
'settings.mcp.copied': 'Скопировано!',
'settings.mcp.apiTokens': 'API-токены',
'settings.mcp.createToken': 'Создать токен',
'settings.mcp.noTokens': 'Токенов пока нет. Создайте один для подключения MCP-клиентов.',
'settings.mcp.tokenCreatedAt': 'Создан',
'settings.mcp.tokenUsedAt': 'Использован',
'settings.mcp.deleteTokenTitle': 'Удалить токен',
'settings.mcp.deleteTokenMessage': 'Этот токен перестанет работать немедленно. Любой MCP-клиент, использующий его, потеряет доступ.',
'settings.mcp.modal.createTitle': 'Создать API-токен',
'settings.mcp.modal.tokenName': 'Название токена',
'settings.mcp.modal.tokenNamePlaceholder': 'напр. Claude Desktop, Рабочий ноутбук',
'settings.mcp.modal.creating': 'Создание…',
'settings.mcp.modal.create': 'Создать токен',
'settings.mcp.modal.createdTitle': 'Токен создан',
'settings.mcp.modal.createdWarning': 'Этот токен будет показан только один раз. Скопируйте и сохраните его сейчас — восстановить его будет невозможно.',
'settings.mcp.modal.done': 'Готово',
'settings.mcp.toast.created': 'Токен создан',
'settings.mcp.toast.createError': 'Не удалось создать токен',
'settings.mcp.toast.deleted': 'Токен удалён',
'settings.mcp.toast.deleteError': 'Не удалось удалить токен',
'settings.mcp.apiTokensDeprecated': 'API-токены устарели и будут удалены в будущей версии. Пожалуйста, используйте клиенты OAuth 2.1.',
'settings.oauth.clients': 'Клиенты OAuth 2.1',
'settings.oauth.clientsHint': 'Зарегистрируйте клиенты OAuth 2.1, чтобы сторонние MCP-приложения (Claude Web, Cursor и др.) могли подключаться без статических токенов.',
'settings.oauth.createClient': 'Новый клиент',
'settings.oauth.noClients': 'Нет зарегистрированных клиентов OAuth.',
'settings.oauth.clientId': 'ID клиента',
'settings.oauth.clientSecret': 'Секрет клиента',
'settings.oauth.deleteClient': 'Удалить клиента',
'settings.oauth.deleteClientMessage': 'Этот клиент и все активные сессии будут удалены навсегда. Любое приложение, использующее его, немедленно потеряет доступ.',
'settings.oauth.rotateSecret': 'Обновить секрет',
'settings.oauth.rotateSecretMessage': 'Будет сгенерирован новый секрет клиента, а все существующие сессии будут немедленно аннулированы. Обновите приложение перед закрытием этого диалога.',
'settings.oauth.rotateSecretConfirm': 'Обновить',
'settings.oauth.rotateSecretConfirming': 'Обновление…',
'settings.oauth.rotateSecretDoneTitle': 'Новый секрет сгенерирован',
'settings.oauth.rotateSecretDoneWarning': 'Этот секрет отображается только один раз. Скопируйте его сейчас и обновите приложение — все предыдущие сессии были аннулированы.',
'settings.oauth.activeSessions': 'Активные сессии OAuth',
'settings.oauth.sessionScopes': 'Области доступа',
'settings.oauth.sessionExpires': 'Истекает',
'settings.oauth.revoke': 'Отозвать',
'settings.oauth.revokeSession': 'Отозвать сессию',
'settings.oauth.revokeSessionMessage': 'Это немедленно отзовёт доступ для данной сессии OAuth.',
'settings.oauth.modal.createTitle': 'Зарегистрировать клиент OAuth',
'settings.oauth.modal.presets': 'Быстрые настройки',
'settings.oauth.modal.clientName': 'Название приложения',
'settings.oauth.modal.clientNamePlaceholder': 'напр. Claude Web, Моё MCP-приложение',
'settings.oauth.modal.redirectUris': 'URI перенаправления',
'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth',
'settings.oauth.modal.redirectUrisHint': 'Один URI на строку. Требуется HTTPS (localhost исключён). Требуется точное совпадение.',
'settings.oauth.modal.scopes': 'Разрешённые области доступа',
'settings.oauth.modal.scopesHint': 'list_trips и get_trip_summary всегда доступны — область не требуется. Они помогают ИИ находить нужные ID поездок.',
'settings.oauth.modal.selectAll': 'Выбрать все',
'settings.oauth.modal.deselectAll': 'Снять выбор',
'settings.oauth.modal.creating': 'Регистрация…',
'settings.oauth.modal.create': 'Зарегистрировать клиента',
'settings.oauth.modal.createdTitle': 'Клиент зарегистрирован',
'settings.oauth.modal.createdWarning': 'Секрет клиента отображается только один раз. Скопируйте его сейчас — его нельзя будет восстановить.',
'settings.oauth.toast.createError': 'Не удалось зарегистрировать клиент OAuth',
'settings.oauth.toast.deleted': 'Клиент OAuth удалён',
'settings.oauth.toast.deleteError': 'Не удалось удалить клиент OAuth',
'settings.oauth.toast.revoked': 'Сессия отозвана',
'settings.oauth.toast.revokeError': 'Не удалось отозвать сессию',
'settings.oauth.toast.rotateError': 'Не удалось обновить секрет клиента',
'settings.account': 'Аккаунт',
'settings.about': 'О приложении',
'settings.about.reportBug': 'Сообщить об ошибке',
'settings.about.reportBugHint': 'Нашли проблему? Сообщите нам',
'settings.about.featureRequest': 'Предложить функцию',
'settings.about.featureRequestHint': 'Предложите новую функцию',
'settings.about.wikiHint': 'Документация и руководства',
'settings.about.supporters.badge': 'Ежемесячные спонсоры',
'settings.about.supporters.title': 'Спутники TREK',
'settings.about.supporters.subtitle': 'Пока ты планируешь следующий маршрут, эти люди планируют вместе со мной будущее TREK. Их ежемесячный взнос идёт напрямую в разработку и реально потраченные часы — чтобы TREK оставался Open Source.',
'settings.about.supporters.since': 'спонсор с {date}',
'settings.about.supporters.tierEmpty': 'Стань первым',
'settings.about.supporter.tier.noReturnTicket': 'No Return Ticket',
'settings.about.supporter.tier.lostLuggageVip': 'Lost Luggage VIP',
'settings.about.supporter.tier.businessClassDreamer': 'Business Class Dreamer',
'settings.about.supporter.tier.budgetTraveller': 'Budget Traveller',
'settings.about.supporter.tier.hostelBunkmate': 'Hostel Bunkmate',
'settings.about.description': 'TREK — это самостоятельно размещаемый планировщик путешествий, который помогает организовать поездки от первой идеи до последнего воспоминания. Планирование по дням, бюджет, списки вещей, фото и многое другое — всё в одном месте, на вашем собственном сервере.',
'settings.about.madeWith': 'Сделано с',
'settings.about.madeBy': 'Морисом и растущим open-source сообществом.',
'settings.username': 'Имя пользователя',
'settings.email': 'Эл. почта',
'settings.role': 'Роль',
'settings.roleAdmin': 'Администратор',
'settings.oidcLinked': 'Связан с',
'settings.changePassword': 'Изменить пароль',
'settings.mustChangePassword': 'Вы должны сменить пароль перед продолжением. Пожалуйста, установите новый пароль ниже.',
'settings.currentPassword': 'Текущий пароль',
'settings.currentPasswordRequired': 'Текущий пароль обязателен',
'settings.newPassword': 'Новый пароль',
'settings.confirmPassword': 'Подтвердите новый пароль',
'settings.updatePassword': 'Обновить пароль',
'settings.passwordRequired': 'Введите текущий и новый пароль',
'settings.passwordTooShort': 'Пароль должен содержать не менее 8 символов',
'settings.passwordMismatch': 'Пароли не совпадают',
'settings.passwordWeak': 'Пароль должен содержать заглавные, строчные буквы, цифру и специальный символ',
'settings.passwordChanged': 'Пароль успешно изменён',
'settings.deleteAccount': 'Удалить аккаунт',
'settings.deleteAccountTitle': 'Удалить ваш аккаунт?',
'settings.deleteAccountWarning': 'Ваш аккаунт и все поездки, места и файлы будут безвозвратно удалены. Это действие нельзя отменить.',
'settings.deleteAccountConfirm': 'Удалить безвозвратно',
'settings.deleteBlockedTitle': 'Удаление невозможно',
'settings.deleteBlockedMessage': 'Вы единственный администратор. Назначьте другого пользователя администратором перед удалением своего аккаунта.',
'settings.roleUser': 'Пользователь',
'settings.saveProfile': 'Сохранить профиль',
'settings.mfa.title': 'Двухфакторная аутентификация (2FA)',
'settings.mfa.description': 'Добавляет второй шаг при входе. Используйте приложение-аутентификатор (Google Authenticator, Authy и др.).',
'settings.mfa.requiredByPolicy': 'Администратор требует двухфакторную аутентификацию. Настройте приложение-аутентификатор ниже, прежде чем продолжить.',
'settings.mfa.backupTitle': 'Резервные коды',
'settings.mfa.backupDescription': 'Используйте эти одноразовые коды, если потеряете доступ к приложению-аутентификатору.',
'settings.mfa.backupWarning': 'Сохраните их сейчас. Каждый код можно использовать только один раз.',
'settings.mfa.backupCopy': 'Скопировать коды',
'settings.mfa.backupDownload': 'Скачать TXT',
'settings.mfa.backupPrint': 'Печать / PDF',
'settings.mfa.backupCopied': 'Резервные коды скопированы',
'settings.mfa.enabled': '2FA включена для вашего аккаунта.',
'settings.mfa.disabled': '2FA не включена.',
'settings.mfa.setup': 'Настроить аутентификатор',
'settings.mfa.scanQr': 'Отсканируйте QR-код приложением или введите ключ вручную.',
'settings.mfa.secretLabel': 'Секретный ключ (ручной ввод)',
'settings.mfa.codePlaceholder': '6-значный код',
'settings.mfa.enable': 'Включить 2FA',
'settings.mfa.cancelSetup': 'Отмена',
'settings.mfa.disableTitle': 'Отключить 2FA',
'settings.mfa.disableHint': 'Введите пароль аккаунта и текущий код из аутентификатора.',
'settings.mfa.disable': 'Отключить 2FA',
'settings.mfa.toastEnabled': 'Двухфакторная аутентификация включена',
'settings.mfa.toastDisabled': 'Двухфакторная аутентификация отключена',
'settings.mfa.demoBlocked': 'Недоступно в демо-режиме',
'settings.toast.mapSaved': 'Настройки карты сохранены',
'settings.toast.keysSaved': 'API-ключи сохранены',
'settings.toast.displaySaved': 'Настройки отображения сохранены',
'settings.toast.profileSaved': 'Профиль сохранён',
'settings.uploadAvatar': 'Загрузить фото профиля',
'settings.removeAvatar': 'Удалить фото профиля',
'settings.avatarUploaded': 'Фото профиля обновлено',
'settings.avatarRemoved': 'Фото профиля удалено',
'settings.avatarError': 'Ошибка загрузки',
// Login
'login.error': 'Ошибка входа. Проверьте свои учётные данные.',
'login.tagline': 'Ваши поездки.\nВаш план.',
'login.description': 'Планируйте поездки совместно с интерактивными картами, бюджетами и синхронизацией в реальном времени.',
'login.features.maps': 'Интерактивные карты',
'login.features.mapsDesc': 'Google Places, маршруты и кластеризация',
'login.features.realtime': 'Синхронизация в реальном времени',
'login.features.realtimeDesc': 'Планируйте вместе через WebSocket',
'login.features.budget': 'Контроль бюджета',
'login.features.budgetDesc': 'Категории, графики и расходы на человека',
'login.features.collab': 'Совместная работа',
'login.features.collabDesc': 'Многопользовательский режим с общими поездками',
'login.features.packing': 'Списки вещей',
'login.features.packingDesc': 'Категории, прогресс и подсказки',
'login.features.bookings': 'Бронирования',
'login.features.bookingsDesc': 'Авиабилеты, отели, рестораны и многое другое',
'login.features.files': 'Документы',
'login.features.filesDesc': 'Загружайте и управляйте документами',
'login.features.routes': 'Умные маршруты',
'login.features.routesDesc': 'Автооптимизация и экспорт в Google Maps',
'login.selfHosted': 'Самостоятельный хостинг · Открытый код · Ваши данные остаются у вас',
'login.title': 'Вход',
'login.subtitle': 'С возвращением',
'login.signingIn': 'Вход…',
'login.signIn': 'Войти',
'login.createAdmin': 'Создать аккаунт администратора',
'login.createAdminHint': 'Настройте первый аккаунт администратора для TREK.',
'login.setNewPassword': 'Установить новый пароль',
'login.setNewPasswordHint': 'Вы должны сменить пароль, прежде чем продолжить.',
'login.createAccount': 'Создать аккаунт',
'login.createAccountHint': 'Зарегистрируйте новый аккаунт.',
'login.creating': 'Создание…',
'login.noAccount': 'Нет аккаунта?',
'login.hasAccount': 'Уже есть аккаунт?',
'login.register': 'Регистрация',
'login.emailPlaceholder': 'ваш@email.com',
'login.username': 'Имя пользователя',
'login.oidc.registrationDisabled': 'Регистрация отключена. Обратитесь к администратору.',
'login.oidc.noEmail': 'Провайдер не предоставил адрес эл. почты.',
'login.mfaTitle': 'Двухфакторная аутентификация',
'login.mfaSubtitle': 'Введите 6-значный код из приложения-аутентификатора.',
'login.mfaCodeLabel': 'Код подтверждения',
'login.mfaCodeRequired': 'Введите код из приложения-аутентификатора.',
'login.mfaHint': 'Откройте Google Authenticator, Authy или другое TOTP-приложение.',
'login.mfaBack': '← Назад к входу',
'login.mfaVerify': 'Подтвердить',
'login.invalidInviteLink': 'Недействительная или истёкшая ссылка-приглашение',
'login.oidcFailed': 'Ошибка входа через OIDC',
'login.usernameRequired': 'Имя пользователя обязательно',
'login.passwordMinLength': 'Пароль должен содержать не менее 8 символов',
'login.forgotPassword': 'Забыли пароль?',
'login.forgotPasswordTitle': 'Сброс пароля',
'login.forgotPasswordBody': 'Введите e-mail, с которым вы регистрировались. Если аккаунт найдём — отправим ссылку для сброса.',
'login.forgotPasswordSubmit': 'Отправить ссылку',
'login.forgotPasswordSentTitle': 'Проверьте почту',
'login.forgotPasswordSentBody': 'Если аккаунт существует, ссылка для сброса уже летит к вам. Она действительна 60 минут.',
'login.forgotPasswordSmtpHintOff': 'Обратите внимание: администратор не настроил SMTP, поэтому ссылка для сброса будет записана в консоль сервера, а не отправлена по почте.',
'login.backToLogin': 'Вернуться ко входу',
'login.newPassword': 'Новый пароль',
'login.confirmPassword': 'Подтвердите новый пароль',
'login.passwordsDontMatch': 'Пароли не совпадают',
'login.mfaCode': 'Код 2FA',
'login.resetPasswordTitle': 'Задайте новый пароль',
'login.resetPasswordBody': 'Выберите надёжный пароль, который вы здесь ещё не использовали. Минимум 8 символов.',
'login.resetPasswordMfaBody': 'Введите код 2FA или резервный код, чтобы завершить сброс.',
'login.resetPasswordSubmit': 'Сбросить пароль',
'login.resetPasswordVerify': 'Проверить и сбросить',
'login.resetPasswordSuccessTitle': 'Пароль обновлён',
'login.resetPasswordSuccessBody': 'Теперь вы можете войти с новым паролем.',
'login.resetPasswordInvalidLink': 'Неверная ссылка сброса',
'login.resetPasswordInvalidLinkBody': 'Ссылка отсутствует или повреждена. Запросите новую, чтобы продолжить.',
'login.resetPasswordFailed': 'Сброс не удался. Возможно, срок действия ссылки истёк.',
'login.oidc.tokenFailed': 'Аутентификация не удалась.',
'login.oidc.invalidState': 'Недействительная сессия. Попробуйте снова.',
'login.demoFailed': 'Ошибка демо-входа',
'login.oidcSignIn': 'Войти через {name}',
'login.oidcOnly': 'Вход по паролю отключён. Используйте вашего провайдера SSO для входа.',
'login.oidcLoggedOut': 'Вы вышли из системы. Войдите снова через вашего провайдера SSO.',
'login.demoHint': 'Попробуйте демо — регистрация не требуется',
// Register
'register.passwordMismatch': 'Пароли не совпадают',
'register.passwordTooShort': 'Пароль должен содержать не менее 8 символов',
'register.failed': 'Ошибка регистрации',
'register.getStarted': 'Начать',
'register.subtitle': 'Создайте аккаунт и начните планировать поездки мечты.',
'register.feature1': 'Неограниченные планы поездок',
'register.feature2': 'Интерактивная карта',
'register.feature3': 'Управление местами и категориями',
'register.feature4': 'Отслеживание бронирований',
'register.feature5': 'Создание списков вещей',
'register.feature6': 'Хранение фото и файлов',
'register.createAccount': 'Создать аккаунт',
'register.startPlanning': 'Начните планировать свои поездки',
'register.minChars': 'Мин. 6 символов',
'register.confirmPassword': 'Подтвердите пароль',
'register.repeatPassword': 'Повторите пароль',
'register.registering': 'Регистрация...',
'register.register': 'Зарегистрироваться',
'register.hasAccount': 'Уже есть аккаунт?',
'register.signIn': 'Войти',
// Admin
'admin.title': 'Администрирование',
'admin.subtitle': 'Управление пользователями и системные настройки',
'admin.tabs.users': 'Пользователи',
'admin.tabs.categories': 'Категории',
'admin.tabs.backup': 'Резервная копия',
'admin.tabs.audit': 'Аудит',
'admin.stats.users': 'Пользователи',
'admin.stats.trips': 'Поездки',
'admin.stats.places': 'Места',
'admin.stats.photos': 'Фото',
'admin.stats.files': 'Файлы',
'admin.table.user': 'Пользователь',
'admin.table.email': 'Эл. почта',
'admin.table.role': 'Роль',
'admin.table.created': 'Создан',
'admin.table.lastLogin': 'Последний вход',
'admin.table.actions': 'Действия',
'admin.you': '(Вы)',
'admin.editUser': 'Редактировать пользователя',
'admin.newPassword': 'Новый пароль',
'admin.newPasswordHint': 'Оставьте пустым, чтобы сохранить текущий пароль',
'admin.deleteUser': 'Удалить пользователя «{name}»? Все поездки будут безвозвратно удалены.',
'admin.deleteUserTitle': 'Удалить пользователя',
'admin.newPasswordPlaceholder': 'Введите новый пароль…',
'admin.toast.loadError': 'Не удалось загрузить данные администрирования',
'admin.toast.userUpdated': 'Пользователь обновлён',
'admin.toast.updateError': 'Ошибка обновления',
'admin.toast.userDeleted': 'Пользователь удалён',
'admin.toast.deleteError': 'Ошибка удаления',
'admin.toast.cannotDeleteSelf': 'Нельзя удалить собственный аккаунт',
'admin.toast.userCreated': 'Пользователь создан',
'admin.toast.createError': 'Ошибка создания пользователя',
'admin.toast.fieldsRequired': 'Имя пользователя, эл. почта и пароль обязательны',
'admin.createUser': 'Создать пользователя',
'admin.invite.title': 'Ссылки-приглашения',
'admin.invite.subtitle': 'Создание одноразовых ссылок для регистрации',
'admin.invite.create': 'Создать ссылку',
'admin.invite.createAndCopy': 'Создать и скопировать',
'admin.invite.empty': 'Ссылки-приглашения ещё не созданы',
'admin.invite.maxUses': 'Макс. использований',
'admin.invite.expiry': 'Действует',
'admin.invite.uses': 'использовано',
'admin.invite.expiresAt': 'истекает',
'admin.invite.createdBy': 'от',
'admin.invite.active': 'Активна',
'admin.invite.expired': 'Истекла',
'admin.invite.usedUp': 'Исчерпана',
'admin.invite.copied': 'Ссылка-приглашение скопирована',
'admin.invite.copyLink': 'Копировать ссылку',
'admin.invite.deleted': 'Ссылка-приглашение удалена',
'admin.invite.createError': 'Ошибка при создании ссылки',
'admin.invite.deleteError': 'Ошибка при удалении ссылки',
'admin.tabs.settings': 'Настройки',
'admin.allowRegistration': 'Разрешить регистрацию',
'admin.allowRegistrationHint': 'Новые пользователи могут регистрироваться самостоятельно',
'admin.authMethods': 'Authentication Methods',
'admin.passwordLogin': 'Password Login',
'admin.passwordLoginHint': 'Allow users to sign in with email and password',
'admin.passwordRegistration': 'Password Registration',
'admin.passwordRegistrationHint': 'Allow new users to register with email and password',
'admin.oidcLogin': 'SSO Login',
'admin.oidcLoginHint': 'Allow users to sign in with SSO',
'admin.oidcRegistration': 'SSO Auto-Provisioning',
'admin.oidcRegistrationHint': 'Automatically create accounts for new SSO users',
'admin.envOverrideHint': 'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.',
'admin.lockoutWarning': 'At least one login method must remain enabled',
'admin.requireMfa': 'Требовать двухфакторную аутентификацию (2FA)',
'admin.requireMfaHint': 'Пользователи без 2FA должны завершить настройку в разделе «Настройки» перед использованием приложения.',
'admin.apiKeys': 'API-ключи',
'admin.apiKeysHint': 'Необязательно. Включает расширенные данные о местах, такие как фото и погода.',
'admin.mapsKey': 'API-ключ Google Maps',
'admin.mapsKeyHint': 'Необходим для поиска мест. Получите на console.cloud.google.com',
'admin.mapsKeyHintLong': 'Без API-ключа используется OpenStreetMap для поиска мест. С ключом Google API можно загружать фото, рейтинги и часы работы. Получите ключ на console.cloud.google.com.',
'admin.recommended': 'Рекомендуется',
'admin.weatherKey': 'API-ключ OpenWeatherMap',
'admin.weatherKeyHint': 'Для данных о погоде. Бесплатно на openweathermap.org',
'admin.validateKey': 'Проверить',
'admin.keyValid': 'Подключено',
'admin.keyInvalid': 'Недействителен',
'admin.keySaved': 'API-ключи сохранены',
'admin.oidcTitle': 'Единый вход (OIDC)',
'admin.oidcSubtitle': 'Разрешить вход через внешних провайдеров, таких как Google, Apple, Authentik или Keycloak.',
'admin.oidcDisplayName': 'Отображаемое имя',
'admin.oidcIssuer': 'URL издателя',
'admin.oidcIssuerHint': 'URL издателя OpenID Connect провайдера. Напр. https://accounts.google.com',
'admin.oidcSaved': 'Конфигурация OIDC сохранена',
'admin.oidcOnlyMode': 'Отключить вход по паролю',
'admin.oidcOnlyModeHint': 'При включении разрешён только вход через SSO. Вход и регистрация по паролю будут заблокированы.',
// File Types
'admin.fileTypes': 'Разрешённые типы файлов',
'admin.fileTypesHint': 'Настройте, какие типы файлов могут загружать пользователи.',
'admin.fileTypesFormat': 'Расширения через запятую (напр. jpg,png,pdf,doc). Используйте * для разрешения всех типов.',
'admin.fileTypesSaved': 'Настройки типов файлов сохранены',
'admin.placesPhotos.title': 'Фотографии мест',
'admin.placesPhotos.subtitle': 'Загрузка фотографий из Google Places API. Отключите для экономии квоты API. Фотографии Wikimedia не затронуты.',
'admin.placesAutocomplete.title': 'Автодополнение мест',
'admin.placesAutocomplete.subtitle': 'Использование Google Places API для поисковых подсказок. Отключите для экономии квоты API.',
'admin.placesDetails.title': 'Сведения о месте',
'admin.placesDetails.subtitle': 'Загрузка подробной информации о месте (часы работы, рейтинг, веб-сайт) из Google Places API. Отключите для экономии квоты API.',
'admin.bagTracking.title': 'Отслеживание багажа',
'admin.bagTracking.subtitle': 'Включить вес и привязку к багажу для вещей',
'admin.collab.chat.title': 'Чат',
'admin.collab.chat.subtitle': 'Обмен сообщениями для совместной работы',
'admin.collab.notes.title': 'Заметки',
'admin.collab.notes.subtitle': 'Общие заметки и документы',
'admin.collab.polls.title': 'Опросы',
'admin.collab.polls.subtitle': 'Групповые опросы и голосования',
'admin.collab.whatsnext.title': 'Что дальше',
'admin.collab.whatsnext.subtitle': 'Предложения активностей и следующие шаги',
'admin.tabs.config': 'Персонализация',
'admin.tabs.defaults': 'Настройки по умолчанию',
'admin.defaultSettings.title': 'Настройки пользователей по умолчанию',
'admin.defaultSettings.description': 'Задайте значения по умолчанию для всего экземпляра. Пользователи, не изменившие параметр, увидят эти значения. Их собственные изменения всегда имеют приоритет.',
'admin.defaultSettings.saved': 'Значение по умолчанию сохранено',
'admin.defaultSettings.reset': 'Сбросить до встроенного значения',
'admin.defaultSettings.resetToBuiltIn': 'сбросить',
'admin.tabs.templates': 'Шаблоны упаковки',
'admin.packingTemplates.title': 'Шаблоны упаковки',
'admin.packingTemplates.subtitle': 'Создавайте многоразовые списки вещей для поездок',
'admin.packingTemplates.create': 'Новый шаблон',
'admin.packingTemplates.namePlaceholder': 'Название шаблона (напр. Пляжный отдых)',
'admin.packingTemplates.empty': 'Шаблоны ещё не созданы',
'admin.packingTemplates.items': 'вещей',
'admin.packingTemplates.categories': 'категорий',
'admin.packingTemplates.itemName': 'Название вещи',
'admin.packingTemplates.itemCategory': 'Категория',
'admin.packingTemplates.categoryName': 'Название категории (напр. Одежда)',
'admin.packingTemplates.addCategory': 'Добавить категорию',
'admin.packingTemplates.created': 'Шаблон создан',
'admin.packingTemplates.deleted': 'Шаблон удалён',
'admin.packingTemplates.loadError': 'Ошибка загрузки шаблонов',
'admin.packingTemplates.createError': 'Ошибка создания шаблона',
'admin.packingTemplates.deleteError': 'Ошибка удаления шаблона',
'admin.packingTemplates.saveError': 'Ошибка сохранения',
// Addons
'admin.tabs.addons': 'Дополнения',
'admin.addons.title': 'Дополнения',
'admin.addons.subtitle': 'Включайте или отключайте функции для настройки TREK под себя.',
'admin.addons.catalog.memories.name': 'Фото (Immich)',
'admin.addons.catalog.memories.description': 'Делитесь фотографиями из поездок через Immich',
'admin.addons.catalog.mcp.name': 'MCP',
'admin.addons.catalog.mcp.description': 'Протокол контекста модели для интеграции с ИИ-ассистентами',
'admin.addons.catalog.packing.name': 'Списки',
'admin.addons.catalog.packing.description': 'Списки вещей и задачи для ваших поездок',
'admin.addons.catalog.budget.name': 'Бюджет',
'admin.addons.catalog.budget.description': 'Отслеживайте расходы и планируйте бюджет поездки',
'admin.addons.catalog.documents.name': 'Документы',
'admin.addons.catalog.documents.description': 'Храните и управляйте документами для путешествий',
'admin.addons.catalog.vacay.name': 'Vacay',
'admin.addons.catalog.vacay.description': 'Личный планировщик отпусков с календарём',
'admin.addons.catalog.atlas.name': 'Atlas',
'admin.addons.catalog.atlas.description': 'Карта мира с посещёнными странами и статистикой путешествий',
'admin.addons.catalog.collab.name': 'Collab',
'admin.addons.catalog.collab.description': 'Заметки в реальном времени, опросы и чат для планирования поездок',
'admin.addons.subtitleBefore': 'Включайте или отключайте функции для настройки ',
'admin.addons.subtitleAfter': ' под себя.',
'admin.addons.enabled': 'Включено',
'admin.addons.disabled': 'Отключено',
'admin.addons.type.trip': 'Поездка',
'admin.addons.type.global': 'Глобально',
'admin.addons.type.integration': 'Интеграция',
'admin.addons.tripHint': 'Доступно как вкладка внутри каждой поездки',
'admin.addons.globalHint': 'Доступно как отдельный раздел в основной навигации',
'admin.addons.integrationHint': 'Фоновые сервисы и API-интеграции без отдельной страницы',
'admin.addons.toast.updated': 'Дополнение обновлено',
'admin.addons.toast.error': 'Не удалось обновить дополнение',
'admin.addons.noAddons': 'Нет доступных дополнений',
// Weather info
'admin.weather.title': 'Данные о погоде',
'admin.weather.badge': 'С 24 марта 2026',
'admin.weather.description': 'TREK использует Open-Meteo как источник данных о погоде. Open-Meteo — бесплатный сервис с открытым кодом, API-ключ не требуется.',
'admin.weather.forecast': 'Прогноз на 16 дней',
'admin.weather.forecastDesc': 'Ранее 5 дней (OpenWeatherMap)',
'admin.weather.climate': 'Исторические климатические данные',
'admin.weather.climateDesc': 'Средние значения за последние 85 лет для дней за пределами 16-дневного прогноза',
'admin.weather.requests': '10 000 запросов / день',
'admin.weather.requestsDesc': 'Бесплатно, API-ключ не требуется',
'admin.weather.locationHint': 'Погода основана на первом месте с координатами в каждом дне. Если ни одно место не назначено на день, в качестве ориентира используется любое место из списка.',
// MCP Tokens
'admin.tabs.mcpTokens': 'MCP-доступ',
'admin.mcpTokens.title': 'MCP-доступ',
'admin.mcpTokens.subtitle': 'Управление OAuth-сессиями и API-токенами всех пользователей',
'admin.mcpTokens.sectionTitle': 'API-токены',
'admin.mcpTokens.owner': 'Владелец',
'admin.mcpTokens.tokenName': 'Название токена',
'admin.mcpTokens.created': 'Создан',
'admin.mcpTokens.lastUsed': 'Последнее использование',
'admin.mcpTokens.never': 'Никогда',
'admin.mcpTokens.empty': 'MCP-токены ещё не созданы',
'admin.mcpTokens.deleteTitle': 'Удалить токен',
'admin.mcpTokens.deleteMessage': 'Токен будет немедленно отозван. Пользователь потеряет доступ к MCP через этот токен.',
'admin.mcpTokens.deleteSuccess': 'Токен удалён',
'admin.mcpTokens.deleteError': 'Не удалось удалить токен',
'admin.mcpTokens.loadError': 'Не удалось загрузить токены',
'admin.oauthSessions.sectionTitle': 'OAuth-сессии',
'admin.oauthSessions.clientName': 'Клиент',
'admin.oauthSessions.owner': 'Владелец',
'admin.oauthSessions.scopes': 'Права доступа',
'admin.oauthSessions.created': 'Создано',
'admin.oauthSessions.empty': 'Нет активных OAuth-сессий',
'admin.oauthSessions.revokeTitle': 'Отозвать сессию',
'admin.oauthSessions.revokeMessage': 'Эта OAuth-сессия будет немедленно отозвана. Клиент потеряет доступ к MCP.',
'admin.oauthSessions.revokeSuccess': 'Сессия отозвана',
'admin.oauthSessions.revokeError': 'Не удалось отозвать сессию',
'admin.oauthSessions.loadError': 'Не удалось загрузить OAuth-сессии',
// GitHub
'admin.tabs.github': 'GitHub',
'admin.audit.subtitle': 'События, связанные с безопасностью и администрированием (резервные копии, пользователи, MFA, настройки).',
'admin.audit.empty': 'Записей аудита пока нет.',
'admin.audit.refresh': 'Обновить',
'admin.audit.loadMore': 'Загрузить ещё',
'admin.audit.showing': 'Загружено: {count} · всего {total}',
'admin.audit.col.time': 'Время',
'admin.audit.col.user': 'Пользователь',
'admin.audit.col.action': 'Действие',
'admin.audit.col.resource': 'Объект',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': 'Подробности',
'admin.github.title': 'История релизов',
'admin.github.subtitle': 'Последние обновления из {repo}',
'admin.github.latest': 'Последний',
'admin.github.prerelease': 'Пре-релиз',
'admin.github.showDetails': 'Показать подробности',
'admin.github.hideDetails': 'Скрыть подробности',
'admin.github.loadMore': 'Загрузить ещё',
'admin.github.loading': 'Загрузка...',
'admin.github.support': 'Помогает продолжать разработку TREK',
'admin.github.error': 'Не удалось загрузить релизы',
'admin.github.by': 'от',
'admin.update.available': 'Доступно обновление',
'admin.update.text': 'Доступна версия TREK {version}. У вас установлена {current}.',
'admin.update.button': 'Посмотреть на GitHub',
'admin.update.install': 'Установить обновление',
'admin.update.confirmTitle': 'Установить обновление?',
'admin.update.confirmText': 'TREK будет обновлён с {current} до {version}. Сервер перезапустится автоматически.',
'admin.update.dataInfo': 'Все ваши данные (поездки, пользователи, API-ключи, загрузки, Vacay, Atlas, бюджеты) будут сохранены.',
'admin.update.warning': 'Приложение будет кратковременно недоступно во время перезапуска.',
'admin.update.confirm': 'Обновить сейчас',
'admin.update.installing': 'Обновление…',
'admin.update.success': 'Обновление установлено! Сервер перезапускается…',
'admin.update.failed': 'Ошибка обновления',
'admin.update.backupHint': 'Рекомендуем создать резервную копию перед обновлением.',
'admin.update.backupLink': 'Перейти к резервным копиям',
'admin.update.howTo': 'Как обновить',
'admin.update.dockerText': 'Ваш экземпляр TREK работает в Docker. Для обновления до {version} выполните следующие команды на сервере:',
'admin.update.reloadHint': 'Перезагрузите страницу через несколько секунд.',
// Vacay addon
'vacay.subtitle': 'Планируйте и управляйте днями отпуска',
'vacay.settings': 'Настройки',
'vacay.year': 'Год',
'vacay.addYear': 'Добавить следующий год',
'vacay.addPrevYear': 'Добавить предыдущий год',
'vacay.removeYear': 'Удалить год',
'vacay.removeYearConfirm': 'Удалить {year}?',
'vacay.removeYearHint': 'Все записи об отпуске и корпоративные выходные за этот год будут безвозвратно удалены.',
'vacay.remove': 'Удалить',
'vacay.persons': 'Люди',
'vacay.noPersons': 'Никто не добавлен',
'vacay.addPerson': 'Добавить человека',
'vacay.editPerson': 'Редактировать',
'vacay.removePerson': 'Удалить человека',
'vacay.removePersonConfirm': 'Удалить {name}?',
'vacay.removePersonHint': 'Все записи об отпуске этого человека будут безвозвратно удалены.',
'vacay.personName': 'Имя',
'vacay.personNamePlaceholder': 'Введите имя',
'vacay.color': 'Цвет',
'vacay.add': 'Добавить',
'vacay.legend': 'Легенда',
'vacay.publicHoliday': 'Государственный праздник',
'vacay.companyHoliday': 'Корпоративный выходной',
'vacay.weekend': 'Выходные',
'vacay.modeVacation': 'Отпуск',
'vacay.modeCompany': 'Корпоративный выходной',
'vacay.entitlement': 'Право на отпуск',
'vacay.entitlementDays': 'Дни',
'vacay.used': 'Использовано',
'vacay.remaining': 'Осталось',
'vacay.carriedOver': 'из {year}',
'vacay.blockWeekends': 'Блокировать выходные',
'vacay.blockWeekendsHint': 'Запретить записи об отпуске в субботу и воскресенье',
'vacay.weekendDays': 'Выходные дни',
'vacay.mon': 'Пн',
'vacay.tue': 'Вт',
'vacay.wed': 'Ср',
'vacay.thu': 'Чт',
'vacay.fri': 'Пт',
'vacay.sat': 'Сб',
'vacay.sun': 'Вс',
'vacay.publicHolidays': 'Государственные праздники',
'vacay.publicHolidaysHint': 'Отмечать государственные праздники в календаре',
'vacay.selectCountry': 'Выберите страну',
'vacay.selectRegion': 'Выберите регион (необязательно)',
'vacay.companyHolidays': 'Корпоративные выходные',
'vacay.companyHolidaysHint': 'Разрешить отмечать корпоративные выходные дни',
'vacay.companyHolidaysNoDeduct': 'Корпоративные выходные не вычитаются из дней отпуска.',
'vacay.weekStart': 'Неделя начинается с',
'vacay.weekStartHint': 'Выберите, начинается ли неделя с понедельника или воскресенья',
'vacay.carryOver': 'Перенос',
'vacay.carryOverHint': 'Автоматически переносить оставшиеся дни отпуска на следующий год',
'vacay.sharing': 'Общий доступ',
'vacay.sharingHint': 'Поделитесь планом отпуска с другими пользователями TREK',
'vacay.owner': 'Владелец',
'vacay.shareEmailPlaceholder': 'Эл. почта пользователя TREK',
'vacay.shareSuccess': 'План успешно предоставлен',
'vacay.shareError': 'Не удалось поделиться планом',
'vacay.dissolve': 'Разделить объединение',
'vacay.dissolveHint': 'Снова разделить календари. Ваши записи будут сохранены.',
'vacay.dissolveAction': 'Разделить',
'vacay.dissolved': 'Календарь разделён',
'vacay.fusedWith': 'Объединён с',
'vacay.you': 'вы',
'vacay.noData': 'Нет данных',
'vacay.changeColor': 'Изменить цвет',
'vacay.inviteUser': 'Пригласить пользователя',
'vacay.inviteHint': 'Пригласите другого пользователя TREK для совместного календаря отпусков.',
'vacay.selectUser': 'Выберите пользователя',
'vacay.sendInvite': 'Отправить приглашение',
'vacay.inviteSent': 'Приглашение отправлено',
'vacay.inviteError': 'Не удалось отправить приглашение',
'vacay.pending': 'ожидание',
'vacay.noUsersAvailable': 'Нет доступных пользователей',
'vacay.accept': 'Принять',
'vacay.decline': 'Отклонить',
'vacay.acceptFusion': 'Принять и объединить',
'vacay.inviteTitle': 'Запрос на объединение',
'vacay.inviteWantsToFuse': 'хочет объединить календарь отпусков с вами.',
'vacay.fuseInfo1': 'Вы оба будете видеть все записи об отпуске в одном общем календаре.',
'vacay.fuseInfo2': 'Обе стороны могут создавать и редактировать записи друг для друга.',
'vacay.fuseInfo3': 'Обе стороны могут удалять записи и изменять право на отпуск.',
'vacay.fuseInfo4': 'Настройки, такие как праздники и корпоративные выходные, становятся общими.',
'vacay.fuseInfo5': 'Объединение можно отменить в любое время любой из сторон. Ваши записи будут сохранены.',
'vacay.addCalendar': 'Добавить календарь',
'vacay.calendarColor': 'Цвет',
'vacay.calendarLabel': 'Название',
'vacay.noCalendars': 'Нет календарей',
'nav.myTrips': 'Мои поездки',
// Atlas addon
'atlas.subtitle': 'Ваш след путешествий по всему миру',
'atlas.countries': 'Страны',
'atlas.trips': 'Поездки',
'atlas.places': 'Места',
'atlas.days': 'Дни',
'atlas.visitedCountries': 'Посещённые страны',
'atlas.cities': 'Города',
'atlas.noData': 'Данных о поездках пока нет',
'atlas.noDataHint': 'Создайте поездку и добавьте места, чтобы увидеть карту мира',
'atlas.lastTrip': 'Последняя поездка',
'atlas.nextTrip': 'Следующая поездка',
'atlas.daysLeft': 'дней осталось',
'atlas.streak': 'Серия',
'atlas.year': 'год',
'atlas.years': 'лет',
'atlas.yearInRow': 'год подряд',
'atlas.yearsInRow': 'лет подряд',
'atlas.tripIn': 'поездка в',
'atlas.tripsIn': 'поездок в',
'atlas.since': 'с',
'atlas.europe': 'Европа',
'atlas.asia': 'Азия',
'atlas.northAmerica': 'Сев. Америка',
'atlas.southAmerica': 'Юж. Америка',
'atlas.africa': 'Африка',
'atlas.oceania': 'Океания',
'atlas.other': 'Другое',
'atlas.firstVisit': 'Первая поездка',
'atlas.lastVisitLabel': 'Последняя поездка',
'atlas.tripSingular': 'Поездка',
'atlas.tripPlural': 'Поездки',
'atlas.placeVisited': 'Посещённое место',
'atlas.placesVisited': 'Посещённые места',
'atlas.statsTab': 'Статистика',
'atlas.bucketTab': 'Список желаний',
'atlas.addBucket': 'Добавить в список желаний',
'atlas.bucketNamePlaceholder': 'Место или направление...',
'atlas.bucketNotesPlaceholder': 'Заметки (необязательно)',
'atlas.bucketEmpty': 'Ваш список желаний пуст',
'atlas.bucketEmptyHint': 'Добавьте места, которые мечтаете посетить',
'atlas.unmark': 'Удалить',
'atlas.confirmMark': 'Отметить эту страну как посещённую?',
'atlas.confirmUnmark': 'Удалить эту страну из списка посещённых?',
'atlas.confirmUnmarkRegion': 'Удалить этот регион из списка посещённых?',
'atlas.markVisited': 'Отметить как посещённую',
'atlas.markVisitedHint': 'Добавить эту страну в список посещённых',
'atlas.markRegionVisitedHint': 'Добавить этот регион в список посещённых',
'atlas.addToBucket': 'В список желаний',
'atlas.addPoi': 'Добавить место',
'atlas.searchCountry': 'Поиск страны...',
'atlas.month': 'Месяц',
'atlas.addToBucketHint': 'Сохранить как место для посещения',
'atlas.bucketWhen': 'Когда вы планируете поехать?',
// Trip Planner
'trip.tabs.plan': 'План',
'trip.tabs.transports': 'Транспорт',
'trip.tabs.reservations': 'Бронирования',
'trip.tabs.reservationsShort': 'Брони',
'trip.tabs.packing': 'Список вещей',
'trip.tabs.packingShort': 'Вещи',
'trip.tabs.lists': 'Списки',
'trip.tabs.listsShort': 'Списки',
'trip.tabs.budget': 'Бюджет',
'trip.tabs.files': 'Файлы',
'trip.loading': 'Загрузка поездки...',
'trip.loadingPhotos': 'Загрузка фото мест...',
'trip.mobilePlan': 'План',
'trip.mobilePlaces': 'Места',
'trip.toast.placeUpdated': 'Место обновлено',
'trip.toast.placeAdded': 'Место добавлено',
'trip.toast.placeDeleted': 'Место удалено',
'trip.toast.selectDay': 'Сначала выберите день',
'trip.toast.assignedToDay': 'Место назначено на день',
'trip.toast.reorderError': 'Ошибка изменения порядка',
'trip.toast.reservationUpdated': 'Бронирование обновлено',
'trip.toast.reservationAdded': 'Бронирование добавлено',
'trip.toast.deleted': 'Удалено',
'trip.confirm.deletePlace': 'Вы уверены, что хотите удалить это место?',
'trip.confirm.deletePlaces': 'Удалить {count} мест?',
'trip.toast.placesDeleted': '{count} мест удалено',
// Day Plan Sidebar
'dayplan.emptyDay': 'На этот день мест не запланировано',
'dayplan.addNote': 'Добавить заметку',
'dayplan.editNote': 'Редактировать заметку',
'dayplan.noteAdd': 'Добавить заметку',
'dayplan.noteEdit': 'Редактировать заметку',
'dayplan.noteTitle': 'Заметка',
'dayplan.noteSubtitle': 'Заметка на день',
'dayplan.totalCost': 'Общая стоимость',
'dayplan.days': 'Дни',
'dayplan.dayN': 'День {n}',
'dayplan.calculating': 'Расчёт...',
'dayplan.route': 'Маршрут',
'dayplan.optimize': 'Оптимизировать',
'dayplan.optimized': 'Маршрут оптимизирован',
'dayplan.routeError': 'Не удалось рассчитать маршрут',
'dayplan.toast.needTwoPlaces': 'Для оптимизации маршрута нужно минимум два места',
'dayplan.toast.routeOptimized': 'Маршрут оптимизирован',
'dayplan.toast.noGeoPlaces': 'Не найдено мест с координатами для расчёта маршрута',
'dayplan.confirmed': 'Подтверждено',
'dayplan.pendingRes': 'Ожидание',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Экспортировать план дня в PDF',
'dayplan.pdfError': 'Ошибка экспорта PDF',
'dayplan.cannotReorderTransport': 'Бронирования с фиксированным временем нельзя перемещать',
'dayplan.confirmRemoveTimeTitle': 'Удалить время?',
'dayplan.confirmRemoveTimeBody': 'У этого места фиксированное время ({time}). При перемещении время будет удалено, и станет доступна свободная сортировка.',
'dayplan.confirmRemoveTimeAction': 'Удалить время и переместить',
'dayplan.cannotDropOnTimed': 'Элементы нельзя размещать между записями с фиксированным временем',
'dayplan.cannotBreakChronology': 'Это нарушит хронологический порядок запланированных элементов и бронирований',
// Places Sidebar
'places.addPlace': 'Добавить место/активность',
'places.importFile': 'Импортировать файл',
'places.sidebarDrop': 'Отпустите для импорта',
'places.importFileHint': 'Импортируйте файлы .gpx, .kml или .kmz из инструментов, таких как Google My Maps, Google Earth или GPS-трекер.',
'places.importFileDropHere': 'Нажмите для выбора файла или перетащите его сюда',
'places.importFileDropActive': 'Отпустите файл для выбора',
'places.importFileUnsupported': 'Неподдерживаемый тип файла. Используйте .gpx, .kml или .kmz.',
'places.importFileTooLarge': 'Файл слишком большой. Максимальный размер загрузки — {maxMb} MB.',
'places.importFileError': 'Ошибка импорта',
'places.importAllSkipped': 'Все места уже были в поездке.',
'places.gpxImported': '{count} мест импортировано из GPX',
'places.gpxImportTypes': 'Что импортировать?',
'places.gpxImportWaypoints': 'Путевые точки',
'places.gpxImportRoutes': 'Маршруты',
'places.gpxImportTracks': 'Треки (с геометрией пути)',
'places.gpxImportNoneSelected': 'Выберите хотя бы один тип для импорта.',
'places.kmlImportTypes': 'Что вы хотите импортировать?',
'places.kmlImportPoints': 'Точки (Placemarks)',
'places.kmlImportPaths': 'Маршруты (LineStrings)',
'places.kmlImportNoneSelected': 'Выберите хотя бы один тип.',
'places.selectionCount': '{count} выбрано',
'places.deleteSelected': 'Удалить выбранные',
'places.kmlKmzImported': '{count} мест импортировано из KMZ/KML',
'places.urlResolved': 'Место импортировано из URL',
'places.importList': 'Импорт списка',
'places.kmlKmzSummaryValues': 'Placemarks: {total} • Импортировано: {created} • Пропущено: {skipped}',
'places.importGoogleList': 'Список Google',
'places.importNaverList': 'Список Naver',
'places.googleListHint': 'Вставьте ссылку на общий список Google Maps для импорта всех мест.',
'places.googleListImported': '{count} мест импортировано из "{list}"',
'places.googleListError': 'Не удалось импортировать список Google Maps',
'places.naverListHint': 'Вставьте ссылку на общий список Naver Maps для импорта всех мест.',
'places.naverListImported': '{count} мест импортировано из "{list}"',
'places.naverListError': 'Не удалось импортировать список Naver Maps',
'places.viewDetails': 'Подробности',
'places.assignToDay': 'Добавить в какой день?',
'places.all': 'Все',
'places.unplanned': 'Незапланированные',
'places.filterTracks': 'Треки',
'places.search': 'Поиск мест...',
'places.allCategories': 'Все категории',
'places.categoriesSelected': 'категорий',
'places.clearFilter': 'Сбросить фильтр',
'places.count': '{count} мест',
'places.countSingular': '1 место',
'places.allPlanned': 'Все места запланированы',
'places.noneFound': 'Места не найдены',
'places.editPlace': 'Редактировать место',
'places.formName': 'Название',
'places.formNamePlaceholder': 'напр. Эйфелева башня',
'places.formDescription': 'Описание',
'places.formDescriptionPlaceholder': 'Краткое описание...',
'places.formAddress': 'Адрес',
'places.formAddressPlaceholder': 'Улица, город, страна',
'places.formLat': 'Широта (напр. 48.8566)',
'places.formLng': 'Долгота (напр. 2.3522)',
'places.formCategory': 'Категория',
'places.noCategory': 'Без категории',
'places.categoryNamePlaceholder': 'Название категории',
'places.formTime': 'Время',
'places.startTime': 'Начало',
'places.endTime': 'Конец',
'places.endTimeBeforeStart': 'Время окончания раньше времени начала',
'places.timeCollision': 'Пересечение по времени с:',
'places.formWebsite': 'Сайт',
'places.formNotes': 'Заметки',
'places.formNotesPlaceholder': 'Личные заметки...',
'places.formReservation': 'Бронирование',
'places.reservationNotesPlaceholder': 'Заметки о бронировании, номер подтверждения...',
'places.mapsSearchPlaceholder': 'Поиск мест...',
'places.mapsSearchError': 'Ошибка поиска мест.',
'places.loadingDetails': 'Загрузка данных о месте…',
'places.osmHint': 'Поиск через OpenStreetMap (без фото, часов работы и рейтингов). Добавьте API-ключ Google в настройках для полной информации.',
'places.osmActive': 'Поиск через OpenStreetMap (без фото, рейтингов и часов работы). Добавьте API-ключ Google в настройках для расширенных данных.',
'places.categoryCreateError': 'Не удалось создать категорию',
'places.nameRequired': 'Введите название',
'places.saveError': 'Ошибка сохранения',
// Place Inspector
'inspector.opened': 'Открыто',
'inspector.closed': 'Закрыто',
'inspector.openingHours': 'Часы работы',
'inspector.showHours': 'Показать часы работы',
'inspector.files': 'Файлы',
'inspector.filesCount': '{count} файлов',
'inspector.removeFromDay': 'Убрать из дня',
'inspector.remove': 'Удалить',
'inspector.addToDay': 'Добавить в день',
'inspector.confirmedRes': 'Подтверждённое бронирование',
'inspector.pendingRes': 'Ожидающее бронирование',
'inspector.google': 'Открыть в Google Maps',
'inspector.website': 'Открыть сайт',
'inspector.addRes': 'Бронирование',
'inspector.editRes': 'Редактировать бронирование',
'inspector.participants': 'Участники',
'inspector.trackStats': 'Данные маршрута',
// Reservations
'reservations.title': 'Бронирования',
'reservations.empty': 'Пока нет бронирований',
'reservations.emptyHint': 'Добавьте бронирования на авиабилеты, отели и другое',
'reservations.add': 'Добавить бронирование',
'reservations.addManual': 'Ручное бронирование',
'reservations.placeHint': 'Совет: бронирования лучше создавать прямо из места, чтобы связать их с планом дня.',
'reservations.confirmed': 'Подтверждено',
'reservations.pending': 'Ожидание',
'reservations.summary': '{confirmed} подтв., {pending} ожид.',
'reservations.fromPlan': 'Из плана',
'reservations.showFiles': 'Показать файлы',
'reservations.editTitle': 'Редактировать бронирование',
'reservations.status': 'Статус',
'reservations.datetime': 'Дата и время',
'reservations.startTime': 'Время начала',
'reservations.endTime': 'Время окончания',
'reservations.date': 'Дата',
'reservations.time': 'Время',
'reservations.timeAlt': 'Время (альтернативное, напр. 19:30)',
'reservations.notes': 'Заметки',
'reservations.notesPlaceholder': 'Дополнительные заметки...',
'reservations.meta.airline': 'Авиакомпания',
'reservations.meta.flightNumber': 'Номер рейса',
'reservations.meta.from': 'Откуда',
'reservations.meta.to': 'Куда',
'reservations.needsReview': 'Проверить',
'reservations.needsReviewHint': 'Аэропорт не удалось определить автоматически — подтвердите местоположение.',
'reservations.searchLocation': 'Искать станцию, порт, адрес...',
'airport.searchPlaceholder': 'Код аэропорта или город (напр. FRA)',
'map.connections': 'Соединения',
'map.showConnections': 'Показать маршруты бронирований',
'map.hideConnections': 'Скрыть маршруты бронирований',
'settings.bookingLabels': 'Подписи маршрутов бронирований',
'settings.bookingLabelsHint': 'Отображает названия станций / аэропортов на карте. Если выключено, показывается только значок.',
'reservations.meta.trainNumber': 'Номер поезда',
'reservations.meta.platform': 'Платформа',
'reservations.meta.seat': 'Место',
'reservations.meta.checkIn': 'Заезд',
'reservations.meta.checkInUntil': 'Заселение до',
'reservations.meta.checkOut': 'Выезд',
'reservations.meta.linkAccommodation': 'Жильё',
'reservations.meta.pickAccommodation': 'Привязать к жилью',
'reservations.meta.noAccommodation': 'Нет',
'reservations.meta.hotelPlace': 'Жильё',
'reservations.meta.pickHotel': 'Выбрать жильё',
'reservations.meta.fromDay': 'С',
'reservations.meta.toDay': 'По',
'reservations.meta.selectDay': 'Выбрать день',
'reservations.type.flight': 'Авиабилет',
'reservations.type.hotel': 'Жильё',
'reservations.type.restaurant': 'Ресторан',
'reservations.type.train': 'Поезд',
'reservations.type.car': 'Автомобиль',
'reservations.type.cruise': 'Круиз',
'reservations.type.event': 'Мероприятие',
'reservations.type.tour': 'Экскурсия',
'reservations.type.other': 'Другое',
'reservations.confirm.delete': 'Вы уверены, что хотите удалить бронирование «{name}»?',
'reservations.confirm.deleteTitle': 'Удалить бронирование?',
'reservations.confirm.deleteBody': '«{name}» будет удалено навсегда.',
'reservations.toast.updated': 'Бронирование обновлено',
'reservations.toast.removed': 'Бронирование удалено',
'reservations.toast.fileUploaded': 'Файл загружен',
'reservations.toast.uploadError': 'Ошибка загрузки',
'reservations.newTitle': 'Новое бронирование',
'reservations.bookingType': 'Тип бронирования',
'reservations.titleLabel': 'Название',
'reservations.titlePlaceholder': 'напр. Lufthansa LH123, Hotel Adlon, ...',
'reservations.locationAddress': 'Местоположение / Адрес',
'reservations.locationPlaceholder': 'Адрес, аэропорт, отель...',
'reservations.confirmationCode': 'Код бронирования',
'reservations.confirmationPlaceholder': 'напр. ABC12345',
'reservations.day': 'День',
'reservations.noDay': 'Без дня',
'reservations.place': 'Место',
'reservations.noPlace': 'Без места',
'reservations.pendingSave': 'будет сохранено…',
'reservations.uploading': 'Загрузка...',
'reservations.attachFile': 'Прикрепить файл',
'reservations.linkExisting': 'Привязать существующий файл',
'reservations.toast.saveError': 'Ошибка сохранения',
'reservations.toast.updateError': 'Ошибка обновления',
'reservations.toast.deleteError': 'Ошибка удаления',
'reservations.confirm.remove': 'Удалить бронирование для «{name}»?',
'reservations.linkAssignment': 'Привязать к назначению дня',
'reservations.pickAssignment': 'Выберите назначение из вашего плана...',
'reservations.noAssignment': 'Без привязки (самостоятельное)',
'reservations.price': 'Цена',
'reservations.budgetCategory': 'Категория бюджета',
'reservations.budgetCategoryPlaceholder': 'напр. Транспорт, Проживание',
'reservations.budgetCategoryAuto': 'Авто (по типу бронирования)',
'reservations.budgetHint': 'При сохранении будет автоматически создана запись бюджета.',
'reservations.departureDate': 'Вылет',
'reservations.arrivalDate': 'Прилёт',
'reservations.departureTime': 'Время вылета',
'reservations.arrivalTime': 'Время прилёта',
'reservations.pickupDate': 'Получение',
'reservations.returnDate': 'Возврат',
'reservations.pickupTime': 'Время получения',
'reservations.returnTime': 'Время возврата',
'reservations.endDate': 'Дата окончания',
'reservations.meta.departureTimezone': 'TZ вылета',
'reservations.meta.arrivalTimezone': 'TZ прилёта',
'reservations.span.departure': 'Вылет',
'reservations.span.arrival': 'Прилёт',
'reservations.span.inTransit': 'В пути',
'reservations.span.pickup': 'Получение',
'reservations.span.return': 'Возврат',
'reservations.span.active': 'Активно',
'reservations.span.start': 'Начало',
'reservations.span.end': 'Конец',
'reservations.span.ongoing': 'Продолжается',
'reservations.validation.endBeforeStart': 'Дата/время окончания должны быть позже даты/времени начала',
'reservations.addBooking': 'Добавить бронирование',
// Budget
'budget.title': 'Бюджет',
'budget.exportCsv': 'Экспорт CSV',
'budget.emptyTitle': 'Бюджет ещё не создан',
'budget.emptyText': 'Создайте категории и записи для планирования бюджета поездки',
'budget.emptyPlaceholder': 'Введите название категории...',
'budget.createCategory': 'Создать категорию',
'budget.category': 'Категория',
'budget.categoryName': 'Название категории',
'budget.table.name': 'Название',
'budget.table.total': 'Итого',
'budget.table.persons': 'Человек',
'budget.table.days': 'Дней',
'budget.table.perPerson': 'На человека',
'budget.table.perDay': 'В день',
'budget.table.perPersonDay': 'Чел. / день',
'budget.table.note': 'Заметка',
'budget.table.date': 'Дата',
'budget.newEntry': 'Новая запись',
'budget.defaultEntry': 'Новая запись',
'budget.defaultCategory': 'Новая категория',
'budget.total': 'Итого',
'budget.totalBudget': 'Общий бюджет',
'budget.byCategory': 'По категориям',
'budget.editTooltip': 'Нажмите для редактирования',
'budget.linkedToReservation': 'Связано с бронированием — редактируйте название там',
'budget.confirm.deleteCategory': 'Вы уверены, что хотите удалить категорию «{name}» с {count} записями?',
'budget.deleteCategory': 'Удалить категорию',
'budget.perPerson': 'На человека',
'budget.paid': 'Оплачено',
'budget.open': 'Не оплачено',
'budget.noMembers': 'Участники не назначены',
'budget.settlement': 'Взаиморасчёт',
'budget.settlementInfo': 'Нажмите на аватар участника в строке бюджета, чтобы отметить его зелёным — это значит, что он заплатил. Взаиморасчёт покажет, кто кому и сколько должен.',
'budget.netBalances': 'Чистые балансы',
// Files
'files.title': 'Файлы',
'files.pageTitle': 'Файлы и документы',
'files.subtitle': '{count} файлов для {trip}',
'files.downloadPdf': 'Скачать PDF',
'files.count': '{count} файлов',
'files.countSingular': '1 файл',
'files.uploaded': '{count} загружено',
'files.uploadError': 'Ошибка загрузки',
'files.dropzone': 'Перетащите файлы сюда',
'files.dropzoneHint': 'или нажмите для выбора',
'files.allowedTypes': 'Изображения, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Макс. 50 МБ',
'files.uploading': 'Загрузка...',
'files.filterAll': 'Все',
'files.filterPdf': 'PDF',
'files.filterImages': 'Изображения',
'files.filterDocs': 'Документы',
'files.filterCollab': 'Заметки Collab',
'files.sourceCollab': 'Из заметок Collab',
'files.empty': 'Файлов пока нет',
'files.emptyHint': 'Загрузите файлы, чтобы прикрепить их к поездке',
'files.openTab': 'Открыть в новой вкладке',
'files.confirm.delete': 'Вы уверены, что хотите удалить этот файл?',
'files.toast.deleted': 'Файл удалён',
'files.toast.deleteError': 'Не удалось удалить файл',
'files.sourcePlan': 'План дня',
'files.sourceBooking': 'Бронирование',
'files.attach': 'Прикрепить',
'files.pasteHint': 'Также можно вставить изображения из буфера обмена (Ctrl+V)',
'files.trash': 'Корзина',
'files.trashEmpty': 'Корзина пуста',
'files.emptyTrash': 'Очистить корзину',
'files.restore': 'Восстановить',
'files.star': 'В избранное',
'files.unstar': 'Из избранного',
'files.assign': 'Назначить',
'files.assignTitle': 'Назначить файл',
'files.assignPlace': 'Место',
'files.assignBooking': 'Бронирование',
'files.unassigned': 'Не назначен',
'files.unlink': 'Удалить связь',
'files.toast.trashed': 'Перемещено в корзину',
'files.toast.restored': 'Файл восстановлен',
'files.toast.trashEmptied': 'Корзина очищена',
'files.toast.assigned': 'Файл назначен',
'files.toast.assignError': 'Ошибка назначения',
'files.toast.restoreError': 'Ошибка восстановления',
'files.confirm.permanentDelete': 'Безвозвратно удалить этот файл? Это действие нельзя отменить.',
'files.confirm.emptyTrash': 'Безвозвратно удалить все файлы из корзины? Это действие нельзя отменить.',
'files.noteLabel': 'Заметка',
'files.notePlaceholder': 'Добавить заметку...',
// Packing
'packing.title': 'Список вещей',
'packing.empty': 'Список вещей пуст',
'packing.import': 'Импорт',
'packing.importTitle': 'Импорт списка вещей',
'packing.importHint': 'Один предмет на строку. Категория и количество — через запятую, точку с запятой или табуляцию: Название, Категория, Количество',
'packing.importPlaceholder': 'Зубная щётка\nСолнцезащитный крем, Гигиена\nФутболки, Одежда, 5\nПаспорт, Документы',
'packing.importCsv': 'Загрузить CSV/TXT',
'packing.importAction': 'Импортировать {count}',
'packing.importSuccess': '{count} предметов импортировано',
'packing.importError': 'Ошибка импорта',
'packing.importEmpty': 'Нет предметов для импорта',
'packing.progress': '{packed} из {total} собрано ({percent}%)',
'packing.clearChecked': 'Удалить {count} отмеченных',
'packing.clearCheckedShort': 'Удалить {count}',
'packing.suggestions': 'Подсказки',
'packing.suggestionsTitle': 'Добавить подсказки',
'packing.allSuggested': 'Все подсказки добавлены',
'packing.allPacked': 'Всё собрано!',
'packing.addPlaceholder': 'Добавить вещь...',
'packing.categoryPlaceholder': 'Категория...',
'packing.filterAll': 'Все',
'packing.filterOpen': 'Не собрано',
'packing.filterDone': 'Собрано',
'packing.emptyTitle': 'Список вещей пуст',
'packing.emptyHint': 'Добавьте вещи или используйте подсказки',
'packing.emptyFiltered': 'Нет вещей, соответствующих фильтру',
'packing.menuRename': 'Переименовать',
'packing.menuCheckAll': 'Отметить все',
'packing.menuUncheckAll': 'Снять отметки',
'packing.menuDeleteCat': 'Удалить категорию',
'packing.addItem': 'Добавить вещь',
'packing.addItemPlaceholder': 'Название...',
'packing.addCategory': 'Добавить категорию',
'packing.newCategoryPlaceholder': 'Название категории (напр. Одежда)',
'packing.applyTemplate': 'Применить шаблон',
'packing.template': 'Шаблон',
'packing.templateApplied': '{count} вещей добавлено из шаблона',
'packing.templateError': 'Ошибка применения шаблона',
'packing.saveAsTemplate': 'Сохранить как шаблон',
'packing.templateName': 'Название шаблона',
'packing.templateSaved': 'Список вещей сохранён как шаблон',
'packing.noMembers': 'Нет участников',
'packing.bags': 'Багаж',
'packing.noBag': 'Не назначено',
'packing.totalWeight': 'Общий вес',
'packing.bagName': 'Название...',
'packing.addBag': 'Добавить багаж',
'packing.changeCategory': 'Изменить категорию',
'packing.confirm.clearChecked': 'Вы уверены, что хотите удалить {count} отмеченных вещей?',
'packing.confirm.deleteCat': 'Вы уверены, что хотите удалить категорию «{name}» с {count} вещами?',
'packing.defaultCategory': 'Другое',
'packing.toast.saveError': 'Ошибка сохранения',
'packing.toast.deleteError': 'Ошибка удаления',
'packing.toast.renameError': 'Ошибка переименования',
'packing.toast.addError': 'Ошибка добавления',
// Packing suggestions
'packing.suggestions.items': [
{ name: 'Паспорт', category: 'Документы' },
{ name: 'Удостоверение личности', category: 'Документы' },
{ name: 'Страховка', category: 'Документы' },
{ name: 'Авиабилеты', category: 'Документы' },
{ name: 'Банковская карта', category: 'Финансы' },
{ name: 'Наличные', category: 'Финансы' },
{ name: 'Виза', category: 'Документы' },
{ name: 'Футболки', category: 'Одежда' },
{ name: 'Брюки', category: 'Одежда' },
{ name: 'Нижнее бельё', category: 'Одежда' },
{ name: 'Носки', category: 'Одежда' },
{ name: 'Куртка', category: 'Одежда' },
{ name: 'Пижама', category: 'Одежда' },
{ name: 'Купальник', category: 'Одежда' },
{ name: 'Дождевик', category: 'Одежда' },
{ name: 'Удобная обувь', category: 'Одежда' },
{ name: 'Зубная щётка', category: 'Гигиена' },
{ name: 'Зубная паста', category: 'Гигиена' },
{ name: 'Шампунь', category: 'Гигиена' },
{ name: 'Дезодорант', category: 'Гигиена' },
{ name: 'Солнцезащитный крем', category: 'Гигиена' },
{ name: 'Бритва', category: 'Гигиена' },
{ name: 'Зарядное устройство', category: 'Электроника' },
{ name: 'Внешний аккумулятор', category: 'Электроника' },
{ name: 'Наушники', category: 'Электроника' },
{ name: 'Адаптер для розеток', category: 'Электроника' },
{ name: 'Фотоаппарат', category: 'Электроника' },
{ name: 'Обезболивающее', category: 'Здоровье' },
{ name: 'Пластыри', category: 'Здоровье' },
{ name: 'Антисептик', category: 'Здоровье' },
],
// Members / Sharing
'members.shareTrip': 'Поделиться поездкой',
'members.inviteUser': 'Пригласить пользователя',
'members.selectUser': 'Выберите пользователя…',
'members.invite': 'Пригласить',
'members.allHaveAccess': 'У всех пользователей уже есть доступ.',
'members.access': 'Доступ',
'members.person': 'человек',
'members.persons': 'человек',
'members.you': 'вы',
'members.owner': 'Владелец',
'members.leaveTrip': 'Покинуть поездку',
'members.removeAccess': 'Отозвать доступ',
'members.confirmLeave': 'Покинуть поездку? Вы потеряете доступ.',
'members.confirmRemove': 'Отозвать доступ у этого пользователя?',
'members.loadError': 'Не удалось загрузить участников',
'members.added': 'добавлен',
'members.addError': 'Ошибка добавления',
'members.removed': 'Участник удалён',
'members.removeError': 'Ошибка удаления',
// Categories (Admin)
'categories.title': 'Категории',
'categories.subtitle': 'Управление категориями мест',
'categories.new': 'Новая категория',
'categories.empty': 'Категорий пока нет',
'categories.namePlaceholder': 'Название категории',
'categories.icon': 'Иконка',
'categories.color': 'Цвет',
'categories.customColor': 'Выбрать свой цвет',
'categories.preview': 'Предпросмотр',
'categories.defaultName': 'Категория',
'categories.update': 'Обновить',
'categories.create': 'Создать',
'categories.confirm.delete': 'Удалить категорию? Места в этой категории не будут удалены.',
'categories.toast.loadError': 'Не удалось загрузить категории',
'categories.toast.nameRequired': 'Введите название',
'categories.toast.updated': 'Категория обновлена',
'categories.toast.created': 'Категория создана',
'categories.toast.saveError': 'Ошибка сохранения',
'categories.toast.deleted': 'Категория удалена',
'categories.toast.deleteError': 'Ошибка удаления',
// Backup (Admin)
'backup.title': 'Резервная копия',
'backup.subtitle': 'База данных и все загруженные файлы',
'backup.refresh': 'Обновить',
'backup.upload': 'Загрузить копию',
'backup.uploading': 'Загрузка…',
'backup.create': 'Создать копию',
'backup.creating': 'Создание…',
'backup.empty': 'Резервных копий нет',
'backup.createFirst': 'Создать первую копию',
'backup.download': 'Скачать',
'backup.restore': 'Восстановить',
'backup.confirm.restore': 'Восстановить копию «{name}»?\n\nВсе текущие данные будут заменены данными из копии.',
'backup.confirm.uploadRestore': 'Загрузить и восстановить файл копии «{name}»?\n\nВсе текущие данные будут перезаписаны.',
'backup.confirm.delete': 'Удалить копию «{name}»?',
'backup.toast.loadError': 'Не удалось загрузить резервные копии',
'backup.toast.created': 'Резервная копия создана',
'backup.toast.createError': 'Не удалось создать резервную копию',
'backup.toast.restored': 'Копия восстановлена. Страница перезагрузится…',
'backup.toast.restoreError': 'Ошибка восстановления',
'backup.toast.uploadError': 'Ошибка загрузки',
'backup.toast.deleted': 'Резервная копия удалена',
'backup.toast.deleteError': 'Ошибка удаления',
'backup.toast.downloadError': 'Ошибка скачивания',
'backup.toast.settingsSaved': 'Настройки автокопирования сохранены',
'backup.toast.settingsError': 'Не удалось сохранить настройки',
'backup.auto.title': 'Автокопирование',
'backup.auto.subtitle': 'Автоматическое резервное копирование по расписанию',
'backup.auto.enable': 'Включить автокопирование',
'backup.auto.enableHint': 'Резервные копии будут создаваться автоматически по выбранному расписанию',
'backup.auto.interval': 'Интервал',
'backup.auto.hour': 'Запуск в час',
'backup.auto.hourHint': 'Местное время сервера (формат {format})',
'backup.auto.dayOfWeek': 'День недели',
'backup.auto.dayOfMonth': 'День месяца',
'backup.auto.dayOfMonthHint': 'Ограничено 1–28 для совместимости со всеми месяцами',
'backup.auto.scheduleSummary': 'Расписание',
'backup.auto.summaryDaily': 'Каждый день в {hour}:00',
'backup.auto.summaryWeekly': 'Каждый {day} в {hour}:00',
'backup.auto.summaryMonthly': '{day}-го числа каждого месяца в {hour}:00',
'backup.auto.envLocked': 'Docker',
'backup.auto.envLockedHint': 'Автокопирование настроено через переменные окружения Docker. Чтобы изменить параметры, обновите docker-compose.yml и перезапустите контейнер.',
'backup.auto.copyEnv': 'Скопировать переменные окружения Docker',
'backup.auto.envCopied': 'Переменные окружения Docker скопированы в буфер обмена',
'backup.auto.keepLabel': 'Удалять старые копии через',
'backup.dow.sunday': 'Вс',
'backup.dow.monday': 'Пн',
'backup.dow.tuesday': 'Вт',
'backup.dow.wednesday': 'Ср',
'backup.dow.thursday': 'Чт',
'backup.dow.friday': 'Пт',
'backup.dow.saturday': 'Сб',
'backup.interval.hourly': 'Каждый час',
'backup.interval.daily': 'Ежедневно',
'backup.interval.weekly': 'Еженедельно',
'backup.interval.monthly': 'Ежемесячно',
'backup.keep.1day': '1 день',
'backup.keep.3days': '3 дня',
'backup.keep.7days': '7 дней',
'backup.keep.14days': '14 дней',
'backup.keep.30days': '30 дней',
'backup.keep.forever': 'Хранить вечно',
// Photos
'photos.title': 'Фотографии',
'photos.subtitle': '{count} фото для {trip}',
'photos.dropHere': 'Перетащите фото сюда...',
'photos.dropHereActive': 'Перетащите фото сюда',
'photos.captionForAll': 'Подпись (для всех)',
'photos.captionPlaceholder': 'Необязательная подпись...',
'photos.addCaption': 'Добавить подпись...',
'photos.allDays': 'Все дни',
'photos.noPhotos': 'Фото пока нет',
'photos.uploadHint': 'Загрузите фото из путешествия',
'photos.clickToSelect': 'или нажмите для выбора',
'photos.linkPlace': 'Привязать место',
'photos.noPlace': 'Без места',
'photos.uploadN': '{n} фото загружено',
'photos.linkDay': 'Связать день',
'photos.noDay': 'Нет дня',
'photos.dayLabel': 'День {number}',
'photos.photoSelected': 'Фото выбрано',
'photos.photosSelected': 'Фото выбраны',
'photos.fileTypeHint': 'JPG, PNG, WebP · макс. 10 МБ · до 30 фото',
// Backup restore modal
'backup.restoreConfirmTitle': 'Восстановить копию?',
'backup.restoreWarning': 'Все текущие данные (поездки, места, пользователи, загрузки) будут безвозвратно заменены данными из копии. Это действие нельзя отменить.',
'backup.restoreTip': 'Совет: создайте резервную копию текущего состояния перед восстановлением.',
'backup.restoreConfirm': 'Да, восстановить',
// PDF
'pdf.travelPlan': 'План поездки',
'pdf.planned': 'Запланировано',
'pdf.costLabel': 'Стоимость EUR',
'pdf.preview': 'Предпросмотр PDF',
'pdf.saveAsPdf': 'Сохранить как PDF',
// Planner
'planner.places': 'Места',
'planner.bookings': 'Бронирования',
'planner.packingList': 'Список вещей',
'planner.documents': 'Документы',
'planner.dayPlan': 'План дня',
'planner.reservations': 'Бронирования',
'planner.minTwoPlaces': 'Нужно минимум 2 места с координатами',
'planner.noGeoPlaces': 'Нет мест с координатами',
'planner.routeCalculated': 'Маршрут рассчитан',
'planner.routeCalcFailed': 'Не удалось рассчитать маршрут',
'planner.routeError': 'Ошибка расчёта маршрута',
'planner.icsExportFailed': 'Не удалось экспортировать ICS',
'planner.routeOptimized': 'Маршрут оптимизирован',
'planner.reservationUpdated': 'Бронирование обновлено',
'planner.reservationAdded': 'Бронирование добавлено',
'planner.confirmDeleteReservation': 'Удалить бронирование?',
'planner.reservationDeleted': 'Бронирование удалено',
'planner.days': 'Дни',
'planner.allPlaces': 'Все места',
'planner.totalPlaces': 'Всего {n} мест',
'planner.noDaysPlanned': 'Дни ещё не запланированы',
'planner.editTrip': 'Редактировать поездку \u2192',
'planner.placeOne': '1 место',
'planner.placeN': '{n} мест',
'planner.addNote': 'Добавить заметку',
'planner.noEntries': 'На этот день записей нет',
'planner.addPlace': 'Добавить место/активность',
'planner.addPlaceShort': '+ Добавить место/активность',
'planner.resPending': 'Бронирование ожидает · ',
'planner.resConfirmed': 'Бронирование подтверждено · ',
'planner.notePlaceholder': 'Заметка…',
'planner.noteTimePlaceholder': 'Время (необязательно)',
'planner.noteExamplePlaceholder': 'напр. S3 в 14:30 с вокзала, паром с причала 7, обеденный перерыв…',
'planner.totalCost': 'Общая стоимость',
'planner.searchPlaces': 'Поиск мест…',
'planner.allCategories': 'Все категории',
'planner.noPlacesFound': 'Места не найдены',
'planner.addFirstPlace': 'Добавить первое место',
'planner.noReservations': 'Нет бронирований',
'planner.addFirstReservation': 'Добавить первое бронирование',
'planner.new': 'Новое',
'planner.addToDay': '+ День',
'planner.calculating': 'Расчёт…',
'planner.route': 'Маршрут',
'planner.optimize': 'Оптимизировать',
'planner.openGoogleMaps': 'Открыть в Google Maps',
'planner.selectDayHint': 'Выберите день из списка слева для просмотра плана дня',
'planner.noPlacesForDay': 'На этот день мест пока нет',
'planner.addPlacesLink': 'Добавить места \u2192',
'planner.minTotal': 'мин. всего',
'planner.noReservation': 'Нет бронирования',
'planner.removeFromDay': 'Убрать из дня',
'planner.addToThisDay': 'Добавить в день',
'planner.overview': 'Обзор',
'planner.noDays': 'Дней нет',
'planner.editTripToAddDays': 'Отредактируйте поездку для добавления дней',
'planner.dayCount': '{n} дней',
'planner.clickToUnlock': 'Нажмите для разблокировки',
'planner.keepPosition': 'Сохранить позицию при оптимизации маршрута',
'planner.dayDetails': 'Подробности дня',
'planner.dayN': 'День {n}',
// Dashboard Stats
'stats.countries': 'Страны',
'stats.cities': 'Города',
'stats.trips': 'Поездки',
'stats.places': 'Места',
'stats.worldProgress': 'Прогресс по миру',
'stats.visited': 'посещено',
'stats.remaining': 'осталось',
'stats.visitedCountries': 'Посещённые страны',
// Day Detail Panel
'day.precipProb': 'Вероятность осадков',
'day.precipitation': 'Осадки',
'day.wind': 'Ветер',
'day.sunrise': 'Восход',
'day.sunset': 'Закат',
'day.hourlyForecast': 'Почасовой прогноз',
'day.climateHint': 'Исторические средние — реальный прогноз доступен за 16 дней до этой даты.',
'day.noWeather': 'Данные о погоде недоступны. Добавьте место с координатами.',
'day.overview': 'Обзор дня',
'day.accommodation': 'Жильё',
'day.addAccommodation': 'Добавить жильё',
'day.hotelDayRange': 'Применить к дням',
'day.noPlacesForHotel': 'Сначала добавьте места в поездку',
'day.allDays': 'Все',
'day.checkIn': 'Заезд',
'day.checkInUntil': 'До',
'day.checkOut': 'Выезд',
'day.confirmation': 'Подтверждение',
'day.editAccommodation': 'Редактировать жильё',
'day.reservations': 'Бронирования',
// Memories / Immich
'memories.title': 'Фото',
'memories.notConnected': 'Immich не подключён',
'memories.notConnectedHint': 'Подключите Immich в настройках, чтобы видеть фотографии из поездок.',
'memories.notConnectedMultipleHint': 'Подключите одного из этих фотопровайдеров: {provider_names} в Настройках, чтобы добавлять фотографии к этому путешествию.',
'memories.noDates': 'Добавьте даты поездки для загрузки фотографий.',
'memories.noPhotos': 'Фотографии не найдены',
'memories.noPhotosHint': 'В Immich нет фотографий за период этой поездки.',
'memories.photosFound': 'фото',
'memories.fromOthers': 'от других',
'memories.sharePhotos': 'Поделиться фото',
'memories.sharing': 'Общий доступ',
'memories.reviewTitle': 'Проверьте ваши фото',
'memories.reviewHint': 'Нажмите на фото, чтобы исключить его из общего доступа.',
'memories.shareCount': 'Поделиться ({count} фото)',
'memories.providerUrl': 'URL сервера',
'memories.providerApiKey': 'API-ключ',
'memories.providerUsername': 'Имя пользователя',
'memories.providerPassword': 'Пароль',
'memories.providerOTP': 'Код MFA (если включён)',
'memories.skipSSLVerification': 'Пропустить проверку SSL-сертификата',
'memories.immichAutoUpload': 'Дублировать фото journey в Immich при загрузке',
'memories.providerUrlHintSynology': 'Включите путь приложения Photos в URL, например https://nas:5001/photo',
'memories.testConnection': 'Проверить подключение',
'memories.testFirst': 'Сначала проверьте подключение',
'memories.connected': 'Подключено',
'memories.disconnected': 'Не подключено',
'memories.connectionSuccess': 'Подключение к Immich установлено',
'memories.connectionError': 'Не удалось подключиться к Immich',
'memories.saved': 'Настройки {provider_name} сохранены',
'memories.providerDisconnectedBanner': 'Соединение с {provider_name} потеряно. Переподключитесь в Настройках для просмотра фотографий.',
'memories.saveError': 'Не удалось сохранить настройки {provider_name}',
'memories.oldest': 'Сначала старые',
'memories.newest': 'Сначала новые',
'memories.allLocations': 'Все места',
'memories.addPhotos': 'Добавить фото',
'memories.linkAlbum': 'Привязать альбом',
'memories.selectAlbum': 'Выбрать альбом Immich',
'memories.selectAlbumMultiple': 'Выбрать альбом',
'memories.noAlbums': 'Альбомы не найдены',
'memories.syncAlbum': 'Синхронизировать',
'memories.unlinkAlbum': 'Отвязать',
'memories.photos': 'фото',
'memories.selectPhotos': 'Выбрать фото из Immich',
'memories.selectPhotosMultiple': 'Выбрать фотографии',
'memories.selectHint': 'Нажмите на фото, чтобы выбрать их.',
'memories.selected': 'выбрано',
'memories.addSelected': 'Добавить {count} фото',
'memories.alreadyAdded': 'Добавлено',
'memories.private': 'Приватное',
'memories.stopSharing': 'Прекратить доступ',
'memories.tripDates': 'Даты поездки',
'memories.allPhotos': 'Все фото',
'memories.confirmShareTitle': 'Поделиться с участниками поездки?',
'memories.confirmShareHint': '{count} фото станут видны всем участникам этой поездки. Вы сможете сделать отдельные фото приватными позже.',
'memories.confirmShareButton': 'Поделиться фото',
// Collab Addon
'collab.tabs.chat': 'Чат',
'collab.tabs.notes': 'Заметки',
'collab.tabs.polls': 'Опросы',
'collab.whatsNext.title': 'Что дальше',
'collab.whatsNext.today': 'Сегодня',
'collab.whatsNext.tomorrow': 'Завтра',
'collab.whatsNext.empty': 'Нет предстоящих активностей',
'collab.whatsNext.until': 'до',
'collab.whatsNext.emptyHint': 'Активности со временем будут отображаться здесь',
'collab.chat.send': 'Отправить',
'collab.chat.placeholder': 'Введите сообщение...',
'collab.chat.empty': 'Начните разговор',
'collab.chat.emptyHint': 'Сообщения видны всем участникам поездки',
'collab.chat.emptyDesc': 'Делитесь идеями, планами и новостями с вашей группой',
'collab.chat.today': 'Сегодня',
'collab.chat.yesterday': 'Вчера',
'collab.chat.deletedMessage': 'удалил(а) сообщение',
'collab.chat.reply': 'Ответить',
'collab.chat.loadMore': 'Загрузить старые сообщения',
'collab.chat.justNow': 'только что',
'collab.chat.minutesAgo': '{n} мин. назад',
'collab.chat.hoursAgo': '{n} ч. назад',
'collab.notes.title': 'Заметки',
'collab.notes.new': 'Новая заметка',
'collab.notes.empty': 'Заметок пока нет',
'collab.notes.emptyHint': 'Начните записывать идеи и планы',
'collab.notes.all': 'Все',
'collab.notes.titlePlaceholder': 'Название заметки',
'collab.notes.contentPlaceholder': 'Напишите что-нибудь...',
'collab.notes.categoryPlaceholder': 'Категория',
'collab.notes.newCategory': 'Новая категория...',
'collab.notes.category': 'Категория',
'collab.notes.noCategory': 'Без категории',
'collab.notes.color': 'Цвет',
'collab.notes.save': 'Сохранить',
'collab.notes.cancel': 'Отмена',
'collab.notes.edit': 'Редактировать',
'collab.notes.delete': 'Удалить',
'collab.notes.pin': 'Закрепить',
'collab.notes.unpin': 'Открепить',
'collab.notes.daysAgo': '{n} дн. назад',
'collab.notes.categorySettings': 'Управление категориями',
'collab.notes.create': 'Создать',
'collab.notes.website': 'Сайт',
'collab.notes.websitePlaceholder': 'https://...',
'collab.notes.attachFiles': 'Прикрепить файлы',
'collab.notes.noCategoriesYet': 'Категорий пока нет',
'collab.notes.emptyDesc': 'Создайте заметку, чтобы начать',
'collab.polls.title': 'Опросы',
'collab.polls.new': 'Новый опрос',
'collab.polls.empty': 'Опросов пока нет',
'collab.polls.emptyHint': 'Задайте вопрос группе и голосуйте вместе',
'collab.polls.question': 'Вопрос',
'collab.polls.questionPlaceholder': 'Что нам делать?',
'collab.polls.addOption': '+ Добавить вариант',
'collab.polls.optionPlaceholder': 'Вариант {n}',
'collab.polls.create': 'Создать опрос',
'collab.polls.close': 'Закрыть',
'collab.polls.closed': 'Закрыт',
'collab.polls.votes': '{n} голосов',
'collab.polls.vote': '{n} голос',
'collab.polls.multipleChoice': 'Множественный выбор',
'collab.polls.multiChoice': 'Множественный выбор',
'collab.polls.deadline': 'Срок',
'collab.polls.option': 'Вариант',
'collab.polls.options': 'Варианты',
'collab.polls.delete': 'Удалить',
'collab.polls.closedSection': 'Закрытые',
// Permissions
'admin.tabs.permissions': 'Разрешения',
'perm.title': 'Настройки разрешений',
'perm.subtitle': 'Управляйте тем, кто может выполнять действия в приложении',
'perm.saved': 'Настройки разрешений сохранены',
'perm.resetDefaults': 'Сбросить по умолчанию',
'perm.customized': 'изменено',
'perm.level.admin': 'Только администратор',
'perm.level.tripOwner': 'Владелец поездки',
'perm.level.tripMember': 'Участники поездки',
'perm.level.everybody': 'Все',
'perm.cat.trip': 'Управление поездками',
'perm.cat.members': 'Управление участниками',
'perm.cat.files': 'Файлы',
'perm.cat.content': 'Контент и расписание',
'perm.cat.extras': 'Бюджет, сборы и совместная работа',
'perm.action.trip_create': 'Создавать поездки',
'perm.action.trip_edit': 'Редактировать детали поездки',
'perm.action.trip_delete': 'Удалять поездки',
'perm.action.trip_archive': 'Архивировать / разархивировать поездки',
'perm.action.trip_cover_upload': 'Загружать обложку',
'perm.action.member_manage': 'Добавлять / удалять участников',
'perm.action.file_upload': 'Загружать файлы',
'perm.action.file_edit': 'Редактировать метаданные файлов',
'perm.action.file_delete': 'Удалять файлы',
'perm.action.place_edit': 'Добавлять / редактировать / удалять места',
'perm.action.day_edit': 'Редактировать дни, заметки и назначения',
'perm.action.reservation_edit': 'Управлять бронированиями',
'perm.action.budget_edit': 'Управлять бюджетом',
'perm.action.packing_edit': 'Управлять списками вещей',
'perm.action.collab_edit': 'Совместная работа (заметки, опросы, чат)',
'perm.action.share_manage': 'Управлять ссылками для обмена',
'perm.actionHint.trip_create': 'Кто может создавать новые поездки',
'perm.actionHint.trip_edit': 'Кто может менять название, даты, описание и валюту поездки',
'perm.actionHint.trip_delete': 'Кто может безвозвратно удалить поездку',
'perm.actionHint.trip_archive': 'Кто может архивировать или разархивировать поездку',
'perm.actionHint.trip_cover_upload': 'Кто может загружать или менять обложку',
'perm.actionHint.member_manage': 'Кто может приглашать или удалять участников поездки',
'perm.actionHint.file_upload': 'Кто может загружать файлы в поездку',
'perm.actionHint.file_edit': 'Кто может редактировать описания и ссылки файлов',
'perm.actionHint.file_delete': 'Кто может перемещать файлы в корзину или безвозвратно удалять',
'perm.actionHint.place_edit': 'Кто может добавлять, редактировать или удалять места',
'perm.actionHint.day_edit': 'Кто может редактировать дни, заметки к дням и назначения мест',
'perm.actionHint.reservation_edit': 'Кто может создавать, редактировать или удалять бронирования',
'perm.actionHint.budget_edit': 'Кто может создавать, редактировать или удалять статьи бюджета',
'perm.actionHint.packing_edit': 'Кто может управлять вещами для сборов и сумками',
'perm.actionHint.collab_edit': 'Кто может создавать заметки, опросы и отправлять сообщения',
'perm.actionHint.share_manage': 'Кто может создавать или удалять публичные ссылки для обмена',
// Undo
'undo.button': 'Отменить',
'undo.tooltip': 'Отменить: {action}',
'undo.assignPlace': 'Место добавлено в день',
'undo.removeAssignment': 'Место удалено из дня',
'undo.reorder': 'Места переупорядочены',
'undo.optimize': 'Маршрут оптимизирован',
'undo.deletePlace': 'Место удалено',
'undo.deletePlaces': 'Места удалены',
'undo.moveDay': 'Место перемещено в другой день',
'undo.lock': 'Блокировка места изменена',
'undo.importGpx': 'Импорт GPX',
'undo.importKeyholeMarkup': 'Импорт KMZ/KML',
'undo.importGoogleList': 'Импорт из Google Maps',
'undo.importNaverList': 'Импорт из Naver Maps',
// Notifications
'notifications.title': 'Уведомления',
'notifications.markAllRead': 'Отметить все прочитанными',
'notifications.deleteAll': 'Удалить все',
'notifications.showAll': 'Показать все уведомления',
'notifications.empty': 'Нет уведомлений',
'notifications.emptyDescription': 'Вы в курсе всех событий!',
'notifications.all': 'Все',
'notifications.unreadOnly': 'Непрочитанные',
'notifications.markRead': 'Отметить как прочитанное',
'notifications.markUnread': 'Отметить как непрочитанное',
'notifications.delete': 'Удалить',
'notifications.system': 'Система',
'notifications.synologySessionCleared.title': 'Synology Photos отключено',
'notifications.synologySessionCleared.text': 'Ваш сервер или аккаунт изменился — перейдите в Настройки, чтобы проверить соединение снова.',
'memories.error.loadAlbums': 'Не удалось загрузить альбомы',
'memories.error.linkAlbum': 'Не удалось привязать альбом',
'memories.error.unlinkAlbum': 'Не удалось отвязать альбом',
'memories.error.syncAlbum': 'Не удалось синхронизировать альбом',
'memories.error.loadPhotos': 'Не удалось загрузить фотографии',
'memories.error.addPhotos': 'Не удалось добавить фотографии',
'memories.error.removePhoto': 'Не удалось удалить фотографию',
'memories.error.toggleSharing': 'Не удалось обновить настройки доступа',
'undo.addPlace': 'Место добавлено',
'undo.done': 'Отменено: {action}',
'notifications.test.title': 'Тестовое уведомление от {actor}',
'notifications.test.text': 'Это простое тестовое уведомление.',
'notifications.test.booleanTitle': '{actor} запрашивает подтверждение',
'notifications.test.booleanText': 'Тестовое уведомление с выбором.',
'notifications.test.accept': 'Подтвердить',
'notifications.test.decline': 'Отклонить',
'notifications.test.navigateTitle': 'Посмотрите на это',
'notifications.test.navigateText': 'Тестовое уведомление с переходом.',
'notifications.test.goThere': 'Перейти',
'notifications.test.adminTitle': 'Рассылка администратора',
'notifications.test.adminText': '{actor} отправил тестовое уведомление всем администраторам.',
'notifications.test.tripTitle': '{actor} написал в вашей поездке',
'notifications.test.tripText': 'Тестовое уведомление для поездки "{trip}".',
// Todo
'todo.subtab.packing': 'Список вещей',
'todo.subtab.todo': 'Задачи',
'todo.completed': 'выполнено',
'todo.filter.all': 'Все',
'todo.filter.open': 'Открытые',
'todo.filter.done': 'Выполненные',
'todo.uncategorized': 'Без категории',
'todo.namePlaceholder': 'Название задачи',
'todo.descriptionPlaceholder': 'Описание (необязательно)',
'todo.unassigned': 'Не назначено',
'todo.noCategory': 'Без категории',
'todo.hasDescription': 'Есть описание',
'todo.addItem': 'Новая задача',
'todo.sidebar.sortBy': 'Сортировать по',
'todo.priority': 'Приоритет',
'todo.newCategoryLabel': 'новая',
'budget.categoriesLabel': 'категорий',
'todo.newCategory': 'Название категории',
'todo.addCategory': 'Добавить категорию',
'todo.newItem': 'Новая задача',
'todo.empty': 'Задач пока нет. Добавьте задачу, чтобы начать!',
'todo.filter.my': 'Мои задачи',
'todo.filter.overdue': 'Просроченные',
'todo.sidebar.tasks': 'Задачи',
'todo.sidebar.categories': 'Категории',
'todo.detail.title': 'Задача',
'todo.detail.description': 'Описание',
'todo.detail.category': 'Категория',
'todo.detail.dueDate': 'Срок выполнения',
'todo.detail.assignedTo': 'Назначено',
'todo.detail.delete': 'Удалить',
'todo.detail.save': 'Сохранить изменения',
'todo.detail.create': 'Создать задачу',
'todo.detail.priority': 'Приоритет',
'todo.detail.noPriority': 'Нет',
'todo.sortByPrio': 'Приоритет',
// Notification system (added from feat/notification-system)
'settings.notifyVersionAvailable': 'Доступна новая версия',
'settings.notificationPreferences.noChannels': 'Каналы уведомлений не настроены. Попросите администратора настроить уведомления по электронной почте или через webhook.',
'settings.webhookUrl.label': 'URL вебхука',
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
'settings.webhookUrl.hint': 'Введите URL вашего вебхука Discord, Slack или пользовательского для получения уведомлений.',
'settings.webhookUrl.saved': 'URL вебхука сохранён',
'settings.webhookUrl.test': 'Тест',
'settings.webhookUrl.testSuccess': 'Тестовый вебхук успешно отправлен',
'settings.webhookUrl.testFailed': 'Ошибка тестового вебхука',
'settings.ntfyUrl.topicLabel': 'Тема Ntfy',
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
'settings.ntfyUrl.serverLabel': 'URL сервера Ntfy (необязательно)',
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
'settings.ntfyUrl.hint': 'Введите тему Ntfy для получения push-уведомлений. Оставьте поле сервера пустым, чтобы использовать настройку по умолчанию, заданную администратором.',
'settings.ntfyUrl.tokenLabel': 'Токен доступа (необязательно)',
'settings.ntfyUrl.tokenHint': 'Требуется для тем, защищённых паролем.',
'settings.ntfyUrl.saved': 'Настройки Ntfy сохранены',
'settings.ntfyUrl.test': 'Тест',
'settings.ntfyUrl.testSuccess': 'Тестовое уведомление Ntfy успешно отправлено',
'settings.ntfyUrl.testFailed': 'Ошибка отправки тестового уведомления Ntfy',
'settings.ntfyUrl.tokenCleared': 'Токен доступа очищен',
'settings.notificationPreferences.inapp': 'In-App',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'admin.notifications.emailPanel.title': 'Email (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.inappPanel.title': 'In-App',
'admin.notifications.inappPanel.hint': 'Уведомления в приложении всегда активны и не могут быть отключены глобально.',
'admin.notifications.adminWebhookPanel.title': 'Вебхук администратора',
'admin.notifications.adminWebhookPanel.hint': 'Этот вебхук используется исключительно для уведомлений администратора (например, оповещения о версиях). Он независим от пользовательских вебхуков и отправляется автоматически при наличии URL.',
'admin.notifications.adminWebhookPanel.saved': 'URL вебхука администратора сохранён',
'admin.notifications.adminWebhookPanel.testSuccess': 'Тестовый вебхук успешно отправлен',
'admin.notifications.adminWebhookPanel.testFailed': 'Ошибка тестового вебхука',
'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Вебхук администратора отправляется автоматически при наличии URL',
'admin.notifications.ntfy': 'Ntfy',
'admin.ntfy.hint': 'Позволяет пользователям настраивать собственные темы ntfy для push-уведомлений. Установите сервер по умолчанию ниже, чтобы предварительно заполнить настройки пользователей.',
'admin.notifications.testNtfy': 'Отправить тестовое Ntfy',
'admin.notifications.testNtfySuccess': 'Тестовое Ntfy успешно отправлено',
'admin.notifications.testNtfyFailed': 'Ошибка отправки тестового Ntfy',
'admin.notifications.adminNtfyPanel.title': 'Ntfy администратора',
'admin.notifications.adminNtfyPanel.hint': 'Эта тема Ntfy используется исключительно для уведомлений администратора (например, оповещения о версиях). Она независима от тем пользователей и всегда отправляется при наличии настройки.',
'admin.notifications.adminNtfyPanel.serverLabel': 'URL сервера Ntfy',
'admin.notifications.adminNtfyPanel.serverHint': 'Также используется как сервер по умолчанию для ntfy-уведомлений пользователей. Оставьте пустым, чтобы использовать ntfy.sh. Пользователи могут изменить это в своих настройках.',
'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh',
'admin.notifications.adminNtfyPanel.topicLabel': 'Тема администратора',
'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts',
'admin.notifications.adminNtfyPanel.tokenLabel': 'Токен доступа (необязательно)',
'admin.notifications.adminNtfyPanel.tokenCleared': 'Токен доступа администратора очищен',
'admin.notifications.adminNtfyPanel.saved': 'Настройки Ntfy администратора сохранены',
'admin.notifications.adminNtfyPanel.test': 'Отправить тестовое Ntfy',
'admin.notifications.adminNtfyPanel.testSuccess': 'Тестовое Ntfy успешно отправлено',
'admin.notifications.adminNtfyPanel.testFailed': 'Ошибка отправки тестового Ntfy',
'admin.notifications.adminNtfyPanel.alwaysOnHint': 'Ntfy администратора всегда отправляется при наличии настроенной темы',
'admin.notifications.adminNotificationsHint': 'Настройте, какие каналы доставляют уведомления администратора (например, оповещения о версиях). Вебхук отправляется автоматически, если задан URL вебхука администратора.',
'admin.notifications.tripReminders.title': 'Напоминания о поездках',
'admin.notifications.tripReminders.hint': 'Отправляет напоминание перед началом поездки (необходимо указать дни напоминания в параметрах поездки).',
'admin.notifications.tripReminders.enabled': 'Напоминания о поездках включены',
'admin.notifications.tripReminders.disabled': 'Напоминания о поездках отключены',
'admin.tabs.notifications': 'Уведомления',
'notifications.versionAvailable.title': 'Доступно обновление',
'notifications.versionAvailable.text': 'TREK {version} теперь доступен.',
'notifications.versionAvailable.button': 'Подробнее',
'notif.test.title': '[Тест] Уведомление',
'notif.test.simple.text': 'Это простое тестовое уведомление.',
'notif.test.boolean.text': 'Вы принимаете это тестовое уведомление?',
'notif.test.navigate.text': 'Нажмите ниже для перехода на панель управления.',
// Notifications
'notif.trip_invite.title': 'Приглашение в поездку',
'notif.trip_invite.text': '{actor} пригласил вас в {trip}',
'notif.booking_change.title': 'Бронирование обновлено',
'notif.booking_change.text': '{actor} обновил бронирование в {trip}',
'notif.trip_reminder.title': 'Напоминание о поездке',
'notif.trip_reminder.text': 'Ваша поездка {trip} скоро начнётся!',
'notif.todo_due.title': 'Задача к сроку',
'notif.todo_due.text': '{todo} в {trip} — срок {due}',
'notif.vacay_invite.title': 'Приглашение Vacay Fusion',
'notif.vacay_invite.text': '{actor} приглашает вас объединить планы отпуска',
'notif.photos_shared.title': 'Фото опубликованы',
'notif.photos_shared.text': '{actor} поделился {count} фото в {trip}',
'notif.collab_message.title': 'Новое сообщение',
'notif.collab_message.text': '{actor} отправил сообщение в {trip}',
'notif.packing_tagged.title': 'Задание для упаковки',
'notif.packing_tagged.text': '{actor} назначил вас в {category} в {trip}',
'notif.version_available.title': 'Доступна новая версия',
'notif.version_available.text': 'TREK {version} теперь доступен',
'notif.action.view_trip': 'Открыть поездку',
'notif.action.view_collab': 'Открыть сообщения',
'notif.action.view_packing': 'Открыть упаковку',
'notif.action.view_photos': 'Открыть фото',
'notif.action.view_vacay': 'Открыть Vacay',
'notif.action.view_admin': 'Перейти в админ',
'notif.action.view': 'Открыть',
'notif.action.accept': 'Принять',
'notif.action.decline': 'Отклонить',
'notif.generic.title': 'Уведомление',
'notif.generic.text': 'У вас новое уведомление',
'notif.dev.unknown_event.title': '[DEV] Неизвестное событие',
'notif.dev.unknown_event.text': 'Тип события "{event}" не зарегистрирован в EVENT_NOTIFICATION_CONFIG',
// Journey, Dashboard, Nav, DayPlan
'common.justNow': 'только что',
'common.hoursAgo': '{count} ч назад',
'common.daysAgo': '{count} д назад',
'memories.saveRouteNotConfigured': 'Маршрут сохранения не настроен для этого провайдера',
'memories.testRouteNotConfigured': 'Маршрут тестирования не настроен для этого провайдера',
'memories.fillRequiredFields': 'Пожалуйста, заполните все обязательные поля',
'journey.search.placeholder': 'Поиск путешествий…',
'journey.search.noResults': 'Путешествий по запросу «{query}» не найдено',
'journey.title': 'Путешествие',
'journey.subtitle': 'Отслеживайте свои путешествия в реальном времени',
'journey.new': 'Новое путешествие',
'journey.create': 'Создать',
'journey.titlePlaceholder': 'Куда вы едете?',
'journey.empty': 'Пока нет путешествий',
'journey.emptyHint': 'Начните документировать свою следующую поездку',
'journey.deleted': 'Путешествие удалено',
'journey.createError': 'Не удалось создать путешествие',
'journey.deleteError': 'Не удалось удалить путешествие',
'journey.deleteConfirmTitle': 'Удалить',
'journey.deleteConfirmMessage': 'Удалить «{title}»? Это действие нельзя отменить.',
'journey.deleteConfirmGeneric': 'Вы уверены, что хотите удалить это?',
'journey.notFound': 'Путешествие не найдено',
'journey.photos': 'Фото',
'journey.timelineEmpty': 'Пока нет остановок',
'journey.timelineEmptyHint': 'Добавьте отметку или напишите запись в дневник',
'journey.status.draft': 'Черновик',
'journey.status.active': 'Активно',
'journey.status.completed': 'Завершено',
'journey.status.upcoming': 'Предстоящее',
'journey.status.archived': 'В архиве',
'journey.checkin.add': 'Отметиться',
'journey.checkin.namePlaceholder': 'Название места',
'journey.checkin.notesPlaceholder': 'Заметки (необязательно)',
'journey.checkin.save': 'Сохранить',
'journey.checkin.error': 'Не удалось сохранить отметку',
'journey.entry.add': 'Дневник',
'journey.entry.edit': 'Редактировать запись',
'journey.entry.titlePlaceholder': 'Заголовок (необязательно)',
'journey.entry.bodyPlaceholder': 'Что произошло сегодня?',
'journey.entry.save': 'Сохранить',
'journey.entry.error': 'Не удалось сохранить запись',
'journey.photo.add': 'Фото',
'journey.photo.uploadError': 'Загрузка не удалась',
'journey.share.share': 'Поделиться',
'journey.share.public': 'Публичный',
'journey.share.linkCopied': 'Публичная ссылка скопирована',
'journey.share.disabled': 'Публичный доступ отключён',
'journey.editor.titlePlaceholder': 'Дайте название этому моменту...',
'journey.editor.bodyPlaceholder': 'Расскажите историю этого дня...',
'journey.editor.placePlaceholder': 'Местоположение (необязательно)',
'journey.editor.tagsPlaceholder': 'Теги: скрытая жемчужина, лучшая еда, стоит вернуться...',
'journey.visibility.private': 'Приватный',
'journey.visibility.shared': 'Общий',
'journey.visibility.public': 'Публичный',
'journey.emptyState.title': 'Ваша история начинается здесь',
'journey.emptyState.subtitle': 'Отметьтесь в месте или напишите первую запись в дневник',
'journey.frontpage.subtitle': 'Превращайте поездки в истории, которые вы никогда не забудете',
'journey.frontpage.createJourney': 'Создать путешествие',
'journey.frontpage.activeJourney': 'Активное путешествие',
'journey.frontpage.allJourneys': 'Все путешествия',
'journey.frontpage.journeys': 'путешествий',
'journey.frontpage.createNew': 'Создать новое путешествие',
'journey.frontpage.createNewSub': 'Выберите поездки, пишите истории, делитесь приключениями',
'journey.frontpage.live': 'В эфире',
'journey.frontpage.synced': 'Синхронизировано',
'journey.frontpage.continueWriting': 'Продолжить писать',
'journey.frontpage.updated': 'Обновлено {time}',
'journey.frontpage.suggestionLabel': 'Поездка только что завершилась',
'journey.frontpage.suggestionText': 'Превратите <strong>{title}</strong> в путешествие',
'journey.frontpage.dismiss': 'Скрыть',
'journey.frontpage.journeyName': 'Название путешествия',
'journey.frontpage.namePlaceholder': 'напр. Юго-Восточная Азия 2026',
'journey.frontpage.selectTrips': 'Выбрать поездки',
'journey.frontpage.tripsSelected': 'поездок выбрано',
'journey.frontpage.trips': 'поездок',
'journey.frontpage.placesImported': 'мест будет импортировано',
'journey.frontpage.places': 'мест',
'journey.detail.backToJourney': 'Назад к путешествию',
'journey.detail.syncedWithTrips': 'Синхронизировано с поездками',
'journey.detail.addEntry': 'Добавить запись',
'journey.detail.newEntry': 'Новая запись',
'journey.detail.editEntry': 'Редактировать запись',
'journey.detail.noEntries': 'Пока нет записей',
'journey.detail.noEntriesHint': 'Добавьте поездку, чтобы начать с шаблонных записей',
'journey.detail.noPhotos': 'Пока нет фото',
'journey.detail.noPhotosHint': 'Загрузите фото в записи или просмотрите библиотеку Immich/Synology',
'journey.detail.journeyStats': 'Статистика путешествия',
'journey.detail.syncedTrips': 'Синхронизированные поездки',
'journey.detail.noTripsLinked': 'Пока нет привязанных поездок',
'journey.detail.contributors': 'Участники',
'journey.detail.readMore': 'Читать далее',
'journey.detail.prosCons': 'Плюсы и минусы',
'journey.detail.photos': 'фото',
'journey.detail.day': 'День {number}',
'journey.detail.places': 'мест',
'journey.stats.days': 'Дней',
'journey.stats.cities': 'Городов',
'journey.stats.entries': 'Записей',
'journey.stats.photos': 'Фото',
'journey.stats.places': 'Мест',
'journey.skeletons.show': 'Показать предложения',
'journey.skeletons.hide': 'Скрыть предложения',
'journey.verdict.lovedIt': 'Понравилось',
'journey.verdict.couldBeBetter': 'Могло быть лучше',
'journey.synced.places': 'мест',
'journey.synced.synced': 'синхронизировано',
'journey.editor.discardChangesConfirm': 'У вас есть несохранённые изменения. Отменить?',
'journey.editor.uploadPhotos': 'Загрузить фото',
'journey.editor.uploading': 'Загрузка...',
'journey.editor.fromGallery': 'Из галереи',
'journey.editor.allPhotosAdded': 'Все фото уже добавлены',
'journey.editor.writeStory': 'Напишите свою историю...',
'journey.editor.prosCons': 'Плюсы и минусы',
'journey.editor.pros': 'Плюсы',
'journey.editor.cons': 'Минусы',
'journey.editor.proPlaceholder': 'Что-то отличное...',
'journey.editor.conPlaceholder': 'Не очень хорошо...',
'journey.editor.addAnother': 'Добавить ещё',
'journey.editor.date': 'Дата',
'journey.editor.location': 'Местоположение',
'journey.editor.searchLocation': 'Поиск местоположения...',
'journey.editor.mood': 'Настроение',
'journey.editor.weather': 'Погода',
'journey.editor.photoFirst': '1-е',
'journey.editor.makeFirst': 'Сделать 1-м',
'journey.editor.searching': 'Поиск...',
'journey.mood.amazing': 'Потрясающе',
'journey.mood.good': 'Хорошо',
'journey.mood.neutral': 'Нейтрально',
'journey.mood.rough': 'Тяжело',
'journey.weather.sunny': 'Солнечно',
'journey.weather.partly': 'Переменная облачность',
'journey.weather.cloudy': 'Облачно',
'journey.weather.rainy': 'Дождливо',
'journey.weather.stormy': 'Гроза',
'journey.weather.cold': 'Снежно',
'journey.trips.linkTrip': 'Привязать поездку',
'journey.trips.searchTrip': 'Поиск поездки',
'journey.trips.searchPlaceholder': 'Название поездки или направление...',
'journey.trips.noTripsAvailable': 'Нет доступных поездок',
'journey.trips.link': 'Привязать',
'journey.trips.tripLinked': 'Поездка привязана',
'journey.trips.linkFailed': 'Не удалось привязать поездку',
'journey.trips.addTrip': 'Добавить поездку',
'journey.trips.unlinkTrip': 'Отвязать поездку',
'journey.trips.unlinkMessage': 'Отвязать «{title}»? Все синхронизированные записи и фото из этой поездки будут безвозвратно удалены. Это действие нельзя отменить.',
'journey.trips.unlink': 'Отвязать',
'journey.trips.tripUnlinked': 'Поездка отвязана',
'journey.trips.unlinkFailed': 'Не удалось отвязать поездку',
'journey.trips.noTripsLinkedSettings': 'Нет привязанных поездок',
'journey.contributors.invite': 'Пригласить участника',
'journey.contributors.searchUser': 'Поиск пользователя',
'journey.contributors.searchPlaceholder': 'Имя пользователя или email...',
'journey.contributors.noUsers': 'Пользователи не найдены',
'journey.contributors.role': 'Роль',
'journey.contributors.added': 'Участник добавлен',
'journey.contributors.addFailed': 'Не удалось добавить участника',
'journey.share.publicShare': 'Публичный доступ',
'journey.share.createLink': 'Создать ссылку для общего доступа',
'journey.share.linkCreated': 'Ссылка создана',
'journey.share.createFailed': 'Не удалось создать ссылку',
'journey.share.copy': 'Копировать',
'journey.share.copied': 'Скопировано!',
'journey.share.timeline': 'Хронология',
'journey.share.gallery': 'Галерея',
'journey.share.map': 'Карта',
'journey.share.removeLink': 'Удалить ссылку',
'journey.share.linkDeleted': 'Ссылка удалена',
'journey.share.deleteFailed': 'Не удалось удалить',
'journey.share.updateFailed': 'Не удалось обновить',
// Journey — Invite
'journey.invite.role': 'Роль',
'journey.invite.viewer': 'Наблюдатель',
'journey.invite.editor': 'Редактор',
'journey.invite.invite': 'Пригласить',
'journey.invite.inviting': 'Приглашаем...',
'journey.settings.title': 'Настройки путешествия',
'journey.settings.coverImage': 'Обложка',
'journey.settings.changeCover': 'Сменить обложку',
'journey.settings.addCover': 'Добавить обложку',
'journey.settings.name': 'Название',
'journey.settings.subtitle': 'Подзаголовок',
'journey.settings.subtitlePlaceholder': 'напр. Таиланд, Вьетнам и Камбоджа',
'journey.settings.endJourney': 'Архивировать путешествие',
'journey.settings.reopenJourney': 'Восстановить путешествие',
'journey.settings.archived': 'Путешествие архивировано',
'journey.settings.reopened': 'Путешествие возобновлено',
'journey.settings.endDescription': 'Скрывает значок «В эфире». Вы можете возобновить в любое время.',
'journey.settings.delete': 'Удалить',
'journey.settings.deleteJourney': 'Удалить путешествие',
'journey.settings.deleteMessage': 'Удалить «{title}»? Все записи и фото будут потеряны.',
'journey.settings.saved': 'Настройки сохранены',
'journey.settings.saveFailed': 'Не удалось сохранить',
'journey.settings.coverUpdated': 'Обложка обновлена',
'journey.settings.coverFailed': 'Загрузка не удалась',
'journey.settings.failedToDelete': 'Не удалось удалить',
'journey.entries.deleteTitle': 'Удалить запись',
'journey.photosUploaded': '{count} фото загружено',
'journey.photosAdded': '{count} фото добавлено',
'journey.public.notFound': 'Не найдено',
'journey.public.notFoundMessage': 'Это путешествие не существует или ссылка устарела.',
'journey.public.readOnly': 'Только для чтения · Публичное путешествие',
'journey.public.tagline': 'Инструмент планирования и исследования путешествий',
'journey.public.sharedVia': 'Опубликовано через',
'journey.public.madeWith': 'Сделано с помощью',
'journey.pdf.journeyBook': 'Книга путешествия',
'journey.pdf.madeWith': 'Сделано с помощью TREK',
'journey.pdf.day': 'День',
'journey.pdf.theEnd': 'Конец',
'journey.pdf.saveAsPdf': 'Сохранить как PDF',
'journey.pdf.pages': 'страниц',
'journey.picker.tripPeriod': 'Период поездки',
'journey.picker.dateRange': 'Диапазон дат',
'journey.picker.allPhotos': 'Все фото',
'journey.picker.albums': 'Альбомы',
'journey.picker.selected': 'выбрано',
'journey.picker.addTo': 'Добавить в',
'journey.picker.newGallery': 'Новая галерея',
'journey.picker.selectAll': 'Выбрать все',
'journey.picker.deselectAll': 'Снять выбор',
'journey.picker.noAlbums': 'Альбомы не найдены',
'journey.picker.selectDate': 'Выберите дату',
'journey.picker.search': 'Поиск',
'dashboard.greeting.morning': 'Доброе утро,',
'dashboard.greeting.afternoon': 'Добрый день,',
'dashboard.greeting.evening': 'Добрый вечер,',
'dashboard.mobile.liveNow': 'Сейчас в пути',
'dashboard.mobile.tripProgress': 'Прогресс поездки',
'dashboard.mobile.daysLeft': 'осталось {count} дн.',
'dashboard.mobile.places': 'Места',
'dashboard.mobile.buddies': 'Попутчики',
'dashboard.mobile.newTrip': 'Новая поездка',
'dashboard.mobile.currency': 'Валюта',
'dashboard.mobile.timezone': 'Часовой пояс',
'dashboard.mobile.upcomingTrips': 'Предстоящие поездки',
'dashboard.mobile.yourTrips': 'Ваши поездки',
'dashboard.mobile.trips': 'поездок',
'dashboard.mobile.starts': 'Начало',
'dashboard.mobile.duration': 'Продолжительность',
'dashboard.mobile.day': 'день',
'dashboard.mobile.days': 'дней',
'dashboard.mobile.ongoing': 'В процессе',
'dashboard.mobile.startsToday': 'Начинается сегодня',
'dashboard.mobile.tomorrow': 'Завтра',
'dashboard.mobile.inDays': 'Через {count} дн.',
'dashboard.mobile.inMonths': 'Через {count} мес.',
'dashboard.mobile.completed': 'Завершено',
'dashboard.mobile.currencyConverter': 'Конвертер валют',
'nav.profile': 'Профиль',
'nav.bottomSettings': 'Настройки',
'nav.bottomAdmin': 'Администрирование',
'nav.bottomLogout': 'Выйти',
'nav.bottomAdminBadge': 'Админ',
'dayplan.mobile.addPlace': 'Добавить место',
'dayplan.mobile.searchPlaces': 'Поиск мест...',
'dayplan.mobile.allAssigned': 'Все места распределены',
'dayplan.mobile.noMatch': 'Нет совпадений',
'dayplan.mobile.createNew': 'Создать новое место',
'admin.addons.catalog.journey.name': 'Путешествие',
'admin.addons.catalog.journey.description': 'Отслеживание поездок и дневник путешествий с отметками, фото и ежедневными историями',
// OAuth scope groups
'oauth.scope.group.trips': 'Поездки',
'oauth.scope.group.places': 'Места',
'oauth.scope.group.atlas': 'Atlas',
'oauth.scope.group.packing': 'Вещи',
'oauth.scope.group.todos': 'Задачи',
'oauth.scope.group.budget': 'Бюджет',
'oauth.scope.group.reservations': 'Бронирования',
'oauth.scope.group.collab': 'Сотрудничество',
'oauth.scope.group.notifications': 'Уведомления',
'oauth.scope.group.vacay': 'Отпуск',
'oauth.scope.group.geo': 'Geo',
'oauth.scope.group.weather': 'Погода',
'oauth.scope.group.journey': 'Путешествия',
// OAuth scope labels & descriptions
'oauth.scope.trips:read.label': 'Просмотр поездок и маршрутов',
'oauth.scope.trips:read.description': 'Чтение поездок, дней, заметок и участников',
'oauth.scope.trips:write.label': 'Редактирование поездок и маршрутов',
'oauth.scope.trips:write.description': 'Создание и обновление поездок, дней, заметок и управление участниками',
'oauth.scope.trips:delete.label': 'Удаление поездок',
'oauth.scope.trips:delete.description': 'Безвозвратное удаление поездок — это действие необратимо',
'oauth.scope.trips:share.label': 'Управление ссылками на совместный доступ',
'oauth.scope.trips:share.description': 'Создание, обновление и отзыв публичных ссылок на поездки',
'oauth.scope.places:read.label': 'Просмотр мест и данных карты',
'oauth.scope.places:read.description': 'Чтение мест, назначений по дням, тегов и категорий',
'oauth.scope.places:write.label': 'Управление местами',
'oauth.scope.places:write.description': 'Создание, обновление и удаление мест, назначений и тегов',
'oauth.scope.atlas:read.label': 'Просмотр Atlas',
'oauth.scope.atlas:read.description': 'Чтение посещённых стран, регионов и списка желаний',
'oauth.scope.atlas:write.label': 'Управление Atlas',
'oauth.scope.atlas:write.description': 'Отмечать посещённые страны и регионы, управлять списком желаний',
'oauth.scope.packing:read.label': 'Просмотр списков вещей',
'oauth.scope.packing:read.description': 'Чтение вещей, сумок и назначений категорий',
'oauth.scope.packing:write.label': 'Управление списками вещей',
'oauth.scope.packing:write.description': 'Добавление, обновление, удаление, отметка и переупорядочивание вещей и сумок',
'oauth.scope.todos:read.label': 'Просмотр списков задач',
'oauth.scope.todos:read.description': 'Чтение задач поездки и назначений категорий',
'oauth.scope.todos:write.label': 'Управление списками задач',
'oauth.scope.todos:write.description': 'Создание, обновление, отметка, удаление и переупорядочивание задач',
'oauth.scope.budget:read.label': 'Просмотр бюджета',
'oauth.scope.budget:read.description': 'Чтение статей бюджета и разбивки расходов',
'oauth.scope.budget:write.label': 'Управление бюджетом',
'oauth.scope.budget:write.description': 'Создание, обновление и удаление статей бюджета',
'oauth.scope.reservations:read.label': 'Просмотр бронирований',
'oauth.scope.reservations:read.description': 'Чтение бронирований и сведений о проживании',
'oauth.scope.reservations:write.label': 'Управление бронированиями',
'oauth.scope.reservations:write.description': 'Создание, обновление, удаление и переупорядочивание бронирований',
'oauth.scope.collab:read.label': 'Просмотр совместной работы',
'oauth.scope.collab:read.description': 'Чтение совместных заметок, опросов и сообщений',
'oauth.scope.collab:write.label': 'Управление совместной работой',
'oauth.scope.collab:write.description': 'Создание, обновление и удаление заметок, опросов и сообщений',
'oauth.scope.notifications:read.label': 'Просмотр уведомлений',
'oauth.scope.notifications:read.description': 'Чтение уведомлений в приложении и количества непрочитанных',
'oauth.scope.notifications:write.label': 'Управление уведомлениями',
'oauth.scope.notifications:write.description': 'Отмечать уведомления как прочитанные и отвечать на них',
'oauth.scope.vacay:read.label': 'Просмотр планов отпуска',
'oauth.scope.vacay:read.description': 'Чтение данных планирования отпуска, записей и статистики',
'oauth.scope.vacay:write.label': 'Управление планами отпуска',
'oauth.scope.vacay:write.description': 'Создание и управление записями отпуска, праздниками и командными планами',
'oauth.scope.geo:read.label': 'Карты и геокодирование',
'oauth.scope.geo:read.description': 'Поиск мест, разрешение URL карт и обратное геокодирование координат',
'oauth.scope.weather:read.label': 'Прогнозы погоды',
'oauth.scope.weather:read.description': 'Получение прогнозов погоды для мест и дат поездки',
'oauth.scope.journey:read.label': 'Просмотр путешествий',
'oauth.scope.journey:read.description': 'Чтение путешествий, записей и списка участников',
'oauth.scope.journey:write.label': 'Управление путешествиями',
'oauth.scope.journey:write.description': 'Создание, обновление и удаление путешествий и их записей',
'oauth.scope.journey:share.label': 'Управление ссылками на путешествия',
'oauth.scope.journey:share.description': 'Создание, обновление и отзыв публичных ссылок для путешествий',
// System notices
'system_notice.welcome_v1.title': 'Добро пожаловать в TREK',
'system_notice.welcome_v1.body': 'Ваш универсальный планировщик путешествий. Создавайте маршруты, делитесь поездками с друзьями и оставайтесь организованными — онлайн и офлайн.',
'system_notice.welcome_v1.cta_label': 'Спланировать поездку',
'system_notice.welcome_v1.hero_alt': 'Живописное место назначения с интерфейсом TREK',
'system_notice.welcome_v1.highlight_plan': 'Маршруты по дням',
'system_notice.welcome_v1.highlight_share': 'Совместное планирование с партнёрами',
'system_notice.welcome_v1.highlight_offline': 'Работает офлайн на мобильном',
'system_notice.dev_test_modal.title': '[Dev] Test notice',
'system_notice.dev_test_modal.body': 'This is a dev-only test notice.',
'system_notice.pager.prev': 'Предыдущее уведомление',
'system_notice.pager.next': 'Следующее уведомление',
'system_notice.pager.counter': '{current} / {total}',
'system_notice.pager.goto': 'Перейти к уведомлению {n}',
'system_notice.pager.position': 'Уведомление {current} из {total}',
// System notices — 3.0.0 upgrade
'system_notice.v3_photos.title': 'Фото перемещены в версии 3.0',
'system_notice.v3_photos.body': 'Вкладка **Фото** в Планировщике путешествий удалена. Ваши фото в безопасности — TREK никогда не изменял вашу библиотеку Immich или Synology.\n\nФото теперь доступны в дополнении **Journey**. Journey необязателен — если он ещё недоступен, попросите администратора включить его в разделе Admin → Дополнения.',
'system_notice.v3_journey.title': 'Знакомьтесь с Journey',
'system_notice.v3_journey.body': 'Документируйте путешествия в виде рассказов с хронологиями, фотогалереями и интерактивными картами.',
'system_notice.v3_journey.cta_label': 'Открыть Journey',
'system_notice.v3_journey.highlight_timeline': 'Ежедневная хронология и галерея',
'system_notice.v3_journey.highlight_photos': 'Импорт из Immich или Synology',
'system_notice.v3_journey.highlight_share': 'Общий доступ — без входа',
'system_notice.v3_journey.highlight_export': 'Экспорт в PDF-фотокнигу',
'system_notice.v3_features.title': 'Ещё нового в версии 3.0',
'system_notice.v3_features.body': 'Несколько других важных новшеств в этом релизе.',
'system_notice.v3_features.highlight_dashboard': 'Переработанная панель в mobile-first стиле',
'system_notice.v3_features.highlight_offline': 'Полный офлайн-режим как PWA',
'system_notice.v3_features.highlight_search': 'Автодополнение поиска мест в реальном времени',
'system_notice.v3_features.highlight_import': 'Импорт мест из KMZ/KML-файлов',
// System notices — MCP OAuth 2.1 upgrade
'system_notice.v3_mcp.title': 'MCP: обновление OAuth 2.1',
'system_notice.v3_mcp.body': 'Интеграция MCP была полностью переработана. OAuth 2.1 теперь является рекомендуемым методом аутентификации. Статические токены (trek_…) устарели и будут удалены в будущей версии.',
'system_notice.v3_mcp.highlight_oauth': 'OAuth 2.1 рекомендуется (mcp-remote)',
'system_notice.v3_mcp.highlight_scopes': '24 детальных области разрешений',
'system_notice.v3_mcp.highlight_deprecated': 'Статические токены trek_ устарели',
'system_notice.v3_mcp.highlight_tools': 'Расширенный набор инструментов',
// System notices — personal thank you
'system_notice.v3_thankyou.title': 'Личное слово от меня',
'system_notice.v3_thankyou.body': 'Прежде чем продолжить — хочу остановиться на мгновение.\n\nTREK начинался как сторонний проект, который я создал для собственных поездок. Я никогда не думал, что он вырастет во что-то, чему 4 000 из вас доверяют планирование своих приключений. Каждая звёздочка, каждый issue, каждый запрос на фичу — я читаю их все, и именно они поддерживают меня в поздние ночи между основной работой и университетом.\n\nХочу, чтобы вы знали: TREK всегда будет open source, всегда self-hosted, всегда вашим. Никакого отслеживания, никаких подписок, никаких подвохов. Просто инструмент, созданный человеком, который любит путешествовать так же, как и вы.\n\nОсобая благодарность [jubnl](https://github.com/jubnl) — ты стал невероятным соратником. Многое из того, что делает версию 3.0 великолепной, несёт твой отпечаток. Спасибо, что поверил в этот проект, когда он был ещё сырым.\n\nИ каждому из вас, кто сообщил об ошибке, перевёл строку, поделился TREK с другом или просто использовал его для планирования поездки — **спасибо**. Вы — причина, по которой всё это существует.\n\nЗа множество новых приключений вместе.\n\n— Maurice\n\n---\n\n[Присоединяйся к сообществу в Discord](https://discord.gg/7Q6M6jDwzf)\n\nЕсли TREK делает твои путешествия лучше, [маленький кофе](https://ko-fi.com/mauriceboe) всегда помогает держать свет включённым.',
'transport.addTransport': 'Add transport',
'transport.modalTitle.create': 'Add transport',
'transport.modalTitle.edit': 'Edit transport',
'transport.title': 'Транспорт',
'transport.addManual': 'Ручной транспорт',
}
export default ru