/** * ru — translation drift fragment. * * The keys added to `en` after the original batch pass. Kept in their own * module so this pass never touches the batch files. Composed into `ru` in * `index.ts` via a deep merge (a shallow spread would clobber the sibling * keys already present in the batches, e.g. `socialUi`, `walletUi`). */ const drift = { nav: { searchLanguages: "Поиск языков...", noLanguages: "Языки не найдены", }, mapPage: { searchSuggestPlaces: "Места", }, mapUi: { firstRunTitle: "Начните", firstRunTip: "Нажмите на любую метку, чтобы осмотреться. Ничего настраивать не нужно — ближайшие Spot в одном касании.", firstRunAddSpot: "Добавьте первый Spot", firstRunJoinCrew: "Присоединиться к Crew", firstRunStartCrew: "Создать свой Crew", firstRunWallet: "Настройте кошелёк", forecastDays: "Прогноз на {{count}} дней", }, spotUi: { forecastDays: "Прогноз на {{count}} дней", }, marketUi: { trades: { stateRevoked: "отозвано", stateVerifying: "проверка", }, loadFailed: "Не удалось связаться с релеями. Проверьте соединение и попробуйте снова.", statusPending: "в ожидании", offers: { closeDeal: "Закрыть сделку", loadFailed: "Не удалось загрузить предложения. Проверьте соединение и попробуйте снова.", }, pay: { nonSats: "Это предложение оценено в {{currency}}. Оплата в приложении только в sats. Расплатитесь напрямую с продавцом.", unsupported: "Этот платёжный код (запрос Cashu) пока не поддерживается. Попросите у продавца Lightning-счёт или адрес.", }, escrowRequest: { lockedNotSent: "Средства заблокированы в escrow и сохранены на этом устройстве, но запрос не отправился. Откройте объявление снова, чтобы повторить. Не платите ещё раз.", mintLabel: "Mint (где заблокированы средства)", sellerMintHint: "Продавец предпочитает этот mint; средства, заблокированные здесь, ему проще всего получить.", mintHint: "Escrow хранится в этом mint. Продавец погашает здесь, так что выберите тот, которому доверяете оба.", noMints: "Нет доступных mint", p2pkUnsupported: "Этот mint не заявляет поддержку P2PK (NUT-11), поэтому escrow здесь нельзя заблокировать. Выберите другой mint.", }, }, labUi: { offerClothing: "Предложить одежду", tabClothing: "Одежда", empty: { clothingTitle: "Дизайнеров одежды пока нет", clothingBody: "Станьте первым, кто предложит кастомную одежду, командные комплекты и экипировку для сцены.", }, craftFields: { sizing: "Диапазон размеров", samples: "Образцы / прототипы", customization: "Кастомизация", }, }, socialUi: { coordinator: { ourDefaultTitle: "Координатор SkateSpots", ourDefaultDesc: "SkateSpots запускает координатор на relay.skate-spots.org. Используйте его по умолчанию или запустите свой — координатор видит только шифротекст и метаданные, никогда ваши сообщения.", useOurs: "Использовать координатор SkateSpots", }, crewCoordinator: { encryptedChat: "Зашифрованный чат", privateChatName: "Приватный чат", privateChatDesc: "Групповой чат с прямой секретностью (MLS) через координатор.", privateChatDescFull: "Приватный чат создаётся один раз администратором, затем участники присоединяются.", chatRowDesc: "Все в Crew — запечатано ключом каждого участника (NIP-17).", openChat: "Открыть", setUpChat: "Настроить", joinChat: "Присоединиться", checking: "Проверка…", openInAnotherApp: "Открыть в другом приложении", openInCordnWeb: "Cordn (веб)", openCordnGroup: "Открыть чат Crew", copyForStaircase: "Копировать для Staircase", }, dms: { refresh: "Обновить", crews: "Crew", crewFounder: "Основатель", crewMember: "Участник", crewOpen: "Открыть", crewSetUp: "Настроить", }, form: { cordnGroup: "Группа Cordn", cordnGroupHint: "Необязательно: вставьте ссылку на группу из Staircase или Cordn (веб). Тогда ваш Crew получит настоящий сквозной MLS-чат на нашем координаторе.", }, bell: { dmsUnread: "{{count}} новых зашифрованных сообщений", messagesAndCrews: "Сообщения и чаты crew", }, }, settingsUi: { loginDialog: { welcomeSubtitleBrowse: "Зарегистрируйтесь или войдите — или продолжайте просмотр.", extensionCard: "Расширение браузера", signerCard: "Приложение-подписант", secretKeyLink: "Использовать секретный ключ", whereBunker: "Где взять бункер?", }, settingsPage: { trust: "Доверие", trustSub: "Источники и отображение", }, }, walletUi: { trust: { mute: "Заглушить", muted: "Заглушено", mutedDesc: "Вы не будете видеть их контент.", unmute: "Снять заглушение", unmuted: "Заглушение снято", unmutedDesc: "Их контент снова будет виден.", unmuteFailed: "Не удалось снять заглушение. Попробуйте снова.", muteFailed: "Не удалось заглушить. Попробуйте снова.", loginToMute: "Войдите, чтобы заглушить.", attributedNetwork: "От людей из вашей сети", attributedProviderHouse: "От общественного провайдера доверия", attributedProviderCustom: "От выбранного вами провайдера", howItWorks: "Как работает доверие", flaggedNoticeTitle: "Сообщено доверенными скейтерами", flaggedNoticeDesc: "Будьте осторожны. Доверенные люди в сети сообщили об этом аккаунте.", flaggedReporterFollow: "{{count}} из ваших подписок", flaggedReporterNetwork: "{{count}} из вашей сети", flaggedReporterOther: "{{count}} других аккаунтов", flaggedReport: "Пожаловаться", flaggedDismiss: "Скрыть", bucketVerified: "Подтверждён", bucketUnknown: "Неизвестен", bucketFlagged: "Отмечен", bucketVerifiedDesc: "Кто-то из вашей сети поручился за этот аккаунт.", bucketUnknownDesc: "Пока никто из вашей сети не поручился за этот аккаунт.", bucketFlaggedDesc: "Доверенные люди сообщили об этом аккаунте.", reportedByTrusted: "Сообщено {{count}} доверенными людьми", }, }, trustUi: { alertsTitle: "Сетевые оповещения", alertsDesc: "Аккаунты, на которые вы подписаны, о которых сообщили или которых заглушили доверенные люди.", alertsEmpty: "Нет оповещений. Мы проверяем аккаунты, на которые вы подписаны, на сообщения от доверенных людей.", alertsReported: "Сообщено {{count}} доверенными людьми", alertsMuted: "Заглушено {{count}} доверенными людьми", alertsIgnore: "Игнорировать", alertsUnfollow: "Отписаться", alertsLogin: "Войдите, чтобы видеть оповещения по аккаунтам, на которые вы подписаны.", providerTitle: "Провайдер", providerDesc: "Оценки приходят от выбранного вами провайдера. Общественный провайдер используется по умолчанию.", useCommunity: "Использовать общественный провайдер", setProvider: "Указать провайдера", customPubkeyPlaceholder: "npub или hex-публичный ключ провайдера", customRelayPlaceholder: "wss://relay.example.com", invalidProvider: "Введите корректный npub или 64-символьный hex-публичный ключ и релей wss://.", publishFailed: "Не удалось опубликовать провайдера. Попробуйте снова.", providerSaved: "Провайдер обновлён.", loggedOutProvider: "Войдите, чтобы выбрать провайдера.", showMarks: "Показывать метки доверия", showMarksDesc: "Подтверждённые и неизвестные метки. Сообщения показываются всегда.", sourceLabel: "Источник", sourceHouse: "Общественный провайдер доверия", sourceCustom: "Ваш провайдер", loggedOut: "Войдите, чтобы выбрать своего провайдера доверия.", seoTitle: "Как работает доверие", seoDescription: "Как SkateSpots показывает доверие: три состояния, откуда берутся оценки и почему отсутствие метки — не недоверие.", title: "Как работает доверие", intro: "Доверие здесь — сигнал, а не приговор. Оно исходит от тех, кого вы знаете, или от выбранного вами провайдера. Мы не составляем глобальный рейтинг людей.", statesTitle: "Три состояния", verifiedTitle: "Подтверждён", verifiedDesc: "Кто-то из вашей сети поручился за этот аккаунт: друг друга или выбранный вами провайдер.", unknownTitle: "Неизвестен", unknownDesc: "Пока никто не поручился. С этого начинается каждый новый аккаунт.", flaggedTitle: "Отмечен", flaggedDesc: "Доверенные люди сообщили об этом аккаунте. Это предупреждение присмотреться, а не доказательство чего-либо.", absenceTitle: "Отсутствие метки — не недоверие", absenceDesc: "У большинства аккаунтов нет никаких меток. Это значит, что никто из вашей сети пока не поручился за них, а не то, что что-то не так. Никогда не воспринимайте отсутствие метки как минус.", sourceTitle: "Кто это вычисляет", sourceDesc: "По умолчанию мы используем вашу собственную сеть. Вы также можете выбрать провайдера доверия, который публикует подписанные оценки через Nostr (NIP-85), или отключить отображение. Отмеченное показывается всегда, потому что это сигнал безопасности.", endorsementTitle: "Присутствие — не одобрение", endorsementDesc: "Подтверждённая метка означает, что кто-то поручился, а не что человек хороший. Метка «отмечен» означает, что доверенные люди сообщили о нём, а не что он виновен. Проверьте детали, прежде чем решать.", povTitle: "Всё зависит от точки зрения", povDesc: "Оценка относительна тому, кто смотрит. Рейтинг от одного провайдера или человека несравним с другим, и мы никогда не подаём его как объективный факт.", settingsCta: "Управлять в настройках", }, marketTerms: { link: "Правила маркетплейса", seoTitle: "Правила маркетплейса", seoDescription: "Как работают объявления снаряжения на SkateSpots: напрямую между людьми, покупатель будь внимателен, и правила.", title: "Правила маркетплейса", intro: "SkateSpots — доска объявлений о снаряжении напрямую между людьми. Вы имеете дело напрямую с другим человеком: мы не держим средства, не отправляем товары и не решаем споры.", howTitle: "Как это работает", howBody: "Выставьте снаряжение, свяжитесь с продавцом в личном сообщении и расплатитесь напрямую (наличные, Lightning или обмен). Корзины и оформления заказа нет.", rulesTitle: "Что запрещено", rulesBody: "Никакого незаконного, опасного или взрослого контента; никаких наркотиков, оружия, поддельных или краденых товаров. Объявления должны касаться скейт-снаряжения и связанных с ним вещей.", respectTitle: "Уважайте других", respectBody: "Никаких оскорблений, преследования, угроз или ненависти. Модераторы могут скрывать объявления или аккаунты.", trustTitle: "Доверие — ориентир, а не гарантия", trustBody: "Метки подтверждения и торговая репутация — это сигналы из сети, а не обещания. Проверяйте сами, прежде чем совершать сделку.", trustLink: "Как работает доверие", privacyLink: "Что покидает ваше устройство", safetyTitle: "Торгуйте безопасно", safetyBody: "Встречайтесь в общественных местах для передачи, используйте escrow или добросовестный задаток для отправляемых сделок и никогда не отправляйте деньги вне приложения.", moderationTitle: "Модерация мягкая и обратимая", moderationBody: "Скрытый контент остаётся на релеях и может быть восстановлен; споры между людьми — ваша забота.", }, labOptions: { clothing: { service: { tees: "Футболки", hoodies: "Худи и свитшоты", pants: "Штаны и шорты", jackets: "Куртки и верхняя одежда", kits: "Командные комплекты и джерси", caps: "Кепки и шапки", socks: "Носки", accessories: "Сумки и аксессуары", footwear: "Обувь", patches: "Патчи и аппликации", griptape: "Гриптейп и одежда для дек", onepiece: "Единичные экземпляры / апсайклинг", }, serviceDesc: { tees: "Кастомные футболки и топы", hoodies: "Худи, свитшоты и спортивные штаны", pants: "Рабочие штаны, карго и шорты", jackets: "Куртки-коучевки, ветровки и рабочие куртки", kits: "Командные комплекты, джерси и форма", caps: "Кепки, шапки и головные уборы", socks: "Высокие носки и трикотаж", accessories: "Сумки, ремни и мелочи", footwear: "Кастомная обувь", patches: "Вышитые патчи и аппликации", griptape: "Арт на гриптейпе и одежда для дек", onepiece: "Единичные вещи и апсайкл-одежда", }, method: { screenprint: "Шелкография", dtg: "DTG / прямая печать по ткани", embroidery: "Вышивка", cutsew: "Крой и шитьё", sublimation: "Сублимация", heattransfer: "Термотрансфер / винил", garmentdye: "Крашение изделий", knit: "Трикотаж", patchwork: "Пэчворк", allover: "Печать по всей поверхности", }, material: { cotton: "Хлопок", heavyweight: "Плотная ткань", organic: "Органика / устойчивость", fleece: "Флис", denim: "Деним", canvas: "Канвас", nylon: "Нейлон / технические ткани", wool: "Меринос / шерсть", leather: "Кожа", recycled: "Переработанное / сток", }, }, }, becomeRolesUi: { clothing: { seoTitle: "Стать дизайнером одежды - SkateSpots", seoDescription: "Кастомная одежда, командные комплекты и экипировка для сцены.", heading: "Дизайнер одежды", tagline: "Кастомная одежда, командные комплекты и экипировка для сцены", noun: "дизайнер одежды", rateLabel: "Ставка", portfolioLabel: "Ссылка на магазин / портфолио", sectionWhatYouMake: "Что вы создаёте", sectionHowYouMake: "Как вы это делаете", sectionMaterials: "Материалы", minimumPlaceholder: "напр. 10 штук", turnaroundPlaceholder: "напр. 2–3 недели", sizingPlaceholder: "напр. XS–3XL / по меркам", samplesHelper: "Предлагаете ли вы образцы или прототипы перед полным тиражом?", customizationPlaceholder: "напр. имена, номера, графика", }, }, weatherUi: { updated: "Обновлено", refresh: "Обновить", unavailable: "Погода недоступна.", retry: "Повторить", sunrise: "Восход", sunset: "Закат", legendTitle: "Оценка погоды", legendWeatherOnly: "Только погода", }, cordnUi: { shareInvite: 'Пригласить', shareInviteText: 'Присоединяйся к {{crew}} — приватный чат команды', inviteCopied: 'Ссылка-приглашение скопирована', title: "Приватный чат", subtitle: "Сквозное шифрование (MLS) между участниками Crew. Координатор маршрутизирует только шифротекст и метаданные — он никогда не видит содержимое сообщений.", notLoggedIn: "Войдите, чтобы использовать приватный чат Crew.", membersOnly: "Только участники Crew могут открыть приватный чат.", connecting: "Подключение…", noCoordinator: "Для этого Crew пока не настроен координатор.", noGroupAdmin: "Приватный чат этого Crew ещё не создан.", noGroupMember: "Вы ещё не в приватном чате этого Crew.", create: "Создать приватный чат", requestJoin: "Попросить присоединиться", requestAgain: "Request again", requestHandled: "Request handled", copyCordnLink: "Copy Cordn link", cordnWebCaveat: "Cordn web may stall after sign-in; the in-app join is more reliable.", checkInvite: "Проверить приглашение", requested: "Запрос отправлен — администратор Crew одобрит его.", noInvite: "Приглашение пока не ждёт. Попросите администратора одобрить ваш запрос.", placeholder: "Сообщение для Crew…", send: "Отправить", refresh: "Обновить", requests: "Запросы на присоединение", checkRequests: "Проверить запросы", approve: "Добавить", approveTitle: "Одобрить это устройство?", approveDesc: "Добавить {{name}} в эту зашифрованную комнату? Это устройство сможет читать новые сообщения.", noRequests: "Нет ожидающих запросов на присоединение.", inviteHint: "Пока в этом чате только вы — участники Crew могут нажать «Попросить присоединиться», а вы одобрите их здесь.", memberCount: "{{count}} в группе", you: "Вы", groupRef: "Ссылка на группу", copyRef: "Копировать", copied: "Скопировано", attachImage: "Прикрепить изображение", uploading: "Загрузка…", uploadFailed: "Не удалось загрузить изображение.", bannerTitle: "У этого Crew ещё нет приватного чата", bannerBody: "Настройте сквозной зашифрованный (MLS) чат для вашего Crew — участники присоединяются со вкладки.", bannerCta: "Настроить", ready: "Подключено · MLS", errorPrefix: "Не удалось связаться с координатором", interactiveHint: "Ваш подписант запрашивает подтверждение для каждого действия — используйте «Обновить» и «Отправить» по необходимости.", setupDevice: "Настроить это устройство", setupDeviceBody: "Устройство получит собственный ключ для приватного чата. Основатель одобрит его один раз.", waitingApproval: "Ожидание одобрения основателя…", waitingApprovalManual: "Ожидание основателя. После одобрения нажмите «Проверить приглашение».", onboardingFounder1: "Запустите приватный чат.", onboardingFounder2: "Одобряйте участников, которые просят присоединиться.", onboardingFounder3: "Общайтесь приватно со своим Crew.", onboardingMember1: "Попросить присоединиться", onboardingMember2: "Основатель одобрит ваше устройство.", onboardingMember3: "Вы внутри — сообщения зашифрованы.", encryptedNote: "Читать могут только участники Crew; координатор лишь передаёт зашифрованные сообщения.", advanced: "Дополнительно", coordinator: "Координатор", keyPackage: "Пакет ключей", keyPackageReady: "Готово на этом устройстве", keyPackageMissing: "Не настроено на этом устройстве", members: "Участники", roleFounder: "Основатель", roleAdmin: "Администратор", makeAdmin: "Назначить админом", removeAdmin: "Снять админа", adminAdded: "Участник повышен до админа.", adminRemoved: "Роль админа снята.", roleUpdateFailed: "Не удалось изменить роль. Попробуйте ещё раз.", addReaction: "Добавить реакцию", deleteMessage: "Удалить сообщение", deleteMessageConfirm: "Удалить это сообщение для всех?", readBy: "Прочитали: {{count}}", joinRequestTitle: "Запрос на приватный чат", joinRequestFor: "Новый запрос на вступление в {{crew}}", joinRequestReview: "Проверить запрос", joinRequestDismiss: "Отклонить запрос", roleMember: "Участник", qrTitle: "Отсканируйте, чтобы войти в приватный чат", qrHint: "Участники Crew сканируют код камерой телефона. Ссылка открывает вкладку «Приватный чат».", sendFailed: "Не удалось отправить — нажмите «Повторить».", sending: "Отправка…", sent: "Отправлено", retry: "Повторить", errorUnreachable: "Не удалось связаться с приватным чатом. Проверьте подключение.", errorDetails: "Подробности", unreachable: "Недоступно", dismiss: "Закрыть", linkDevice: "Привязать это устройство", linkDeviceTitle: "Привязать другое устройство", linkDeviceHint: "Отсканируйте этот код на устройстве, которое уже в комнате.", linkDeviceNote: "Код содержит пакет открытых ключей. Ваш закрытый ключ останется на новом устройстве.", waitingDevice: "Ожидание другого устройства…", addDevice: "Добавить устройство", deviceLinked: "Устройство добавлено.", deviceLinkFailed: "Не удалось добавить это устройство.", removeMemberConfirm: "Удалить {{name}} из приватного чата? Это устройство потеряет доступ.", removeMemberFailed: "Не удалось удалить этого участника.", reply: "Ответить", }, communityUi: { link: "Сообщество", title: "Чат сообщества", subtitle: "Задавай вопросы, делись отзывами и общайся с сообществом SkateSpots — со сквозным шифрованием.", heading: "Сообщество SkateSpots", eyebrow: "Вопросы и отзывы", seoTitle: "Чат сообщества SkateSpots", seoDescription: "Вопросы, отзывы и общение сообщества — со сквозным шифрованием.", notLoggedIn: "Войди, чтобы присоединиться к чату сообщества.", noGroupAdmin: "Комната сообщества ещё не создана.", noGroupMember: "Ты ещё не в комнате сообщества.", waitingApproval: "Ждём одобрения от бота сообщества или администратора…", waitingApprovalManual: "Ручной режим. Когда одобрят, нажми «Проверить приглашение».", noInvite: "Приглашения пока нет. Бот обычно одобряет в течение минуты — после этого нажми «Проверить приглашение».", pendingRequests: "{{count}} запросов на вступление в ожидании", pendingRequestsDesc: "Бот обычно одобряет автоматически. Если застряло, открой комнату ниже и нажми «Проверить запросы».", botMissing: "The community bot isn’t in this room right now, so an admin will review join requests.", secondDeviceHint: "Уже участник на другом устройстве? Используй «Привязать это устройство» для прямой передачи или попроси снова присоединиться с этого устройства.", create: "Создать комнату сообщества", setupDeviceBody: "Это даёт устройству ключ от комнаты сообщества. Администратор или бот подтверждает его один раз.", onboardingFounder1: "Создай комнату сообщества.", onboardingFounder2: "Подтверждай бота сообщества и новых участников.", onboardingFounder3: "Отвечай на вопросы и собирай отзывы.", onboardingMember1: "Попроси вступить в комнату сообщества.", onboardingMember2: "Администратор или бот сообщества подтвердит твоё устройство.", onboardingMember3: "Задавай вопросы, делись отзывами или просто поздоровайся.", encryptedNote: "Читать это могут только участники комнаты; координатор передаёт лишь зашифрованные сообщения.", shareInviteText: "Присоединяйся к чату сообщества SkateSpots", qrTitle: "Сканируй, чтобы войти в чат сообщества", qrHint: "Отсканируй камерой телефона, чтобы открыть чат сообщества и попросить о вступлении.", owner: "Владелец", botName: "Бот сообщества", howItWorks: "Новые устройства один раз подтверждает администратор или бот сообщества. Сообщения, отправленные до твоего вступления, тебе не видны.", feedbackNote: "Вопросы и отзывы приветствуются. Будь доброжелателен — это общая комната.", }, translateUi: { title: "Перевод сообщений", translate: "Перевести", translating: "Перевод…", showOriginal: "Показать оригинал", showTranslation: "Показать перевод", translatedFrom: "Перевод с {{language}}", failed: "Не удалось перевести. Попробуйте ещё раз.", unsupported: "Эта языковая пара пока недоступна.", pilotNote: "Пилот: только английский ↔ испанский.", autoTranslate: "Автоматически переводить сообщения", autoTranslateDesc: "Переводить входящие сообщения на ваш язык. Работает на этом устройстве; ничего не отправляется.", privacy: "Перевод выполняется на вашем устройстве. Ваше сообщение его никогда не покидает. При первом использовании загружается языковая модель.", }, newsletterDraftUi: { weeklyDraftReady: 'Еженедельный черновик готов', loadDraft: 'Загрузить черновик', hidePreview: 'Скрыть предпросмотр', untitled: 'Без названия', }, signerPromptUi: { title: "Бюджет запросов Amber", body: "Amber запрашивает подтверждение для каждого подписываемого действия. Чтение и фоновое расшифрование выполняются локально и не вызывают запросов. Отправка группового DM требует по одному запросу на получателя (шифрование + подпись), а Cordn может запрашивать подтверждение на каждый запрос координатора. Для частного или экипажного чата тише использовать бункер или локальный ключ.", bunker: "Оставьте Amber для важных подписей или переключитесь на бункер, если ожидаете долгий разговор.", }, globalSearchUi: { open: "Поиск", placeholder: "Поиск спотов, экипажей, событий, снаряжения…", hint: "⌘K / Ctrl+K", recent: "Недавние", pages: "Страницы", spots: "Споты", shops: "Магазины", crews: "Экипажи", events: "События", gear: "Снаряжение", skaters: "Скейтеры", signers: "Подписанты", trust: "Доверие", noResults: "Нет результатов по запросу «{{query}}».", }, marketplaceExtrasUi: { savedSearches: "Сохранённые поиски", saveSearch: "Сохранить поиск", searchName: "Назовите этот поиск…", deleteSearch: "Удалить сохранённый поиск", safetyTitle: "Покупайте и продавайте безопасно", safetyMeet: "Встречайтесь в общественном месте и осматривайте снаряжение до оплаты.", safetyKeys: "Никогда не делитесь seed-фразами или приватными ключами. Ведите сделку в чате приложения.", safetyEscrow: "При доставке сначала прочитайте условия эскроу: Cashu-эскроу работает только в нативном приложении и не проверен.", safetyMore: "Прочитать правила маркетплейса", offerTemplates: "Быстрые заметки", offerDiscount: "Можете сделать скидку 10%?", offerSwap: "Рассмотрите обмен?", offerPickup: "Могу забрать на этой неделе.", offerShipping: "Можете объединить доставку?", }, placesUi: { eventDetail: { eventPass: "Пропуск на мероприятие" }, }, }; export default drift;