Files
TREK/shared/src/i18n/ru/settings.ts
T
Maurice 77162aa8d5 feat(roadtrip): avoid tolls, motorways and ferries, through a second engine
The switch a road tripper keeps asking for has never worked. OSRM's `exclude` is the only
avoidance TREK has, and the two public hosts it ships with answer it HTTP 400 on every
leg: their car profile is built without excludable classes, and their own Lua says why
("no memory for classes on demo server"). So "drive this without the tolls" produced
nothing at all on a default install, and the fallback inside the alternatives bar quietly
gave up after one refusal per host.

FOSSGIS runs a public Valhalla on the whole planet next to that OSRM, keyless, and there
avoidance is a runtime weighting rather than a profile that has to be rebuilt. This adds
it as a second engine asked only the questions the first cannot answer, and puts three
switches under the road trip settings that change the road itself rather than offering an
alternative beside it. Paris to Lyon measured 465.8 km / 297 min with tolls against
492.0 km / 454 min without; Hamburg to Copenhagen comes back ferry-free at 469.8 km,
which OSRM cannot produce at all — where a ferry IS the crossing it answers NoRoute
rather than driving round.

Four things the docs would have got wrong, all measured against the live instance:

- `format=osrm` does not carry `has_toll`. That flag is the entire reason for doing this,
  and it exists only in the native answer — which is also 5.7x smaller, because the OSRM
  shape drags every intersection along. So the adapter translates instead of borrowing a
  familiar envelope.
- Without a `radius` Valhalla refuses a point it cannot bind to a road, where OSRM still
  snaps one. Vienna's Stephansdom, in a pedestrian zone, answers error 442 until a search
  radius is allowed. TREK is full of such places, so every location carries one.
- Ten locations is a hard cap and a road trip day is bundled into one request. A day over
  it is split into runs overlapping by one point, which is exact rather than approximate:
  a measured six-stop day came back within two metres and under a second of the same day
  asked whole.
- Its drive times run 5.4 % above OSRM's over ten European legs and 36 % above on one, and
  those times feed the arrival clocks of a day. So a day is answered by one engine or by
  neither, never by both, and a piece that will not answer loses the whole day rather than
  half of it — the schedule chains leg times blindly and would otherwise print a complete,
  plausible, silently wrong timetable.

Because the weighting can fail, the honest surface is the answer rather than the request.
`use_tolls: 0` still returns a tolled road where there is no untolled crossing, so what
the road actually turned out to be is read back per leg, and a day that could not avoid
what it was asked to avoid says so on its own header instead of wearing a label the road
disproves. The switches disable themselves, with a reason, on an instance pointed at its
own OSRM: that operator chose against public hosts, and a second one they never asked for
would undo the choice.

Two things that would have broken quietly and did not:

- The route cache keys on `profile:unit:coords` and is shared with the day planner, the
  studio and the booking geometry. Without the avoidance in the key, flipping a switch
  returns the old road out of cache in under a millisecond — and worse, an avoiding answer
  stored under the plain key hands those other callers a road nobody drives.
- `snapped` is OSRM-only and carries the dashed kerb-to-door spur from #2273. Valhalla
  echoes the coordinates it was given and never says where it bound them, but the ends of
  a leg's line are exactly those points: measured against Füssen, its first vertex matches
  OSRM's snapped location to the digit.

The alternatives bar gets the same engine, which finally makes its "no motorway" and "no
tolls" offers appear on a default install, plus a ferry-free one. `sameRoad` now compares
geometry rather than numbers there, because two engines' distances for the same road sit
kilometres apart and the old 200 m tolerance called that a discovery.

Desktop only, like the whole road trip mode: nothing under client/src/mobile renders it.
2026-09-09 19:03:00 +02:00

581 lines
50 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.
import type { TranslationStrings } from '../types';
const settings: TranslationStrings = {
'settings.title': 'Настройки',
'settings.subtitle': 'Настройте свои персональные параметры',
'settings.tabs.display': 'Основные',
'settings.tabs.map': 'Карта',
'settings.tabs.notifications': 'Уведомления',
'settings.tabs.integrations': 'Интеграции',
'settings.plugins.oauth.connected': 'Подключено',
'settings.plugins.oauth.notConnected': 'Не подключено',
'settings.plugins.oauth.connect': 'Подключить',
'settings.plugins.oauth.disconnect': 'Отключить',
'settings.tabs.plugins': 'Плагины',
'settings.plugins.title': 'Настройки плагинов',
'settings.plugins.subtitle': 'Ваши личные настройки для используемых плагинов (ключи API, предпочтения).',
'settings.plugins.empty': 'Нет активных плагинов.',
'settings.plugins.saved': 'Настройки сохранены',
'settings.plugins.requiredMissing': '«{field}» обязательно',
'settings.tabs.account': 'Аккаунт',
'settings.tabs.offline': 'Офлайн-режим',
'settings.tabs.about': 'О приложении',
'settings.map': 'Карта',
'settings.mapTemplate': 'Шаблон карты',
'settings.mapTemplatePlaceholder.select': 'Выберите шаблон...',
'settings.mapDefaultHint': 'Оставьте пустым для OpenStreetMap (по умолчанию)',
'settings.routingBase': 'Собственный сервер маршрутов',
'settings.routingBaseHint': 'Собственный экземпляр OSRM. Пусто — используются публичные серверы с ограничением около одного запроса в секунду: на день хватает, для автопутешествия мало. Вступает в силу после перезапуска сервера.',
'settings.valhallaBase': 'Свой сервер Valhalla',
'settings.valhallaBaseHint': 'Свой сервер Valhalla. К нему обращаются, когда участок должен обойти платные дороги, автомагистрали или паромы — публичные серверы OSRM на это ответить не могут. Пусто использует публичный Valhalla от FOSSGIS, если выше не указан свой маршрутизатор; тогда второй движок не запрашивается вовсе. Действует после перезапуска сервера.',
'settings.mapHint': 'URL-шаблон для тайлов карты',
'settings.mapProvider': 'Провайдер карты',
'settings.mapProviderHint': 'Применяется к Trip Planner и Journey. Atlas всегда использует Leaflet.',
'settings.mapLeafletSubtitle': 'Классические 2D, любые растровые тайлы',
'settings.mapMapboxSubtitle': 'Векторные тайлы, 3D-здания и рельеф',
'settings.mapMapLibreSubtitle': 'Векторные тайлы OpenFreeMap, без токена',
'settings.mapExperimental': 'Экспериментально',
'settings.mapMapboxToken': 'Токен доступа Mapbox',
'settings.mapMapboxTokenHint': 'Публичный токен (pk.*) с',
'settings.mapMapboxTokenLink': 'mapbox.com → Токены доступа',
'settings.mapCartoKey': 'Ключ API CARTO',
'settings.mapCartoKeyHint':
'Без ключа на базовых картах CARTO появляется водяной знак. Бесплатно и без учётной записи, на',
'settings.mapCartoKeyLink': 'ключ API базовых карт carto.com',
'settings.mapCartoKeyMissing':
'Этот шаблон является базовой картой CARTO. Без ключа CARTO наносит "API KEY REQUIRED" на каждый тайл. Пока ключ не указан, TREK показывает базовую карту по умолчанию.',
'settings.mapStyle': 'Стиль карты',
'settings.mapStylePlaceholder': 'Выберите стиль Mapbox',
'settings.mapStyleHint': 'Preset или собственный URL mapbox://styles/USER/ID',
'settings.mapOpenFreeMapStylePlaceholder': 'Выберите стиль OpenFreeMap',
'settings.mapOpenFreeMapStyleHint': 'Preset или URL стиля OpenFreeMap. Стили OpenFreeMap работают без токена.',
'settings.map3dBuildings': '3D-здания и рельеф',
'settings.map3dHint': 'Наклон + настоящие 3D-здания — работает со всеми стилями, включая спутник.',
'settings.mapHighQuality': 'Режим высокого качества',
'settings.mapHighQualityHint': 'Сглаживание + проекция глобуса для более чётких краёв и реалистичного вида мира.',
'settings.mapHighQualityWarning': 'Может повлиять на производительность на слабых устройствах.',
'settings.mapTipLabel': 'Совет:',
'settings.mapTip':
'Зажмите правую кнопку мыши и перетащите, чтобы повернуть/наклонить карту. Клик средней кнопкой — добавить место (правая кнопка зарезервирована для вращения).',
'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.distance': 'Единица расстояния',
'settings.timeFormat': 'Формат времени',
'settings.blurBookingCodes': 'Скрыть коды бронирования',
'settings.aiAlwaysRetry': 'Always retry booking imports with AI',
'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.',
'settings.optimizeFromAccommodation': 'Оптимизировать маршрут от места проживания',
'settings.optimizeFromAccommodationHint':
'При оптимизации дня маршрут начинается от отеля, в котором вы просыпаетесь, и заканчивается у того, в который вы заселяетесь вечером.',
'settings.notifications': 'Уведомления',
'settings.notifyTripInvite': 'Приглашения в поездку',
'settings.notifyBookingChange': 'Изменения бронирований',
'settings.notifyTripReminder': 'Напоминания о поездке',
'settings.notifyTodoDue': 'Задача к сроку',
'settings.notifyVacayInvite': 'Приглашения слияния Vacay',
'settings.notifyVacayShare': 'Общий доступ к календарю Vacay',
'settings.notifyCollectionInvite': 'Приглашения в коллекции',
'settings.notifySynologySessionCleared': 'Сессия Synology сброшена',
'settings.notifyPluginNotification': 'Уведомления плагинов',
'settings.notifyPhotosShared': 'Общие фото (Immich)',
'settings.notifyCollabMessage': 'Сообщения чата (Collab)',
'settings.notifyPackingTagged': 'Список вещей: назначения',
'settings.notifyWebhook': 'Webhook-уведомления',
'settings.notificationsDisabled':
'Уведомления не настроены. Попросите администратора включить уведомления по электронной почте или webhook.',
'settings.notificationsActive': 'Активный канал',
'settings.notificationsManagedByAdmin': 'События уведомлений настраиваются администратором.',
'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, локальный HTTP или собственная схема приложения (myapp://). Требуется точное совпадение, кроме порта локального URI.',
'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.oauth.modal.machineClient': 'Машинный клиент (без входа через браузер)',
'settings.oauth.modal.machineClientHint':
'Использует грант client_credentials — URI перенаправления не требуются. Токен выдаётся напрямую через client_id + client_secret и действует от вашего имени в пределах выбранных областей.',
'settings.oauth.modal.machineClientUsage':
'Получить токен: POST /oauth/token с grant_type=client_credentials, client_id и client_secret. Без браузера, без токена обновления.',
'settings.oauth.badge.machine': 'машинный',
'settings.account': 'Аккаунт',
'settings.about': 'О приложении',
'settings.about.reportBug': 'Сообщить об ошибке',
'settings.about.reportBugHint': 'Нашли проблему? Сообщите нам',
'settings.about.featureRequest': 'Предложить функцию',
'settings.about.featureRequestHint': 'Предложите новую функцию',
'settings.about.wikiHint': 'Документация и руководства',
'settings.about.descriptionManaged':
'TREK helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place.',
'settings.about.sourceTitle': 'Source code',
'settings.about.sourceHint': 'TREK is open source, licensed AGPL-3.0',
'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': 'Ошибка загрузки',
'settings.avatarRemoveError': 'Ошибка удаления',
'settings.bookingLabels': 'Подписи маршрутов бронирований',
'settings.bookingLabelsHint':
'Отображает названия станций / аэропортов на карте. Если выключено, показывается только значок.',
'settings.notifyVersionAvailable': 'Доступна новая версия',
'settings.notifyReplicaFailure': 'Сбой реплики хранилища',
'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.notConfigured': 'Ещё не настроено — настройте в параметрах плагина',
'settings.plugins.actions': 'Действия',
'settings.plugins.actions.confirm': 'Выполнить это действие?',
'settings.notificationPreferences.sendTest': 'Отправить тест',
'settings.notificationPreferences.configure': 'Настроить',
'settings.notificationPreferences.testSuccess': 'Тестовое уведомление отправлено.',
'settings.notificationPreferences.testFailed': 'Тест не удался.',
'settings.notificationPreferences.pluginConfigured': 'Настроено. Учётные данные — на странице настроек плагина.',
'settings.notificationPreferences.webhook': 'Webhook',
'settings.notificationPreferences.email': 'Email',
'settings.notificationPreferences.ntfy': 'Ntfy',
'settings.currency': 'Валюта отображения',
'settings.currencyHint':
'Суммы в разделе «Расходы» отображаются в этой валюте только для просмотра — исходные суммы не изменяются.',
'settings.currencyTrip': 'Валюта поездки',
'settings.passkey.title': 'Passkeys',
'settings.passkey.description':
'Входите быстрее и с защитой от фишинга с помощью passkey — отпечатка пальца, лица, PIN-кода или аппаратного ключа. Ваш пароль остаётся как резервный способ.',
'settings.passkey.notConfigured':
'Passkeys включены, но ещё не полностью настроены на этом сервере. Попросите администратора задать домен WebAuthn.',
'settings.passkey.add': 'Добавить passkey',
'settings.passkey.addTitle': 'Добавить passkey',
'settings.passkey.passwordPrompt': 'Подтвердите текущий пароль, затем следуйте подсказке на устройстве.',
'settings.passkey.passwordRequired': 'Требуется ваш текущий пароль.',
'settings.passkey.namePlaceholder': 'Название (необязательно, напр. "iPhone")',
'settings.passkey.addedToast': 'Passkey добавлен',
'settings.passkey.added': 'Добавлен',
'settings.passkey.addError': 'Не удалось добавить passkey',
'settings.passkey.cancelled': 'Настройка passkey отменена',
'settings.passkey.deleted': 'Passkey удалён',
'settings.passkey.deleteConfirm': 'Удалить этот passkey? Подтвердите паролем.',
'settings.passkey.rename': 'Переименовать',
'settings.passkey.defaultName': 'Passkey',
'settings.passkey.synced': 'Синхронизирован',
'settings.passkey.deviceBound': 'Это устройство',
'settings.passkey.lastUsed': 'Последнее использование',
'settings.passkey.neverUsed': 'Не использовался',
'settings.mapPoiPill': 'Поиск мест на карте',
'settings.mapPoiPillHint':
'Показывать на карте поездки кнопку категорий, чтобы находить рядом рестораны, отели и другие места из OpenStreetMap.',
'settings.airtrail.title': 'AirTrail',
'settings.airtrail.hint':
'Подключите свой self-hosted AirTrail для импорта и синхронизации рейсов. Создайте ключ API в AirTrail в разделе «Настройки → Безопасность».',
'settings.airtrail.url': 'URL экземпляра',
'settings.airtrail.apiKey': 'Ключ API',
'settings.airtrail.apiKeyPlaceholder': 'Bearer-ключ API',
'settings.airtrail.apiKeyHint':
'Создаётся в AirTrail в разделе «Настройки → Безопасность». Хранится в зашифрованном виде.',
'settings.airtrail.allowInsecureTls': 'Разрешить самоподписанные сертификаты',
'settings.airtrail.allowInsecureTlsHint': 'Включайте только для доверенного экземпляра в вашей собственной сети.',
'settings.airtrail.writeBack': 'Записывать изменения обратно в AirTrail',
'settings.airtrail.writeBackHint':
'По умолчанию выключено: AirTrail является источником истины, а TREK только читает из него. Включите, чтобы отправлять изменения, сделанные в TREK, обратно в AirTrail.',
'settings.airtrail.connected': 'Подключено',
'settings.airtrail.notConnected': 'Не подключено',
'settings.airtrail.toast.saved': 'Подключение к AirTrail сохранено',
'settings.airtrail.toast.saveError': 'Не удалось сохранить подключение',
'settings.airtrail.test.button': 'Проверить подключение',
'settings.airtrail.test.success': 'Подключено — найдено рейсов: {count}',
'settings.airtrail.test.failed': 'Не удалось подключиться',
'settings.aiParsing.title': 'Распознавание с помощью ИИ',
'settings.aiParsing.hint':
'Выберите модель ИИ для извлечения бронирований из загруженных файлов. Это работает только в том случае, если администратор не настроил модель для всего экземпляра.',
'settings.aiParsing.provider': 'Провайдер',
'settings.aiParsing.providerLocal': 'Локально (Ollama)',
'settings.aiParsing.providerOpenai': 'OpenAI',
'settings.aiParsing.providerAnthropic': 'Anthropic',
'settings.aiParsing.localAdminOnly':
'Локальная конечная точка (Ollama) настраивается один раз для всего экземпляра в настройках администратора. Свой ключ OpenAI или Anthropic вы по-прежнему можете использовать здесь.',
'settings.aiParsing.model': 'Модель',
'settings.aiParsing.baseUrl': 'Базовый URL',
'settings.aiParsing.baseUrlHint':
'Где работает модель — локальный сервер Ollama или конечная точка, совместимая с OpenAI.',
'settings.aiParsing.apiKey': 'Ключ API',
'settings.aiParsing.apiKeyHint': 'Хранится в зашифрованном виде. Оставьте поле пустым, чтобы сохранить текущий ключ.',
'settings.aiParsing.multimodal': 'Отправлять документы как изображения',
'settings.aiParsing.multimodalHint':
'Для моделей с поддержкой изображений — отправляет исходный PDF вместо извлечённого текста.',
'settings.aiParsing.toast.saved': 'Настройки ИИ сохранены',
'settings.aiParsing.toast.saveError': 'Не удалось сохранить настройки ИИ',
'settings.tabs.appearance': 'Внешний вид',
'settings.appearance.theme': 'Тема',
'settings.appearance.scheme': 'Основной цвет',
'settings.appearance.scheme.default': 'По умолчанию',
'settings.appearance.scheme.highContrast': 'Высокий контраст',
'settings.appearance.scheme.indigo': 'Индиго',
'settings.appearance.scheme.teal': 'Бирюзовый',
'settings.appearance.scheme.rose': 'Розовый',
'settings.appearance.scheme.amber': 'Янтарный',
'settings.appearance.scheme.violet': 'Фиолетовый',
'settings.appearance.scheme.custom': 'Свой цвет',
'settings.appearance.customAccent': 'Акцентный цвет',
'settings.appearance.contrastOk': 'Хороший контраст',
'settings.appearance.contrastLow': 'Низкий контраст',
'settings.appearance.readability': 'Читаемость',
'settings.appearance.transparency': 'Прозрачность',
'settings.appearance.transparencyHint':
'"Стеклянные" полупрозрачные поверхности. Отключите для более контрастного непрозрачного фона.',
'settings.appearance.reduceMotion': 'Меньше движения',
'settings.appearance.reduceMotionHint': 'Уменьшить количество анимаций и переходов.',
'settings.appearance.density': 'Плотность',
'settings.appearance.comfortable': 'Комфортная',
'settings.appearance.compact': 'Компактная',
'settings.appearance.textSize': 'Размер текста',
'settings.appearance.advancedTextSizes': 'Дополнительный размер текста',
'settings.appearance.hideAdvanced': 'Скрыть дополнительное',
'settings.appearance.tier.title': 'Заголовки',
'settings.appearance.tier.subtitle': 'Подзаголовки',
'settings.appearance.tier.body': 'Основной текст',
'settings.appearance.tier.caption': 'Подписи',
'settings.appearance.dashboardWidgets': 'Элементы главной страницы',
'settings.appearance.dashboardWidgetsHint':
'Скрыть или показать элементы главной страницы в полной и мобильной версии.',
'settings.appearance.desktop': 'Полная версия',
'settings.appearance.mobile': 'Мобильная версия',
'settings.appearance.widget.sidebar': 'Правая панель',
'settings.appearance.widget.currency': 'Валюта',
'settings.appearance.widget.collections': 'Коллекции',
'settings.appearance.widget.timezones': 'Часовые пояса',
'settings.appearance.widget.upcomingReservations': 'Ближайшие брони',
'settings.appearance.widget.atlas': 'Атлас / страны',
'settings.appearance.widget.tripsTotal': 'Всего поездок',
'settings.appearance.widget.daysTraveled': 'Дней в пути',
'settings.appearance.widget.distanceFlown': 'Пройдено по воздуху',
'settings.appearance.reset': 'Сбросить',
'settings.appearance.group.belowHero': 'Под главной карточкой',
'settings.appearance.group.bottomOfPage': 'Внизу страницы',
'settings.appearance.sidebarHint': 'Вся боковая колонка. Отключите, чтобы центрировать главную страницу.',
'settings.appearance.densityHint':
'Компактная плотность отображает элементы ближе друг к другу, чтобы вместить больше информации на экран.',
'settings.appearance.textSizeAll': 'Весь текст',
'settings.appearance.perSize': 'Изменить размер отдельных элементов текста',
'settings.appearance.size.large': 'Большой',
'settings.appearance.size.medium': 'Средний',
'settings.appearance.size.normal': 'Нормальный',
'settings.appearance.size.small': 'Маленький',
'settings.appearance.preview.large': 'Большие заголовки',
'settings.appearance.preview.medium': 'Средние подзаголовки',
'settings.appearance.preview.normal': 'Основной текст',
'settings.appearance.preview.small': 'Маленькие подписи / адреса',
'settings.appearance.example.large': 'Заголовки, крупные числа',
'settings.appearance.example.medium': 'Подзаголовки',
'settings.appearance.example.normal': 'Названия мест, описания',
'settings.appearance.example.small': 'Адреса, подписи',
'settings.appearance.experimental': 'Экспериментальные настройки',
'settings.appearance.mobileNav': 'Нижняя панель навигации',
'settings.appearance.mobileNav.hint':
'Выберите, какие элементы отображаются на панели, а какие — в меню «Ещё». Дашборд всегда остаётся первым.',
'settings.appearance.mobileNav.inBar': 'На панели',
'settings.appearance.mobileNav.underMore': 'В меню «Ещё»',
'settings.appearance.mobileNav.moreEmpty': 'Здесь пока пусто — всё умещается на панели.',
'settings.appearance.mobileNav.pinned': 'Закреплено',
'settings.appearance.mobileNav.toMore': 'Переместить в меню «Ещё»',
'settings.appearance.mobileNav.toBar': 'Переместить на панель',
'settings.appearance.dashOrder': 'Порядок панели',
'settings.appearance.dashOrder.hint':
'Измените порядок, в котором список поездок и виджеты располагаются на панели телефона. Избранная поездка всегда остаётся сверху.',
'settings.appearance.dashOrder.trips': 'Поездки',
'settings.appearance.dashOrder.hidden': 'Скрыто',
'settings.general.languageRegion': 'Язык и регион',
'settings.general.travelMap': 'Карта и путешествия',
'settings.general.startup': 'Запуск',
'settings.startPage': 'Стартовая страница',
'settings.startPageDashboard': 'Панель управления',
'settings.startPageActiveTrip': 'Активная поездка',
'settings.startPageHint':
'TREK сразу открывает поездку, которая идёт сейчас, иначе ближайшую предстоящую. Это та же поездка, которую выделяет панель управления.',
'settings.startTripTab': 'Стартовая вкладка',
'settings.startTripTabHint':
'Вкладка, с которой открывается поездка. Если она относится к отключённому дополнению, откроется план.',
// ── Offline (#1135)
'settings.offline.cache.title': 'Офлайн-кэш',
'settings.offline.mode.title': 'Офлайн-режим',
'settings.offline.mode.force': 'Принудительный офлайн-режим',
'settings.offline.mode.forceHint':
'Работайте только с кэшированными данными, а ваши изменения ставятся в очередь. Выключите, чтобы снова подключиться и синхронизировать.',
'settings.offline.mode.active':
'Офлайн-режим включён — ваши изменения поставлены в очередь и синхронизируются, когда вы его выключите.',
'settings.offline.prepare.title': 'Подготовка к работе офлайн',
'settings.offline.prepare.hint':
'Скачайте всё необходимое — данные поездок, документы и тайлы карты — до того, как потеряете соединение.',
'settings.offline.prepare.button': 'Скачать для работы офлайн',
'settings.offline.prepare.running': 'Скачивание…',
'settings.offline.prepare.done': 'Готово к работе офлайн',
'settings.offline.prepare.phase.trips': 'Данные поездок',
'settings.offline.prepare.phase.files': 'Документы',
'settings.offline.prepare.phase.tiles': 'Тайлы карты',
'settings.offline.resync': 'Синхронизировать сейчас',
'settings.offline.resyncing': 'Синхронизация…',
'settings.offline.storage.title': 'Что хранить офлайн',
'settings.offline.storage.tiles': 'Хранить тайлы карты офлайн',
'settings.offline.storage.tilesHint':
'Тайлы карты занимают больше всего места. Выключите, чтобы хранить офлайн только данные поездок и документы.',
'settings.offline.storage.tripsTitle': 'Поездки',
'settings.offline.storage.tripOn': 'Хранится офлайн',
'settings.offline.storage.tripOff': 'Не хранится',
'settings.offline.storage.tripFinished': 'Завершена. Сохраняется, только если вы её включите.',
'settings.offline.notice.stored': 'На этом устройстве сохранено поездок: {count}',
'settings.offline.notice.nothing': 'Сохранять нечего. Включите поездки, которые хотите оставить.',
'settings.offline.notice.busy': 'Синхронизация уже идёт. Повторите попытку через мгновение.',
'settings.offline.notice.offline': 'Нет соединения. Подключитесь, чтобы сохранить поездки офлайн.',
'settings.offline.notice.signedOut': 'Сеанс завершён. Войдите снова, чтобы синхронизировать.',
'settings.offline.notice.failed': 'Загрузку не удалось завершить. Проверьте соединение и повторите попытку.',
'settings.offline.notice.loadFailed': 'Не удалось прочитать офлайн-хранилище этого устройства. Обычно помогает очистка кэша.',
'settings.offline.clear': 'Очистить кэш',
'settings.offline.clearConfirm':
'Очистить все офлайн-данные поездок? Вы сможете синхронизировать их снова в любой момент при наличии подключения.',
'settings.offline.stats.trips': 'Кэшированные поездки',
'settings.offline.stats.pending': 'Изменения в очереди',
'settings.offline.stats.failed': 'Неудавшиеся изменения',
'settings.offline.stats.conflicts': 'Конфликты',
'settings.offline.empty': 'Поездки ещё не кэшированы. Подключитесь к интернету для синхронизации.',
'settings.offline.loading': 'Загрузка…',
'settings.offline.conflicts.title': 'Конфликты синхронизации',
'settings.offline.conflicts.hint':
'Изменения, сделанные вами офлайн, конфликтуют с более новыми изменениями на сервере. Выберите, какую версию сохранить.',
'settings.offline.conflicts.keepMine': 'Оставить мою',
'settings.offline.conflicts.keepServer': 'Оставить серверную',
'settings.offline.conflicts.mine': 'Ваша версия',
'settings.offline.conflicts.server': 'Версия с сервера',
'settings.offline.conflicts.item': 'Изменение “{name}”',
'settings.offline.conflicts.strategyTitle': 'При возникновении конфликта',
'settings.offline.conflicts.strategy.ask': 'Спрашивать меня каждый раз',
'settings.offline.conflicts.strategy.mine': 'Всегда сохранять мою версию',
'settings.offline.conflicts.strategy.server': 'Всегда сохранять версию с сервера',
'settings.offline.banner.offline': 'Офлайн',
'settings.offline.banner.forced': 'Офлайн-режим',
'settings.offline.banner.queued': 'Офлайн · {count} в очереди',
'settings.offline.banner.syncing': 'Синхронизация {count}…',
'settings.offline.banner.failed': 'Не удалось синхронизировать: {count}',
'settings.offline.banner.conflicts': 'Конфликты: {count}',
'settings.pluginActivity.title': 'Активность плагинов',
'settings.pluginActivity.description': 'Все действия, которые плагин выполнил от вашего имени, сначала новые.',
'settings.pluginActivity.empty': 'Активности плагинов пока нет.',
'settings.pluginActivity.refresh': 'Обновить',
'settings.pluginActivity.columns.plugin': 'Плагин',
'settings.pluginActivity.columns.action': 'Действие',
'settings.pluginActivity.columns.resource': 'Ресурс',
'settings.pluginActivity.columns.when': 'Когда',
'settings.pluginActivity.columns.status': 'Результат',
'settings.alwaysShowRoutes': 'Всегда показывать маршруты бронирований',
'settings.alwaysShowRoutesHint':
'Автоматически показывает на карте маршрут для каждого рейса, поезда и другого бронирования — без необходимости включать это отдельно для каждого элемента.',
// Public API keys (Settings -> Integrations)
'settings.apiKeys.title': 'Ключи API',
'settings.apiKeys.description': 'Ключи для публичного API, чтобы другие программы могли читать ваши поездки. Только чтение: ключ ничего не изменит и не удалит.',
'settings.apiKeys.create': 'Создать ключ',
'settings.apiKeys.empty': 'Ключей пока нет. Создайте один, чтобы подключить другую программу.',
'settings.apiKeys.createdAt': 'создан',
'settings.apiKeys.usedAt': 'последнее использование',
'settings.apiKeys.deleteTitle': 'Удалить ключ',
'settings.apiKeys.deleteMessage': 'Всё, что использует этот ключ, сразу перестанет работать. Отменить нельзя.',
'settings.apiKeys.deleted': 'Ключ удалён',
'settings.apiKeys.deleteFailed': 'Не удалось удалить ключ',
'settings.apiKeys.createFailed': 'Не удалось создать ключ',
'settings.apiKeys.copy': 'Копировать',
'settings.apiKeys.docsHint': 'Отправляйте ключ как "Authorization: Bearer ..." или "X-API-Key: ..." на /api/v1.',
'settings.apiKeys.modal.createTitle': 'Создать ключ API',
'settings.apiKeys.modal.name': 'Название',
'settings.apiKeys.modal.namePlaceholder': 'например, Dawarich',
'settings.apiKeys.modal.nameHint': 'Только для вас, чтобы позже узнать ключ.',
'settings.apiKeys.modal.creating': 'Создание...',
'settings.apiKeys.modal.create': 'Создать',
'settings.apiKeys.modal.createdTitle': 'Ключ API создан',
'settings.apiKeys.modal.createdWarning': 'Скопируйте ключ сейчас. Он показывается один раз, позже получить его нельзя.',
'settings.apiKeys.modal.done': 'Готово',
};
export default settings;